diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp index d8771bc6733..e872d4c563e 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.cpp @@ -61,6 +61,11 @@ WebIDL::ExceptionOr HTMLAnchorElement::set_hyperlink_element_utils_href(St return set_attribute(HTML::AttributeNames::href, move(href)); } +Optional HTMLAnchorElement::hyperlink_element_utils_referrerpolicy() const +{ + return attribute(HTML::AttributeNames::referrerpolicy); +} + bool HTMLAnchorElement::has_activation_behavior() const { return true; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h index be96f4e2b70..c2b6e9934a8 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLAnchorElement.h @@ -52,6 +52,7 @@ private: virtual DOM::Document& hyperlink_element_utils_document() override { return document(); } virtual Optional hyperlink_element_utils_href() const override; virtual WebIDL::ExceptionOr set_hyperlink_element_utils_href(String) override; + virtual Optional hyperlink_element_utils_referrerpolicy() const override; virtual bool hyperlink_element_utils_is_html_anchor_element() const final { return true; } virtual bool hyperlink_element_utils_is_connected() const final { return is_connected(); } virtual void hyperlink_element_utils_queue_an_element_task(HTML::Task::Source source, Function steps) override diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp index 5ee93b01932..96ceaf5a5b7 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.cpp @@ -63,6 +63,11 @@ WebIDL::ExceptionOr HTMLAreaElement::set_hyperlink_element_utils_href(Stri return set_attribute(HTML::AttributeNames::href, move(href)); } +Optional HTMLAreaElement::hyperlink_element_utils_referrerpolicy() const +{ + return attribute(HTML::AttributeNames::referrerpolicy); +} + // https://html.spec.whatwg.org/multipage/interaction.html#dom-tabindex i32 HTMLAreaElement::default_tab_index_value() const { diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h index 57bb0649818..9c25c096c94 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.h @@ -36,6 +36,7 @@ private: virtual DOM::Document& hyperlink_element_utils_document() override { return document(); } virtual Optional hyperlink_element_utils_href() const override; virtual WebIDL::ExceptionOr set_hyperlink_element_utils_href(String) override; + virtual Optional hyperlink_element_utils_referrerpolicy() const override; virtual bool hyperlink_element_utils_is_html_anchor_element() const override { return false; } virtual bool hyperlink_element_utils_is_connected() const override { return is_connected(); } virtual void hyperlink_element_utils_queue_an_element_task(HTML::Task::Source source, Function steps) override diff --git a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.idl b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.idl index fb17dd0815d..3d4e4aaa610 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.idl +++ b/Userland/Libraries/LibWeb/HTML/HTMLAreaElement.idl @@ -1,3 +1,4 @@ +#import #import #import @@ -15,7 +16,7 @@ interface HTMLAreaElement : HTMLElement { [CEReactions, Reflect] attribute USVString ping; [CEReactions, Reflect] attribute DOMString rel; [SameObject, PutForwards=value] readonly attribute DOMTokenList relList; - [FIXME, CEReactions] attribute DOMString referrerPolicy; + [CEReactions, Reflect=referrerpolicy, Enumerated=ReferrerPolicy] attribute DOMString referrerPolicy; // Obsolete [Reflect=nohref] attribute boolean noHref; diff --git a/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp b/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp index 694780096e1..47265b608c3 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.cpp @@ -515,9 +515,10 @@ void HTMLHyperlinkElementUtils::follow_the_hyperlink(Optional hyperlink_ url_string = MUST(url_builder.to_string()); } - // FIXME: 11. Let referrerPolicy be the current state of subject's referrerpolicy content attribute. + // 11. Let referrerPolicy be the current state of subject's referrerpolicy content attribute. + auto referrer_policy = ReferrerPolicy::from_string(hyperlink_element_utils_referrerpolicy().value_or({})).value_or(ReferrerPolicy::ReferrerPolicy::EmptyString); + // FIXME: 12. If subject's link types includes the noreferrer keyword, then set referrerPolicy to "no-referrer". - auto const referrer_policy = ReferrerPolicy::ReferrerPolicy::EmptyString; // 13. Navigate targetNavigable to urlString using subject's node document, with referrerPolicy set to referrerPolicy and userInvolvement set to userInvolvement. MUST(target_navigable->navigate({ .url = url_string, .source_document = hyperlink_element_utils_document(), .referrer_policy = referrer_policy, .user_involvement = user_involvement })); diff --git a/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h b/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h index 62f73329ed3..1dffb0beafc 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h @@ -54,6 +54,7 @@ protected: virtual DOM::Document& hyperlink_element_utils_document() = 0; virtual Optional hyperlink_element_utils_href() const = 0; virtual WebIDL::ExceptionOr set_hyperlink_element_utils_href(String) = 0; + virtual Optional hyperlink_element_utils_referrerpolicy() const = 0; virtual bool hyperlink_element_utils_is_html_anchor_element() const = 0; virtual bool hyperlink_element_utils_is_connected() const = 0; virtual String hyperlink_element_utils_get_an_elements_target() const = 0;