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
+