diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp index c62d51899e..7881996494 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/WrapperGenerator/IDLGenerators.cpp @@ -157,6 +157,8 @@ static bool impl_is_wrapper(Type const& type) return true; if (type.name == "Path2D"sv) return true; + if (type.name == "Storage"sv) + return true; return false; } diff --git a/Userland/Libraries/LibWeb/Forward.h b/Userland/Libraries/LibWeb/Forward.h index 02a58d1187..578363e420 100644 --- a/Userland/Libraries/LibWeb/Forward.h +++ b/Userland/Libraries/LibWeb/Forward.h @@ -466,7 +466,6 @@ class OptionConstructor; class RangePrototype; class ResizeObserverWrapper; class SelectionWrapper; -class StorageWrapper; class SubtleCryptoWrapper; class TextDecoderWrapper; class TextEncoderWrapper; diff --git a/Userland/Libraries/LibWeb/HTML/Storage.cpp b/Userland/Libraries/LibWeb/HTML/Storage.cpp index 7a486e912d..dc4855a04f 100644 --- a/Userland/Libraries/LibWeb/HTML/Storage.cpp +++ b/Userland/Libraries/LibWeb/HTML/Storage.cpp @@ -6,15 +6,20 @@ #include #include +#include namespace Web::HTML { -NonnullRefPtr Storage::create() +JS::NonnullGCPtr Storage::create(HTML::Window& window) { - return adopt_ref(*new Storage); + return *window.heap().allocate(window.realm(), window); } -Storage::Storage() = default; +Storage::Storage(HTML::Window& window) + : PlatformObject(window.realm()) +{ + set_prototype(&window.cached_web_prototype("Storage")); +} Storage::~Storage() = default; diff --git a/Userland/Libraries/LibWeb/HTML/Storage.h b/Userland/Libraries/LibWeb/HTML/Storage.h index c8ad3f99f9..c6dbee2bff 100644 --- a/Userland/Libraries/LibWeb/HTML/Storage.h +++ b/Userland/Libraries/LibWeb/HTML/Storage.h @@ -7,20 +7,16 @@ #pragma once #include -#include -#include +#include #include -#include namespace Web::HTML { -class Storage - : public RefCounted - , public Bindings::Wrappable { -public: - using WrapperType = Bindings::StorageWrapper; +class Storage : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(Storage, Bindings::PlatformObject); - static NonnullRefPtr create(); +public: + static JS::NonnullGCPtr create(HTML::Window&); ~Storage(); size_t length() const; @@ -37,7 +33,7 @@ public: void dump() const; private: - Storage(); + explicit Storage(HTML::Window&); void reorder(); void broadcast(String const& key, String const& old_value, String const& new_value); @@ -47,8 +43,4 @@ private: } -namespace Web::Bindings { - -StorageWrapper* wrap(JS::Realm&, HTML::Storage&); - -} +WRAPPER_HACK(Storage, Web::HTML) diff --git a/Userland/Libraries/LibWeb/HTML/Window.cpp b/Userland/Libraries/LibWeb/HTML/Window.cpp index 035d19eeae..9fce75d890 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.cpp +++ b/Userland/Libraries/LibWeb/HTML/Window.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -564,25 +563,27 @@ Selection::Selection* Window::get_selection_impl() } // https://html.spec.whatwg.org/multipage/webstorage.html#dom-localstorage -RefPtr Window::local_storage() +JS::NonnullGCPtr Window::local_storage() { // FIXME: Implement according to spec. - static HashMap> local_storage_per_origin; - return local_storage_per_origin.ensure(associated_document().origin(), [] { - return HTML::Storage::create(); + static HashMap> local_storage_per_origin; + auto storage = local_storage_per_origin.ensure(associated_document().origin(), [this]() -> JS::Handle { + return *HTML::Storage::create(*this); }); + return *storage; } // https://html.spec.whatwg.org/multipage/webstorage.html#dom-sessionstorage -RefPtr Window::session_storage() +JS::NonnullGCPtr Window::session_storage() { // FIXME: Implement according to spec. - static HashMap> session_storage_per_origin; - return session_storage_per_origin.ensure(associated_document().origin(), [] { - return HTML::Storage::create(); + static HashMap> session_storage_per_origin; + auto storage = session_storage_per_origin.ensure(associated_document().origin(), [this]() -> JS::Handle { + return *HTML::Storage::create(*this); }); + return *storage; } // https://html.spec.whatwg.org/multipage/browsers.html#dom-parent @@ -1408,18 +1409,14 @@ JS_DEFINE_NATIVE_FUNCTION(Window::origin_getter) JS_DEFINE_NATIVE_FUNCTION(Window::local_storage_getter) { - auto& realm = *vm.current_realm(); auto* impl = TRY(impl_from(vm)); - // FIXME: localStorage may throw. We have to deal with that here. - return wrap(realm, *impl->local_storage()); + return impl->local_storage(); } JS_DEFINE_NATIVE_FUNCTION(Window::session_storage_getter) { - auto& realm = *vm.current_realm(); auto* impl = TRY(impl_from(vm)); - // FIXME: sessionStorage may throw. We have to deal with that here. - return wrap(realm, *impl->session_storage()); + return impl->session_storage(); } JS_DEFINE_NATIVE_FUNCTION(Window::name_getter) diff --git a/Userland/Libraries/LibWeb/HTML/Window.h b/Userland/Libraries/LibWeb/HTML/Window.h index 32b9899f79..28b227efa1 100644 --- a/Userland/Libraries/LibWeb/HTML/Window.h +++ b/Userland/Libraries/LibWeb/HTML/Window.h @@ -100,8 +100,8 @@ public: Selection::Selection* get_selection_impl(); - RefPtr local_storage(); - RefPtr session_storage(); + JS::NonnullGCPtr local_storage(); + JS::NonnullGCPtr session_storage(); Window* parent(); diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index 56ef04e22a..b4708c395d 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -147,7 +147,7 @@ libweb_js_wrapper(HTML/MessagePort NO_INSTANCE) libweb_js_wrapper(HTML/PageTransitionEvent NO_INSTANCE) libweb_js_wrapper(HTML/Path2D NO_INSTANCE) libweb_js_wrapper(HTML/PromiseRejectionEvent NO_INSTANCE) -libweb_js_wrapper(HTML/Storage) +libweb_js_wrapper(HTML/Storage NO_INSTANCE) libweb_js_wrapper(HTML/SubmitEvent NO_INSTANCE) libweb_js_wrapper(HTML/TextMetrics NO_INSTANCE) libweb_js_wrapper(HTML/Worker NO_INSTANCE)