Title: [288298] trunk/Source
Revision
288298
Author
sihui_...@apple.com
Date
2022-01-20 09:24:01 -0800 (Thu, 20 Jan 2022)

Log Message

Make LocalStorage prewarming async
https://bugs.webkit.org/show_bug.cgi?id=235236

Reviewed by Chris Dumez.

Source/WebCore:

* page/DOMWindow.cpp:
(WebCore::DOMWindow::prewarmLocalStorageIfNecessary):
* page/Frame.cpp:
(WebCore::Frame::didPrewarmLocalStorage): Deleted.
(WebCore::Frame::mayPrewarmLocalStorage const): Deleted.
* page/Frame.h:
* storage/StorageArea.h:
(WebCore::StorageArea::prewarm):
* storage/StorageType.h:

Source/WebKit:

StorageAreaMap in web process needs to sync with a remote StorageArea in network process before it performs any
Web Storage operation. To connect to remote StorageArea, StorageAreaMap currently sends out two sync messages:
1. ConnectTo*StorageArea: for getting the remote StorageAreaIdentifier
2. getValues: for getting the content of StorageArea
We can merge these two messages into one message: ConnectToStorageAreaSync, and return both remote
StorageAreaIdentifier and content in its reply. This way, web process will not be blocked twice.

To reduce the wait time for connecting to a local StorageArea, we would prewarm LocalStorage by creating its
StorageAreaMap ahead and making it connected (r247555), but we don't actually need StorageAreaMap to be ready
for operation at this time. Therefore, a new async message ConnectToStorageArea is added to be used for
prewarming.

If LocalStorage is used immediately after prewarming, a StorageAreaMap may send ConnectToStorageAreaSync before
receiving the reply of ConnectToStorageArea. In this case, StorageAreaMap would handle ConnectToStorageAreaSync
reply before ConnectToStorageArea reply (due to the priority of sync message), and also before other async
messages (DispatchStorageEvent / ClearCache) that are sent from network process earlier before the sync reply.
To solve this, we use a message identifier to indicate the order of messages sent from network process, so
StorageAreaMap can ignore previous messages when it is already synced with a more recent version of StorageArea.

* NetworkProcess/WebStorage/StorageArea.cpp:
(WebKit::StorageArea::clear):
(WebKit::StorageArea::dispatchEvents const):
* NetworkProcess/storage/LocalStorageManager.cpp:
(WebKit::LocalStorageManager::connectToLocalStorageArea):
(WebKit::LocalStorageManager::connectToTransientLocalStorageArea):
* NetworkProcess/storage/LocalStorageManager.h:
* NetworkProcess/storage/NetworkStorageManager.cpp:
(WebKit::NetworkStorageManager::connectToStorageArea):
(WebKit::NetworkStorageManager::connectToStorageAreaSync):
(WebKit::NetworkStorageManager::connectToLocalStorageArea): Deleted.
(WebKit::NetworkStorageManager::connectToTransientLocalStorageArea): Deleted.
(WebKit::NetworkStorageManager::connectToSessionStorageArea): Deleted.
(WebKit::NetworkStorageManager::getValues): Deleted.
* NetworkProcess/storage/NetworkStorageManager.h:
* NetworkProcess/storage/NetworkStorageManager.messages.in:
* NetworkProcess/storage/SessionStorageManager.cpp:
(WebKit::SessionStorageManager::connectToSessionStorageArea):
* NetworkProcess/storage/SessionStorageManager.h:
* NetworkProcess/storage/StorageAreaBase.cpp:
(WebKit::StorageAreaBase::nextMessageIdentifier):
(WebKit::StorageAreaBase::StorageAreaBase):
(WebKit::StorageAreaBase::addListener):
(WebKit::StorageAreaBase::notifyListenersAboutClear):
(WebKit::StorageAreaBase::dispatchEvents const):
* NetworkProcess/storage/StorageAreaBase.h:
* Scripts/webkit/messages.py:
(types_that_cannot_be_forward_declared):
(headers_for_type):
* WebKit.xcodeproj/project.pbxproj:
* WebProcess/Network/NetworkProcessConnection.cpp:
(WebKit::NetworkProcessConnection::didReceiveMessage):
* WebProcess/WebProcess.cpp:
(WebKit::WebProcess::networkProcessConnectionClosed):
(WebKit::WebProcess::registerStorageAreaMap):
(WebKit::WebProcess::unregisterStorageAreaMap):
(WebKit::WebProcess::storageAreaMap const):
* WebProcess/WebProcess.h:
* WebProcess/WebStorage/StorageAreaImpl.cpp:
(WebKit::StorageAreaImpl::prewarm):
(WebKit::StorageAreaImpl::incrementAccessCount): Deleted.
(WebKit::StorageAreaImpl::decrementAccessCount): Deleted.
(WebKit::StorageAreaImpl::closeDatabaseIfIdle): Deleted.
* WebProcess/WebStorage/StorageAreaImpl.h:
* WebProcess/WebStorage/StorageAreaMap.cpp:
(WebKit::StorageAreaMap::StorageAreaMap):
(WebKit::StorageAreaMap::~StorageAreaMap):
(WebKit::StorageAreaMap::setItem):
(WebKit::StorageAreaMap::removeItem):
(WebKit::StorageAreaMap::clear):
(WebKit::StorageAreaMap::ensureMap):
(WebKit::StorageAreaMap::dispatchStorageEvent):
(WebKit::StorageAreaMap::clearCache):
(WebKit::StorageAreaMap::sendConnectMessage):
(WebKit::StorageAreaMap::connectSync):
(WebKit::StorageAreaMap::connect):
(WebKit::StorageAreaMap::didConnect):
(WebKit::StorageAreaMap::disconnect):
* WebProcess/WebStorage/StorageAreaMap.h:
* WebProcess/WebStorage/StorageAreaMap.messages.in:
* WebProcess/WebStorage/StorageAreaMapIdentifier.h: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (288297 => 288298)


--- trunk/Source/WebCore/ChangeLog	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebCore/ChangeLog	2022-01-20 17:24:01 UTC (rev 288298)
@@ -1,3 +1,20 @@
+2022-01-20  Sihui Liu  <sihui_...@apple.com>
+
+        Make LocalStorage prewarming async
+        https://bugs.webkit.org/show_bug.cgi?id=235236
+
+        Reviewed by Chris Dumez.
+
+        * page/DOMWindow.cpp:
+        (WebCore::DOMWindow::prewarmLocalStorageIfNecessary):
+        * page/Frame.cpp:
+        (WebCore::Frame::didPrewarmLocalStorage): Deleted.
+        (WebCore::Frame::mayPrewarmLocalStorage const): Deleted.
+        * page/Frame.h:
+        * storage/StorageArea.h:
+        (WebCore::StorageArea::prewarm):
+        * storage/StorageType.h:
+
 2022-01-20  Alan Bujtas  <za...@apple.com>
 
         Address post-landing review comments from Darin.

Modified: trunk/Source/WebCore/page/DOMWindow.cpp (288297 => 288298)


--- trunk/Source/WebCore/page/DOMWindow.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebCore/page/DOMWindow.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -413,9 +413,6 @@
     if (!page || page->usesEphemeralSession())
         return;
 
-    if (!page->mainFrame().mayPrewarmLocalStorage())
-        return;
-
     // This eagerly constructs the StorageArea, which will load items from disk.
     auto localStorageResult = this->localStorage();
     if (localStorageResult.hasException())
@@ -425,7 +422,7 @@
     if (!localStorage)
         return;
 
-    page->mainFrame().didPrewarmLocalStorage();
+    localStorage->area().prewarm();
 }
 
 DOMWindow::~DOMWindow()

