From 752210aec1a23bcec62bfe8a29fe216c7935f251 Mon Sep 17 00:00:00 2001 From: stelar7 Date: Wed, 9 Jul 2025 14:35:33 +0200 Subject: [PATCH] LibWeb/IDB: Implement IDBRecord --- Libraries/LibWeb/CMakeLists.txt | 1 + Libraries/LibWeb/Forward.h | 1 + Libraries/LibWeb/IndexedDB/IDBRecord.cpp | 43 +++++++++++++++ Libraries/LibWeb/IndexedDB/IDBRecord.h | 54 +++++++++++++++++++ Libraries/LibWeb/IndexedDB/IDBRecord.idl | 7 +++ Libraries/LibWeb/IndexedDB/Internal/Index.h | 2 +- .../LibWeb/IndexedDB/Internal/ObjectStore.h | 2 +- Libraries/LibWeb/IndexedDB/Internal/Record.h | 27 ---------- Libraries/LibWeb/idl_files.cmake | 1 + .../BindingsGenerator/IDLGenerators.cpp | 1 + .../Text/expected/all-window-properties.txt | 1 + 11 files changed, 111 insertions(+), 29 deletions(-) create mode 100644 Libraries/LibWeb/IndexedDB/IDBRecord.cpp create mode 100644 Libraries/LibWeb/IndexedDB/IDBRecord.h create mode 100644 Libraries/LibWeb/IndexedDB/IDBRecord.idl delete mode 100644 Libraries/LibWeb/IndexedDB/Internal/Record.h diff --git a/Libraries/LibWeb/CMakeLists.txt b/Libraries/LibWeb/CMakeLists.txt index 7c3ad1f8855..4075aa5359e 100644 --- a/Libraries/LibWeb/CMakeLists.txt +++ b/Libraries/LibWeb/CMakeLists.txt @@ -647,6 +647,7 @@ set(SOURCES IndexedDB/IDBKeyRange.cpp IndexedDB/IDBObjectStore.cpp IndexedDB/IDBOpenDBRequest.cpp + IndexedDB/IDBRecord.cpp IndexedDB/IDBRequest.cpp IndexedDB/IDBTransaction.cpp IndexedDB/IDBVersionChangeEvent.cpp diff --git a/Libraries/LibWeb/Forward.h b/Libraries/LibWeb/Forward.h index f8ea94f17b1..26564ffa110 100644 --- a/Libraries/LibWeb/Forward.h +++ b/Libraries/LibWeb/Forward.h @@ -779,6 +779,7 @@ class IDBIndex; class IDBKeyRange; class IDBObjectStore; class IDBOpenDBRequest; +class IDBRecord; class IDBRequest; class IDBTransaction; class IDBVersionChangeEvent; diff --git a/Libraries/LibWeb/IndexedDB/IDBRecord.cpp b/Libraries/LibWeb/IndexedDB/IDBRecord.cpp new file mode 100644 index 00000000000..a114526d57a --- /dev/null +++ b/Libraries/LibWeb/IndexedDB/IDBRecord.cpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2025, stelar7 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include +#include + +namespace Web::IndexedDB { + +GC_DEFINE_ALLOCATOR(IDBRecord); + +IDBRecord::~IDBRecord() = default; + +GC::Ref IDBRecord::create(JS::Realm& realm, GC::Ref key, JS::Value value, GC::Ref primary_key) +{ + return realm.create(realm, move(key), move(value), move(primary_key)); +} + +IDBRecord::IDBRecord(JS::Realm& realm, GC::Ref key, JS::Value value, GC::Ref primary_key) + : PlatformObject(realm) + , m_key(move(key)) + , m_value(move(value)) + , m_primary_key(move(primary_key)) +{ +} + +void IDBRecord::initialize(JS::Realm& realm) +{ + WEB_SET_PROTOTYPE_FOR_INTERFACE(IDBRecord); + Base::initialize(realm); +} + +void IDBRecord::visit_edges(Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_key); + visitor.visit(m_value); + visitor.visit(m_primary_key); +} + +} diff --git a/Libraries/LibWeb/IndexedDB/IDBRecord.h b/Libraries/LibWeb/IndexedDB/IDBRecord.h new file mode 100644 index 00000000000..ae1438b00bb --- /dev/null +++ b/Libraries/LibWeb/IndexedDB/IDBRecord.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2025, stelar7 + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include +#include +#include +#include + +namespace Web::IndexedDB { + +// https://w3c.github.io/IndexedDB/#object-store-record +struct ObjectStoreRecord { + GC::Ref key; + HTML::SerializationRecord value; +}; + +// https://w3c.github.io/IndexedDB/#index-list-of-records +struct IndexRecord { + GC::Ref key; + GC::Ref value; +}; + +// https://pr-preview.s3.amazonaws.com/w3c/IndexedDB/pull/461.html#record-snapshot +// https://pr-preview.s3.amazonaws.com/w3c/IndexedDB/461/95f98c0...43e154b.html#record-interface +class IDBRecord : public Bindings::PlatformObject { + WEB_PLATFORM_OBJECT(IDBRecord, Bindings::PlatformObject); + GC_DECLARE_ALLOCATOR(IDBRecord); + +public: + [[nodiscard]] static GC::Ref create(JS::Realm& realm, GC::Ref key, JS::Value value, GC::Ref primary_key); + virtual ~IDBRecord(); + + GC::Ref key() const { return m_key; } + GC::Ref primary_key() const { return m_primary_key; } + JS::Value value() const { return m_value; } + +protected: + explicit IDBRecord(JS::Realm&, GC::Ref key, JS::Value value, GC::Ref primary_key); + virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Visitor& visitor) override; + +private: + GC::Ref m_key; + JS::Value m_value; + GC::Ref m_primary_key; +}; + +} diff --git a/Libraries/LibWeb/IndexedDB/IDBRecord.idl b/Libraries/LibWeb/IndexedDB/IDBRecord.idl new file mode 100644 index 00000000000..488c0095bad --- /dev/null +++ b/Libraries/LibWeb/IndexedDB/IDBRecord.idl @@ -0,0 +1,7 @@ +// https://pr-preview.s3.amazonaws.com/w3c/IndexedDB/pull/461.html#record-interface +[Exposed=(Window,Worker)] +interface IDBRecord { + readonly attribute any key; + readonly attribute any primaryKey; + readonly attribute any value; +}; \ No newline at end of file diff --git a/Libraries/LibWeb/IndexedDB/Internal/Index.h b/Libraries/LibWeb/IndexedDB/Internal/Index.h index 6f6d63c8ca7..8cfc28f064e 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/Index.h +++ b/Libraries/LibWeb/IndexedDB/Internal/Index.h @@ -10,8 +10,8 @@ #include #include #include +#include #include -#include namespace Web::IndexedDB { diff --git a/Libraries/LibWeb/IndexedDB/Internal/ObjectStore.h b/Libraries/LibWeb/IndexedDB/Internal/ObjectStore.h index 2f02da71cd5..0dd0cfba960 100644 --- a/Libraries/LibWeb/IndexedDB/Internal/ObjectStore.h +++ b/Libraries/LibWeb/IndexedDB/Internal/ObjectStore.h @@ -14,11 +14,11 @@ #include #include #include +#include #include #include #include #include -#include namespace Web::IndexedDB { diff --git a/Libraries/LibWeb/IndexedDB/Internal/Record.h b/Libraries/LibWeb/IndexedDB/Internal/Record.h deleted file mode 100644 index d4ef82e797c..00000000000 --- a/Libraries/LibWeb/IndexedDB/Internal/Record.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (c) 2025, stelar7 - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include - -namespace Web::IndexedDB { - -// https://w3c.github.io/IndexedDB/#object-store-record -struct ObjectStoreRecord { - GC::Ref key; - HTML::SerializationRecord value; -}; - -// https://w3c.github.io/IndexedDB/#index-list-of-records -struct IndexRecord { - GC::Ref key; - GC::Ref value; -}; - -} \ No newline at end of file diff --git a/Libraries/LibWeb/idl_files.cmake b/Libraries/LibWeb/idl_files.cmake index a3dad4e1697..8f155f45fba 100644 --- a/Libraries/LibWeb/idl_files.cmake +++ b/Libraries/LibWeb/idl_files.cmake @@ -290,6 +290,7 @@ libweb_js_bindings(IndexedDB/IDBIndex) libweb_js_bindings(IndexedDB/IDBKeyRange) libweb_js_bindings(IndexedDB/IDBObjectStore) libweb_js_bindings(IndexedDB/IDBOpenDBRequest) +libweb_js_bindings(IndexedDB/IDBRecord) libweb_js_bindings(IndexedDB/IDBRequest) libweb_js_bindings(IndexedDB/IDBTransaction) libweb_js_bindings(IndexedDB/IDBVersionChangeEvent) diff --git a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp index 65de0e6c428..1bd580abeb4 100644 --- a/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp +++ b/Meta/Lagom/Tools/CodeGenerators/LibWeb/BindingsGenerator/IDLGenerators.cpp @@ -79,6 +79,7 @@ static bool is_platform_object(Type const& type) "IDBIndex"sv, "IDBKeyRange"sv, "IDBObjectStore"sv, + "IDBRecord"sv, "IDBTransaction"sv, "ImageBitmap"sv, "ImageData"sv, diff --git a/Tests/LibWeb/Text/expected/all-window-properties.txt b/Tests/LibWeb/Text/expected/all-window-properties.txt index 3949988a1e6..10b4cad29c7 100644 --- a/Tests/LibWeb/Text/expected/all-window-properties.txt +++ b/Tests/LibWeb/Text/expected/all-window-properties.txt @@ -239,6 +239,7 @@ IDBIndex IDBKeyRange IDBObjectStore IDBOpenDBRequest +IDBRecord IDBRequest IDBTransaction IDBVersionChangeEvent