Bug 1321754 Part 1 - Add an enum value to SheetParsingMode for agent sheets that use no unsafe rules. draft
authorTing-Yu Lin <tlin@mozilla.com>
Fri, 28 Apr 2017 12:17:14 +0800
changeset 571116 e274f1d5d82ef30c3f167f474ab051ef6dacfd66
parent 571081 4b134293293043d247f8dcfd076ca9fc853332b4
child 571117 793dd291910e09827a11d0c88aa58826bb2deffc
push id56686
push userbmo:tlin@mozilla.com
push dateTue, 02 May 2017 03:49:39 +0000
bugs1321754
milestone55.0a1
Bug 1321754 Part 1 - Add an enum value to SheetParsingMode for agent sheets that use no unsafe rules. scrollbars.css is the only sheet which is parsed as author level, but later added as agent level in [1]. Add a new enum value so that it can be parsed as author level in gecko (nsCSSParser::AgentRulesEnabled() will exclude it), but servo can recognize it as agent level sheet when the sheet is created. Delete UserRulesEnabled() because no one uses it. [1] http://searchfox.org/mozilla-central/rev/7419b368156a6efa24777b21b0e5706be89a9c2f/layout/base/nsDocumentViewer.cpp#2326 MozReview-Commit-ID: 2lrV4ogfnHM
layout/style/SheetParsingMode.h
layout/style/nsCSSParser.cpp
layout/style/nsLayoutStylesheetCache.cpp
--- a/layout/style/SheetParsingMode.h
+++ b/layout/style/SheetParsingMode.h
@@ -19,25 +19,35 @@ namespace css {
  * Author sheets are the normal case: styles embedded in or linked
  * from HTML pages.  They are also the most restricted.
  *
  * User sheets can do anything author sheets can do, and also get
  * access to a few CSS extensions that are not yet suitable for
  * exposure on the public Web, but are very useful for expressing
  * user style overrides, such as @-moz-document rules.
  *
+ * XXX: eUserSheetFeatures was added in bug 1035091, but some patches in
+ * that bug never landed to use this enum value. Currently, all the features
+ * in user sheet are also available in author sheet.
+ *
  * Agent sheets have access to all author- and user-sheet features
  * plus more extensions that are necessary for internal use but,
  * again, not yet suitable for exposure on the public Web.  Some of
  * these are outright unsafe to expose; in particular, incorrect
  * styling of anonymous box pseudo-elements can violate layout
  * invariants.
+ *
+ * Agent sheets that do not use any unsafe rules could use
+ * eSafeAgentSheetFeatures when creating the sheet. This enum value allows
+ * Servo backend to recognize the sheets as the agent level, but Gecko
+ * backend will parse it under _author_ level.
  */
 enum SheetParsingMode {
   eAuthorSheetFeatures = 0,
   eUserSheetFeatures,
-  eAgentSheetFeatures
+  eAgentSheetFeatures,
+  eSafeAgentSheetFeatures,
 };
 
 } // namespace css
 } // namespace mozilla
 
 #endif // mozilla_css_SheetParsingMode_h
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -358,30 +358,26 @@ public:
                                            uint32_t aLineOffset);
 
   bool AgentRulesEnabled() const {
     return mParsingMode == css::eAgentSheetFeatures;
   }
   bool ChromeRulesEnabled() const {
     return mIsChrome;
   }
-  bool UserRulesEnabled() const {
-    return mParsingMode == css::eAgentSheetFeatures ||
-           mParsingMode == css::eUserSheetFeatures;
-  }
 
   CSSEnabledState EnabledState() const {
     static_assert(int(CSSEnabledState::eForAllContent) == 0,
                   "CSSEnabledState::eForAllContent should be zero for "
                   "this bitfield to work");
     CSSEnabledState enabledState = CSSEnabledState::eForAllContent;
     if (AgentRulesEnabled()) {
       enabledState |= CSSEnabledState::eInUASheets;
     }
-    if (mIsChrome) {
+    if (ChromeRulesEnabled()) {
       enabledState |= CSSEnabledState::eInChrome;
     }
     return enabledState;
   }
 
   nsCSSPropertyID LookupEnabledProperty(const nsAString& aProperty) {
     return nsCSSProps::LookupProperty(aProperty, EnabledState());
   }
--- a/layout/style/nsLayoutStylesheetCache.cpp
+++ b/layout/style/nsLayoutStylesheetCache.cpp
@@ -74,17 +74,17 @@ nsLayoutStylesheetCache::Observe(nsISupp
 }
 
 StyleSheet*
 nsLayoutStylesheetCache::ScrollbarsSheet()
 {
   if (!mScrollbarsSheet) {
     // Scrollbars don't need access to unsafe rules
     LoadSheetURL("chrome://global/skin/scrollbars.css",
-                 &mScrollbarsSheet, eAuthorSheetFeatures, eCrash);
+                 &mScrollbarsSheet, eSafeAgentSheetFeatures, eCrash);
   }
 
   return mScrollbarsSheet;
 }
 
 StyleSheet*
 nsLayoutStylesheetCache::FormsSheet()
 {