Modified: trunk/Source/WebCore/page/Frame.cpp (288297 => 288298)


--- trunk/Source/WebCore/page/Frame.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebCore/page/Frame.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -1057,19 +1057,6 @@
         tree().removeChild(*child);
 }
 
-void Frame::didPrewarmLocalStorage()
-{
-    ASSERT(isMainFrame());
-    ASSERT(m_localStoragePrewarmingCount < maxlocalStoragePrewarmingCount);
-    ++m_localStoragePrewarmingCount;
-}
-
-bool Frame::mayPrewarmLocalStorage() const
-{
-    ASSERT(isMainFrame());
-    return m_localStoragePrewarmingCount < maxlocalStoragePrewarmingCount;
-}
-
 FloatSize Frame::screenSize() const
 {
     if (!m_overrideScreenSize.isEmpty())

Modified: trunk/Source/WebCore/page/Frame.h (288297 => 288298)


--- trunk/Source/WebCore/page/Frame.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebCore/page/Frame.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -291,9 +291,6 @@
     void resumeActiveDOMObjectsAndAnimations();
     bool activeDOMObjectsAndAnimationsSuspended() const { return m_activeDOMObjectsAndAnimationsSuspendedCount > 0; }
 
-    void didPrewarmLocalStorage();
-    bool mayPrewarmLocalStorage() const;
-
     enum class InvalidateContentEventRegionsReason { Layout, EventHandlerChange };
     void invalidateContentEventRegionsIfNeeded(InvalidateContentEventRegionsReason);
 
@@ -361,7 +358,6 @@
     unsigned m_navigationDisableCount { 0 };
     unsigned m_selfOnlyRefCount { 0 };
     bool m_hasHadUserInteraction { false };
-    unsigned m_localStoragePrewarmingCount { 0 };
 
     FloatSize m_overrideScreenSize;
 

Modified: trunk/Source/WebCore/storage/StorageArea.h (288297 => 288298)


--- trunk/Source/WebCore/storage/StorageArea.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebCore/storage/StorageArea.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -58,6 +58,7 @@
     virtual void incrementAccessCount() { }
     virtual void decrementAccessCount() { }
     virtual void closeDatabaseIfIdle() { }
+    virtual void prewarm() { }
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/storage/StorageType.h (288297 => 288298)


--- trunk/Source/WebCore/storage/StorageType.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebCore/storage/StorageType.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -25,6 +25,8 @@
 
 #pragma once
 
+#include <wtf/EnumTraits.h>
+
 namespace WebCore {
 
 enum class StorageType : uint8_t {
@@ -44,3 +46,16 @@
 }
 
 } // namespace WebCore
+
+namespace WTF {
+
+template<> struct EnumTraits<WebCore::StorageType> {
+    using values = EnumValues<
+        WebCore::StorageType,
+        WebCore::StorageType::Session,
+        WebCore::StorageType::Local,
+        WebCore::StorageType::TransientLocal
+    >;
+};
+
+} // namespace WTF

Modified: trunk/Source/WebKit/ChangeLog (288297 => 288298)


--- trunk/Source/WebKit/ChangeLog	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/ChangeLog	2022-01-20 17:24:01 UTC (rev 288298)
@@ -1,3 +1,91 @@
+2022-01-20  Sihui Liu  <sihui_...@apple.com>
+
+        Make LocalStorage prewarming async
+        https://bugs.webkit.org/show_bug.cgi?id=235236
+
+        Reviewed by Chris Dumez.
+
+        StorageAreaMap in web process needs to sync with a remote StorageArea in network process before it performs any
+        Web Storage operation. To connect to remote StorageArea, StorageAreaMap currently sends out two sync messages:
+        1. ConnectTo*StorageArea: for getting the remote StorageAreaIdentifier
+        2. getValues: for getting the content of StorageArea
+        We can merge these two messages into one message: ConnectToStorageAreaSync, and return both remote 
+        StorageAreaIdentifier and content in its reply. This way, web process will not be blocked twice.
+
+        To reduce the wait time for connecting to a local StorageArea, we would prewarm LocalStorage by creating its 
+        StorageAreaMap ahead and making it connected (r247555), but we don't actually need StorageAreaMap to be ready 
+        for operation at this time. Therefore, a new async message ConnectToStorageArea is added to be used for 
+        prewarming.
+
+        If LocalStorage is used immediately after prewarming, a StorageAreaMap may send ConnectToStorageAreaSync before 
+        receiving the reply of ConnectToStorageArea. In this case, StorageAreaMap would handle ConnectToStorageAreaSync 
+        reply before ConnectToStorageArea reply (due to the priority of sync message), and also before other async 
+        messages (DispatchStorageEvent / ClearCache) that are sent from network process earlier before the sync reply.
+        To solve this, we use a message identifier to indicate the order of messages sent from network process, so
+        StorageAreaMap can ignore previous messages when it is already synced with a more recent version of StorageArea.
+
+        * NetworkProcess/WebStorage/StorageArea.cpp:
+        (WebKit::StorageArea::clear):
+        (WebKit::StorageArea::dispatchEvents const):
+        * NetworkProcess/storage/LocalStorageManager.cpp:
+        (WebKit::LocalStorageManager::connectToLocalStorageArea):
+        (WebKit::LocalStorageManager::connectToTransientLocalStorageArea):
+        * NetworkProcess/storage/LocalStorageManager.h:
+        * NetworkProcess/storage/NetworkStorageManager.cpp:
+        (WebKit::NetworkStorageManager::connectToStorageArea):
+        (WebKit::NetworkStorageManager::connectToStorageAreaSync):
+        (WebKit::NetworkStorageManager::connectToLocalStorageArea): Deleted.
+        (WebKit::NetworkStorageManager::connectToTransientLocalStorageArea): Deleted.
+        (WebKit::NetworkStorageManager::connectToSessionStorageArea): Deleted.
+        (WebKit::NetworkStorageManager::getValues): Deleted.
+        * NetworkProcess/storage/NetworkStorageManager.h:
+        * NetworkProcess/storage/NetworkStorageManager.messages.in:
+        * NetworkProcess/storage/SessionStorageManager.cpp:
+        (WebKit::SessionStorageManager::connectToSessionStorageArea):
+        * NetworkProcess/storage/SessionStorageManager.h:
+        * NetworkProcess/storage/StorageAreaBase.cpp:
+        (WebKit::StorageAreaBase::nextMessageIdentifier):
+        (WebKit::StorageAreaBase::StorageAreaBase):
+        (WebKit::StorageAreaBase::addListener):
+        (WebKit::StorageAreaBase::notifyListenersAboutClear):
+        (WebKit::StorageAreaBase::dispatchEvents const):
+        * NetworkProcess/storage/StorageAreaBase.h:
+        * Scripts/webkit/messages.py:
+        (types_that_cannot_be_forward_declared):
+        (headers_for_type):
+        * WebKit.xcodeproj/project.pbxproj:
+        * WebProcess/Network/NetworkProcessConnection.cpp:
+        (WebKit::NetworkProcessConnection::didReceiveMessage):
+        * WebProcess/WebProcess.cpp:
+        (WebKit::WebProcess::networkProcessConnectionClosed):
+        (WebKit::WebProcess::registerStorageAreaMap):
+        (WebKit::WebProcess::unregisterStorageAreaMap):
+        (WebKit::WebProcess::storageAreaMap const):
+        * WebProcess/WebProcess.h:
+        * WebProcess/WebStorage/StorageAreaImpl.cpp:
+        (WebKit::StorageAreaImpl::prewarm):
+        (WebKit::StorageAreaImpl::incrementAccessCount): Deleted.
+        (WebKit::StorageAreaImpl::decrementAccessCount): Deleted.
+        (WebKit::StorageAreaImpl::closeDatabaseIfIdle): Deleted.
+        * WebProcess/WebStorage/StorageAreaImpl.h:
+        * WebProcess/WebStorage/StorageAreaMap.cpp:
+        (WebKit::StorageAreaMap::StorageAreaMap):
+        (WebKit::StorageAreaMap::~StorageAreaMap):
+        (WebKit::StorageAreaMap::setItem):
+        (WebKit::StorageAreaMap::removeItem):
+        (WebKit::StorageAreaMap::clear):
+        (WebKit::StorageAreaMap::ensureMap):
+        (WebKit::StorageAreaMap::dispatchStorageEvent):
+        (WebKit::StorageAreaMap::clearCache):
+        (WebKit::StorageAreaMap::sendConnectMessage):
+        (WebKit::StorageAreaMap::connectSync):
+        (WebKit::StorageAreaMap::connect):
+        (WebKit::StorageAreaMap::didConnect):
+        (WebKit::StorageAreaMap::disconnect):
+        * WebProcess/WebStorage/StorageAreaMap.h:
+        * WebProcess/WebStorage/StorageAreaMap.messages.in:
+        * WebProcess/WebStorage/StorageAreaMapIdentifier.h: Added.
+
 2022-01-20  Youenn Fablet  <you...@apple.com>
 
         Disable fallback path to WebRTC platform sockets

Modified: trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -165,7 +165,7 @@
     }
 
     for (auto& listenerUniqueID : m_eventListeners)
