Title: [294381] trunk/Source/WebKit/UIProcess
Revision
294381
Author
sihui_...@apple.com
Date
2022-05-17 20:23:38 -0700 (Tue, 17 May 2022)

Log Message

WebProcessProxy should not hold WebsiteDataStore alive when there is no page 
https://bugs.webkit.org/show_bug.cgi?id=238892
<rdar://problem/91715517>

Reviewed by Youenn Fablet.

WebProcessProxy can outlive WebPageProxy, and because WebProcessProxy holds strong reference to WebsiteDataStore,
WebsiteDataStore will be kept alive even when it's not used by any page and will not be used by any page.

* UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::createGPUProcessConnection):
* UIProcess/ProvisionalPageProxy.cpp:
(WebKit::ProvisionalPageProxy::ProvisionalPageProxy):
(WebKit::ProvisionalPageProxy::~ProvisionalPageProxy):
* UIProcess/ProvisionalPageProxy.h:
* UIProcess/SuspendedPageProxy.cpp:
(WebKit::SuspendedPageProxy::findReusableSuspendedPageProcess):
* UIProcess/WebBackForwardCache.cpp:
(WebKit::WebBackForwardCache::removeEntriesForSession):
* UIProcess/WebLockRegistryProxy.cpp:
(WebKit::WebLockRegistryProxy::requestLock):
(WebKit::WebLockRegistryProxy::releaseLock):
(WebKit::WebLockRegistryProxy::abortLockRequest):
(WebKit::WebLockRegistryProxy::snapshot):
(WebKit::WebLockRegistryProxy::clientIsGoingAway):
(WebKit::WebLockRegistryProxy::processDidExit):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::swapToProvisionalPage):
(WebKit::WebPageProxy::commitProvisionalPage):
* UIProcess/WebProcessCache.cpp:
(WebKit::WebProcessCache::canCacheProcess const):
(WebKit::WebProcessCache::takeProcess):
(WebKit::WebProcessCache::clearAllProcessesForSession):
(WebKit::WebProcessCache::CachedProcess::CachedProcess):
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::establishRemoteWorkerContextConnectionToNetworkProcess):
(WebKit::WebProcessPool::processForRegistrableDomain):
(WebKit::WebProcessPool::createWebPage):
(WebKit::WebProcessPool::processForNavigationInternal):
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::WebProcessProxy):
(WebKit::m_webLockRegistry):
(WebKit::WebProcessProxy::websiteDataStore const):
(WebKit::WebProcessProxy::setWebsiteDataStore):
(WebKit::WebProcessProxy::isDummyProcessProxy const):
(WebKit::WebProcessProxy::updateRegistrationWithDataStore):
(WebKit::WebProcessProxy::addExistingWebPage):
(WebKit::WebProcessProxy::getNetworkProcessConnection):
(WebKit::WebProcessProxy::didStartProvisionalLoadForMainFrame):
(WebKit::WebProcessProxy::sessionID const):
* UIProcess/WebProcessProxy.h:
(WebKit::WebProcessProxy::websiteDataStore const): Deleted.
* UIProcess/glib/WebProcessProxyGLib.cpp:
(WebKit::WebProcessProxy::platformGetLaunchOptions):

Modified Paths

Diff

