diff --git a/Libraries/LibWeb/IndexedDB/IDBObjectStore.cpp b/Libraries/LibWeb/IndexedDB/IDBObjectStore.cpp index 4a5b4999236..aed485032f7 100644 --- a/Libraries/LibWeb/IndexedDB/IDBObjectStore.cpp +++ b/Libraries/LibWeb/IndexedDB/IDBObjectStore.cpp @@ -189,4 +189,37 @@ WebIDL::ExceptionOr> IDBObjectStore::index(String const& name) return IDBIndex::create(realm(), *index, *this); } +// https://w3c.github.io/IndexedDB/#dom-idbobjectstore-deleteindex +WebIDL::ExceptionOr IDBObjectStore::delete_index(String const& name) +{ + // 1. Let transaction be this’s transaction. + auto transaction = this->transaction(); + + // 2. Let store be this’s object store. + auto store = this->store(); + + // 3. If transaction is not an upgrade transaction, throw an "InvalidStateError" DOMException. + if (transaction->mode() != Bindings::IDBTransactionMode::Versionchange) + return WebIDL::InvalidStateError::create(realm(), "Transaction is not an upgrade transaction"_string); + + // FIXME: 4. If store has been deleted, throw an "InvalidStateError" DOMException. + + // 5. If transaction’s state is not active, then throw a "TransactionInactiveError" DOMException. + if (transaction->state() != IDBTransaction::TransactionState::Active) + return WebIDL::TransactionInactiveError::create(realm(), "Transaction is not active"_string); + + // 6. Let index be the index named name in store if one exists, or throw a "NotFoundError" DOMException otherwise. + auto index = m_indexes.get(name); + if (!index.has_value()) + return WebIDL::NotFoundError::create(realm(), "Index not found"_string); + + // 7. Remove index from this’s index set. + m_indexes.remove(name); + + // 8. Destroy index. + store->index_set().remove(name); + + return {}; +} + } diff --git a/Libraries/LibWeb/IndexedDB/IDBObjectStore.h b/Libraries/LibWeb/IndexedDB/IDBObjectStore.h index 0d3aac2a589..0fab61694be 100644 --- a/Libraries/LibWeb/IndexedDB/IDBObjectStore.h +++ b/Libraries/LibWeb/IndexedDB/IDBObjectStore.h @@ -42,6 +42,7 @@ public: WebIDL::ExceptionOr> create_index(String const&, KeyPath, IDBIndexParameters options); [[nodiscard]] GC::Ref index_names(); WebIDL::ExceptionOr> index(String const&); + WebIDL::ExceptionOr delete_index(String const&); protected: explicit IDBObjectStore(JS::Realm&, GC::Ref, GC::Ref); diff --git a/Libraries/LibWeb/IndexedDB/IDBObjectStore.idl b/Libraries/LibWeb/IndexedDB/IDBObjectStore.idl index 947ecd6bcf5..90d51d3d686 100644 --- a/Libraries/LibWeb/IndexedDB/IDBObjectStore.idl +++ b/Libraries/LibWeb/IndexedDB/IDBObjectStore.idl @@ -23,7 +23,7 @@ interface IDBObjectStore { [FIXME, NewObject] IDBRequest openKeyCursor(optional any query, optional IDBCursorDirection direction = "next"); IDBIndex index(DOMString name); [NewObject] IDBIndex createIndex(DOMString name, (DOMString or sequence) keyPath, optional IDBIndexParameters options = {}); - [FIXME] undefined deleteIndex(DOMString name); + undefined deleteIndex(DOMString name); }; dictionary IDBIndexParameters {