diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index 22eac7d605d..b377c043e14 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -321,6 +321,7 @@ SVGUseElement Screen ScreenOrientation Selection +ServiceWorker ServiceWorkerContainer ServiceWorkerRegistration Set diff --git a/Userland/Libraries/LibWeb/CMakeLists.txt b/Userland/Libraries/LibWeb/CMakeLists.txt index 2937b41bbc6..390be0a0257 100644 --- a/Userland/Libraries/LibWeb/CMakeLists.txt +++ b/Userland/Libraries/LibWeb/CMakeLists.txt @@ -447,6 +447,7 @@ set(SOURCES HTML/Scripting/SerializedEnvironmentSettingsObject.cpp HTML/SelectedFile.cpp HTML/SelectItem.cpp + HTML/ServiceWorker.cpp HTML/ServiceWorkerContainer.cpp HTML/ServiceWorkerRegistration.cpp HTML/SessionHistoryEntry.cpp diff --git a/Userland/Libraries/LibWeb/HTML/ServiceWorker.cpp b/Userland/Libraries/LibWeb/HTML/ServiceWorker.cpp new file mode 100644 index 00000000000..1895ab2cb66 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/ServiceWorker.cpp @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2024, Andrew Kaster + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include +#include +#include + +namespace Web::HTML { + +ServiceWorker::ServiceWorker(JS::Realm& realm, String script_url) + : DOM::EventTarget(realm) + , m_script_url(move(script_url)) +{ +} + +ServiceWorker::~ServiceWorker() = default; + +JS::NonnullGCPtr ServiceWorker::create(JS::Realm& realm) +{ + return realm.heap().allocate(realm, realm, ""_string); +} + +void ServiceWorker::initialize(JS::Realm& realm) +{ + Base::initialize(realm); + WEB_SET_PROTOTYPE_FOR_INTERFACE(ServiceWorker); +} + +#undef __ENUMERATE +#define __ENUMERATE(attribute_name, event_name) \ + void ServiceWorker::set_##attribute_name(WebIDL::CallbackType* value) \ + { \ + set_event_handler_attribute(event_name, value); \ + } \ + WebIDL::CallbackType* ServiceWorker::attribute_name() \ + { \ + return event_handler_attribute(event_name); \ + } +ENUMERATE_SERVICE_WORKER_EVENT_HANDLERS(__ENUMERATE) +#undef __ENUMERATE + +} diff --git a/Userland/Libraries/LibWeb/HTML/ServiceWorker.h b/Userland/Libraries/LibWeb/HTML/ServiceWorker.h new file mode 100644 index 00000000000..fab8fa1b736 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/ServiceWorker.h @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2024, Andrew Kaster + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include + +#define ENUMERATE_SERVICE_WORKER_EVENT_HANDLERS(E) \ + E(onstatechange, HTML::EventNames::statechange) \ + E(onerror, HTML::EventNames::error) + +namespace Web::HTML { + +class ServiceWorker : public DOM::EventTarget { + WEB_PLATFORM_OBJECT(ServiceWorker, DOM::EventTarget); + +public: + [[nodiscard]] static JS::NonnullGCPtr create(JS::Realm& realm); + + virtual ~ServiceWorker() override; + + String script_url() const { return m_script_url; } + Bindings::ServiceWorkerState service_worker_state() const { return m_state; } + +#undef __ENUMERATE +#define __ENUMERATE(attribute_name, event_name) \ + void set_##attribute_name(WebIDL::CallbackType*); \ + WebIDL::CallbackType* attribute_name(); + ENUMERATE_SERVICE_WORKER_EVENT_HANDLERS(__ENUMERATE) +#undef __ENUMERATE + +private: + ServiceWorker(JS::Realm&, String script_url); + + virtual void initialize(JS::Realm&) override; + + String m_script_url; + Bindings::ServiceWorkerState m_state { Bindings::ServiceWorkerState::Parsed }; +}; + +} diff --git a/Userland/Libraries/LibWeb/HTML/ServiceWorker.idl b/Userland/Libraries/LibWeb/HTML/ServiceWorker.idl new file mode 100644 index 00000000000..2cfcb8ddf47 --- /dev/null +++ b/Userland/Libraries/LibWeb/HTML/ServiceWorker.idl @@ -0,0 +1,29 @@ +#import +#import +#import +#import + +// https://w3c.github.io/ServiceWorker/#serviceworker-interface +[SecureContext, Exposed=(Window,Worker)] +interface ServiceWorker : EventTarget { + readonly attribute USVString scriptURL; + [ImplementedAs=service_worker_state] readonly attribute ServiceWorkerState state; + + // FIXME: IDL overload issue here + // FIXME: undefined postMessage(any message, sequence transfer); + [FIXME] undefined postMessage(any message, optional StructuredSerializeOptions options = {}); + + // event + attribute EventHandler onstatechange; +}; + +ServiceWorker includes AbstractWorker; + +enum ServiceWorkerState { + "parsed", + "installing", + "installed", + "activating", + "activated", + "redundant" +}; diff --git a/Userland/Libraries/LibWeb/idl_files.cmake b/Userland/Libraries/LibWeb/idl_files.cmake index b4ac2c8f8e5..c51992daac4 100644 --- a/Userland/Libraries/LibWeb/idl_files.cmake +++ b/Userland/Libraries/LibWeb/idl_files.cmake @@ -215,6 +215,7 @@ libweb_js_bindings(HTML/Plugin) libweb_js_bindings(HTML/PluginArray) libweb_js_bindings(HTML/PopStateEvent) libweb_js_bindings(HTML/PromiseRejectionEvent) +libweb_js_bindings(HTML/ServiceWorker) libweb_js_bindings(HTML/ServiceWorkerContainer) libweb_js_bindings(HTML/ServiceWorkerRegistration) libweb_js_bindings(HTML/Storage)