-        IPC::Connection::send(listenerUniqueID, Messages::StorageAreaMap::ClearCache(), m_identifier.toUInt64());
+        IPC::Connection::send(listenerUniqueID, Messages::StorageAreaMap::ClearCache(0), m_identifier.toUInt64());
 }
 
 LocalStorageDatabase& StorageArea::ensureDatabase() const
@@ -188,7 +188,7 @@
     ASSERT(storageAreaImplID);
     for (auto& listenerUniqueID : m_eventListeners) {
         auto optionalStorageAreaImplID = listenerUniqueID == sourceConnection ? std::make_optional(storageAreaImplID) : std::nullopt;
-        IPC::Connection::send(listenerUniqueID, Messages::StorageAreaMap::DispatchStorageEvent(optionalStorageAreaImplID, key, oldValue, newValue, urlString), m_identifier.toUInt64());
+        IPC::Connection::send(listenerUniqueID, Messages::StorageAreaMap::DispatchStorageEvent(optionalStorageAreaImplID, key, oldValue, newValue, urlString, 0), m_identifier.toUInt64());
     }
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.cpp (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -165,7 +165,7 @@
     m_transientStorageArea = nullptr;
 }
 
-StorageAreaIdentifier LocalStorageManager::connectToLocalStorageArea(IPC::Connection::UniqueID connection, const WebCore::ClientOrigin& origin, Ref<WorkQueue>&& workQueue)
+StorageAreaIdentifier LocalStorageManager::connectToLocalStorageArea(IPC::Connection::UniqueID connection, StorageAreaMapIdentifier sourceIdentifier, const WebCore::ClientOrigin& origin, Ref<WorkQueue>&& workQueue)
 {
     if (!m_localStorageArea) {
         if (!m_path.isEmpty())
@@ -177,11 +177,11 @@
     }
 
     ASSERT(m_path.isEmpty() || m_localStorageArea->type() == StorageAreaBase::Type::SQLite);
-    m_localStorageArea->addListener(connection);
+    m_localStorageArea->addListener(connection, sourceIdentifier);
     return m_localStorageArea->identifier();
 }
 
-StorageAreaIdentifier LocalStorageManager::connectToTransientLocalStorageArea(IPC::Connection::UniqueID connection, const WebCore::ClientOrigin& origin)
+StorageAreaIdentifier LocalStorageManager::connectToTransientLocalStorageArea(IPC::Connection::UniqueID connection, StorageAreaMapIdentifier sourceIdentifier, const WebCore::ClientOrigin& origin)
 {
     if (!m_transientStorageArea) {
         m_transientStorageArea = makeUnique<MemoryStorageArea>(origin, StorageAreaBase::StorageType::Local);
@@ -189,7 +189,7 @@
     }
 
     ASSERT(m_transientStorageArea->type() == StorageAreaBase::Type::Memory);
-    m_transientStorageArea->addListener(connection);
+    m_transientStorageArea->addListener(connection, sourceIdentifier);
     return m_transientStorageArea->identifier();
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -27,6 +27,7 @@
 
 #include "Connection.h"
 #include "StorageAreaIdentifier.h"
+#include "StorageAreaMapIdentifier.h"
 #include <wtf/WorkQueue.h>
 
 namespace WebCore {
@@ -56,8 +57,8 @@
     void syncLocalStorage();
     void connectionClosed(IPC::Connection::UniqueID);
 
-    StorageAreaIdentifier connectToLocalStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&, Ref<WorkQueue>&&);
-    StorageAreaIdentifier connectToTransientLocalStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&);
+    StorageAreaIdentifier connectToLocalStorageArea(IPC::Connection::UniqueID, StorageAreaMapIdentifier, const WebCore::ClientOrigin&, Ref<WorkQueue>&&);
+    StorageAreaIdentifier connectToTransientLocalStorageArea(IPC::Connection::UniqueID, StorageAreaMapIdentifier, const WebCore::ClientOrigin&);
     void disconnectFromStorageArea(IPC::Connection::UniqueID, StorageAreaIdentifier);
 
 private:

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -625,24 +625,33 @@
     });
 }
 
-void NetworkStorageManager::connectToLocalStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier, WebCore::SecurityOriginData&& topOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler)
+void NetworkStorageManager::connectToStorageArea(IPC::Connection& connection, WebCore::StorageType type, StorageAreaMapIdentifier sourceIdentifier, StorageNamespaceIdentifier namespaceIdentifier, const WebCore::ClientOrigin& origin, CompletionHandler<void(StorageAreaIdentifier, HashMap<String, String>, uint64_t)>&& completionHandler)
 {
     ASSERT(!RunLoop::isMain());
 
-    WebCore::ClientOrigin origin = { topOrigin, topOrigin };
-    completionHandler(localOriginStorageManager(origin).localStorageManager(*m_storageAreaRegistry).connectToLocalStorageArea(connection.uniqueID(), origin, m_queue.copyRef()));
-}
+    auto connectionIdentifier = connection.uniqueID();
+    auto& originStorageManager = localOriginStorageManager(origin);
+    StorageAreaIdentifier resultIdentifier;
+    switch (type) {
+    case WebCore::StorageType::Local:
+        resultIdentifier = originStorageManager.localStorageManager(*m_storageAreaRegistry).connectToLocalStorageArea(connectionIdentifier, sourceIdentifier, origin, m_queue.copyRef());
+        break;
+    case WebCore::StorageType::TransientLocal:
+        resultIdentifier = originStorageManager.localStorageManager(*m_storageAreaRegistry).connectToTransientLocalStorageArea(connectionIdentifier, sourceIdentifier, origin);
+        break;
+    case WebCore::StorageType::Session:
+        resultIdentifier = originStorageManager.sessionStorageManager(*m_storageAreaRegistry).connectToSessionStorageArea(connectionIdentifier, sourceIdentifier, origin, namespaceIdentifier);
+    }
 
