blob: 8f1298a4ac3755b95da32d0cd813e00d84bb7a02 [file] [log] [blame]
/*
* Copyright (C) 2013 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. ``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 COMPUTER, INC. OR
* 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 "WebIDBServerConnection.h"
#if ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)
#include "AsyncRequest.h"
#include "DataReference.h"
#include "DatabaseProcessIDBConnectionMessages.h"
#include "DatabaseToWebProcessConnectionMessages.h"
#include "Logging.h"
#include "SecurityOriginData.h"
#include "WebProcess.h"
#include "WebToDatabaseProcessConnection.h"
#include <WebCore/IDBDatabaseMetadata.h>
#include <WebCore/IDBKeyRangeData.h>
#include <WebCore/SecurityOrigin.h>
using namespace WebCore;
namespace WebKit {
static uint64_t generateServerConnectionIdentifier()
{
ASSERT(isMainThread());
static uint64_t identifier = 0;
return ++identifier;
}
PassRefPtr<WebIDBServerConnection> WebIDBServerConnection::create(const String& databaseName, const SecurityOrigin& openingOrigin, const SecurityOrigin& mainFrameOrigin)
{
RefPtr<WebIDBServerConnection> result = adoptRef(new WebIDBServerConnection(databaseName, openingOrigin, mainFrameOrigin));
WebProcess::shared().webToDatabaseProcessConnection()->registerWebIDBServerConnection(*result);
return result.release();
}
WebIDBServerConnection::WebIDBServerConnection(const String& databaseName, const SecurityOrigin& openingOrigin, const SecurityOrigin& mainFrameOrigin)
: m_serverConnectionIdentifier(generateServerConnectionIdentifier())
, m_databaseName(databaseName)
, m_openingOrigin(*openingOrigin.isolatedCopy())
, m_mainFrameOrigin(*mainFrameOrigin.isolatedCopy())
{
send(Messages::DatabaseToWebProcessConnection::EstablishIDBConnection(m_serverConnectionIdentifier));
send(Messages::DatabaseProcessIDBConnection::EstablishConnection(databaseName, SecurityOriginData::fromSecurityOrigin(&openingOrigin), SecurityOriginData::fromSecurityOrigin(&mainFrameOrigin)));
}
WebIDBServerConnection::~WebIDBServerConnection()
{
WebProcess::shared().webToDatabaseProcessConnection()->removeWebIDBServerConnection(*this);
for (const auto& it : m_serverRequests)
it.value->requestAborted();
}
bool WebIDBServerConnection::isClosed()
{
// FIXME: Return real value here.
return true;
}
void WebIDBServerConnection::deleteDatabase(const String& name, BoolCallbackFunction successCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<bool>::create(successCallback);
serverRequest->setAbortHandler([successCallback]() {
successCallback(false);
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess deleteDatabase request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::DeleteDatabase(requestID, name));
}
void WebIDBServerConnection::didDeleteDatabase(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didDeleteDatabase request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success);
}
void WebIDBServerConnection::getOrEstablishIDBDatabaseMetadata(GetIDBDatabaseMetadataFunction completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<const IDBDatabaseMetadata&, bool>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
IDBDatabaseMetadata metadata;
completionCallback(metadata, false);
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess getOrEstablishIDBDatabaseMetadata request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::GetOrEstablishIDBDatabaseMetadata(requestID));
}
void WebIDBServerConnection::didGetOrEstablishIDBDatabaseMetadata(uint64_t requestID, bool success, const IDBDatabaseMetadata& metadata)
{
LOG(IDB, "WebProcess didGetOrEstablishIDBDatabaseMetadata request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(metadata, success);
}
void WebIDBServerConnection::close()
{
}
void WebIDBServerConnection::openTransaction(int64_t transactionID, const HashSet<int64_t>& objectStoreIDs, IndexedDB::TransactionMode mode, BoolCallbackFunction successCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<bool>::create(successCallback);
serverRequest->setAbortHandler([successCallback]() {
successCallback(false);
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess openTransaction ID %lli (request ID %llu)", transactionID, requestID);
Vector<int64_t> objectStoreIDVector;
copyToVector(objectStoreIDs, objectStoreIDVector);
send(Messages::DatabaseProcessIDBConnection::OpenTransaction(requestID, transactionID, objectStoreIDVector, static_cast<uint64_t>(mode)));
}
void WebIDBServerConnection::didOpenTransaction(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didOpenTransaction request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success);
}
void WebIDBServerConnection::beginTransaction(int64_t transactionID, std::function<void()> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<>::create(completionCallback, completionCallback);
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess beginTransaction ID %lli (request ID %llu)", transactionID, requestID);
send(Messages::DatabaseProcessIDBConnection::BeginTransaction(requestID, transactionID));
}
void WebIDBServerConnection::didBeginTransaction(uint64_t requestID, bool)
{
LOG(IDB, "WebProcess didBeginTransaction request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest();
}
void WebIDBServerConnection::commitTransaction(int64_t transactionID, BoolCallbackFunction successCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<bool>::create(successCallback);
serverRequest->setAbortHandler([successCallback]() {
successCallback(false);
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess commitTransaction ID %lli (request ID %llu)", transactionID, requestID);
send(Messages::DatabaseProcessIDBConnection::CommitTransaction(requestID, transactionID));
}
void WebIDBServerConnection::didCommitTransaction(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didCommitTransaction request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success);
}
void WebIDBServerConnection::resetTransaction(int64_t transactionID, std::function<void()> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<>::create(completionCallback, completionCallback);
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess resetTransaction ID %lli (request ID %llu)", transactionID, requestID);
send(Messages::DatabaseProcessIDBConnection::ResetTransaction(requestID, transactionID));
}
void WebIDBServerConnection::didResetTransaction(uint64_t requestID, bool)
{
LOG(IDB, "WebProcess didResetTransaction request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest();
}
void WebIDBServerConnection::rollbackTransaction(int64_t transactionID, std::function<void()> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<>::create(completionCallback, completionCallback);
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess rollbackTransaction ID %lli (request ID %llu)", transactionID, requestID);
send(Messages::DatabaseProcessIDBConnection::RollbackTransaction(requestID, transactionID));
}
void WebIDBServerConnection::didRollbackTransaction(uint64_t requestID, bool)
{
LOG(IDB, "WebProcess didRollbackTransaction request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest();
}
void WebIDBServerConnection::setIndexKeys(int64_t transactionID, int64_t databaseID, int64_t objectStoreID, const IDBObjectStoreMetadata&, IDBKey& primaryKey, const Vector<int64_t>& indexIDs, const Vector<Vector<RefPtr<IDBKey>>>& indexKeys, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
}
void WebIDBServerConnection::createObjectStore(IDBTransactionBackend& transaction, const CreateObjectStoreOperation& operation, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBDatabaseError>>::create(completionCallback);
String objectStoreName = operation.objectStoreMetadata().name;
serverRequest->setAbortHandler([objectStoreName, completionCallback]() {
completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, String::format("Unknown error occured creating object store '%s'", objectStoreName.utf8().data())));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess createObjectStore '%s' in transaction ID %llu (request ID %llu)", operation.objectStoreMetadata().name.utf8().data(), transaction.id(), requestID);
send(Messages::DatabaseProcessIDBConnection::CreateObjectStore(requestID, transaction.id(), operation.objectStoreMetadata()));
}
void WebIDBServerConnection::didCreateObjectStore(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didCreateObjectStore request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured creating object store"));
}
void WebIDBServerConnection::createIndex(IDBTransactionBackend&transaction, const CreateIndexOperation& operation, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured creating index"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess create index request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::CreateIndex(requestID, transaction.id(), operation.objectStoreID(), operation.idbIndexMetadata()));
}
void WebIDBServerConnection::didCreateIndex(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didCreateIndex request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured creating index"));
}
void WebIDBServerConnection::deleteIndex(IDBTransactionBackend&transaction, const DeleteIndexOperation& operation, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting index"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess delete index request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::DeleteIndex(requestID, transaction.id(), operation.objectStoreID(), operation.idbIndexMetadata().id));
}
void WebIDBServerConnection::didDeleteIndex(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didDeleteIndex request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting index"));
}
void WebIDBServerConnection::get(IDBTransactionBackend& transaction, const GetOperation& operation, std::function<void(const IDBGetResult&, PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<const IDBGetResult&, PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(IDBGetResult(), IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured getting record"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess get request ID %llu", requestID);
ASSERT(operation.keyRange());
send(Messages::DatabaseProcessIDBConnection::GetRecord(requestID, transaction.id(), operation.objectStoreID(), operation.indexID(), operation.keyRange(), static_cast<int64_t>(operation.cursorType())));
}
void WebIDBServerConnection::put(IDBTransactionBackend& transaction, const PutOperation& operation, std::function<void(PassRefPtr<IDBKey>, PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBKey>, PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(nullptr, IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured putting record"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess put request ID %llu", requestID);
ASSERT(operation.value());
IPC::DataReference value(reinterpret_cast<const uint8_t*>(operation.value()->data()), operation.value()->size());
Vector<Vector<IDBKeyData>> indexKeys;
for (auto keys : operation.indexKeys()) {
indexKeys.append(Vector<IDBKeyData>());
for (auto key : keys)
indexKeys.last().append(IDBKeyData(key.get()));
}
send(Messages::DatabaseProcessIDBConnection::PutRecord(requestID, transaction.id(), operation.objectStore().id, IDBKeyData(operation.key()), value, operation.putMode(), operation.indexIDs(), indexKeys));
}
void WebIDBServerConnection::didPutRecord(uint64_t requestID, const WebCore::IDBKeyData& resultKey, uint32_t errorCode, const String& errorMessage)
{
LOG(IDB, "WebProcess didPutRecord request ID %llu (error - %s)", requestID, errorMessage.utf8().data());
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(resultKey.isNull ? nullptr : resultKey.maybeCreateIDBKey(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
}
void WebIDBServerConnection::didGetRecord(uint64_t requestID, const WebCore::IDBGetResult& getResult, uint32_t errorCode, const String& errorMessage)
{
LOG(IDB, "WebProcess didGetRecord request ID %llu (error - %s)", requestID, errorMessage.utf8().data());
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(getResult, errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
}
void WebIDBServerConnection::didOpenCursor(uint64_t requestID, int64_t cursorID, WebCore::IDBKeyData& key, WebCore::IDBKeyData& primaryKey, const IPC::DataReference& valueData, uint32_t errorCode, const String& errorMessage)
{
LOG(IDB, "WebProcess didOpenCursor request ID %llu (error - %s)", requestID, errorMessage.utf8().data());
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
RefPtr<SharedBuffer> value = SharedBuffer::create(valueData.data(), valueData.size());
serverRequest->completeRequest(cursorID, key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
}
void WebIDBServerConnection::didAdvanceCursor(uint64_t requestID, WebCore::IDBKeyData& key, WebCore::IDBKeyData& primaryKey, const IPC::DataReference& valueData, uint32_t errorCode, const String& errorMessage)
{
LOG(IDB, "WebProcess didAdvanceCursor request ID %llu (error - %s)", requestID, errorMessage.utf8().data());
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
RefPtr<SharedBuffer> value = SharedBuffer::create(valueData.data(), valueData.size());
serverRequest->completeRequest(key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
}
void WebIDBServerConnection::didIterateCursor(uint64_t requestID, WebCore::IDBKeyData& key, WebCore::IDBKeyData& primaryKey, const IPC::DataReference& valueData, uint32_t errorCode, const String& errorMessage)
{
LOG(IDB, "WebProcess didIterateCursor request ID %llu (error - %s)", requestID, errorMessage.utf8().data());
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
RefPtr<SharedBuffer> value = SharedBuffer::create(valueData.data(), valueData.size());
serverRequest->completeRequest(key.maybeCreateIDBKey(), primaryKey.maybeCreateIDBKey(), value.release(), errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
}
void WebIDBServerConnection::count(IDBTransactionBackend& transaction, const CountOperation& operation, std::function<void(int64_t, PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<int64_t, PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(0, IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured getting count"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess count request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::Count(requestID, transaction.id(), operation.objectStoreID(), operation.indexID(), IDBKeyRangeData(operation.keyRange())));
}
void WebIDBServerConnection::didCount(uint64_t requestID, int64_t count, uint32_t errorCode, const String& errorMessage)
{
LOG(IDB, "WebProcess didCount %lli request ID %llu (error - %s)", count, requestID, errorMessage.utf8().data());
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(count, errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
}
void WebIDBServerConnection::deleteRange(IDBTransactionBackend& transaction, const DeleteRangeOperation& operation, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured getting count"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess deleteRange request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::DeleteRange(requestID, transaction.id(), operation.objectStoreID(), IDBKeyRangeData(operation.keyRange())));
}
void WebIDBServerConnection::didDeleteRange(uint64_t requestID, uint32_t errorCode, const String& errorMessage)
{
LOG(IDB, "WebProcess didDeleteRange request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(errorCode ? IDBDatabaseError::create(errorCode, errorMessage) : nullptr);
}
void WebIDBServerConnection::clearObjectStore(IDBTransactionBackend&, const ClearObjectStoreOperation& operation, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured clearing object store"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess clearObjectStore request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::ClearObjectStore(requestID, operation.transaction()->id(), operation.objectStoreID()));
}
void WebIDBServerConnection::didClearObjectStore(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didClearObjectStore request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured clearing object store"));
}
void WebIDBServerConnection::deleteObjectStore(IDBTransactionBackend&, const DeleteObjectStoreOperation& operation, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting object store"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess deleteObjectStore request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::DeleteObjectStore(requestID, operation.transaction()->id(), operation.objectStoreMetadata().id));
}
void WebIDBServerConnection::didDeleteObjectStore(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didDeleteObjectStore request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured deleting object store"));
}
void WebIDBServerConnection::changeDatabaseVersion(IDBTransactionBackend&, const IDBDatabaseBackend::VersionChangeOperation& operation, std::function<void(PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured changing database version"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess changeDatabaseVersion request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::ChangeDatabaseVersion(requestID, operation.transaction()->id(), static_cast<uint64_t>(operation.version())));
}
void WebIDBServerConnection::didChangeDatabaseVersion(uint64_t requestID, bool success)
{
LOG(IDB, "WebProcess didChangeDatabaseVersion request ID %llu", requestID);
RefPtr<AsyncRequest> serverRequest = m_serverRequests.take(requestID);
if (!serverRequest)
return;
serverRequest->completeRequest(success ? nullptr : IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured changing database version"));
}
void WebIDBServerConnection::openCursor(IDBTransactionBackend&, const OpenCursorOperation& operation, std::function<void(int64_t, PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SharedBuffer>, PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<int64_t, PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SharedBuffer>, PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(0, nullptr, nullptr, nullptr, IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured opening database cursor"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess openCursor request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::OpenCursor(requestID, operation.transactionID(), operation.objectStoreID(), operation.indexID(), static_cast<int64_t>(operation.direction()), static_cast<int64_t>(operation.cursorType()), static_cast<int64_t>(operation.taskType()), operation.keyRange()));
}
void WebIDBServerConnection::cursorAdvance(IDBCursorBackend&, const CursorAdvanceOperation& operation, std::function<void(PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SharedBuffer>, PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SharedBuffer>, PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(nullptr, nullptr, nullptr, IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured advancing database cursor"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess cursorAdvance request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::CursorAdvance(requestID, operation.cursorID(), operation.count()));
}
void WebIDBServerConnection::cursorIterate(IDBCursorBackend&, const CursorIterationOperation& operation, std::function<void(PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SharedBuffer>, PassRefPtr<IDBDatabaseError>)> completionCallback)
{
RefPtr<AsyncRequest> serverRequest = AsyncRequestImpl<PassRefPtr<IDBKey>, PassRefPtr<IDBKey>, PassRefPtr<SharedBuffer>, PassRefPtr<IDBDatabaseError>>::create(completionCallback);
serverRequest->setAbortHandler([completionCallback]() {
completionCallback(nullptr, nullptr, nullptr, IDBDatabaseError::create(IDBDatabaseException::UnknownError, "Unknown error occured iterating database cursor"));
});
uint64_t requestID = serverRequest->requestID();
ASSERT(!m_serverRequests.contains(requestID));
m_serverRequests.add(requestID, serverRequest.release());
LOG(IDB, "WebProcess cursorIterate request ID %llu", requestID);
send(Messages::DatabaseProcessIDBConnection::CursorIterate(requestID, operation.cursorID(), operation.key()));
}
IPC::Connection* WebIDBServerConnection::messageSenderConnection()
{
return WebProcess::shared().webToDatabaseProcessConnection()->connection();
}
} // namespace WebKit
#endif // ENABLE(INDEXED_DATABASE) && ENABLE(DATABASE_PROCESS)