From f30be4e1aba332bbe41c02c514d34ccb3299b9a8 Mon Sep 17 00:00:00 2001 From: Ashwin Naren Date: Thu, 21 Aug 2025 15:54:19 -0700 Subject: [PATCH] Stub out IDBIndex (#38813) Stubs the IDBIndex interface. Testing: Mostly stubbing. Eventually covered by WPT. Fixes: Partially #38100 --------- Signed-off-by: Ashwin Naren --- components/script/dom/idbindex.rs | 76 +++++++++++++++++++ components/script/dom/mod.rs | 1 + .../script_bindings/webidls/IDBIndex.webidl | 31 ++++++++ .../wpt/meta/IndexedDB/idlharness.any.js.ini | 54 ------------- .../interface-objects/001.worker.js.ini | 3 - 5 files changed, 108 insertions(+), 57 deletions(-) create mode 100644 components/script/dom/idbindex.rs create mode 100644 components/script_bindings/webidls/IDBIndex.webidl diff --git a/components/script/dom/idbindex.rs b/components/script/dom/idbindex.rs new file mode 100644 index 00000000000..3e2467665b5 --- /dev/null +++ b/components/script/dom/idbindex.rs @@ -0,0 +1,76 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +use dom_struct::dom_struct; +use script_bindings::codegen::GenericBindings::IDBIndexBinding::IDBIndexMethods; +use script_bindings::str::DOMString; + +use crate::dom::bindings::reflector::{Reflector, reflect_dom_object}; +use crate::dom::bindings::root::DomRoot; +use crate::dom::globalscope::GlobalScope; +use crate::dom::idbobjectstore::IDBObjectStore; +use crate::script_runtime::CanGc; + +#[dom_struct] +pub(crate) struct IDBIndex { + reflector_: Reflector, + object_store: DomRoot, + name: DOMString, + multi_entry: bool, + unique: bool, +} + +impl IDBIndex { + pub fn new_inherited( + object_store: DomRoot, + name: DOMString, + multi_entry: bool, + unique: bool, + ) -> IDBIndex { + IDBIndex { + reflector_: Reflector::new(), + object_store, + name, + multi_entry, + unique, + } + } + + #[expect(dead_code)] + pub fn new( + global: &GlobalScope, + object_store: DomRoot, + name: DOMString, + multi_entry: bool, + unique: bool, + can_gc: CanGc, + ) -> DomRoot { + reflect_dom_object( + Box::new(IDBIndex::new_inherited( + object_store, + name, + multi_entry, + unique, + )), + global, + can_gc, + ) + } +} + +impl IDBIndexMethods for IDBIndex { + // https://www.w3.org/TR/IndexedDB/#dom-idbindex-objectstore + fn ObjectStore(&self) -> DomRoot { + self.object_store.clone() + } + + // https://www.w3.org/TR/IndexedDB/#dom-idbindex-multientry + fn MultiEntry(&self) -> bool { + self.multi_entry + } + + // https://www.w3.org/TR/IndexedDB/#dom-idbindex-unique + fn Unique(&self) -> bool { + self.unique + } +} diff --git a/components/script/dom/mod.rs b/components/script/dom/mod.rs index 6693b983ea7..1811563b5f9 100644 --- a/components/script/dom/mod.rs +++ b/components/script/dom/mod.rs @@ -428,6 +428,7 @@ pub(crate) mod htmlunknownelement; pub(crate) mod htmlvideoelement; pub(crate) mod idbdatabase; pub(crate) mod idbfactory; +pub(crate) mod idbindex; pub(crate) mod idbkeyrange; pub(crate) mod idbobjectstore; pub(crate) mod idbopendbrequest; diff --git a/components/script_bindings/webidls/IDBIndex.webidl b/components/script_bindings/webidls/IDBIndex.webidl new file mode 100644 index 00000000000..e2534e9ad64 --- /dev/null +++ b/components/script_bindings/webidls/IDBIndex.webidl @@ -0,0 +1,31 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ +/* + * The origin of this IDL file is + * https://w3c.github.io/IndexedDB/#idbindex + * + */ + +[Pref="dom_indexeddb_enabled", Exposed=(Window,Worker)] +interface IDBIndex { + // attribute DOMString name; + [SameObject] readonly attribute IDBObjectStore objectStore; + // readonly attribute any keyPath; + readonly attribute boolean multiEntry; + readonly attribute boolean unique; + + // [NewObject] IDBRequest get(any query); + // [NewObject] IDBRequest getKey(any query); + // [NewObject] IDBRequest getAll(optional any queryOrOptions, + // optional [EnforceRange] unsigned long count); + // [NewObject] IDBRequest getAllKeys(optional any queryOrOptions, + // optional [EnforceRange] unsigned long count); + // [NewObject] IDBRequest getAllRecords(optional IDBGetAllOptions options = {}); + // [NewObject] IDBRequest count(optional any query); + + // [NewObject] IDBRequest openCursor(optional any query, + // optional IDBCursorDirection direction = "next"); + // [NewObject] IDBRequest openKeyCursor(optional any query, + // optional IDBCursorDirection direction = "next"); +}; diff --git a/tests/wpt/meta/IndexedDB/idlharness.any.js.ini b/tests/wpt/meta/IndexedDB/idlharness.any.js.ini index 6f849d9aed9..3dd6edbf07b 100644 --- a/tests/wpt/meta/IndexedDB/idlharness.any.js.ini +++ b/tests/wpt/meta/IndexedDB/idlharness.any.js.ini @@ -32,39 +32,12 @@ [IDBObjectStore interface: operation deleteIndex(DOMString)] expected: FAIL - [IDBIndex interface: existence and properties of interface object] - expected: FAIL - - [IDBIndex interface object length] - expected: FAIL - - [IDBIndex interface object name] - expected: FAIL - - [IDBIndex interface: existence and properties of interface prototype object] - expected: FAIL - - [IDBIndex interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [IDBIndex interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - [IDBIndex interface: attribute name] expected: FAIL - [IDBIndex interface: attribute objectStore] - expected: FAIL - [IDBIndex interface: attribute keyPath] expected: FAIL - [IDBIndex interface: attribute multiEntry] - expected: FAIL - - [IDBIndex interface: attribute unique] - expected: FAIL - [IDBIndex interface: operation get(any)] expected: FAIL @@ -196,39 +169,12 @@ [IDBObjectStore interface: operation deleteIndex(DOMString)] expected: FAIL - [IDBIndex interface: existence and properties of interface object] - expected: FAIL - - [IDBIndex interface object length] - expected: FAIL - - [IDBIndex interface object name] - expected: FAIL - - [IDBIndex interface: existence and properties of interface prototype object] - expected: FAIL - - [IDBIndex interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [IDBIndex interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - [IDBIndex interface: attribute name] expected: FAIL - [IDBIndex interface: attribute objectStore] - expected: FAIL - [IDBIndex interface: attribute keyPath] expected: FAIL - [IDBIndex interface: attribute multiEntry] - expected: FAIL - - [IDBIndex interface: attribute unique] - expected: FAIL - [IDBIndex interface: operation get(any)] expected: FAIL diff --git a/tests/wpt/meta/workers/semantics/interface-objects/001.worker.js.ini b/tests/wpt/meta/workers/semantics/interface-objects/001.worker.js.ini index fc35b2de1b3..e71803ea330 100644 --- a/tests/wpt/meta/workers/semantics/interface-objects/001.worker.js.ini +++ b/tests/wpt/meta/workers/semantics/interface-objects/001.worker.js.ini @@ -5,9 +5,6 @@ [The CanvasPath interface object should be exposed.] expected: FAIL - [The IDBIndex interface object should be exposed.] - expected: FAIL - [The IDBCursor interface object should be exposed.] expected: FAIL