-void NetworkStorageManager::connectToTransientLocalStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier, WebCore::SecurityOriginData&& topOrigin, WebCore::SecurityOriginData&& openingOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler)
-{
-    WebCore::ClientOrigin origin = { topOrigin, openingOrigin };
-    completionHandler(localOriginStorageManager(origin).localStorageManager(*m_storageAreaRegistry).connectToTransientLocalStorageArea(connection.uniqueID(), origin));
+    if (auto storageArea = m_storageAreaRegistry->getStorageArea(resultIdentifier))
+        return completionHandler(resultIdentifier, storageArea->allItems(), StorageAreaBase::nextMessageIdentifier());
+
+    return completionHandler(resultIdentifier, HashMap<String, String> { }, StorageAreaBase::nextMessageIdentifier());
 }
 
-void NetworkStorageManager::connectToSessionStorageArea(IPC::Connection& connection, StorageNamespaceIdentifier identifier, WebCore::SecurityOriginData&& topOrigin, CompletionHandler<void(StorageAreaIdentifier)>&& completionHandler)
+void NetworkStorageManager::connectToStorageAreaSync(IPC::Connection& connection, WebCore::StorageType type, StorageAreaMapIdentifier sourceIdentifier, StorageNamespaceIdentifier namespaceIdentifier, const WebCore::ClientOrigin& origin, CompletionHandler<void(StorageAreaIdentifier, HashMap<String, String>, uint64_t)>&& completionHandler)
 {
-    WebCore::ClientOrigin origin = { topOrigin, topOrigin };
-    completionHandler(localOriginStorageManager(origin).sessionStorageManager(*m_storageAreaRegistry).connectToSessionStorageArea(connection.uniqueID(), origin, identifier));
+    connectToStorageArea(connection, type, sourceIdentifier, namespaceIdentifier, origin, WTFMove(completionHandler));
 }
 
 void NetworkStorageManager::disconnectFromStorageArea(IPC::Connection& connection, StorageAreaIdentifier identifier)
@@ -669,16 +678,6 @@
     }
 }
 
-void NetworkStorageManager::getValues(StorageAreaIdentifier identifier, CompletionHandler<void(const HashMap<String, String>&)>&& completionHandler)
-{
-    ASSERT(!RunLoop::isMain());
-
-    if (auto storageArea = m_storageAreaRegistry->getStorageArea(identifier))
-        return completionHandler(storageArea->allItems());
-    
-    return completionHandler({ });
-}
-
 void NetworkStorageManager::setItem(IPC::Connection& connection, StorageAreaIdentifier identifier, StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String&& key, String&& value, String&& urlString)
 {
     ASSERT(!RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -30,6 +30,7 @@
 #include "OriginStorageManager.h"
 #include "StorageAreaIdentifier.h"
 #include "StorageAreaImplIdentifier.h"
+#include "StorageAreaMapIdentifier.h"
 #include "StorageNamespaceIdentifier.h"
 #include "WebsiteData.h"
 #include <WebCore/ClientOrigin.h>
@@ -44,6 +45,7 @@
 
 namespace WebCore {
 struct ClientOrigin;
+enum class StorageType : uint8_t;
 }
 
 namespace WebKit {
@@ -108,12 +110,10 @@
     void getHandle(IPC::Connection&, WebCore::FileSystemHandleIdentifier, String&& name, CompletionHandler<void(Expected<std::pair<WebCore::FileSystemHandleIdentifier, bool>, FileSystemStorageError>)>&&);
     
     // Message handlers for WebStorage.
-    void connectToLocalStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&);
-    void connectToTransientLocalStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&);
-    void connectToSessionStorageArea(IPC::Connection&, StorageNamespaceIdentifier, WebCore::SecurityOriginData&&, CompletionHandler<void(StorageAreaIdentifier)>&&);
+    void connectToStorageArea(IPC::Connection&, WebCore::StorageType, StorageAreaMapIdentifier, StorageNamespaceIdentifier, const WebCore::ClientOrigin&, CompletionHandler<void(StorageAreaIdentifier, HashMap<String, String>, uint64_t)>&&);
+    void connectToStorageAreaSync(IPC::Connection&, WebCore::StorageType, StorageAreaMapIdentifier, StorageNamespaceIdentifier, const WebCore::ClientOrigin&, CompletionHandler<void(StorageAreaIdentifier, HashMap<String, String>, uint64_t)>&&);
     void disconnectFromStorageArea(IPC::Connection&, StorageAreaIdentifier);
     void cloneSessionStorageNamespace(IPC::Connection&, StorageNamespaceIdentifier, StorageNamespaceIdentifier);
-    void getValues(StorageAreaIdentifier, CompletionHandler<void(const HashMap<String, String>&)>&&);
     void setItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& key, String&& value, String&& urlString);
     void removeItem(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& key, String&& urlString);
     void clear(IPC::Connection&, StorageAreaIdentifier, StorageAreaImplIdentifier, uint64_t seed, String&& urlString);

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in	2022-01-20 17:24:01 UTC (rev 288298)
@@ -40,12 +40,10 @@
     GetHandleNames(WebCore::FileSystemHandleIdentifier identifier) -> (Expected<Vector<String>, WebKit::FileSystemStorageError> result) Async
     GetHandle(WebCore::FileSystemHandleIdentifier identifier, String name) -> (Expected<std::pair<WebCore::FileSystemHandleIdentifier, bool>, WebKit::FileSystemStorageError> result) Async WantsConnection
 
-    ConnectToLocalStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection
-    ConnectToTransientLocalStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData topLevelSecurityOriginData, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection
-    ConnectToSessionStorageArea(WebKit::StorageNamespaceIdentifier storageNamespaceID, struct WebCore::SecurityOriginData securityOriginData) -> (WebKit::StorageAreaIdentifier identifier) Synchronous WantsConnection
+    ConnectToStorageArea(WebCore::StorageType type, WebKit::StorageAreaMapIdentifier sourceIdentifier, WebKit::StorageNamespaceIdentifier namespaceIdentifier, struct WebCore::ClientOrigin origin) -> (WebKit::StorageAreaIdentifier identifier, HashMap<String, String> items, uint64_t messageIdentifier) Async WantsConnection
+    ConnectToStorageAreaSync(WebCore::StorageType type, WebKit::StorageAreaMapIdentifier sourceIdentifier, WebKit::StorageNamespaceIdentifier namespaceIdentifier, struct WebCore::ClientOrigin origin) -> (WebKit::StorageAreaIdentifier identifier, HashMap<String, String> items, uint64_t messageIdentifier) Synchronous WantsConnection
     DisconnectFromStorageArea(WebKit::StorageAreaIdentifier identifier) WantsConnection
     CloneSessionStorageNamespace(WebKit::StorageNamespaceIdentifier fromStorageNamespaceID, WebKit::StorageNamespaceIdentifier toStorageNamespaceID) WantsConnection
-    GetValues(WebKit::StorageAreaIdentifier identifier) -> (HashMap<String, String> values) Synchronous
     SetItem(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String key, String value, String urlString) WantsConnection
     RemoveItem(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String key, String urlString) WantsConnection
     Clear(WebKit::StorageAreaIdentifier identifier, WebKit::StorageAreaImplIdentifier implIdentifier, uint64_t storageMapSeed, String urlString) WantsConnection

Modified: trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -72,7 +72,7 @@
     return identifier;
 }
 
-StorageAreaIdentifier SessionStorageManager::connectToSessionStorageArea(IPC::Connection::UniqueID connection, const WebCore::ClientOrigin& origin, StorageNamespaceIdentifier namespaceIdentifier)
+StorageAreaIdentifier SessionStorageManager::connectToSessionStorageArea(IPC::Connection::UniqueID connection, StorageAreaMapIdentifier sourceIdentifier, const WebCore::ClientOrigin& origin, StorageNamespaceIdentifier namespaceIdentifier)
 {
     auto identifier = m_storageAreasByNamespace.get(namespaceIdentifier);
     if (!identifier.isValid()) {
@@ -84,7 +84,8 @@
     if (!storageArea)
         return StorageAreaIdentifier { };
 
-    storageArea->addListener(connection);
+    storageArea->addListener(connection, sourceIdentifier);
+
     return identifier;
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -27,6 +27,7 @@
 
 #include "Connection.h"
 #include "StorageAreaIdentifier.h"
+#include "StorageAreaMapIdentifier.h"
 #include "StorageNamespaceIdentifier.h"
 
 namespace WebCore {
@@ -47,7 +48,7 @@
     void clearData();
     void connectionClosed(IPC::Connection::UniqueID);
 
-    StorageAreaIdentifier connectToSessionStorageArea(IPC::Connection::UniqueID, const WebCore::ClientOrigin&, StorageNamespaceIdentifier);
+    StorageAreaIdentifier connectToSessionStorageArea(IPC::Connection::UniqueID, StorageAreaMapIdentifier, const WebCore::ClientOrigin&, StorageNamespaceIdentifier);
     void disconnectFromStorageArea(IPC::Connection::UniqueID, StorageAreaIdentifier);
     void cloneStorageArea(IPC::Connection::UniqueID, StorageNamespaceIdentifier, StorageNamespaceIdentifier);
 

Modified: trunk/Source/WebKit/NetworkProcess/storage/StorageAreaBase.cpp (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/StorageAreaBase.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/StorageAreaBase.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -30,8 +30,14 @@
 
 namespace WebKit {
 
+uint64_t StorageAreaBase::nextMessageIdentifier()
+{
+    static std::atomic<uint64_t> currentIdentifier;
+    return ++currentIdentifier;
+}
+
 StorageAreaBase::StorageAreaBase(unsigned quota, const WebCore::ClientOrigin& origin)
-    : m_identifier(StorageAreaIdentifier::generate())
+    : m_identifier(StorageAreaIdentifier::generateThreadSafe())
     , m_quota(quota)
     , m_origin(origin)
 {
@@ -39,11 +45,11 @@
 
 StorageAreaBase::~StorageAreaBase() = default;
 
-void StorageAreaBase::addListener(IPC::Connection::UniqueID connection)
+void StorageAreaBase::addListener(IPC::Connection::UniqueID connection, StorageAreaMapIdentifier identifier)
 {
-    ASSERT(!m_listeners.contains(connection));
+    ASSERT(!m_listeners.contains(connection) || m_listeners.get(connection) == identifier);
 
-    m_listeners.add(connection);
+    m_listeners.add(connection, identifier);
 }
 
 void StorageAreaBase::removeListener(IPC::Connection::UniqueID connection)
@@ -58,8 +64,8 @@
 
 void StorageAreaBase::notifyListenersAboutClear()
 {
-    for (auto& connection : m_listeners)
-        IPC::Connection::send(connection, Messages::StorageAreaMap::ClearCache(), m_identifier.toUInt64());
+    for (auto& [connection, identifier] : m_listeners)
+        IPC::Connection::send(connection, Messages::StorageAreaMap::ClearCache(StorageAreaBase::nextMessageIdentifier()), identifier.toUInt64());
 }
 
 void StorageAreaBase::dispatchEvents(IPC::Connection::UniqueID sourceConnection, StorageAreaImplIdentifier sourceImplIdentifier, const String& key, const String& oldValue, const String& newValue, const String& urlString) const
@@ -66,11 +72,11 @@
 {
     ASSERT(sourceImplIdentifier);
 
-    for (auto& connection : m_listeners) {
+    for (auto& [connection, identifier] : m_listeners) {
         std::optional<StorageAreaImplIdentifier> implIdentifier;
         if (connection == sourceConnection)
             implIdentifier = sourceImplIdentifier;
-        IPC::Connection::send(connection, Messages::StorageAreaMap::DispatchStorageEvent(implIdentifier, key, oldValue, newValue, urlString), m_identifier.toUInt64());
+        IPC::Connection::send(connection, Messages::StorageAreaMap::DispatchStorageEvent(implIdentifier, key, oldValue, newValue, urlString, StorageAreaBase::nextMessageIdentifier()), identifier.toUInt64());
     }
 }
 

Modified: trunk/Source/WebKit/NetworkProcess/storage/StorageAreaBase.h (288297 => 288298)


--- trunk/Source/WebKit/NetworkProcess/storage/StorageAreaBase.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/NetworkProcess/storage/StorageAreaBase.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -28,6 +28,7 @@
 #include "Connection.h"
 #include "StorageAreaIdentifier.h"
 #include "StorageAreaImplIdentifier.h"
+#include "StorageAreaMapIdentifier.h"
 #include <WebCore/ClientOrigin.h>
 #include <wtf/WeakPtr.h>
 
@@ -47,6 +48,7 @@
     WTF_MAKE_NONCOPYABLE(StorageAreaBase);
     WTF_MAKE_FAST_ALLOCATED;
 public:
+    static uint64_t nextMessageIdentifier();
     virtual ~StorageAreaBase();
 
     enum class Type : bool { SQLite, Memory };
@@ -59,7 +61,7 @@
     StorageAreaIdentifier identifier() const { return m_identifier; }
     WebCore::ClientOrigin origin() const { return m_origin; }
     unsigned quota() const { return m_quota; }
-    void addListener(IPC::Connection::UniqueID);
+    void addListener(IPC::Connection::UniqueID, StorageAreaMapIdentifier);
     void removeListener(IPC::Connection::UniqueID);
     bool hasListeners() const;
     void notifyListenersAboutClear();
@@ -77,7 +79,7 @@
     StorageAreaIdentifier m_identifier;
     unsigned m_quota;
     WebCore::ClientOrigin m_origin;
-    HashSet<IPC::Connection::UniqueID> m_listeners;
+    HashMap<IPC::Connection::UniqueID, StorageAreaMapIdentifier> m_listeners;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/Scripts/webkit/messages.py (288297 => 288298)


--- trunk/Source/WebKit/Scripts/webkit/messages.py	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/Scripts/webkit/messages.py	2022-01-20 17:24:01 UTC (rev 288298)
@@ -305,6 +305,7 @@
         'WebCore::SleepDisablerIdentifier',
         'WebCore::SourceBufferAppendMode',
         'WebCore::SpeechRecognitionConnectionClientIdentifier',
+        'WebCore::StorageType',
         'WebCore::UserMediaRequestIdentifier',
         'WebCore::WebLockIdentifier',
         'WebCore::WebSocketIdentifier',
@@ -347,6 +348,7 @@
         'WebKit::SampleBufferDisplayLayerIdentifier',
         'WebKit::StorageAreaIdentifier',
         'WebKit::StorageAreaImplIdentifier',
+        'WebKit::StorageAreaMapIdentifier',
         'WebKit::StorageNamespaceIdentifier',
         'WebKit::TapIdentifier',
         'WebKit::TextCheckerRequestID',

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (288297 => 288298)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2022-01-20 17:24:01 UTC (rev 288298)
@@ -1458,6 +1458,7 @@
 		93AB9B4E257567E20098B10E /* SpeechRecognitionRemoteRealtimeMediaSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 93AB9B422574928C0098B10E /* SpeechRecognitionRemoteRealtimeMediaSource.h */; };
 		93AB9B552575A2760098B10E /* SpeechRecognitionRealtimeMediaSourceManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AB9B4F257589110098B10E /* SpeechRecognitionRealtimeMediaSourceManagerMessageReceiver.cpp */; };
 		93AB9B562575A28B0098B10E /* SpeechRecognitionRemoteRealtimeMediaSourceManagerMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 93AB9B51257589110098B10E /* SpeechRecognitionRemoteRealtimeMediaSourceManagerMessageReceiver.cpp */; };
+		93AEC161278F8CD30066666F /* StorageAreaMapIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 93AEC160278F8CD20066666F /* StorageAreaMapIdentifier.h */; };
 		93B0A67526D5ADCF00AA21E4 /* WebPermissionController.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B0A67426D5A72E00AA21E4 /* WebPermissionController.h */; };
 		93B2614D227D149E00B97A76 /* StorageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B26149227D147200B97A76 /* StorageManager.h */; };
 		93B2614E227D14B100B97A76 /* LocalStorageDatabase.h in Headers */ = {isa = PBXBuildFile; fileRef = 93B26145227D147000B97A76 /* LocalStorageDatabase.h */; };
@@ -5307,6 +5308,7 @@
 		93AB9B52257589120098B10E /* SpeechRecognitionRemoteRealtimeMediaSourceManagerMessagesReplies.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionRemoteRealtimeMediaSourceManagerMessagesReplies.h; sourceTree = "<group>"; };
 		93AB9B53257589120098B10E /* SpeechRecognitionRemoteRealtimeMediaSourceManagerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionRemoteRealtimeMediaSourceManagerMessages.h; sourceTree = "<group>"; };
 		93AB9B54257589120098B10E /* SpeechRecognitionRealtimeMediaSourceManagerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SpeechRecognitionRealtimeMediaSourceManagerMessages.h; sourceTree = "<group>"; };
+		93AEC160278F8CD20066666F /* StorageAreaMapIdentifier.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StorageAreaMapIdentifier.h; sourceTree = "<group>"; };
 		93B0A67326D5A72E00AA21E4 /* WebPermissionController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebPermissionController.cpp; sourceTree = "<group>"; };
 		93B0A67426D5A72E00AA21E4 /* WebPermissionController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebPermissionController.h; sourceTree = "<group>"; };
 		93B26145227D147000B97A76 /* LocalStorageDatabase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LocalStorageDatabase.h; sourceTree = "<group>"; };
@@ -7063,6 +7065,7 @@
 				1ACECD2217162DB1001FC9EF /* StorageAreaMap.cpp */,
 				1ACECD2317162DB1001FC9EF /* StorageAreaMap.h */,
 				1A334DEA16DE8B68006A8E38 /* StorageAreaMap.messages.in */,
+				93AEC160278F8CD20066666F /* StorageAreaMapIdentifier.h */,
 				465F4E05230B2E7C003CEDB7 /* StorageNamespaceIdentifier.h */,
 				1A17635416B1D5D000D88FD6 /* StorageNamespaceImpl.cpp */,
 				1A17635516B1D5D000D88FD6 /* StorageNamespaceImpl.h */,
@@ -13265,6 +13268,7 @@
 				93E799DC276121080074008A /* StorageAreaBase.h in Headers */,
 				1AD3306F16B1D991004F60E7 /* StorageAreaImpl.h in Headers */,
 				1ACECD2517162DB1001FC9EF /* StorageAreaMap.h in Headers */,
+				93AEC161278F8CD30066666F /* StorageAreaMapIdentifier.h in Headers */,
 				1A334DEE16DE8F88006A8E38 /* StorageAreaMapMessages.h in Headers */,
 				93E799C7276027460074008A /* StorageAreaRegistry.h in Headers */,
 				93B2614D227D149E00B97A76 /* StorageManager.h in Headers */,

Modified: trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -117,7 +117,7 @@
         return;
     }
     if (decoder.messageReceiverName() == Messages::StorageAreaMap::messageReceiverName()) {
-        if (auto* storageAreaMap = WebProcess::singleton().storageAreaMap(makeObjectIdentifier<StorageAreaIdentifierType>(decoder.destinationID())))
+        if (auto storageAreaMap = WebProcess::singleton().storageAreaMap(makeObjectIdentifier<StorageAreaMapIdentifierType>(decoder.destinationID())))
             storageAreaMap->didReceiveMessage(connection, decoder);
         return;
     }

