diff --git a/Libraries/LibWeb/HTML/HTMLAnchorElement.h b/Libraries/LibWeb/HTML/HTMLAnchorElement.h index feb2c28aa6f..08fccdef996 100644 --- a/Libraries/LibWeb/HTML/HTMLAnchorElement.h +++ b/Libraries/LibWeb/HTML/HTMLAnchorElement.h @@ -61,9 +61,9 @@ private: { queue_an_element_task(source, move(steps)); } - virtual String hyperlink_element_utils_get_an_elements_target() const override + virtual String hyperlink_element_utils_get_an_elements_target(Optional target) const override { - return get_an_elements_target(); + return get_an_elements_target(target); } virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(StringView target) const override { diff --git a/Libraries/LibWeb/HTML/HTMLAreaElement.h b/Libraries/LibWeb/HTML/HTMLAreaElement.h index 4c9803a83db..d7df7ed9806 100644 --- a/Libraries/LibWeb/HTML/HTMLAreaElement.h +++ b/Libraries/LibWeb/HTML/HTMLAreaElement.h @@ -44,9 +44,9 @@ private: { queue_an_element_task(source, move(steps)); } - virtual String hyperlink_element_utils_get_an_elements_target() const override + virtual String hyperlink_element_utils_get_an_elements_target(Optional target) const override { - return get_an_elements_target(); + return get_an_elements_target(target); } virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(StringView target) const override { diff --git a/Libraries/LibWeb/HTML/HTMLElement.cpp b/Libraries/LibWeb/HTML/HTMLElement.cpp index fbdfc60e459..3aef2904d07 100644 --- a/Libraries/LibWeb/HTML/HTMLElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLElement.cpp @@ -907,21 +907,26 @@ Optional HTMLElement::default_role() const } // https://html.spec.whatwg.org/multipage/semantics.html#get-an-element's-target -String HTMLElement::get_an_elements_target() const +String HTMLElement::get_an_elements_target(Optional target) const { - // To get an element's target, given an a, area, or form element element, run these steps: + // To get an element's target, given an a, area, or form element element, and an optional string-or-null target (default null), run these steps: - // 1. If element has a target attribute, then return that attribute's value. - auto maybe_target = attribute(AttributeNames::target); - if (maybe_target.has_value()) - return maybe_target.release_value(); + // 1. If target is null, then: + if (!target.has_value()) { + // 1. If element has a target attribute, then set target to that attribute's value. + if (auto maybe_target = attribute(AttributeNames::target); maybe_target.has_value()) { + target = maybe_target.release_value(); + } + // FIXME: 2. Otherwise, if element's node document contains a base element with a target attribute, + // set target to the value of the target attribute of the first such base element. + } - // FIXME: 2. If element's node document contains a base element with a - // target attribute, then return the value of the target attribute of the - // first such base element. + // 2. If target is not null, and contains an ASCII tab or newline and a U+003C (<), then set target to "_blank". + if (target.has_value() && target->bytes_as_string_view().contains("\t\n\r"sv) && target->contains('<')) + target = "_blank"_string; - // 3. Return the empty string. - return String {}; + // 3. Return target. + return target.value_or({}); } // https://html.spec.whatwg.org/multipage/links.html#get-an-element's-noopener diff --git a/Libraries/LibWeb/HTML/HTMLElement.h b/Libraries/LibWeb/HTML/HTMLElement.h index e373f84ac56..fa9f8994022 100644 --- a/Libraries/LibWeb/HTML/HTMLElement.h +++ b/Libraries/LibWeb/HTML/HTMLElement.h @@ -116,7 +116,7 @@ public: virtual Optional default_role() const override; - String get_an_elements_target() const; + String get_an_elements_target(Optional target = {}) const; TokenizedFeature::NoOpener get_an_elements_noopener(StringView target) const; WebIDL::ExceptionOr> attach_internals(); diff --git a/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h b/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h index 17741d54240..52a24173a4a 100644 --- a/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h +++ b/Libraries/LibWeb/HTML/HTMLHyperlinkElementUtils.h @@ -58,7 +58,7 @@ protected: 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; + virtual String hyperlink_element_utils_get_an_elements_target(Optional target = {}) const = 0; virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(StringView target) const = 0; virtual void hyperlink_element_utils_queue_an_element_task(HTML::Task::Source source, Function steps) = 0;