/* * Copyright (c) 2024-2025, stelar7 * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include namespace Web::IndexedDB { using CursorSource = Variant, GC::Ref>; // https://w3c.github.io/IndexedDB/#cursor-interface class IDBCursor : public Bindings::PlatformObject { WEB_PLATFORM_OBJECT(IDBCursor, Bindings::PlatformObject); GC_DECLARE_ALLOCATOR(IDBCursor); public: virtual ~IDBCursor() override; [[nodiscard]] static GC::Ref create(JS::Realm&, GC::Ref, GC::Ptr, Bindings::IDBCursorDirection, bool, GC::Ptr, JS::Value, CursorSource, GC::Ref, bool); [[nodiscard]] CursorSource source() { return m_source; } [[nodiscard]] Bindings::IDBCursorDirection direction() { return m_direction; } [[nodiscard]] JS::Value key(); [[nodiscard]] JS::Value value() { return m_value.value_or(JS::js_undefined()); } [[nodiscard]] GC::Ptr request() { return m_request; } [[nodiscard]] GC::Ref transaction() { return m_transaction; } [[nodiscard]] GC::Ref range() { return m_range; } [[nodiscard]] GC::Ptr position() { return m_position; } [[nodiscard]] GC::Ptr object_store_position() { return m_object_store_position; } [[nodiscard]] bool key_only() const { return m_key_only; } [[nodiscard]] bool got_value() const { return m_got_value; } protected: explicit IDBCursor(JS::Realm&, GC::Ref, GC::Ptr, Bindings::IDBCursorDirection, bool, GC::Ptr, JS::Value, CursorSource, GC::Ref, bool); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Visitor& visitor) override; private: // A cursor has a transaction, the transaction that was active when the cursor was created. GC::Ref m_transaction; // A cursor has a position within its range. GC::Ptr m_position; // When iterating indexes the cursor also has an object store position GC::Ptr m_object_store_position; // A cursor has a direction that determines whether it moves in monotonically increasing or decreasing order of the record keys when iterated, and if it skips duplicated values when iterating indexes. Bindings::IDBCursorDirection m_direction; // A cursor has a got value flag. bool m_got_value { false }; // A cursor has a key and a value which represent the key and the value of the last iterated record. GC::Ptr m_key; Optional m_value; // A cursor has a source that indicates which index or an object store is associated with the records over which the cursor is iterating. CursorSource m_source; // A cursor has a range of records in either an index or an object store. GC::Ref m_range; // A cursor has a request, which is the request used to open the cursor. GC::Ptr m_request; // A cursor also has a key only flag, that indicates whether the cursor’s value is exposed via the API. bool m_key_only { false }; }; }