diff options
Diffstat (limited to 'Source/WebCore/Modules/indexeddb/IDBCursor.h')
-rw-r--r-- | Source/WebCore/Modules/indexeddb/IDBCursor.h | 199 |
1 files changed, 115 insertions, 84 deletions
diff --git a/Source/WebCore/Modules/indexeddb/IDBCursor.h b/Source/WebCore/Modules/indexeddb/IDBCursor.h index b58d5aee9..5c48e70ad 100644 --- a/Source/WebCore/Modules/indexeddb/IDBCursor.h +++ b/Source/WebCore/Modules/indexeddb/IDBCursor.h @@ -1,111 +1,142 @@ /* - * Copyright (C) 2010 Google Inc. All rights reserved. + * Copyright (C) 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY - * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND - * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef IDBCursor_h -#define IDBCursor_h +#pragma once #if ENABLE(INDEXED_DATABASE) -#include "IDBKey.h" -#include "IDBTransaction.h" -#include "IndexedDB.h" -#include "ScriptWrappable.h" -#include <bindings/ScriptValue.h> -#include <wtf/PassRefPtr.h> -#include <wtf/RefCounted.h> -#include <wtf/RefPtr.h> +#include "ActiveDOMObject.h" +#include "DOMWrapperWorld.h" +#include "ExceptionOr.h" +#include "IDBCursorDirection.h" +#include "IDBCursorInfo.h" +#include <heap/Strong.h> +#include <wtf/Variant.h> namespace WebCore { -class DOMRequestState; -class IDBAny; -class IDBCallbacks; -class IDBCursorBackend; -class IDBRequest; -class ScriptExecutionContext; - -typedef int ExceptionCode; +class IDBGetResult; +class IDBIndex; +class IDBObjectStore; +class IDBTransaction; -class IDBCursor : public ScriptWrappable, public RefCounted<IDBCursor> { +class IDBCursor : public ScriptWrappable, public RefCounted<IDBCursor>, public ActiveDOMObject { public: - static const AtomicString& directionNext(); - static const AtomicString& directionNextUnique(); - static const AtomicString& directionPrev(); - static const AtomicString& directionPrevUnique(); + static Ref<IDBCursor> create(IDBTransaction&, IDBObjectStore&, const IDBCursorInfo&); + static Ref<IDBCursor> create(IDBTransaction&, IDBIndex&, const IDBCursorInfo&); + + virtual ~IDBCursor(); - static IndexedDB::CursorDirection stringToDirection(const String& modeString, ExceptionCode&); - static const AtomicString& directionToString(IndexedDB::CursorDirection mode); + using Source = Variant<RefPtr<IDBObjectStore>, RefPtr<IDBIndex>>; - static PassRefPtr<IDBCursor> create(PassRefPtr<IDBCursorBackend>, IndexedDB::CursorDirection, IDBRequest*, IDBAny* source, IDBTransaction*); - virtual ~IDBCursor(); + const Source& source() const; + IDBCursorDirection direction() const; + JSC::JSValue key() const; + JSC::JSValue primaryKey() const; + JSC::JSValue value() const; + + 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&); + + ExceptionOr<void> continueFunction(const IDBKeyData&); + + const IDBCursorInfo& info() const { return m_info; } - // Implement the IDL - const String& direction() const; - const Deprecated::ScriptValue& key() const; - const Deprecated::ScriptValue& primaryKey() const; - const Deprecated::ScriptValue& value() const; - IDBAny* source() const; - - PassRefPtr<IDBRequest> update(JSC::ExecState*, Deprecated::ScriptValue&, ExceptionCode&); - void advance(unsigned long, ExceptionCode&); - // FIXME: Try to modify the code generator so this overload is unneeded. - void continueFunction(ScriptExecutionContext*, ExceptionCode& ec) { continueFunction(static_cast<IDBKey*>(0), ec); } - void continueFunction(ScriptExecutionContext*, const Deprecated::ScriptValue& key, ExceptionCode&); - PassRefPtr<IDBRequest> deleteFunction(ScriptExecutionContext*, ExceptionCode&); - - void continueFunction(PassRefPtr<IDBKey>, ExceptionCode&); - void postSuccessHandlerCallback(); - void close(); - void setValueReady(DOMRequestState*, PassRefPtr<IDBKey>, PassRefPtr<IDBKey> primaryKey, Deprecated::ScriptValue&); - PassRefPtr<IDBKey> idbPrimaryKey() { return m_currentPrimaryKey; } + void setRequest(IDBRequest& request) { m_request = &request; } + void clearRequest() { m_request = nullptr; } + IDBRequest* request() { return m_request; } + + void setGetResult(IDBRequest&, const IDBGetResult&); + + virtual bool isKeyCursorWithValue() const { return false; } + + void decrementOutstandingRequestCount(); + + bool hasPendingActivity() const final; protected: - IDBCursor(PassRefPtr<IDBCursorBackend>, IndexedDB::CursorDirection, IDBRequest*, IDBAny* source, IDBTransaction*); - virtual bool isKeyCursor() const { return true; } + IDBCursor(IDBTransaction&, IDBObjectStore&, const IDBCursorInfo&); + IDBCursor(IDBTransaction&, IDBIndex&, const IDBCursorInfo&); private: - PassRefPtr<IDBObjectStore> effectiveObjectStore(); - - RefPtr<IDBCursorBackend> m_backend; - RefPtr<IDBRequest> m_request; - const IndexedDB::CursorDirection m_direction; - RefPtr<IDBAny> m_source; - RefPtr<IDBTransaction> m_transaction; - IDBTransaction::OpenCursorNotifier m_transactionNotifier; - bool m_gotValue; - // These values are held because m_backend may advance while they - // are still valid for the current success handlers. - Deprecated::ScriptValue m_currentKeyValue; - Deprecated::ScriptValue m_currentPrimaryKeyValue; - RefPtr<IDBKey> m_currentKey; - RefPtr<IDBKey> m_currentPrimaryKey; - Deprecated::ScriptValue m_currentValue; + const char* activeDOMObjectName() const final; + bool canSuspendForDocumentSuspension() const final; + + bool sourcesDeleted() const; + IDBObjectStore& effectiveObjectStore() const; + IDBTransaction& transaction() const; + + void uncheckedIterateCursor(const IDBKeyData&, unsigned count); + void uncheckedIterateCursor(const IDBKeyData&, const IDBKeyData&); + + // Cursors are created with an outstanding iteration request. + unsigned m_outstandingRequestCount { 1 }; + + IDBCursorInfo m_info; + Source m_source; + IDBRequest* m_request { nullptr }; + + bool m_gotValue { false }; + + IDBKeyData m_currentKeyData; + IDBKeyData m_currentPrimaryKeyData; + + JSC::Strong<JSC::Unknown> m_currentKey; + JSC::Strong<JSC::Unknown> m_currentPrimaryKey; + JSC::Strong<JSC::Unknown> m_currentValue; }; -} // namespace WebCore -#endif +inline const IDBCursor::Source& IDBCursor::source() const +{ + return m_source; +} + +inline IDBCursorDirection IDBCursor::direction() const +{ + return m_info.cursorDirection(); +} + +inline JSC::JSValue IDBCursor::key() const +{ + return m_currentKey.get(); +} + +inline JSC::JSValue IDBCursor::primaryKey() const +{ + return m_currentPrimaryKey.get(); +} + +inline JSC::JSValue IDBCursor::value() const +{ + return m_currentValue.get(); +} + +} // namespace WebCore -#endif // IDBCursor_h +#endif // ENABLE(INDEXED_DATABASE) |