Title: [294562] trunk/Source/WebKit/NetworkProcess
Revision
294562
Author
sihui_...@apple.com
Date
2022-05-20 11:18:51 -0700 (Fri, 20 May 2022)

Log Message

Clear SessionStorage of a page when the page is destroyed
https://bugs.webkit.org/show_bug.cgi?id=240683

Reviewed by Chris Dumez.

We should not keep SessionStorage items in memory when they will not be accessed any more.

* Source/WebKit/NetworkProcess/NetworkProcess.cpp:
(WebKit::NetworkProcess::removeWebPageNetworkParameters):
* Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp:
(WebKit::NetworkStorageManager::clearStorageForWebPage):
* Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h:
* Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp:
(WebKit::SessionStorageManager::removeNamespace):
* Source/WebKit/NetworkProcess/storage/SessionStorageManager.h:

Canonical link: https://commits.webkit.org/250807@main

Modified Paths

Diff

Modified: trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp (294561 => 294562)


--- trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2022-05-20 18:15:23 UTC (rev 294561)
+++ trunk/Source/WebKit/NetworkProcess/NetworkProcess.cpp	2022-05-20 18:18:51 UTC (rev 294562)
@@ -2766,8 +2766,10 @@
 
 void NetworkProcess::removeWebPageNetworkParameters(PAL::SessionID sessionID, WebPageProxyIdentifier pageID)
 {
-    if (auto* session = networkSession(sessionID))
+    if (auto* session = networkSession(sessionID)) {
         session->removeWebPageNetworkParameters(pageID);
+        session->storageManager().clearStorageForWebPage(pageID);
+    }
 }
 
 void NetworkProcess::countNonDefaultSessionSets(PAL::SessionID sessionID, CompletionHandler<void(size_t)>&& completionHandler)

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp (294561 => 294562)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2022-05-20 18:15:23 UTC (rev 294561)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.cpp	2022-05-20 18:18:51 UTC (rev 294562)
@@ -319,6 +319,18 @@
     });
 }
 
+void NetworkStorageManager::clearStorageForWebPage(WebPageProxyIdentifier pageIdentifier)
+{
+    ASSERT(RunLoop::isMain());
+
+    m_queue->dispatch([this, protectedThis = Ref { *this }, pageIdentifier]() mutable {
+        for (auto& manager : m_localOriginStorageManagers.values()) {
+            if (auto* sessionStorageManager = manager->existingSessionStorageManager())
+                sessionStorageManager->removeNamespace(makeObjectIdentifier<StorageNamespaceIdentifierType>(pageIdentifier.toUInt64()));
+        }
+    });
+}
+
 void NetworkStorageManager::didIncreaseQuota(WebCore::ClientOrigin&& origin, QuotaIncreaseRequestIdentifier identifier, std::optional<uint64_t> newQuota)
 {
     ASSERT(RunLoop::isMain());

Modified: trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h (294561 => 294562)


--- trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-05-20 18:15:23 UTC (rev 294561)
+++ trunk/Source/WebKit/NetworkProcess/storage/NetworkStorageManager.h	2022-05-20 18:18:51 UTC (rev 294562)
@@ -32,6 +32,7 @@
 #include "StorageAreaImplIdentifier.h"
 #include "StorageAreaMapIdentifier.h"
 #include "StorageNamespaceIdentifier.h"
+#include "WebPageProxyIdentifier.h"
 #include "WebsiteData.h"
 #include <WebCore/ClientOrigin.h>
 #include <WebCore/FileSystemHandleIdentifier.h>
@@ -80,6 +81,7 @@
     PAL::SessionID sessionID() const { return m_sessionID; }
     void close();
     void clearStorageForTesting(CompletionHandler<void()>&&);
+    void clearStorageForWebPage(WebPageProxyIdentifier);
     void didIncreaseQuota(WebCore::ClientOrigin&&, QuotaIncreaseRequestIdentifier, std::optional<uint64_t> newQuota);
     void fetchData(OptionSet<WebsiteDataType>, CompletionHandler<void(Vector<WebsiteData::Entry>&&)>&&);
     void deleteData(OptionSet<WebsiteDataType>, const Vector<WebCore::SecurityOriginData>&, CompletionHandler<void()>&&);

Modified: trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp (294561 => 294562)


--- trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp	2022-05-20 18:15:23 UTC (rev 294561)
+++ trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.cpp	2022-05-20 18:18:51 UTC (rev 294562)
@@ -62,6 +62,16 @@
         storageArea->removeListener(connection);
 }
 
+void SessionStorageManager::removeNamespace(StorageNamespaceIdentifier namespaceIdentifier)
+{
+    auto identifier = m_storageAreasByNamespace.take(namespaceIdentifier);
+    if (!identifier.isValid())
+        return;
+
+    m_storageAreas.remove(identifier);
+    m_registry.unregisterStorageArea(identifier);
+}
+
 StorageAreaIdentifier SessionStorageManager::addStorageArea(std::unique_ptr<MemoryStorageArea> storageArea, StorageNamespaceIdentifier namespaceIdentifier)
 {
     auto identifier = storageArea->identifier();

Modified: trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h (294561 => 294562)


--- trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h	2022-05-20 18:15:23 UTC (rev 294561)
+++ trunk/Source/WebKit/NetworkProcess/storage/SessionStorageManager.h	2022-05-20 18:18:51 UTC (rev 294562)
@@ -47,6 +47,7 @@
     bool hasDataInMemory() const;
     void clearData();
     void connectionClosed(IPC::Connection::UniqueID);
+    void removeNamespace(StorageNamespaceIdentifier);
 
     StorageAreaIdentifier connectToSessionStorageArea(IPC::Connection::UniqueID, StorageAreaMapIdentifier, const WebCore::ClientOrigin&, StorageNamespaceIdentifier);
     void cancelConnectToSessionStorageArea(IPC::Connection::UniqueID, StorageNamespaceIdentifier);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to