Diff
Modified: trunk/Source/WebCore/ChangeLog (238631 => 238632)
--- trunk/Source/WebCore/ChangeLog 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/ChangeLog 2018-11-28 21:11:21 UTC (rev 238632)
@@ -1,3 +1,62 @@
+2018-11-28 Alex Christensen <[email protected]>
+
+ Add SessionIDs wherever BlobURLs are used in SerializedScriptValue
+ https://bugs.webkit.org/show_bug.cgi?id=192062
+
+ Reviewed by Dean Jackson.
+
+ Just adding infrastructure for fixing "the blob bug"
+
+ * Modules/indexeddb/IDBDatabaseIdentifier.cpp:
+ (WebCore::IDBDatabaseIdentifier::IDBDatabaseIdentifier):
+ (WebCore::IDBDatabaseIdentifier::isolatedCopy const):
+ * Modules/indexeddb/IDBDatabaseIdentifier.h:
+ (WebCore::IDBDatabaseIdentifier::hash const):
+ (WebCore::IDBDatabaseIdentifier::sessionID const):
+ (WebCore::IDBDatabaseIdentifier::encode const):
+ (WebCore::IDBDatabaseIdentifier::decode):
+ * Modules/indexeddb/IDBFactory.cpp:
+ (WebCore::IDBFactory::openInternal):
+ (WebCore::IDBFactory::deleteDatabase):
+ * Modules/indexeddb/IDBTransaction.cpp:
+ (WebCore::IDBTransaction::putOrAddOnServer):
+ * Modules/indexeddb/IDBValue.cpp:
+ (WebCore::IDBValue::IDBValue):
+ (WebCore::IDBValue::setAsIsolatedCopy):
+ * Modules/indexeddb/IDBValue.h:
+ (WebCore::IDBValue::sessionID const):
+ (WebCore::IDBValue::encode const):
+ (WebCore::IDBValue::decode):
+ * Modules/indexeddb/server/MemoryIndexCursor.cpp:
+ (WebCore::IDBServer::MemoryIndexCursor::currentData):
+ * Modules/indexeddb/server/MemoryObjectStoreCursor.cpp:
+ (WebCore::IDBServer::MemoryObjectStoreCursor::currentData):
+ * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
+ (WebCore::IDBServer::SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord):
+ (WebCore::IDBServer::SQLiteIDBBackingStore::getRecord):
+ (WebCore::IDBServer::SQLiteIDBBackingStore::getAllObjectStoreRecords):
+ (WebCore::IDBServer::SQLiteIDBBackingStore::uncheckedGetIndexRecordForOneKey):
+ * Modules/indexeddb/server/SQLiteIDBBackingStore.h:
+ * Modules/indexeddb/server/SQLiteIDBCursor.cpp:
+ (WebCore::IDBServer::SQLiteIDBCursor::internalFetchNextRecord):
+ * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
+ (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd):
+ * bindings/js/IDBBindingUtilities.cpp:
+ (WebCore::deserializeIDBValueToJSValue):
+ * bindings/js/SerializedScriptValue.cpp:
+ (WebCore::CloneSerializer::serialize):
+ (WebCore::CloneSerializer::CloneSerializer):
+ (WebCore::CloneSerializer::dumpIfTerminal):
+ (WebCore::CloneDeserializer::deserialize):
+ (WebCore::CloneDeserializer::CloneDeserializer):
+ (WebCore::SerializedScriptValue::SerializedScriptValue):
+ (WebCore::SerializedScriptValue::create):
+ (WebCore::SerializedScriptValue::deserialize):
+ (WebCore::SerializedScriptValue::writeBlobsToDiskForIndexedDB):
+ (WebCore::SerializedScriptValue::writeBlobsToDiskForIndexedDBSynchronously):
+ * bindings/js/SerializedScriptValue.h:
+ (WebCore::SerializedScriptValue::sessionID const):
+
2018-11-28 Justin Fan <[email protected]>
[WebGPU] Begin implementation of WebGPURenderPassEncoder and barebones WebGPURenderPassDescriptor
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -35,8 +35,9 @@
namespace WebCore {
-IDBDatabaseIdentifier::IDBDatabaseIdentifier(const String& databaseName, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin)
+IDBDatabaseIdentifier::IDBDatabaseIdentifier(const String& databaseName, const PAL::SessionID& sessionID, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin)
: m_databaseName(databaseName)
+ , m_sessionID(sessionID)
, m_openingOrigin(WTFMove(openingOrigin))
, m_mainFrameOrigin(WTFMove(mainFrameOrigin))
@@ -50,6 +51,7 @@
IDBDatabaseIdentifier identifier;
identifier.m_databaseName = m_databaseName.isolatedCopy();
+ identifier.m_sessionID = m_sessionID.isolatedCopy();
identifier.m_openingOrigin = m_openingOrigin.isolatedCopy();
identifier.m_mainFrameOrigin = m_mainFrameOrigin.isolatedCopy();
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h 2018-11-28 21:11:21 UTC (rev 238632)
@@ -28,6 +28,7 @@
#if ENABLE(INDEXED_DATABASE)
#include "SecurityOriginData.h"
+#include <pal/SessionID.h>
#include <wtf/text/StringHash.h>
#include <wtf/text/WTFString.h>
@@ -43,7 +44,7 @@
{
}
- WEBCORE_EXPORT IDBDatabaseIdentifier(const String& databaseName, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin);
+ WEBCORE_EXPORT IDBDatabaseIdentifier(const String& databaseName, const PAL::SessionID&, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin);
IDBDatabaseIdentifier isolatedCopy() const;
@@ -55,12 +56,13 @@
unsigned hash() const
{
unsigned nameHash = StringHash::hash(m_databaseName);
+ unsigned sessionIDHash = WTF::SessionIDHash::hash(m_sessionID);
unsigned openingProtocolHash = StringHash::hash(m_openingOrigin.protocol);
unsigned openingHostHash = StringHash::hash(m_openingOrigin.host);
unsigned mainFrameProtocolHash = StringHash::hash(m_mainFrameOrigin.protocol);
unsigned mainFrameHostHash = StringHash::hash(m_mainFrameOrigin.host);
- unsigned hashCodes[7] = { nameHash, openingProtocolHash, openingHostHash, m_openingOrigin.port.value_or(0), mainFrameProtocolHash, mainFrameHostHash, m_mainFrameOrigin.port.value_or(0) };
+ unsigned hashCodes[8] = { nameHash, sessionIDHash, openingProtocolHash, openingHostHash, m_openingOrigin.port.value_or(0), mainFrameProtocolHash, mainFrameHostHash, m_mainFrameOrigin.port.value_or(0) };
return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes);
}
@@ -83,6 +85,7 @@
}
const String& databaseName() const { return m_databaseName; }
+ const PAL::SessionID& sessionID() const { return m_sessionID; }
String databaseDirectoryRelativeToRoot(const String& rootDirectory) const;
static String databaseDirectoryRelativeToRoot(const SecurityOriginData& topLevelOrigin, const SecurityOriginData& openingOrigin, const String& rootDirectory);
@@ -101,6 +104,7 @@
private:
String m_databaseName;
+ PAL::SessionID m_sessionID;
SecurityOriginData m_openingOrigin;
SecurityOriginData m_mainFrameOrigin;
};
@@ -120,7 +124,7 @@
template<class Encoder>
void IDBDatabaseIdentifier::encode(Encoder& encoder) const
{
- encoder << m_databaseName << m_openingOrigin << m_mainFrameOrigin;
+ encoder << m_databaseName << m_sessionID << m_openingOrigin << m_mainFrameOrigin;
}
template<class Decoder>
@@ -131,6 +135,11 @@
if (!databaseName)
return std::nullopt;
+ std::optional<PAL::SessionID> sessionID;
+ decoder >> sessionID;
+ if (!sessionID)
+ return std::nullopt;
+
std::optional<SecurityOriginData> openingOrigin;
decoder >> openingOrigin;
if (!openingOrigin)
@@ -143,6 +152,7 @@
IDBDatabaseIdentifier identifier;
identifier.m_databaseName = WTFMove(*databaseName); // FIXME: When decoding from IPC, databaseName can be null, and the non-empty constructor asserts that this is not the case.
+ identifier.m_sessionID = WTFMove(*sessionID);
identifier.m_openingOrigin = WTFMove(*openingOrigin);
identifier.m_mainFrameOrigin = WTFMove(*mainFrameOrigin);
return WTFMove(identifier);
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBFactory.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/IDBFactory.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBFactory.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -91,7 +91,7 @@
return Exception { SecurityError, "IDBFactory.open() called in an invalid security context"_s };
ASSERT(context.securityOrigin());
- IDBDatabaseIdentifier databaseIdentifier(name, SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
+ IDBDatabaseIdentifier databaseIdentifier(name, context.sessionID(), SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
if (!databaseIdentifier.isValid())
return Exception { TypeError, "IDBFactory.open() called with an invalid security origin"_s };
@@ -111,7 +111,7 @@
return Exception { SecurityError, "IDBFactory.deleteDatabase() called in an invalid security context"_s };
ASSERT(context.securityOrigin());
- IDBDatabaseIdentifier databaseIdentifier(name, SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
+ IDBDatabaseIdentifier databaseIdentifier(name, context.sessionID(), SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
if (!databaseIdentifier.isValid())
return Exception { TypeError, "IDBFactory.deleteDatabase() called with an invalid security origin"_s };
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -54,8 +54,8 @@
#include "ScriptState.h"
#include "SerializedScriptValue.h"
#include "TransactionOperation.h"
+#include <wtf/CompletionHandler.h>
-
namespace WebCore {
using namespace JSC;
@@ -1223,7 +1223,7 @@
// stop future requests from going to the server ahead of it.
operation.setNextRequestCanGoToServer(false);
- value->writeBlobsToDiskForIndexedDB([protectedThis = makeRef(*this), this, protectedOperation = Ref<IDBClient::TransactionOperation>(operation), keyData = IDBKeyData(key.get()).isolatedCopy(), overwriteMode](const IDBValue& idbValue) mutable {
+ value->writeBlobsToDiskForIndexedDB([protectedThis = makeRef(*this), this, protectedOperation = Ref<IDBClient::TransactionOperation>(operation), keyData = IDBKeyData(key.get()).isolatedCopy(), overwriteMode](IDBValue&& idbValue) mutable {
ASSERT(&originThread() == &Thread::current());
ASSERT(isMainThread());
if (idbValue.data().data()) {
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBValue.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/IDBValue.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBValue.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -40,6 +40,7 @@
IDBValue::IDBValue(const SerializedScriptValue& scriptValue)
: m_data(ThreadSafeDataBuffer::copyVector(scriptValue.data()))
, m_blobURLs(scriptValue.blobURLsIsolatedCopy())
+ , m_sessionID(scriptValue.sessionID())
{
}
@@ -48,24 +49,27 @@
{
}
-IDBValue::IDBValue(const SerializedScriptValue& scriptValue, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths)
+IDBValue::IDBValue(const SerializedScriptValue& scriptValue, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, const Vector<String>& blobFilePaths)
: m_data(ThreadSafeDataBuffer::copyVector(scriptValue.data()))
, m_blobURLs(blobURLs)
+ , m_sessionID(sessionID)
, m_blobFilePaths(blobFilePaths)
{
ASSERT(m_data.data());
}
-IDBValue::IDBValue(const ThreadSafeDataBuffer& value, Vector<String>&& blobURLs, Vector<String>&& blobFilePaths)
+IDBValue::IDBValue(const ThreadSafeDataBuffer& value, Vector<String>&& blobURLs, const PAL::SessionID& sessionID, Vector<String>&& blobFilePaths)
: m_data(value)
, m_blobURLs(WTFMove(blobURLs))
+ , m_sessionID(sessionID)
, m_blobFilePaths(WTFMove(blobFilePaths))
{
}
-IDBValue::IDBValue(const ThreadSafeDataBuffer& value, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths)
+IDBValue::IDBValue(const ThreadSafeDataBuffer& value, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, const Vector<String>& blobFilePaths)
: m_data(value)
, m_blobURLs(blobURLs)
+ , m_sessionID(sessionID)
, m_blobFilePaths(blobFilePaths)
{
}
@@ -76,6 +80,7 @@
m_data = other.m_data;
m_blobURLs = crossThreadCopy(other.m_blobURLs);
+ m_sessionID = other.m_sessionID;
m_blobFilePaths = crossThreadCopy(other.m_blobFilePaths);
}
Modified: trunk/Source/WebCore/Modules/indexeddb/IDBValue.h (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/IDBValue.h 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/IDBValue.h 2018-11-28 21:11:21 UTC (rev 238632)
@@ -24,9 +24,11 @@
*/
#pragma once
+
#if ENABLE(INDEXED_DATABASE)
#include "ThreadSafeDataBuffer.h"
+#include <pal/SessionID.h>
#include <wtf/text/WTFString.h>
namespace WebCore {
@@ -38,9 +40,9 @@
WEBCORE_EXPORT IDBValue();
IDBValue(const SerializedScriptValue&);
IDBValue(const ThreadSafeDataBuffer&);
- IDBValue(const SerializedScriptValue&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths);
- IDBValue(const ThreadSafeDataBuffer&, Vector<String>&& blobURLs, Vector<String>&& blobFilePaths);
- IDBValue(const ThreadSafeDataBuffer&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths);
+ IDBValue(const SerializedScriptValue&, const Vector<String>& blobURLs, const PAL::SessionID&, const Vector<String>& blobFilePaths);
+ IDBValue(const ThreadSafeDataBuffer&, Vector<String>&& blobURLs, const PAL::SessionID&, Vector<String>&& blobFilePaths);
+ IDBValue(const ThreadSafeDataBuffer&, const Vector<String>& blobURLs, const PAL::SessionID&, const Vector<String>& blobFilePaths);
void setAsIsolatedCopy(const IDBValue&);
IDBValue isolatedCopy() const;
@@ -47,6 +49,7 @@
const ThreadSafeDataBuffer& data() const { return m_data; }
const Vector<String>& blobURLs() const { return m_blobURLs; }
+ const PAL::SessionID& sessionID() const { return m_sessionID; }
const Vector<String>& blobFilePaths() const { return m_blobFilePaths; }
template<class Encoder> void encode(Encoder&) const;
@@ -55,6 +58,7 @@
private:
ThreadSafeDataBuffer m_data;
Vector<String> m_blobURLs;
+ PAL::SessionID m_sessionID;
Vector<String> m_blobFilePaths;
};
@@ -64,6 +68,7 @@
{
encoder << m_data;
encoder << m_blobURLs;
+ encoder << m_sessionID;
encoder << m_blobFilePaths;
}
@@ -77,6 +82,9 @@
if (!decoder.decode(result.m_blobURLs))
return std::nullopt;
+ if (!decoder.decode(result.m_sessionID))
+ return std::nullopt;
+
if (!decoder.decode(result.m_blobFilePaths))
return std::nullopt;
Modified: trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -74,7 +74,7 @@
if (m_info.cursorType() == IndexedDB::CursorType::KeyOnly)
getResult = { m_currentKey, m_currentPrimaryKey };
else {
- IDBValue value = { m_index.objectStore().valueForKey(m_currentPrimaryKey), { }, { } };
+ IDBValue value = { m_index.objectStore().valueForKey(m_currentPrimaryKey), { }, { }, { } };
getResult = { m_currentKey, m_currentPrimaryKey, WTFMove(value) };
}
}
Modified: trunk/Source/WebCore/Modules/indexeddb/server/MemoryObjectStoreCursor.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/server/MemoryObjectStoreCursor.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/server/MemoryObjectStoreCursor.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -193,7 +193,7 @@
if (m_info.cursorType() == IndexedDB::CursorType::KeyOnly)
data = { m_currentPositionKey, m_currentPositionKey };
else {
- IDBValue value = { m_objectStore.valueForKeyRange(m_currentPositionKey), { }, { } };
+ IDBValue value = { m_objectStore.valueForKeyRange(m_currentPositionKey), { }, { }, { } };
data = { m_currentPositionKey, m_currentPositionKey, WTFMove(value) };
}
}
Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -1866,7 +1866,7 @@
return error;
}
-IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, Vector<String>& blobFilePaths)
+IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, PAL::SessionID& sessionID, Vector<String>& blobFilePaths)
{
ASSERT(objectStoreRecord);
@@ -1916,6 +1916,7 @@
String fileName = sql->getColumnText(0);
blobFilePaths.append(FileSystem::pathByAppendingComponent(databaseDirectory, fileName));
}
+ sessionID = m_identifier.sessionID();
return IDBError { };
}
@@ -2041,13 +2042,14 @@
ASSERT(recordID);
Vector<String> blobURLs, blobFilePaths;
- auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, blobFilePaths);
+ PAL::SessionID sessionID;
+ auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, sessionID, blobFilePaths);
ASSERT(blobURLs.size() == blobFilePaths.size());
if (!error.isNull())
return error;
- resultValue = { { resultBuffer, WTFMove(blobURLs), WTFMove(blobFilePaths) } };
+ resultValue = { { resultBuffer, WTFMove(blobURLs), sessionID, WTFMove(blobFilePaths) } };
return IDBError { };
}
@@ -2151,13 +2153,14 @@
ASSERT(recordID);
Vector<String> blobURLs, blobFilePaths;
- auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, blobFilePaths);
+ PAL::SessionID sessionID;
+ auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, sessionID, blobFilePaths);
ASSERT(blobURLs.size() == blobFilePaths.size());
if (!error.isNull())
return error;
- result.addValue({ resultBuffer, WTFMove(blobURLs), WTFMove(blobFilePaths) });
+ result.addValue({ resultBuffer, WTFMove(blobURLs), sessionID, WTFMove(blobFilePaths) });
} else {
Vector<uint8_t> keyData;
IDBKeyData key;
@@ -2321,13 +2324,14 @@
int64_t recordID = sql->getColumnInt64(2);
Vector<String> blobURLs, blobFilePaths;
- auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, blobFilePaths);
+ PAL::SessionID sessionID;
+ auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, sessionID, blobFilePaths);
ASSERT(blobURLs.size() == blobFilePaths.size());
if (!error.isNull())
return error;
- getResult = { { ThreadSafeDataBuffer::create(WTFMove(keyVector)), WTFMove(blobURLs), WTFMove(blobFilePaths) }, objectStoreKey };
+ getResult = { { ThreadSafeDataBuffer::create(WTFMove(keyVector)), WTFMove(blobURLs), sessionID, WTFMove(blobFilePaths) }, objectStoreKey };
return IDBError { };
}
Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h 2018-11-28 21:11:21 UTC (rev 238632)
@@ -91,7 +91,7 @@
IDBBackingStoreTemporaryFileHandler& temporaryFileHandler() const { return m_temporaryFileHandler; }
- IDBError getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, Vector<String>& blobFilePaths);
+ IDBError getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, PAL::SessionID&, Vector<String>& blobFilePaths);
static String databaseNameFromEncodedFilename(const String&);
Modified: trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -456,7 +456,8 @@
record.record.primaryKey = record.record.key;
Vector<String> blobURLs, blobFilePaths;
- auto error = m_transaction->backingStore().getBlobRecordsForObjectStoreRecord(record.rowID, blobURLs, blobFilePaths);
+ PAL::SessionID sessionID;
+ auto error = m_transaction->backingStore().getBlobRecordsForObjectStoreRecord(record.rowID, blobURLs, sessionID, blobFilePaths);
if (!error.isNull()) {
LOG_ERROR("Unable to fetch blob records from database while advancing cursor");
markAsErrored(record);
@@ -464,7 +465,7 @@
}
if (m_cursorType == IndexedDB::CursorType::KeyAndValue)
- record.record.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::create(WTFMove(keyData)), blobURLs, blobFilePaths);
+ record.record.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::create(WTFMove(keyData)), blobURLs, sessionID, blobFilePaths);
} else {
if (!deserializeIDBKeyData(keyData.data(), keyData.size(), record.record.primaryKey)) {
LOG_ERROR("Unable to deserialize value data from database while advancing index cursor");
Modified: trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp (238631 => 238632)
--- trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -1039,7 +1039,7 @@
}
if (injectedRecordValue.data())
- error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, { injectedRecordValue, originalRecordValue.blobURLs(), originalRecordValue.blobFilePaths() });
+ error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, { injectedRecordValue, originalRecordValue.blobURLs(), originalRecordValue.sessionID(), originalRecordValue.blobFilePaths() });
else
error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, originalRecordValue);
Modified: trunk/Source/WebCore/bindings/js/IDBBindingUtilities.cpp (238631 => 238632)
--- trunk/Source/WebCore/bindings/js/IDBBindingUtilities.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/bindings/js/IDBBindingUtilities.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -343,7 +343,7 @@
state.vm().apiLock().lock();
Vector<RefPtr<MessagePort>> messagePorts;
- JSValue result = serializedValue->deserialize(state, &globalObject, messagePorts, value.blobURLs(), value.blobFilePaths(), SerializationErrorMode::NonThrowing);
+ JSValue result = serializedValue->deserialize(state, &globalObject, messagePorts, value.blobURLs(), value.sessionID(), value.blobFilePaths(), SerializationErrorMode::NonThrowing);
state.vm().apiLock().unlock();
return result;
Modified: trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp (238631 => 238632)
--- trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp 2018-11-28 21:11:21 UTC (rev 238632)
@@ -547,13 +547,13 @@
#if ENABLE(WEBASSEMBLY)
WasmModuleArray& wasmModules,
#endif
- Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
+ Vector<String>& blobURLs, const PAL::SessionID& sessionID, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
{
CloneSerializer serializer(exec, messagePorts, arrayBuffers, imageBitmaps,
#if ENABLE(WEBASSEMBLY)
wasmModules,
#endif
- blobURLs, out, context, sharedBuffers);
+ blobURLs, sessionID, out, context, sharedBuffers);
return serializer.serialize(value);
}
@@ -580,10 +580,11 @@
#if ENABLE(WEBASSEMBLY)
WasmModuleArray& wasmModules,
#endif
- Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
+ Vector<String>& blobURLs, const PAL::SessionID& sessionID, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
: CloneBase(exec)
, m_buffer(out)
, m_blobURLs(blobURLs)
+ , m_sessionID(sessionID)
, m_emptyIdentifier(Identifier::fromString(exec, emptyString()))
, m_context(context)
, m_sharedBuffers(sharedBuffers)
@@ -1043,6 +1044,7 @@
write(CryptoKeyTag);
Vector<uint8_t> serializedKey;
Vector<String> dummyBlobURLs;
+ PAL::SessionID dummySessionID;
Vector<RefPtr<MessagePort>> dummyMessagePorts;
Vector<RefPtr<JSC::ArrayBuffer>> dummyArrayBuffers;
#if ENABLE(WEBASSEMBLY)
@@ -1053,7 +1055,7 @@
#if ENABLE(WEBASSEMBLY)
dummyModules,
#endif
- dummyBlobURLs, serializedKey, SerializationContext::Default, dummySharedBuffers);
+ dummyBlobURLs, dummySessionID, serializedKey, SerializationContext::Default, dummySharedBuffers);
rawKeySerializer.write(key);
Vector<uint8_t> wrappedKey;
if (!wrapCryptoKey(m_exec, serializedKey, wrappedKey))
@@ -1452,6 +1454,7 @@
Vector<uint8_t>& m_buffer;
Vector<String>& m_blobURLs;
+ PAL::SessionID m_sessionID;
ObjectPool m_objectPool;
ObjectPool m_transferredMessagePorts;
ObjectPool m_transferredArrayBuffers;
@@ -1735,7 +1738,7 @@
return str;
}
- static DeserializationResult deserialize(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers, ArrayBufferContentsArray* arrayBufferContentsArray, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers
+ static DeserializationResult deserialize(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers, ArrayBufferContentsArray* arrayBufferContentsArray, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers
#if ENABLE(WEBASSEMBLY)
, WasmModuleArray* wasmModules
#endif
@@ -1743,7 +1746,7 @@
{
if (!buffer.size())
return std::make_pair(jsNull(), SerializationReturnCode::UnspecifiedError);
- CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, blobFilePaths, sharedBuffers, WTFMove(imageBuffers)
+ CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, sessionID, blobFilePaths, sharedBuffers, WTFMove(imageBuffers)
#if ENABLE(WEBASSEMBLY)
, wasmModules
#endif
@@ -1817,7 +1820,7 @@
m_version = 0xFFFFFFFF;
}
- CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
+ CloneDeserializer(ExecState* exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, ArrayBufferContentsArray* arrayBufferContents, const Vector<uint8_t>& buffer, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, const Vector<String> blobFilePaths, ArrayBufferContentsArray* sharedBuffers, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
#if ENABLE(WEBASSEMBLY)
, WasmModuleArray* wasmModules
#endif
@@ -1832,6 +1835,7 @@
, m_arrayBufferContents(arrayBufferContents)
, m_arrayBuffers(arrayBufferContents ? arrayBufferContents->size() : 0)
, m_blobURLs(blobURLs)
+ , m_sessionID(sessionID)
, m_blobFilePaths(blobFilePaths)
, m_sharedBuffers(sharedBuffers)
, m_imageBuffers(WTFMove(imageBuffers))
@@ -3038,6 +3042,7 @@
ArrayBufferContentsArray* m_arrayBufferContents;
Vector<RefPtr<JSC::ArrayBuffer>> m_arrayBuffers;
Vector<String> m_blobURLs;
+ PAL::SessionID m_sessionID;
Vector<String> m_blobFilePaths;
ArrayBufferContentsArray* m_sharedBuffers;
Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>> m_imageBuffers;
@@ -3258,7 +3263,7 @@
{
}
-SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray, std::unique_ptr<ArrayBufferContentsArray> sharedBufferContentsArray, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
+SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray, std::unique_ptr<ArrayBufferContentsArray> sharedBufferContentsArray, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
#if ENABLE(WEBASSEMBLY)
, std::unique_ptr<WasmModuleArray> wasmModulesArray
#endif
@@ -3270,6 +3275,7 @@
#if ENABLE(WEBASSEMBLY)
, m_wasmModulesArray(WTFMove(wasmModulesArray))
#endif
+ , m_sessionID(sessionID)
{
// Since this SerializedScriptValue is meant to be passed between threads, its String data members
// need to be isolatedCopies so we don't run into thread safety issues for the StringImpls.
@@ -3352,6 +3358,7 @@
{
Vector<uint8_t> buffer;
Vector<String> blobURLs;
+ PAL::SessionID sessionID;
Vector<RefPtr<MessagePort>> dummyMessagePorts;
Vector<RefPtr<ImageBitmap>> dummyImageBitmaps;
Vector<RefPtr<JSC::ArrayBuffer>> dummyArrayBuffers;
@@ -3363,7 +3370,7 @@
#if ENABLE(WEBASSEMBLY)
dummyModules,
#endif
- blobURLs, buffer, SerializationContext::Default, dummySharedBuffers);
+ blobURLs, sessionID, buffer, SerializationContext::Default, dummySharedBuffers);
#if ENABLE(WEBASSEMBLY)
ASSERT_WITH_MESSAGE(dummyModules.isEmpty(), "Wasm::Module serialization is only allowed in the postMessage context");
@@ -3375,7 +3382,7 @@
if (code != SerializationReturnCode::SuccessfullyCompleted)
return nullptr;
- return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr, nullptr, { }
+ return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, sessionID, nullptr, nullptr, { }
#if ENABLE(WEBASSEMBLY)
, nullptr
#endif
@@ -3431,6 +3438,7 @@
Vector<uint8_t> buffer;
Vector<String> blobURLs;
+ PAL::SessionID sessionID;
#if ENABLE(WEBASSEMBLY)
WasmModuleArray wasmModules;
#endif
@@ -3439,7 +3447,7 @@
#if ENABLE(WEBASSEMBLY)
wasmModules,
#endif
- blobURLs, buffer, context, *sharedBuffers);
+ blobURLs, sessionID, buffer, context, *sharedBuffers);
if (code != SerializationReturnCode::SuccessfullyCompleted)
return exceptionForSerializationFailure(code);
@@ -3450,7 +3458,7 @@
auto imageBuffers = ImageBitmap::detachBitmaps(WTFMove(imageBitmaps));
- return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, arrayBufferContentsArray.releaseReturnValue(), context == SerializationContext::WorkerPostMessage ? WTFMove(sharedBuffers) : nullptr, WTFMove(imageBuffers)
+ return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, sessionID, arrayBufferContentsArray.releaseReturnValue(), context == SerializationContext::WorkerPostMessage ? WTFMove(sharedBuffers) : nullptr, WTFMove(imageBuffers)
#if ENABLE(WEBASSEMBLY)
, std::make_unique<WasmModuleArray>(wasmModules)
#endif
@@ -3498,12 +3506,13 @@
{
Vector<String> dummyBlobs;
Vector<String> dummyPaths;
- return deserialize(exec, globalObject, messagePorts, dummyBlobs, dummyPaths, throwExceptions);
+ PAL::SessionID dummySessionID;
+ return deserialize(exec, globalObject, messagePorts, dummyBlobs, dummySessionID, dummyPaths, throwExceptions);
}
-JSValue SerializedScriptValue::deserialize(ExecState& exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode throwExceptions)
+JSValue SerializedScriptValue::deserialize(ExecState& exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, const Vector<String>& blobFilePaths, SerializationErrorMode throwExceptions)
{
- DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, WTFMove(m_imageBuffers), m_arrayBufferContentsArray.get(), m_data, blobURLs, blobFilePaths, m_sharedBufferContentsArray.get()
+ DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, WTFMove(m_imageBuffers), m_arrayBufferContentsArray.get(), m_data, blobURLs, sessionID, blobFilePaths, m_sharedBufferContentsArray.get()
#if ENABLE(WEBASSEMBLY)
, m_wasmModulesArray.get()
#endif
@@ -3552,13 +3561,14 @@
return result;
}
-void SerializedScriptValue::writeBlobsToDiskForIndexedDB(WTF::Function<void (const IDBValue&)>&& completionHandler)
+void SerializedScriptValue::writeBlobsToDiskForIndexedDB(CompletionHandler<void(IDBValue&&)>&& completionHandler)
{
ASSERT(isMainThread());
ASSERT(hasBlobURLs());
RefPtr<SerializedScriptValue> protectedThis(this);
- blobRegistry().writeBlobsToTemporaryFiles(m_blobURLs, [completionHandler = WTFMove(completionHandler), this, protectedThis = WTFMove(protectedThis)](auto& blobFilePaths) {
+ // FIXME: Add m_sessionID as a parameter here.
+ blobRegistry().writeBlobsToTemporaryFiles(m_blobURLs, [completionHandler = WTFMove(completionHandler), this, protectedThis = WTFMove(protectedThis)] (auto& blobFilePaths) mutable {
ASSERT(isMainThread());
if (blobFilePaths.isEmpty()) {
@@ -3570,7 +3580,7 @@
ASSERT(m_blobURLs.size() == blobFilePaths.size());
- completionHandler({ *this, m_blobURLs, blobFilePaths });
+ completionHandler({ *this, m_blobURLs, m_sessionID, blobFilePaths });
});
}
@@ -3584,7 +3594,7 @@
lock.lock();
RunLoop::main().dispatch([this, conditionPtr = &condition, valuePtr = &value] {
- writeBlobsToDiskForIndexedDB([conditionPtr, valuePtr](const IDBValue& result) {
+ writeBlobsToDiskForIndexedDB([conditionPtr, valuePtr](IDBValue&& result) {
ASSERT(isMainThread());
valuePtr->setAsIsolatedCopy(result);
Modified: trunk/Source/WebCore/bindings/js/SerializedScriptValue.h (238631 => 238632)
--- trunk/Source/WebCore/bindings/js/SerializedScriptValue.h 2018-11-28 21:09:34 UTC (rev 238631)
+++ trunk/Source/WebCore/bindings/js/SerializedScriptValue.h 2018-11-28 21:11:21 UTC (rev 238632)
@@ -31,6 +31,7 @@
#include <_javascript_Core/ArrayBuffer.h>
#include <_javascript_Core/JSCJSValue.h>
#include <_javascript_Core/Strong.h>
+#include <pal/SessionID.h>
#include <wtf/Forward.h>
#include <wtf/Function.h>
#include <wtf/Gigacage.h>
@@ -77,7 +78,7 @@
WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, SerializationErrorMode = SerializationErrorMode::Throwing);
WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, const Vector<RefPtr<MessagePort>>&, SerializationErrorMode = SerializationErrorMode::Throwing);
- JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, const Vector<RefPtr<MessagePort>>&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode = SerializationErrorMode::Throwing);
+ JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, const Vector<RefPtr<MessagePort>>&, const Vector<String>& blobURLs, const PAL::SessionID&, const Vector<String>& blobFilePaths, SerializationErrorMode = SerializationErrorMode::Throwing);
static uint32_t wireFormatVersion();
@@ -92,7 +93,8 @@
#if ENABLE(INDEXED_DATABASE)
Vector<String> blobURLsIsolatedCopy() const;
- void writeBlobsToDiskForIndexedDB(WTF::Function<void (const IDBValue&)>&& completionHandler);
+ const PAL::SessionID& sessionID() const { return m_sessionID; }
+ void writeBlobsToDiskForIndexedDB(CompletionHandler<void(IDBValue&&)>&&);
IDBValue writeBlobsToDiskForIndexedDBSynchronously();
#endif // ENABLE(INDEXED_DATABASE)
@@ -110,7 +112,7 @@
private:
WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&);
WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&, std::unique_ptr<ArrayBufferContentsArray>);
- SerializedScriptValue(Vector<unsigned char>&&, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray>, std::unique_ptr<ArrayBufferContentsArray> sharedBuffers, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
+ SerializedScriptValue(Vector<unsigned char>&&, const Vector<String>& blobURLs, const PAL::SessionID&, std::unique_ptr<ArrayBufferContentsArray>, std::unique_ptr<ArrayBufferContentsArray> sharedBuffers, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
#if ENABLE(WEBASSEMBLY)
, std::unique_ptr<WasmModuleArray>
#endif
@@ -124,6 +126,7 @@
std::unique_ptr<WasmModuleArray> m_wasmModulesArray;
#endif
Vector<String> m_blobURLs;
+ PAL::SessionID m_sessionID;
};
template<class Encoder>