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-238892-20220408104645.patch (text/plain), 34.79 KB, created by
Sihui Liu
on 2022-04-08 10:46:49 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Sihui Liu
Created:
2022-04-08 10:46:49 PDT
Size:
34.79 KB
patch
obsolete
>Subversion Revision: 292609 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 5430e1b61654a4c20b13051cea6848248b6df49a..e42d8cc78754e9aa5bd8a643a5e787314b76d8d5 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,64 @@ >+2022-04-08 Sihui Liu <sihui_liu@apple.com> >+ >+ WebProcessProxy should not hold WebsiteDataStore alive when there is no page >+ https://bugs.webkit.org/show_bug.cgi?id=238892 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ With our current implementation, WebProcessProxy can outlive WebPageProxy. And as WebProcessProxy holds strong >+ reference to WebsiteDataStore, WebsiteDataStore will be kept alive even it's not used by any page. >+ >+ * UIProcess/GPU/GPUProcessProxy.cpp: >+ (WebKit::GPUProcessProxy::getGPUProcessConnection): >+ * UIProcess/ProvisionalPageProxy.cpp: >+ (WebKit::ProvisionalPageProxy::ProvisionalPageProxy): >+ (WebKit::ProvisionalPageProxy::~ProvisionalPageProxy): >+ * UIProcess/ProvisionalPageProxy.h: >+ (WebKit::ProvisionalPageProxy::websiteDataStore const): >+ * 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::pageBeginUsingWebsiteDataStore): >+ (WebKit::WebProcessPool::pageEndUsingWebsiteDataStore): >+ (WebKit::WebProcessPool::hasPagesUsingWebsiteDataStore const): >+ (WebKit::WebProcessPool::processForNavigationInternal): >+ * UIProcess/WebProcessPool.h: >+ * UIProcess/WebProcessProxy.cpp: >+ (WebKit::WebProcessProxy::WebProcessProxy): >+ (WebKit::m_webLockRegistry): >+ (WebKit::WebProcessProxy::setWebsiteDataStore): >+ (WebKit::WebProcessProxy::isDummyProcessProxy const): >+ (WebKit::WebProcessProxy::updateRegistrationWithDataStore): >+ (WebKit::WebProcessProxy::addExistingWebPage): >+ (WebKit::WebProcessProxy::removeWebPage): >+ (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): >+ > 2022-04-08 Carlos Garcia Campos <cgarcia@igalia.com> > > [GTK] RemoteInspector: update target list page contents on change instead of reloading >diff --git a/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp b/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp >index 83af1e55ddf7488239f8691927720ab6a863197d..b6318d7da880cb039d1aa8fb4a569cfe65e193bc 100644 >--- a/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp >@@ -387,7 +387,8 @@ void GPUProcessProxy::processWillShutDown(IPC::Connection& connection) > > void GPUProcessProxy::getGPUProcessConnection(WebProcessProxy& webProcessProxy, const GPUProcessConnectionParameters& parameters, Messages::WebProcessProxy::GetGPUProcessConnection::DelayedReply&& reply) > { >- addSession(webProcessProxy.websiteDataStore()); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(webProcessProxy.sessionID())) >+ addSession(*dataStore); > > RELEASE_LOG(ProcessSuspension, "%p - GPUProcessProxy is taking a background assertion because a web process is requesting a connection", this); > startResponsivenessTimer(UseLazyStop::No); >diff --git a/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp b/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >index 88b2ea838672ac71865eb69bcaf5fb22ca00a87f..9b44d58117fad17c3e9df13b4d2ad2c5c7c6c8a4 100644 >--- a/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >+++ b/Source/WebKit/UIProcess/ProvisionalPageProxy.cpp >@@ -83,8 +83,11 @@ ProvisionalPageProxy::ProvisionalPageProxy(WebPageProxy& page, Ref<WebProcessPro > 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()); >+ auto processSessionID = m_process->sessionID(); >+ if (processSessionID != m_page.websiteDataStore().sessionID()) >+ m_process->processPool().pageBeginUsingWebsiteDataStore(m_page.identifier(), processSessionID); >+ m_websiteDataStore = WebsiteDataStore::existingDataStoreForSessionID(processSessionID); >+ ASSERT(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 >@@ -112,8 +115,8 @@ ProvisionalPageProxy::~ProvisionalPageProxy() > 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()); >+ if (m_process->sessionID() != m_page.websiteDataStore().sessionID()) >+ m_process->processPool().pageEndUsingWebsiteDataStore(m_page.identifier(), m_process->sessionID()); > > m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_webPageID); > send(Messages::WebPage::Close()); >diff --git a/Source/WebKit/UIProcess/ProvisionalPageProxy.h b/Source/WebKit/UIProcess/ProvisionalPageProxy.h >index 22d2bb12ca6ad58f2ef7b7a99593b3f06e64a88f..883500faba03668c6333ccc9c951618dccc3944c 100644 >--- a/Source/WebKit/UIProcess/ProvisionalPageProxy.h >+++ b/Source/WebKit/UIProcess/ProvisionalPageProxy.h >@@ -61,6 +61,7 @@ class UserData; > class WebFrameProxy; > class WebPageProxy; > class WebProcessProxy; >+class WebsiteDataStore; > struct FrameInfoData; > struct NavigationActionData; > struct URLSchemeTaskParameters; >@@ -83,6 +84,7 @@ public: > ProcessSwapRequestedByClient processSwapRequestedByClient() const { return m_processSwapRequestedByClient; } > uint64_t navigationID() const { return m_navigationID; } > const URL& provisionalURL() const { return m_provisionalLoadURL; } >+ WebsiteDataStore* websiteDataStore() const { return m_websiteDataStore.get(); } > > bool isProcessSwappingOnNavigationResponse() const { return m_isProcessSwappingOnNavigationResponse; } > >@@ -163,6 +165,7 @@ private: > WebPageProxy& m_page; > WebCore::PageIdentifier m_webPageID; > Ref<WebProcessProxy> m_process; >+ RefPtr<WebsiteDataStore> m_websiteDataStore; > std::unique_ptr<DrawingAreaProxy> m_drawingArea; > RefPtr<WebFrameProxy> m_mainFrame; > uint64_t m_navigationID; >diff --git a/Source/WebKit/UIProcess/SuspendedPageProxy.cpp b/Source/WebKit/UIProcess/SuspendedPageProxy.cpp >index ccbd61287850e731691a330c4e30ad3a36e1f07d..62f1da350768951540c8e01f41cf83611fa3ae1f 100644 >--- a/Source/WebKit/UIProcess/SuspendedPageProxy.cpp >+++ b/Source/WebKit/UIProcess/SuspendedPageProxy.cpp >@@ -53,7 +53,7 @@ RefPtr<WebProcessProxy> SuspendedPageProxy::findReusableSuspendedPageProcess(Web > { > 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.sessionID() == dataStore.sessionID() && process.crossOriginMode() != CrossOriginMode::Isolated && process.captivePortalMode() == captivePortalMode) > return &process; > } > return nullptr; >diff --git a/Source/WebKit/UIProcess/WebBackForwardCache.cpp b/Source/WebKit/UIProcess/WebBackForwardCache.cpp >index 64a1a9f69c6c46224417bdac20cc0e8143f5a034..e57d794cae085e362ea8bbba21dbfd1df20cc2bf 100644 >--- a/Source/WebKit/UIProcess/WebBackForwardCache.cpp >+++ b/Source/WebKit/UIProcess/WebBackForwardCache.cpp >@@ -134,7 +134,7 @@ void WebBackForwardCache::removeEntriesForProcess(WebProcessProxy& process) > void WebBackForwardCache::removeEntriesForSession(PAL::SessionID sessionID) > { > removeEntriesMatching([sessionID](auto& item) { >- return item.backForwardCacheEntry()->process().websiteDataStore().sessionID() == sessionID; >+ return item.backForwardCacheEntry()->process().sessionID() == sessionID; > }); > } > >diff --git a/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp b/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp >index de8790ec1f200df514b64d545925648e31822c27..c83eb6575888ebf47f178ef142e23bef909afff1 100644 >--- a/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp >+++ b/Source/WebKit/UIProcess/WebLockRegistryProxy.cpp >@@ -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,44 +56,58 @@ void WebLockRegistryProxy::requestLock(WebCore::ClientOrigin&& clientOrigin, Web > MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier()); > m_hasEverRequestedLocks = true; > >- m_process.websiteDataStore().webLockRegistry().requestLock(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] { >- if (weakThis) >- weakThis->m_process.send(Messages::RemoteWebLockRegistry::DidStealLock(lockIdentifier, clientID), 0); >- }); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(m_process.sessionID())) { >+ dataStore->webLockRegistry().requestLock(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] { >+ if (weakThis) >+ weakThis->m_process.send(Messages::RemoteWebLockRegistry::DidStealLock(lockIdentifier, clientID), 0); >+ }); >+ } else >+ m_process.send(Messages::RemoteWebLockRegistry::DidCompleteLockRequest(lockIdentifier, clientID, false), 0); > } > > void WebLockRegistryProxy::releaseLock(WebCore::ClientOrigin&& clientOrigin, WebCore::WebLockIdentifier lockIdentifier, WebCore::ScriptExecutionContextIdentifier clientID, String&& name) > { > MESSAGE_CHECK(lockIdentifier.processIdentifier() == m_process.coreProcessIdentifier()); > MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier()); >- m_process.websiteDataStore().webLockRegistry().releaseLock(WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name)); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(m_process.sessionID())) >+ dataStore->webLockRegistry().releaseLock(WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name)); > } > > void WebLockRegistryProxy::abortLockRequest(WebCore::ClientOrigin&& clientOrigin, WebCore::WebLockIdentifier lockIdentifier, WebCore::ScriptExecutionContextIdentifier clientID, String&& name, CompletionHandler<void(bool)>&& completionHandler) > { > MESSAGE_CHECK(lockIdentifier.processIdentifier() == m_process.coreProcessIdentifier()); > MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier()); >- m_process.websiteDataStore().webLockRegistry().abortLockRequest(WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name), WTFMove(completionHandler)); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(m_process.sessionID())) >+ dataStore->webLockRegistry().abortLockRequest(WTFMove(clientOrigin), lockIdentifier, clientID, WTFMove(name), WTFMove(completionHandler)); >+ else >+ completionHandler(false); > } > > void WebLockRegistryProxy::snapshot(WebCore::ClientOrigin&& clientOrigin, CompletionHandler<void(WebCore::WebLockManagerSnapshot&&)>&& completionHandler) > { >- m_process.websiteDataStore().webLockRegistry().snapshot(WTFMove(clientOrigin), WTFMove(completionHandler)); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(m_process.sessionID())) >+ dataStore->webLockRegistry().snapshot(WTFMove(clientOrigin), WTFMove(completionHandler)); >+ else >+ completionHandler(WebCore::WebLockManagerSnapshot { }); > } > > void WebLockRegistryProxy::clientIsGoingAway(WebCore::ClientOrigin&& clientOrigin, WebCore::ScriptExecutionContextIdentifier clientID) > { > MESSAGE_CHECK(clientID.processIdentifier() == m_process.coreProcessIdentifier()); >- m_process.websiteDataStore().webLockRegistry().clientIsGoingAway(WTFMove(clientOrigin), clientID); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(m_process.sessionID())) >+ dataStore->webLockRegistry().clientIsGoingAway(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 >diff --git a/Source/WebKit/UIProcess/WebPageProxy.cpp b/Source/WebKit/UIProcess/WebPageProxy.cpp >index ebfcc8b459646758bac32b73554605a7bbb92d80..b0cc946c585eaa6855f00db6ddc76d166f3c4171 100644 >--- a/Source/WebKit/UIProcess/WebPageProxy.cpp >+++ b/Source/WebKit/UIProcess/WebPageProxy.cpp >@@ -978,7 +978,7 @@ void WebPageProxy::swapToProvisionalPage(std::unique_ptr<ProvisionalPageProxy> p > m_process = provisionalPage->process(); > m_webPageID = provisionalPage->webPageID(); > pageClient().didChangeWebPageID(); >- m_websiteDataStore = m_process->websiteDataStore(); >+ m_websiteDataStore = *provisionalPage->websiteDataStore(); > > #if HAVE(VISIBILITY_PROPAGATION_VIEW) > m_contextIDForVisibilityPropagationInWebProcess = provisionalPage->contextIDForVisibilityPropagationInWebProcess(); >@@ -3614,7 +3614,7 @@ void WebPageProxy::commitProvisionalPage(FrameIdentifier frameID, FrameInfoData& > 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->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) >diff --git a/Source/WebKit/UIProcess/WebProcessCache.cpp b/Source/WebKit/UIProcess/WebProcessCache.cpp >index 51fcbe66341a9930f78c4271348a01eb14b3c271..069133452db157cd63388e7f05bbea735f66e5b3 100644 >--- a/Source/WebKit/UIProcess/WebProcessCache.cpp >+++ b/Source/WebKit/UIProcess/WebProcessCache.cpp >@@ -76,8 +76,8 @@ bool WebProcessCache::canCacheProcess(WebProcessProxy& process) const > return false; > } > >- auto sessionID = process.websiteDataStore().sessionID(); >- if (sessionID.isEphemeral() && !process.processPool().hasPagesUsingWebsiteDataStore(process.websiteDataStore())) { >+ auto sessionID = process.sessionID(); >+ if (sessionID.isEphemeral() && !process.processPool().hasPagesUsingWebsiteDataStore(process.sessionID())) { > WEBPROCESSCACHE_RELEASE_LOG("canCacheProcess: Not caching process because this session has been destroyed", process.processIdentifier()); > return false; > } >@@ -153,7 +153,7 @@ RefPtr<WebProcessProxy> WebProcessCache::takeProcess(const WebCore::RegistrableD > if (it == m_processesPerRegistrableDomain.end()) > return nullptr; > >- if (&it->value->process().websiteDataStore() != &dataStore) >+ if (it->value->process().sessionID() != dataStore.sessionID()) > return nullptr; > > if (it->value->process().captivePortalMode() != captivePortalMode) >@@ -212,7 +212,7 @@ void WebProcessCache::clearAllProcessesForSession(PAL::SessionID sessionID) > { > Vector<WebCore::RegistrableDomain> keysToRemove; > for (auto& pair : m_processesPerRegistrableDomain) { >- if (pair.value->process().websiteDataStore().sessionID() == sessionID) { >+ if (pair.value->process().sessionID() == sessionID) { > WEBPROCESSCACHE_RELEASE_LOG("clearAllProcessesForSession: Evicting process because its session was destroyed", pair.value->process().processIdentifier()); > keysToRemove.append(pair.key); > } >@@ -222,7 +222,7 @@ void WebProcessCache::clearAllProcessesForSession(PAL::SessionID sessionID) > > Vector<uint64_t> pendingRequestsToRemove; > for (auto& pair : m_pendingAddRequests) { >- if (pair.value->process().websiteDataStore().sessionID() == sessionID) { >+ if (pair.value->process().sessionID() == sessionID) { > WEBPROCESSCACHE_RELEASE_LOG("clearAllProcessesForSession: Evicting process because its session was destroyed", pair.value->process().processIdentifier()); > pendingRequestsToRemove.append(pair.key); > } >@@ -276,7 +276,9 @@ WebProcessCache::CachedProcess::CachedProcess(Ref<WebProcessProxy>&& process) > #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 = WebsiteDataStore::existingDataStoreForSessionID(m_process->sessionID()); >+ RELEASE_ASSERT(dataStore); >+ RELEASE_ASSERT_WITH_MESSAGE(!dataStore->processes().contains(*m_process), "Only processes with pages should be registered with the data store"); > m_process->setIsInProcessCache(true); > m_evictionTimer.startOneShot(cachedProcessLifetime); > } >diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp >index 77c4be7943d1b02422e7676278c20f8c0953b049..7de3a87ef6cefc02df280a9ac81a7b1f800b4d22 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.cpp >+++ b/Source/WebKit/UIProcess/WebProcessPool.cpp >@@ -571,7 +571,7 @@ void WebProcessPool::establishRemoteWorkerContextConnectionToNetworkProcess(Remo > > // Prioritize the requesting WebProcess for running the service worker. > if (!remoteWorkerProcessProxy && !shouldUseSeparateRemoteWorkerProcess && requestingProcess) { >- if (&requestingProcess->websiteDataStore() == websiteDataStore && requestingProcess->isMatchingRegistrableDomain(registrableDomain)) >+ if (requestingProcess->sessionID() == websiteDataStore->sessionID() && requestingProcess->isMatchingRegistrableDomain(registrableDomain)) > useProcessForRemoteWorkers(*requestingProcess); > } > >@@ -579,7 +579,7 @@ void WebProcessPool::establishRemoteWorkerContextConnectionToNetworkProcess(Remo > for (auto& process : processPool->m_processes) { > if (process.ptr() == processPool->m_prewarmedProcess.get() || process->isDummyProcessProxy()) > continue; >- if (&process->websiteDataStore() != websiteDataStore) >+ if (process->sessionID() != websiteDataStore->sessionID()) > continue; > if (!process->isMatchingRegistrableDomain(registrableDomain)) > continue; >@@ -1085,7 +1085,7 @@ Ref<WebProcessProxy> WebProcessPool::processForRegistrableDomain(WebsiteDataStor > if (process->isRunningServiceWorkers()) > continue; > #endif >- if (mustMatchDataStore && &process->websiteDataStore() != &websiteDataStore) >+ if (mustMatchDataStore && process->sessionID() != websiteDataStore.sessionID()) > continue; > return process; > } >@@ -1125,7 +1125,7 @@ Ref<WebPageProxy> WebProcessPool::createWebPage(PageClient& pageClient, Ref<API: > // 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->wOebsiteDataStore()->sessionID() == process->sessionID()); > 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. >@@ -1182,19 +1182,18 @@ void WebProcessPool::updateRemoteWorkerUserAgent(const String& userAgent) > workerProcess.setRemoteWorkerUserAgent(m_remoteWorkerUserAgent); > } > >-void WebProcessPool::pageBeginUsingWebsiteDataStore(WebPageProxyIdentifier pageID, WebsiteDataStore& dataStore) >+void WebProcessPool::pageBeginUsingWebsiteDataStore(WebPageProxyIdentifier pageID, PAL::SessionID sessionID) > { > RELEASE_ASSERT(RunLoop::isMain()); >- RELEASE_ASSERT(m_sessionToPageIDsMap.isValidKey(dataStore.sessionID())); >- auto result = m_sessionToPageIDsMap.add(dataStore.sessionID(), HashSet<WebPageProxyIdentifier>()).iterator->value.add(pageID); >+ RELEASE_ASSERT(m_sessionToPageIDsMap.isValidKey(sessionID)); >+ auto result = m_sessionToPageIDsMap.add(sessionID, HashSet<WebPageProxyIdentifier>()).iterator->value.add(pageID); > ASSERT_UNUSED(result, result.isNewEntry); > } > >-void WebProcessPool::pageEndUsingWebsiteDataStore(WebPageProxyIdentifier pageID, WebsiteDataStore& dataStore) >+void WebProcessPool::pageEndUsingWebsiteDataStore(WebPageProxyIdentifier pageID, PAL::SessionID sessionID) > { > RELEASE_ASSERT(RunLoop::isMain()); >- auto sessionID = dataStore.sessionID(); >- RELEASE_ASSERT(m_sessionToPageIDsMap.isValidKey(dataStore.sessionID())); >+ RELEASE_ASSERT(m_sessionToPageIDsMap.isValidKey(sessionID)); > auto iterator = m_sessionToPageIDsMap.find(sessionID); > RELEASE_ASSERT(iterator != m_sessionToPageIDsMap.end()); > >@@ -1209,11 +1208,11 @@ void WebProcessPool::pageEndUsingWebsiteDataStore(WebPageProxyIdentifier pageID, > } > } > >-bool WebProcessPool::hasPagesUsingWebsiteDataStore(WebsiteDataStore& dataStore) const >+bool WebProcessPool::hasPagesUsingWebsiteDataStore(PAL::SessionID sessionID) const > { > RELEASE_ASSERT(RunLoop::isMain()); >- RELEASE_ASSERT(m_sessionToPageIDsMap.isValidKey(dataStore.sessionID())); >- return m_sessionToPageIDsMap.contains(dataStore.sessionID()); >+ RELEASE_ASSERT(m_sessionToPageIDsMap.isValidKey(sessionID)); >+ return m_sessionToPageIDsMap.contains(sessionID); > } > > DownloadProxy& WebProcessPool::download(WebsiteDataStore& dataStore, WebPageProxy* initiatingPage, const ResourceRequest& request, const String& suggestedFilename) >@@ -1975,7 +1974,7 @@ void WebProcessPool::processForNavigationInternal(WebPageProxy& page, const API: > 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->sessionID() == dataStore->sessionID()) { > 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); >diff --git a/Source/WebKit/UIProcess/WebProcessPool.h b/Source/WebKit/UIProcess/WebProcessPool.h >index 409a79b51b7050d108be1310fe2f0a2c0f7557e7..3829b2e6a870ce91ac5fcf50f353c67cc6e83487 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.h >+++ b/Source/WebKit/UIProcess/WebProcessPool.h >@@ -214,9 +214,9 @@ public: > > Ref<WebPageProxy> createWebPage(PageClient&, Ref<API::PageConfiguration>&&); > >- void pageBeginUsingWebsiteDataStore(WebPageProxyIdentifier, WebsiteDataStore&); >- void pageEndUsingWebsiteDataStore(WebPageProxyIdentifier, WebsiteDataStore&); >- bool hasPagesUsingWebsiteDataStore(WebsiteDataStore&) const; >+ void pageBeginUsingWebsiteDataStore(WebPageProxyIdentifier, PAL::SessionID); >+ void pageEndUsingWebsiteDataStore(WebPageProxyIdentifier, PAL::SessionID); >+ bool hasPagesUsingWebsiteDataStore(PAL::SessionID) const; > > const String& injectedBundlePath() const { return m_configuration->injectedBundlePath(); } > #if PLATFORM(COCOA) >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.cpp b/Source/WebKit/UIProcess/WebProcessProxy.cpp >index 170450a95ba6e8a49ee5fc81e11b55091bb94b62..0b416835268a8a3715248fc6b5b8ed066abe6cc1 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/WebProcessProxy.cpp >@@ -241,7 +241,6 @@ WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore* > #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 >@@ -258,7 +257,8 @@ WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore* > ASSERT_UNUSED(result, result.isNewEntry); > > WebPasteboardProxy::singleton().addWebProcessProxy(*this); >- >+ if (websiteDataStore) >+ m_sessionID = websiteDataStore->sessionID(); > platformInitialize(); > } > >@@ -348,32 +348,34 @@ void WebProcessProxy::setIsInProcessCache(bool value, WillShutDown willShutDown) > > void WebProcessProxy::setWebsiteDataStore(WebsiteDataStore& dataStore) > { >- ASSERT(!m_websiteDataStore); >+ ASSERT(!m_sessionID.isValid()); > WEBPROCESSPROXY_RELEASE_LOG(Process, "setWebsiteDataStore() dataStore=%p, sessionID=%" PRIu64, &dataStore, dataStore.sessionID().toUInt64()); >- m_websiteDataStore = &dataStore; > updateRegistrationWithDataStore(); > send(Messages::WebProcess::SetWebsiteDataStoreParameters(processPool().webProcessDataStoreParameters(*this, dataStore)), 0); > > // Delay construction of the WebLockRegistryProxy until the WebProcessProxy has a data store since the data store holds the > // LocalWebLockRegistry. > m_webLockRegistry = makeUnique<WebLockRegistryProxy>(*this); >+ m_sessionID = dataStore.sessionID(); > } > > bool WebProcessProxy::isDummyProcessProxy() const > { >- return m_websiteDataStore && processPool().dummyProcessProxy(m_websiteDataStore->sessionID()) == this; >+ return m_sessionID.isValid() && processPool().dummyProcessProxy(sessionID()) == this; > } > > void WebProcessProxy::updateRegistrationWithDataStore() > { >- if (!m_websiteDataStore) >+ if (!m_sessionID.isValid()) > return; >- >+ > bool shouldBeRegistered = pageCount() || provisionalPageCount(); >- if (shouldBeRegistered) >- m_websiteDataStore->registerProcess(*this); >- else >- m_websiteDataStore->unregisterProcess(*this); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(sessionID())) { >+ if (shouldBeRegistered) >+ dataStore->registerProcess(*this); >+ else >+ dataStore->unregisterProcess(*this); >+ } > } > > void WebProcessProxy::addProvisionalPageProxy(ProvisionalPageProxy& provisionalPage) >@@ -596,11 +598,11 @@ void WebProcessProxy::addExistingWebPage(WebPageProxy& webPage, BeginsUsingDataS > 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.isValid() || m_sessionID == webPage.websiteDataStore().sessionID()); > > if (beginsUsingDataStore == BeginsUsingDataStore::Yes) { > RELEASE_ASSERT(m_processPool); >- m_processPool->pageBeginUsingWebsiteDataStore(webPage.identifier(), webPage.websiteDataStore()); >+ m_processPool->pageBeginUsingWebsiteDataStore(webPage.identifier(), webPage.websiteDataStore().sessionID()); > } > > markProcessAsRecentlyUsed(); >@@ -632,7 +634,7 @@ void WebProcessProxy::removeWebPage(WebPageProxy& webPage, EndsUsingDataStore en > ASSERT_UNUSED(removedPage, removedPage == &webPage); > > if (endsUsingDataStore == EndsUsingDataStore::Yes) >- m_processPool->pageEndUsingWebsiteDataStore(webPage.identifier(), webPage.websiteDataStore()); >+ m_processPool->pageEndUsingWebsiteDataStore(webPage.identifier(), webPage.websiteDataStore().sessionID()); > > removeVisitedLinkStoreUser(webPage.visitedLinkStore(), webPage.identifier()); > updateRegistrationWithDataStore(); >@@ -815,7 +817,8 @@ void WebProcessProxy::updateBackForwardItem(const BackForwardListItemState& item > > void WebProcessProxy::getNetworkProcessConnection(Messages::WebProcessProxy::GetNetworkProcessConnection::DelayedReply&& reply) > { >- websiteDataStore().getNetworkProcessConnection(*this, WTFMove(reply)); >+ if (auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(sessionID())) >+ dataStore->getNetworkProcessConnection(*this, WTFMove(reply)); > } > > #if ENABLE(GPU_PROCESS) >@@ -1704,10 +1707,12 @@ void WebProcessProxy::didStartProvisionalLoadForMainFrame(const URL& url) > > auto registrableDomain = WebCore::RegistrableDomain { url }; > if (m_registrableDomain && *m_registrableDomain != registrableDomain) { >- if (isRunningServiceWorkers()) >- websiteDataStore().networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::ServiceWorker, websiteDataStore().sessionID(), *m_registrableDomain, coreProcessIdentifier()); >- if (isRunningSharedWorkers()) >- websiteDataStore().networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::SharedWorker, websiteDataStore().sessionID(), *m_registrableDomain, coreProcessIdentifier()); >+ auto* dataStore = WebsiteDataStore::existingDataStoreForSessionID(sessionID()); >+ if (dataStore && isRunningServiceWorkers()) >+ dataStore->networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::ServiceWorker, sessionID(), *m_registrableDomain, coreProcessIdentifier()); >+ >+ if (dataStore && isRunningSharedWorkers()) >+ dataStore->networkProcess().terminateRemoteWorkerContextConnectionWhenPossible(RemoteWorkerType::SharedWorker, sessionID(), *m_registrableDomain, coreProcessIdentifier()); > > // Null out registrable domain since this process has now been used for several domains. > m_registrableDomain = WebCore::RegistrableDomain { }; >@@ -1754,8 +1759,7 @@ WebProcessPool& WebProcessProxy::processPool() const > > PAL::SessionID WebProcessProxy::sessionID() const > { >- ASSERT(m_websiteDataStore); >- return m_websiteDataStore->sessionID(); >+ return m_sessionID; > } > > void WebProcessProxy::createSpeechRecognitionServer(SpeechRecognitionServerIdentifier identifier) >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.h b/Source/WebKit/UIProcess/WebProcessProxy.h >index 0555d3d576345bb249610858d69466e49159f1ac..f86f437dd543950ee38384c170cf2a31c91a5b87 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.h >+++ b/Source/WebKit/UIProcess/WebProcessProxy.h >@@ -167,7 +167,6 @@ public: > void enableRemoteWorkers(RemoteWorkerType, const UserContentControllerIdentifier&); > void disableRemoteWorkers(RemoteWorkerType); > >- WebsiteDataStore& websiteDataStore() const { ASSERT(m_websiteDataStore); return *m_websiteDataStore; } > void setWebsiteDataStore(WebsiteDataStore&); > > PAL::SessionID sessionID() const; >@@ -614,7 +613,7 @@ private: > > VisibleWebPageCounter m_visiblePageCounter; > >- RefPtr<WebsiteDataStore> m_websiteDataStore; >+ PAL::SessionID m_sessionID { 0 }; > > bool m_isUnderMemoryPressure { false }; > >diff --git a/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp b/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp >index 864d0e36fb8da256d5132ee356306c528c6e64e7..367138f0cf0e67b462a4440dc72e7f42ffaf9e00 100644 >--- a/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp >+++ b/Source/WebKit/UIProcess/glib/WebProcessProxyGLib.cpp >@@ -42,7 +42,7 @@ void WebProcessProxy::platformGetLaunchOptions(ProcessLauncher::LaunchOptions& l > 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::existingDataStoreForSessionID(m_sessionID); > 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.
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 238892
:
456860
|
456869
|
456887
|
457092
|
457110
|
457115
|
457489
|
458073
|
459325
|
459509
|
459511
|
459522