Bug 1273706 - Part 16: Store custom property registrations on nsCSSParser. r?heycam draft
authorJonathan Chan <jyc@eqv.io>
Thu, 18 Aug 2016 15:30:37 -0700
changeset 402905 9448fecb492ccf43274abf6962e9372db9f0f782
parent 402904 9ecf23296a7101b1cbc2f8789705be6e4edec033
child 402906 100dd59be2f5f207dfdb81a0f0ebe1e87b0b1836
push id26775
push userjchan@mozilla.com
push dateThu, 18 Aug 2016 22:38:41 +0000
reviewersheycam
bugs1273706
milestone51.0a1
Bug 1273706 - Part 16: Store custom property registrations on nsCSSParser. r?heycam When the parser is bound to a sheet, we can get custom property registrations from the sheet's document's inner window. But sometimes we use the parser and need registrations, but are not associated with a sheet. In particular, when we are handling custom property values that come through JS API calls rather than through parsing actual sheets. So we expose a method for setting a custom property registrations object on the parser that overrides getting custom property registrations from the associated sheet. MozReview-Commit-ID: BsA5bzbQdwg
layout/style/nsCSSParser.cpp
layout/style/nsCSSParser.h
--- a/layout/style/nsCSSParser.cpp
+++ b/layout/style/nsCSSParser.cpp
@@ -48,16 +48,17 @@
 #include "mozilla/Snprintf.h"
 #include "nsContentUtils.h"
 #include "nsAutoPtr.h"
 #include "CSSCalc.h"
 #include "nsMediaFeatures.h"
 #include "nsLayoutUtils.h"
 #include "mozilla/Preferences.h"
 #include "nsRuleData.h"
+#include "mozilla/CSSVariableRegistrations.h"
 #include "mozilla/CSSVariableValues.h"
 #include "mozilla/dom/AnimationEffectReadOnlyBinding.h"
 #include "mozilla/dom/URL.h"
 #include "gfxFontFamilyList.h"
 
 using namespace mozilla;
 using namespace mozilla::css;
 
@@ -134,16 +135,17 @@ static_assert(css::eAuthorSheetFeatures 
 class CSSParserImpl {
 public:
   CSSParserImpl();
   ~CSSParserImpl();
 
   nsresult SetStyleSheet(CSSStyleSheet* aSheet);
 
   nsIDocument* GetDocument();
+  const CSSVariableRegistrations* GetVariableRegistrations();
 
   nsresult SetQuirkMode(bool aQuirkMode);
 
   nsresult SetChildLoader(mozilla::css::Loader* aChildLoader);
 
   // Clears everything set by the above Set*() functions.
   void Reset();
 
@@ -370,16 +372,18 @@ public:
     }
     return enabledState;
   }
 
   nsCSSPropertyID LookupEnabledProperty(const nsAString& aProperty) {
     return nsCSSProps::LookupProperty(aProperty, EnabledState());
   }
 
+  RefPtr<const CSSVariableRegistrations> mVariableRegistrations;
+
 protected:
   class nsAutoParseCompoundProperty;
   friend class nsAutoParseCompoundProperty;
 
   class nsAutoFailingSupportsRule;
   friend class nsAutoFailingSupportsRule;
 
   class nsAutoSuppressErrors;
@@ -1541,17 +1545,18 @@ static void AppendRuleToSheet(css::Rule*
 
 #define OUTPUT_ERROR_WITH_POSITION(linenum_, lineoff_) \
   mReporter->OutputError(linenum_, lineoff_)
 
 #define CLEAR_ERROR() \
   mReporter->ClearError()
 
 CSSParserImpl::CSSParserImpl()
-  : mToken(),
+  : mVariableRegistrations(nullptr),
+    mToken(),
     mScanner(nullptr),
     mReporter(nullptr),
     mChildLoader(nullptr),
     mReusableSheets(nullptr),
     mSection(eCSSSection_Charset),
     mNameSpaceMap(nullptr),
     mHavePushBack(false),
     mNavQuirkMode(false),
@@ -1600,16 +1605,34 @@ nsIDocument*
 CSSParserImpl::GetDocument()
 {
   if (!mSheet) {
     return nullptr;
   }
   return mSheet->GetDocument();
 }
 
+const CSSVariableRegistrations*
+CSSParserImpl::GetVariableRegistrations()
+{
+  nsIDocument* doc = GetDocument();
+  MOZ_ASSERT(!(mSheet && mVariableRegistrations),
+             "We shouldn't have both mSheet and mVariableRegistrations "
+             "at the same time.");
+  if (doc) {
+    return CSSVariableRegistrationsOfDocument(doc);
+  }
+
+  if (mVariableRegistrations) {
+    return mVariableRegistrations.get();
+  }
+
+  return nullptr;
+}
+
 nsresult
 CSSParserImpl::SetQuirkMode(bool aQuirkMode)
 {
   mNavQuirkMode = aQuirkMode;
   return NS_OK;
 }
 
 nsresult
@@ -1621,16 +1644,17 @@ CSSParserImpl::SetChildLoader(mozilla::c
 
 void
 CSSParserImpl::Reset()
 {
   NS_ASSERTION(!mScanner, "resetting with scanner active");
   SetStyleSheet(nullptr);
   SetQuirkMode(false);
   SetChildLoader(nullptr);
+  mVariableRegistrations = nullptr;
 }
 
 void
 CSSParserImpl::InitScanner(nsCSSScanner& aScanner,
                            css::ErrorReporter& aReporter,
                            nsIURI* aSheetURI, nsIURI* aBaseURI,
                            nsIPrincipal* aSheetPrincipal)
 {
@@ -18016,8 +18040,20 @@ nsCSSParser::IsValueValidForProperty(con
 /* static */
 uint8_t
 nsCSSParser::ControlCharVisibilityDefault()
 {
   return sControlCharVisibility
     ? NS_STYLE_CONTROL_CHARACTER_VISIBILITY_VISIBLE
     : NS_STYLE_CONTROL_CHARACTER_VISIBILITY_HIDDEN;
 }
+
+void
+nsCSSParser::SetVariableRegistrations(
+      const CSSVariableRegistrations* aRegistrations) {
+  CSSParserImpl *impl = static_cast<CSSParserImpl*>(mImpl);
+
+  MOZ_ASSERT(impl->GetDocument() == nullptr,
+             "If impl->mSheet is not null, then there should be no need for "
+             "SetVariableRegistrations.");
+
+  impl->mVariableRegistrations = aRegistrations;
+}
--- a/layout/style/nsCSSParser.h
+++ b/layout/style/nsCSSParser.h
@@ -24,16 +24,17 @@ struct nsCSSSelectorList;
 class nsMediaList;
 class nsMediaQuery;
 class nsCSSKeyframeRule;
 class nsCSSValue;
 struct nsRuleData;
 
 namespace mozilla {
 class CSSStyleSheet;
+struct CSSVariableRegistrations;
 class CSSVariableValues;
 namespace css {
 class Rule;
 class Declaration;
 class StyleRule;
 } // namespace css
 } // namespace mozilla
 
@@ -319,16 +320,19 @@ public:
   bool IsValueValidForProperty(const nsCSSPropertyID aPropID,
                                const nsAString&    aPropValue);
 
   // Return the default value to be used for -moz-control-character-visibility,
   // from preferences (cached by our Startup(), so that both nsStyleText and
   // nsRuleNode can have fast access to it).
   static uint8_t ControlCharVisibilityDefault();
 
+  void SetVariableRegistrations(
+      const mozilla::CSSVariableRegistrations* aRegistrations);
+
 protected:
   // This is a CSSParserImpl*, but if we expose that type name in this
   // header, we can't put the type definition (in nsCSSParser.cpp) in
   // the anonymous namespace.
   void* mImpl;
 };
 
 #endif /* nsCSSParser_h___ */