Modified: trunk/Source/WebKit/WebProcess/WebProcess.cpp (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/WebProcess.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/WebProcess.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -1189,8 +1189,10 @@
     ASSERT(m_networkProcessConnection);
     ASSERT_UNUSED(connection, m_networkProcessConnection == connection);
 
-    for (auto* storageAreaMap : copyToVector(m_storageAreaMaps.values()))
-        storageAreaMap->disconnect();
+    for (auto key : copyToVector(m_storageAreaMaps.keys())) {
+        if (auto map = m_storageAreaMaps.get(key))
+            map->disconnect();
+    }
 
     for (auto& page : m_pageMap.values()) {
         auto idbConnection = page->corePage()->optionalIDBConnection();
@@ -1697,20 +1699,20 @@
 
 void WebProcess::registerStorageAreaMap(StorageAreaMap& storageAreaMap)
 {
-    ASSERT(storageAreaMap.identifier());
-    ASSERT(!m_storageAreaMaps.contains(*storageAreaMap.identifier()));
-    m_storageAreaMaps.set(*storageAreaMap.identifier(), &storageAreaMap);
+    auto identifier = storageAreaMap.identifier();
+    ASSERT(!m_storageAreaMaps.contains(identifier));
+    m_storageAreaMaps.add(identifier, storageAreaMap);
 }
 
 void WebProcess::unregisterStorageAreaMap(StorageAreaMap& storageAreaMap)
 {
-    ASSERT(storageAreaMap.identifier());
-    ASSERT(m_storageAreaMaps.contains(*storageAreaMap.identifier()));
-    ASSERT(m_storageAreaMaps.get(*storageAreaMap.identifier()) == &storageAreaMap);
-    m_storageAreaMaps.remove(*storageAreaMap.identifier());
+    auto identifier = storageAreaMap.identifier();
+    ASSERT(m_storageAreaMaps.contains(identifier));
+    ASSERT(m_storageAreaMaps.get(identifier).get() == &storageAreaMap);
+    m_storageAreaMaps.remove(identifier);
 }
 
-StorageAreaMap* WebProcess::storageAreaMap(StorageAreaIdentifier identifier) const
+WeakPtr<StorageAreaMap> WebProcess::storageAreaMap(StorageAreaMapIdentifier identifier) const
 {
     return m_storageAreaMaps.get(identifier);
 }

Modified: trunk/Source/WebKit/WebProcess/WebProcess.h (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/WebProcess.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/WebProcess.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -30,7 +30,7 @@
 #include "CacheModel.h"
 #include "IdentifierTypes.h"
 #include "SandboxExtension.h"
-#include "StorageAreaIdentifier.h"
+#include "StorageAreaMapIdentifier.h"
 #include "TextCheckerState.h"
 #include "UserContentControllerIdentifier.h"
 #include "ViewUpdateDispatcher.h"
@@ -284,7 +284,7 @@
 
     void registerStorageAreaMap(StorageAreaMap&);
     void unregisterStorageAreaMap(StorageAreaMap&);
-    StorageAreaMap* storageAreaMap(StorageAreaIdentifier) const;
+    WeakPtr<StorageAreaMap> storageAreaMap(StorageAreaMapIdentifier) const;
 
 #if PLATFORM(COCOA)
     RetainPtr<CFDataRef> sourceApplicationAuditData() const;
@@ -742,7 +742,7 @@
     HashCountedSet<WebCore::ServiceWorkerRegistrationIdentifier> m_swRegistrationCounts;
 #endif
 
-    HashMap<StorageAreaIdentifier, StorageAreaMap*> m_storageAreaMaps;
+    HashMap<StorageAreaMapIdentifier, WeakPtr<StorageAreaMap>> m_storageAreaMaps;
     
     // Prewarmed WebProcesses do not have an associated sessionID yet, which is why this is an optional.
     // By the time the WebProcess gets a WebPage, it is guaranteed to have a sessionID.

Modified: trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -112,20 +112,10 @@
     return 0;
 }
 
-void StorageAreaImpl::incrementAccessCount()
+void StorageAreaImpl::prewarm()
 {
-    // Storage access is handled in the network process, so there's nothing to do here.
+    if (m_storageAreaMap)
+        m_storageAreaMap->connect();
 }
 
-void StorageAreaImpl::decrementAccessCount()
-{
-    // Storage access is handled in the network process, so there's nothing to do here.
-}
-
-void StorageAreaImpl::closeDatabaseIfIdle()
-{
-    // FIXME: Implement this.
-    ASSERT_NOT_REACHED();
-}
-
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -61,9 +61,7 @@
     bool contains(const String& key) override;
     WebCore::StorageType storageType() const override;
     size_t memoryBytesUsedByCache() override;
-    void incrementAccessCount() override;
-    void decrementAccessCount() override;
-    void closeDatabaseIfIdle() override;
+    void prewarm() final;
 
     Identifier m_identifier;
     WeakPtr<StorageAreaMap> m_storageAreaMap;

Modified: trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp	2022-01-20 17:24:01 UTC (rev 288298)
@@ -51,17 +51,19 @@
 using namespace WebCore;
 
 StorageAreaMap::StorageAreaMap(StorageNamespaceImpl& storageNamespace, Ref<WebCore::SecurityOrigin>&& securityOrigin)
-    : m_namespace(storageNamespace)
+    : m_identifier(StorageAreaMapIdentifier::generate())
+    , m_namespace(storageNamespace)
     , m_securityOrigin(WTFMove(securityOrigin))
     , m_quotaInBytes(storageNamespace.quotaInBytes())
     , m_type(storageNamespace.storageType())
 {
-    connect();
+    WebProcess::singleton().registerStorageAreaMap(*this);
 }
 
 StorageAreaMap::~StorageAreaMap()
 {
     disconnect();
+    WebProcess::singleton().unregisterStorageAreaMap(*this);
 }
 
 unsigned StorageAreaMap::length()
@@ -95,8 +97,8 @@
 
     m_pendingValueChanges.add(key);
 
-    if (m_mapID)
-        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::SetItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0);
+    if (m_remoteAreaIdentifier)
+        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::SetItem(*m_remoteAreaIdentifier, sourceArea->identifier(), m_currentSeed, key, value, sourceFrame->document()->url().string()), 0);
     else
         RELEASE_LOG_ERROR(Storage, "StorageAreaMap::setItem failed because storage map ID is invalid");
 }