Modified: trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -370,7 +370,9 @@
 
 void GPUProcessProxy::createGPUProcessConnection(WebProcessProxy& webProcessProxy, IPC::Attachment&& connectionIdentifier, GPUProcessConnectionParameters&& parameters)
 {
-    addSession(webProcessProxy.websiteDataStore());
+    if (auto* store = webProcessProxy.websiteDataStore())
+        addSession(*store);
+
     RELEASE_LOG(ProcessSuspension, "%p - GPUProcessProxy is taking a background assertion because a web process is requesting a connection", this);
     startResponsivenessTimer(UseLazyStop::No);
     sendWithAsyncReply(Messages::GPUProcess::CreateGPUConnectionToWebProcess { webProcessProxy.coreProcessIdentifier(), webProcessProxy.sessionID(), connectionIdentifier, parameters }, [this, weakThis = WeakPtr { *this }]() mutable {

Modified: trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -84,8 +84,10 @@
     m_process->addMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_webPageID, *this);
     m_process->addProvisionalPageProxy(*this);
 
-    if (&m_process->websiteDataStore() != &m_page.websiteDataStore())
-        m_process->processPool().pageBeginUsingWebsiteDataStore(m_page.identifier(), m_process->websiteDataStore());
+    m_websiteDataStore = m_process->websiteDataStore();
+    ASSERT(m_websiteDataStore);
+    if (m_websiteDataStore && m_websiteDataStore != &m_page.websiteDataStore())
+        m_process->processPool().pageBeginUsingWebsiteDataStore(m_page.identifier(), *m_websiteDataStore);
 
     // If we are reattaching to a SuspendedPage, then the WebProcess' WebPage already exists and
     // WebPageProxy::didCreateMainFrame() will not be called to initialize m_mainFrame. In such
@@ -113,8 +115,9 @@
     if (!m_wasCommitted) {
         m_page.inspectorController().willDestroyProvisionalPage(*this);
 
-        if (&m_process->websiteDataStore() != &m_page.websiteDataStore())
-            m_process->processPool().pageEndUsingWebsiteDataStore(m_page.identifier(), m_process->websiteDataStore());
+        auto dataStore = m_process->websiteDataStore();
+        if (dataStore && dataStore!= &m_page.websiteDataStore())
+            m_process->processPool().pageEndUsingWebsiteDataStore(m_page.identifier(), *dataStore);
 
         m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_webPageID);
         send(Messages::WebPage::Close());

Modified: trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.h (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.h	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/ProvisionalPageProxy.h	2022-05-18 03:23:38 UTC (rev 294381)
@@ -61,6 +61,7 @@
 class WebFrameProxy;
 class WebPageProxy;
 class WebProcessProxy;
+class WebsiteDataStore;
 struct FrameInfoData;
 struct NavigationActionData;
 struct URLSchemeTaskParameters;
@@ -163,6 +164,8 @@
     WebPageProxy& m_page;
     WebCore::PageIdentifier m_webPageID;
     Ref<WebProcessProxy> m_process;
+    // Keep WebsiteDataStore alive for provisional page load.
+    RefPtr<WebsiteDataStore> m_websiteDataStore;
     std::unique_ptr<DrawingAreaProxy> m_drawingArea;
     RefPtr<WebFrameProxy> m_mainFrame;
     uint64_t m_navigationID;

Modified: trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/SuspendedPageProxy.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -53,7 +53,7 @@
 {
     for (auto* suspendedPage : allSuspendedPages()) {
         auto& process = suspendedPage->process();
-        if (&process.processPool() == &processPool && process.registrableDomain() == registrableDomain && &process.websiteDataStore() == &dataStore && process.crossOriginMode() != CrossOriginMode::Isolated && process.captivePortalMode() == captivePortalMode)
+        if (&process.processPool() == &processPool && process.registrableDomain() == registrableDomain && process.websiteDataStore() == &dataStore && process.crossOriginMode() != CrossOriginMode::Isolated && process.captivePortalMode() == captivePortalMode)
             return &process;
     }
     return nullptr;

Modified: trunk/Source/WebKit/UIProcess/WebBackForwardCache.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/WebBackForwardCache.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/WebBackForwardCache.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -134,7 +134,8 @@
 void WebBackForwardCache::removeEntriesForSession(PAL::SessionID sessionID)
 {
     removeEntriesMatching([sessionID](auto& item) {
-        return item.backForwardCacheEntry()->process().websiteDataStore().sessionID() == sessionID;
+        auto* dataStore = item.backForwardCacheEntry()->process().websiteDataStore();
+        return dataStore && dataStore->sessionID() == sessionID;
     });
 }
 

Modified: trunk/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -32,6 +32,7 @@
 #include "WebProcessProxy.h"
 #include "WebsiteDataStore.h"
 #include <WebCore/WebLockIdentifier.h>
+#include <WebCore/WebLockManagerSnapshot.h>
 #include <WebCore/WebLockRegistry.h>
 
 namespace WebKit {
@@ -55,7 +56,13 @@
     MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier());
     m_hasEverRequestedLocks = true;
 
-    m_process.websiteDataStore().webLockRegistry().requestLock(m_process.sessionID(), WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name), lockMode, steal, ifAvailable, [weakThis = WeakPtr { *this }, lockIdentifier, clientID](bool success) {
+    auto* dataStore = m_process.websiteDataStore();
+    if (!dataStore) {
+        m_process.send(Messages::RemoteWebLockRegistry::DidCompleteLockRequest(lockIdentifier, clientID, false), 0);
+        return;
+    }
+
+    dataStore->webLockRegistry().requestLock(m_process.sessionID(), WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name), lockMode, steal, ifAvailable, [weakThis = WeakPtr { *this }, lockIdentifier, clientID](bool success) {
         if (weakThis)
             weakThis->m_process.send(Messages::RemoteWebLockRegistry::DidCompleteLockRequest(lockIdentifier, clientID, success), 0);
     }, [weakThis = WeakPtr { *this }, lockIdentifier, clientID] {
@@ -68,7 +75,8 @@
 {
     MESSAGE_CHECK(lockIdentifier.processIdentifier() == m_process.coreProcessIdentifier());
     MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier());
-    m_process.websiteDataStore().webLockRegistry().releaseLock(m_process.sessionID(), WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name));
+    if (auto* dataStore = m_process.websiteDataStore())
+        dataStore->webLockRegistry().releaseLock(m_process.sessionID(), WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name));
 }
 
 void WebLockRegistryProxy::abortLockRequest(WebCore::ClientOrigin&& clientOrigin, WebCore::WebLockIdentifier lockIdentifier, WebCore::ScriptExecutionContextIdentifier clientID, String&& name, CompletionHandler<void(bool)>&& completionHandler)
@@ -75,24 +83,40 @@
 {
     MESSAGE_CHECK(lockIdentifier.processIdentifier() == m_process.coreProcessIdentifier());
     MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier());
-    m_process.websiteDataStore().webLockRegistry().abortLockRequest(m_process.sessionID(), WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name), WTFMove(completionHandler));
+    auto* dataStore = m_process.websiteDataStore();
+    if (!dataStore) {
+        completionHandler(false);
+        return;
+    }
+
+    dataStore->webLockRegistry().abortLockRequest(m_process.sessionID(), WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name), WTFMove(completionHandler));
 }
 
 void WebLockRegistryProxy::snapshot(WebCore::ClientOrigin&& clientOrigin, CompletionHandler<void(WebCore::WebLockManagerSnapshot&&)>&& completionHandler)
 {
-    m_process.websiteDataStore().webLockRegistry().snapshot(m_process.sessionID(), WTFMove(clientOrigin), WTFMove(completionHandler));
+    auto* dataStore = m_process.websiteDataStore();
+    if (!dataStore) {
+        completionHandler(WebCore::WebLockManagerSnapshot { });
+        return;
+    }
+
+    dataStore->webLockRegistry().snapshot(m_process.sessionID(), WTFMove(clientOrigin), WTFMove(completionHandler));
 }
 
 void WebLockRegistryProxy::clientIsGoingAway(WebCore::ClientOrigin&& clientOrigin, WebCore::ScriptExecutionContextIdentifier clientID)
 {
     MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier());
