mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 21:47:46 +00:00
LibWeb/HTML: Propagate OOM errors from Window::{local,session}_storage()
This requires a bit of error type conversion glue as HashMap::try_ensure expects the callback to return ErrorOr<T> like the function itself does.
This commit is contained in:
parent
4da68384e6
commit
324dacbc5d
3 changed files with 24 additions and 16 deletions
|
@ -705,27 +705,35 @@ void Window::fire_a_page_transition_event(DeprecatedFlyString const& event_name,
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/webstorage.html#dom-localstorage
|
// https://html.spec.whatwg.org/multipage/webstorage.html#dom-localstorage
|
||||||
JS::NonnullGCPtr<HTML::Storage> Window::local_storage()
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<HTML::Storage>> Window::local_storage()
|
||||||
{
|
{
|
||||||
// FIXME: Implement according to spec.
|
// FIXME: Implement according to spec.
|
||||||
|
auto& vm = this->vm();
|
||||||
|
|
||||||
static HashMap<Origin, JS::Handle<HTML::Storage>> local_storage_per_origin;
|
static HashMap<Origin, JS::Handle<HTML::Storage>> local_storage_per_origin;
|
||||||
auto storage = local_storage_per_origin.ensure(associated_document().origin(), [this]() -> JS::Handle<HTML::Storage> {
|
auto storage = TRY_OR_THROW_OOM(vm, local_storage_per_origin.try_ensure(associated_document().origin(), [this]() -> ErrorOr<JS::Handle<HTML::Storage>> {
|
||||||
return *HTML::Storage::create(realm()).release_value_but_fixme_should_propagate_errors();
|
auto storage_or_exception = HTML::Storage::create(realm());
|
||||||
});
|
if (storage_or_exception.is_exception())
|
||||||
return *storage;
|
return Error::from_errno(ENOMEM);
|
||||||
|
return *storage_or_exception.release_value();
|
||||||
|
}));
|
||||||
|
return JS::NonnullGCPtr { *storage };
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/webstorage.html#dom-sessionstorage
|
// https://html.spec.whatwg.org/multipage/webstorage.html#dom-sessionstorage
|
||||||
JS::NonnullGCPtr<HTML::Storage> Window::session_storage()
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<HTML::Storage>> Window::session_storage()
|
||||||
{
|
{
|
||||||
// FIXME: Implement according to spec.
|
// FIXME: Implement according to spec.
|
||||||
|
auto& vm = this->vm();
|
||||||
|
|
||||||
static HashMap<Origin, JS::Handle<HTML::Storage>> session_storage_per_origin;
|
static HashMap<Origin, JS::Handle<HTML::Storage>> session_storage_per_origin;
|
||||||
auto storage = session_storage_per_origin.ensure(associated_document().origin(), [this]() -> JS::Handle<HTML::Storage> {
|
auto storage = TRY_OR_THROW_OOM(vm, session_storage_per_origin.try_ensure(associated_document().origin(), [this]() -> ErrorOr<JS::Handle<HTML::Storage>> {
|
||||||
return *HTML::Storage::create(realm()).release_value_but_fixme_should_propagate_errors();
|
auto storage_or_exception = HTML::Storage::create(realm());
|
||||||
});
|
if (storage_or_exception.is_exception())
|
||||||
return *storage;
|
return Error::from_errno(ENOMEM);
|
||||||
|
return *storage_or_exception.release_value();
|
||||||
|
}));
|
||||||
|
return JS::NonnullGCPtr { *storage };
|
||||||
}
|
}
|
||||||
|
|
||||||
// https://html.spec.whatwg.org/multipage/interaction.html#transient-activation
|
// https://html.spec.whatwg.org/multipage/interaction.html#transient-activation
|
||||||
|
|
|
@ -115,8 +115,8 @@ public:
|
||||||
|
|
||||||
void fire_a_page_transition_event(DeprecatedFlyString const& event_name, bool persisted);
|
void fire_a_page_transition_event(DeprecatedFlyString const& event_name, bool persisted);
|
||||||
|
|
||||||
JS::NonnullGCPtr<HTML::Storage> local_storage();
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<HTML::Storage>> local_storage();
|
||||||
JS::NonnullGCPtr<HTML::Storage> session_storage();
|
WebIDL::ExceptionOr<JS::NonnullGCPtr<HTML::Storage>> session_storage();
|
||||||
|
|
||||||
void start_an_idle_period();
|
void start_an_idle_period();
|
||||||
|
|
||||||
|
|
|
@ -258,8 +258,8 @@ void ConnectionFromClient::debug_request(DeprecatedString const& request, Deprec
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request == "dump-local-storage") {
|
if (request == "dump-local-storage") {
|
||||||
if (auto* doc = page().top_level_browsing_context().active_document())
|
if (auto* document = page().top_level_browsing_context().active_document())
|
||||||
doc->window().local_storage()->dump();
|
document->window().local_storage().release_value_but_fixme_should_propagate_errors()->dump();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -549,14 +549,14 @@ void ConnectionFromClient::set_window_size(Gfx::IntSize size)
|
||||||
Messages::WebContentServer::GetLocalStorageEntriesResponse ConnectionFromClient::get_local_storage_entries()
|
Messages::WebContentServer::GetLocalStorageEntriesResponse ConnectionFromClient::get_local_storage_entries()
|
||||||
{
|
{
|
||||||
auto* document = page().top_level_browsing_context().active_document();
|
auto* document = page().top_level_browsing_context().active_document();
|
||||||
auto local_storage = document->window().local_storage();
|
auto local_storage = document->window().local_storage().release_value_but_fixme_should_propagate_errors();
|
||||||
return local_storage->map();
|
return local_storage->map();
|
||||||
}
|
}
|
||||||
|
|
||||||
Messages::WebContentServer::GetSessionStorageEntriesResponse ConnectionFromClient::get_session_storage_entries()
|
Messages::WebContentServer::GetSessionStorageEntriesResponse ConnectionFromClient::get_session_storage_entries()
|
||||||
{
|
{
|
||||||
auto* document = page().top_level_browsing_context().active_document();
|
auto* document = page().top_level_browsing_context().active_document();
|
||||||
auto session_storage = document->window().session_storage();
|
auto session_storage = document->window().session_storage().release_value_but_fixme_should_propagate_errors();
|
||||||
return session_storage->map();
|
return session_storage->map();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue