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
--- 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___ */