-    m_process.websiteDataStore().webLockRegistry().clientIsGoingAway(m_process.sessionID(), WTFMove(clientOrigin), clientID);
+    if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(m_process.sessionID()))
+        dataStore->webLockRegistry().clientIsGoingAway(m_process.sessionID(), WTFMove(clientOrigin), clientID);
 }
 
 void WebLockRegistryProxy::processDidExit()
 {
-    if (m_hasEverRequestedLocks)
-        m_process.websiteDataStore().webLockRegistry().clientsAreGoingAway(m_process.coreProcessIdentifier());
+    if (!m_hasEverRequestedLocks)
+        return;
+
+    if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(m_process.sessionID()))
+        dataStore->webLockRegistry().clientsAreGoingAway(m_process.coreProcessIdentifier());
 }
 
 #undef MESSAGE_CHECK

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -978,7 +978,8 @@
     m_process = provisionalPage->process();
     m_webPageID = provisionalPage->webPageID();
     pageClient().didChangeWebPageID();
-    m_websiteDataStore = m_process->websiteDataStore();
+    ASSERT(m_process->websiteDataStore());
+    m_websiteDataStore = *m_process->websiteDataStore();
 
 #if HAVE(VISIBILITY_PROPAGATION_VIEW)
     m_contextIDForVisibilityPropagationInWebProcess = provisionalPage->contextIDForVisibilityPropagationInWebProcess();
