diff options
Diffstat (limited to 'chromium/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp')
-rw-r--r-- | chromium/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp | 113 |
1 files changed, 60 insertions, 53 deletions
diff --git a/chromium/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp b/chromium/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp index fad31a9ab8d..c9a27acae7f 100644 --- a/chromium/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp +++ b/chromium/third_party/WebKit/Source/modules/indexeddb/IDBIndex.cpp @@ -32,13 +32,15 @@ #include "core/dom/ExecutionContext.h" #include "modules/indexeddb/IDBDatabase.h" #include "modules/indexeddb/IDBKey.h" +#include "modules/indexeddb/IDBObjectStore.h" #include "modules/indexeddb/IDBTracing.h" #include "modules/indexeddb/IDBTransaction.h" #include "modules/indexeddb/WebIDBCallbacksImpl.h" #include "public/platform/WebIDBKeyRange.h" -using blink::WebIDBDatabase; using blink::WebIDBCallbacks; +using blink::WebIDBCursor; +using blink::WebIDBDatabase; namespace WebCore { @@ -58,20 +60,25 @@ IDBIndex::~IDBIndex() { } -ScriptValue IDBIndex::keyPath(ExecutionContext* context) const +void IDBIndex::trace(Visitor* visitor) +{ + visitor->trace(m_objectStore); + visitor->trace(m_transaction); +} + +ScriptValue IDBIndex::keyPath(ScriptState* scriptState) const { - DOMRequestState requestState(context); - return idbAnyToScriptValue(&requestState, IDBAny::create(m_metadata.keyPath)); + return idbAnyToScriptValue(scriptState, IDBAny::create(m_metadata.keyPath)); } -PassRefPtr<IDBRequest> IDBIndex::openCursor(ExecutionContext* context, const ScriptValue& range, const String& directionString, ExceptionState& exceptionState) +IDBRequest* IDBIndex::openCursor(ScriptState* scriptState, const ScriptValue& range, const String& directionString, ExceptionState& exceptionState) { IDB_TRACE("IDBIndex::openCursor"); if (isDeleted()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::indexDeletedErrorMessage); return 0; } - if (m_transaction->isFinished()) { + if (m_transaction->isFinished() || m_transaction->isFinishing()) { exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); return 0; } @@ -79,33 +86,38 @@ PassRefPtr<IDBRequest> IDBIndex::openCursor(ExecutionContext* context, const Scr exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); return 0; } - IndexedDB::CursorDirection direction = IDBCursor::stringToDirection(directionString, exceptionState); + blink::WebIDBCursorDirection direction = IDBCursor::stringToDirection(directionString, exceptionState); if (exceptionState.hadException()) return 0; - RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); if (exceptionState.hadException()) return 0; - return openCursor(context, keyRange.release(), direction); + if (!backendDB()) { + exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); + return 0; + } + + return openCursor(scriptState, keyRange, direction); } -PassRefPtr<IDBRequest> IDBIndex::openCursor(ExecutionContext* context, PassRefPtr<IDBKeyRange> keyRange, IndexedDB::CursorDirection direction) +IDBRequest* IDBIndex::openCursor(ScriptState* scriptState, IDBKeyRange* keyRange, blink::WebIDBCursorDirection direction) { - RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); + IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get()); request->setCursorDetails(IndexedDB::CursorKeyAndValue, direction); - backendDB()->openCursor(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange, direction, false, WebIDBDatabase::NormalTask, WebIDBCallbacksImpl::create(request).leakPtr()); + backendDB()->openCursor(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange, direction, false, blink::WebIDBTaskTypeNormal, WebIDBCallbacksImpl::create(request).leakPtr()); return request; } -PassRefPtr<IDBRequest> IDBIndex::count(ExecutionContext* context, const ScriptValue& range, ExceptionState& exceptionState) +IDBRequest* IDBIndex::count(ScriptState* scriptState, const ScriptValue& range, ExceptionState& exceptionState) { IDB_TRACE("IDBIndex::count"); if (isDeleted()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::indexDeletedErrorMessage); return 0; } - if (m_transaction->isFinished()) { + if (m_transaction->isFinished() || m_transaction->isFinishing()) { exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); return 0; } @@ -114,23 +126,28 @@ PassRefPtr<IDBRequest> IDBIndex::count(ExecutionContext* context, const ScriptVa return 0; } - RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); if (exceptionState.hadException()) return 0; - RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); - backendDB()->count(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange.release(), WebIDBCallbacksImpl::create(request).leakPtr()); + if (!backendDB()) { + exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); + return 0; + } + + IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get()); + backendDB()->count(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange, WebIDBCallbacksImpl::create(request).leakPtr()); return request; } -PassRefPtr<IDBRequest> IDBIndex::openKeyCursor(ExecutionContext* context, const ScriptValue& range, const String& directionString, ExceptionState& exceptionState) +IDBRequest* IDBIndex::openKeyCursor(ScriptState* scriptState, const ScriptValue& range, const String& directionString, ExceptionState& exceptionState) { IDB_TRACE("IDBIndex::openKeyCursor"); if (isDeleted()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::indexDeletedErrorMessage); return 0; } - if (m_transaction->isFinished()) { + if (m_transaction->isFinished() || m_transaction->isFinishing()) { exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); return 0; } @@ -138,57 +155,43 @@ PassRefPtr<IDBRequest> IDBIndex::openKeyCursor(ExecutionContext* context, const exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); return 0; } - IndexedDB::CursorDirection direction = IDBCursor::stringToDirection(directionString, exceptionState); + blink::WebIDBCursorDirection direction = IDBCursor::stringToDirection(directionString, exceptionState); if (exceptionState.hadException()) return 0; - RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, range, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), range, exceptionState); if (exceptionState.hadException()) return 0; + if (!backendDB()) { + exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); + return 0; + } - RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); + IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get()); request->setCursorDetails(IndexedDB::CursorKeyOnly, direction); - backendDB()->openCursor(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange.release(), direction, true, WebIDBDatabase::NormalTask, WebIDBCallbacksImpl::create(request).leakPtr()); + backendDB()->openCursor(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange, direction, true, blink::WebIDBTaskTypeNormal, WebIDBCallbacksImpl::create(request).leakPtr()); return request; } -PassRefPtr<IDBRequest> IDBIndex::get(ExecutionContext* context, const ScriptValue& key, ExceptionState& exceptionState) +IDBRequest* IDBIndex::get(ScriptState* scriptState, const ScriptValue& key, ExceptionState& exceptionState) { IDB_TRACE("IDBIndex::get"); - if (isDeleted()) { - exceptionState.throwDOMException(InvalidStateError, IDBDatabase::indexDeletedErrorMessage); - return 0; - } - if (m_transaction->isFinished()) { - exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); - return 0; - } - if (!m_transaction->isActive()) { - exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionInactiveErrorMessage); - return 0; - } - - RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, key, exceptionState); - if (exceptionState.hadException()) - return 0; - if (!keyRange) { - exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRangeErrorMessage); - return 0; - } - - RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); - backendDB()->get(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange.release(), false, WebIDBCallbacksImpl::create(request).leakPtr()); - return request; + return getInternal(scriptState, key, exceptionState, false); } -PassRefPtr<IDBRequest> IDBIndex::getKey(ExecutionContext* context, const ScriptValue& key, ExceptionState& exceptionState) +IDBRequest* IDBIndex::getKey(ScriptState* scriptState, const ScriptValue& key, ExceptionState& exceptionState) { IDB_TRACE("IDBIndex::getKey"); + return getInternal(scriptState, key, exceptionState, true); +} + +IDBRequest* IDBIndex::getInternal(ScriptState* scriptState, const ScriptValue& key, ExceptionState& exceptionState, bool keyOnly) +{ if (isDeleted()) { exceptionState.throwDOMException(InvalidStateError, IDBDatabase::indexDeletedErrorMessage); return 0; } - if (m_transaction->isFinished()) { + if (m_transaction->isFinished() || m_transaction->isFinishing()) { exceptionState.throwDOMException(TransactionInactiveError, IDBDatabase::transactionFinishedErrorMessage); return 0; } @@ -197,16 +200,20 @@ PassRefPtr<IDBRequest> IDBIndex::getKey(ExecutionContext* context, const ScriptV return 0; } - RefPtr<IDBKeyRange> keyRange = IDBKeyRange::fromScriptValue(context, key, exceptionState); + IDBKeyRange* keyRange = IDBKeyRange::fromScriptValue(scriptState->executionContext(), key, exceptionState); if (exceptionState.hadException()) return 0; if (!keyRange) { exceptionState.throwDOMException(DataError, IDBDatabase::noKeyOrKeyRangeErrorMessage); return 0; } + if (!backendDB()) { + exceptionState.throwDOMException(InvalidStateError, IDBDatabase::databaseClosedErrorMessage); + return 0; + } - RefPtr<IDBRequest> request = IDBRequest::create(context, IDBAny::create(this), m_transaction.get()); - backendDB()->get(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange.release(), true, WebIDBCallbacksImpl::create(request).leakPtr()); + IDBRequest* request = IDBRequest::create(scriptState, IDBAny::create(this), m_transaction.get()); + backendDB()->get(m_transaction->id(), m_objectStore->id(), m_metadata.id, keyRange, keyOnly, WebIDBCallbacksImpl::create(request).leakPtr()); return request; } |