Merge remote-tracking branch 'origin/master' into custom

This commit is contained in:
Roy Tam 2020-08-19 16:22:57 +08:00
commit 16c504ba17
20 changed files with 22263 additions and 16406 deletions

View file

@ -65,9 +65,13 @@ if CONFIG['MOZ_DEBUG']:
# Force using malloc_usable_size when building with jemalloc because _msize # Force using malloc_usable_size when building with jemalloc because _msize
# causes assertions on Win64. See bug 719579. # causes assertions on Win64. See bug 719579.
# This causes a known warning due to the way mozjemalloc is linked and the
# malloc_usable_size function not being available at compile time on MSVC
# so we suppress that particular warning (C4013)
if CONFIG['OS_ARCH'] == 'WINNT' and CONFIG['MOZ_MEMORY']: if CONFIG['OS_ARCH'] == 'WINNT' and CONFIG['MOZ_MEMORY']:
DEFINES['HAVE_MALLOC_USABLE_SIZE'] = True DEFINES['HAVE_MALLOC_USABLE_SIZE'] = True
DEFINES['SQLITE_WITHOUT_MSIZE'] = True DEFINES['SQLITE_WITHOUT_MSIZE'] = True
CFLAGS += ['-wd4013']
# Omit unused functions to save some library footprint. # Omit unused functions to save some library footprint.
DEFINES['SQLITE_OMIT_DEPRECATED'] = True DEFINES['SQLITE_OMIT_DEPRECATED'] = True

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -789,13 +789,14 @@ nsContentSink::ProcessStyleLink(nsIContent* aElement,
// If this is a fragment parser, we don't want to observe. // If this is a fragment parser, we don't want to observe.
// We don't support CORS for processing instructions // We don't support CORS for processing instructions
bool isAlternate; bool isAlternate;
bool isExplicitlyEnabled;
rv = mCSSLoader->LoadStyleLink(aElement, url, aTitle, aMedia, aAlternate, rv = mCSSLoader->LoadStyleLink(aElement, url, aTitle, aMedia, aAlternate,
CORS_NONE, mDocument->GetReferrerPolicy(), CORS_NONE, mDocument->GetReferrerPolicy(),
integrity, mRunsToCompletion ? nullptr : this, integrity, mRunsToCompletion ? nullptr : this,
&isAlternate); &isAlternate, &isExplicitlyEnabled);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
if (!isAlternate && !mRunsToCompletion) { if ((!isAlternate || isExplicitlyEnabled) && !mRunsToCompletion) {
++mPendingSheetCount; ++mPendingSheetCount;
mScriptLoader->AddParserBlockingScriptExecutionBlocker(); mScriptLoader->AddParserBlockingScriptExecutionBlocker();
} }

View file

@ -393,8 +393,9 @@ nsStyleLinkElement::DoUpdateStyleSheet(nsIDocument* aOldDocument,
nsAutoString title, type, media; nsAutoString title, type, media;
bool isScoped; bool isScoped;
bool isAlternate; bool isAlternate;
bool isExplicitlyEnabled;
GetStyleSheetInfo(title, type, media, &isScoped, &isAlternate); GetStyleSheetInfo(title, type, media, &isScoped, &isAlternate, &isExplicitlyEnabled);
if (!type.LowerCaseEqualsLiteral("text/css")) { if (!type.LowerCaseEqualsLiteral("text/css")) {
return NS_OK; return NS_OK;
@ -425,7 +426,7 @@ nsStyleLinkElement::DoUpdateStyleSheet(nsIDocument* aOldDocument,
// Parse the style sheet. // Parse the style sheet.
rv = doc->CSSLoader()-> rv = doc->CSSLoader()->
LoadInlineStyle(thisContent, text, mLineNumber, title, media, LoadInlineStyle(thisContent, text, mLineNumber, title, media,
scopeElement, aObserver, &doneLoading, &isAlternate); scopeElement, aObserver, &doneLoading, &isAlternate, &isExplicitlyEnabled);
} }
else { else {
nsAutoString integrity; nsAutoString integrity;
@ -452,13 +453,14 @@ nsStyleLinkElement::DoUpdateStyleSheet(nsIDocument* aOldDocument,
rv = doc->CSSLoader()-> rv = doc->CSSLoader()->
LoadStyleLink(thisContent, clonedURI, title, media, isAlternate, LoadStyleLink(thisContent, clonedURI, title, media, isAlternate,
GetCORSMode(), referrerPolicy, integrity, GetCORSMode(), referrerPolicy, integrity,
aObserver, &isAlternate); aObserver, &isAlternate, &isExplicitlyEnabled);
if (NS_FAILED(rv)) { if (NS_FAILED(rv)) {
// Don't propagate LoadStyleLink() errors further than this, since some // Don't propagate LoadStyleLink() errors further than this, since some
// consumers (e.g. nsXMLContentSink) will completely abort on innocuous // consumers (e.g. nsXMLContentSink) will completely abort on innocuous
// things like a stylesheet load being blocked by the security system. // things like a stylesheet load being blocked by the security system.
doneLoading = true; doneLoading = true;
isAlternate = false; isAlternate = false;
isExplicitlyEnabled = false;
rv = NS_OK; rv = NS_OK;
} }
} }

View file

@ -98,7 +98,8 @@ protected:
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) = 0; bool* aIsAlternate,
bool* aIsExplicitlyEnabled) = 0;
virtual mozilla::CORSMode GetCORSMode() const virtual mozilla::CORSMode GetCORSMode() const
{ {

View file

@ -33,6 +33,8 @@
#define LINK_ELEMENT_FLAG_BIT(n_) \ #define LINK_ELEMENT_FLAG_BIT(n_) \
NODE_FLAG_BIT(ELEMENT_TYPE_SPECIFIC_BITS_OFFSET + (n_)) NODE_FLAG_BIT(ELEMENT_TYPE_SPECIFIC_BITS_OFFSET + (n_))
#define LINK_DISABLED Preferences::GetBool("dom.link.disabled_attribute.enabled", true)
// Link element specific bits // Link element specific bits
enum { enum {
// Indicates that a DNS Prefetch has been requested from this Link element. // Indicates that a DNS Prefetch has been requested from this Link element.
@ -92,9 +94,14 @@ NS_INTERFACE_TABLE_TAIL_INHERITING(nsGenericHTMLElement)
NS_IMPL_ELEMENT_CLONE(HTMLLinkElement) NS_IMPL_ELEMENT_CLONE(HTMLLinkElement)
bool bool
HTMLLinkElement::Disabled() HTMLLinkElement::Disabled() const
{ {
if (LINK_DISABLED) {
return GetBoolAttr(nsGkAtoms::disabled);
}
StyleSheet* ss = GetSheet(); StyleSheet* ss = GetSheet();
return ss && ss->Disabled(); return ss && ss->Disabled();
} }
@ -107,8 +114,12 @@ HTMLLinkElement::GetMozDisabled(bool* aDisabled)
} }
void void
HTMLLinkElement::SetDisabled(bool aDisabled) HTMLLinkElement::SetDisabled(bool aDisabled, ErrorResult& aRv)
{ {
if (LINK_DISABLED) {
return SetHTMLBoolAttr(nsGkAtoms::disabled, aDisabled, aRv);
}
if (StyleSheet* ss = GetSheet()) { if (StyleSheet* ss = GetSheet()) {
ss->SetDisabled(aDisabled); ss->SetDisabled(aDisabled);
} }
@ -117,11 +128,11 @@ HTMLLinkElement::SetDisabled(bool aDisabled)
NS_IMETHODIMP NS_IMETHODIMP
HTMLLinkElement::SetMozDisabled(bool aDisabled) HTMLLinkElement::SetMozDisabled(bool aDisabled)
{ {
SetDisabled(aDisabled); ErrorResult rv;
return NS_OK; SetDisabled(aDisabled, rv);
return rv.StealNSResult();
} }
NS_IMPL_STRING_ATTR(HTMLLinkElement, Charset, charset) NS_IMPL_STRING_ATTR(HTMLLinkElement, Charset, charset)
NS_IMPL_URI_ATTR(HTMLLinkElement, Href, href) NS_IMPL_URI_ATTR(HTMLLinkElement, Href, href)
NS_IMPL_STRING_ATTR(HTMLLinkElement, Hreflang, hreflang) NS_IMPL_STRING_ATTR(HTMLLinkElement, Hreflang, hreflang)
@ -370,7 +381,8 @@ HTMLLinkElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
aName == nsGkAtoms::rel || aName == nsGkAtoms::rel ||
aName == nsGkAtoms::title || aName == nsGkAtoms::title ||
aName == nsGkAtoms::media || aName == nsGkAtoms::media ||
aName == nsGkAtoms::type)) { aName == nsGkAtoms::type ||
(LINK_DISABLED && aName == nsGkAtoms::disabled))) {
bool dropSheet = false; bool dropSheet = false;
if (aName == nsGkAtoms::rel) { if (aName == nsGkAtoms::rel) {
nsAutoString value; nsAutoString value;
@ -397,17 +409,24 @@ HTMLLinkElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
dropSheet || dropSheet ||
(aName == nsGkAtoms::title || (aName == nsGkAtoms::title ||
aName == nsGkAtoms::media || aName == nsGkAtoms::media ||
aName == nsGkAtoms::type)); aName == nsGkAtoms::type ||
(LINK_DISABLED && aName == nsGkAtoms::disabled)));
} }
} else { } else {
// If the disabled attribute is removed from a link element, the
// stylesheet may be explicitly enabled.
if (aNameSpaceID == kNameSpaceID_None) {
if (aName == nsGkAtoms::disabled && LINK_DISABLED) {
mExplicitlyEnabled = true;
}
// Since removing href or rel makes us no longer link to a // Since removing href or rel makes us no longer link to a
// stylesheet, force updates for those too. // stylesheet, force updates for those too.
if (aNameSpaceID == kNameSpaceID_None) {
if (aName == nsGkAtoms::href || if (aName == nsGkAtoms::href ||
aName == nsGkAtoms::rel || aName == nsGkAtoms::rel ||
aName == nsGkAtoms::title || aName == nsGkAtoms::title ||
aName == nsGkAtoms::media || aName == nsGkAtoms::media ||
aName == nsGkAtoms::type) { aName == nsGkAtoms::type ||
(LINK_DISABLED && aName == nsGkAtoms::disabled)) {
UpdateStyleSheetInternal(nullptr, nullptr, true); UpdateStyleSheetInternal(nullptr, nullptr, true);
} }
if (aName == nsGkAtoms::href || if (aName == nsGkAtoms::href ||
@ -500,13 +519,15 @@ HTMLLinkElement::GetStyleSheetInfo(nsAString& aTitle,
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) bool* aIsAlternate,
bool* aIsExplicitlyEnabled)
{ {
aTitle.Truncate(); aTitle.Truncate();
aType.Truncate(); aType.Truncate();
aMedia.Truncate(); aMedia.Truncate();
*aIsScoped = false; *aIsScoped = false;
*aIsAlternate = false; *aIsAlternate = false;
*aIsExplicitlyEnabled = false;
nsAutoString rel; nsAutoString rel;
GetAttr(kNameSpaceID_None, nsGkAtoms::rel, rel); GetAttr(kNameSpaceID_None, nsGkAtoms::rel, rel);
@ -516,6 +537,20 @@ HTMLLinkElement::GetStyleSheetInfo(nsAString& aTitle,
return; return;
} }
if (LINK_DISABLED) {
// Is the link disabled?
if (Disabled()) {
return;
}
// Is it explicitly enabled?
if (mExplicitlyEnabled) {
*aIsExplicitlyEnabled = true;
}
}
nsAutoString title; nsAutoString title;
GetAttr(kNameSpaceID_None, nsGkAtoms::title, title); GetAttr(kNameSpaceID_None, nsGkAtoms::title, title);
title.CompressWhitespace(); title.CompressWhitespace();

View file

@ -86,8 +86,8 @@ public:
virtual bool HasDeferredDNSPrefetchRequest() override; virtual bool HasDeferredDNSPrefetchRequest() override;
// WebIDL // WebIDL
bool Disabled(); bool Disabled() const;
void SetDisabled(bool aDisabled); void SetDisabled(bool aDisabled, ErrorResult& aRv);
// XPCOM GetHref is fine. // XPCOM GetHref is fine.
void SetHref(const nsAString& aHref, ErrorResult& aRv) void SetHref(const nsAString& aHref, ErrorResult& aRv)
{ {
@ -181,10 +181,18 @@ protected:
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) override; bool* aIsAlternate,
protected: bool* aIsExplicitlyEnabled) override;
RefPtr<nsDOMTokenList> mRelList; RefPtr<nsDOMTokenList> mRelList;
// The "explicitly enabled" flag. This flag is set whenever the 'disabled'
// attribute is explicitly unset, and makes alternate stylesheets not be
// disabled by default anymore.
//
// See https://github.com/whatwg/html/issues/3840#issuecomment-481034206.
bool mExplicitlyEnabled = false;
private: private:
RefPtr<ImportLoader> mImportLoader; RefPtr<ImportLoader> mImportLoader;
}; };

View file

@ -66,7 +66,7 @@ HTMLStyleElement::GetMozDisabled(bool* aDisabled)
} }
bool bool
HTMLStyleElement::Disabled() HTMLStyleElement::Disabled() const
{ {
StyleSheet* ss = GetSheet(); StyleSheet* ss = GetSheet();
return ss && ss->Disabled(); return ss && ss->Disabled();
@ -223,12 +223,14 @@ HTMLStyleElement::GetStyleSheetInfo(nsAString& aTitle,
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) bool* aIsAlternate,
bool* aIsExplicitlyEnabled)
{ {
aTitle.Truncate(); aTitle.Truncate();
aType.Truncate(); aType.Truncate();
aMedia.Truncate(); aMedia.Truncate();
*aIsAlternate = false; *aIsAlternate = false;
*aIsExplicitlyEnabled = false;
nsAutoString title; nsAutoString title;
GetAttr(kNameSpaceID_None, nsGkAtoms::title, title); GetAttr(kNameSpaceID_None, nsGkAtoms::title, title);

View file

@ -59,7 +59,7 @@ public:
NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED
bool Disabled(); bool Disabled() const;
void SetDisabled(bool aDisabled); void SetDisabled(bool aDisabled);
void SetMedia(const nsAString& aMedia, ErrorResult& aError) void SetMedia(const nsAString& aMedia, ErrorResult& aError)
{ {
@ -88,7 +88,8 @@ protected:
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) override; bool* aIsAlternate,
bool* aIsExplicitlyEnabled) override;
/** /**
* Common method to call from the various mutation observer methods. * Common method to call from the various mutation observer methods.
* aContent is a content node that's either the one that changed or its * aContent is a content node that's either the one that changed or its

View file

@ -271,9 +271,11 @@ SVGStyleElement::GetStyleSheetInfo(nsAString& aTitle,
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) bool* aIsAlternate,
bool* aIsExplicitlyEnabled)
{ {
*aIsAlternate = false; *aIsAlternate = false;
*aIsExplicitlyEnabled = false;
nsAutoString title; nsAutoString title;
GetAttr(kNameSpaceID_None, nsGkAtoms::title, title); GetAttr(kNameSpaceID_None, nsGkAtoms::title, title);

View file

@ -95,7 +95,8 @@ protected:
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) override; bool* aIsAlternate,
bool* aIsExplicitlyEnabled) override;
virtual CORSMode GetCORSMode() const override; virtual CORSMode GetCORSMode() const override;
/** /**

View file

@ -14,7 +14,7 @@
// http://www.whatwg.org/specs/web-apps/current-work/#the-link-element // http://www.whatwg.org/specs/web-apps/current-work/#the-link-element
[HTMLConstructor] [HTMLConstructor]
interface HTMLLinkElement : HTMLElement { interface HTMLLinkElement : HTMLElement {
[Pure] [CEReactions, SetterThrows, Pure]
attribute boolean disabled; attribute boolean disabled;
[CEReactions, SetterThrows, Pure] [CEReactions, SetterThrows, Pure]
attribute DOMString href; attribute DOMString href;

View file

@ -131,13 +131,15 @@ XMLStylesheetProcessingInstruction::GetStyleSheetInfo(nsAString& aTitle,
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) bool* aIsAlternate,
bool* aIsExplicitlyEnabled)
{ {
aTitle.Truncate(); aTitle.Truncate();
aType.Truncate(); aType.Truncate();
aMedia.Truncate(); aMedia.Truncate();
*aIsScoped = false; *aIsScoped = false;
*aIsAlternate = false; *aIsAlternate = false;
*aIsExplicitlyEnabled = false;
// xml-stylesheet PI is special only in prolog // xml-stylesheet PI is special only in prolog
if (!nsContentUtils::InProlog(this)) { if (!nsContentUtils::InProlog(this)) {

View file

@ -82,7 +82,8 @@ protected:
nsAString& aType, nsAString& aType,
nsAString& aMedia, nsAString& aMedia,
bool* aIsScoped, bool* aIsScoped,
bool* aIsAlternate) override; bool* aIsAlternate,
bool* aIsExplicitlyEnabled) override;
virtual nsGenericDOMDataNode* CloneDataNode(mozilla::dom::NodeInfo *aNodeInfo, virtual nsGenericDOMDataNode* CloneDataNode(mozilla::dom::NodeInfo *aNodeInfo,
bool aCloneText) const override; bool aCloneText) const override;
}; };

View file

@ -687,8 +687,8 @@ if CONFIG['_MSC_VER']:
elif CONFIG['CPU_ARCH'] == 'x86_64' and CONFIG['JS_HAS_CTYPES']: elif CONFIG['CPU_ARCH'] == 'x86_64' and CONFIG['JS_HAS_CTYPES']:
SOURCES['ctypes/CTypes.cpp'].no_pgo = True # Bug 810661 SOURCES['ctypes/CTypes.cpp'].no_pgo = True # Bug 810661
# Prevent floating point errors caused by VC++ optimizations # Prevent floating point errors caused by VC++ optimizations
# XXX We should add this to CXXFLAGS, too?
CFLAGS += ['-fp:precise'] CFLAGS += ['-fp:precise']
CXXFLAGS += ['-fp:precise']
# C4805 warns mixing bool with other integral types in computation. # C4805 warns mixing bool with other integral types in computation.
# But given the conversion from bool is specified, and this is a # But given the conversion from bool is specified, and this is a
# pattern widely used in code in js/src, suppress this warning here. # pattern widely used in code in js/src, suppress this warning here.

View file

@ -1278,7 +1278,8 @@ Loader::PrepareSheet(StyleSheet* aSheet,
const nsSubstring& aMediaString, const nsSubstring& aMediaString,
nsMediaList* aMediaList, nsMediaList* aMediaList,
Element* aScopeElement, Element* aScopeElement,
bool isAlternate) bool isAlternate,
bool isExplicitlyEnabled)
{ {
NS_PRECONDITION(aSheet, "Must have a sheet!"); NS_PRECONDITION(aSheet, "Must have a sheet!");
@ -1307,7 +1308,7 @@ Loader::PrepareSheet(StyleSheet* aSheet,
sheet->SetMedia(mediaList); sheet->SetMedia(mediaList);
sheet->SetTitle(aTitle); sheet->SetTitle(aTitle);
sheet->SetEnabled(!isAlternate); sheet->SetEnabled(!isAlternate || isExplicitlyEnabled);
sheet->SetScopeElement(aScopeElement); sheet->SetScopeElement(aScopeElement);
} }
@ -1985,7 +1986,8 @@ Loader::LoadInlineStyle(nsIContent* aElement,
Element* aScopeElement, Element* aScopeElement,
nsICSSLoaderObserver* aObserver, nsICSSLoaderObserver* aObserver,
bool* aCompleted, bool* aCompleted,
bool* aIsAlternate) bool* aIsAlternate,
bool* aIsExplicitlyEnabled)
{ {
LOG(("css::Loader::LoadInlineStyle")); LOG(("css::Loader::LoadInlineStyle"));
NS_ASSERTION(mParsingDatas.Length() == 0, "We're in the middle of a parse?"); NS_ASSERTION(mParsingDatas.Length() == 0, "We're in the middle of a parse?");
@ -2017,8 +2019,9 @@ Loader::LoadInlineStyle(nsIContent* aElement,
"Inline sheets should not be cached"); "Inline sheets should not be cached");
LOG((" Sheet is alternate: %d", *aIsAlternate)); LOG((" Sheet is alternate: %d", *aIsAlternate));
LOG((" Sheet is explicitly enabled: %d", *aIsExplicitlyEnabled));
PrepareSheet(sheet, aTitle, aMedia, nullptr, aScopeElement, *aIsAlternate); PrepareSheet(sheet, aTitle, aMedia, nullptr, aScopeElement, *aIsAlternate, *aIsExplicitlyEnabled);
if (aElement->HasFlag(NODE_IS_IN_SHADOW_TREE)) { if (aElement->HasFlag(NODE_IS_IN_SHADOW_TREE)) {
ShadowRoot* containingShadow = aElement->GetContainingShadow(); ShadowRoot* containingShadow = aElement->GetContainingShadow();
@ -2059,7 +2062,8 @@ Loader::LoadStyleLink(nsIContent* aElement,
ReferrerPolicy aReferrerPolicy, ReferrerPolicy aReferrerPolicy,
const nsAString& aIntegrity, const nsAString& aIntegrity,
nsICSSLoaderObserver* aObserver, nsICSSLoaderObserver* aObserver,
bool* aIsAlternate) bool* aIsAlternate,
bool* aIsExplicitlyEnabled)
{ {
LOG(("css::Loader::LoadStyleLink")); LOG(("css::Loader::LoadStyleLink"));
NS_PRECONDITION(aURL, "Must have URL to load"); NS_PRECONDITION(aURL, "Must have URL to load");
@ -2112,8 +2116,9 @@ Loader::LoadStyleLink(nsIContent* aElement,
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
LOG((" Sheet is alternate: %d", *aIsAlternate)); LOG((" Sheet is alternate: %d", *aIsAlternate));
LOG((" Sheet is explicitly enabled: %d", *aIsExplicitlyEnabled));
PrepareSheet(sheet, aTitle, aMedia, nullptr, nullptr, *aIsAlternate); PrepareSheet(sheet, aTitle, aMedia, nullptr, nullptr, *aIsAlternate, *aIsExplicitlyEnabled);
rv = InsertSheetInDoc(sheet, aElement, mDocument); rv = InsertSheetInDoc(sheet, aElement, mDocument);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
@ -2138,9 +2143,10 @@ Loader::LoadStyleLink(nsIContent* aElement,
aObserver, principal, requestingNode); aObserver, principal, requestingNode);
NS_ADDREF(data); NS_ADDREF(data);
// If we have to parse and it's an alternate non-inline, defer it // If we have to parse and it's an alternate non-inline, defer it unless
// it's explicitly enabled.
if (aURL && state == eSheetNeedsParser && mSheets->mLoadingDatas.Count() != 0 && if (aURL && state == eSheetNeedsParser && mSheets->mLoadingDatas.Count() != 0 &&
*aIsAlternate) { *aIsAlternate && !*aIsExplicitlyEnabled) {
LOG((" Deferring alternate sheet load")); LOG((" Deferring alternate sheet load"));
URIPrincipalReferrerPolicyAndCORSModeHashKey key(data->mURI, URIPrincipalReferrerPolicyAndCORSModeHashKey key(data->mURI,
data->mLoaderPrincipal, data->mLoaderPrincipal,
@ -2267,6 +2273,7 @@ Loader::LoadChildSheet(StyleSheet* aParentSheet,
state = eSheetComplete; state = eSheetComplete;
} else { } else {
bool isAlternate; bool isAlternate;
bool isExplicitlyEnabled;
const nsSubstring& empty = EmptyString(); const nsSubstring& empty = EmptyString();
// For now, use CORS_NONE for child sheets // For now, use CORS_NONE for child sheets
rv = CreateSheet(aURL, nullptr, principal, rv = CreateSheet(aURL, nullptr, principal,
@ -2277,7 +2284,7 @@ Loader::LoadChildSheet(StyleSheet* aParentSheet,
false, empty, state, &isAlternate, &sheet); false, empty, state, &isAlternate, &sheet);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
PrepareSheet(sheet, empty, empty, aMedia, nullptr, isAlternate); PrepareSheet(sheet, empty, empty, aMedia, nullptr, isAlternate, isExplicitlyEnabled);
} }
rv = InsertChildSheet(sheet, aParentSheet, aParentRule); rv = InsertChildSheet(sheet, aParentSheet, aParentRule);
@ -2390,6 +2397,7 @@ Loader::InternalLoadNonDocumentSheet(nsIURI* aURL,
StyleSheetState state; StyleSheetState state;
bool isAlternate; bool isAlternate;
bool isExplicitlyEnabled;
RefPtr<StyleSheet> sheet; RefPtr<StyleSheet> sheet;
bool syncLoad = (aObserver == nullptr); bool syncLoad = (aObserver == nullptr);
const nsSubstring& empty = EmptyString(); const nsSubstring& empty = EmptyString();
@ -2399,7 +2407,7 @@ Loader::InternalLoadNonDocumentSheet(nsIURI* aURL,
false, empty, state, &isAlternate, &sheet); false, empty, state, &isAlternate, &sheet);
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
PrepareSheet(sheet, empty, empty, nullptr, nullptr, isAlternate); PrepareSheet(sheet, empty, empty, nullptr, nullptr, isAlternate, isExplicitlyEnabled);
if (state == eSheetComplete) { if (state == eSheetComplete) {
LOG((" Sheet already complete")); LOG((" Sheet already complete"));

View file

@ -230,6 +230,8 @@ public:
* @param [out] aCompleted whether parsing of the sheet completed. * @param [out] aCompleted whether parsing of the sheet completed.
* @param [out] aIsAlternate whether the stylesheet ended up being an * @param [out] aIsAlternate whether the stylesheet ended up being an
* alternate sheet. * alternate sheet.
* @param [out] aIsExplicitlyEnabled whether the stylesheet was explicitly
* enabled by having the disabled attribute removed.
*/ */
nsresult LoadInlineStyle(nsIContent* aElement, nsresult LoadInlineStyle(nsIContent* aElement,
const nsAString& aBuffer, const nsAString& aBuffer,
@ -239,7 +241,8 @@ public:
mozilla::dom::Element* aScopeElement, mozilla::dom::Element* aScopeElement,
nsICSSLoaderObserver* aObserver, nsICSSLoaderObserver* aObserver,
bool* aCompleted, bool* aCompleted,
bool* aIsAlternate); bool* aIsAlternate,
bool* aIsExplicitlyEnabled);
/** /**
* Load a linked (document) stylesheet. If a successful result is returned, * Load a linked (document) stylesheet. If a successful result is returned,
@ -260,6 +263,8 @@ public:
* @param [out] aIsAlternate whether the stylesheet actually ended up beinga * @param [out] aIsAlternate whether the stylesheet actually ended up beinga
* an alternate sheet. Note that this need not match * an alternate sheet. Note that this need not match
* aHasAlternateRel. * aHasAlternateRel.
* @param [out] aIsExplicitlyEnabled whether the stylesheet was explicitly
* enabled by having the disabled attribute removed.
*/ */
nsresult LoadStyleLink(nsIContent* aElement, nsresult LoadStyleLink(nsIContent* aElement,
nsIURI* aURL, nsIURI* aURL,
@ -270,7 +275,8 @@ public:
ReferrerPolicy aReferrerPolicy, ReferrerPolicy aReferrerPolicy,
const nsAString& aIntegrity, const nsAString& aIntegrity,
nsICSSLoaderObserver* aObserver, nsICSSLoaderObserver* aObserver,
bool* aIsAlternate); bool* aIsAlternate,
bool* aIsExplicitlyEnabled);
/** /**
* Load a child (@import-ed) style sheet. In addition to loading the sheet, * Load a child (@import-ed) style sheet. In addition to loading the sheet,
@ -476,7 +482,8 @@ private:
const nsAString& aMediaString, const nsAString& aMediaString,
nsMediaList* aMediaList, nsMediaList* aMediaList,
dom::Element* aScopeElement, dom::Element* aScopeElement,
bool isAlternate); bool isAlternate,
bool isExplicitlyEnabled);
nsresult InsertSheetInDoc(StyleSheet* aSheet, nsresult InsertSheetInDoc(StyleSheet* aSheet,
nsIContent* aLinkingContent, nsIContent* aLinkingContent,

View file

@ -470,6 +470,7 @@ CSS_PROP_DISPLAY(
kAppearanceKTable, kAppearanceKTable,
CSS_PROP_NO_OFFSET, CSS_PROP_NO_OFFSET,
eStyleAnimType_Discrete) eStyleAnimType_Discrete)
#ifndef CSS_PROP_LIST_EXCLUDE_INTERNAL
CSS_PROP_POSITION( CSS_PROP_POSITION(
aspect-ratio, aspect-ratio,
aspect_ratio, aspect_ratio,
@ -481,6 +482,7 @@ CSS_PROP_POSITION(
nullptr, nullptr,
offsetof(nsStylePosition, mAspectRatio), offsetof(nsStylePosition, mAspectRatio),
eStyleAnimType_None) eStyleAnimType_None)
#endif // CSS_PROP_LIST_EXCLUDE_INTERNAL
CSS_PROP_DISPLAY( CSS_PROP_DISPLAY(
backface-visibility, backface-visibility,
backface_visibility, backface_visibility,

View file

@ -1185,6 +1185,14 @@ pref("dom.storage.default_quota", 5120);
pref("dom.send_after_paint_to_content", false); pref("dom.send_after_paint_to_content", false);
// Whether the disabled attribute in HTMLLinkElement disables the sheet loading
// altogether, or forwards to the inner stylesheet method without attribute
// reflection.
//
// Historical behavior is the second, the first is being discussed at:
// https://github.com/whatwg/html/issues/3840
pref("dom.link.disabled_attribute.enabled", true);
// Timeout clamp in ms for timeouts we clamp // Timeout clamp in ms for timeouts we clamp
pref("dom.min_timeout_value", 4); pref("dom.min_timeout_value", 4);
// And for background windows // And for background windows