Modules/indexeddb/shared/IDBGetAllRecordsData.cpp
Modules/indexeddb/shared/IDBGetRecordData.cpp
Modules/indexeddb/shared/IDBIndexInfo.cpp
+ Modules/indexeddb/shared/IDBIterateCursorData.cpp
Modules/indexeddb/shared/IDBObjectStoreInfo.cpp
Modules/indexeddb/shared/IDBRequestData.cpp
Modules/indexeddb/shared/IDBResourceIdentifier.cpp
+2016-11-09 Brady Eidson <beidson@apple.com>
+
+ IndexedDB 2.0: Encapsulate cursor iteration parameters for easy future expansion.
+ https://bugs.webkit.org/show_bug.cgi?id=164504
+
+ Reviewed by Darin Adler.
+
+ No new tests (Refactor, no behavior change).
+
+ This patch literally just takes the "key" and "count" arguments and encapsulates them in a struct.
+ That struct will then be easily expandable in the future (e.g. bug 164404).
+
+ * Modules/indexeddb/IDBCursor.cpp:
+ (WebCore::IDBCursor::uncheckedIterateCursor):
+
+ * Modules/indexeddb/IDBTransaction.cpp:
+ (WebCore::IDBTransaction::iterateCursor):
+ (WebCore::IDBTransaction::iterateCursorOnServer):
+ * Modules/indexeddb/IDBTransaction.h:
+
+ * Modules/indexeddb/client/IDBConnectionProxy.cpp:
+ (WebCore::IDBClient::IDBConnectionProxy::iterateCursor):
+ * Modules/indexeddb/client/IDBConnectionProxy.h:
+
+ * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+ (WebCore::IDBClient::IDBConnectionToServer::iterateCursor):
+ * Modules/indexeddb/client/IDBConnectionToServer.h:
+ * Modules/indexeddb/client/IDBConnectionToServerDelegate.h:
+
+ * Modules/indexeddb/server/IDBBackingStore.h:
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::iterateCursor):
+ * Modules/indexeddb/server/IDBServer.h:
+
+ * Modules/indexeddb/server/MemoryIDBBackingStore.cpp:
+ (WebCore::IDBServer::MemoryIDBBackingStore::iterateCursor):
+ * Modules/indexeddb/server/MemoryIDBBackingStore.h:
+
+ * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
+ (WebCore::IDBServer::SQLiteIDBBackingStore::iterateCursor):
+ * Modules/indexeddb/server/SQLiteIDBBackingStore.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::iterateCursor):
+ (WebCore::IDBServer::UniqueIDBDatabase::performIterateCursor):
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabaseTransaction::iterateCursor):
+ * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h:
+
+ * Modules/indexeddb/shared/IDBIterateCursorData.cpp: Added.
+ (WebCore::IDBIterateCursorData::isolatedCopy):
+ * Modules/indexeddb/shared/IDBIterateCursorData.h: Added.
+ (WebCore::IDBIterateCursorData::encode):
+ (WebCore::IDBIterateCursorData::decode):
+
+ * Modules/indexeddb/shared/InProcessIDBServer.cpp:
+ (WebCore::InProcessIDBServer::iterateCursor):
+ * Modules/indexeddb/shared/InProcessIDBServer.h:
+
+ * CMakeLists.txt:
+ * WebCore.xcodeproj/project.pbxproj:
+
2016-11-09 Ryosuke Niwa <rniwa@webkit.org>
StyledElement::attributeChanged shouldn't do any work when the attribute value didn't change
#include "IDBDatabaseException.h"
#include "IDBGetResult.h"
#include "IDBIndex.h"
+#include "IDBIterateCursorData.h"
#include "IDBObjectStore.h"
#include "IDBRequest.h"
#include "IDBTransaction.h"
++m_outstandingRequestCount;
m_request->willIterateCursor(*this);
- transaction().iterateCursor(*this, key, count);
+ transaction().iterateCursor(*this, { key, count });
}
ExceptionOr<Ref<WebCore::IDBRequest>> IDBCursor::deleteFunction(ExecState& state)
#include "IDBEventDispatcher.h"
#include "IDBGetRecordData.h"
#include "IDBIndex.h"
+#include "IDBIterateCursorData.h"
#include "IDBKeyData.h"
#include "IDBKeyRangeData.h"
#include "IDBObjectStore.h"
request.didOpenOrIterateCursor(resultData);
}
-void IDBTransaction::iterateCursor(IDBCursor& cursor, const IDBKeyData& key, unsigned long count)
+void IDBTransaction::iterateCursor(IDBCursor& cursor, const IDBIterateCursorData& data)
{
LOG(IndexedDB, "IDBTransaction::iterateCursor");
ASSERT(isActive());
addRequest(*cursor.request());
- scheduleOperation(IDBClient::createTransactionOperation(*this, *cursor.request(), &IDBTransaction::didIterateCursorOnServer, &IDBTransaction::iterateCursorOnServer, key, count));
+ scheduleOperation(IDBClient::createTransactionOperation(*this, *cursor.request(), &IDBTransaction::didIterateCursorOnServer, &IDBTransaction::iterateCursorOnServer, data));
}
-void IDBTransaction::iterateCursorOnServer(IDBClient::TransactionOperation& operation, const IDBKeyData& key, const unsigned long& count)
+// FIXME: changes here
+void IDBTransaction::iterateCursorOnServer(IDBClient::TransactionOperation& operation, const IDBIterateCursorData& data)
{
LOG(IndexedDB, "IDBTransaction::iterateCursorOnServer");
ASSERT(currentThread() == m_database->originThreadID());
- m_database->connectionProxy().iterateCursor(operation, key, count);
+ m_database->connectionProxy().iterateCursor(operation, data);
}
void IDBTransaction::didIterateCursorOnServer(IDBRequest& request, const IDBResultData& resultData)
class IDBResultData;
class SerializedScriptValue;
+struct IDBIterateCursorData;
struct IDBKeyRangeData;
namespace IDBClient {
Ref<IDBRequest> requestGetKey(JSC::ExecState&, IDBIndex&, const IDBKeyRangeData&);
Ref<IDBRequest> requestOpenCursor(JSC::ExecState&, IDBObjectStore&, const IDBCursorInfo&);
Ref<IDBRequest> requestOpenCursor(JSC::ExecState&, IDBIndex&, const IDBCursorInfo&);
- void iterateCursor(IDBCursor&, const IDBKeyData&, unsigned long count);
+ void iterateCursor(IDBCursor&, const IDBIterateCursorData&);
void deleteObjectStore(const String& objectStoreName);
void deleteIndex(uint64_t objectStoreIdentifier, const String& indexName);
void openCursorOnServer(IDBClient::TransactionOperation&, const IDBCursorInfo&);
void didOpenCursorOnServer(IDBRequest&, const IDBResultData&);
- void iterateCursorOnServer(IDBClient::TransactionOperation&, const IDBKeyData&, const unsigned long& count);
+ void iterateCursorOnServer(IDBClient::TransactionOperation&, const IDBIterateCursorData&);
void didIterateCursorOnServer(IDBRequest&, const IDBResultData&);
void transitionedToFinishing(IndexedDB::TransactionState);
#include "IDBCursorInfo.h"
#include "IDBDatabase.h"
#include "IDBGetRecordData.h"
+#include "IDBIterateCursorData.h"
#include "IDBKeyRangeData.h"
#include "IDBOpenDBRequest.h"
#include "IDBRequestData.h"
callConnectionOnMainThread(&IDBConnectionToServer::openCursor, requestData, info);
}
-void IDBConnectionProxy::iterateCursor(TransactionOperation& operation, const IDBKeyData& key, unsigned long count)
+void IDBConnectionProxy::iterateCursor(TransactionOperation& operation, const IDBIterateCursorData& data)
{
const IDBRequestData requestData { operation };
saveOperation(operation);
- callConnectionOnMainThread(&IDBConnectionToServer::iterateCursor, requestData, key, count);
+ callConnectionOnMainThread(&IDBConnectionToServer::iterateCursor, requestData, data);
}
void IDBConnectionProxy::saveOperation(TransactionOperation& operation)
class SecurityOrigin;
struct IDBGetRecordData;
+struct IDBIterateCursorData;
namespace IDBClient {
void getCount(TransactionOperation&, const IDBKeyRangeData&);
void deleteRecord(TransactionOperation&, const IDBKeyRangeData&);
void openCursor(TransactionOperation&, const IDBCursorInfo&);
- void iterateCursor(TransactionOperation&, const IDBKeyData&, unsigned long count);
+ void iterateCursor(TransactionOperation&, const IDBIterateCursorData&);
void renameObjectStore(TransactionOperation&, uint64_t objectStoreIdentifier, const String& newName);
void renameIndex(TransactionOperation&, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const String& newName);
m_proxy->completeOperation(resultData);
}
-void IDBConnectionToServer::iterateCursor(const IDBRequestData& requestData, const IDBKeyData& key, unsigned long count)
+void IDBConnectionToServer::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data)
{
LOG(IndexedDB, "IDBConnectionToServer::iterateCursor");
ASSERT(isMainThread());
- m_delegate->iterateCursor(requestData, key, count);
+ m_delegate->iterateCursor(requestData, data);
}
void IDBConnectionToServer::didIterateCursor(const IDBResultData& resultData)
struct IDBGetAllRecordsData;
struct IDBGetRecordData;
+struct IDBIterateCursorData;
namespace IDBClient {
void openCursor(const IDBRequestData&, const IDBCursorInfo&);
WEBCORE_EXPORT void didOpenCursor(const IDBResultData&);
- void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count);
+ void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&);
WEBCORE_EXPORT void didIterateCursor(const IDBResultData&);
void commitTransaction(const IDBResourceIdentifier& transactionIdentifier);
struct IDBGetAllRecordsData;
struct IDBGetRecordData;
+struct IDBIterateCursorData;
struct SecurityOriginData;
namespace IndexedDB {
virtual void getCount(const IDBRequestData&, const IDBKeyRangeData&) = 0;
virtual void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&) = 0;
virtual void openCursor(const IDBRequestData&, const IDBCursorInfo&) = 0;
- virtual void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count) = 0;
+ virtual void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&) = 0;
virtual void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&) = 0;
virtual void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) = 0;
class ThreadSafeDataBuffer;
struct IDBGetAllRecordsData;
+struct IDBIterateCursorData;
struct IDBKeyRangeData;
namespace IndexedDB {
virtual IDBError revertGeneratedKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t keyNumber) = 0;
virtual IDBError maybeUpdateKeyGeneratorNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, double newKeyNumber) = 0;
virtual IDBError openCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBCursorInfo&, IDBGetResult& outResult) = 0;
- virtual IDBError iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBKeyData&, uint32_t count, IDBGetResult& outResult) = 0;
+ virtual IDBError iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData&, IDBGetResult& outResult) = 0;
virtual IDBObjectStoreInfo* infoForObjectStore(uint64_t objectStoreIdentifier) = 0;
virtual void deleteBackingStore() = 0;
transaction->openCursor(requestData, info);
}
-void IDBServer::iterateCursor(const IDBRequestData& requestData, const IDBKeyData& key, unsigned long count)
+void IDBServer::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data)
{
LOG(IndexedDB, "IDBServer::iterateCursor");
if (!transaction)
return;
- transaction->iterateCursor(requestData, key, count);
+ transaction->iterateCursor(requestData, data);
}
void IDBServer::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo& info)
WEBCORE_EXPORT void getCount(const IDBRequestData&, const IDBKeyRangeData&);
WEBCORE_EXPORT void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&);
WEBCORE_EXPORT void openCursor(const IDBRequestData&, const IDBCursorInfo&);
- WEBCORE_EXPORT void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count);
+ WEBCORE_EXPORT void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&);
WEBCORE_EXPORT void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&);
WEBCORE_EXPORT void databaseConnectionClosed(uint64_t databaseConnectionIdentifier);
#include "IDBGetAllRecordsData.h"
#include "IDBGetResult.h"
#include "IDBIndexInfo.h"
+#include "IDBIterateCursorData.h"
#include "IDBKeyRangeData.h"
#include "Logging.h"
#include "MemoryIndexCursor.h"
return { };
}
-IDBError MemoryIDBBackingStore::iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBKeyData& key, uint32_t count, IDBGetResult& outData)
+IDBError MemoryIDBBackingStore::iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData& data, IDBGetResult& outData)
{
LOG(IndexedDB, "MemoryIDBBackingStore::iterateCursor");
if (!cursor)
return { IDBDatabaseException::UnknownError, ASCIILiteral("No backing store cursor found in which to iterate cursor") };
- cursor->iterate(key, count, outData);
+ cursor->iterate(data.keyData, data.count, outData);
return { };
}
IDBError revertGeneratedKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t keyNumber) final;
IDBError maybeUpdateKeyGeneratorNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, double newKeyNumber) final;
IDBError openCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBCursorInfo&, IDBGetResult& outResult) final;
- IDBError iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBKeyData&, uint32_t count, IDBGetResult& outResult) final;
+ IDBError iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData&, IDBGetResult& outResult) final;
IDBObjectStoreInfo* infoForObjectStore(uint64_t objectStoreIdentifier) final;
void deleteBackingStore() final;
#include "IDBGetAllRecordsData.h"
#include "IDBGetAllResult.h"
#include "IDBGetResult.h"
+#include "IDBIterateCursorData.h"
#include "IDBKeyData.h"
#include "IDBObjectStoreInfo.h"
#include "IDBSerialization.h"
return { };
}
-IDBError SQLiteIDBBackingStore::iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBKeyData& key, uint32_t count, IDBGetResult& result)
+IDBError SQLiteIDBBackingStore::iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData& data, IDBGetResult& result)
{
LOG(IndexedDB, "SQLiteIDBBackingStore::iterateCursor");
return { IDBDatabaseException::UnknownError, ASCIILiteral("Attempt to iterate a cursor without an in-progress transaction") };
}
+ auto key = data.keyData;
+ auto count = data.count;
+
if (key.isValid()) {
if (!cursor->iterate(key)) {
LOG_ERROR("Attempt to iterate cursor failed");
IDBError revertGeneratedKeyNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t keyNumber) final;
IDBError maybeUpdateKeyGeneratorNumber(const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, double newKeyNumber) final;
IDBError openCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBCursorInfo&, IDBGetResult& outResult) final;
- IDBError iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBKeyData&, uint32_t count, IDBGetResult& outResult) final;
+ IDBError iterateCursor(const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData&, IDBGetResult& outResult) final;
IDBObjectStoreInfo* infoForObjectStore(uint64_t objectStoreIdentifier) final;
void deleteBackingStore() final;
#include "IDBGetAllRecordsData.h"
#include "IDBGetAllResult.h"
#include "IDBGetRecordData.h"
+#include "IDBIterateCursorData.h"
#include "IDBKeyRangeData.h"
#include "IDBResultData.h"
#include "IDBServer.h"
performGetResultCallback(callbackIdentifier, error, result);
}
-void UniqueIDBDatabase::iterateCursor(const IDBRequestData& requestData, const IDBKeyData& key, unsigned long count, GetResultCallback callback)
+void UniqueIDBDatabase::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data, GetResultCallback callback)
{
ASSERT(isMainThread());
LOG(IndexedDB, "(main) UniqueIDBDatabase::iterateCursor");
uint64_t callbackID = storeCallbackOrFireError(callback);
if (!callbackID)
return;
- postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performIterateCursor, callbackID, requestData.transactionIdentifier(), requestData.cursorIdentifier(), key, count));
+ postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performIterateCursor, callbackID, requestData.transactionIdentifier(), requestData.cursorIdentifier(), data));
}
-void UniqueIDBDatabase::performIterateCursor(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBKeyData& key, unsigned long count)
+void UniqueIDBDatabase::performIterateCursor(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData& data)
{
ASSERT(!isMainThread());
LOG(IndexedDB, "(db) UniqueIDBDatabase::performIterateCursor");
IDBGetResult result;
- IDBError error = m_backingStore->iterateCursor(transactionIdentifier, cursorIdentifier, key, count, result);
+ IDBError error = m_backingStore->iterateCursor(transactionIdentifier, cursorIdentifier, data, result);
postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformIterateCursor, callbackIdentifier, error, result));
}
void getCount(const IDBRequestData&, const IDBKeyRangeData&, CountCallback);
void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&, ErrorCallback);
void openCursor(const IDBRequestData&, const IDBCursorInfo&, GetResultCallback);
- void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count, GetResultCallback);
+ void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&, GetResultCallback);
void commitTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback);
void abortTransaction(UniqueIDBDatabaseTransaction&, ErrorCallback);
void didFinishHandlingVersionChange(UniqueIDBDatabaseConnection&, const IDBResourceIdentifier& transactionIdentifier);
void performGetCount(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const IDBKeyRangeData&);
void performDeleteRecord(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyRangeData&);
void performOpenCursor(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBCursorInfo&);
- void performIterateCursor(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBKeyData&, unsigned long count);
+ void performIterateCursor(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBResourceIdentifier& cursorIdentifier, const IDBIterateCursorData&);
void performActivateTransactionInBackingStore(uint64_t callbackIdentifier, const IDBTransactionInfo&);
void performUnconditionalDeleteBackingStore();
#if ENABLE(INDEXED_DATABASE)
#include "IDBError.h"
+#include "IDBIterateCursorData.h"
#include "IDBResultData.h"
#include "IDBServer.h"
#include "Logging.h"
});
}
-void UniqueIDBDatabaseTransaction::iterateCursor(const IDBRequestData& requestData, const IDBKeyData& key, unsigned long count)
+void UniqueIDBDatabaseTransaction::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data)
{
LOG(IndexedDB, "UniqueIDBDatabaseTransaction::iterateCursor");
ASSERT(m_transactionInfo.identifier() == requestData.transactionIdentifier());
RefPtr<UniqueIDBDatabaseTransaction> protectedThis(this);
- m_databaseConnection->database().iterateCursor(requestData, key, count, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) {
+ m_databaseConnection->database().iterateCursor(requestData, data, [this, protectedThis, requestData](const IDBError& error, const IDBGetResult& result) {
LOG(IndexedDB, "UniqueIDBDatabaseTransaction::iterateCursor (callback)");
if (error.isNull())
struct IDBGetAllRecordsData;
struct IDBGetRecordData;
+struct IDBIterateCursorData;
struct IDBKeyRangeData;
namespace IDBServer {
void getCount(const IDBRequestData&, const IDBKeyRangeData&);
void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&);
void openCursor(const IDBRequestData&, const IDBCursorInfo&);
- void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count);
+ void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&);
void didActivateInBackingStore(const IDBError&);
--- /dev/null
+/*
+ * Copyright (C) 2016 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.
+ *
+ * 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.
+ */
+
+#include "config.h"
+#include "IDBIterateCursorData.h"
+
+#if ENABLE(INDEXED_DATABASE)
+
+namespace WebCore {
+
+IDBIterateCursorData IDBIterateCursorData::isolatedCopy() const
+{
+ return { keyData.isolatedCopy(), count };
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
--- /dev/null
+/*
+ * Copyright (C) 2016 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.
+ *
+ * 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.
+ */
+
+#pragma once
+
+#if ENABLE(INDEXED_DATABASE)
+
+#include "IDBKeyData.h"
+
+namespace WebCore {
+
+struct IDBIterateCursorData {
+ IDBKeyData keyData;
+ unsigned count;
+
+ IDBIterateCursorData isolatedCopy() const;
+
+ template<class Encoder> void encode(Encoder&) const;
+ template<class Decoder> static bool decode(Decoder&, IDBIterateCursorData&);
+};
+
+template<class Encoder>
+void IDBIterateCursorData::encode(Encoder& encoder) const
+{
+ encoder << keyData << static_cast<uint64_t>(count);
+}
+
+template<class Decoder>
+bool IDBIterateCursorData::decode(Decoder& decoder, IDBIterateCursorData& iteratorCursorData)
+{
+ if (!decoder.decode(iteratorCursorData.keyData))
+ return false;
+
+ uint64_t count;
+ if (!decoder.decode(count))
+ return false;
+
+ if (count > std::numeric_limits<unsigned>::max())
+ return false;
+
+ iteratorCursorData.count = static_cast<unsigned>(count);
+
+ return true;
+}
+
+} // namespace WebCore
+
+#endif // ENABLE(INDEXED_DATABASE)
#include "IDBConnectionToServer.h"
#include "IDBCursorInfo.h"
#include "IDBGetRecordData.h"
+#include "IDBIterateCursorData.h"
#include "IDBKeyRangeData.h"
#include "IDBOpenDBRequest.h"
#include "IDBRequestData.h"
});
}
-void InProcessIDBServer::iterateCursor(const IDBRequestData& requestData, const IDBKeyData& key, unsigned long count)
+void InProcessIDBServer::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data)
{
- RunLoop::current().dispatch([this, protectedThis = makeRef(*this), requestData, key, count] {
- m_server->iterateCursor(requestData, key, count);
+ RunLoop::current().dispatch([this, protectedThis = makeRef(*this), requestData, data] {
+ m_server->iterateCursor(requestData, data);
});
}
void getCount(const IDBRequestData&, const IDBKeyRangeData&) final;
void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&) final;
void openCursor(const IDBRequestData&, const IDBCursorInfo&) final;
- void iterateCursor(const IDBRequestData&, const IDBKeyData&, unsigned long count) final;
+ void iterateCursor(const IDBRequestData&, const IDBIterateCursorData&) final;
void establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo&) final;
void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) final;
void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const IDBResourceIdentifier& transactionIdentifier) final;
51E1ECC20C91C90400DC255B /* PageURLRecord.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E1ECBC0C91C90400DC255B /* PageURLRecord.cpp */; };
51E1ECC30C91C90400DC255B /* PageURLRecord.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E1ECBD0C91C90400DC255B /* PageURLRecord.h */; };
51E269331DD3BC4E006B6A58 /* JSIDBTransactionCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E269321DD3BC43006B6A58 /* JSIDBTransactionCustom.cpp */; };
+ 51E269361DD3BD97006B6A58 /* IDBIterateCursorData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 51E269341DD3BD91006B6A58 /* IDBIterateCursorData.cpp */; };
+ 51E269371DD3BD9B006B6A58 /* IDBIterateCursorData.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E269351DD3BD91006B6A58 /* IDBIterateCursorData.h */; settings = {ATTRIBUTES = (Private, ); }; };
51E399001D6E4750009C8831 /* GameControllerGamepad.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E398FC1D6E474B009C8831 /* GameControllerGamepad.h */; settings = {ATTRIBUTES = (Private, ); }; };
51E399011D6E4750009C8831 /* GameControllerGamepad.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51E398FD1D6E474B009C8831 /* GameControllerGamepad.mm */; };
51E399021D6E4750009C8831 /* GameControllerGamepadProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 51E398FE1D6E474B009C8831 /* GameControllerGamepadProvider.h */; settings = {ATTRIBUTES = (Private, ); }; };
51E1ECBC0C91C90400DC255B /* PageURLRecord.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = PageURLRecord.cpp; sourceTree = "<group>"; };
51E1ECBD0C91C90400DC255B /* PageURLRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PageURLRecord.h; sourceTree = "<group>"; };
51E269321DD3BC43006B6A58 /* JSIDBTransactionCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSIDBTransactionCustom.cpp; sourceTree = "<group>"; };
+ 51E269341DD3BD91006B6A58 /* IDBIterateCursorData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IDBIterateCursorData.cpp; sourceTree = "<group>"; };
+ 51E269351DD3BD91006B6A58 /* IDBIterateCursorData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IDBIterateCursorData.h; sourceTree = "<group>"; };
51E398FC1D6E474B009C8831 /* GameControllerGamepad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameControllerGamepad.h; sourceTree = "<group>"; };
51E398FD1D6E474B009C8831 /* GameControllerGamepad.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GameControllerGamepad.mm; sourceTree = "<group>"; };
51E398FE1D6E474B009C8831 /* GameControllerGamepadProvider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GameControllerGamepadProvider.h; sourceTree = "<group>"; };
5105F0681D4BA54100FB80BC /* IDBGetRecordData.h */,
51F798EB1BE880D3008AE491 /* IDBIndexInfo.cpp */,
51F798EC1BE880D3008AE491 /* IDBIndexInfo.h */,
+ 51E269341DD3BD91006B6A58 /* IDBIterateCursorData.cpp */,
+ 51E269351DD3BD91006B6A58 /* IDBIterateCursorData.h */,
5160712C1BD8307200DBC4F2 /* IDBObjectStoreInfo.cpp */,
5160712D1BD8307200DBC4F2 /* IDBObjectStoreInfo.h */,
510A58F51BACC4A500C19282 /* IDBRequestData.cpp */,
CD19A2681A13E700008D650E /* DiagnosticLoggingClient.h in Headers */,
46FCB6181A70820E00C5A21E /* DiagnosticLoggingKeys.h in Headers */,
8372DB311A6780A800C697C5 /* DiagnosticLoggingResultType.h in Headers */,
+ 51E269371DD3BD9B006B6A58 /* IDBIterateCursorData.h in Headers */,
CECADFC7153778FF00E37068 /* DictationAlternative.h in Headers */,
CECADFC9153778FF00E37068 /* DictationCommand.h in Headers */,
D0BD4F5D1408850F006839B6 /* DictationCommandIOS.h in Headers */,
6F995A371A70833700A735F4 /* JSWebGLTransformFeedback.cpp in Sources */,
0C45342710CDBBFA00869157 /* JSWebGLUniformLocation.cpp in Sources */,
6F995A391A70833700A735F4 /* JSWebGLVertexArrayObject.cpp in Sources */,
+ 51E269361DD3BD97006B6A58 /* IDBIterateCursorData.cpp in Sources */,
77EF62F312F9DB7400C77BD2 /* JSWebGLVertexArrayObjectOES.cpp in Sources */,
31C0FF3D0E4CEFAC007D6FE5 /* JSWebKitAnimationEvent.cpp in Sources */,
4983913F0F1E767500C23782 /* JSWebKitCSSMatrix.cpp in Sources */,
+2016-11-09 Brady Eidson <beidson@apple.com>
+
+ IndexedDB 2.0: Encapsulate cursor iteration parameters for easy future expansion.
+ https://bugs.webkit.org/show_bug.cgi?id=164504
+
+ Reviewed by Darin Adler.
+
+ * DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp:
+ (WebKit::WebIDBConnectionToClient::iterateCursor):
+ * DatabaseProcess/IndexedDB/WebIDBConnectionToClient.h:
+ * DatabaseProcess/IndexedDB/WebIDBConnectionToClient.messages.in:
+
+ * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
+ (WebKit::WebIDBConnectionToServer::iterateCursor):
+ * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h:
+
2016-11-09 Darin Adler <darin@apple.com>
Move Range from ExceptionCode to ExceptionOr
DatabaseProcess::singleton().idbServer().openCursor(request, info);
}
-void WebIDBConnectionToClient::iterateCursor(const IDBRequestData& request, const IDBKeyData& key, unsigned long count)
+void WebIDBConnectionToClient::iterateCursor(const IDBRequestData& request, const IDBIterateCursorData& data)
{
- DatabaseProcess::singleton().idbServer().iterateCursor(request, key, count);
+ DatabaseProcess::singleton().idbServer().iterateCursor(request, data);
}
void WebIDBConnectionToClient::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo& info)
class SerializedScriptValue;
struct IDBGetAllRecordsData;
struct IDBGetRecordData;
+struct IDBIterateCursorData;
struct IDBKeyRangeData;
struct SecurityOriginData;
}
void getCount(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&);
void deleteRecord(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&);
void openCursor(const WebCore::IDBRequestData&, const WebCore::IDBCursorInfo&);
- void iterateCursor(const WebCore::IDBRequestData&, const WebCore::IDBKeyData&, unsigned long count);
+ void iterateCursor(const WebCore::IDBRequestData&, const WebCore::IDBIterateCursorData&);
void establishTransaction(uint64_t databaseConnectionIdentifier, const WebCore::IDBTransactionInfo&);
void databaseConnectionClosed(uint64_t databaseConnectionIdentifier);
GetCount(WebCore::IDBRequestData requestData, struct WebCore::IDBKeyRangeData range);
DeleteRecord(WebCore::IDBRequestData requestData, struct WebCore::IDBKeyRangeData range);
OpenCursor(WebCore::IDBRequestData requestData, WebCore::IDBCursorInfo info);
- IterateCursor(WebCore::IDBRequestData requestData, WebCore::IDBKeyData key, uint32_t count);
+ IterateCursor(WebCore::IDBRequestData requestData, struct WebCore::IDBIterateCursorData data);
EstablishTransaction(uint64_t databaseConnectionIdentifier, WebCore::IDBTransactionInfo info);
DatabaseConnectionClosed(uint64_t databaseConnectionIdentifier);
#include <WebCore/IDBDatabaseException.h>
#include <WebCore/IDBError.h>
#include <WebCore/IDBIndexInfo.h>
+#include <WebCore/IDBIterateCursorData.h>
#include <WebCore/IDBKeyRangeData.h>
#include <WebCore/IDBObjectStoreInfo.h>
#include <WebCore/IDBOpenDBRequest.h>
send(Messages::WebIDBConnectionToClient::OpenCursor(requestData, info));
}
-void WebIDBConnectionToServer::iterateCursor(const IDBRequestData& requestData, const IDBKeyData& key, unsigned long count)
+void WebIDBConnectionToServer::iterateCursor(const IDBRequestData& requestData, const IDBIterateCursorData& data)
{
- send(Messages::WebIDBConnectionToClient::IterateCursor(requestData, key, count));
+ send(Messages::WebIDBConnectionToClient::IterateCursor(requestData, data));
}
void WebIDBConnectionToServer::establishTransaction(uint64_t databaseConnectionIdentifier, const IDBTransactionInfo& info)
void getCount(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&) final;
void deleteRecord(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&) final;
void openCursor(const WebCore::IDBRequestData&, const WebCore::IDBCursorInfo&) final;
- void iterateCursor(const WebCore::IDBRequestData&, const WebCore::IDBKeyData&, unsigned long count) final;
+ void iterateCursor(const WebCore::IDBRequestData&, const WebCore::IDBIterateCursorData&) final;
void establishTransaction(uint64_t databaseConnectionIdentifier, const WebCore::IDBTransactionInfo&) final;
void databaseConnectionClosed(uint64_t databaseConnectionIdentifier) final;
void abortOpenAndUpgradeNeeded(uint64_t databaseConnectionIdentifier, const WebCore::IDBResourceIdentifier& transactionIdentifier) final;