LibWeb: Add HTMLAnchorElement.referrerPolicy property

This commit is contained in:
Sam Atkins 2023-03-29 12:46:50 +01:00 committed by Linus Groh
parent 0c19d3aa58
commit 88d64fcb55
Notes: sideshowbarker 2024-07-17 02:38:39 +09:00
7 changed files with 87 additions and 0 deletions

View file

@ -450,6 +450,7 @@ set(SOURCES
Platform/Timer.cpp
Platform/TimerSerenity.cpp
ReferrerPolicy/AbstractOperations.cpp
ReferrerPolicy/ReferrerPolicy.cpp
RequestIdleCallback/IdleDeadline.cpp
ResizeObserver/ResizeObserver.cpp
SecureContexts/AbstractOperations.cpp

View file

@ -195,6 +195,7 @@ namespace AttributeNames {
__ENUMERATE_HTML_ATTRIBUTE(poster) \
__ENUMERATE_HTML_ATTRIBUTE(preload) \
__ENUMERATE_HTML_ATTRIBUTE(readonly) \
__ENUMERATE_HTML_ATTRIBUTE(referrerpolicy) \
__ENUMERATE_HTML_ATTRIBUTE(rel) \
__ENUMERATE_HTML_ATTRIBUTE(required) \
__ENUMERATE_HTML_ATTRIBUTE(rev) \

View file

@ -7,6 +7,7 @@
#include <LibWeb/ARIA/Roles.h>
#include <LibWeb/HTML/HTMLAnchorElement.h>
#include <LibWeb/HTML/Window.h>
#include <LibWeb/ReferrerPolicy/ReferrerPolicy.h>
namespace Web::HTML {
@ -114,4 +115,22 @@ void HTMLAnchorElement::set_text(DeprecatedString const& text)
string_replace_all(text);
}
// https://html.spec.whatwg.org/multipage/text-level-semantics.html#dom-a-referrerpolicy
DeprecatedString HTMLAnchorElement::referrer_policy() const
{
// The IDL attribute referrerPolicy must reflect the referrerpolicy content attribute, limited to only known values.
auto policy_string = attribute(HTML::AttributeNames::referrerpolicy);
auto maybe_policy = ReferrerPolicy::from_string(policy_string);
if (maybe_policy.has_value())
return ReferrerPolicy::to_string(maybe_policy.value());
return "";
}
// https://html.spec.whatwg.org/multipage/text-level-semantics.html#dom-a-referrerpolicy
WebIDL::ExceptionOr<void> HTMLAnchorElement::set_referrer_policy(DeprecatedString const& referrer_policy)
{
// The IDL attribute referrerPolicy must reflect the referrerpolicy content attribute, limited to only known values.
return set_attribute(HTML::AttributeNames::referrerpolicy, referrer_policy);
}
}

View file

@ -26,6 +26,9 @@ public:
DeprecatedString text() const;
void set_text(DeprecatedString const&);
DeprecatedString referrer_policy() const;
WebIDL::ExceptionOr<void> set_referrer_policy(DeprecatedString const&);
// ^EventTarget
// https://html.spec.whatwg.org/multipage/interaction.html#the-tabindex-attribute:the-a-element
virtual bool is_focusable() const override { return has_attribute(HTML::AttributeNames::href); }

View file

@ -17,6 +17,8 @@ interface HTMLAnchorElement : HTMLElement {
[CEReactions] attribute DOMString text;
[CEReactions] attribute DOMString referrerPolicy;
// Obsolete
[CEReactions, Reflect] attribute DOMString coords;
[CEReactions, Reflect] attribute DOMString charset;

View file

@ -0,0 +1,55 @@
/*
* Copyright (c) 2023, Sam Atkins <atkinssj@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibWeb/ReferrerPolicy/ReferrerPolicy.h>
namespace Web::ReferrerPolicy {
StringView to_string(ReferrerPolicy referrer_policy)
{
switch (referrer_policy) {
case ReferrerPolicy::NoReferrer:
return "no-referrer"sv;
case ReferrerPolicy::NoReferrerWhenDowngrade:
return "no-referrer-when-downgrade"sv;
case ReferrerPolicy::SameOrigin:
return "same-origin"sv;
case ReferrerPolicy::Origin:
return "origin"sv;
case ReferrerPolicy::StrictOrigin:
return "strict-origin"sv;
case ReferrerPolicy::OriginWhenCrossOrigin:
return "origin-when-cross-origin"sv;
case ReferrerPolicy::StrictOriginWhenCrossOrigin:
return "strict-origin-when-cross-origin"sv;
case ReferrerPolicy::UnsafeURL:
return "unsafe-url"sv;
}
VERIFY_NOT_REACHED();
}
Optional<ReferrerPolicy> from_string(StringView string)
{
if (string.equals_ignoring_ascii_case("no-referrer"sv))
return ReferrerPolicy::NoReferrer;
if (string.equals_ignoring_ascii_case("no-referrer-when-downgrade"sv))
return ReferrerPolicy::NoReferrerWhenDowngrade;
if (string.equals_ignoring_ascii_case("same-origin"sv))
return ReferrerPolicy::SameOrigin;
if (string.equals_ignoring_ascii_case("origin"sv))
return ReferrerPolicy::Origin;
if (string.equals_ignoring_ascii_case("strict-origin"sv))
return ReferrerPolicy::StrictOrigin;
if (string.equals_ignoring_ascii_case("origin-when-cross-origin"sv))
return ReferrerPolicy::OriginWhenCrossOrigin;
if (string.equals_ignoring_ascii_case("strict-origin-when-cross-origin"sv))
return ReferrerPolicy::StrictOriginWhenCrossOrigin;
if (string.equals_ignoring_ascii_case("unsafe-url"sv))
return ReferrerPolicy::UnsafeURL;
return {};
}
}

View file

@ -6,6 +6,9 @@
#pragma once
#include <AK/Optional.h>
#include <AK/StringView.h>
namespace Web::ReferrerPolicy {
// https://w3c.github.io/webappsec-referrer-policy/#enumdef-referrerpolicy
@ -24,4 +27,7 @@ enum class ReferrerPolicy {
// The default referrer policy is "strict-origin-when-cross-origin".
constexpr auto DEFAULT_REFERRER_POLICY = ReferrerPolicy::StrictOriginWhenCrossOrigin;
StringView to_string(ReferrerPolicy);
Optional<ReferrerPolicy> from_string(StringView);
}