Bug 1343964 part 7 - Use URLExtraData for declaration modification directly for Servo backend. r=heycam
MozReview-Commit-ID: 78JRYKk9hgV
--- a/layout/style/ServoStyleRule.cpp
+++ b/layout/style/ServoStyleRule.cpp
@@ -89,19 +89,27 @@ ServoStyleRuleDeclaration::DocToUpdate()
{
return nullptr;
}
void
ServoStyleRuleDeclaration::GetCSSParsingEnvironment(
CSSParsingEnvironment& aCSSParseEnv)
{
+ MOZ_ASSERT_UNREACHABLE("GetCSSParsingEnvironment "
+ "shouldn't be calling for a Servo rule");
GetCSSParsingEnvironmentForRule(Rule(), aCSSParseEnv);
}
+URLExtraData*
+ServoStyleRuleDeclaration::GetURLData() const
+{
+ return GetURLDataForRule(Rule());
+}
+
// -- ServoStyleRule --------------------------------------------------
ServoStyleRule::ServoStyleRule(already_AddRefed<RawServoStyleRule> aRawRule)
: BindingStyleRule(0, 0)
, mRawRule(aRawRule)
, mDecls(Servo_StyleRule_GetStyle(mRawRule).Consume())
{
}
--- a/layout/style/ServoStyleRule.h
+++ b/layout/style/ServoStyleRule.h
@@ -28,16 +28,17 @@ public:
NS_IMETHOD GetParentRule(nsIDOMCSSRule** aParent) final;
nsINode* GetParentObject() final;
protected:
DeclarationBlock* GetCSSDeclaration(Operation aOperation) final;
nsresult SetCSSDeclaration(DeclarationBlock* aDecl) final;
nsIDocument* DocToUpdate() final;
void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) final;
+ URLExtraData* GetURLData() const final;
private:
// For accessing the constructor.
friend class ServoStyleRule;
explicit ServoStyleRuleDeclaration(
already_AddRefed<RawServoDeclarationBlock> aDecls);
~ServoStyleRuleDeclaration();
--- a/layout/style/ServoStyleSheet.h
+++ b/layout/style/ServoStyleSheet.h
@@ -77,16 +77,18 @@ public:
const RawServoStyleSheet* RawSheet() const {
return Inner()->mSheet;
}
void SetSheetForImport(const RawServoStyleSheet* aSheet) {
MOZ_ASSERT(!Inner()->mSheet);
Inner()->mSheet = aSheet;
}
+ URLExtraData* URLData() const { return Inner()->mURLData; }
+
// WebIDL CSSStyleSheet API
// Can't be inline because we can't include ImportRule here. And can't be
// called GetOwnerRule because that would be ambiguous with the ImportRule
// version.
css::Rule* GetDOMOwnerRule() const final;
void WillDirty() {}
void DidDirty() {}
--- a/layout/style/StyleRule.cpp
+++ b/layout/style/StyleRule.cpp
@@ -1057,16 +1057,17 @@ protected:
public:
explicit DOMCSSDeclarationImpl(css::StyleRule *aRule);
NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) override;
virtual DeclarationBlock* GetCSSDeclaration(Operation aOperation) override;
virtual nsresult SetCSSDeclaration(DeclarationBlock* aDecl) override;
virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
+ URLExtraData* GetURLData() const final;
virtual nsIDocument* DocToUpdate() override;
// Override |AddRef| and |Release| for being owned by StyleRule. Also, we
// need to forward QI for cycle collection things to StyleRule.
NS_DECL_ISUPPORTS_INHERITED
virtual nsINode *GetParentObject() override
{
@@ -1115,16 +1116,23 @@ DOMCSSDeclarationImpl::GetCSSDeclaration
}
void
DOMCSSDeclarationImpl::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
{
GetCSSParsingEnvironmentForRule(mRule, aCSSParseEnv);
}
+URLExtraData*
+DOMCSSDeclarationImpl::GetURLData() const
+{
+ MOZ_ASSERT_UNREACHABLE("GetURLData shouldn't be calling on a Gecko rule");
+ return GetURLDataForRule(mRule);
+}
+
NS_IMETHODIMP
DOMCSSDeclarationImpl::GetParentRule(nsIDOMCSSRule **aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
NS_IF_ADDREF(*aParent = mRule);
return NS_OK;
}
--- a/layout/style/nsCSSRules.cpp
+++ b/layout/style/nsCSSRules.cpp
@@ -1597,16 +1597,23 @@ nsCSSKeyframeStyleDeclaration::GetCSSDec
}
void
nsCSSKeyframeStyleDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
{
GetCSSParsingEnvironmentForRule(mRule, aCSSParseEnv);
}
+URLExtraData*
+nsCSSKeyframeStyleDeclaration::GetURLData() const
+{
+ MOZ_ASSERT_UNREACHABLE("GetURLData shouldn't be calling on a Gecko rule");
+ return GetURLDataForRule(mRule);
+}
+
NS_IMETHODIMP
nsCSSKeyframeStyleDeclaration::GetParentRule(nsIDOMCSSRule **aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
NS_IF_ADDREF(*aParent = mRule);
return NS_OK;
}
@@ -2107,16 +2114,23 @@ nsCSSPageStyleDeclaration::GetCSSDeclara
}
void
nsCSSPageStyleDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
{
GetCSSParsingEnvironmentForRule(mRule, aCSSParseEnv);
}
+URLExtraData*
+nsCSSPageStyleDeclaration::GetURLData() const
+{
+ MOZ_ASSERT_UNREACHABLE("GetURLData shouldn't be calling on a Gecko rule");
+ return GetURLDataForRule(mRule);
+}
+
NS_IMETHODIMP
nsCSSPageStyleDeclaration::GetParentRule(nsIDOMCSSRule** aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
NS_IF_ADDREF(*aParent = mRule);
return NS_OK;
}
--- a/layout/style/nsCSSRules.h
+++ b/layout/style/nsCSSRules.h
@@ -242,16 +242,17 @@ class nsCSSKeyframeStyleDeclaration fina
public:
explicit nsCSSKeyframeStyleDeclaration(nsCSSKeyframeRule *aRule);
NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) override;
void DropReference() { mRule = nullptr; }
virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation aOperation) override;
virtual nsresult SetCSSDeclaration(mozilla::DeclarationBlock* aDecl) override;
virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
+ mozilla::URLExtraData* GetURLData() const final;
virtual nsIDocument* DocToUpdate() override;
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsCSSKeyframeStyleDeclaration,
nsICSSDeclaration)
virtual nsINode* GetParentObject() override;
@@ -382,16 +383,17 @@ class nsCSSPageStyleDeclaration final :
public:
explicit nsCSSPageStyleDeclaration(nsCSSPageRule *aRule);
NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) override;
void DropReference() { mRule = nullptr; }
virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation aOperation) override;
virtual nsresult SetCSSDeclaration(mozilla::DeclarationBlock* aDecl) override;
virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
+ mozilla::URLExtraData* GetURLData() const final;
virtual nsIDocument* DocToUpdate() override;
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsCSSPageStyleDeclaration,
nsICSSDeclaration)
virtual nsINode *GetParentObject() override;
--- a/layout/style/nsComputedDOMStyle.cpp
+++ b/layout/style/nsComputedDOMStyle.cpp
@@ -736,16 +736,23 @@ nsComputedDOMStyle::DocToUpdate()
void
nsComputedDOMStyle::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
{
NS_RUNTIMEABORT("called nsComputedDOMStyle::GetCSSParsingEnvironment");
// Just in case NS_RUNTIMEABORT ever stops killing us for some reason
aCSSParseEnv.mPrincipal = nullptr;
}
+URLExtraData*
+nsComputedDOMStyle::GetURLData() const
+{
+ NS_RUNTIMEABORT("called nsComputedDOMStyle::GetURLData");
+ return nullptr;
+}
+
void
nsComputedDOMStyle::ClearStyleContext()
{
if (mResolvedStyleContext) {
mResolvedStyleContext = false;
mContent->RemoveMutationObserver(this);
}
mStyleContext = nullptr;
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -131,16 +131,17 @@ public:
// nsDOMCSSDeclaration abstract methods which should never be called
// on a nsComputedDOMStyle object, but must be defined to avoid
// compile errors.
virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation) override;
virtual nsresult SetCSSDeclaration(mozilla::DeclarationBlock*) override;
virtual nsIDocument* DocToUpdate() override;
virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
+ mozilla::URLExtraData* GetURLData() const final;
static already_AddRefed<nsROCSSPrimitiveValue>
MatrixToCSSValue(const mozilla::gfx::Matrix4x4& aMatrix);
static void RegisterPrefChangeCallbacks();
static void UnregisterPrefChangeCallbacks();
// nsIMutationObserver
--- a/layout/style/nsDOMCSSAttrDeclaration.cpp
+++ b/layout/style/nsDOMCSSAttrDeclaration.cpp
@@ -168,16 +168,22 @@ nsDOMCSSAttributeDeclaration::GetCSSPars
nsIDocument* doc = mElement->OwnerDoc();
aCSSParseEnv.mSheetURI = doc->GetDocumentURI();
aCSSParseEnv.mBaseURI = mElement->GetBaseURIForStyleAttr();
aCSSParseEnv.mPrincipal = mElement->NodePrincipal();
aCSSParseEnv.mCSSLoader = doc->CSSLoader();
}
+URLExtraData*
+nsDOMCSSAttributeDeclaration::GetURLData() const
+{
+ return mElement->GetURLDataForStyleAttr();
+}
+
NS_IMETHODIMP
nsDOMCSSAttributeDeclaration::GetParentRule(nsIDOMCSSRule **aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
*aParent = nullptr;
return NS_OK;
}
--- a/layout/style/nsDOMCSSAttrDeclaration.h
+++ b/layout/style/nsDOMCSSAttrDeclaration.h
@@ -27,16 +27,17 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsDOMCSSAttributeDeclaration,
nsICSSDeclaration)
// If GetCSSDeclaration returns non-null, then the decl it returns
// is owned by our current style rule.
virtual mozilla::DeclarationBlock* GetCSSDeclaration(Operation aOperation) override;
virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) override;
+ mozilla::URLExtraData* GetURLData() const final;
NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) override;
virtual nsINode* GetParentObject() override;
NS_IMETHOD SetPropertyValue(const nsCSSPropertyID aPropID,
const nsAString& aValue) override;
protected:
--- a/layout/style/nsDOMCSSDeclaration.cpp
+++ b/layout/style/nsDOMCSSDeclaration.cpp
@@ -112,33 +112,39 @@ nsDOMCSSDeclaration::SetCssText(const ns
// We don't need to *do* anything with the old declaration, but we need
// to ensure that it exists, or else SetCSSDeclaration may crash.
DeclarationBlock* olddecl = GetCSSDeclaration(eOperation_Modify);
if (!olddecl) {
return NS_ERROR_NOT_AVAILABLE;
}
CSSParsingEnvironment env;
- GetCSSParsingEnvironment(env);
- if (!env.mPrincipal) {
- return NS_ERROR_NOT_AVAILABLE;
+ URLExtraData* urlData = nullptr;
+ if (olddecl->IsGecko()) {
+ GetCSSParsingEnvironment(env);
+ if (!env.mPrincipal) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ } else {
+ urlData = GetURLData();
+ if (!urlData) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
}
// For nsDOMCSSAttributeDeclaration, SetCSSDeclaration will lead to
// Attribute setting code, which leads in turn to BeginUpdate. We
// need to start the update now so that the old rule doesn't get used
// between when we mutate the declaration and when we set the new
// rule (see stack in bug 209575).
mozAutoDocConditionalContentUpdateBatch autoUpdate(DocToUpdate(), true);
RefPtr<DeclarationBlock> newdecl;
if (olddecl->IsServo()) {
- RefPtr<URLExtraData> data =
- new URLExtraData(env.mBaseURI, env.mSheetURI, env.mPrincipal);
- newdecl = ServoDeclarationBlock::FromCssText(aCssText, data);
+ newdecl = ServoDeclarationBlock::FromCssText(aCssText, urlData);
} else {
RefPtr<css::Declaration> decl(new css::Declaration());
decl->InitializeEmpty();
nsCSSParser cssParser(env.mCSSLoader);
bool changed;
nsresult result = cssParser.ParseDeclarations(aCssText, env.mSheetURI,
env.mBaseURI, env.mPrincipal,
decl, &changed);
@@ -271,30 +277,47 @@ nsDOMCSSDeclaration::GetCSSParsingEnviro
nsIDocument* document = sheet->GetAssociatedDocument();
aCSSParseEnv.mSheetURI = sheet->GetSheetURI();
aCSSParseEnv.mBaseURI = sheet->GetBaseURI();
aCSSParseEnv.mPrincipal = sheet->Principal();
aCSSParseEnv.mCSSLoader = document ? document->CSSLoader() : nullptr;
}
+/* static */ URLExtraData*
+nsDOMCSSDeclaration::GetURLDataForRule(const css::Rule* aRule)
+{
+ if (StyleSheet* sheet = aRule ? aRule->GetStyleSheet() : nullptr) {
+ return sheet->AsServo()->URLData();
+ }
+ return nullptr;
+}
+
template<typename GeckoFunc, typename ServoFunc>
nsresult
nsDOMCSSDeclaration::ModifyDeclaration(GeckoFunc aGeckoFunc,
ServoFunc aServoFunc)
{
DeclarationBlock* olddecl = GetCSSDeclaration(eOperation_Modify);
if (!olddecl) {
return NS_ERROR_NOT_AVAILABLE;
}
CSSParsingEnvironment env;
- GetCSSParsingEnvironment(env);
- if (!env.mPrincipal) {
- return NS_ERROR_NOT_AVAILABLE;
+ URLExtraData* urlData = nullptr;
+ if (olddecl->IsGecko()) {
+ GetCSSParsingEnvironment(env);
+ if (!env.mPrincipal) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
+ } else {
+ urlData = GetURLData();
+ if (!urlData) {
+ return NS_ERROR_NOT_AVAILABLE;
+ }
}
// For nsDOMCSSAttributeDeclaration, SetCSSDeclaration will lead to
// Attribute setting code, which leads in turn to BeginUpdate. We
// need to start the update now so that the old rule doesn't get used
// between when we mutate the declaration and when we set the new
// rule (see stack in bug 209575).
mozAutoDocConditionalContentUpdateBatch autoUpdate(DocToUpdate(), true);
--- a/layout/style/nsDOMCSSDeclaration.h
+++ b/layout/style/nsDOMCSSDeclaration.h
@@ -151,16 +151,23 @@ protected:
// anything meaningful.
virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) = 0;
// An implementation for GetCSSParsingEnvironment for callers wrapping
// an css::Rule.
static void GetCSSParsingEnvironmentForRule(mozilla::css::Rule* aRule,
CSSParsingEnvironment& aCSSParseEnv);
+ // An implementation for GetURLData for callers wrapping a css::Rule.
+ static mozilla::URLExtraData* GetURLDataForRule(const mozilla::css::Rule* aRule);
+
+ // Returns URL data for parsing url values in CSS.
+ // Returns nullptr on failure.
+ virtual mozilla::URLExtraData* GetURLData() const = 0;
+
nsresult ParsePropertyValue(const nsCSSPropertyID aPropID,
const nsAString& aPropValue,
bool aIsImportant);
nsresult ParseCustomPropertyValue(const nsAString& aPropertyName,
const nsAString& aPropValue,
bool aIsImportant);