Title: [199072] trunk/Source
Revision
199072
Author
beid...@apple.com
Date
2016-04-05 14:27:05 -0700 (Tue, 05 Apr 2016)

Log Message

Modern IDB: Replace use of SerializedScriptValue with IDBValue.
https://bugs.webkit.org/show_bug.cgi?id=156242

Reviewed by Alex Christensen.

Source/WebCore:

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):

Source/WebKit2:

* 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:

Modified Paths

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;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to