Bug 1345343 - Add a pref to turn off effect of xml:base on style attribute. r?bz
MozReview-Commit-ID: EzNLxIW0OCv
--- a/dom/base/FragmentOrElement.cpp
+++ b/dom/base/FragmentOrElement.cpp
@@ -409,16 +409,33 @@ nsIContent::GetBaseURI(bool aTryUseXHRDo
base.swap(newBase);
}
}
}
return base.forget();
}
+already_AddRefed<nsIURI>
+nsIContent::GetBaseURIForStyleAttr() const
+{
+ if (!nsLayoutUtils::StyleAttrWithXMLBaseDisabled()) {
+ return GetBaseURI();
+ }
+ if (IsInAnonymousSubtree() && IsAnonymousContentInSVGUseSubtree()) {
+ nsIContent* bindingParent = GetBindingParent();
+ MOZ_ASSERT(bindingParent);
+ SVGUseElement* useElement = static_cast<SVGUseElement*>(bindingParent);
+ return do_AddRef(useElement->GetContentBaseURI());
+ }
+ // This also ignores the case that SVG inside XBL binding.
+ // But it is probably fine.
+ return do_AddRef(OwnerDoc()->GetDocBaseURI());
+}
+
//----------------------------------------------------------------------
static inline JSObject*
GetJSObjectChild(nsWrapperCache* aCache)
{
return aCache->PreservingWrapper() ? aCache->GetWrapperPreserveColor() : nullptr;
}
--- a/dom/base/nsAttrValue.cpp
+++ b/dom/base/nsAttrValue.cpp
@@ -1697,17 +1697,17 @@ nsAttrValue::LoadImage(nsIDocument* aDoc
}
bool
nsAttrValue::ParseStyleAttribute(const nsAString& aString,
nsStyledElement* aElement)
{
nsIDocument* ownerDoc = aElement->OwnerDoc();
nsHTMLCSSStyleSheet* sheet = ownerDoc->GetInlineStyleSheet();
- nsCOMPtr<nsIURI> baseURI = aElement->GetBaseURI();
+ nsCOMPtr<nsIURI> baseURI = aElement->GetBaseURIForStyleAttr();
nsIURI* docURI = ownerDoc->GetDocumentURI();
NS_ASSERTION(aElement->NodePrincipal() == ownerDoc->NodePrincipal(),
"This is unexpected");
// If the (immutable) document URI does not match the element's base URI
// (the common case is that they do match) do not cache the rule. This is
// because the results of the CSS parser are dependent on these URIs, and we
--- a/dom/base/nsIContent.h
+++ b/dom/base/nsIContent.h
@@ -965,16 +965,19 @@ public:
IsAnyOfXULElements(nsGkAtoms::scrollbar,
nsGkAtoms::resizer,
nsGkAtoms::scrollcorner);
}
// Overloaded from nsINode
virtual already_AddRefed<nsIURI> GetBaseURI(bool aTryUseXHRDocBaseURI = false) const override;
+ // Returns base URI for style attribute.
+ already_AddRefed<nsIURI> GetBaseURIForStyleAttr() const;
+
virtual nsresult GetEventTargetParent(
mozilla::EventChainPreVisitor& aVisitor) override;
virtual bool IsPurple() = 0;
virtual void RemovePurple() = 0;
virtual bool OwnedOnlyByTheDOMTree() { return false; }
protected:
--- a/layout/base/nsLayoutUtils.cpp
+++ b/layout/base/nsLayoutUtils.cpp
@@ -181,16 +181,17 @@ typedef nsStyleTransformMatrix::Transfor
/* static */ bool nsLayoutUtils::sInvalidationDebuggingIsEnabled;
/* static */ bool nsLayoutUtils::sCSSVariablesEnabled;
/* static */ bool nsLayoutUtils::sInterruptibleReflowEnabled;
/* static */ bool nsLayoutUtils::sSVGTransformBoxEnabled;
/* static */ bool nsLayoutUtils::sTextCombineUprightDigitsEnabled;
#ifdef MOZ_STYLO
/* static */ bool nsLayoutUtils::sStyloEnabled;
#endif
+/* static */ bool nsLayoutUtils::sStyleAttrWithXMLBaseDisabled;
/* static */ uint32_t nsLayoutUtils::sIdlePeriodDeadlineLimit;
/* static */ uint32_t nsLayoutUtils::sQuiescentFramesBeforeIdlePeriod;
static ViewID sScrollIdCounter = FrameMetrics::START_SCROLL_ID;
typedef nsDataHashtable<nsUint64HashKey, nsIContent*> ContentMap;
static ContentMap* sContentMap = nullptr;
static ContentMap& GetContentMap() {
@@ -7662,16 +7663,18 @@ nsLayoutUtils::Initialize()
Preferences::AddBoolVarCache(&sSVGTransformBoxEnabled,
"svg.transform-box.enabled");
Preferences::AddBoolVarCache(&sTextCombineUprightDigitsEnabled,
"layout.css.text-combine-upright-digits.enabled");
#ifdef MOZ_STYLO
Preferences::AddBoolVarCache(&sStyloEnabled,
"layout.css.servo.enabled");
#endif
+ Preferences::AddBoolVarCache(&sStyleAttrWithXMLBaseDisabled,
+ "layout.css.style-attr-with-xml-base.disabled");
Preferences::AddUintVarCache(&sIdlePeriodDeadlineLimit,
"layout.idle_period.time_limit",
DEFAULT_IDLE_PERIOD_TIME_LIMIT);
Preferences::AddUintVarCache(&sQuiescentFramesBeforeIdlePeriod,
"layout.idle_period.required_quiescent_frames",
DEFAULT_QUIESCENT_FRAMES);
for (auto& callback : kPrefCallbacks) {
--- a/layout/base/nsLayoutUtils.h
+++ b/layout/base/nsLayoutUtils.h
@@ -2442,16 +2442,20 @@ public:
static bool StyloEnabled() {
#ifdef MOZ_STYLO
return sStyloEnabled;
#else
return false;
#endif
}
+ static bool StyleAttrWithXMLBaseDisabled() {
+ return sStyleAttrWithXMLBaseDisabled;
+ }
+
static uint32_t IdlePeriodDeadlineLimit() {
return sIdlePeriodDeadlineLimit;
}
static uint32_t QuiescentFramesBeforeIdlePeriod() {
return sQuiescentFramesBeforeIdlePeriod;
}
@@ -2914,16 +2918,17 @@ private:
static bool sInvalidationDebuggingIsEnabled;
static bool sCSSVariablesEnabled;
static bool sInterruptibleReflowEnabled;
static bool sSVGTransformBoxEnabled;
static bool sTextCombineUprightDigitsEnabled;
#ifdef MOZ_STYLO
static bool sStyloEnabled;
#endif
+ static bool sStyleAttrWithXMLBaseDisabled;
static uint32_t sIdlePeriodDeadlineLimit;
static uint32_t sQuiescentFramesBeforeIdlePeriod;
/**
* Helper function for LogTestDataForPaint().
*/
static void DoLogTestDataForPaint(mozilla::layers::LayerManager* aManager,
ViewID aScrollId,
--- a/layout/style/nsDOMCSSAttrDeclaration.cpp
+++ b/layout/style/nsDOMCSSAttrDeclaration.cpp
@@ -163,17 +163,17 @@ nsDOMCSSAttributeDeclaration::GetCSSDecl
void
nsDOMCSSAttributeDeclaration::GetCSSParsingEnvironment(CSSParsingEnvironment& aCSSParseEnv)
{
NS_ASSERTION(mElement, "Something is severely broken -- there should be an Element here!");
nsIDocument* doc = mElement->OwnerDoc();
aCSSParseEnv.mSheetURI = doc->GetDocumentURI();
- aCSSParseEnv.mBaseURI = mElement->GetBaseURI();
+ aCSSParseEnv.mBaseURI = mElement->GetBaseURIForStyleAttr();
aCSSParseEnv.mPrincipal = mElement->NodePrincipal();
aCSSParseEnv.mCSSLoader = doc->CSSLoader();
}
NS_IMETHODIMP
nsDOMCSSAttributeDeclaration::GetParentRule(nsIDOMCSSRule **aParent)
{
NS_ENSURE_ARG_POINTER(aParent);
--- a/modules/libpref/init/all.js
+++ b/modules/libpref/init/all.js
@@ -2680,16 +2680,19 @@ pref("layout.css.font-loading-api.enable
pref("layout.css.control-characters.visible", false);
#else
pref("layout.css.control-characters.visible", true);
#endif
// Is support for column-span enabled?
pref("layout.css.column-span.enabled", false);
+// Is effect of xml:base disabled for style attribute?
+pref("layout.css.style-attr-with-xml-base.disabled", false);
+
// pref for which side vertical scrollbars should be on
// 0 = end-side in UI direction
// 1 = end-side in document/content direction
// 2 = right
// 3 = left
pref("layout.scrollbar.side", 0);
// pref to stop overlay scrollbars from fading out, for testing purposes