WebKit Bugzilla
New
Browse
Search+
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
[patch]
Patch
bug-235236-20220117120522.patch (text/plain), 59.85 KB, created by
Sihui Liu
on 2022-01-17 12:05:23 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Sihui Liu
Created:
2022-01-17 12:05:23 PST
Size:
59.85 KB
patch
obsolete
>Subversion Revision: 288090 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 36a054261f300c6e8816dcc6e09742e1fe1cf304..5e7b8e7a52dbdc6c95a1238c021e6993bbe0a94d 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,20 @@ >+2022-01-17 Sihui Liu <sihui_liu@apple.com> >+ >+ Make LocalStorage prewarming async >+ https://bugs.webkit.org/show_bug.cgi?id=235236 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ * 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-17 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK][a11y] Stop using isolated tree for the ATSPI implementation >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index bdde1b64addf41b8a4395429412f657fccd7e926..c6cc965833b69511cab9d04ce801c46c469b2383 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,91 @@ >+2022-01-17 Sihui Liu <sihui_liu@apple.com> >+ >+ Make LocalStorage prewarming async >+ https://bugs.webkit.org/show_bug.cgi?id=235236 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ 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-17 Kimmo Kinnunen <kkinnunen@apple.com> > > Frequent GPU process jetsams due to RemoteRenderingBackendProxy not claiming ownership of SharedMemory buffers >diff --git a/Source/WebCore/page/DOMWindow.cpp b/Source/WebCore/page/DOMWindow.cpp >index 61eb8a41c1892f200c58583a697ed2588f69cf69..3553a9f670adc526a3eb4929061c5ccad8153500 100644 >--- a/Source/WebCore/page/DOMWindow.cpp >+++ b/Source/WebCore/page/DOMWindow.cpp >@@ -413,9 +413,6 @@ void DOMWindow::prewarmLocalStorageIfNecessary() > 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 @@ void DOMWindow::prewarmLocalStorageIfNecessary() > if (!localStorage) > return; > >- page->mainFrame().didPrewarmLocalStorage(); >+ localStorage->area().prewarm(); > } > > DOMWindow::~DOMWindow() >diff --git a/Source/WebCore/page/Frame.cpp b/Source/WebCore/page/Frame.cpp >index 86f9a7be3eba0dbf2b275c751cc843ddaa74a5c1..a47ea0d84400580cebe121c89ebc0f877247fc88 100644 >--- a/Source/WebCore/page/Frame.cpp >+++ b/Source/WebCore/page/Frame.cpp >@@ -1057,19 +1057,6 @@ void Frame::dropChildren() > 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()) >diff --git a/Source/WebCore/page/Frame.h b/Source/WebCore/page/Frame.h >index 53644eb195e17cd2fd7fc41b142ad1b76e4b6ccd..e04c9441e3108073ad589bd8e8fa00bdd3396236 100644 >--- a/Source/WebCore/page/Frame.h >+++ b/Source/WebCore/page/Frame.h >@@ -291,9 +291,6 @@ public: > 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 @@ private: > unsigned m_navigationDisableCount { 0 }; > unsigned m_selfOnlyRefCount { 0 }; > bool m_hasHadUserInteraction { false }; >- unsigned m_localStoragePrewarmingCount { 0 }; > > FloatSize m_overrideScreenSize; > >diff --git a/Source/WebCore/storage/StorageArea.h b/Source/WebCore/storage/StorageArea.h >index 251bd429d62062997f728dc0dc6625f14f1b5c78..7746140f784081b0786a15d601fefca2c91c10a6 100644 >--- a/Source/WebCore/storage/StorageArea.h >+++ b/Source/WebCore/storage/StorageArea.h >@@ -58,6 +58,7 @@ public: > virtual void incrementAccessCount() { } > virtual void decrementAccessCount() { } > virtual void closeDatabaseIfIdle() { } >+ virtual void prewarm() { } > }; > > } // namespace WebCore >diff --git a/Source/WebCore/storage/StorageType.h b/Source/WebCore/storage/StorageType.h >index 220587ec86ba5c5171b673b177a4661a22cf313d..0ed9a1bea2dd747a82d351f74328fea6c12d2052 100644 >--- a/Source/WebCore/storage/StorageType.h >+++ b/Source/WebCore/storage/StorageType.h >@@ -44,3 +44,16 @@ inline bool isPersistentLocalStorage(StorageType storageType) > } > > } // 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 >diff --git a/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp b/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp >index c84ead430ab15d94fd8ef2533d6e492872b6e12b..0c41ab92e31f49d6a5a949a403728c2aa9d040b1 100644 >--- a/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp >+++ b/Source/WebKit/NetworkProcess/WebStorage/StorageArea.cpp >@@ -165,7 +165,7 @@ void StorageArea::clear() > } > > 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 @@ void StorageArea::dispatchEvents(IPC::Connection::UniqueID sourceConnection, Sto > 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()); > } > } > >diff --git a/Source/WebKit/NetworkProcess/storage/LocalStorageManager.cpp b/Source/WebKit/NetworkProcess/storage/LocalStorageManager.cpp >index cbddd2e3048d2870ae07a0aadf4ed97b310436c9..3ce0ec8573d98c9d748d704b2dc9dc8c919d6f7c 100644 >--- a/Source/WebKit/NetworkProcess/storage/LocalStorageManager.cpp >+++ b/Source/WebKit/NetworkProcess/storage/LocalStorageManager.cpp >@@ -165,7 +165,7 @@ void LocalStorageManager::connectionClosedForTransientStorageArea(IPC::Connectio > 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 @@ StorageAreaIdentifier LocalStorageManager::connectToLocalStorageArea(IPC::Connec > } > > 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 @@ StorageAreaIdentifier LocalStorageManager::connectToTransientLocalStorageArea(IP > } > > ASSERT(m_transientStorageArea->type() == StorageAreaBase::Type::Memory); >- m_transientStorageArea->addListener(connection); >+ m_transientStorageArea->addListener(connection, sourceIdentifier); > return m_transientStorageArea->identifier(); > } > >diff --git a/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h b/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h >index a88842e295f2d90a8f0e8bba8ed7b3ea27d58a8b..cdcb6812f8fed69bcda49f6942d67cda2d10f158 100644 >--- a/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h >+++ b/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h >@@ -27,6 +27,7 @@ > > #include "Connection.h" > #include "StorageAreaIdentifier.h" >+#include "StorageAreaMapIdentifier.h" > #include <wtf/WorkQueue.h> > > namespace WebCore { >@@ -56,8 +57,8 @@ public: > 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: >diff --git a/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp b/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp >index 93009e249ed1a4c897ca9190c3f24d5a3c45485a..d974e6db3553871425bae62c0722572132c6d425 100644 >--- a/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp >+++ b/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp >@@ -625,24 +625,33 @@ void NetworkStorageManager::syncLocalStorage(CompletionHandler<void()>&& complet > }); > } > >-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::cloneSessionStorageNamespace(IPC::Connection& connec > } > } > >-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()); >diff --git a/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h b/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h >index d21d656d3a6727c98d12a412375ed052a53a9e91..a1f307644676e8d53565bfec83796796c346a86b 100644 >--- a/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h >+++ b/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h >@@ -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 @@ class SharedFileHandle; > > namespace WebCore { > struct ClientOrigin; >+enum class StorageType : uint8_t; > } > > namespace WebKit { >@@ -108,12 +110,10 @@ private: > 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); >diff --git a/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in b/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in >index a516ada9832fdef5b6814944215f688fda81c615..ffc86f9d09fd4595535f875053945a18a7731f01 100644 >--- a/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in >+++ b/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.messages.in >@@ -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 >diff --git a/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp b/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp >index d40e40b6173c28d44c57b8e20f72bcb511041db5..b7342e40ef1f6bb5cdb6fbfb2ef123f9d06e8e06 100644 >--- a/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp >+++ b/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp >@@ -72,7 +72,7 @@ StorageAreaIdentifier SessionStorageManager::addStorageArea(std::unique_ptr<Memo > 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 @@ StorageAreaIdentifier SessionStorageManager::connectToSessionStorageArea(IPC::Co > if (!storageArea) > return StorageAreaIdentifier { }; > >- storageArea->addListener(connection); >+ storageArea->addListener(connection, sourceIdentifier); >+ > return identifier; > } > >diff --git a/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h b/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h >index fc1761be900f8e4da7754b018f1dbe2e38fb7dfa..0f7be4c5e5cc88ac3829c192501fcc682625e506 100644 >--- a/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h >+++ b/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h >@@ -27,6 +27,7 @@ > > #include "Connection.h" > #include "StorageAreaIdentifier.h" >+#include "StorageAreaMapIdentifier.h" > #include "StorageNamespaceIdentifier.h" > > namespace WebCore { >@@ -47,7 +48,7 @@ public: > 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); > >diff --git a/Source/WebKit/NetworkProcess/storage/StorageAreaBase.cpp b/Source/WebKit/NetworkProcess/storage/StorageAreaBase.cpp >index e44ba0135a643c01a5b900c7631ba14998f8f3c1..5797e9c54021d2a8d80f2821e1e521a308d2b3e3 100644 >--- a/Source/WebKit/NetworkProcess/storage/StorageAreaBase.cpp >+++ b/Source/WebKit/NetworkProcess/storage/StorageAreaBase.cpp >@@ -30,8 +30,14 @@ > > namespace WebKit { > >+uint64_t StorageAreaBase::nextMessageIdentifier() >+{ >+ static std::atomic<uint64_t> currenIdentifier(0); >+ return ++currenIdentifier; >+} >+ > 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(unsigned quota, const WebCore::ClientOrigin& or > > 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.set(connection, identifier); > } > > void StorageAreaBase::removeListener(IPC::Connection::UniqueID connection) >@@ -58,19 +64,19 @@ bool StorageAreaBase::hasListeners() const > > 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 > { > 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()); > } > } > >diff --git a/Source/WebKit/NetworkProcess/storage/StorageAreaBase.h b/Source/WebKit/NetworkProcess/storage/StorageAreaBase.h >index ed3ed14206e175dcacc8c1f99490750545e34e98..efc8fb96489107c88e33cd123f609a36f21aed7a 100644 >--- a/Source/WebKit/NetworkProcess/storage/StorageAreaBase.h >+++ b/Source/WebKit/NetworkProcess/storage/StorageAreaBase.h >@@ -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 @@ class StorageAreaBase : public CanMakeWeakPtr<StorageAreaBase> { > 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 @@ public: > 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 @@ private: > 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 >diff --git a/Source/WebKit/Scripts/webkit/messages.py b/Source/WebKit/Scripts/webkit/messages.py >index 8b521f7701548b1af8b44b3537463769c90df982..c1f43a18c72bfb25ff8cc6314f1c78371a6b920e 100644 >--- a/Source/WebKit/Scripts/webkit/messages.py >+++ b/Source/WebKit/Scripts/webkit/messages.py >@@ -305,6 +305,7 @@ def types_that_cannot_be_forward_declared(): > 'WebCore::SleepDisablerIdentifier', > 'WebCore::SourceBufferAppendMode', > 'WebCore::SpeechRecognitionConnectionClientIdentifier', >+ 'WebCore::StorageType', > 'WebCore::UserMediaRequestIdentifier', > 'WebCore::WebLockIdentifier', > 'WebCore::WebSocketIdentifier', >@@ -347,6 +348,7 @@ def types_that_cannot_be_forward_declared(): > 'WebKit::SampleBufferDisplayLayerIdentifier', > 'WebKit::StorageAreaIdentifier', > 'WebKit::StorageAreaImplIdentifier', >+ 'WebKit::StorageAreaMapIdentifier', > 'WebKit::StorageNamespaceIdentifier', > 'WebKit::TapIdentifier', > 'WebKit::TextCheckerRequestID', >diff --git a/Source/WebKit/WebKit.xcodeproj/project.pbxproj b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >index 152630a303210748b88a019a13c40a0daf203d14..54a4b2101a357ae1498e8e86741e87605225a138 100644 >--- a/Source/WebKit/WebKit.xcodeproj/project.pbxproj >+++ b/Source/WebKit/WebKit.xcodeproj/project.pbxproj >@@ -1457,6 +1457,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 */; }; >@@ -5305,6 +5306,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>"; }; >@@ -7061,6 +7063,7 @@ > 1ACECD2217162DB1001FC9EF /* StorageAreaMap.cpp */, > 1ACECD2317162DB1001FC9EF /* StorageAreaMap.h */, > 1A334DEA16DE8B68006A8E38 /* StorageAreaMap.messages.in */, >+ 93AEC160278F8CD20066666F /* StorageAreaMapIdentifier.h */, > 465F4E05230B2E7C003CEDB7 /* StorageNamespaceIdentifier.h */, > 1A17635416B1D5D000D88FD6 /* StorageNamespaceImpl.cpp */, > 1A17635516B1D5D000D88FD6 /* StorageNamespaceImpl.h */, >@@ -13263,6 +13266,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 */, >diff --git a/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp b/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp >index 02270a53af9ba8bf80d7c3b3dcdc8ceb565176e3..8d3b57bd18dc2e05384ccf08d7d9c8907cd04dd0 100644 >--- a/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp >+++ b/Source/WebKit/WebProcess/Network/NetworkProcessConnection.cpp >@@ -117,7 +117,7 @@ void NetworkProcessConnection::didReceiveMessage(IPC::Connection& connection, IP > 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; > } >diff --git a/Source/WebKit/WebProcess/WebProcess.cpp b/Source/WebKit/WebProcess/WebProcess.cpp >index f816775a7994ab22cc2fbc26000e9d22f2fc2c6a..2455981b0361692a5265420feedc4b4f2d40da25 100644 >--- a/Source/WebKit/WebProcess/WebProcess.cpp >+++ b/Source/WebKit/WebProcess/WebProcess.cpp >@@ -1189,8 +1189,8 @@ void WebProcess::networkProcessConnectionClosed(NetworkProcessConnection* connec > 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())) >+ m_storageAreaMaps.get(key)->disconnect(); > > for (auto& page : m_pageMap.values()) { > auto idbConnection = page->corePage()->optionalIDBConnection(); >@@ -1697,20 +1697,20 @@ void WebProcess::nonVisibleProcessMemoryCleanupTimerFired() > > 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); > } >diff --git a/Source/WebKit/WebProcess/WebProcess.h b/Source/WebKit/WebProcess/WebProcess.h >index 469a0a5e191dcf470132716b672ed1c2e61f3117..e87d733d76adee0cb8badb87f5ca755da62d7032 100644 >--- a/Source/WebKit/WebProcess/WebProcess.h >+++ b/Source/WebKit/WebProcess/WebProcess.h >@@ -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 @@ public: > > 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 @@ private: > 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. >diff --git a/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp b/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp >index b12c58c0aad67e9957706e29e6de6569efe64846..1f9b42cb127d6dc028a68059e27101fc7969446a 100644 >--- a/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp >+++ b/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.cpp >@@ -112,20 +112,10 @@ size_t StorageAreaImpl::memoryBytesUsedByCache() > return 0; > } > >-void StorageAreaImpl::incrementAccessCount() >+void StorageAreaImpl::prewarm() > { >- // Storage access is handled in the network process, so there's nothing to do here. >-} >- >-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(); >+ if (m_storageAreaMap) >+ m_storageAreaMap->connect(); > } > > } // namespace WebKit >diff --git a/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h b/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h >index 79e14b91f8ac6d82fe792ac06d394ed765842a62..a35d66792505f0c03e59087001e0ca4fda7a6cda 100644 >--- a/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h >+++ b/Source/WebKit/WebProcess/WebStorage/StorageAreaImpl.h >@@ -61,9 +61,7 @@ private: > 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; >diff --git a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp b/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp >index 2cf7a6d4b6005c1d7ec256bd638876294e9e4cf2..df4c26f2aff3291d919ded53dd7627b58f289290 100644 >--- a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp >+++ b/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.cpp >@@ -51,17 +51,19 @@ namespace WebKit { > 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 @@ void StorageAreaMap::setItem(Frame* sourceFrame, StorageAreaImpl* sourceArea, co > > 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,23 +116,22 @@ void StorageAreaMap::removeItem(WebCore::Frame* sourceFrame, StorageAreaImpl* so > > 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"); > } > > 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 @@ void StorageAreaMap::resetValues() > > 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 @@ void StorageAreaMap::applyChange(const String& key, const String& newValue) > 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 @@ void StorageAreaMap::dispatchStorageEvent(const std::optional<StorageAreaImplIde > 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 @@ void StorageAreaMap::dispatchLocalStorageEvent(const std::optional<StorageAreaIm > 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() >diff --git a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h b/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h >index 06e6356cb1339266ba345459625380467b580b17..c6271d9f79ecbac3e4f8f8b87f87cc04ed3bf82e 100644 >--- a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h >+++ b/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.h >@@ -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 @@ public: > 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 @@ private: > 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 @@ private: > 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; >diff --git a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in b/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in >index 2d1a813fcb8757b18427629380697fc7be9ba9b5..6dee8e8e35ab5b68866f2200a706a82937fdbcaa 100644 >--- a/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in >+++ b/Source/WebKit/WebProcess/WebStorage/StorageAreaMap.messages.in >@@ -25,6 +25,6 @@ messages -> StorageAreaMap NotRefCounted { > 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) > } >diff --git a/Source/WebKit/WebProcess/WebStorage/StorageAreaMapIdentifier.h b/Source/WebKit/WebProcess/WebStorage/StorageAreaMapIdentifier.h >new file mode 100644 >index 0000000000000000000000000000000000000000..f922108968f3598fd201aaacaf0ec0375c46ef99 >--- /dev/null >+++ b/Source/WebKit/WebProcess/WebStorage/StorageAreaMapIdentifier.h >@@ -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 >+
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 235236
:
449186
|
449194
|
449300
|
449344
|
449346
|
449351
|
449441
|
449442
|
449443
|
449444
|
449447
|
449449
|
449579