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;