LibWeb: Implement IDBDatabase::close()

This commit is contained in:
stelar7 2024-11-07 20:33:25 +01:00 committed by Jelle Raaijmakers
commit bb31b682a5
Notes: github-actions[bot] 2024-11-26 13:52:06 +00:00
4 changed files with 27 additions and 1 deletions

View file

@ -10,6 +10,7 @@
#include <LibWeb/DOM/EventTarget.h>
#include <LibWeb/HTML/DOMStringList.h>
#include <LibWeb/IndexedDB/IDBRequest.h>
#include <LibWeb/IndexedDB/Internal/Algorithms.h>
#include <LibWeb/IndexedDB/Internal/Database.h>
#include <LibWeb/StorageAPI/StorageKey.h>
@ -35,6 +36,7 @@ public:
void set_version(u64 version) { m_version = version; }
void set_close_pending(bool close_pending) { m_close_pending = close_pending; }
void set_state(ConnectionState state) { m_state = state; }
[[nodiscard]] GC::Ref<HTML::DOMStringList> object_store_names() { return m_object_store_names; }
[[nodiscard]] String name() const { return m_name; }
@ -43,6 +45,13 @@ public:
[[nodiscard]] ConnectionState state() const { return m_state; }
[[nodiscard]] GC::Ref<Database> associated_database() { return m_associated_database; }
// https://w3c.github.io/IndexedDB/#dom-idbdatabase-close
void close()
{
// 1. Run close a database connection with this connection.
close_a_database_connection(*this);
}
void set_onabort(WebIDL::CallbackType*);
WebIDL::CallbackType* onabort();
void set_onclose(WebIDL::CallbackType*);

View file

@ -8,7 +8,7 @@ interface IDBDatabase : EventTarget {
readonly attribute DOMStringList objectStoreNames;
[FIXME, NewObject] IDBTransaction transaction((DOMString or sequence<DOMString>) storeNames, optional IDBTransactionMode mode = "readonly", optional IDBTransactionOptions options = {});
[FIXME] undefined close();
undefined close();
[FIXME, NewObject] IDBObjectStore createObjectStore(DOMString name, optional IDBObjectStoreParameters options = {});
[FIXME] undefined deleteObjectStore(DOMString name);

View file

@ -13,6 +13,7 @@
#include <LibJS/Runtime/VM.h>
#include <LibWeb/DOM/EventDispatcher.h>
#include <LibWeb/HTML/EventNames.h>
#include <LibWeb/IndexedDB/IDBDatabase.h>
#include <LibWeb/IndexedDB/IDBRequest.h>
#include <LibWeb/IndexedDB/IDBVersionChangeEvent.h>
#include <LibWeb/IndexedDB/Internal/Algorithms.h>
@ -266,4 +267,19 @@ ErrorOr<Key> convert_a_value_to_a_key(JS::Realm& realm, JS::Value input, Vector<
return Error::from_string_literal("Unknown key type");
}
// https://w3c.github.io/IndexedDB/#close-a-database-connection
void close_a_database_connection(IDBDatabase& connection, bool forced)
{
// 1. Set connections close pending flag to true.
connection.set_close_pending(true);
// FIXME: 2. If the forced flag is true, then for each transaction created using connection run abort a transaction with transaction and newly created "AbortError" DOMException.
// FIXME: 3. Wait for all transactions created using connection to complete. Once they are complete, connection is closed.
connection.set_state(IDBDatabase::ConnectionState::Closed);
// 4. If the forced flag is true, then fire an event named close at connection.
if (forced)
connection.dispatch_event(DOM::Event::create(connection.realm(), HTML::EventNames::close));
}
}

View file

@ -16,5 +16,6 @@ namespace Web::IndexedDB {
WebIDL::ExceptionOr<GC::Ref<IDBDatabase>> open_a_database_connection(JS::Realm&, StorageAPI::StorageKey, String, Optional<u64>, GC::Ref<IDBRequest>);
bool fire_a_version_change_event(JS::Realm&, FlyString const&, GC::Ref<DOM::EventTarget>, u64, Optional<u64>);
ErrorOr<Key> convert_a_value_to_a_key(JS::Realm&, JS::Value, Vector<JS::Value> = {});
void close_a_database_connection(IDBDatabase&, bool forced = false);
}