mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 20:29:18 +00:00
LibWeb/HTML: Update get_an_elements_noopener() to current spec
Note that this preemptively includes this fix to step 3: https://github.com/whatwg/html/pull/10962
This commit is contained in:
parent
6bc38832af
commit
1bd73184da
Notes:
github-actions[bot]
2025-01-31 17:28:04 +00:00
Author: https://github.com/AtkinsSJ
Commit: 1bd73184da
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3402
Reviewed-by: https://github.com/ADKaster ✅
Reviewed-by: https://github.com/shannonbooth
Reviewed-by: https://github.com/tcl3 ✅
7 changed files with 25 additions and 11 deletions
|
@ -65,9 +65,9 @@ private:
|
||||||
{
|
{
|
||||||
return get_an_elements_target(target);
|
return get_an_elements_target(target);
|
||||||
}
|
}
|
||||||
virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(StringView target) const override
|
virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(URL::URL const& url, StringView target) const override
|
||||||
{
|
{
|
||||||
return get_an_elements_noopener(target);
|
return get_an_elements_noopener(url, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Optional<ARIA::Role> default_role() const override;
|
virtual Optional<ARIA::Role> default_role() const override;
|
||||||
|
|
|
@ -48,9 +48,9 @@ private:
|
||||||
{
|
{
|
||||||
return get_an_elements_target(target);
|
return get_an_elements_target(target);
|
||||||
}
|
}
|
||||||
virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(StringView target) const override
|
virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(URL::URL const& url, StringView target) const override
|
||||||
{
|
{
|
||||||
return get_an_elements_noopener(target);
|
return get_an_elements_noopener(url, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual Optional<ARIA::Role> default_role() const override;
|
virtual Optional<ARIA::Role> default_role() const override;
|
||||||
|
|
|
@ -930,9 +930,10 @@ String HTMLElement::get_an_elements_target(Optional<String> target) const
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/links.html#get-an-element's-noopener
|
// https://html.spec.whatwg.org/multipage/links.html#get-an-element's-noopener
|
||||||
TokenizedFeature::NoOpener HTMLElement::get_an_elements_noopener(StringView target) const
|
TokenizedFeature::NoOpener HTMLElement::get_an_elements_noopener(URL::URL const& url, StringView target) const
|
||||||
{
|
{
|
||||||
// To get an element's noopener, given an a, area, or form element element and a string target:
|
// To get an element's noopener, given an a, area, or form element element, a URL record url, and a string target,
|
||||||
|
// perform the following steps. They return a boolean.
|
||||||
auto rel = MUST(get_attribute_value(HTML::AttributeNames::rel).to_lowercase());
|
auto rel = MUST(get_attribute_value(HTML::AttributeNames::rel).to_lowercase());
|
||||||
auto link_types = rel.bytes_as_string_view().split_view_if(Infra::is_ascii_whitespace);
|
auto link_types = rel.bytes_as_string_view().split_view_if(Infra::is_ascii_whitespace);
|
||||||
|
|
||||||
|
@ -945,7 +946,20 @@ TokenizedFeature::NoOpener HTMLElement::get_an_elements_noopener(StringView targ
|
||||||
if (!link_types.contains_slow("opener"sv) && Infra::is_ascii_case_insensitive_match(target, "_blank"sv))
|
if (!link_types.contains_slow("opener"sv) && Infra::is_ascii_case_insensitive_match(target, "_blank"sv))
|
||||||
return TokenizedFeature::NoOpener::Yes;
|
return TokenizedFeature::NoOpener::Yes;
|
||||||
|
|
||||||
// 3. Return false.
|
// 3. If url's blob URL entry is not null:
|
||||||
|
if (url.blob_url_entry().has_value()) {
|
||||||
|
// 1. Let blobOrigin be url's blob URL entry's environment's origin.
|
||||||
|
auto const& blob_origin = url.blob_url_entry()->environment.origin;
|
||||||
|
|
||||||
|
// 2. Let topLevelOrigin be element's relevant settings object's top-level origin.
|
||||||
|
auto const& top_level_origin = relevant_settings_object(*this).top_level_origin;
|
||||||
|
|
||||||
|
// 3. If blobOrigin is not same site with topLevelOrigin, then return true.
|
||||||
|
if (!blob_origin.is_same_site(top_level_origin))
|
||||||
|
return TokenizedFeature::NoOpener::Yes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Return false.
|
||||||
return TokenizedFeature::NoOpener::No;
|
return TokenizedFeature::NoOpener::No;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -117,7 +117,7 @@ public:
|
||||||
virtual Optional<ARIA::Role> default_role() const override;
|
virtual Optional<ARIA::Role> default_role() const override;
|
||||||
|
|
||||||
String get_an_elements_target(Optional<String> target = {}) const;
|
String get_an_elements_target(Optional<String> target = {}) const;
|
||||||
TokenizedFeature::NoOpener get_an_elements_noopener(StringView target) const;
|
TokenizedFeature::NoOpener get_an_elements_noopener(URL::URL const& url, StringView target) const;
|
||||||
|
|
||||||
WebIDL::ExceptionOr<GC::Ref<ElementInternals>> attach_internals();
|
WebIDL::ExceptionOr<GC::Ref<ElementInternals>> attach_internals();
|
||||||
|
|
||||||
|
|
|
@ -250,7 +250,7 @@ WebIDL::ExceptionOr<void> HTMLFormElement::submit_form(GC::Ref<HTMLElement> subm
|
||||||
auto target = get_an_elements_target(form_target);
|
auto target = get_an_elements_target(form_target);
|
||||||
|
|
||||||
// 21. Let noopener be the result of getting an element's noopener with form, parsed action, and target.
|
// 21. Let noopener be the result of getting an element's noopener with form, parsed action, and target.
|
||||||
auto no_opener = get_an_elements_noopener(target);
|
auto no_opener = get_an_elements_noopener(*parsed_action, target);
|
||||||
|
|
||||||
// 22. Let targetNavigable be the first return value of applying the rules for choosing a navigable given target,
|
// 22. Let targetNavigable be the first return value of applying the rules for choosing a navigable given target,
|
||||||
// form's node navigable, and noopener.
|
// form's node navigable, and noopener.
|
||||||
|
|
|
@ -488,7 +488,7 @@ void HTMLHyperlinkElementUtils::follow_the_hyperlink(Optional<String> hyperlink_
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// 6. Let noopener be the result of getting an element's noopener with subject, urlRecord, and targetAttributeValue.
|
// 6. Let noopener be the result of getting an element's noopener with subject, urlRecord, and targetAttributeValue.
|
||||||
auto noopener = hyperlink_element_utils_get_an_elements_noopener(target_attribute_value);
|
auto noopener = hyperlink_element_utils_get_an_elements_noopener(*url_record, target_attribute_value);
|
||||||
|
|
||||||
// 7. Let targetNavigable be the first return value of applying the rules for choosing a navigable given
|
// 7. Let targetNavigable be the first return value of applying the rules for choosing a navigable given
|
||||||
// targetAttributeValue, subject's node navigable, and noopener.
|
// targetAttributeValue, subject's node navigable, and noopener.
|
||||||
|
|
|
@ -59,7 +59,7 @@ protected:
|
||||||
virtual bool hyperlink_element_utils_is_html_anchor_element() const = 0;
|
virtual bool hyperlink_element_utils_is_html_anchor_element() const = 0;
|
||||||
virtual bool hyperlink_element_utils_is_connected() const = 0;
|
virtual bool hyperlink_element_utils_is_connected() const = 0;
|
||||||
virtual String hyperlink_element_utils_get_an_elements_target(Optional<String> target = {}) const = 0;
|
virtual String hyperlink_element_utils_get_an_elements_target(Optional<String> target = {}) const = 0;
|
||||||
virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(StringView target) const = 0;
|
virtual TokenizedFeature::NoOpener hyperlink_element_utils_get_an_elements_noopener(URL::URL const& url, StringView target) const = 0;
|
||||||
|
|
||||||
virtual void hyperlink_element_utils_queue_an_element_task(HTML::Task::Source source, Function<void()> steps) = 0;
|
virtual void hyperlink_element_utils_queue_an_element_task(HTML::Task::Source source, Function<void()> steps) = 0;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue