--- a/dom/base/FragmentOrElement.cpp
+++ b/dom/base/FragmentOrElement.cpp
@@ -456,30 +456,36 @@ nsIContent::GetBaseURIForStyleAttr() con
return data->BaseURI();
}
}
// This also ignores the case that SVG inside XBL binding.
// But it is probably fine.
return OwnerDoc()->GetDocBaseURI();
}
-URLExtraData*
-nsIContent::GetURLDataForStyleAttr() const
+already_AddRefed<URLExtraData>
+nsIContent::GetURLDataForStyleAttr(nsIPrincipal* aSubjectPrincipal) const
{
if (IsInAnonymousSubtree() && IsAnonymousContentInSVGUseSubtree()) {
nsIContent* bindingParent = GetBindingParent();
MOZ_ASSERT(bindingParent);
SVGUseElement* useElement = static_cast<SVGUseElement*>(bindingParent);
if (URLExtraData* data = useElement->GetContentURLData()) {
- return data;
+ return do_AddRef(data);
}
}
+ if (aSubjectPrincipal && aSubjectPrincipal != NodePrincipal()) {
+ // TODO: Cache this?
+ return MakeAndAddRef<URLExtraData>(OwnerDoc()->GetDocBaseURI(),
+ OwnerDoc()->GetDocumentURI(),
+ aSubjectPrincipal);
+ }
// This also ignores the case that SVG inside XBL binding.
// But it is probably fine.
- return OwnerDoc()->DefaultStyleAttrURLData();
+ return do_AddRef(OwnerDoc()->DefaultStyleAttrURLData());
}
//----------------------------------------------------------------------
static inline JSObject*
GetJSObjectChild(nsWrapperCache* aCache)
{
return aCache->PreservingWrapper() ? aCache->GetWrapperPreserveColor() : nullptr;
--- a/dom/base/nsIContent.h
+++ b/dom/base/nsIContent.h
@@ -1001,17 +1001,20 @@ public:
// Overloaded from nsINode
virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const override;
// Returns base URI for style attribute.
nsIURI* GetBaseURIForStyleAttr() const;
// Returns the URL data for style attribute.
- mozilla::URLExtraData* GetURLDataForStyleAttr() const;
+ // If aSubjectPrincipal is passed, it should be the scripted principal
+ // responsible for generating the URL data.
+ already_AddRefed<mozilla::URLExtraData>
+ GetURLDataForStyleAttr(nsIPrincipal* aSubjectPrincipal = nullptr) const;
virtual nsresult GetEventTargetParent(
mozilla::EventChainPreVisitor& aVisitor) override;
virtual bool IsPurple() = 0;
virtual void RemovePurple() = 0;
virtual bool OwnedOnlyByTheDOMTree() { return false; }
--- a/dom/base/nsTreeSanitizer.cpp
+++ b/dom/base/nsTreeSanitizer.cpp
@@ -1177,19 +1177,20 @@ nsTreeSanitizer::SanitizeAttributes(mozi
if (kNameSpaceID_None == attrNs) {
if (aAllowStyle && nsGkAtoms::style == attrLocal) {
RefPtr<DeclarationBlock> decl;
nsAutoString value;
aElement->GetAttr(attrNs, attrLocal, value);
nsIDocument* document = aElement->OwnerDoc();
if (document->IsStyledByServo()) {
+ RefPtr<URLExtraData> urlExtra(aElement->GetURLDataForStyleAttr());
decl = ServoDeclarationBlock::FromCssText(
value,
- aElement->GetURLDataForStyleAttr(),
+ urlExtra,
document->GetCompatibilityMode(),
document->CSSLoader());
} else {
// Pass the CSS Loader object to the parser, to allow parser error
// reports to include the outer window ID.
nsCSSParser parser(document->CSSLoader());
decl = parser.ParseStyleAttribute(value, document->GetDocumentURI(),
aElement->GetBaseURIForStyleAttr(),
--- a/layout/style/ServoKeyframeRule.cpp
+++ b/layout/style/ServoKeyframeRule.cpp
@@ -51,23 +51,25 @@ public:
mDecls->SetOwningRule(nullptr);
mDecls = aDecls->AsServo();
mDecls->SetOwningRule(mRule);
Servo_Keyframe_SetStyle(mRule->Raw(), mDecls->Raw());
}
});
return NS_OK;
}
- void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) final
+ void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) final
{
MOZ_ASSERT_UNREACHABLE("GetCSSParsingEnvironment "
"shouldn't be calling for a Servo rule");
GetCSSParsingEnvironmentForRule(mRule, aCSSParseEnv);
}
- ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final
+ ServoCSSParsingEnvironment GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const final
{
return GetServoCSSParsingEnvironmentForRule(mRule);
}
nsIDocument* DocToUpdate() final { return nullptr; }
nsINode* GetParentObject() final
{
return mRule ? mRule->GetDocument() : nullptr;
--- a/layout/style/ServoPageRule.cpp
+++ b/layout/style/ServoPageRule.cpp
@@ -84,25 +84,27 @@ ServoPageRuleDeclaration::SetCSSDeclarat
nsIDocument*
ServoPageRuleDeclaration::DocToUpdate()
{
return nullptr;
}
void
ServoPageRuleDeclaration::GetCSSParsingEnvironment(
- CSSParsingEnvironment& aCSSParseEnv)
+ CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal)
{
MOZ_ASSERT_UNREACHABLE("GetCSSParsingEnvironment "
"shouldn't be calling for a Servo rule");
GetCSSParsingEnvironmentForRule(Rule(), aCSSParseEnv);
}
nsDOMCSSDeclaration::ServoCSSParsingEnvironment
-ServoPageRuleDeclaration::GetServoCSSParsingEnvironment() const
+ServoPageRuleDeclaration::GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const
{
return GetServoCSSParsingEnvironmentForRule(Rule());
}
// -- ServoPageRule --------------------------------------------------
ServoPageRule::ServoPageRule(RefPtr<RawServoPageRule> aRawRule,
uint32_t aLine, uint32_t aColumn)
--- a/layout/style/ServoPageRule.h
+++ b/layout/style/ServoPageRule.h
@@ -26,18 +26,20 @@ 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;
- nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
+ void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) final;
+ nsDOMCSSDeclaration::ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal) const final;
private:
// For accessing the constructor.
friend class ServoPageRule;
explicit ServoPageRuleDeclaration(
already_AddRefed<RawServoDeclarationBlock> aDecls);
~ServoPageRuleDeclaration();
--- a/layout/style/ServoStyleRule.cpp
+++ b/layout/style/ServoStyleRule.cpp
@@ -90,25 +90,27 @@ ServoStyleRuleDeclaration::SetCSSDeclara
nsIDocument*
ServoStyleRuleDeclaration::DocToUpdate()
{
return nullptr;
}
void
ServoStyleRuleDeclaration::GetCSSParsingEnvironment(
- CSSParsingEnvironment& aCSSParseEnv)
+ CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal)
{
MOZ_ASSERT_UNREACHABLE("GetCSSParsingEnvironment "
"shouldn't be calling for a Servo rule");
GetCSSParsingEnvironmentForRule(Rule(), aCSSParseEnv);
}
nsDOMCSSDeclaration::ServoCSSParsingEnvironment
-ServoStyleRuleDeclaration::GetServoCSSParsingEnvironment() const
+ServoStyleRuleDeclaration::GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const
{
return GetServoCSSParsingEnvironmentForRule(Rule());
}
// -- ServoStyleRule --------------------------------------------------
ServoStyleRule::ServoStyleRule(already_AddRefed<RawServoStyleRule> aRawRule,
uint32_t aLine, uint32_t aColumn)
--- a/layout/style/ServoStyleRule.h
+++ b/layout/style/ServoStyleRule.h
@@ -30,18 +30,20 @@ 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;
- ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
+ void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) final;
+ ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal) const final;
private:
// For accessing the constructor.
friend class ServoStyleRule;
explicit ServoStyleRuleDeclaration(
already_AddRefed<RawServoDeclarationBlock> aDecls);
~ServoStyleRuleDeclaration();
--- a/layout/style/StyleRule.cpp
+++ b/layout/style/StyleRule.cpp
@@ -1061,18 +1061,20 @@ protected:
friend class mozilla::DefaultDelete<DOMCSSDeclarationImpl>;
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;
- nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
+ virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) override;
+ nsDOMCSSDeclaration::ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal) 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
{
@@ -1116,23 +1118,25 @@ DOMCSSDeclarationImpl::GetCSSDeclaration
if (sheet) {
sheet->WillDirty();
}
}
return mRule->GetDeclaration();
}
void
-DOMCSSDeclarationImpl::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
+DOMCSSDeclarationImpl::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal)
{
GetCSSParsingEnvironmentForRule(mRule, aCSSParseEnv);
}
nsDOMCSSDeclaration::ServoCSSParsingEnvironment
-DOMCSSDeclarationImpl::GetServoCSSParsingEnvironment() const
+DOMCSSDeclarationImpl::GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const
{
MOZ_CRASH("GetURLData shouldn't be calling on a Gecko rule");
}
NS_IMETHODIMP
DOMCSSDeclarationImpl::GetParentRule(nsIDOMCSSRule **aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
--- a/layout/style/nsCSSRules.cpp
+++ b/layout/style/nsCSSRules.cpp
@@ -1463,23 +1463,25 @@ nsCSSKeyframeStyleDeclaration::GetCSSDec
if (mRule) {
return mRule->Declaration();
} else {
return nullptr;
}
}
void
-nsCSSKeyframeStyleDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
+nsCSSKeyframeStyleDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal)
{
GetCSSParsingEnvironmentForRule(mRule, aCSSParseEnv);
}
nsDOMCSSDeclaration::ServoCSSParsingEnvironment
-nsCSSKeyframeStyleDeclaration::GetServoCSSParsingEnvironment() const
+nsCSSKeyframeStyleDeclaration::GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const
{
MOZ_CRASH("GetURLData shouldn't be calling on a Gecko rule");
}
NS_IMETHODIMP
nsCSSKeyframeStyleDeclaration::GetParentRule(nsIDOMCSSRule **aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
@@ -1909,23 +1911,25 @@ nsCSSPageStyleDeclaration::GetCSSDeclara
if (mRule) {
return mRule->Declaration();
} else {
return nullptr;
}
}
void
-nsCSSPageStyleDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
+nsCSSPageStyleDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal)
{
GetCSSParsingEnvironmentForRule(mRule, aCSSParseEnv);
}
nsDOMCSSDeclaration::ServoCSSParsingEnvironment
-nsCSSPageStyleDeclaration::GetServoCSSParsingEnvironment() const
+nsCSSPageStyleDeclaration::GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const
{
MOZ_CRASH("GetURLData shouldn't be calling on a Gecko rule");
}
NS_IMETHODIMP
nsCSSPageStyleDeclaration::GetParentRule(nsIDOMCSSRule** aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
--- a/layout/style/nsCSSRules.h
+++ b/layout/style/nsCSSRules.h
@@ -219,18 +219,20 @@ 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;
- nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
+ virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) override;
+ nsDOMCSSDeclaration::ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal) 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;
@@ -342,18 +344,20 @@ 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;
- nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
+ virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) override;
+ nsDOMCSSDeclaration::ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal) 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
@@ -853,23 +853,25 @@ nsComputedDOMStyle::SetCSSDeclaration(De
nsIDocument*
nsComputedDOMStyle::DocToUpdate()
{
MOZ_CRASH("called nsComputedDOMStyle::DocToUpdate");
}
void
-nsComputedDOMStyle::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
+nsComputedDOMStyle::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal)
{
MOZ_CRASH("called nsComputedDOMStyle::GetCSSParsingEnvironment");
}
nsDOMCSSDeclaration::ServoCSSParsingEnvironment
-nsComputedDOMStyle::GetServoCSSParsingEnvironment() const
+nsComputedDOMStyle::GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const
{
MOZ_CRASH("called nsComputedDOMStyle::GetServoCSSParsingEnvironment");
}
void
nsComputedDOMStyle::ClearStyleContext()
{
if (mResolvedStyleContext) {
--- a/layout/style/nsComputedDOMStyle.h
+++ b/layout/style/nsComputedDOMStyle.h
@@ -133,18 +133,20 @@ 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;
- nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
+ virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) override;
+ nsDOMCSSDeclaration::ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal) 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
@@ -159,32 +159,35 @@ nsDOMCSSAttributeDeclaration::GetCSSDecl
if (NS_FAILED(rv)) {
return nullptr; // the decl will be destroyed along with the style rule
}
return decl;
}
void
-nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
+nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal)
{
NS_ASSERTION(mElement, "Something is severely broken -- there should be an Element here!");
nsIDocument* doc = mElement->OwnerDoc();
aCSSParseEnv.mSheetURI = doc->GetDocumentURI();
aCSSParseEnv.mBaseURI = mElement->GetBaseURIForStyleAttr();
- aCSSParseEnv.mPrincipal = mElement->NodePrincipal();
+ aCSSParseEnv.mPrincipal = (aSubjectPrincipal ? aSubjectPrincipal
+ : mElement->NodePrincipal());
aCSSParseEnv.mCSSLoader = doc->CSSLoader();
}
nsDOMCSSDeclaration::ServoCSSParsingEnvironment
-nsDOMCSSAttributeDeclaration::GetServoCSSParsingEnvironment() const
+nsDOMCSSAttributeDeclaration::GetServoCSSParsingEnvironment(
+ nsIPrincipal* aSubjectPrincipal) const
{
return {
- mElement->GetURLDataForStyleAttr(),
+ mElement->GetURLDataForStyleAttr(aSubjectPrincipal),
mElement->OwnerDoc()->GetCompatibilityMode(),
mElement->OwnerDoc()->CSSLoader(),
};
}
NS_IMETHODIMP
nsDOMCSSAttributeDeclaration::GetParentRule(nsIDOMCSSRule **aParent)
{
--- a/layout/style/nsDOMCSSAttrDeclaration.h
+++ b/layout/style/nsDOMCSSAttrDeclaration.h
@@ -27,18 +27,20 @@ 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;
- nsDOMCSSDeclaration::ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const final;
+ virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal) override;
+ nsDOMCSSDeclaration::ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal) const final;
NS_IMETHOD GetParentRule(nsIDOMCSSRule **aParent) override;
virtual nsINode* GetParentObject() override;
NS_IMETHOD SetPropertyValue(const nsCSSPropertyID aPropID,
const nsAString& aValue,
nsIPrincipal* aSubjectPrincipal) override;
--- a/layout/style/nsDOMCSSDeclaration.cpp
+++ b/layout/style/nsDOMCSSDeclaration.cpp
@@ -119,26 +119,27 @@ nsDOMCSSDeclaration::SetCssText(const ns
// 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()) {
- ServoCSSParsingEnvironment servoEnv = GetServoCSSParsingEnvironment();
+ ServoCSSParsingEnvironment servoEnv = GetServoCSSParsingEnvironment(
+ aSubjectPrincipal);
if (!servoEnv.mUrlExtraData) {
return NS_ERROR_NOT_AVAILABLE;
}
newdecl = ServoDeclarationBlock::FromCssText(aCssText, servoEnv.mUrlExtraData,
servoEnv.mCompatMode, servoEnv.mLoader);
} else {
CSSParsingEnvironment geckoEnv;
- GetCSSParsingEnvironment(geckoEnv);
+ GetCSSParsingEnvironment(geckoEnv, aSubjectPrincipal);
if (!geckoEnv.mPrincipal) {
return NS_ERROR_NOT_AVAILABLE;
}
RefPtr<css::Declaration> decl(new css::Declaration());
decl->InitializeEmpty();
nsCSSParser cssParser(geckoEnv.mCSSLoader);
bool changed;
@@ -291,17 +292,18 @@ nsDOMCSSDeclaration::GetServoCSSParsingE
sheet->AsServo()->URLData(),
eCompatibility_FullStandards,
nullptr,
};
}
template<typename GeckoFunc, typename ServoFunc>
nsresult
-nsDOMCSSDeclaration::ModifyDeclaration(GeckoFunc aGeckoFunc,
+nsDOMCSSDeclaration::ModifyDeclaration(nsIPrincipal* aSubjectPrincipal,
+ GeckoFunc aGeckoFunc,
ServoFunc aServoFunc)
{
DeclarationBlock* olddecl = GetCSSDeclaration(eOperation_Modify);
if (!olddecl) {
return NS_ERROR_NOT_AVAILABLE;
}
// For nsDOMCSSAttributeDeclaration, SetCSSDeclaration will lead to
@@ -310,24 +312,25 @@ nsDOMCSSDeclaration::ModifyDeclaration(G
// between when we mutate the declaration and when we set the new
// rule (see stack in bug 209575).
mozAutoDocConditionalContentUpdateBatch autoUpdate(DocToUpdate(), true);
RefPtr<DeclarationBlock> decl = olddecl->EnsureMutable();
bool changed;
if (decl->IsGecko()) {
CSSParsingEnvironment geckoEnv;
- GetCSSParsingEnvironment(geckoEnv);
+ GetCSSParsingEnvironment(geckoEnv, aSubjectPrincipal);
if (!geckoEnv.mPrincipal) {
return NS_ERROR_NOT_AVAILABLE;
}
aGeckoFunc(decl->AsGecko(), geckoEnv, &changed);
} else {
- ServoCSSParsingEnvironment servoEnv = GetServoCSSParsingEnvironment();
+ ServoCSSParsingEnvironment servoEnv = GetServoCSSParsingEnvironment(
+ aSubjectPrincipal);
if (!servoEnv.mUrlExtraData) {
return NS_ERROR_NOT_AVAILABLE;
}
changed = aServoFunc(decl->AsServo(), servoEnv);
}
if (!changed) {
// Parsing failed -- but we don't throw an exception for that.
@@ -339,16 +342,17 @@ nsDOMCSSDeclaration::ModifyDeclaration(G
nsresult
nsDOMCSSDeclaration::ParsePropertyValue(const nsCSSPropertyID aPropID,
const nsAString& aPropValue,
bool aIsImportant,
nsIPrincipal* aSubjectPrincipal)
{
return ModifyDeclaration(
+ aSubjectPrincipal,
[&](css::Declaration* decl, CSSParsingEnvironment& env, bool* changed) {
nsCSSParser cssParser(env.mCSSLoader);
cssParser.ParseProperty(aPropID, aPropValue,
env.mSheetURI, env.mBaseURI, env.mPrincipal,
decl, changed, aIsImportant);
},
[&](ServoDeclarationBlock* decl, ServoCSSParsingEnvironment& env) {
NS_ConvertUTF16toUTF8 value(aPropValue);
@@ -361,16 +365,17 @@ nsDOMCSSDeclaration::ParsePropertyValue(
nsresult
nsDOMCSSDeclaration::ParseCustomPropertyValue(const nsAString& aPropertyName,
const nsAString& aPropValue,
bool aIsImportant,
nsIPrincipal* aSubjectPrincipal)
{
MOZ_ASSERT(nsCSSProps::IsCustomPropertyName(aPropertyName));
return ModifyDeclaration(
+ aSubjectPrincipal,
[&](css::Declaration* decl, CSSParsingEnvironment& env, bool* changed) {
nsCSSParser cssParser(env.mCSSLoader);
auto propName = Substring(aPropertyName, CSS_CUSTOM_NAME_PREFIX_LENGTH);
cssParser.ParseVariable(propName, aPropValue, env.mSheetURI,
env.mBaseURI, env.mPrincipal, decl,
changed, aIsImportant);
},
[&](ServoDeclarationBlock* decl, ServoCSSParsingEnvironment& env) {
--- a/layout/style/nsDOMCSSDeclaration.h
+++ b/layout/style/nsDOMCSSDeclaration.h
@@ -152,38 +152,52 @@ protected:
mozilla::css::Loader* MOZ_UNSAFE_REF("user of CSSParsingEnviroment must hold an owning "
"reference; reference counting here has unacceptable "
"performance overhead (see bug 649163)") mCSSLoader;
};
// Information neded to parse a declaration for Servo side.
struct MOZ_STACK_CLASS ServoCSSParsingEnvironment
{
- mozilla::URLExtraData* mUrlExtraData;
+ RefPtr<mozilla::URLExtraData> mUrlExtraData;
nsCompatibility mCompatMode;
mozilla::css::Loader* mLoader;
ServoCSSParsingEnvironment(mozilla::URLExtraData* aUrlData,
nsCompatibility aCompatMode,
mozilla::css::Loader* aLoader)
: mUrlExtraData(aUrlData)
, mCompatMode(aCompatMode)
, mLoader(aLoader)
{}
+
+ ServoCSSParsingEnvironment(already_AddRefed<mozilla::URLExtraData> aUrlData,
+ nsCompatibility aCompatMode,
+ mozilla::css::Loader* aLoader)
+ : mUrlExtraData(aUrlData)
+ , mCompatMode(aCompatMode)
+ , mLoader(aLoader)
+ {}
};
// On failure, mPrincipal should be set to null in aCSSParseEnv.
// If mPrincipal is null, the other members may not be set to
// anything meaningful.
- virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv) = 0;
+ // If aSubjectPrincipal is passed, it should be the subject principal of the
+ // scripted caller that initiated the parser.
+ virtual void GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv,
+ nsIPrincipal* aSubjectPrincipal = nullptr) = 0;
// mUrlExtraData returns URL data for parsing url values in
// CSS. Returns nullptr on failure. If mUrlExtraData is nullptr,
// mCompatMode may not be set to anything meaningful.
- virtual ServoCSSParsingEnvironment GetServoCSSParsingEnvironment() const = 0;
+ // If aSubjectPrincipal is passed, it should be the subject principal of the
+ // scripted caller that initiated the parser.
+ virtual ServoCSSParsingEnvironment
+ GetServoCSSParsingEnvironment(nsIPrincipal* aSubjectPrincipal = nullptr) const = 0;
// An implementation for GetCSSParsingEnvironment for callers wrapping
// an css::Rule.
static void GetCSSParsingEnvironmentForRule(mozilla::css::Rule* aRule,
CSSParsingEnvironment& aCSSParseEnv);
// An implementation for GetServoCSSParsingEnvironment for callers wrapping
// an css::Rule.
@@ -203,12 +217,13 @@ protected:
nsresult RemovePropertyInternal(nsCSSPropertyID aPropID);
nsresult RemovePropertyInternal(const nsAString& aProperty);
protected:
virtual ~nsDOMCSSDeclaration();
private:
template<typename GeckoFunc, typename ServoFunc>
- inline nsresult ModifyDeclaration(GeckoFunc aGeckoFunc, ServoFunc aServoFunc);
+ inline nsresult ModifyDeclaration(nsIPrincipal* aSubjectPrincipal,
+ GeckoFunc aGeckoFunc, ServoFunc aServoFunc);
};
#endif // nsDOMCSSDeclaration_h___