@@ -3624,7 +3625,7 @@
     removeAllMessageReceivers();
     auto* navigation = navigationState().navigation(m_provisionalPage->navigationID());
     bool didSuspendPreviousPage = navigation && !m_provisionalPage->isProcessSwappingOnNavigationResponse() ? suspendCurrentPageIfPossible(*navigation, mainFrameIDInPreviousProcess, m_provisionalPage->processSwapRequestedByClient(), shouldDelayClosingUntilFirstLayerFlush) : false;
-    m_process->removeWebPage(*this, m_websiteDataStore.ptr() == &m_provisionalPage->process().websiteDataStore() ? WebProcessProxy::EndsUsingDataStore::No : WebProcessProxy::EndsUsingDataStore::Yes);
+    m_process->removeWebPage(*this, m_websiteDataStore.ptr() == m_provisionalPage->process().websiteDataStore() ? WebProcessProxy::EndsUsingDataStore::No : WebProcessProxy::EndsUsingDataStore::Yes);
 
     // There is no way we'll be able to return to the page in the previous page so close it.
     if (!didSuspendPreviousPage)

Modified: trunk/Source/WebKit/UIProcess/WebProcessCache.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/WebProcessCache.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/WebProcessCache.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -76,8 +76,7 @@
         return false;
     }
 
