mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-29 12:19:54 +00:00
LibWeb/IDB: Implement delete_records_from_an_object_store
This commit is contained in:
parent
7fa3bd00b5
commit
afe7951af4
Notes:
github-actions[bot]
2025-04-23 18:37:14 +00:00
Author: https://github.com/stelar7
Commit: afe7951af4
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/4317
Reviewed-by: https://github.com/ADKaster ✅
Reviewed-by: https://github.com/kennethmyhra ✅
4 changed files with 35 additions and 0 deletions
|
@ -1308,4 +1308,15 @@ void inject_a_key_into_a_value_using_a_key_path(JS::Realm& realm, JS::Value valu
|
|||
VERIFY(status);
|
||||
}
|
||||
|
||||
// https://w3c.github.io/IndexedDB/#delete-records-from-an-object-store
|
||||
void delete_records_from_an_object_store(GC::Ref<ObjectStore> store, GC::Ref<IDBKeyRange> range)
|
||||
{
|
||||
// 1. Remove all records, if any, from store’s list of records with key in range.
|
||||
store->remove_records_in_range(range);
|
||||
|
||||
// FIXME: 2. For each index which references store, remove every record from index’s list of records whose value is in range, if any such records exist.
|
||||
|
||||
// 3. Return undefined.
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -39,5 +39,6 @@ GC::Ref<IDBRequest> asynchronously_execute_a_request(JS::Realm&, IDBRequestSourc
|
|||
ErrorOr<u64> generate_a_key(GC::Ref<ObjectStore>);
|
||||
void possibly_update_the_key_generator(GC::Ref<ObjectStore>, GC::Ref<Key>);
|
||||
void inject_a_key_into_a_value_using_a_key_path(JS::Realm&, JS::Value, GC::Ref<Key>, KeyPath const&);
|
||||
void delete_records_from_an_object_store(GC::Ref<ObjectStore>, GC::Ref<IDBKeyRange>);
|
||||
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <LibWeb/IndexedDB/IDBKeyRange.h>
|
||||
#include <LibWeb/IndexedDB/Internal/ObjectStore.h>
|
||||
|
||||
namespace Web::IndexedDB {
|
||||
|
@ -33,6 +34,17 @@ void ObjectStore::visit_edges(Visitor& visitor)
|
|||
Base::visit_edges(visitor);
|
||||
visitor.visit(m_database);
|
||||
visitor.visit(m_indexes);
|
||||
|
||||
for (auto& record : m_records) {
|
||||
visitor.visit(record.key);
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectStore::remove_records_in_range(GC::Ref<IDBKeyRange> range)
|
||||
{
|
||||
m_records.remove_all_matching([&](auto const& record) {
|
||||
return range->is_in_range(record.key);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -23,6 +23,12 @@ namespace Web::IndexedDB {
|
|||
|
||||
using KeyPath = Variant<String, Vector<String>>;
|
||||
|
||||
// https://w3c.github.io/IndexedDB/#object-store-record
|
||||
struct Record {
|
||||
GC::Ref<Key> key;
|
||||
HTML::SerializationRecord value;
|
||||
};
|
||||
|
||||
// https://w3c.github.io/IndexedDB/#object-store-construct
|
||||
class ObjectStore : public JS::Cell {
|
||||
GC_CELL(ObjectStore, JS::Cell);
|
||||
|
@ -42,6 +48,8 @@ public:
|
|||
|
||||
GC::Ref<Database> database() const { return m_database; }
|
||||
|
||||
void remove_records_in_range(GC::Ref<IDBKeyRange> range);
|
||||
|
||||
protected:
|
||||
virtual void visit_edges(Visitor&) override;
|
||||
|
||||
|
@ -62,6 +70,9 @@ private:
|
|||
|
||||
// An object store optionally has a key generator.
|
||||
Optional<KeyGenerator> m_key_generator;
|
||||
|
||||
// An object store has a list of records
|
||||
Vector<Record> m_records;
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue