IndexedDB tests leak documents
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBCursor.h
index b28a1e2..03e6b1e 100644 (file)
 
 #if ENABLE(INDEXED_DATABASE)
 
-#include "ActiveDOMObject.h"
-#include "ExceptionCode.h"
-#include "IDBAny.h"
+#include "ExceptionOr.h"
+#include "IDBCursorDirection.h"
 #include "IDBCursorInfo.h"
-#include <runtime/JSCJSValue.h>
+#include "IDBValue.h"
+#include "JSValueInWrappedObject.h"
+#include <JavaScriptCore/Strong.h>
+#include <wtf/Variant.h>
+#include <wtf/WeakPtr.h>
 
 namespace WebCore {
 
-class IDBAny;
 class IDBGetResult;
 class IDBIndex;
 class IDBObjectStore;
 class IDBTransaction;
 
-class IDBCursor : public ScriptWrappable, public RefCounted<IDBCursor>, public ActiveDOMObject {
+class IDBCursor : public ScriptWrappable, public RefCounted<IDBCursor> {
 public:
-    static Ref<IDBCursor> create(IDBTransaction&, IDBIndex&, const IDBCursorInfo&);
-
-    static const AtomicString& directionNext();
-    static const AtomicString& directionNextUnique();
-    static const AtomicString& directionPrev();
-    static const AtomicString& directionPrevUnique();
-
-    static IndexedDB::CursorDirection stringToDirection(const String& modeString, ExceptionCode&);
-    static const AtomicString& directionToString(IndexedDB::CursorDirection mode);
+    static Ref<IDBCursor> create(IDBObjectStore&, const IDBCursorInfo&);
+    static Ref<IDBCursor> create(IDBIndex&, const IDBCursorInfo&);
     
     virtual ~IDBCursor();
 
-    // Implement the IDL
-    const String& direction() const;
-    JSC::JSValue key(JSC::ExecState&) const;
-    JSC::JSValue primaryKey(JSC::ExecState&) const;
-    JSC::JSValue value(JSC::ExecState&) const;
-    IDBAny* source();
+    using Source = Variant<RefPtr<IDBObjectStore>, RefPtr<IDBIndex>>;
 
-    RefPtr<WebCore::IDBRequest> update(JSC::ExecState&, Deprecated::ScriptValue&, ExceptionCodeWithMessage&);
-    void advance(unsigned long, ExceptionCodeWithMessage&);
-    void continueFunction(ScriptExecutionContext&, ExceptionCodeWithMessage&);
-    void continueFunction(ScriptExecutionContext&, const Deprecated::ScriptValue& key, ExceptionCodeWithMessage&);
-    RefPtr<WebCore::IDBRequest> deleteFunction(ScriptExecutionContext&, ExceptionCodeWithMessage&);
+    const Source& source() const;
+    IDBCursorDirection direction() const;
 
-    void continueFunction(const IDBKeyData&, ExceptionCodeWithMessage&);
+    IDBKey* key() { return m_key.get(); };
+    IDBKey* primaryKey() { return m_primaryKey.get(); };
+    IDBValue value() { return m_value; };
+    JSValueInWrappedObject& keyWrapper() { return m_keyWrapper; }
+    JSValueInWrappedObject& primaryKeyWrapper() { return m_primaryKeyWrapper; }
+    JSValueInWrappedObject& valueWrapper() { return m_valueWrapper; }
 
-    const IDBCursorInfo& info() const { return m_info; }
+    ExceptionOr<Ref<IDBRequest>> update(JSC::ExecState&, JSC::JSValue);
+    ExceptionOr<void> advance(unsigned);
+    ExceptionOr<void> continueFunction(JSC::ExecState&, JSC::JSValue key);
+    ExceptionOr<void> continuePrimaryKey(JSC::ExecState&, JSC::JSValue key, JSC::JSValue primaryKey);
+    ExceptionOr<Ref<IDBRequest>> deleteFunction(JSC::ExecState&);
 
-    void setRequest(IDBRequest& request) { m_request = &request; }
-    void clearRequest() { m_request = nullptr; }
-    IDBRequest* request() { return m_request; }
+    ExceptionOr<void> continueFunction(const IDBKeyData&);
 
-    void setGetResult(IDBRequest&, const IDBGetResult&);
+    const IDBCursorInfo& info() const { return m_info; }
 
-    virtual bool isKeyCursor() const { return true; }
+    void setRequest(IDBRequest& request) { m_request = makeWeakPtr(&request); }
+    void clearRequest() { m_request.clear(); }
+    IDBRequest* request() { return m_request.get(); }
 
-    void decrementOutstandingRequestCount();
+    void setGetResult(IDBRequest&, const IDBGetResult&);
 
-    // ActiveDOMObject.
-    const char* activeDOMObjectName() const;
-    bool canSuspendForDocumentSuspension() const;
-    bool hasPendingActivity() const;
+    virtual bool isKeyCursorWithValue() const { return false; }
 
 protected:
-    IDBCursor(IDBTransaction&, IDBObjectStore&, const IDBCursorInfo&);
-    IDBCursor(IDBTransaction&, IDBIndex&, const IDBCursorInfo&);
+    IDBCursor(IDBObjectStore&, const IDBCursorInfo&);
+    IDBCursor(IDBIndex&, const IDBCursorInfo&);
 
 private:
-    // Cursors are created with an outstanding iteration request.
-    unsigned m_outstandingRequestCount { 1 };
-
-    IDBCursorInfo m_info;
-    Ref<IDBAny> m_source;
-    IDBObjectStore* m_objectStore { nullptr };
-    IDBIndex* m_index { nullptr };
-    IDBRequest* m_request;
-
     bool sourcesDeleted() const;
     IDBObjectStore& effectiveObjectStore() const;
     IDBTransaction& transaction() const;
 
-    void uncheckedIterateCursor(const IDBKeyData&, unsigned long count);
+    void uncheckedIterateCursor(const IDBKeyData&, unsigned count);
+    void uncheckedIterateCursor(const IDBKeyData&, const IDBKeyData&);
+
+    IDBCursorInfo m_info;
+    Source m_source;
+    WeakPtr<IDBRequest> m_request;
 
     bool m_gotValue { false };
 
-    IDBKeyData m_currentKeyData;
-    IDBKeyData m_currentPrimaryKeyData;
+    RefPtr<IDBKey> m_key;
+    RefPtr<IDBKey> m_primaryKey;
+    IDBKeyData m_keyData;
+    IDBKeyData m_primaryKeyData;
+    IDBValue m_value;
 
-    JSC::JSValue m_currentKey;
-    JSC::JSValue m_currentPrimaryKey;
-    JSC::JSValue m_currentValue;
+    JSValueInWrappedObject m_keyWrapper;
+    JSValueInWrappedObject m_primaryKeyWrapper;
+    JSValueInWrappedObject m_valueWrapper;
 };
 
+
+inline const IDBCursor::Source& IDBCursor::source() const
+{
+    return m_source;
+}
+
+inline IDBCursorDirection IDBCursor::direction() const
+{
+    return m_info.cursorDirection();
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(INDEXED_DATABASE)