-    auto sessionID = process.websiteDataStore().sessionID();
-    if (sessionID.isEphemeral() && !process.processPool().hasPagesUsingWebsiteDataStore(process.websiteDataStore())) {
+    if (!process.websiteDataStore()) {
         WEBPROCESSCACHE_RELEASE_LOG("canCacheProcess: Not caching process because this session has been destroyed", process.processIdentifier());
         return false;
     }
@@ -153,7 +152,7 @@
     if (it == m_processesPerRegistrableDomain.end())
         return nullptr;
 
-    if (&it->value->process().websiteDataStore() != &dataStore)
+    if (it->value->process().websiteDataStore() != &dataStore)
         return nullptr;
 
     if (it->value->process().captivePortalMode() != captivePortalMode)
@@ -212,7 +211,8 @@
 {
     Vector<WebCore::RegistrableDomain> keysToRemove;
     for (auto& pair : m_processesPerRegistrableDomain) {
-        if (pair.value->process().websiteDataStore().sessionID() == sessionID) {
+        auto* dataStore = pair.value->process().websiteDataStore();
+        if (!dataStore || dataStore->sessionID() == sessionID) {
             WEBPROCESSCACHE_RELEASE_LOG("clearAllProcessesForSession: Evicting process because its session was destroyed", pair.value->process().processIdentifier());
             keysToRemove.append(pair.key);
         }
@@ -222,7 +222,8 @@
 
     Vector<uint64_t> pendingRequestsToRemove;
     for (auto& pair : m_pendingAddRequests) {
-        if (pair.value->process().websiteDataStore().sessionID() == sessionID) {
+        auto* dataStore = pair.value->process().websiteDataStore();
+        if (!dataStore || dataStore->sessionID() == sessionID) {
             WEBPROCESSCACHE_RELEASE_LOG("clearAllProcessesForSession: Evicting process because its session was destroyed", pair.value->process().processIdentifier());
             pendingRequestsToRemove.append(pair.key);
         }
@@ -276,7 +277,8 @@
 #endif
 {
     RELEASE_ASSERT(!m_process->pageCount());
-    RELEASE_ASSERT_WITH_MESSAGE(!m_process->websiteDataStore().processes().contains(*m_process), "Only processes with pages should be registered with the data store");
+    auto* dataStore = m_process->websiteDataStore();
+    RELEASE_ASSERT_WITH_MESSAGE(dataStore && !dataStore->processes().contains(*m_process), "Only processes with pages should be registered with the data store");
     m_process->setIsInProcessCache(true);
     m_evictionTimer.startOneShot(cachedProcessLifetime);
 }

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -576,7 +576,7 @@
 
     // Prioritize the requesting WebProcess for running the service worker.
     if (!remoteWorkerProcessProxy && !s_useSeparateServiceWorkerProcess && requestingProcess) {
-        if (&requestingProcess->websiteDataStore() == websiteDataStore && requestingProcess->isMatchingRegistrableDomain(registrableDomain))
+        if (requestingProcess->websiteDataStore() == websiteDataStore && requestingProcess->isMatchingRegistrableDomain(registrableDomain))
             useProcessForRemoteWorkers(*requestingProcess);
     }
 
@@ -584,7 +584,7 @@
         for (auto& process : processPool->m_processes) {
             if (process.ptr() == processPool->m_prewarmedProcess.get() || process->isDummyProcessProxy())
                 continue;
-            if (&process->websiteDataStore() != websiteDataStore)
+            if (process->websiteDataStore() != websiteDataStore)
                 continue;
             if (!process->isMatchingRegistrableDomain(registrableDomain))
                 continue;
@@ -1092,7 +1092,7 @@
             if (process->isRunningServiceWorkers())
                 continue;
 #endif
-            if (mustMatchDataStore && &process->websiteDataStore() != &websiteDataStore)
+            if (mustMatchDataStore && process->websiteDataStore() != &websiteDataStore)
                 continue;
             return process;
         }
@@ -1132,7 +1132,7 @@
         // Sharing processes, e.g. when creating the page via window.open().
         process = &pageConfiguration->relatedPage()->ensureRunningProcess();
         // We do not support several WebsiteDataStores sharing a single process.
-        ASSERT(process->isDummyProcessProxy() || pageConfiguration->websiteDataStore() == &process->websiteDataStore());
+        ASSERT(process->isDummyProcessProxy() || pageConfiguration->websiteDataStore() == process->websiteDataStore());
         ASSERT(&pageConfiguration->relatedPage()->websiteDataStore() == pageConfiguration->websiteDataStore());
     } else if (!m_isDelayedWebProcessLaunchDisabled) {
         // In the common case, we delay process launch until something is actually loaded in the page.
@@ -1982,7 +1982,7 @@
         LOG(ProcessSwapping, "(ProcessSwapping) Considering re-use of a previously cached process for domain %s", targetRegistrableDomain.string().utf8().data());
 
         if (auto* process = m_swappedProcessesPerRegistrableDomain.get(targetRegistrableDomain)) {
-            if (&process->websiteDataStore() == dataStore.ptr()) {
+            if (process->websiteDataStore() == dataStore.ptr()) {
                 LOG(ProcessSwapping, "(ProcessSwapping) Reusing a previously cached process with pid %i to continue navigation to URL %s", process->processIdentifier(), targetURL.string().utf8().data());
 
                 return completionHandler(*process, nullptr, reason);

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -33,6 +33,7 @@
 #include "DownloadProxyMap.h"
 #include "LoadParameters.h"
 #include "Logging.h"
+#include "NetworkProcessConnectionInfo.h"
 #include "NotificationManagerMessageHandlerMessages.h"
 #include "ProvisionalPageProxy.h"
 #include "RemoteWorkerType.h"
@@ -241,7 +242,6 @@
 #endif
     , m_isResponsive(NoOrMaybe::Maybe)
     , m_visiblePageCounter([this](RefCounterEvent) { updateBackgroundResponsivenessTimer(); })
-    , m_websiteDataStore(websiteDataStore)
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
     , m_userMediaCaptureManagerProxy(makeUnique<UserMediaCaptureManagerProxy>(makeUniqueRef<UIProxyForCapture>(*this)))
 #endif
@@ -259,6 +259,8 @@
 
     WebPasteboardProxy::singleton().addWebProcessProxy(*this);
 
+    if (websiteDataStore)
+        m_sessionID = websiteDataStore->sessionID();
     platformInitialize();
 }
 
@@ -346,11 +348,19 @@
     }
 }
 
+WebsiteDataStore* WebProcessProxy::websiteDataStore() const
+{
+    if (!m_sessionID)
+        return nullptr;
+
+    return WebsiteDataStore::existingDataStoreForSessionID(*m_sessionID);
+}
+
 void WebProcessProxy::setWebsiteDataStore(WebsiteDataStore& dataStore)
 {
-    ASSERT(!m_websiteDataStore);
+    ASSERT(!m_sessionID);
     WEBPROCESSPROXY_RELEASE_LOG(Process, "setWebsiteDataStore() dataStore=%p, sessionID=%" PRIu64, &dataStore, dataStore.sessionID().toUInt64());
-    m_websiteDataStore = &dataStore;
+    m_sessionID = dataStore.sessionID();
     updateRegistrationWithDataStore();
     send(Messages::WebProcess::SetWebsiteDataStoreParameters(processPool().webProcessDataStoreParameters(*this, dataStore)), 0);
 
@@ -361,19 +371,17 @@
 
 bool WebProcessProxy::isDummyProcessProxy() const
 {
-    return m_websiteDataStore && processPool().dummyProcessProxy(m_websiteDataStore->sessionID()) == this;
+    return m_sessionID && processPool().dummyProcessProxy(*m_sessionID) == this;
 }
 
 void WebProcessProxy::updateRegistrationWithDataStore()
 {
-    if (!m_websiteDataStore)
-        return;
-    
-    bool shouldBeRegistered = pageCount() || provisionalPageCount();
-    if (shouldBeRegistered)
-        m_websiteDataStore->registerProcess(*this);
-    else
-        m_websiteDataStore->unregisterProcess(*this);
+    if (auto* dataStore = websiteDataStore()) {
+        if (pageCount() || provisionalPageCount())
+            dataStore->registerProcess(*this);
+        else
+            dataStore->unregisterProcess(*this);
+    }
 }
 
 void WebProcessProxy::addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage)
@@ -596,7 +604,7 @@
     ASSERT(!m_pageMap.contains(webPage.identifier()));
     ASSERT(!globalPageMap().contains(webPage.identifier()));
     RELEASE_ASSERT(!m_isInProcessCache);
-    ASSERT(!m_websiteDataStore || m_websiteDataStore == &webPage.websiteDataStore());
+    ASSERT(!m_sessionID || websiteDataStore() == &webPage.websiteDataStore());
 
     if (beginsUsingDataStore == BeginsUsingDataStore::Yes) {
         RELEASE_ASSERT(m_processPool);
@@ -815,7 +823,11 @@
 
 void WebProcessProxy::getNetworkProcessConnection(Messages::WebProcessProxy::GetNetworkProcessConnection::DelayedReply&& reply)
 {
-    websiteDataStore().getNetworkProcessConnection(*this, WTFMove(reply));
+    auto* dataStore = websiteDataStore();
+    if (!dataStore)
+        return reply({ });
+
+    dataStore->getNetworkProcessConnection(*this, WTFMove(reply));
 }
 
 #if ENABLE(GPU_PROCESS)
@@ -1701,11 +1713,12 @@
     }
 
     auto registrableDomain = WebCore::RegistrableDomain { url };
-    if (m_registrableDomain && *m_registrableDomain != registrableDomain) {
+    auto* dataStore = websiteDataStore();
+    if (dataStore && m_registrableDomain && *m_registrableDomain != registrableDomain) {
         if (isRunningServiceWorkers())
-            websiteDataStore().networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::ServiceWorker, websiteDataStore().sessionID(), *m_registrableDomain, coreProcessIdentifier());
+            dataStore->networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::ServiceWorker, dataStore->sessionID(), *m_registrableDomain, coreProcessIdentifier());
         if (isRunningSharedWorkers())
-            websiteDataStore().networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::SharedWorker, websiteDataStore().sessionID(), *m_registrableDomain, coreProcessIdentifier());
+            dataStore->networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::SharedWorker, dataStore->sessionID(), *m_registrableDomain, coreProcessIdentifier());
 
         // Null out registrable domain since this process has now been used for several domains.
         m_registrableDomain = WebCore::RegistrableDomain { };
@@ -1752,8 +1765,8 @@
 
 PAL::SessionID WebProcessProxy::sessionID() const
 {
-    ASSERT(m_websiteDataStore);
-    return m_websiteDataStore->sessionID();
+    ASSERT(m_sessionID);
+    return *m_sessionID;
 }
 
 void WebProcessProxy::createSpeechRecognitionServer(SpeechRecognitionServerIdentifier identifier)

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2022-05-18 03:23:38 UTC (rev 294381)
@@ -167,7 +167,7 @@
     void enableRemoteWorkers(RemoteWorkerType, const UserContentControllerIdentifier&);
     void disableRemoteWorkers(RemoteWorkerType);
 
-    WebsiteDataStore& websiteDataStore() const { ASSERT(m_websiteDataStore); return *m_websiteDataStore; }
+    WebsiteDataStore* websiteDataStore() const;
     void setWebsiteDataStore(WebsiteDataStore&);
     
     PAL::SessionID sessionID() const;
@@ -617,9 +617,8 @@
     Vector<CompletionHandler<void(bool webProcessIsResponsive)>> m_isResponsiveCallbacks;
 
     VisibleWebPageCounter m_visiblePageCounter;
+    std::optional<PAL::SessionID> m_sessionID;
 
-    RefPtr<WebsiteDataStore> m_websiteDataStore;
-
     bool m_isUnderMemoryPressure { false };
 
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp (294380 => 294381)


--- trunk/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp	2022-05-18 02:19:29 UTC (rev 294380)
+++ trunk/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp	2022-05-18 03:23:38 UTC (rev 294381)
@@ -42,7 +42,7 @@
     launchOptions.extraInitializationData.set("enable-sandbox"_s, m_processPool->sandboxEnabled() ? "true"_s : "false"_s);
 
     if (m_processPool->sandboxEnabled()) {
-        WebsiteDataStore* dataStore = m_websiteDataStore.get();
+        WebsiteDataStore* dataStore = websiteDataStore();
         if (!dataStore) {
             // Prewarmed processes don't have a WebsiteDataStore yet, so use the primary WebsiteDataStore from the WebProcessPool.
             // The process won't be used if current WebsiteDataStore is different than the WebProcessPool primary one.
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to