mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-02 06:09:08 +00:00
LibWeb/HTML: Implement remaining Location setters
This commit is contained in:
parent
8ba6c7330d
commit
03c487eb56
Notes:
github-actions[bot]
2025-04-23 07:25:41 +00:00
Author: https://github.com/shannonbooth
Commit: 03c487eb56
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4426
Reviewed-by: https://github.com/tcl3 ✅
1 changed files with 111 additions and 13 deletions
|
@ -1,6 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2023, Andreas Kling <andreas@ladybird.org>
|
* Copyright (c) 2020-2023, Andreas Kling <andreas@ladybird.org>
|
||||||
* Copyright (c) 2022-2023, Linus Groh <linusg@serenityos.org>
|
* Copyright (c) 2022-2023, Linus Groh <linusg@serenityos.org>
|
||||||
|
* Copyright (c) 2025, Shannon Booth <shannon@serenityos.org>
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: BSD-2-Clause
|
* SPDX-License-Identifier: BSD-2-Clause
|
||||||
*/
|
*/
|
||||||
|
@ -99,7 +100,7 @@ WebIDL::ExceptionOr<void> Location::navigate(URL::URL url, Bindings::NavigationH
|
||||||
}
|
}
|
||||||
|
|
||||||
// 4. Navigate navigable to url using sourceDocument, with exceptionsEnabled set to true and historyHandling set to historyHandling.
|
// 4. Navigate navigable to url using sourceDocument, with exceptionsEnabled set to true and historyHandling set to historyHandling.
|
||||||
TRY(navigable->navigate({ .url = url,
|
TRY(navigable->navigate({ .url = move(url),
|
||||||
.source_document = source_document,
|
.source_document = source_document,
|
||||||
.exceptions_enabled = true,
|
.exceptions_enabled = true,
|
||||||
.history_handling = history_handling }));
|
.history_handling = history_handling }));
|
||||||
|
@ -235,10 +236,32 @@ WebIDL::ExceptionOr<String> Location::host() const
|
||||||
return TRY_OR_THROW_OOM(vm, String::formatted("{}:{}", url.serialized_host(), *url.port()));
|
return TRY_OR_THROW_OOM(vm, String::formatted("{}:{}", url.serialized_host(), *url.port()));
|
||||||
}
|
}
|
||||||
|
|
||||||
WebIDL::ExceptionOr<void> Location::set_host(String const&)
|
// https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-location-host
|
||||||
|
WebIDL::ExceptionOr<void> Location::set_host(String const& value)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
// 1. If this's relevant Document is null, then return.
|
||||||
return vm.throw_completion<JS::InternalError>(JS::ErrorType::NotImplemented, "Location.host setter");
|
auto const relevant_document = this->relevant_document();
|
||||||
|
if (!relevant_document)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 2. If this's relevant Document's origin is not same origin-domain with the entry settings object's origin, then throw a "SecurityError" DOMException.
|
||||||
|
if (!relevant_document->origin().is_same_origin_domain(entry_settings_object().origin()))
|
||||||
|
return WebIDL::SecurityError::create(realm(), "Location's relevant document is not same origin-domain with the entry settings object's origin"_string);
|
||||||
|
|
||||||
|
// 3. Let copyURL be a copy of this's url.
|
||||||
|
auto copy_url = this->url();
|
||||||
|
|
||||||
|
// 4. If copyURL has an opaque path, then return.
|
||||||
|
if (copy_url.has_an_opaque_path())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 5. Basic URL parse the given value, with copyURL as url and host state as state override.
|
||||||
|
(void)URL::Parser::basic_parse(value, {}, ©_url, URL::Parser::State::Host);
|
||||||
|
|
||||||
|
// 6. Location-object navigate this to copyURL.
|
||||||
|
TRY(navigate(copy_url));
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/history.html#dom-location-hostname
|
// https://html.spec.whatwg.org/multipage/history.html#dom-location-hostname
|
||||||
|
@ -259,10 +282,32 @@ WebIDL::ExceptionOr<String> Location::hostname() const
|
||||||
return url.serialized_host();
|
return url.serialized_host();
|
||||||
}
|
}
|
||||||
|
|
||||||
WebIDL::ExceptionOr<void> Location::set_hostname(String const&)
|
// https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-location-hostname
|
||||||
|
WebIDL::ExceptionOr<void> Location::set_hostname(String const& value)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
// 1. If this's relevant Document is null, then return.
|
||||||
return vm.throw_completion<JS::InternalError>(JS::ErrorType::NotImplemented, "Location.hostname setter");
|
auto const relevant_document = this->relevant_document();
|
||||||
|
if (!relevant_document)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 2. If this's relevant Document's origin is not same origin-domain with the entry settings object's origin, then throw a "SecurityError" DOMException.
|
||||||
|
if (!relevant_document->origin().is_same_origin_domain(entry_settings_object().origin()))
|
||||||
|
return WebIDL::SecurityError::create(realm(), "Location's relevant document is not same origin-domain with the entry settings object's origin"_string);
|
||||||
|
|
||||||
|
// 3. Let copyURL be a copy of this's url.
|
||||||
|
auto copy_url = this->url();
|
||||||
|
|
||||||
|
// 4. If copyURL has an opaque path, then return.
|
||||||
|
if (copy_url.has_an_opaque_path())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 5. Basic URL parse the given value, with copyURL as url and hostname state as state override.
|
||||||
|
(void)URL::Parser::basic_parse(value, {}, ©_url, URL::Parser::State::Hostname);
|
||||||
|
|
||||||
|
// 6. Location-object navigate this to copyURL.
|
||||||
|
TRY(navigate(copy_url));
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/history.html#dom-location-port
|
// https://html.spec.whatwg.org/multipage/history.html#dom-location-port
|
||||||
|
@ -283,10 +328,38 @@ WebIDL::ExceptionOr<String> Location::port() const
|
||||||
return String::number(*url.port());
|
return String::number(*url.port());
|
||||||
}
|
}
|
||||||
|
|
||||||
WebIDL::ExceptionOr<void> Location::set_port(String const&)
|
// https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-location-port
|
||||||
|
WebIDL::ExceptionOr<void> Location::set_port(String const& value)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
// 1. If this's relevant Document is null, then return.
|
||||||
return vm.throw_completion<JS::InternalError>(JS::ErrorType::NotImplemented, "Location.port setter");
|
auto const relevant_document = this->relevant_document();
|
||||||
|
if (!relevant_document)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 2. If this's relevant Document's origin is not same origin-domain with the entry settings object's origin, then throw a "SecurityError" DOMException.
|
||||||
|
if (!relevant_document->origin().is_same_origin_domain(entry_settings_object().origin()))
|
||||||
|
return WebIDL::SecurityError::create(realm(), "Location's relevant document is not same origin-domain with the entry settings object's origin"_string);
|
||||||
|
|
||||||
|
// 3. Let copyURL be a copy of this's url.
|
||||||
|
auto copy_url = this->url();
|
||||||
|
|
||||||
|
// 4. If copyURL cannot have a username/password/port, then return.
|
||||||
|
if (copy_url.cannot_have_a_username_or_password_or_port())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 5. If the given value is the empty string, then set copyURL's port to null.
|
||||||
|
if (value.is_empty()) {
|
||||||
|
copy_url.set_port({});
|
||||||
|
}
|
||||||
|
// 5. Otherwise, basic URL parse the given value, with copyURL as url and port state as state override.
|
||||||
|
else {
|
||||||
|
(void)URL::Parser::basic_parse(value, {}, ©_url, URL::Parser::State::Port);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 6. Location-object navigate this to copyURL.
|
||||||
|
TRY(navigate(copy_url));
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/history.html#dom-location-pathname
|
// https://html.spec.whatwg.org/multipage/history.html#dom-location-pathname
|
||||||
|
@ -301,10 +374,35 @@ WebIDL::ExceptionOr<String> Location::pathname() const
|
||||||
return url().serialize_path();
|
return url().serialize_path();
|
||||||
}
|
}
|
||||||
|
|
||||||
WebIDL::ExceptionOr<void> Location::set_pathname(String const&)
|
// https://html.spec.whatwg.org/multipage/nav-history-apis.html#dom-location-search
|
||||||
|
WebIDL::ExceptionOr<void> Location::set_pathname(String const& value)
|
||||||
{
|
{
|
||||||
auto& vm = this->vm();
|
// 1. If this's relevant Document is null, then return.
|
||||||
return vm.throw_completion<JS::InternalError>(JS::ErrorType::NotImplemented, "Location.pathname setter");
|
auto const relevant_document = this->relevant_document();
|
||||||
|
if (!relevant_document)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 2. If this's relevant Document's origin is not same origin-domain with the entry settings object's origin, then throw a "SecurityError" DOMException.
|
||||||
|
if (!relevant_document->origin().is_same_origin_domain(entry_settings_object().origin()))
|
||||||
|
return WebIDL::SecurityError::create(realm(), "Location's relevant document is not same origin-domain with the entry settings object's origin"_string);
|
||||||
|
|
||||||
|
// 3. Let copyURL be a copy of this's url.
|
||||||
|
auto copy_url = this->url();
|
||||||
|
|
||||||
|
// 4. If copyURL has an opaque path, then return.
|
||||||
|
if (copy_url.has_an_opaque_path())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
// 5. Set copyURL's path to the empty list.
|
||||||
|
copy_url.set_paths({});
|
||||||
|
|
||||||
|
// 6. Basic URL parse the given value, with copyURL as url and path start state as state override.
|
||||||
|
(void)URL::Parser::basic_parse(value, {}, ©_url, URL::Parser::State::PathStart);
|
||||||
|
|
||||||
|
// 7. Location-object navigate this to copyURL.
|
||||||
|
TRY(navigate(copy_url));
|
||||||
|
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/history.html#dom-location-search
|
// https://html.spec.whatwg.org/multipage/history.html#dom-location-search
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue