summaryrefslogtreecommitdiffstats
path: root/dom/html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/html')
-rw-r--r--dom/html/HTMLImageElement.cpp2
-rw-r--r--dom/html/HTMLImageElement.h5
-rw-r--r--dom/html/HTMLLinkElement.cpp59
-rw-r--r--dom/html/HTMLLinkElement.h16
-rw-r--r--dom/html/HTMLMediaElement.cpp14
-rw-r--r--dom/html/HTMLScriptElement.cpp23
-rw-r--r--dom/html/HTMLScriptElement.h2
-rw-r--r--dom/html/HTMLStyleElement.cpp6
-rw-r--r--dom/html/HTMLStyleElement.h5
-rw-r--r--dom/html/nsGenericHTMLElement.cpp58
-rw-r--r--dom/html/nsGenericHTMLElement.h4
11 files changed, 147 insertions, 47 deletions
diff --git a/dom/html/HTMLImageElement.cpp b/dom/html/HTMLImageElement.cpp
index fab1cdef4..08f2404ce 100644
--- a/dom/html/HTMLImageElement.cpp
+++ b/dom/html/HTMLImageElement.cpp
@@ -324,7 +324,7 @@ HTMLImageElement::MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
nsGenericHTMLElement::MapImageAlignAttributeInto(aAttributes, aData);
nsGenericHTMLElement::MapImageBorderAttributeInto(aAttributes, aData);
nsGenericHTMLElement::MapImageMarginAttributeInto(aAttributes, aData);
- nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aData);
+ nsGenericHTMLElement::MapImageSizeAttributesInto(aAttributes, aData, true);
nsGenericHTMLElement::MapCommonAttributesInto(aAttributes, aData);
}
diff --git a/dom/html/HTMLImageElement.h b/dom/html/HTMLImageElement.h
index 62323e801..1e63cd79c 100644
--- a/dom/html/HTMLImageElement.h
+++ b/dom/html/HTMLImageElement.h
@@ -206,6 +206,11 @@ public:
return GetReferrerPolicyAsEnum();
}
+ bool IsAwaitingLoad() const
+ {
+ return !!mPendingImageLoadTask;
+ }
+
int32_t X();
int32_t Y();
// Uses XPCOM GetLowsrc.
diff --git a/dom/html/HTMLLinkElement.cpp b/dom/html/HTMLLinkElement.cpp
index 8afe767bd..1b78cbd69 100644
--- a/dom/html/HTMLLinkElement.cpp
+++ b/dom/html/HTMLLinkElement.cpp
@@ -33,6 +33,8 @@
#define LINK_ELEMENT_FLAG_BIT(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
enum {
// 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)
+
bool
-HTMLLinkElement::Disabled()
+HTMLLinkElement::Disabled() const
{
+ if (LINK_DISABLED) {
+ return GetBoolAttr(nsGkAtoms::disabled);
+ }
+
StyleSheet* ss = GetSheet();
return ss && ss->Disabled();
}
@@ -107,8 +114,12 @@ HTMLLinkElement::GetMozDisabled(bool* aDisabled)
}
void
-HTMLLinkElement::SetDisabled(bool aDisabled)
-{
+HTMLLinkElement::SetDisabled(bool aDisabled, ErrorResult& aRv)
+{
+ if (LINK_DISABLED) {
+ return SetHTMLBoolAttr(nsGkAtoms::disabled, aDisabled, aRv);
+ }
+
if (StyleSheet* ss = GetSheet()) {
ss->SetDisabled(aDisabled);
}
@@ -117,11 +128,11 @@ HTMLLinkElement::SetDisabled(bool aDisabled)
NS_IMETHODIMP
HTMLLinkElement::SetMozDisabled(bool aDisabled)
{
- SetDisabled(aDisabled);
- return NS_OK;
+ ErrorResult rv;
+ SetDisabled(aDisabled, rv);
+ return rv.StealNSResult();
}
-
NS_IMPL_STRING_ATTR(HTMLLinkElement, Charset, charset)
NS_IMPL_URI_ATTR(HTMLLinkElement, Href, href)
NS_IMPL_STRING_ATTR(HTMLLinkElement, Hreflang, hreflang)
@@ -369,7 +380,8 @@ HTMLLinkElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
aName == nsGkAtoms::rel ||
aName == nsGkAtoms::title ||
aName == nsGkAtoms::media ||
- aName == nsGkAtoms::type)) {
+ aName == nsGkAtoms::type ||
+ (LINK_DISABLED && aName == nsGkAtoms::disabled))) {
bool dropSheet = false;
if (aName == nsGkAtoms::rel) {
nsAutoString value;
@@ -396,17 +408,24 @@ HTMLLinkElement::AfterSetAttr(int32_t aNameSpaceID, nsIAtom* aName,
dropSheet ||
(aName == nsGkAtoms::title ||
aName == nsGkAtoms::media ||
- aName == nsGkAtoms::type));
+ aName == nsGkAtoms::type ||
+ (LINK_DISABLED && aName == nsGkAtoms::disabled)));
}
} else {
- // Since removing href or rel makes us no longer link to a
- // stylesheet, force updates for those too.
+ // 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
+ // stylesheet, force updates for those too.
if (aName == nsGkAtoms::href ||
aName == nsGkAtoms::rel ||
aName == nsGkAtoms::title ||
aName == nsGkAtoms::media ||
- aName == nsGkAtoms::type) {
+ aName == nsGkAtoms::type ||
+ (LINK_DISABLED && aName == nsGkAtoms::disabled)) {
UpdateStyleSheetInternal(nullptr, nullptr, true);
}
if (aName == nsGkAtoms::href ||
@@ -499,13 +518,15 @@ HTMLLinkElement::GetStyleSheetInfo(nsAString& aTitle,
nsAString& aType,
nsAString& aMedia,
bool* aIsScoped,
- bool* aIsAlternate)
+ bool* aIsAlternate,
+ bool* aIsExplicitlyEnabled)
{
aTitle.Truncate();
aType.Truncate();
aMedia.Truncate();
*aIsScoped = false;
*aIsAlternate = false;
+ *aIsExplicitlyEnabled = false;
nsAutoString rel;
GetAttr(kNameSpaceID_None, nsGkAtoms::rel, rel);
@@ -515,6 +536,20 @@ HTMLLinkElement::GetStyleSheetInfo(nsAString& aTitle,
return;
}
+ if (LINK_DISABLED) {
+
+ // Is the link disabled?
+ if (Disabled()) {
+ return;
+ }
+
+ // Is it explicitly enabled?
+ if (mExplicitlyEnabled) {
+ *aIsExplicitlyEnabled = true;
+ }
+
+ }
+
nsAutoString title;
GetAttr(kNameSpaceID_None, nsGkAtoms::title, title);
title.CompressWhitespace();
diff --git a/dom/html/HTMLLinkElement.h b/dom/html/HTMLLinkElement.h
index 421b149e9..f9c832c8d 100644
--- a/dom/html/HTMLLinkElement.h
+++ b/dom/html/HTMLLinkElement.h
@@ -84,8 +84,8 @@ public:
virtual bool HasDeferredDNSPrefetchRequest() override;
// WebIDL
- bool Disabled();
- void SetDisabled(bool aDisabled);
+ bool Disabled() const;
+ void SetDisabled(bool aDisabled, ErrorResult& aRv);
// XPCOM GetHref is fine.
void SetHref(const nsAString& aHref, ErrorResult& aRv)
{
@@ -179,10 +179,18 @@ protected:
nsAString& aType,
nsAString& aMedia,
bool* aIsScoped,
- bool* aIsAlternate) override;
-protected:
+ bool* aIsAlternate,
+ bool* aIsExplicitlyEnabled) override;
+
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:
RefPtr<ImportLoader> mImportLoader;
};
diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
index bc63eab51..4abc202a8 100644
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -9,6 +9,7 @@
#include "mozilla/dom/HTMLSourceElement.h"
#include "mozilla/dom/ElementInlines.h"
#include "mozilla/dom/Promise.h"
+#include "mozilla/Preferences.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/MathAlgorithms.h"
#include "mozilla/AsyncEventDispatcher.h"
@@ -1245,7 +1246,18 @@ void HTMLMediaElement::NoSupportedMediaSourceError(const nsACString& aErrorDetai
if (mDecoder) {
ShutdownDecoder();
}
- mErrorSink->SetError(MEDIA_ERR_SRC_NOT_SUPPORTED, aErrorDetails);
+
+ // aErrorDetails can include sensitive details like MimeType or HTTP Status
+ // Code. We should not leak this and pass a Generic Error Message unless the
+ // user has explicitly enabled error reporting for debugging purposes.
+ bool reportDetails = Preferences::GetBool("media.sourceErrorDetails.enabled", false);
+ if (reportDetails) {
+ mErrorSink->SetError(MEDIA_ERR_SRC_NOT_SUPPORTED, aErrorDetails);
+ } else {
+ mErrorSink->SetError(MEDIA_ERR_SRC_NOT_SUPPORTED,
+ NS_LITERAL_CSTRING("Failed to open media"));
+ }
+
ChangeDelayLoadStatus(false);
UpdateAudioChannelPlayingState();
RejectPromises(TakePendingPlayPromises(), NS_ERROR_DOM_MEDIA_NOT_SUPPORTED_ERR);
diff --git a/dom/html/HTMLScriptElement.cpp b/dom/html/HTMLScriptElement.cpp
index ddeb925eb..6b0b4be59 100644
--- a/dom/html/HTMLScriptElement.cpp
+++ b/dom/html/HTMLScriptElement.cpp
@@ -279,12 +279,20 @@ HTMLScriptElement::GetScriptCharset(nsAString& charset)
}
void
-HTMLScriptElement::FreezeUriAsyncDefer()
+HTMLScriptElement::FreezeExecutionAttrs(nsIDocument* aOwnerDoc)
{
if (mFrozen) {
return;
}
+ MOZ_ASSERT(!mIsModule && !mAsync && !mDefer && !mExternal);
+
+ // Determine whether this is a classic script or a module script.
+ nsAutoString type;
+ GetScriptType(type);
+ mIsModule = aOwnerDoc->ModuleScriptsEnabled() &&
+ !type.IsEmpty() && type.LowerCaseEqualsASCII("module");
+
// variation of this code in nsSVGScriptElement - check if changes
// need to be transfered when modifying. Note that we don't use GetSrc here
// because it will return the base URL when the attr value is "".
@@ -299,14 +307,13 @@ HTMLScriptElement::FreezeUriAsyncDefer()
// At this point mUri will be null for invalid URLs.
mExternal = true;
-
- bool defer, async;
- GetAsync(&async);
- GetDefer(&defer);
-
- mDefer = !async && defer;
- mAsync = async;
}
+
+ bool defer, async;
+ GetAsync(&async);
+ mAsync = (mExternal || mIsModule) && async;
+ GetDefer(&defer);
+ mDefer = mExternal && !async && defer;
mFrozen = true;
}
diff --git a/dom/html/HTMLScriptElement.h b/dom/html/HTMLScriptElement.h
index 073cf7faf..ffe9d3fbd 100644
--- a/dom/html/HTMLScriptElement.h
+++ b/dom/html/HTMLScriptElement.h
@@ -41,7 +41,7 @@ public:
virtual bool GetScriptType(nsAString& type) override;
virtual void GetScriptText(nsAString& text) override;
virtual void GetScriptCharset(nsAString& charset) override;
- virtual void FreezeUriAsyncDefer() override;
+ virtual void FreezeExecutionAttrs(nsIDocument* aOwnerDoc) override;
virtual CORSMode GetCORSMode() const override;
// nsIContent
diff --git a/dom/html/HTMLStyleElement.cpp b/dom/html/HTMLStyleElement.cpp
index 329dda648..87dc68f83 100644
--- a/dom/html/HTMLStyleElement.cpp
+++ b/dom/html/HTMLStyleElement.cpp
@@ -66,7 +66,7 @@ HTMLStyleElement::GetMozDisabled(bool* aDisabled)
}
bool
-HTMLStyleElement::Disabled()
+HTMLStyleElement::Disabled() const
{
StyleSheet* ss = GetSheet();
return ss && ss->Disabled();
@@ -222,12 +222,14 @@ HTMLStyleElement::GetStyleSheetInfo(nsAString& aTitle,
nsAString& aType,
nsAString& aMedia,
bool* aIsScoped,
- bool* aIsAlternate)
+ bool* aIsAlternate,
+ bool* aIsExplicitlyEnabled)
{
aTitle.Truncate();
aType.Truncate();
aMedia.Truncate();
*aIsAlternate = false;
+ *aIsExplicitlyEnabled = false;
nsAutoString title;
GetAttr(kNameSpaceID_None, nsGkAtoms::title, title);
diff --git a/dom/html/HTMLStyleElement.h b/dom/html/HTMLStyleElement.h
index 6b2a12b1f..9f82b8e51 100644
--- a/dom/html/HTMLStyleElement.h
+++ b/dom/html/HTMLStyleElement.h
@@ -58,7 +58,7 @@ public:
NS_DECL_NSIMUTATIONOBSERVER_CONTENTINSERTED
NS_DECL_NSIMUTATIONOBSERVER_CONTENTREMOVED
- bool Disabled();
+ bool Disabled() const;
void SetDisabled(bool aDisabled);
void SetMedia(const nsAString& aMedia, ErrorResult& aError)
{
@@ -87,7 +87,8 @@ protected:
nsAString& aType,
nsAString& aMedia,
bool* aIsScoped,
- bool* aIsAlternate) override;
+ bool* aIsAlternate,
+ bool* aIsExplicitlyEnabled) override;
/**
* Common method to call from the various mutation observer methods.
* aContent is a content node that's either the one that changed or its
diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp
index ef077cfb2..ddb476cf4 100644
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -1449,29 +1449,57 @@ nsGenericHTMLElement::MapImageMarginAttributeInto(const nsMappedAttributes* aAtt
void
nsGenericHTMLElement::MapImageSizeAttributesInto(const nsMappedAttributes* aAttributes,
- nsRuleData* aData)
+ nsRuleData* aData,
+ bool aMapAspectRatio)
{
if (!(aData->mSIDs & NS_STYLE_INHERIT_BIT(Position)))
return;
+ auto* aWidth = aAttributes->GetAttr(nsGkAtoms::width);
+ auto* aHeight = aAttributes->GetAttr(nsGkAtoms::height);
+
// width: value
- nsCSSValue* width = aData->ValueForWidth();
- if (width->GetUnit() == eCSSUnit_Null) {
- const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::width);
- if (value && value->Type() == nsAttrValue::eInteger)
- width->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
- else if (value && value->Type() == nsAttrValue::ePercent)
- width->SetPercentValue(value->GetPercentValue());
+ if (aWidth) {
+ nsCSSValue* cWidth = aData->ValueForWidth();
+ if (cWidth->GetUnit() == eCSSUnit_Null) {
+ if (aWidth->Type() == nsAttrValue::eInteger)
+ cWidth->SetFloatValue((float)aWidth->GetIntegerValue(), eCSSUnit_Pixel);
+ else if (aWidth->Type() == nsAttrValue::ePercent)
+ cWidth->SetPercentValue(aWidth->GetPercentValue());
+ }
}
// height: value
- nsCSSValue* height = aData->ValueForHeight();
- if (height->GetUnit() == eCSSUnit_Null) {
- const nsAttrValue* value = aAttributes->GetAttr(nsGkAtoms::height);
- if (value && value->Type() == nsAttrValue::eInteger)
- height->SetFloatValue((float)value->GetIntegerValue(), eCSSUnit_Pixel);
- else if (value && value->Type() == nsAttrValue::ePercent)
- height->SetPercentValue(value->GetPercentValue());
+ if (aHeight) {
+ nsCSSValue* cHeight = aData->ValueForHeight();
+ if (cHeight->GetUnit() == eCSSUnit_Null) {
+ if (aHeight->Type() == nsAttrValue::eInteger)
+ cHeight->SetFloatValue((float)aHeight->GetIntegerValue(), eCSSUnit_Pixel);
+ else if (aHeight->Type() == nsAttrValue::ePercent)
+ cHeight->SetPercentValue(aHeight->GetPercentValue());
+ }
+ }
+
+ if (Preferences::GetBool("layout.css.intrinsic-aspect-ratio.enabled") &&
+ aMapAspectRatio && aWidth && aHeight) {
+ Maybe<double> w;
+ if (aWidth->Type() == nsAttrValue::eInteger) {
+ w.emplace(aWidth->GetIntegerValue());
+ } else if (aWidth->Type() == nsAttrValue::eDoubleValue) {
+ w.emplace(aWidth->GetDoubleValue());
+ }
+
+ Maybe<double> h;
+ if (aHeight->Type() == nsAttrValue::eInteger) {
+ h.emplace(aHeight->GetIntegerValue());
+ } else if (aHeight->Type() == nsAttrValue::eDoubleValue) {
+ h.emplace(aHeight->GetDoubleValue());
+ }
+
+ if (w && h && *w != 0 && *h != 0) {
+ nsCSSValue* aspect_ratio = aData->ValueForAspectRatio();
+ aspect_ratio->SetFloatValue((float(*w) / float(*h)), eCSSUnit_Number);
+ }
}
}
diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h
index 23fabc4e8..6d7dc0cef 100644
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -712,10 +712,12 @@ public:
*
* @param aAttributes the list of attributes to map
* @param aData the returned rule data [INOUT]
+ * @param aMapAspectRatio map width and height attributes on aspect-ratio
* @see GetAttributeMappingFunction
*/
static void MapImageSizeAttributesInto(const nsMappedAttributes* aAttributes,
- nsRuleData* aData);
+ nsRuleData* aData,
+ bool = false);
/**
* Helper to map the background attribute
* into a style struct.