@@ -114,8 +116,8 @@
 
     m_pendingValueChanges.add(key);
 
-    if (m_mapID)
-        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::RemoveItem(*m_mapID, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0);
+    if (m_remoteAreaIdentifier)
+        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::RemoveItem(*m_remoteAreaIdentifier, sourceArea->identifier(), m_currentSeed, key, sourceFrame->document()->url().string()), 0);
     else
         RELEASE_LOG_ERROR(Storage, "StorageAreaMap::removeItem failed because storage map ID is invalid");
 }
@@ -122,15 +124,14 @@
 
 void StorageAreaMap::clear(WebCore::Frame* sourceFrame, StorageAreaImpl* sourceArea)
 {
-    connect();
-
+    connectSync();
     resetValues();
 
     m_hasPendingClear = true;
     m_map = makeUnique<StorageMap>(m_quotaInBytes);
 
-    if (m_mapID)
-        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::Clear(*m_mapID, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0);
+    if (m_remoteAreaIdentifier)
+        WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkStorageManager::Clear(*m_remoteAreaIdentifier, sourceArea->identifier(), m_currentSeed, sourceFrame->document()->url().string()), 0);
     else
         RELEASE_LOG_ERROR(Storage, "StorageAreaMap::clear failed because storage map ID is invalid");
 }
@@ -151,21 +152,11 @@
 
 StorageMap& StorageAreaMap::ensureMap()
 {
-    connect();
+    connectSync();
 
-    if (!m_map) {
+    if (!m_map)
         m_map = makeUnique<StorageMap>(m_quotaInBytes);
 
-        if (m_mapID) {
-            // We need to use a IPC::UnboundedSynchronousIPCScope to prevent UIProcess hangs in case we receive a synchronous IPC from the UIProcess while we're waiting for a response
-            // from our StorageManagerSet::GetValues() IPC. This IPC may be very slow because it may need to fetch the values from disk and there may be a lot of data.
-            IPC::UnboundedSynchronousIPCScope unboundedSynchronousIPCScope;
-            HashMap<String, String> values;
-            WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::GetValues(*m_mapID), Messages::StorageManagerSet::GetValues::Reply(values), 0);
-            m_map->importItems(WTFMove(values));
-        } else
-            RELEASE_LOG_ERROR(Storage, "StorageAreaMap::ensureMap failed to load from network process because storage map ID is invalid");
-    }
     return *m_map;
 }
 
@@ -259,8 +250,12 @@
     m_map->setItemIgnoringQuota(key, newValue);
 }
 
-void StorageAreaMap::dispatchStorageEvent(const std::optional<StorageAreaImplIdentifier>& storageAreaImplID, const String& key, const String& oldValue, const String& newValue, const String& urlString)
+void StorageAreaMap::dispatchStorageEvent(const std::optional<StorageAreaImplIdentifier>& storageAreaImplID, const String& key, const String& oldValue, const String& newValue, const String& urlString, uint64_t messageIdentifier)
 {
+    if (messageIdentifier < m_lastHandledMessageIdentifier)
+        return;
+
+    m_lastHandledMessageIdentifier = messageIdentifier;
     if (!storageAreaImplID) {
         // This storage event originates from another process so we need to apply the change to our storage area map.
         applyChange(key, newValue);
@@ -272,8 +267,12 @@
         dispatchLocalStorageEvent(storageAreaImplID, key, oldValue, newValue, urlString);
 }
 
-void StorageAreaMap::clearCache()
+void StorageAreaMap::clearCache(uint64_t messageIdentifier)
 {
+    if (messageIdentifier < m_lastHandledMessageIdentifier)
+        return;
+
+    m_lastHandledMessageIdentifier = messageIdentifier;
     resetValues();
 }
 
@@ -344,42 +343,79 @@
     StorageEventDispatcher::dispatchLocalStorageEventsToFrames(pageGroup, frames, key, oldValue, newValue, urlString, m_securityOrigin->data());
 }
 
