Diff
Modified: trunk/Source/WebCore/ChangeLog (199071 => 199072)
--- trunk/Source/WebCore/ChangeLog 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/ChangeLog 2016-04-05 21:27:05 UTC (rev 199072)
@@ -1,3 +1,55 @@
+2016-04-05 Brady Eidson <beid...@apple.com>
+
+ Modern IDB: Replace use of SerializedScriptValue with IDBValue.
+ https://bugs.webkit.org/show_bug.cgi?id=156242
+
+ Reviewed by Alex Christensen.
+
+ No new tests (No change in behavior).
+
+ * Modules/indexeddb/IDBTransaction.cpp:
+ (WebCore::IDBTransaction::putOrAddOnServer):
+
+ * Modules/indexeddb/IDBValue.cpp:
+ (WebCore::IDBValue::IDBValue):
+ (WebCore::IDBValue::isolatedCopy):
+ * Modules/indexeddb/IDBValue.h:
+ (WebCore::IDBValue::data):
+ (WebCore::IDBValue::encode):
+ (WebCore::IDBValue::decode):
+
+ * Modules/indexeddb/client/IDBConnectionToServer.cpp:
+ (WebCore::IDBClient::IDBConnectionToServer::putOrAdd):
+ * Modules/indexeddb/client/IDBConnectionToServer.h:
+ * Modules/indexeddb/client/IDBConnectionToServerDelegate.h:
+
+ * Modules/indexeddb/server/IDBServer.cpp:
+ (WebCore::IDBServer::IDBServer::putOrAdd):
+ * Modules/indexeddb/server/IDBServer.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::putOrAdd):
+ (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd):
+ * Modules/indexeddb/server/UniqueIDBDatabase.h:
+
+ * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabaseTransaction::putOrAdd):
+ * Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h:
+
+ * Modules/indexeddb/shared/InProcessIDBServer.cpp:
+ (WebCore::InProcessIDBServer::putOrAdd):
+ * Modules/indexeddb/shared/InProcessIDBServer.h:
+
+ * WebCore.xcodeproj/project.pbxproj:
+
+ * platform/CrossThreadCopier.cpp:
+ (WebCore::IDBValue>::copy):
+ * platform/CrossThreadCopier.h:
+
+ * platform/ThreadSafeDataBuffer.h:
+ (WebCore::ThreadSafeDataBuffer::encode):
+ (WebCore::ThreadSafeDataBuffer::decode):
+
2016-04-05 Said Abou-Hallawa <sabouhall...@apple.com>
Avoid context save/restore in GraphicsContext::drawNativeImage
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -42,6 +42,7 @@
#include "IDBOpenDBRequest.h"
#include "IDBRequest.h"
#include "IDBResultData.h"
+#include "IDBValue.h"
#include "JSDOMWindowBase.h"
#include "Logging.h"
#include "ScriptExecutionContext.h"
@@ -869,6 +870,11 @@
ASSERT(!isReadOnly());
ASSERT(value);
+ if (!value->hasBlobURLs()) {
+ serverConnection().putOrAdd(operation, key.get(), *value, overwriteMode);
+ return;
+ }
+
RefPtr<IDBTransaction> protector(this);
RefPtr<IDBClient::TransactionOperation> operationRef(&operation);
value->writeBlobsToDiskForIndexedDB([protector, this, operationRef, key, value, overwriteMode](const IDBValue&) {
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBValue.cpp (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/IDBValue.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBValue.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -28,12 +28,26 @@
#if ENABLE(INDEXED_DATABASE)
+#include "SerializedScriptValue.h"
+
namespace WebCore {
IDBValue::IDBValue()
{
}
+IDBValue::IDBValue(const SerializedScriptValue& scriptValue)
+ : m_data(ThreadSafeDataBuffer::copyVector(scriptValue.data()))
+{
+}
+
+IDBValue IDBValue::isolatedCopy() const
+{
+ IDBValue result;
+ result.m_data = m_data;
+ return result;
+}
+
} // namespace WebCore
#endif // ENABLE(INDEXED_DATABASE)
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBValue.h (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/IDBValue.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBValue.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -26,13 +26,44 @@
#pragma once
#if ENABLE(INDEXED_DATABASE)
+#include "ThreadSafeDataBuffer.h"
+
namespace WebCore {
+class SerializedScriptValue;
+
class IDBValue {
public:
- IDBValue();
+ WEBCORE_EXPORT IDBValue();
+ IDBValue(const SerializedScriptValue&);
+
+ IDBValue isolatedCopy() const;
+
+ const ThreadSafeDataBuffer& data() const { return m_data; }
+
+ template<class Encoder> void encode(Encoder&) const;
+ template<class Decoder> static bool decode(Decoder&, IDBValue&);
+
+private:
+ ThreadSafeDataBuffer m_data;
};
+
+template<class Encoder>
+void IDBValue::encode(Encoder& encoder) const
+{
+ encoder << m_data;
+}
+
+template<class Decoder>
+bool IDBValue::decode(Decoder& decoder, IDBValue& result)
+{
+ if (!decoder.decode(result.m_data))
+ return false;
+
+ return true;
+}
+
} // namespace WebCore
#endif // ENABLE(INDEXED_DATABASE)
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -171,7 +171,7 @@
completeOperation(resultData);
}
-void IDBConnectionToServer::putOrAdd(TransactionOperation& operation, IDBKey* key, SerializedScriptValue& value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
+void IDBConnectionToServer::putOrAdd(TransactionOperation& operation, IDBKey* key, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
{
LOG(IndexedDB, "IDBConnectionToServer::putOrAdd");
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServer.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -45,6 +45,7 @@
class IDBOpenDBRequest;
class IDBResultData;
class IDBTransaction;
+class IDBValue;
namespace IDBClient {
@@ -77,7 +78,7 @@
void deleteIndex(TransactionOperation&, uint64_t objectStoreIdentifier, const String& indexName);
WEBCORE_EXPORT void didDeleteIndex(const IDBResultData&);
- void putOrAdd(TransactionOperation&, IDBKey*, SerializedScriptValue&, const IndexedDB::ObjectStoreOverwriteMode);
+ void putOrAdd(TransactionOperation&, IDBKey*, const IDBValue&, const IndexedDB::ObjectStoreOverwriteMode);
WEBCORE_EXPORT void didPutOrAdd(const IDBResultData&);
void getRecord(TransactionOperation&, const IDBKeyRangeData&);
Modified: trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/client/IDBConnectionToServerDelegate.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -40,7 +40,7 @@
class IDBRequestData;
class IDBResourceIdentifier;
class IDBTransactionInfo;
-class SerializedScriptValue;
+class IDBValue;
namespace IndexedDB {
enum class ObjectStoreOverwriteMode;
@@ -65,7 +65,7 @@
virtual void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier) = 0;
virtual void createIndex(const IDBRequestData&, const IDBIndexInfo&) = 0;
virtual void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName) = 0;
- virtual void putOrAdd(const IDBRequestData&, IDBKey*, SerializedScriptValue&, const IndexedDB::ObjectStoreOverwriteMode) = 0;
+ virtual void putOrAdd(const IDBRequestData&, IDBKey*, const IDBValue&, const IndexedDB::ObjectStoreOverwriteMode) = 0;
virtual void getRecord(const IDBRequestData&, const IDBKeyRangeData&) = 0;
virtual void getCount(const IDBRequestData&, const IDBKeyRangeData&) = 0;
virtual void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&) = 0;
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -238,7 +238,7 @@
transaction->deleteIndex(requestData, objectStoreIdentifier, indexName);
}
-void IDBServer::putOrAdd(const IDBRequestData& requestData, const IDBKeyData& keyData, const ThreadSafeDataBuffer& valueData, IndexedDB::ObjectStoreOverwriteMode overwriteMode)
+void IDBServer::putOrAdd(const IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, IndexedDB::ObjectStoreOverwriteMode overwriteMode)
{
LOG(IndexedDB, "IDBServer::putOrAdd");
@@ -246,7 +246,7 @@
if (!transaction)
return;
- transaction->putOrAdd(requestData, keyData, valueData, overwriteMode);
+ transaction->putOrAdd(requestData, keyData, value, overwriteMode);
}
void IDBServer::getRecord(const IDBRequestData& requestData, const IDBKeyRangeData& keyRangeData)
Modified: trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/server/IDBServer.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -45,6 +45,7 @@
class CrossThreadTask;
class IDBCursorInfo;
class IDBRequestData;
+class IDBValue;
namespace IDBServer {
@@ -67,7 +68,7 @@
WEBCORE_EXPORT void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier);
WEBCORE_EXPORT void createIndex(const IDBRequestData&, const IDBIndexInfo&);
WEBCORE_EXPORT void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName);
- WEBCORE_EXPORT void putOrAdd(const IDBRequestData&, const IDBKeyData&, const ThreadSafeDataBuffer& valueData, IndexedDB::ObjectStoreOverwriteMode);
+ WEBCORE_EXPORT void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode);
WEBCORE_EXPORT void getRecord(const IDBRequestData&, const IDBKeyRangeData&);
WEBCORE_EXPORT void getCount(const IDBRequestData&, const IDBKeyRangeData&);
WEBCORE_EXPORT void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -33,6 +33,7 @@
#include "IDBResultData.h"
#include "IDBServer.h"
#include "IDBTransactionInfo.h"
+#include "IDBValue.h"
#include "Logging.h"
#include "ScopeGuard.h"
#include "UniqueIDBDatabaseConnection.h"
@@ -683,13 +684,13 @@
performErrorCallback(callbackIdentifier, error);
}
-void UniqueIDBDatabase::putOrAdd(const IDBRequestData& requestData, const IDBKeyData& keyData, const ThreadSafeDataBuffer& valueData, IndexedDB::ObjectStoreOverwriteMode overwriteMode, KeyDataCallback callback)
+void UniqueIDBDatabase::putOrAdd(const IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, IndexedDB::ObjectStoreOverwriteMode overwriteMode, KeyDataCallback callback)
{
ASSERT(isMainThread());
LOG(IndexedDB, "(main) UniqueIDBDatabase::putOrAdd");
uint64_t callbackID = storeCallback(callback);
- m_server.postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performPutOrAdd, callbackID, requestData.transactionIdentifier(), requestData.objectStoreIdentifier(), keyData, valueData, overwriteMode));
+ m_server.postDatabaseTask(createCrossThreadTask(*this, &UniqueIDBDatabase::performPutOrAdd, callbackID, requestData.transactionIdentifier(), requestData.objectStoreIdentifier(), keyData, value, overwriteMode));
}
VM& UniqueIDBDatabase::databaseThreadVM()
@@ -709,7 +710,7 @@
return *globalObject.get()->globalExec();
}
-void UniqueIDBDatabase::performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData& keyData, const ThreadSafeDataBuffer& originalRecordValue, IndexedDB::ObjectStoreOverwriteMode overwriteMode)
+void UniqueIDBDatabase::performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData& keyData, const IDBValue& originalRecordValue, IndexedDB::ObjectStoreOverwriteMode overwriteMode)
{
ASSERT(!isMainThread());
LOG(IndexedDB, "(db) UniqueIDBDatabase::performPutOrAdd");
@@ -764,7 +765,7 @@
if (usedKeyIsGenerated && !objectStoreInfo->keyPath().isNull()) {
JSLockHolder locker(databaseThreadVM());
- JSValue value = deserializeIDBValueDataToJSValue(databaseThreadExecState(), originalRecordValue);
+ JSValue value = deserializeIDBValueDataToJSValue(databaseThreadExecState(), originalRecordValue.data());
if (value.isUndefined()) {
m_server.postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformPutOrAdd, callbackIdentifier, IDBError(IDBDatabaseException::ConstraintError, ASCIILiteral("Unable to deserialize record value for record key injection")), usedKey));
return;
@@ -794,7 +795,7 @@
return;
}
- error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, injectedRecordValue.data() ? injectedRecordValue : originalRecordValue);
+ error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, injectedRecordValue.data() ? injectedRecordValue : originalRecordValue.data());
if (!error.isNull()) {
m_server.postDatabaseTaskReply(createCrossThreadTask(*this, &UniqueIDBDatabase::didPerformPutOrAdd, callbackIdentifier, error, usedKey));
return;
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -85,7 +85,7 @@
void clearObjectStore(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, ErrorCallback);
void createIndex(UniqueIDBDatabaseTransaction&, const IDBIndexInfo&, ErrorCallback);
void deleteIndex(UniqueIDBDatabaseTransaction&, uint64_t objectStoreIdentifier, const String& indexName, ErrorCallback);
- void putOrAdd(const IDBRequestData&, const IDBKeyData&, const ThreadSafeDataBuffer& valueData, IndexedDB::ObjectStoreOverwriteMode, KeyDataCallback);
+ void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode, KeyDataCallback);
void getRecord(const IDBRequestData&, const IDBKeyRangeData&, GetResultCallback);
void getCount(const IDBRequestData&, const IDBKeyRangeData&, CountCallback);
void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&, ErrorCallback);
@@ -134,7 +134,7 @@
void performClearObjectStore(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier);
void performCreateIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, const IDBIndexInfo&);
void performDeleteIndex(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier);
- void performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData&, const ThreadSafeDataBuffer& valueData, IndexedDB::ObjectStoreOverwriteMode);
+ void performPutOrAdd(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode);
void performGetRecord(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, const IDBKeyRangeData&);
void performGetIndexRecord(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, IndexedDB::IndexRecordType, const IDBKeyRangeData&);
void performGetCount(uint64_t callbackIdentifier, const IDBResourceIdentifier& transactionIdentifier, uint64_t objectStoreIdentifier, uint64_t indexIdentifier, const IDBKeyRangeData&);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -187,7 +187,7 @@
});
}
-void UniqueIDBDatabaseTransaction::putOrAdd(const IDBRequestData& requestData, const IDBKeyData& keyData, const ThreadSafeDataBuffer& valueData, IndexedDB::ObjectStoreOverwriteMode overwriteMode)
+void UniqueIDBDatabaseTransaction::putOrAdd(const IDBRequestData& requestData, const IDBKeyData& keyData, const IDBValue& value, IndexedDB::ObjectStoreOverwriteMode overwriteMode)
{
LOG(IndexedDB, "UniqueIDBDatabaseTransaction::putOrAdd");
@@ -195,7 +195,7 @@
ASSERT(m_transactionInfo.identifier() == requestData.transactionIdentifier());
RefPtr<UniqueIDBDatabaseTransaction> self(this);
- m_databaseConnection->database().putOrAdd(requestData, keyData, valueData, overwriteMode, [this, self, requestData](const IDBError& error, const IDBKeyData& key) {
+ m_databaseConnection->database().putOrAdd(requestData, keyData, value, overwriteMode, [this, self, requestData](const IDBError& error, const IDBKeyData& key) {
LOG(IndexedDB, "UniqueIDBDatabaseTransaction::putOrAdd (callback)");
if (error.isNull())
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabaseTransaction.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -42,7 +42,7 @@
class IDBKeyData;
class IDBObjectStoreInfo;
class IDBRequestData;
-class ThreadSafeDataBuffer;
+class IDBValue;
struct IDBKeyRangeData;
@@ -72,7 +72,7 @@
void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier);
void createIndex(const IDBRequestData&, const IDBIndexInfo&);
void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName);
- void putOrAdd(const IDBRequestData&, const IDBKeyData&, const ThreadSafeDataBuffer& valueData, IndexedDB::ObjectStoreOverwriteMode);
+ void putOrAdd(const IDBRequestData&, const IDBKeyData&, const IDBValue&, IndexedDB::ObjectStoreOverwriteMode);
void getRecord(const IDBRequestData&, const IDBKeyRangeData&);
void getCount(const IDBRequestData&, const IDBKeyRangeData&);
void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&);
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -35,6 +35,7 @@
#include "IDBOpenDBRequest.h"
#include "IDBRequestData.h"
#include "IDBResultData.h"
+#include "IDBValue.h"
#include "Logging.h"
#include <wtf/RunLoop.h>
@@ -287,14 +288,13 @@
});
}
-void InProcessIDBServer::putOrAdd(const IDBRequestData& requestData, IDBKey* key, SerializedScriptValue& value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
+void InProcessIDBServer::putOrAdd(const IDBRequestData& requestData, IDBKey* key, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode overwriteMode)
{
RefPtr<InProcessIDBServer> self(this);
IDBKeyData keyData(key);
- auto valueData = ThreadSafeDataBuffer::copyVector(value.data());
- RunLoop::current().dispatch([this, self, requestData, keyData, valueData, overwriteMode] {
- m_server->putOrAdd(requestData, keyData, valueData, overwriteMode);
+ RunLoop::current().dispatch([this, self, requestData, keyData, value, overwriteMode] {
+ m_server->putOrAdd(requestData, keyData, value, overwriteMode);
});
}
Modified: trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h (199071 => 199072)
--- trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/Modules/indexeddb/shared/InProcessIDBServer.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -65,7 +65,7 @@
void clearObjectStore(const IDBRequestData&, uint64_t objectStoreIdentifier) final;
void createIndex(const IDBRequestData&, const IDBIndexInfo&) final;
void deleteIndex(const IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName) final;
- void putOrAdd(const IDBRequestData&, IDBKey*, SerializedScriptValue&, const IndexedDB::ObjectStoreOverwriteMode) final;
+ void putOrAdd(const IDBRequestData&, IDBKey*, const IDBValue&, const IndexedDB::ObjectStoreOverwriteMode) final;
void getRecord(const IDBRequestData&, const IDBKeyRangeData&) final;
void getCount(const IDBRequestData&, const IDBKeyRangeData&) final;
void deleteRecord(const IDBRequestData&, const IDBKeyRangeData&) final;
Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (199071 => 199072)
--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj 2016-04-05 21:27:05 UTC (rev 199072)
@@ -2045,7 +2045,7 @@
5160712F1BD8307800DBC4F2 /* IDBObjectStoreInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 5160712D1BD8307200DBC4F2 /* IDBObjectStoreInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
516071321BD8308B00DBC4F2 /* TransactionOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 5160712B1BD8305300DBC4F2 /* TransactionOperation.h */; settings = {ATTRIBUTES = (Private, ); }; };
5160F4980B0AA75F00C1D2AF /* HistoryItemMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5160F4970B0AA75F00C1D2AF /* HistoryItemMac.mm */; };
- 516103AF1CADBA770016B4C7 /* IDBValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 516103AE1CADB9A30016B4C7 /* IDBValue.h */; };
+ 516103AF1CADBA770016B4C7 /* IDBValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 516103AE1CADB9A30016B4C7 /* IDBValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
516103B01CADBA7A0016B4C7 /* IDBValue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 516103AD1CADB9A30016B4C7 /* IDBValue.cpp */; };
5162C7F411F77EFB00612EFE /* SchemeRegistry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5162C7F211F77EFA00612EFE /* SchemeRegistry.cpp */; };
5162C7F511F77EFB00612EFE /* SchemeRegistry.h in Headers */ = {isa = PBXBuildFile; fileRef = 5162C7F311F77EFB00612EFE /* SchemeRegistry.h */; settings = {ATTRIBUTES = (Private, ); }; };
Modified: trunk/Source/WebCore/platform/CrossThreadCopier.cpp (199071 => 199072)
--- trunk/Source/WebCore/platform/CrossThreadCopier.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -54,6 +54,7 @@
#include "IDBObjectStoreInfo.h"
#include "IDBResourceIdentifier.h"
#include "IDBTransactionInfo.h"
+#include "IDBValue.h"
#endif
namespace WebCore {
@@ -165,6 +166,11 @@
return info.isolatedCopy();
}
+CrossThreadCopierBase<false, false, IDBValue>::Type CrossThreadCopierBase<false, false, IDBValue>::copy(const IDBValue& value)
+{
+ return value.isolatedCopy();
+}
+
#endif // ENABLE(INDEXED_DATABASE)
// Test CrossThreadCopier using COMPILE_ASSERT.
Modified: trunk/Source/WebCore/platform/CrossThreadCopier.h (199071 => 199072)
--- trunk/Source/WebCore/platform/CrossThreadCopier.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/platform/CrossThreadCopier.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -227,6 +227,12 @@
static Type copy(const IDBCursorInfo&);
};
+ class IDBValue;
+ template<> struct WEBCORE_EXPORT CrossThreadCopierBase<false, false, IDBValue> {
+ typedef IDBValue Type;
+ static Type copy(const IDBValue&);
+ };
+
#endif
template<typename T>
Modified: trunk/Source/WebCore/platform/ThreadSafeDataBuffer.h (199071 => 199072)
--- trunk/Source/WebCore/platform/ThreadSafeDataBuffer.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebCore/platform/ThreadSafeDataBuffer.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -71,6 +71,9 @@
return m_impl ? &m_impl->m_data : nullptr;
}
+ template<class Encoder> void encode(Encoder&) const;
+ template<class Decoder> static bool decode(Decoder&, ThreadSafeDataBuffer&);
+
private:
explicit ThreadSafeDataBuffer(Vector<uint8_t>& data, ThreadSafeDataBufferImpl::AdoptVectorTag tag)
{
@@ -85,6 +88,34 @@
RefPtr<ThreadSafeDataBufferImpl> m_impl;
};
+template<class Encoder>
+void ThreadSafeDataBuffer::encode(Encoder& encoder) const
+{
+ bool hasData = m_impl;
+ encoder << hasData;
+
+ if (hasData)
+ encoder << m_impl->m_data;
+}
+
+template<class Decoder>
+bool ThreadSafeDataBuffer::decode(Decoder& decoder, ThreadSafeDataBuffer& result)
+{
+ bool hasData;
+ if (!decoder.decode(hasData))
+ return false;
+
+ if (hasData) {
+ Vector<uint8_t> data;
+ if (!decoder.decode(data))
+ return false;
+
+ result = ThreadSafeDataBuffer::adoptVector(data);
+ }
+
+ return true;
+}
+
} // namespace WebCore
#endif // ThreadSafeDataBuffer_h
Modified: trunk/Source/WebKit2/ChangeLog (199071 => 199072)
--- trunk/Source/WebKit2/ChangeLog 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebKit2/ChangeLog 2016-04-05 21:27:05 UTC (rev 199072)
@@ -1,3 +1,19 @@
+2016-04-05 Brady Eidson <beid...@apple.com>
+
+ Modern IDB: Replace use of SerializedScriptValue with IDBValue.
+ https://bugs.webkit.org/show_bug.cgi?id=156242
+
+ Reviewed by Alex Christensen.
+
+ * DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp:
+ (WebKit::WebIDBConnectionToClient::putOrAdd):
+ * DatabaseProcess/IndexedDB/WebIDBConnectionToClient.h:
+ * DatabaseProcess/IndexedDB/WebIDBConnectionToClient.messages.in:
+
+ * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp:
+ (WebKit::WebIDBConnectionToServer::putOrAdd):
+ * WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h:
+
2016-04-05 Antoine Quint <grao...@apple.com>
[WebGL2] Turn the ENABLE_WEBGL2 flag on
Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp (199071 => 199072)
--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -34,6 +34,7 @@
#include "WebIDBConnectionToServerMessages.h"
#include <WebCore/IDBError.h>
#include <WebCore/IDBResultData.h>
+#include <WebCore/IDBValue.h>
#include <WebCore/ThreadSafeDataBuffer.h>
#include <WebCore/UniqueIDBDatabaseConnection.h>
@@ -214,7 +215,7 @@
DatabaseProcess::singleton().idbServer().deleteIndex(request, objectStoreIdentifier, name);
}
-void WebIDBConnectionToClient::putOrAdd(const IDBRequestData& request, const IDBKeyData& key, const IPC::DataReference& data, unsigned overwriteMode)
+void WebIDBConnectionToClient::putOrAdd(const IDBRequestData& request, const IDBKeyData& key, const IDBValue& value, unsigned overwriteMode)
{
if (overwriteMode != static_cast<unsigned>(IndexedDB::ObjectStoreOverwriteMode::NoOverwrite)
&& overwriteMode != static_cast<unsigned>(IndexedDB::ObjectStoreOverwriteMode::Overwrite)
@@ -225,9 +226,8 @@
}
IndexedDB::ObjectStoreOverwriteMode mode = static_cast<IndexedDB::ObjectStoreOverwriteMode>(overwriteMode);
- auto buffer = ThreadSafeDataBuffer::copyVector(data.vector());
- DatabaseProcess::singleton().idbServer().putOrAdd(request, key, buffer, mode);
+ DatabaseProcess::singleton().idbServer().putOrAdd(request, key, value, mode);
}
void WebIDBConnectionToClient::getRecord(const IDBRequestData& request, const IDBKeyRangeData& range)
Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.h (199071 => 199072)
--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -39,6 +39,7 @@
class IDBObjectStoreInfo;
class IDBRequestData;
class IDBTransactionInfo;
+class IDBValue;
class SerializedScriptValue;
struct IDBKeyRangeData;
}
@@ -90,7 +91,7 @@
void clearObjectStore(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier);
void createIndex(const WebCore::IDBRequestData&, const WebCore::IDBIndexInfo&);
void deleteIndex(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName);
- void putOrAdd(const WebCore::IDBRequestData&, const WebCore::IDBKeyData&, const IPC::DataReference& value, unsigned overwriteMode);
+ void putOrAdd(const WebCore::IDBRequestData&, const WebCore::IDBKeyData&, const WebCore::IDBValue&, unsigned overwriteMode);
void getRecord(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&);
void getCount(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&);
void deleteRecord(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&);
Modified: trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.messages.in (199071 => 199072)
--- trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.messages.in 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebKit2/DatabaseProcess/IndexedDB/WebIDBConnectionToClient.messages.in 2016-04-05 21:27:05 UTC (rev 199072)
@@ -33,7 +33,7 @@
ClearObjectStore(WebCore::IDBRequestData requestData, uint64_t objectStoreIdentifier);
CreateIndex(WebCore::IDBRequestData requestData, WebCore::IDBIndexInfo info);
DeleteIndex(WebCore::IDBRequestData requestData, uint64_t objectStoreIdentifier, String indexName);
- PutOrAdd(WebCore::IDBRequestData requestData, WebCore::IDBKeyData key, IPC::DataReference value, unsigned overwriteMode);
+ PutOrAdd(WebCore::IDBRequestData requestData, WebCore::IDBKeyData key, WebCore::IDBValue value, unsigned overwriteMode);
GetRecord(WebCore::IDBRequestData requestData, struct WebCore::IDBKeyRangeData range);
GetCount(WebCore::IDBRequestData requestData, struct WebCore::IDBKeyRangeData range);
DeleteRecord(WebCore::IDBRequestData requestData, struct WebCore::IDBKeyRangeData range);
Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp (199071 => 199072)
--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.cpp 2016-04-05 21:27:05 UTC (rev 199072)
@@ -44,6 +44,7 @@
#include <WebCore/IDBResourceIdentifier.h>
#include <WebCore/IDBResultData.h>
#include <WebCore/IDBTransactionInfo.h>
+#include <WebCore/IDBValue.h>
using namespace WebCore;
@@ -128,11 +129,10 @@
send(Messages::WebIDBConnectionToClient::DeleteIndex(requestData, objectStoreIdentifier, indexName));
}
-void WebIDBConnectionToServer::putOrAdd(const IDBRequestData& requestData, IDBKey* key, SerializedScriptValue& value, const IndexedDB::ObjectStoreOverwriteMode mode)
+void WebIDBConnectionToServer::putOrAdd(const IDBRequestData& requestData, IDBKey* key, const IDBValue& value, const IndexedDB::ObjectStoreOverwriteMode mode)
{
IDBKeyData keyData(key);
- IPC::DataReference valueData(value.data());
- send(Messages::WebIDBConnectionToClient::PutOrAdd(requestData, keyData, valueData, static_cast<unsigned>(mode)));
+ send(Messages::WebIDBConnectionToClient::PutOrAdd(requestData, keyData, value, static_cast<unsigned>(mode)));
}
void WebIDBConnectionToServer::getRecord(const IDBRequestData& requestData, const IDBKeyRangeData& range)
Modified: trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h (199071 => 199072)
--- trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h 2016-04-05 20:24:01 UTC (rev 199071)
+++ trunk/Source/WebKit2/WebProcess/Databases/IndexedDB/WebIDBConnectionToServer.h 2016-04-05 21:27:05 UTC (rev 199072)
@@ -54,7 +54,7 @@
void clearObjectStore(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier) final;
void createIndex(const WebCore::IDBRequestData&, const WebCore::IDBIndexInfo&) final;
void deleteIndex(const WebCore::IDBRequestData&, uint64_t objectStoreIdentifier, const String& indexName) final;
- void putOrAdd(const WebCore::IDBRequestData&, WebCore::IDBKey*, WebCore::SerializedScriptValue&, const WebCore::IndexedDB::ObjectStoreOverwriteMode) final;
+ void putOrAdd(const WebCore::IDBRequestData&, WebCore::IDBKey*, const WebCore::IDBValue&, const WebCore::IndexedDB::ObjectStoreOverwriteMode) final;
void getRecord(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&) final;
void getCount(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&) final;
void deleteRecord(const WebCore::IDBRequestData&, const WebCore::IDBKeyRangeData&) final;