LibWeb/IDB: Implement IDBObjectStore::name

This commit is contained in:
stelar7 2025-03-24 21:18:26 +01:00 committed by Jelle Raaijmakers
commit 3879391fa6
Notes: github-actions[bot] 2025-03-27 15:49:10 +00:00
6 changed files with 80 additions and 13 deletions

View file

@ -12,9 +12,26 @@ GC_DEFINE_ALLOCATOR(ObjectStore);
ObjectStore::~ObjectStore() = default;
GC::Ref<ObjectStore> ObjectStore::create(JS::Realm& realm, String name, bool auto_increment, Optional<KeyPath> const& key_path)
GC::Ref<ObjectStore> ObjectStore::create(JS::Realm& realm, GC::Ref<Database> database, String name, bool auto_increment, Optional<KeyPath> const& key_path)
{
return realm.create<ObjectStore>(name, auto_increment, key_path);
return realm.create<ObjectStore>(database, name, auto_increment, key_path);
}
ObjectStore::ObjectStore(GC::Ref<Database> database, String name, bool auto_increment, Optional<KeyPath> const& key_path)
: m_database(database)
, m_name(move(name))
, m_key_path(key_path)
{
database->add_object_store(*this);
if (auto_increment)
m_key_generator = KeyGenerator {};
}
void ObjectStore::visit_edges(Visitor& visitor)
{
Base::visit_edges(visitor);
visitor.visit(m_database);
}
}

View file

@ -14,6 +14,7 @@
#include <LibJS/Heap/Cell.h>
#include <LibJS/Runtime/Realm.h>
#include <LibWeb/IndexedDB/Internal/Algorithms.h>
#include <LibWeb/IndexedDB/Internal/Database.h>
#include <LibWeb/IndexedDB/Internal/KeyGenerator.h>
namespace Web::IndexedDB {
@ -26,23 +27,26 @@ class ObjectStore : public JS::Cell {
GC_DECLARE_ALLOCATOR(ObjectStore);
public:
[[nodiscard]] static GC::Ref<ObjectStore> create(JS::Realm&, String, bool, Optional<KeyPath> const&);
[[nodiscard]] static GC::Ref<ObjectStore> create(JS::Realm&, GC::Ref<Database>, String, bool, Optional<KeyPath> const&);
virtual ~ObjectStore();
String name() const { return m_name; }
void set_name(String name) { m_name = move(name); }
Optional<KeyPath> key_path() const { return m_key_path; }
bool uses_inline_keys() const { return m_key_path.has_value(); }
bool uses_out_of_line_keys() const { return !m_key_path.has_value(); }
Optional<KeyGenerator> key_generator() const { return m_key_generator; }
GC::Ref<Database> database() const { return m_database; }
protected:
virtual void visit_edges(Visitor&) override;
private:
ObjectStore(String name, bool auto_increment, Optional<KeyPath> const& key_path)
: m_name(move(name))
, m_key_path(key_path)
{
if (auto_increment)
m_key_generator = KeyGenerator {};
}
ObjectStore(GC::Ref<Database> database, String name, bool auto_increment, Optional<KeyPath> const& key_path);
// AD-HOC: An ObjectStore needs to know what Database it belongs to...
GC::Ref<Database> m_database;
// An object store has a name, which is a name. At any one time, the name is unique within the database to which it belongs.
String m_name;