From 70efa8c1c5ea374a37811c36c3ff919a899b131a Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Thu, 7 Aug 2025 15:31:24 +0300 Subject: [PATCH] LibWeb: Implement CookieChangeEvent --- Libraries/LibWeb/CMakeLists.txt | 1 + .../LibWeb/CookieStore/CookieChangeEvent.cpp | 40 +++++++++++++++++ .../LibWeb/CookieStore/CookieChangeEvent.h | 43 +++++++++++++++++++ .../LibWeb/CookieStore/CookieChangeEvent.idl | 15 +++++++ Libraries/LibWeb/Forward.h | 1 + Libraries/LibWeb/idl_files.cmake | 1 + .../Libraries/LibWeb/CookieStore/BUILD.gn | 5 ++- .../Userland/Libraries/LibWeb/idl_files.gni | 1 + .../Text/expected/all-window-properties.txt | 1 + 9 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 Libraries/LibWeb/CookieStore/CookieChangeEvent.cpp create mode 100644 Libraries/LibWeb/CookieStore/CookieChangeEvent.h create mode 100644 Libraries/LibWeb/CookieStore/CookieChangeEvent.idl diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index d2e3585485e..c7ee9ef83f9 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -80,6 +80,7 @@ set(SOURCES ContentSecurityPolicy/Violation.cpp Cookie/Cookie.cpp Cookie/ParsedCookie.cpp + CookieStore/CookieChangeEvent.cpp CookieStore/CookieStore.cpp CredentialManagement/Credential.cpp CredentialManagement/CredentialsContainer.cpp diff --git a/Libraries/LibWeb/CookieStore/CookieChangeEvent.cpp b/Libraries/LibWeb/CookieStore/CookieChangeEvent.cpp new file mode 100644 index 00000000000..d1570a4126b --- /dev/null +++ b/Libraries/LibWeb/CookieStore/CookieChangeEvent.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2025, Idan Horowitz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include +#include + +namespace Web::CookieStore { + +GC_DEFINE_ALLOCATOR(CookieChangeEvent); + +GC::Ref CookieChangeEvent::create(JS::Realm& realm, FlyString const& event_name, CookieChangeEventInit const& event_init) +{ + return realm.create(realm, event_name, event_init); +} + +GC::Ref CookieChangeEvent::construct_impl(JS::Realm& realm, FlyString const& event_name, CookieChangeEventInit const& event_init) +{ + return create(realm, event_name, event_init); +} + +CookieChangeEvent::CookieChangeEvent(JS::Realm& realm, FlyString const& event_name, CookieChangeEventInit const& event_init) + : DOM::Event(realm, event_name, event_init) + , m_changed(event_init.changed.value_or({})) + , m_deleted(event_init.deleted.value_or({})) +{ +} + +CookieChangeEvent::~CookieChangeEvent() = default; + +void CookieChangeEvent::initialize(JS::Realm& realm) +{ + WEB_SET_PROTOTYPE_FOR_INTERFACE(CookieChangeEvent); + Base::initialize(realm); +} + +} diff --git a/Libraries/LibWeb/CookieStore/CookieChangeEvent.h b/Libraries/LibWeb/CookieStore/CookieChangeEvent.h new file mode 100644 index 00000000000..2496851027b --- /dev/null +++ b/Libraries/LibWeb/CookieStore/CookieChangeEvent.h @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025, Idan Horowitz + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Web::CookieStore { + +// https://cookiestore.spec.whatwg.org/#dictdef-cookiechangeeventinit +struct CookieChangeEventInit final : public DOM::EventInit { + Optional> changed; + Optional> deleted; +}; + +// https://cookiestore.spec.whatwg.org/#cookiechangeevent +class CookieChangeEvent final : public DOM::Event { + WEB_PLATFORM_OBJECT(CookieChangeEvent, DOM::Event); + GC_DECLARE_ALLOCATOR(CookieChangeEvent); + +public: + [[nodiscard]] static GC::Ref create(JS::Realm&, FlyString const& event_name, CookieChangeEventInit const& event_init); + [[nodiscard]] static GC::Ref construct_impl(JS::Realm&, FlyString const& event_name, CookieChangeEventInit const& event_init); + + virtual ~CookieChangeEvent() override; + + Vector changed() const { return m_changed; } + Vector deleted() const { return m_deleted; } + +private: + CookieChangeEvent(JS::Realm&, FlyString const& event_name, CookieChangeEventInit const& event_init); + + virtual void initialize(JS::Realm&) override; + + Vector m_changed; + Vector m_deleted; +}; + +} diff --git a/Libraries/LibWeb/CookieStore/CookieChangeEvent.idl b/Libraries/LibWeb/CookieStore/CookieChangeEvent.idl new file mode 100644 index 00000000000..5eead9f3f3f --- /dev/null +++ b/Libraries/LibWeb/CookieStore/CookieChangeEvent.idl @@ -0,0 +1,15 @@ +#import +#import + +dictionary CookieChangeEventInit : EventInit { + CookieList changed; + CookieList deleted; +}; + +// https://cookiestore.spec.whatwg.org/#cookiechangeevent +[Exposed=Window, SecureContext] +interface CookieChangeEvent : Event { + constructor(DOMString type, optional CookieChangeEventInit eventInitDict = {}); + [SameObject] readonly attribute FrozenArray changed; + [SameObject] readonly attribute FrozenArray deleted; +}; diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index c32c44f4583..e849e2574bf 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -175,6 +175,7 @@ enum class Source; namespace Web::CookieStore { +class CookieChangeEvent; class CookieStore; } diff --git a/Libraries/LibWeb/idl_files.cmake b/Libraries/LibWeb/idl_files.cmake index 311837c3ea6..994c837bb30 100644 --- a/Libraries/LibWeb/idl_files.cmake +++ b/Libraries/LibWeb/idl_files.cmake @@ -13,6 +13,7 @@ libweb_js_bindings(Clipboard/ClipboardItem) libweb_js_bindings(ContentSecurityPolicy/SecurityPolicyViolationEvent) libweb_js_bindings(Compression/CompressionStream) libweb_js_bindings(Compression/DecompressionStream) +libweb_js_bindings(CookieStore/CookieChangeEvent) libweb_js_bindings(CookieStore/CookieStore) libweb_js_bindings(CredentialManagement/Credential) libweb_js_bindings(CredentialManagement/CredentialsContainer) diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/CookieStore/BUILD.gn b/Meta/gn/secondary/Userland/Libraries/LibWeb/CookieStore/BUILD.gn index 79ff6ce6f1a..a3fb027adb3 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/CookieStore/BUILD.gn +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/CookieStore/BUILD.gn @@ -1,5 +1,8 @@ source_set("CookieStore") { configs += [ "//Userland/Libraries/LibWeb:configs" ] deps = [ "//Userland/Libraries/LibWeb:all_generated" ] - sources = [ "CookieStore.cpp" ] + sources = [ + "CookieChangeEvent.cpp", + "CookieStore.cpp", + ] } diff --git a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni index 141427aef59..bc7844c0eeb 100644 --- a/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni +++ b/Meta/gn/secondary/Userland/Libraries/LibWeb/idl_files.gni @@ -30,6 +30,7 @@ standard_idl_files = [ "//Userland/Libraries/LibWeb/Animations/KeyframeEffect.idl", "//Userland/Libraries/LibWeb/Clipboard/Clipboard.idl", "//Userland/Libraries/LibWeb/Clipboard/ClipboardEvent.idl", + "//Userland/Libraries/LibWeb/CookieStore/CookieChangeEvent.idl", "//Userland/Libraries/LibWeb/CookieStore/CookieStore.idl", "//Userland/Libraries/LibWeb/Crypto/Crypto.idl", "//Userland/Libraries/LibWeb/Crypto/CryptoKey.idl", diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index 8e778ba5ccc..cce9e919f61 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -79,6 +79,7 @@ Comment CompositionEvent CompressionStream ConstantSourceNode +CookieChangeEvent CookieStore CountQueuingStrategy Credential