Bug 1371453 Part 3: Change CSSImportRule definition so that media is optional, since in Servo it is derived from an optional stylesheet. draft
authorBrad Werth <bwerth@mozilla.com>
Tue, 27 Jun 2017 16:25:07 -0700
changeset 602079 22a19aff23f1cfcb19df9e76e97d31eaed3989d1
parent 602078 028eccb36c4a581c86b10c74371071cf8db3cae1
child 602080 46f72cfdddf6a32f8c0d3bc2f4b7585549a3b26d
child 602088 4a5ad506fd18bf7d1ee5bce2e5900d2866bc32d0
push id66265
push userbwerth@mozilla.com
push dateThu, 29 Jun 2017 16:37:51 +0000
bugs1371453
milestone56.0a1
Bug 1371453 Part 3: Change CSSImportRule definition so that media is optional, since in Servo it is derived from an optional stylesheet. MozReview-Commit-ID: Gc4igqA1H0
dom/webidl/CSSImportRule.webidl
layout/style/CSSImportRule.cpp
layout/style/CSSImportRule.h
layout/style/ImportRule.h
layout/style/ServoImportRule.cpp
layout/style/ServoImportRule.h
layout/style/nsCSSRules.cpp
--- a/dom/webidl/CSSImportRule.webidl
+++ b/dom/webidl/CSSImportRule.webidl
@@ -5,13 +5,16 @@
  *
  * The origin of this IDL file is
  * https://drafts.csswg.org/cssom/#cssimportrule
  */
 
 // https://drafts.csswg.org/cssom/#cssimportrule
 interface CSSImportRule : CSSRule {
   readonly attribute DOMString href;
-  [SameObject, PutForwards=mediaText] readonly attribute MediaList media;
+  // Per spec, the .media is never null, but in our implementation it can
+  // be since stylesheet can be null, and in Stylo, media is derived from
+  // the stylesheet.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=1326509>.
+  [SameObject, PutForwards=mediaText] readonly attribute MediaList? media;
   // Per spec, the .styleSheet is never null, but in our implementation it can
   // be.  See <https://bugzilla.mozilla.org/show_bug.cgi?id=1326509>.
   [SameObject] readonly attribute CSSStyleSheet? styleSheet;
 };
--- a/layout/style/CSSImportRule.cpp
+++ b/layout/style/CSSImportRule.cpp
@@ -26,17 +26,17 @@ CSSImportRule::IsCCLeaf() const
   // We're not a leaf.
   return false;
 }
 
 NS_IMETHODIMP
 CSSImportRule::GetMedia(nsIDOMMediaList** aMedia)
 {
   NS_ENSURE_ARG_POINTER(aMedia);
-  NS_ADDREF(*aMedia = Media());
+  NS_IF_ADDREF(*aMedia = GetMedia());
   return NS_OK;
 }
 
 NS_IMETHODIMP
 CSSImportRule::GetStyleSheet(nsIDOMCSSStyleSheet** aStyleSheet)
 {
   NS_ENSURE_ARG_POINTER(aStyleSheet);
   NS_IF_ADDREF(*aStyleSheet = GetStyleSheet());
--- a/layout/style/CSSImportRule.h
+++ b/layout/style/CSSImportRule.h
@@ -32,17 +32,17 @@ public:
 
   // nsIDOMCSSImportRule interface
   NS_IMETHOD GetMedia(nsIDOMMediaList** aMedia) final;
   NS_IMETHOD GetStyleSheet(nsIDOMCSSStyleSheet** aStyleSheet) final;
 
   // WebIDL interface
   uint16_t Type() const final { return nsIDOMCSSRule::IMPORT_RULE; }
   // The XPCOM GetHref is fine, since it never fails.
-  virtual dom::MediaList* Media() const = 0;
+  virtual dom::MediaList* GetMedia() const = 0;
   virtual StyleSheet* GetStyleSheet() const = 0;
 
   JSObject* WrapObject(JSContext* aCx,
                        JS::Handle<JSObject*> aGivenProto) override;
 };
 
 } // namespace dom
 } // namespace mozilla
--- a/layout/style/ImportRule.h
+++ b/layout/style/ImportRule.h
@@ -35,35 +35,36 @@ public:
 private:
   // for |Clone|
   ImportRule(const ImportRule& aCopy);
   ~ImportRule();
 public:
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ImportRule, Rule)
   NS_DECL_ISUPPORTS_INHERITED
 
