2021-10-03 19:39:12 +02:00
/*
* Copyright ( c ) 2021 , Andreas Kling < kling @ serenityos . org >
*
* SPDX - License - Identifier : BSD - 2 - Clause
*/
2024-03-18 16:22:27 +13:00
# include <LibURL/Parser.h>
2021-10-03 19:39:12 +02:00
# include <LibWeb/DOM/Document.h>
# include <LibWeb/HTML/HTMLHyperlinkElementUtils.h>
2023-06-23 01:27:35 +03:00
# include <LibWeb/HTML/Navigable.h>
2021-10-03 19:39:12 +02:00
namespace Web : : HTML {
2022-03-14 13:21:51 -06:00
HTMLHyperlinkElementUtils : : ~ HTMLHyperlinkElementUtils ( ) = default ;
2021-10-03 19:39:12 +02:00
// https://html.spec.whatwg.org/multipage/links.html#reinitialise-url
void HTMLHyperlinkElementUtils : : reinitialize_url ( ) const
{
// 1. If element's url is non-null, its scheme is "blob", and its cannot-be-a-basFe-URL is true, terminate these steps.
if ( m_url . has_value ( ) & & m_url - > scheme ( ) = = " blob " sv & & m_url - > cannot_be_a_base_url ( ) )
return ;
// 2. Set the url.
const_cast < HTMLHyperlinkElementUtils * > ( this ) - > set_the_url ( ) ;
}
// https://html.spec.whatwg.org/multipage/links.html#concept-hyperlink-url-set
void HTMLHyperlinkElementUtils : : set_the_url ( )
{
// 1. If this element's href content attribute is absent, set this element's url to null.
auto href_content_attribute = hyperlink_element_utils_href ( ) ;
2023-10-10 15:00:58 +03:30
if ( ! href_content_attribute . has_value ( ) ) {
2021-10-03 19:39:12 +02:00
m_url = { } ;
return ;
}
// 2. Otherwise, parse this element's href content attribute value relative to this element's node document.
// If parsing is successful, set this element's url to the result; otherwise, set this element's url to null.
2023-10-10 15:00:58 +03:30
m_url = hyperlink_element_utils_document ( ) . parse_url ( * href_content_attribute ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-origin
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : origin ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. If this element's url is null, return the empty string.
if ( ! m_url . has_value ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 3. Return the serialization of this element's url's origin.
2023-12-16 17:49:34 +03:30
return MUST ( String : : from_byte_string ( m_url - > serialize_origin ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-protocol
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : protocol ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. If this element's url is null, return ":".
if ( ! m_url . has_value ( ) )
2023-11-20 13:34:37 +13:00
return " : " _string ;
2021-10-03 19:39:12 +02:00
// 3. Return this element's url's scheme, followed by ":".
2023-11-20 13:34:37 +13:00
return MUST ( String : : formatted ( " {}: " , m_url - > scheme ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-protocol
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_protocol ( StringView protocol )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. If this element's url is null, terminate these steps.
if ( ! m_url . has_value ( ) )
return ;
// 3. Basic URL parse the given value, followed by ":", with this element's url as url and scheme start state as state override.
2024-03-18 16:22:27 +13:00
auto result_url = URL : : Parser : : basic_parse ( MUST ( String : : formatted ( " {}: " , protocol ) ) , { } , m_url , URL : : Parser : : State : : SchemeStart ) ;
2021-10-03 19:39:12 +02:00
if ( result_url . is_valid ( ) )
m_url = move ( result_url ) ;
// 4. Update href.
update_href ( ) ;
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-username
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : username ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. If this element's url is null, return the empty string.
if ( ! m_url . has_value ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 3. Return this element's url's username.
2024-08-04 22:02:02 +12:00
return m_url - > username ( ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-username
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_username ( StringView username )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
auto & url = m_url ;
// 3. If url is null or url cannot have a username/password/port, then return.
if ( ! url . has_value ( ) | | url - > cannot_have_a_username_or_password_or_port ( ) )
return ;
// 4. Set the username given this’ s URL and the given value.
2023-08-12 16:52:38 +12:00
MUST ( url - > set_username ( username ) ) ;
2021-10-03 19:39:12 +02:00
// 5. Update href.
update_href ( ) ;
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-password
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : password ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
auto & url = m_url ;
// 3. If url is null, then return the empty string.
if ( ! url . has_value ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 4. Return url's password.
2024-08-04 22:02:02 +12:00
return url - > password ( ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-password
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_password ( StringView password )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
auto & url = m_url ;
// 3. If url is null or url cannot have a username/password/port, then return.
if ( ! url . has_value ( ) | | url - > cannot_have_a_username_or_password_or_port ( ) )
return ;
// 4. Set the password, given url and the given value.
2023-08-12 16:52:38 +12:00
MUST ( url - > set_password ( password ) ) ;
2021-10-03 19:39:12 +02:00
// 5. Update href.
update_href ( ) ;
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-host
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : host ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
2023-11-20 13:34:37 +13:00
auto const & url = m_url ;
2021-10-03 19:39:12 +02:00
// 3. If url or url's host is null, return the empty string.
2023-07-27 21:40:41 +12:00
if ( ! url . has_value ( ) | | url - > host ( ) . has < Empty > ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 4. If url's port is null, return url's host, serialized.
if ( ! url - > port ( ) . has_value ( ) )
2023-11-20 13:34:37 +13:00
return MUST ( url - > serialized_host ( ) ) ;
2021-10-03 19:39:12 +02:00
// 5. Return url's host, serialized, followed by ":" and url's port, serialized.
2023-11-20 13:34:37 +13:00
return MUST ( String : : formatted ( " {}:{} " , MUST ( url - > serialized_host ( ) ) , url - > port ( ) . value ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-host
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_host ( StringView host )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
auto & url = m_url ;
// 3. If url is null or url's cannot-be-a-base-URL is true, then return.
if ( ! url . has_value ( ) | | url - > cannot_be_a_base_url ( ) )
return ;
// 4. Basic URL parse the given value, with url as url and host state as state override.
2024-03-18 16:22:27 +13:00
auto result_url = URL : : Parser : : basic_parse ( host , { } , url , URL : : Parser : : State : : Host ) ;
2021-10-03 19:39:12 +02:00
if ( result_url . is_valid ( ) )
m_url = move ( result_url ) ;
// 5. Update href.
update_href ( ) ;
}
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : hostname ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
//
// 2. Let url be this element's url.
2024-03-18 16:22:27 +13:00
URL : : URL url ( href ( ) ) ;
2023-07-27 21:40:41 +12:00
2021-10-03 19:39:12 +02:00
// 3. If url or url's host is null, return the empty string.
2023-07-27 21:40:41 +12:00
if ( url . host ( ) . has < Empty > ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2023-07-27 21:40:41 +12:00
2021-10-03 19:39:12 +02:00
// 4. Return url's host, serialized.
2023-11-20 13:34:37 +13:00
return MUST ( url . serialized_host ( ) ) ;
2021-10-03 19:39:12 +02:00
}
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_hostname ( StringView hostname )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
auto & url = m_url ;
// 3. If url is null or url's cannot-be-a-base-URL is true, then return.
if ( ! url . has_value ( ) | | url - > cannot_be_a_base_url ( ) )
return ;
// 4. Basic URL parse the given value, with url as url and hostname state as state override.
2024-03-18 16:22:27 +13:00
auto result_url = URL : : Parser : : basic_parse ( hostname , { } , m_url , URL : : Parser : : State : : Hostname ) ;
2021-10-03 19:39:12 +02:00
if ( result_url . is_valid ( ) )
m_url = move ( result_url ) ;
// 5. Update href.
update_href ( ) ;
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-port
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : port ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
auto & url = m_url ;
// 3. If url or url's port is null, return the empty string.
if ( ! url . has_value ( ) | | ! url - > port ( ) . has_value ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 4. Return url's port, serialized.
2023-11-20 13:34:37 +13:00
return MUST ( String : : number ( url - > port ( ) . value ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-port
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_port ( StringView port )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
// 3. If url is null or url cannot have a username/password/port, then return.
if ( ! m_url . has_value ( ) | | m_url - > cannot_have_a_username_or_password_or_port ( ) )
return ;
// 4. If the given value is the empty string, then set url's port to null.
if ( port . is_empty ( ) ) {
m_url - > set_port ( { } ) ;
} else {
// 5. Otherwise, basic URL parse the given value, with url as url and port state as state override.
2024-03-18 16:22:27 +13:00
auto result_url = URL : : Parser : : basic_parse ( port , { } , m_url , URL : : Parser : : State : : Port ) ;
2021-10-03 19:39:12 +02:00
if ( result_url . is_valid ( ) )
m_url = move ( result_url ) ;
}
// 6. Update href.
update_href ( ) ;
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-pathname
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : pathname ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
// 3. If url is null, return the empty string.
if ( ! m_url . has_value ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 4. If url's cannot-be-a-base-URL is true, then return url's path[0].
// 5. If url's path is empty, then return the empty string.
// 6. Return "/", followed by the strings in url's path (including empty strings), separated from each other by "/".
2023-12-16 17:49:34 +03:30
return MUST ( String : : from_byte_string ( m_url - > serialize_path ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-pathname
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_pathname ( StringView pathname )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
// 3. If url is null or url's cannot-be-a-base-URL is true, then return.
if ( ! m_url . has_value ( ) | | m_url - > cannot_be_a_base_url ( ) )
return ;
// 4. Set url's path to the empty list.
2023-05-06 16:53:22 +02:00
auto url = m_url ; // We copy the URL here to follow other browser's behavior of reverting the path change if the parse failed.
2021-10-03 19:39:12 +02:00
url - > set_paths ( { } ) ;
// 5. Basic URL parse the given value, with url as url and path start state as state override.
2024-03-18 16:22:27 +13:00
auto result_url = URL : : Parser : : basic_parse ( pathname , { } , move ( url ) , URL : : Parser : : State : : PathStart ) ;
2021-10-03 19:39:12 +02:00
if ( result_url . is_valid ( ) )
m_url = move ( result_url ) ;
// 6. Update href.
update_href ( ) ;
}
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : search ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
// 3. If url is null, or url's query is either null or the empty string, return the empty string.
2023-08-15 00:47:27 +12:00
if ( ! m_url . has_value ( ) | | ! m_url - > query ( ) . has_value ( ) | | m_url - > query ( ) - > is_empty ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 4. Return "?", followed by url's query.
2023-11-20 13:34:37 +13:00
return MUST ( String : : formatted ( " ?{} " , m_url - > query ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_search ( StringView search )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
// 3. If url is null, terminate these steps.
if ( ! m_url . has_value ( ) )
return ;
// 4. If the given value is the empty string, set url's query to null.
if ( search . is_empty ( ) ) {
m_url - > set_query ( { } ) ;
} else {
// 5. Otherwise:
// 1. Let input be the given value with a single leading "?" removed, if any.
auto input = search . substring_view ( search . starts_with ( ' ? ' ) ) ;
// 2. Set url's query to the empty string.
2023-05-06 16:53:22 +02:00
auto url_copy = m_url ; // We copy the URL here to follow other browser's behavior of reverting the search change if the parse failed.
2023-08-12 19:28:19 +12:00
url_copy - > set_query ( String { } ) ;
2021-10-03 19:39:12 +02:00
// 3. Basic URL parse input, with null, this element's node document's document's character encoding, url as url, and query state as state override.
2024-03-18 16:22:27 +13:00
auto result_url = URL : : Parser : : basic_parse ( input , { } , move ( url_copy ) , URL : : Parser : : State : : Query ) ;
2021-10-03 19:39:12 +02:00
if ( result_url . is_valid ( ) )
m_url = move ( result_url ) ;
}
// 6. Update href.
update_href ( ) ;
}
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : hash ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
// 3. If url is null, or url's fragment is either null or the empty string, return the empty string.
2023-08-12 16:52:42 +12:00
if ( ! m_url . has_value ( ) | | ! m_url - > fragment ( ) . has_value ( ) | | m_url - > fragment ( ) - > is_empty ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 4. Return "#", followed by url's fragment.
2023-11-20 13:34:37 +13:00
return MUST ( String : : formatted ( " #{} " , * m_url - > fragment ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
2023-09-03 15:36:00 +12:00
void HTMLHyperlinkElementUtils : : set_hash ( StringView hash )
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
// 3. If url is null, then return.
if ( ! m_url . has_value ( ) )
return ;
// 4. If the given value is the empty string, set url's fragment to null.
if ( hash . is_empty ( ) ) {
m_url - > set_fragment ( { } ) ;
} else {
// 5. Otherwise:
// 1. Let input be the given value with a single leading "#" removed, if any.
auto input = hash . substring_view ( hash . starts_with ( ' # ' ) ) ;
// 2. Set url's fragment to the empty string.
2023-05-06 16:53:22 +02:00
auto url_copy = m_url ; // We copy the URL here to follow other browser's behavior of reverting the hash change if the parse failed.
2023-08-12 16:52:42 +12:00
url_copy - > set_fragment ( String { } ) ;
2021-10-03 19:39:12 +02:00
// 3. Basic URL parse input, with url as url and fragment state as state override.
2024-03-18 16:22:27 +13:00
auto result_url = URL : : Parser : : basic_parse ( input , { } , move ( url_copy ) , URL : : Parser : : State : : Fragment ) ;
2021-10-03 19:39:12 +02:00
if ( result_url . is_valid ( ) )
m_url = move ( result_url ) ;
}
// 6. Update href.
update_href ( ) ;
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-href
2023-11-20 13:34:37 +13:00
String HTMLHyperlinkElementUtils : : href ( ) const
2021-10-03 19:39:12 +02:00
{
// 1. Reinitialize url.
reinitialize_url ( ) ;
// 2. Let url be this element's url.
2023-11-20 13:34:37 +13:00
auto const & url = m_url ;
2021-10-03 19:39:12 +02:00
// 3. If url is null and this element has no href content attribute, return the empty string.
auto href_content_attribute = hyperlink_element_utils_href ( ) ;
2023-10-10 15:00:58 +03:30
if ( ! url . has_value ( ) & & ! href_content_attribute . has_value ( ) )
2023-11-20 13:34:37 +13:00
return String { } ;
2021-10-03 19:39:12 +02:00
// 4. Otherwise, if url is null, return this element's href content attribute's value.
if ( ! url - > is_valid ( ) )
2023-11-20 13:34:37 +13:00
return href_content_attribute . release_value ( ) ;
2021-10-03 19:39:12 +02:00
// 5. Return url, serialized.
2023-12-16 17:49:34 +03:30
return MUST ( String : : from_byte_string ( url - > serialize ( ) ) ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#dom-hyperlink-href
2023-10-08 11:42:00 +13:00
WebIDL : : ExceptionOr < void > HTMLHyperlinkElementUtils : : set_href ( String href )
2021-10-03 19:39:12 +02:00
{
// The href attribute's setter must set this element's href content attribute's value to the given value.
2023-10-08 11:42:00 +13:00
return set_hyperlink_element_utils_href ( move ( href ) ) ;
2021-10-03 19:39:12 +02:00
}
// https://html.spec.whatwg.org/multipage/links.html#update-href
void HTMLHyperlinkElementUtils : : update_href ( )
{
// To update href, set the element's href content attribute's value to the element's url, serialized.
}
2022-03-15 14:37:58 +00:00
bool HTMLHyperlinkElementUtils : : cannot_navigate ( ) const
{
// An element element cannot navigate if one of the following is true:
// 1. element's node document is not fully active
auto const & document = const_cast < HTMLHyperlinkElementUtils * > ( this ) - > hyperlink_element_utils_document ( ) ;
if ( ! document . is_fully_active ( ) )
return true ;
// 2. element is not an a element and is not connected.
if ( ! hyperlink_element_utils_is_html_anchor_element ( ) & & ! hyperlink_element_utils_is_connected ( ) )
return true ;
return false ;
}
// https://html.spec.whatwg.org/multipage/links.html#following-hyperlinks-2
2024-01-18 12:57:12 -07:00
void HTMLHyperlinkElementUtils : : follow_the_hyperlink ( Optional < String > hyperlink_suffix , UserNavigationInvolvement user_involvement )
2022-03-15 14:37:58 +00:00
{
// 1. If subject cannot navigate, then return.
if ( cannot_navigate ( ) )
return ;
2023-06-23 01:27:35 +03:00
// 2. Let replace be false.
[[maybe_unused]] auto replace = false ;
2022-03-15 14:37:58 +00:00
2023-06-23 01:27:35 +03:00
// 3. Let targetAttributeValue be the empty string.
2023-11-20 13:34:37 +13:00
String target_attribute_value ;
2022-03-15 14:37:58 +00:00
2023-06-23 01:27:35 +03:00
// 4. If subject is an a or area element, then set targetAttributeValue to the result of getting an element's target given subject.
target_attribute_value = hyperlink_element_utils_get_an_elements_target ( ) ;
2022-03-15 14:37:58 +00:00
2023-06-23 01:27:35 +03:00
// 5. Let noopener be the result of getting an element's noopener with subject and targetAttributeValue.
2023-06-18 16:22:10 +01:00
auto noopener = hyperlink_element_utils_get_an_elements_noopener ( target_attribute_value ) ;
2022-03-15 14:37:58 +00:00
2023-06-23 01:27:35 +03:00
// 6. Let targetNavigable be the first return value of applying the rules for choosing a navigable given
// targetAttributeValue, subject's node navigable, and noopener.
auto target_navigable = hyperlink_element_utils_document ( ) . navigable ( ) - > choose_a_navigable ( target_attribute_value , noopener ) . navigable ;
2022-03-15 14:37:58 +00:00
2023-06-23 01:27:35 +03:00
// 7. If targetNavigable is null, then return.
if ( ! target_navigable )
2022-03-15 14:37:58 +00:00
return ;
2024-01-18 12:57:12 -07:00
// 8. Let urlString be the result of encoding-parsing-and-serializing a URL given subject's href attribute value,
// relative to subject's node document.
2023-06-23 01:27:35 +03:00
auto url = hyperlink_element_utils_document ( ) . parse_url ( href ( ) ) ;
2024-01-18 12:57:12 -07:00
// 9. If urlString is failure, then return.
2023-06-23 01:27:35 +03:00
if ( ! url . is_valid ( ) )
return ;
2022-03-15 14:37:58 +00:00
2024-04-05 09:26:03 +02:00
auto url_string = MUST ( url . to_string ( ) ) ;
2022-03-15 14:37:58 +00:00
2024-01-18 12:57:12 -07:00
// 10. If hyperlinkSuffix is non-null, then append it to urlString.
2022-03-15 14:37:58 +00:00
if ( hyperlink_suffix . has_value ( ) ) {
StringBuilder url_builder ;
url_builder . append ( url_string ) ;
url_builder . append ( * hyperlink_suffix ) ;
2024-04-05 09:26:03 +02:00
url_string = MUST ( url_builder . to_string ( ) ) ;
2022-03-15 14:37:58 +00:00
}
2024-05-31 21:35:51 +01:00
// 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 ) ;
2023-06-23 01:27:35 +03:00
// FIXME: 12. If subject's link types includes the noreferrer keyword, then set referrerPolicy to "no-referrer".
2024-01-18 12:57:12 -07:00
// 13. Navigate targetNavigable to urlString using subject's node document, with referrerPolicy set to referrerPolicy and userInvolvement set to userInvolvement.
2024-04-03 15:54:47 +02:00
MUST ( target_navigable - > navigate ( { . url = url_string , . source_document = hyperlink_element_utils_document ( ) , . referrer_policy = referrer_policy , . user_involvement = user_involvement } ) ) ;
2022-03-15 14:37:58 +00:00
}
2021-10-03 19:39:12 +02:00
}