+void StorageAreaMap::sendConnectMessage(SendMode mode)
+{
+    auto& ipcConnection = WebProcess::singleton().ensureNetworkProcessConnection().connection();
+    auto namespaceIdentifier = m_namespace.storageNamespaceID();
+    auto originData = m_securityOrigin->data();
+    auto topOriginData = m_namespace.topLevelOrigin() ? m_namespace.topLevelOrigin()->data() : originData;
+    auto origin = WebCore::ClientOrigin { topOriginData, originData };
+    auto type = m_type;
+    if ((type == StorageType::Local || type == StorageType::TransientLocal) && m_namespace.topLevelOrigin())
+        type = StorageType::TransientLocal;
+
+    if (mode == SendMode::Sync) {
+        StorageAreaIdentifier remoteAreaIdentifier;
+        HashMap<String, String> items;
+        uint64_t messageIdentifier;
+        ipcConnection.sendSync(Messages::NetworkStorageManager::ConnectToStorageAreaSync(type, m_identifier, namespaceIdentifier, origin), Messages::NetworkStorageManager::ConnectToStorageAreaSync::Reply(remoteAreaIdentifier, items, messageIdentifier), 0);
+        didConnect(remoteAreaIdentifier, WTFMove(items), messageIdentifier);
+        return;
+    }
+
+    auto completionHandler = [this, weakThis = WeakPtr { *this }, weakConnection = WeakPtr { ipcConnection }](auto remoteAreaIdentifier, auto items, auto messageIdentifier) mutable {
+        if (weakThis)
+            return didConnect(remoteAreaIdentifier, WTFMove(items), messageIdentifier);
+
+        if (weakConnection && remoteAreaIdentifier.isValid())
+            weakConnection->send(Messages::NetworkStorageManager::DisconnectFromStorageArea(remoteAreaIdentifier), 0);
+    };
+
+    ipcConnection.sendWithAsyncReply(Messages::NetworkStorageManager::ConnectToStorageArea(type, m_identifier, namespaceIdentifier, origin), WTFMove(completionHandler));
+}
+
+void StorageAreaMap::connectSync()
+{
+    if (m_remoteAreaIdentifier)
+        return;
+
+    sendConnectMessage(SendMode::Sync);
+}
+
 void StorageAreaMap::connect()
 {
-    if (m_mapID)
+    if (m_remoteAreaIdentifier)
         return;
 
-    StorageAreaIdentifier mapID;
-    switch (m_type) {
-    case StorageType::Local:
-    case StorageType::TransientLocal:
-        if (SecurityOrigin* topLevelOrigin = m_namespace.topLevelOrigin())
-            WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea(m_namespace.storageNamespaceID(), topLevelOrigin->data(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToTransientLocalStorageArea::Reply(mapID), 0);
-        else
-            WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToLocalStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToLocalStorageArea::Reply(mapID), 0);
-        break;
-    case StorageType::Session:
-        WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkStorageManager::ConnectToSessionStorageArea(m_namespace.storageNamespaceID(), m_securityOrigin->data()), Messages::NetworkStorageManager::ConnectToSessionStorageArea::Reply(mapID), 0);
-    }
+    sendConnectMessage(SendMode::Async);
+}
 
-    if (mapID.isValid()) {
-        m_mapID = mapID;
-        WebProcess::singleton().registerStorageAreaMap(*this);
-    }
+void StorageAreaMap::didConnect(StorageAreaIdentifier remoteAreaIdentifier, HashMap<String, String>&& items, uint64_t messageIdentifier)
+{
+    if (messageIdentifier < m_lastHandledMessageIdentifier)
+        return;
+
+    m_lastHandledMessageIdentifier = messageIdentifier;
+    if (!remoteAreaIdentifier.isValid())
+        return;
+
+    m_remoteAreaIdentifier = remoteAreaIdentifier;
+    m_map = makeUnique<StorageMap>(m_quotaInBytes);
+    m_map->importItems(WTFMove(items));
 }
 
 void StorageAreaMap::disconnect()
 {
-    if (!m_mapID)
+    if (!m_remoteAreaIdentifier)
         return;
 
     resetValues();
-    WebProcess::singleton().unregisterStorageAreaMap(*this);
 
     if (auto* networkProcessConnection = WebProcess::singleton().existingNetworkProcessConnection())
-        networkProcessConnection->connection().send(Messages::NetworkStorageManager::DisconnectFromStorageArea(*m_mapID), 0);
+        networkProcessConnection->connection().send(Messages::NetworkStorageManager::DisconnectFromStorageArea(*m_remoteAreaIdentifier), 0);
 
-    m_mapID = { };
+    m_remoteAreaIdentifier = { };
+    m_lastHandledMessageIdentifier = 0;
 }
 
 void StorageAreaMap::incrementUseCount()

Modified: trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -28,6 +28,7 @@
 #include "MessageReceiver.h"
 #include "StorageAreaIdentifier.h"
 #include "StorageAreaImplIdentifier.h"
+#include "StorageAreaMapIdentifier.h"
 #include <WebCore/SecurityOrigin.h>
 #include <WebCore/StorageArea.h>
 #include <wtf/Forward.h>
@@ -66,8 +67,9 @@
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
 
     const WebCore::SecurityOrigin& securityOrigin() const { return m_securityOrigin.get(); }
-    const std::optional<StorageAreaIdentifier>& identifier() const { return m_mapID; }
+    StorageAreaMapIdentifier identifier() const { return m_identifier; }
 
+    void connect();
     void disconnect();
 
     void incrementUseCount();
@@ -78,8 +80,8 @@
     void didRemoveItem(uint64_t mapSeed, const String& key);
     void didClear(uint64_t mapSeed);
 
-    void dispatchStorageEvent(const std::optional<StorageAreaImplIdentifier>& sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString);
-    void clearCache();
+    void dispatchStorageEvent(const std::optional<StorageAreaImplIdentifier>& sourceStorageAreaID, const String& key, const String& oldValue, const String& newValue, const String& urlString, uint64_t messageIdentifier);
+    void clearCache(uint64_t messageIdentifier);
 
     void resetValues();
     WebCore::StorageMap& ensureMap();
@@ -90,12 +92,17 @@
     void dispatchSessionStorageEvent(const std::optional<StorageAreaImplIdentifier>&, const String& key, const String& oldValue, const String& newValue, const String& urlString);
     void dispatchLocalStorageEvent(const std::optional<StorageAreaImplIdentifier>&, const String& key, const String& oldValue, const String& newValue, const String& urlString);
 
-    void connect();
+    enum class SendMode : bool { Async, Sync };
+    void sendConnectMessage(SendMode);
+    void connectSync();
+    void didConnect(StorageAreaIdentifier, HashMap<String, String>&&, uint64_t messageIdentifier);
 
+    StorageAreaMapIdentifier m_identifier;
+    uint64_t m_lastHandledMessageIdentifier { 0 };
     StorageNamespaceImpl& m_namespace;
     Ref<WebCore::SecurityOrigin> m_securityOrigin;
     std::unique_ptr<WebCore::StorageMap> m_map;
-    std::optional<StorageAreaIdentifier> m_mapID;
+    std::optional<StorageAreaIdentifier> m_remoteAreaIdentifier;
     HashCountedSet<String> m_pendingValueChanges;
     uint64_t m_currentSeed { 0 };
     unsigned m_quotaInBytes;

Modified: trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in (288297 => 288298)


--- trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in	2022-01-20 17:16:42 UTC (rev 288297)
+++ trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in	2022-01-20 17:24:01 UTC (rev 288298)
@@ -25,6 +25,6 @@
     DidRemoveItem(uint64_t storageMapSeed, String key)
     DidClear(uint64_t storageMapSeed)
 
-    DispatchStorageEvent(std::optional<WebKit::StorageAreaImplIdentifier> storageAreaImplID, String key, String oldValue, String newValue, String urlString)
-    ClearCache()
+    DispatchStorageEvent(std::optional<WebKit::StorageAreaImplIdentifier> storageAreaImplID, String key, String oldValue, String newValue, String urlString, uint64_t messageIdentifier)
+    ClearCache(uint64_t messageIdentifier)
 }

Copied: trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMapIdentifier.h (from rev 288296, trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h) (0 => 288298)


--- trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMapIdentifier.h	                        (rev 0)
+++ trunk/Source/WebKit/WebProcess/WebStorage/StorageAreaMapIdentifier.h	2022-01-20 17:24:01 UTC (rev 288298)
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2022 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include <wtf/ObjectIdentifier.h>
+
+namespace WebKit {
+
+enum StorageAreaMapIdentifierType { };
+using StorageAreaMapIdentifier = ObjectIdentifier<StorageAreaMapIdentifierType>;
+
+} // namespace WebKit
+
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to