diff --git a/components/net_traits/lib.rs b/components/net_traits/lib.rs index 7d0badb20b8..8bb1ad91cae 100644 --- a/components/net_traits/lib.rs +++ b/components/net_traits/lib.rs @@ -126,6 +126,22 @@ pub enum ReferrerPolicy { StrictOriginWhenCrossOrigin, } +impl ToString for ReferrerPolicy { + fn to_string(&self) -> String { + match self { + ReferrerPolicy::NoReferrer => "no-referrer", + ReferrerPolicy::NoReferrerWhenDowngrade => "no-referrer-when-downgrade", + ReferrerPolicy::Origin => "origin", + ReferrerPolicy::SameOrigin => "same-origin", + ReferrerPolicy::OriginWhenCrossOrigin => "origin-when-cross-origin", + ReferrerPolicy::UnsafeUrl => "unsafe-url", + ReferrerPolicy::StrictOrigin => "strict-origin", + ReferrerPolicy::StrictOriginWhenCrossOrigin => "strict-origin-when-cross-origin", + } + .to_string() + } +} + impl From for ReferrerPolicy { fn from(policy: ReferrerPolicyHeader) -> Self { match policy { diff --git a/components/script/dom/htmlimageelement.rs b/components/script/dom/htmlimageelement.rs index 595d0d52d41..8041fb5685e 100644 --- a/components/script/dom/htmlimageelement.rs +++ b/components/script/dom/htmlimageelement.rs @@ -18,7 +18,7 @@ use crate::dom::bindings::refcounted::Trusted; use crate::dom::bindings::reflector::DomObject; use crate::dom::bindings::root::{DomRoot, LayoutDom, MutNullableDom}; use crate::dom::bindings::str::{DOMString, USVString}; -use crate::dom::document::Document; +use crate::dom::document::{determine_policy_for_token, Document}; use crate::dom::element::{cors_setting_for_element, referrer_policy_for_element}; use crate::dom::element::{reflect_cross_origin_attribute, set_cross_origin_attribute}; use crate::dom::element::{ @@ -1418,6 +1418,21 @@ pub fn parse_a_sizes_attribute(value: DOMString) -> SourceSizeList { SourceSizeList::parse(&context, &mut parser) } +fn get_correct_referrerpolicy_from_raw_token(token: &DOMString) -> DOMString { + if token == "" { + // Empty token is treated as no-referrer inside determine_policy_for_token, + // while here it should be treated as the default value, so it should remain unchanged. + DOMString::new() + } else { + match determine_policy_for_token(token) { + Some(policy) => DOMString::from_string(policy.to_string()), + // If the policy is set to an incorrect value, then it should be + // treated as an invalid value default (empty string). + None => DOMString::new(), + } + } +} + impl HTMLImageElementMethods for HTMLImageElement { // https://html.spec.whatwg.org/multipage/#dom-img-alt make_getter!(Alt, "alt"); @@ -1540,6 +1555,28 @@ impl HTMLImageElementMethods for HTMLImageElement { } } + // https://html.spec.whatwg.org/multipage/#dom-img-referrerpolicy + fn ReferrerPolicy(&self) -> DOMString { + let element = self.upcast::(); + let current_policy_value = element.get_string_attribute(&local_name!("referrerpolicy")); + get_correct_referrerpolicy_from_raw_token(¤t_policy_value) + } + + // https://html.spec.whatwg.org/multipage/#dom-img-referrerpolicy + fn SetReferrerPolicy(&self, value: DOMString) { + let referrerpolicy_attr_name = local_name!("referrerpolicy"); + let element = self.upcast::(); + let previous_correct_attribute_value = get_correct_referrerpolicy_from_raw_token( + &element.get_string_attribute(&referrerpolicy_attr_name), + ); + let correct_value_or_empty_string = get_correct_referrerpolicy_from_raw_token(&value); + if previous_correct_attribute_value != correct_value_or_empty_string { + // Setting the attribute to the same value will update the image. + // We don't want to start an update if referrerpolicy is set to the same value. + element.set_string_attribute(&referrerpolicy_attr_name, correct_value_or_empty_string); + } + } + // https://html.spec.whatwg.org/multipage/#dom-img-name make_getter!(Name, "name"); @@ -1594,7 +1631,8 @@ impl VirtualMethods for HTMLImageElement { &local_name!("srcset") | &local_name!("width") | &local_name!("crossorigin") | - &local_name!("sizes") => self.update_the_image_data(), + &local_name!("sizes") | + &local_name!("referrerpolicy") => self.update_the_image_data(), _ => {}, } } diff --git a/components/script/dom/webidls/HTMLImageElement.webidl b/components/script/dom/webidls/HTMLImageElement.webidl index 8e37fea4940..81f6b4674f1 100644 --- a/components/script/dom/webidls/HTMLImageElement.webidl +++ b/components/script/dom/webidls/HTMLImageElement.webidl @@ -27,6 +27,8 @@ interface HTMLImageElement : HTMLElement { readonly attribute unsigned long naturalHeight; readonly attribute boolean complete; readonly attribute USVString currentSrc; + [CEReactions] + attribute DOMString referrerPolicy; // also has obsolete members }; diff --git a/tests/wpt/metadata/custom-elements/reactions/HTMLImageElement.html.ini b/tests/wpt/metadata/custom-elements/reactions/HTMLImageElement.html.ini index 54f8f4da9a6..22170bf6d9a 100644 --- a/tests/wpt/metadata/custom-elements/reactions/HTMLImageElement.html.ini +++ b/tests/wpt/metadata/custom-elements/reactions/HTMLImageElement.html.ini @@ -1,10 +1,4 @@ [HTMLImageElement.html] - [referrerPolicy on HTMLImageElement must enqueue an attributeChanged reaction when replacing an existing attribute] - expected: FAIL - - [referrerPolicy on HTMLImageElement must enqueue an attributeChanged reaction when adding a new attribute] - expected: FAIL - [decoding on HTMLImageElement must enqueue an attributeChanged reaction when replacing an existing attribute] expected: FAIL diff --git a/tests/wpt/metadata/html/dom/idlharness.https.html.ini b/tests/wpt/metadata/html/dom/idlharness.https.html.ini index 07903105bdc..3fa4a76ee55 100644 --- a/tests/wpt/metadata/html/dom/idlharness.https.html.ini +++ b/tests/wpt/metadata/html/dom/idlharness.https.html.ini @@ -2703,9 +2703,6 @@ [HTMLInputElement interface: createInput("radio") must inherit property "height" with the proper type] expected: FAIL - [HTMLImageElement interface: document.createElement("img") must inherit property "referrerPolicy" with the proper type] - expected: FAIL - [HTMLDialogElement interface: operation showModal()] expected: FAIL @@ -3045,9 +3042,6 @@ [HTMLLinkElement interface: document.createElement("link") must inherit property "imageSizes" with the proper type] expected: FAIL - [HTMLImageElement interface: attribute referrerPolicy] - expected: FAIL - [HTMLInputElement interface: createInput("time") must inherit property "align" with the proper type] expected: FAIL @@ -3276,9 +3270,6 @@ [HTMLObjectElement interface: attribute width] expected: FAIL - [HTMLImageElement interface: new Image() must inherit property "referrerPolicy" with the proper type] - expected: FAIL - [HTMLObjectElement interface: operation getSVGDocument()] expected: FAIL diff --git a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini index b92c45b4d79..4a0960b487d 100644 --- a/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini +++ b/tests/wpt/metadata/html/semantics/embedded-content/the-img-element/relevant-mutations.html.ini @@ -29,40 +29,3 @@ [picture is inserted; img has src] expected: FAIL - - [referrerpolicy no-referrer-when-downgrade to empty, src already set] - expected: FAIL - - [referrerpolicy no-referrer-when-downgrade to no-referrer, src already set] - expected: FAIL - - [referrerpolicy absent to no-referrer-when-downgrade, src already set] - expected: FAIL - - [referrerpolicy no-referrer-when-downgrade to absent, src already set] - expected: FAIL - - [referrerpolicy no-referrer to invalid, src already set] - expected: FAIL - - [referrerpolicy no-referrer to no-referrer-when-downgrade, src already set] - expected: FAIL - - [referrerpolicy empty to no-referrer-when-downgrade, src already set] - expected: FAIL - - [referrerpolicy no-referrer to empty, src already set] - expected: FAIL - - [referrerpolicy absent to no-referrer, src already set] - expected: FAIL - - [referrerpolicy no-referrer-when-downgrade to invalid, src already set] - expected: FAIL - - [referrerpolicy no-referrer to absent, src already set] - expected: FAIL - - [referrerpolicy empty to no-referrer, src already set] - expected: FAIL -