-  // unhide since nsIDOMCSSImportRule has its own GetStyleSheet
+  // unhide since nsIDOMCSSImportRule has its own GetStyleSheet and GetMedia
   using dom::CSSImportRule::GetStyleSheet;
+  using dom::CSSImportRule::GetMedia;
 
   // Rule methods
 #ifdef DEBUG
   virtual void List(FILE* out = stdout, int32_t aIndent = 0) const override;
 #endif
   virtual already_AddRefed<Rule> Clone() const override;
 
   void SetSheet(CSSStyleSheet*);
 
   virtual size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const override;
 
   // nsIDOMCSSImportRule interface
   NS_IMETHOD GetHref(nsAString& aHref) final;
 
   // WebIDL interface
   void GetCssTextImpl(nsAString& aCssText) const override;
-  dom::MediaList* Media() const final;
+  dom::MediaList* GetMedia() const final;
   StyleSheet* GetStyleSheet() const final;
 
 private:
   nsString  mURLSpec;
   RefPtr<nsMediaList> mMedia;
   RefPtr<CSSStyleSheet> mChildSheet;
 };
 
--- a/layout/style/ServoImportRule.cpp
+++ b/layout/style/ServoImportRule.cpp
@@ -58,19 +58,20 @@ ServoImportRule::List(FILE* out, int32_t
     str.AppendLiteral("  ");
   }
   Servo_ImportRule_Debug(mRawRule, &str);
   fprintf_stderr(out, "%s\n", str.get());
 }
 #endif
 
 dom::MediaList*
-ServoImportRule::Media() const
+ServoImportRule::GetMedia() const
 {
-  return mChildSheet->Media();
+  // When Bug 1326509 is fixed, we can assert mChildSheet instead.
+  return mChildSheet ? mChildSheet->Media() : nullptr;
 }
 
 StyleSheet*
 ServoImportRule::GetStyleSheet() const
 {
   return mChildSheet;
 }
 
--- a/layout/style/ServoImportRule.h
+++ b/layout/style/ServoImportRule.h
@@ -22,31 +22,32 @@ class ServoImportRule final : public dom
 public:
   ServoImportRule(RefPtr<RawServoImportRule> aRawRule,
                   ServoStyleSheet* aSheet,
                   uint32_t aLine, uint32_t aColumn);
 
   NS_DECL_ISUPPORTS_INHERITED
   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(ServoImportRule, dom::CSSImportRule)
 
-  // unhide since nsIDOMCSSImportRule has its own GetStyleSheet
+  // unhide since nsIDOMCSSImportRule has its own GetStyleSheet and GetMedia
   using dom::CSSImportRule::GetStyleSheet;
+  using dom::CSSImportRule::GetMedia;
 
 #ifdef DEBUG
   void List(FILE* out = stdout, int32_t aIndent = 0) const final;
 #endif
   already_AddRefed<css::Rule> Clone() const final;
   size_t SizeOfIncludingThis(mozilla::MallocSizeOf aMallocSizeOf) const final;
 
   // nsIDOMCSSImportRule interface
   NS_IMETHOD GetHref(nsAString& aHref) final;
 
   // WebIDL interface
   void GetCssTextImpl(nsAString& aCssText) const override;
-  dom::MediaList* Media() const final;
+  dom::MediaList* GetMedia() const final;
   StyleSheet* GetStyleSheet() const final;
 
 private:
   ~ServoImportRule();
 
   RefPtr<RawServoImportRule> mRawRule;
   RefPtr<ServoStyleSheet> mChildSheet;
 };
--- a/layout/style/nsCSSRules.cpp
+++ b/layout/style/nsCSSRules.cpp
@@ -272,17 +272,17 @@ ImportRule::GetCssTextImpl(nsAString& aC
       aCssText.Append(' ');
       aCssText.Append(mediaText);
     }
   }
   aCssText.Append(';');
 }
 
 MediaList*
-ImportRule::Media() const
+ImportRule::GetMedia() const
 {
   return mMedia;
 }
 
 StyleSheet*
 ImportRule::GetStyleSheet() const
 {
   return mChildSheet;