Changeset 238632 in webkit


Ignore:
Timestamp:
Nov 28, 2018 1:11:21 PM (5 years ago)
Author:
achristensen@apple.com
Message:

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

Location:
trunk/Source/WebCore
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r238629 r238632  
     12018-11-28  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add SessionIDs wherever BlobURLs are used in SerializedScriptValue
     4        https://bugs.webkit.org/show_bug.cgi?id=192062
     5
     6        Reviewed by Dean Jackson.
     7
     8        Just adding infrastructure for fixing "the blob bug"
     9
     10        * Modules/indexeddb/IDBDatabaseIdentifier.cpp:
     11        (WebCore::IDBDatabaseIdentifier::IDBDatabaseIdentifier):
     12        (WebCore::IDBDatabaseIdentifier::isolatedCopy const):
     13        * Modules/indexeddb/IDBDatabaseIdentifier.h:
     14        (WebCore::IDBDatabaseIdentifier::hash const):
     15        (WebCore::IDBDatabaseIdentifier::sessionID const):
     16        (WebCore::IDBDatabaseIdentifier::encode const):
     17        (WebCore::IDBDatabaseIdentifier::decode):
     18        * Modules/indexeddb/IDBFactory.cpp:
     19        (WebCore::IDBFactory::openInternal):
     20        (WebCore::IDBFactory::deleteDatabase):
     21        * Modules/indexeddb/IDBTransaction.cpp:
     22        (WebCore::IDBTransaction::putOrAddOnServer):
     23        * Modules/indexeddb/IDBValue.cpp:
     24        (WebCore::IDBValue::IDBValue):
     25        (WebCore::IDBValue::setAsIsolatedCopy):
     26        * Modules/indexeddb/IDBValue.h:
     27        (WebCore::IDBValue::sessionID const):
     28        (WebCore::IDBValue::encode const):
     29        (WebCore::IDBValue::decode):
     30        * Modules/indexeddb/server/MemoryIndexCursor.cpp:
     31        (WebCore::IDBServer::MemoryIndexCursor::currentData):
     32        * Modules/indexeddb/server/MemoryObjectStoreCursor.cpp:
     33        (WebCore::IDBServer::MemoryObjectStoreCursor::currentData):
     34        * Modules/indexeddb/server/SQLiteIDBBackingStore.cpp:
     35        (WebCore::IDBServer::SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord):
     36        (WebCore::IDBServer::SQLiteIDBBackingStore::getRecord):
     37        (WebCore::IDBServer::SQLiteIDBBackingStore::getAllObjectStoreRecords):
     38        (WebCore::IDBServer::SQLiteIDBBackingStore::uncheckedGetIndexRecordForOneKey):
     39        * Modules/indexeddb/server/SQLiteIDBBackingStore.h:
     40        * Modules/indexeddb/server/SQLiteIDBCursor.cpp:
     41        (WebCore::IDBServer::SQLiteIDBCursor::internalFetchNextRecord):
     42        * Modules/indexeddb/server/UniqueIDBDatabase.cpp:
     43        (WebCore::IDBServer::UniqueIDBDatabase::performPutOrAdd):
     44        * bindings/js/IDBBindingUtilities.cpp:
     45        (WebCore::deserializeIDBValueToJSValue):
     46        * bindings/js/SerializedScriptValue.cpp:
     47        (WebCore::CloneSerializer::serialize):
     48        (WebCore::CloneSerializer::CloneSerializer):
     49        (WebCore::CloneSerializer::dumpIfTerminal):
     50        (WebCore::CloneDeserializer::deserialize):
     51        (WebCore::CloneDeserializer::CloneDeserializer):
     52        (WebCore::SerializedScriptValue::SerializedScriptValue):
     53        (WebCore::SerializedScriptValue::create):
     54        (WebCore::SerializedScriptValue::deserialize):
     55        (WebCore::SerializedScriptValue::writeBlobsToDiskForIndexedDB):
     56        (WebCore::SerializedScriptValue::writeBlobsToDiskForIndexedDBSynchronously):
     57        * bindings/js/SerializedScriptValue.h:
     58        (WebCore::SerializedScriptValue::sessionID const):
     59
    1602018-11-28  Justin Fan  <justin_fan@apple.com>
    261
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.cpp

    r224371 r238632  
    3636namespace WebCore {
    3737
    38 IDBDatabaseIdentifier::IDBDatabaseIdentifier(const String& databaseName, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin)
     38IDBDatabaseIdentifier::IDBDatabaseIdentifier(const String& databaseName, const PAL::SessionID& sessionID, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin)
    3939    : m_databaseName(databaseName)
     40    , m_sessionID(sessionID)
    4041    , m_openingOrigin(WTFMove(openingOrigin))
    4142    , m_mainFrameOrigin(WTFMove(mainFrameOrigin))
     
    5152
    5253    identifier.m_databaseName = m_databaseName.isolatedCopy();
     54    identifier.m_sessionID = m_sessionID.isolatedCopy();
    5355    identifier.m_openingOrigin = m_openingOrigin.isolatedCopy();
    5456    identifier.m_mainFrameOrigin = m_mainFrameOrigin.isolatedCopy();
  • trunk/Source/WebCore/Modules/indexeddb/IDBDatabaseIdentifier.h

    r222233 r238632  
    2929
    3030#include "SecurityOriginData.h"
     31#include <pal/SessionID.h>
    3132#include <wtf/text/StringHash.h>
    3233#include <wtf/text/WTFString.h>
     
    4445    }
    4546
    46     WEBCORE_EXPORT IDBDatabaseIdentifier(const String& databaseName, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin);
     47    WEBCORE_EXPORT IDBDatabaseIdentifier(const String& databaseName, const PAL::SessionID&, SecurityOriginData&& openingOrigin, SecurityOriginData&& mainFrameOrigin);
    4748
    4849    IDBDatabaseIdentifier isolatedCopy() const;
     
    5657    {
    5758        unsigned nameHash = StringHash::hash(m_databaseName);
     59        unsigned sessionIDHash = WTF::SessionIDHash::hash(m_sessionID);
    5860        unsigned openingProtocolHash = StringHash::hash(m_openingOrigin.protocol);
    5961        unsigned openingHostHash = StringHash::hash(m_openingOrigin.host);
     
    6163        unsigned mainFrameHostHash = StringHash::hash(m_mainFrameOrigin.host);
    6264       
    63         unsigned hashCodes[7] = { nameHash, openingProtocolHash, openingHostHash, m_openingOrigin.port.value_or(0), mainFrameProtocolHash, mainFrameHostHash, m_mainFrameOrigin.port.value_or(0) };
     65        unsigned hashCodes[8] = { nameHash, sessionIDHash, openingProtocolHash, openingHostHash, m_openingOrigin.port.value_or(0), mainFrameProtocolHash, mainFrameHostHash, m_mainFrameOrigin.port.value_or(0) };
    6466        return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes);
    6567    }
     
    8486
    8587    const String& databaseName() const { return m_databaseName; }
     88    const PAL::SessionID& sessionID() const { return m_sessionID; }
    8689
    8790    String databaseDirectoryRelativeToRoot(const String& rootDirectory) const;
     
    102105private:
    103106    String m_databaseName;
     107    PAL::SessionID m_sessionID;
    104108    SecurityOriginData m_openingOrigin;
    105109    SecurityOriginData m_mainFrameOrigin;
     
    121125void IDBDatabaseIdentifier::encode(Encoder& encoder) const
    122126{
    123     encoder << m_databaseName << m_openingOrigin << m_mainFrameOrigin;
     127    encoder << m_databaseName << m_sessionID << m_openingOrigin << m_mainFrameOrigin;
    124128}
    125129
     
    132136        return std::nullopt;
    133137
     138    std::optional<PAL::SessionID> sessionID;
     139    decoder >> sessionID;
     140    if (!sessionID)
     141        return std::nullopt;
     142   
    134143    std::optional<SecurityOriginData> openingOrigin;
    135144    decoder >> openingOrigin;
     
    144153    IDBDatabaseIdentifier identifier;
    145154    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.
     155    identifier.m_sessionID = WTFMove(*sessionID);
    146156    identifier.m_openingOrigin = WTFMove(*openingOrigin);
    147157    identifier.m_mainFrameOrigin = WTFMove(*mainFrameOrigin);
  • trunk/Source/WebCore/Modules/indexeddb/IDBFactory.cpp

    r233122 r238632  
    9292
    9393    ASSERT(context.securityOrigin());
    94     IDBDatabaseIdentifier databaseIdentifier(name, SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
     94    IDBDatabaseIdentifier databaseIdentifier(name, context.sessionID(), SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
    9595    if (!databaseIdentifier.isValid())
    9696        return Exception { TypeError, "IDBFactory.open() called with an invalid security origin"_s };
     
    112112
    113113    ASSERT(context.securityOrigin());
    114     IDBDatabaseIdentifier databaseIdentifier(name, SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
     114    IDBDatabaseIdentifier databaseIdentifier(name, context.sessionID(), SecurityOriginData { context.securityOrigin()->data() }, SecurityOriginData { context.topOrigin().data() });
    115115    if (!databaseIdentifier.isValid())
    116116        return Exception { TypeError, "IDBFactory.deleteDatabase() called with an invalid security origin"_s };
  • trunk/Source/WebCore/Modules/indexeddb/IDBTransaction.cpp

    r238088 r238632  
    5555#include "SerializedScriptValue.h"
    5656#include "TransactionOperation.h"
    57 
     57#include <wtf/CompletionHandler.h>
    5858
    5959namespace WebCore {
     
    12241224    operation.setNextRequestCanGoToServer(false);
    12251225
    1226     value->writeBlobsToDiskForIndexedDB([protectedThis = makeRef(*this), this, protectedOperation = Ref<IDBClient::TransactionOperation>(operation), keyData = IDBKeyData(key.get()).isolatedCopy(), overwriteMode](const IDBValue& idbValue) mutable {
     1226    value->writeBlobsToDiskForIndexedDB([protectedThis = makeRef(*this), this, protectedOperation = Ref<IDBClient::TransactionOperation>(operation), keyData = IDBKeyData(key.get()).isolatedCopy(), overwriteMode](IDBValue&& idbValue) mutable {
    12271227        ASSERT(&originThread() == &Thread::current());
    12281228        ASSERT(isMainThread());
  • trunk/Source/WebCore/Modules/indexeddb/IDBValue.cpp

    r221431 r238632  
    4141    : m_data(ThreadSafeDataBuffer::copyVector(scriptValue.data()))
    4242    , m_blobURLs(scriptValue.blobURLsIsolatedCopy())
     43    , m_sessionID(scriptValue.sessionID())
    4344{
    4445}
     
    4950}
    5051
    51 IDBValue::IDBValue(const SerializedScriptValue& scriptValue, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths)
     52IDBValue::IDBValue(const SerializedScriptValue& scriptValue, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, const Vector<String>& blobFilePaths)
    5253    : m_data(ThreadSafeDataBuffer::copyVector(scriptValue.data()))
    5354    , m_blobURLs(blobURLs)
     55    , m_sessionID(sessionID)
    5456    , m_blobFilePaths(blobFilePaths)
    5557{
     
    5759}
    5860
    59 IDBValue::IDBValue(const ThreadSafeDataBuffer& value, Vector<String>&& blobURLs, Vector<String>&& blobFilePaths)
     61IDBValue::IDBValue(const ThreadSafeDataBuffer& value, Vector<String>&& blobURLs, const PAL::SessionID& sessionID, Vector<String>&& blobFilePaths)
    6062    : m_data(value)
    6163    , m_blobURLs(WTFMove(blobURLs))
     64    , m_sessionID(sessionID)
    6265    , m_blobFilePaths(WTFMove(blobFilePaths))
    6366{
    6467}
    6568
    66 IDBValue::IDBValue(const ThreadSafeDataBuffer& value, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths)
     69IDBValue::IDBValue(const ThreadSafeDataBuffer& value, const Vector<String>& blobURLs, const PAL::SessionID& sessionID, const Vector<String>& blobFilePaths)
    6770    : m_data(value)
    6871    , m_blobURLs(blobURLs)
     72    , m_sessionID(sessionID)
    6973    , m_blobFilePaths(blobFilePaths)
    7074{
     
    7781    m_data = other.m_data;
    7882    m_blobURLs = crossThreadCopy(other.m_blobURLs);
     83    m_sessionID = other.m_sessionID;
    7984    m_blobFilePaths = crossThreadCopy(other.m_blobFilePaths);
    8085}
  • trunk/Source/WebCore/Modules/indexeddb/IDBValue.h

    r222233 r238632  
    2525
    2626#pragma once
     27
    2728#if ENABLE(INDEXED_DATABASE)
    2829
    2930#include "ThreadSafeDataBuffer.h"
     31#include <pal/SessionID.h>
    3032#include <wtf/text/WTFString.h>
    3133
     
    3941    IDBValue(const SerializedScriptValue&);
    4042    IDBValue(const ThreadSafeDataBuffer&);
    41     IDBValue(const SerializedScriptValue&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths);
    42     IDBValue(const ThreadSafeDataBuffer&, Vector<String>&& blobURLs, Vector<String>&& blobFilePaths);
    43     IDBValue(const ThreadSafeDataBuffer&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths);
     43    IDBValue(const SerializedScriptValue&, const Vector<String>& blobURLs, const PAL::SessionID&, const Vector<String>& blobFilePaths);
     44    IDBValue(const ThreadSafeDataBuffer&, Vector<String>&& blobURLs, const PAL::SessionID&, Vector<String>&& blobFilePaths);
     45    IDBValue(const ThreadSafeDataBuffer&, const Vector<String>& blobURLs, const PAL::SessionID&, const Vector<String>& blobFilePaths);
    4446
    4547    void setAsIsolatedCopy(const IDBValue&);
     
    4850    const ThreadSafeDataBuffer& data() const { return m_data; }
    4951    const Vector<String>& blobURLs() const { return m_blobURLs; }
     52    const PAL::SessionID& sessionID() const { return m_sessionID; }
    5053    const Vector<String>& blobFilePaths() const { return m_blobFilePaths; }
    5154
     
    5659    ThreadSafeDataBuffer m_data;
    5760    Vector<String> m_blobURLs;
     61    PAL::SessionID m_sessionID;
    5862    Vector<String> m_blobFilePaths;
    5963};
     
    6569    encoder << m_data;
    6670    encoder << m_blobURLs;
     71    encoder << m_sessionID;
    6772    encoder << m_blobFilePaths;
    6873}
     
    7883        return std::nullopt;
    7984
     85    if (!decoder.decode(result.m_sessionID))
     86        return std::nullopt;
     87
    8088    if (!decoder.decode(result.m_blobFilePaths))
    8189        return std::nullopt;
  • trunk/Source/WebCore/Modules/indexeddb/server/MemoryIndexCursor.cpp

    r223728 r238632  
    7575        getResult = { m_currentKey, m_currentPrimaryKey };
    7676    else {
    77         IDBValue value = { m_index.objectStore().valueForKey(m_currentPrimaryKey), { }, { } };
     77        IDBValue value = { m_index.objectStore().valueForKey(m_currentPrimaryKey), { }, { }, { } };
    7878        getResult = { m_currentKey, m_currentPrimaryKey, WTFMove(value) };
    7979    }
  • trunk/Source/WebCore/Modules/indexeddb/server/MemoryObjectStoreCursor.cpp

    r219383 r238632  
    194194        data = { m_currentPositionKey, m_currentPositionKey };
    195195    else {
    196         IDBValue value = { m_objectStore.valueForKeyRange(m_currentPositionKey), { }, { } };
     196        IDBValue value = { m_objectStore.valueForKeyRange(m_currentPositionKey), { }, { }, { } };
    197197        data = { m_currentPositionKey, m_currentPositionKey, WTFMove(value) };
    198198    }
  • trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.cpp

    r238112 r238632  
    18671867}
    18681868
    1869 IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, Vector<String>& blobFilePaths)
     1869IDBError SQLiteIDBBackingStore::getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, PAL::SessionID& sessionID, Vector<String>& blobFilePaths)
    18701870{
    18711871    ASSERT(objectStoreRecord);
     
    19171917        blobFilePaths.append(FileSystem::pathByAppendingComponent(databaseDirectory, fileName));
    19181918    }
     1919    sessionID = m_identifier.sessionID();
    19191920
    19201921    return IDBError { };
     
    20422043    ASSERT(recordID);
    20432044    Vector<String> blobURLs, blobFilePaths;
    2044     auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, blobFilePaths);
     2045    PAL::SessionID sessionID;
     2046    auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, sessionID, blobFilePaths);
    20452047    ASSERT(blobURLs.size() == blobFilePaths.size());
    20462048
     
    20482050        return error;
    20492051
    2050     resultValue = { { resultBuffer, WTFMove(blobURLs), WTFMove(blobFilePaths) } };
     2052    resultValue = { { resultBuffer, WTFMove(blobURLs), sessionID, WTFMove(blobFilePaths) } };
    20512053    return IDBError { };
    20522054}
     
    21522154            ASSERT(recordID);
    21532155            Vector<String> blobURLs, blobFilePaths;
    2154             auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, blobFilePaths);
     2156            PAL::SessionID sessionID;
     2157            auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, sessionID, blobFilePaths);
    21552158            ASSERT(blobURLs.size() == blobFilePaths.size());
    21562159
     
    21582161                return error;
    21592162
    2160             result.addValue({ resultBuffer, WTFMove(blobURLs), WTFMove(blobFilePaths) });
     2163            result.addValue({ resultBuffer, WTFMove(blobURLs), sessionID, WTFMove(blobFilePaths) });
    21612164        } else {
    21622165            Vector<uint8_t> keyData;
     
    23222325    int64_t recordID = sql->getColumnInt64(2);
    23232326    Vector<String> blobURLs, blobFilePaths;
    2324     auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, blobFilePaths);
     2327    PAL::SessionID sessionID;
     2328    auto error = getBlobRecordsForObjectStoreRecord(recordID, blobURLs, sessionID, blobFilePaths);
    23252329    ASSERT(blobURLs.size() == blobFilePaths.size());
    23262330
     
    23282332        return error;
    23292333
    2330     getResult = { { ThreadSafeDataBuffer::create(WTFMove(keyVector)), WTFMove(blobURLs), WTFMove(blobFilePaths) }, objectStoreKey };
     2334    getResult = { { ThreadSafeDataBuffer::create(WTFMove(keyVector)), WTFMove(blobURLs), sessionID, WTFMove(blobFilePaths) }, objectStoreKey };
    23312335    return IDBError { };
    23322336}
  • trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBBackingStore.h

    r237700 r238632  
    9292    IDBBackingStoreTemporaryFileHandler& temporaryFileHandler() const { return m_temporaryFileHandler; }
    9393
    94     IDBError getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, Vector<String>& blobFilePaths);
     94    IDBError getBlobRecordsForObjectStoreRecord(int64_t objectStoreRecord, Vector<String>& blobURLs, PAL::SessionID&, Vector<String>& blobFilePaths);
    9595
    9696    static String databaseNameFromEncodedFilename(const String&);
  • trunk/Source/WebCore/Modules/indexeddb/server/SQLiteIDBCursor.cpp

    r237590 r238632  
    457457
    458458        Vector<String> blobURLs, blobFilePaths;
    459         auto error = m_transaction->backingStore().getBlobRecordsForObjectStoreRecord(record.rowID, blobURLs, blobFilePaths);
     459        PAL::SessionID sessionID;
     460        auto error = m_transaction->backingStore().getBlobRecordsForObjectStoreRecord(record.rowID, blobURLs, sessionID, blobFilePaths);
    460461        if (!error.isNull()) {
    461462            LOG_ERROR("Unable to fetch blob records from database while advancing cursor");
     
    465466
    466467        if (m_cursorType == IndexedDB::CursorType::KeyAndValue)
    467             record.record.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::create(WTFMove(keyData)), blobURLs, blobFilePaths);
     468            record.record.value = std::make_unique<IDBValue>(ThreadSafeDataBuffer::create(WTFMove(keyData)), blobURLs, sessionID, blobFilePaths);
    468469    } else {
    469470        if (!deserializeIDBKeyData(keyData.data(), keyData.size(), record.record.primaryKey)) {
  • trunk/Source/WebCore/Modules/indexeddb/server/UniqueIDBDatabase.cpp

    r237969 r238632  
    10401040
    10411041    if (injectedRecordValue.data())
    1042         error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, { injectedRecordValue, originalRecordValue.blobURLs(), originalRecordValue.blobFilePaths() });
     1042        error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, { injectedRecordValue, originalRecordValue.blobURLs(), originalRecordValue.sessionID(), originalRecordValue.blobFilePaths() });
    10431043    else
    10441044        error = m_backingStore->addRecord(transactionIdentifier, *objectStoreInfo, usedKey, originalRecordValue);
  • trunk/Source/WebCore/bindings/js/IDBBindingUtilities.cpp

    r236007 r238632  
    344344    state.vm().apiLock().lock();
    345345    Vector<RefPtr<MessagePort>> messagePorts;
    346     JSValue result = serializedValue->deserialize(state, &globalObject, messagePorts, value.blobURLs(), value.blobFilePaths(), SerializationErrorMode::NonThrowing);
     346    JSValue result = serializedValue->deserialize(state, &globalObject, messagePorts, value.blobURLs(), value.sessionID(), value.blobFilePaths(), SerializationErrorMode::NonThrowing);
    347347    state.vm().apiLock().unlock();
    348348
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp

    r237779 r238632  
    548548            WasmModuleArray& wasmModules,
    549549#endif
    550             Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
     550        Vector<String>& blobURLs, const PAL::SessionID& sessionID, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
    551551    {
    552552        CloneSerializer serializer(exec, messagePorts, arrayBuffers, imageBitmaps,
     
    554554            wasmModules,
    555555#endif
    556             blobURLs, out, context, sharedBuffers);
     556            blobURLs, sessionID, out, context, sharedBuffers);
    557557        return serializer.serialize(value);
    558558    }
     
    581581            WasmModuleArray& wasmModules,
    582582#endif
    583             Vector<String>& blobURLs, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
     583        Vector<String>& blobURLs, const PAL::SessionID& sessionID, Vector<uint8_t>& out, SerializationContext context, ArrayBufferContentsArray& sharedBuffers)
    584584        : CloneBase(exec)
    585585        , m_buffer(out)
    586586        , m_blobURLs(blobURLs)
     587        , m_sessionID(sessionID)
    587588        , m_emptyIdentifier(Identifier::fromString(exec, emptyString()))
    588589        , m_context(context)
     
    10441045                Vector<uint8_t> serializedKey;
    10451046                Vector<String> dummyBlobURLs;
     1047                PAL::SessionID dummySessionID;
    10461048                Vector<RefPtr<MessagePort>> dummyMessagePorts;
    10471049                Vector<RefPtr<JSC::ArrayBuffer>> dummyArrayBuffers;
     
    10541056                    dummyModules,
    10551057#endif
    1056                     dummyBlobURLs, serializedKey, SerializationContext::Default, dummySharedBuffers);
     1058                    dummyBlobURLs, dummySessionID, serializedKey, SerializationContext::Default, dummySharedBuffers);
    10571059                rawKeySerializer.write(key);
    10581060                Vector<uint8_t> wrappedKey;
     
    14531455    Vector<uint8_t>& m_buffer;
    14541456    Vector<String>& m_blobURLs;
     1457    PAL::SessionID m_sessionID;
    14551458    ObjectPool m_objectPool;
    14561459    ObjectPool m_transferredMessagePorts;
     
    17361739    }
    17371740
    1738     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
     1741    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
    17391742#if ENABLE(WEBASSEMBLY)
    17401743        , WasmModuleArray* wasmModules
     
    17441747        if (!buffer.size())
    17451748            return std::make_pair(jsNull(), SerializationReturnCode::UnspecifiedError);
    1746         CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, blobFilePaths, sharedBuffers, WTFMove(imageBuffers)
     1749        CloneDeserializer deserializer(exec, globalObject, messagePorts, arrayBufferContentsArray, buffer, blobURLs, sessionID, blobFilePaths, sharedBuffers, WTFMove(imageBuffers)
    17471750#if ENABLE(WEBASSEMBLY)
    17481751            , wasmModules
     
    18181821    }
    18191822
    1820     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
     1823    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
    18211824#if ENABLE(WEBASSEMBLY)
    18221825        , WasmModuleArray* wasmModules
     
    18331836        , m_arrayBuffers(arrayBufferContents ? arrayBufferContents->size() : 0)
    18341837        , m_blobURLs(blobURLs)
     1838        , m_sessionID(sessionID)
    18351839        , m_blobFilePaths(blobFilePaths)
    18361840        , m_sharedBuffers(sharedBuffers)
     
    30393043    Vector<RefPtr<JSC::ArrayBuffer>> m_arrayBuffers;
    30403044    Vector<String> m_blobURLs;
     3045    PAL::SessionID m_sessionID;
    30413046    Vector<String> m_blobFilePaths;
    30423047    ArrayBufferContentsArray* m_sharedBuffers;
     
    32593264}
    32603265
    3261 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
     3266SerializedScriptValue::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
    32623267#if ENABLE(WEBASSEMBLY)
    32633268        , std::unique_ptr<WasmModuleArray> wasmModulesArray
     
    32713276    , m_wasmModulesArray(WTFMove(wasmModulesArray))
    32723277#endif
     3278    , m_sessionID(sessionID)
    32733279{
    32743280    // Since this SerializedScriptValue is meant to be passed between threads, its String data members
     
    33533359    Vector<uint8_t> buffer;
    33543360    Vector<String> blobURLs;
     3361    PAL::SessionID sessionID;
    33553362    Vector<RefPtr<MessagePort>> dummyMessagePorts;
    33563363    Vector<RefPtr<ImageBitmap>> dummyImageBitmaps;
     
    33643371        dummyModules,
    33653372#endif
    3366         blobURLs, buffer, SerializationContext::Default, dummySharedBuffers);
     3373        blobURLs, sessionID, buffer, SerializationContext::Default, dummySharedBuffers);
    33673374
    33683375#if ENABLE(WEBASSEMBLY)
     
    33763383        return nullptr;
    33773384
    3378     return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, nullptr, nullptr, { }
     3385    return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, sessionID, nullptr, nullptr, { }
    33793386#if ENABLE(WEBASSEMBLY)
    33803387        , nullptr
     
    34323439    Vector<uint8_t> buffer;
    34333440    Vector<String> blobURLs;
     3441    PAL::SessionID sessionID;
    34343442#if ENABLE(WEBASSEMBLY)
    34353443    WasmModuleArray wasmModules;
     
    34403448        wasmModules,
    34413449#endif
    3442         blobURLs, buffer, context, *sharedBuffers);
     3450        blobURLs, sessionID, buffer, context, *sharedBuffers);
    34433451
    34443452    if (code != SerializationReturnCode::SuccessfullyCompleted)
     
    34513459    auto imageBuffers = ImageBitmap::detachBitmaps(WTFMove(imageBitmaps));
    34523460
    3453     return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, arrayBufferContentsArray.releaseReturnValue(), context == SerializationContext::WorkerPostMessage ? WTFMove(sharedBuffers) : nullptr, WTFMove(imageBuffers)
     3461    return adoptRef(*new SerializedScriptValue(WTFMove(buffer), blobURLs, sessionID, arrayBufferContentsArray.releaseReturnValue(), context == SerializationContext::WorkerPostMessage ? WTFMove(sharedBuffers) : nullptr, WTFMove(imageBuffers)
    34543462#if ENABLE(WEBASSEMBLY)
    34553463                , std::make_unique<WasmModuleArray>(wasmModules)
     
    34993507    Vector<String> dummyBlobs;
    35003508    Vector<String> dummyPaths;
    3501     return deserialize(exec, globalObject, messagePorts, dummyBlobs, dummyPaths, throwExceptions);
     3509    PAL::SessionID dummySessionID;
     3510    return deserialize(exec, globalObject, messagePorts, dummyBlobs, dummySessionID, dummyPaths, throwExceptions);
    35023511}
    35033512
    3504 JSValue SerializedScriptValue::deserialize(ExecState& exec, JSGlobalObject* globalObject, const Vector<RefPtr<MessagePort>>& messagePorts, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode throwExceptions)
     3513JSValue 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)
    35053514{
    3506     DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, WTFMove(m_imageBuffers), m_arrayBufferContentsArray.get(), m_data, blobURLs, blobFilePaths, m_sharedBufferContentsArray.get()
     3515    DeserializationResult result = CloneDeserializer::deserialize(&exec, globalObject, messagePorts, WTFMove(m_imageBuffers), m_arrayBufferContentsArray.get(), m_data, blobURLs, sessionID, blobFilePaths, m_sharedBufferContentsArray.get()
    35073516#if ENABLE(WEBASSEMBLY)
    35083517        , m_wasmModulesArray.get()
     
    35533562}
    35543563
    3555 void SerializedScriptValue::writeBlobsToDiskForIndexedDB(WTF::Function<void (const IDBValue&)>&& completionHandler)
     3564void SerializedScriptValue::writeBlobsToDiskForIndexedDB(CompletionHandler<void(IDBValue&&)>&& completionHandler)
    35563565{
    35573566    ASSERT(isMainThread());
     
    35593568
    35603569    RefPtr<SerializedScriptValue> protectedThis(this);
    3561     blobRegistry().writeBlobsToTemporaryFiles(m_blobURLs, [completionHandler = WTFMove(completionHandler), this, protectedThis = WTFMove(protectedThis)](auto& blobFilePaths) {
     3570    // FIXME: Add m_sessionID as a parameter here.
     3571    blobRegistry().writeBlobsToTemporaryFiles(m_blobURLs, [completionHandler = WTFMove(completionHandler), this, protectedThis = WTFMove(protectedThis)] (auto& blobFilePaths) mutable {
    35623572        ASSERT(isMainThread());
    35633573
     
    35713581        ASSERT(m_blobURLs.size() == blobFilePaths.size());
    35723582       
    3573         completionHandler({ *this, m_blobURLs, blobFilePaths });
     3583        completionHandler({ *this, m_blobURLs, m_sessionID, blobFilePaths });
    35743584    });
    35753585}
     
    35853595
    35863596    RunLoop::main().dispatch([this, conditionPtr = &condition, valuePtr = &value] {
    3587         writeBlobsToDiskForIndexedDB([conditionPtr, valuePtr](const IDBValue& result) {
     3597        writeBlobsToDiskForIndexedDB([conditionPtr, valuePtr](IDBValue&& result) {
    35883598            ASSERT(isMainThread());
    35893599            valuePtr->setAsIsolatedCopy(result);
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.h

    r230828 r238632  
    3232#include <JavaScriptCore/JSCJSValue.h>
    3333#include <JavaScriptCore/Strong.h>
     34#include <pal/SessionID.h>
    3435#include <wtf/Forward.h>
    3536#include <wtf/Function.h>
     
    7879    WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, SerializationErrorMode = SerializationErrorMode::Throwing);
    7980    WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, const Vector<RefPtr<MessagePort>>&, SerializationErrorMode = SerializationErrorMode::Throwing);
    80     JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, const Vector<RefPtr<MessagePort>>&, const Vector<String>& blobURLs, const Vector<String>& blobFilePaths, SerializationErrorMode = SerializationErrorMode::Throwing);
     81    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);
    8182
    8283    static uint32_t wireFormatVersion();
     
    9394#if ENABLE(INDEXED_DATABASE)
    9495    Vector<String> blobURLsIsolatedCopy() const;
    95     void writeBlobsToDiskForIndexedDB(WTF::Function<void (const IDBValue&)>&& completionHandler);
     96    const PAL::SessionID& sessionID() const { return m_sessionID; }
     97    void writeBlobsToDiskForIndexedDB(CompletionHandler<void(IDBValue&&)>&&);
    9698    IDBValue writeBlobsToDiskForIndexedDBSynchronously();
    9799#endif // ENABLE(INDEXED_DATABASE)
     
    111113    WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&);
    112114    WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&, std::unique_ptr<ArrayBufferContentsArray>);
    113     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
     115    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
    114116#if ENABLE(WEBASSEMBLY)
    115117        , std::unique_ptr<WasmModuleArray>
     
    125127#endif
    126128    Vector<String> m_blobURLs;
     129    PAL::SessionID m_sessionID;
    127130};
    128131
Note: See TracChangeset for help on using the changeset viewer.