Title: [249647] trunk/Source/WebKit
Revision
249647
Author
[email protected]
Date
2019-09-09 10:02:14 -0700 (Mon, 09 Sep 2019)

Log Message

Remove ServiceWorkerProcessProxy
https://bugs.webkit.org/show_bug.cgi?id=201506

Reviewed by Chris Dumez.

Instead of using a specific ServiceWorkerProcessProxy, move the logic directly in WebProcessProxy.
This will allow us in the future to run a service worker in a process that already runs a web page,
thus saving the need to spin off a new process.

This patch adds a new WebProcessProxy::createForServiceWorkers method instead of creating a
ServiceWorkerProcessProxy. The behavior is then similar: a process running a service worker cannot run a page.

* Sources.txt:
* UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
(-[WKWebsiteDataStore _hasRegisteredServiceWorker]):
* UIProcess/BackgroundProcessResponsivenessTimer.cpp:
(WebKit::BackgroundProcessResponsivenessTimer::shouldBeActive const):
* UIProcess/Network/NetworkProcessProxy.cpp:
(WebKit::NetworkProcessProxy::openNetworkProcessConnection):
* UIProcess/ServiceWorkerProcessProxy.cpp: Removed.
* UIProcess/ServiceWorkerProcessProxy.h: Removed.
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::establishWorkerContextConnectionToNetworkProcess):
(WebKit::WebProcessPool::disconnectProcess):
(WebKit::WebProcessPool::processForRegistrableDomain):
(WebKit::WebProcessPool::createWebPage):
(WebKit::WebProcessPool::updateServiceWorkerUserAgent):
(WebKit::WebProcessPool::mayHaveRegisteredServiceWorkers):
(WebKit::WebProcessPool::updateProcessAssertions):
(WebKit::WebProcessPool::isServiceWorkerPageID const):
* UIProcess/WebProcessPool.h:
* UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::createForServiceWorkers):
(WebKit::WebProcessProxy::getLaunchOptions):
(WebKit::WebProcessProxy::didBecomeUnresponsive):
(WebKit::WebProcessProxy::canBeAddedToWebProcessCache const):
(WebKit::WebProcessProxy::didSetAssertionState):
(WebKit::WebProcessProxy::didExceedCPULimit):
(WebKit::WebProcessProxy::establishServiceWorkerContext):
(WebKit::WebProcessProxy::setServiceWorkerUserAgent):
(WebKit::WebProcessProxy::updateServiceWorkerPreferencesStore):
* UIProcess/WebProcessProxy.h:
(WebKit::WebProcessProxy::isRunningServiceWorkers const):
(WebKit::WebProcessProxy::hasServiceWorkerPageProxy):
* UIProcess/glib/WebProcessPoolGLib.cpp:
(WebKit::WebProcessPool::platformInitializeWebProcess):
* WebKit.xcodeproj/project.pbxproj:

Modified Paths

Removed Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (249646 => 249647)


--- trunk/Source/WebKit/ChangeLog	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/ChangeLog	2019-09-09 17:02:14 UTC (rev 249647)
@@ -1,5 +1,55 @@
 2019-09-09  Youenn Fablet  <[email protected]>
 
+        Remove ServiceWorkerProcessProxy
+        https://bugs.webkit.org/show_bug.cgi?id=201506
+
+        Reviewed by Chris Dumez.
+
+        Instead of using a specific ServiceWorkerProcessProxy, move the logic directly in WebProcessProxy.
+        This will allow us in the future to run a service worker in a process that already runs a web page,
+        thus saving the need to spin off a new process.
+
+        This patch adds a new WebProcessProxy::createForServiceWorkers method instead of creating a
+        ServiceWorkerProcessProxy. The behavior is then similar: a process running a service worker cannot run a page.
+
+        * Sources.txt:
+        * UIProcess/API/Cocoa/WKWebsiteDataStore.mm:
+        (-[WKWebsiteDataStore _hasRegisteredServiceWorker]):
+        * UIProcess/BackgroundProcessResponsivenessTimer.cpp:
+        (WebKit::BackgroundProcessResponsivenessTimer::shouldBeActive const):
+        * UIProcess/Network/NetworkProcessProxy.cpp:
+        (WebKit::NetworkProcessProxy::openNetworkProcessConnection):
+        * UIProcess/ServiceWorkerProcessProxy.cpp: Removed.
+        * UIProcess/ServiceWorkerProcessProxy.h: Removed.
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::establishWorkerContextConnectionToNetworkProcess):
+        (WebKit::WebProcessPool::disconnectProcess):
+        (WebKit::WebProcessPool::processForRegistrableDomain):
+        (WebKit::WebProcessPool::createWebPage):
+        (WebKit::WebProcessPool::updateServiceWorkerUserAgent):
+        (WebKit::WebProcessPool::mayHaveRegisteredServiceWorkers):
+        (WebKit::WebProcessPool::updateProcessAssertions):
+        (WebKit::WebProcessPool::isServiceWorkerPageID const):
+        * UIProcess/WebProcessPool.h:
+        * UIProcess/WebProcessProxy.cpp:
+        (WebKit::WebProcessProxy::createForServiceWorkers):
+        (WebKit::WebProcessProxy::getLaunchOptions):
+        (WebKit::WebProcessProxy::didBecomeUnresponsive):
+        (WebKit::WebProcessProxy::canBeAddedToWebProcessCache const):
+        (WebKit::WebProcessProxy::didSetAssertionState):
+        (WebKit::WebProcessProxy::didExceedCPULimit):
+        (WebKit::WebProcessProxy::establishServiceWorkerContext):
+        (WebKit::WebProcessProxy::setServiceWorkerUserAgent):
+        (WebKit::WebProcessProxy::updateServiceWorkerPreferencesStore):
+        * UIProcess/WebProcessProxy.h:
+        (WebKit::WebProcessProxy::isRunningServiceWorkers const):
+        (WebKit::WebProcessProxy::hasServiceWorkerPageProxy):
+        * UIProcess/glib/WebProcessPoolGLib.cpp:
+        (WebKit::WebProcessPool::platformInitializeWebProcess):
+        * WebKit.xcodeproj/project.pbxproj:
+
+2019-09-09  Youenn Fablet  <[email protected]>
+
         Use WebProcess processIdentifier to identify IDB connections between WebProcess and NetworkProcess
         https://bugs.webkit.org/show_bug.cgi?id=201419
 

Modified: trunk/Source/WebKit/Sources.txt (249646 => 249647)


--- trunk/Source/WebKit/Sources.txt	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/Sources.txt	2019-09-09 17:02:14 UTC (rev 249647)
@@ -250,7 +250,6 @@
 UIProcess/ProvisionalPageProxy.cpp
 UIProcess/RemoteWebInspectorProxy.cpp
 UIProcess/ResponsivenessTimer.cpp
-UIProcess/ServiceWorkerProcessProxy.cpp
 UIProcess/StatisticsRequest.cpp
 UIProcess/SuspendedPageProxy.cpp
 UIProcess/SystemPreviewController.cpp

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebsiteDataStore.mm	2019-09-09 17:02:14 UTC (rev 249647)
@@ -41,7 +41,7 @@
 #import "_WKWebsiteDataStoreConfiguration.h"
 #import "_WKWebsiteDataStoreDelegate.h"
 #import <WebCore/Credential.h>
-#import <WebKit/ServiceWorkerProcessProxy.h>
+#import <WebCore/RegistrationDatabase.h>
 #import <wtf/BlockPtr.h>
 #import <wtf/URL.h>
 #import <wtf/WeakObjCPtr.h>
@@ -578,7 +578,7 @@
 
 - (bool)_hasRegisteredServiceWorker
 {
-    return WebKit::ServiceWorkerProcessProxy::hasRegisteredServiceWorkers(_websiteDataStore->websiteDataStore().serviceWorkerRegistrationDirectory());
+    return FileSystem::fileExists(WebCore::serviceWorkerRegistrationDatabaseFilename(_websiteDataStore->websiteDataStore().serviceWorkerRegistrationDirectory()));
 }
 
 - (id <_WKWebsiteDataStoreDelegate>)_delegate

Modified: trunk/Source/WebKit/UIProcess/BackgroundProcessResponsivenessTimer.cpp (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/BackgroundProcessResponsivenessTimer.cpp	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/BackgroundProcessResponsivenessTimer.cpp	2019-09-09 17:02:14 UTC (rev 249647)
@@ -135,7 +135,7 @@
 {
 #if !PLATFORM(IOS_FAMILY)
     // Service worker process are always in the background.
-    if (m_webProcessProxy.isServiceWorkerProcess())
+    if (m_webProcessProxy.isRunningServiceWorkers())
         return true;
     return !m_webProcessProxy.visiblePageCount() && m_webProcessProxy.pageCount();
 #else

Modified: trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/Network/NetworkProcessProxy.cpp	2019-09-09 17:02:14 UTC (rev 249647)
@@ -145,9 +145,9 @@
     bool isServiceWorkerProcess = false;
     RegistrableDomain registrableDomain;
 #if ENABLE(SERVICE_WORKER)
-    if (is<ServiceWorkerProcessProxy>(webProcessProxy)) {
+    if (webProcessProxy.isRunningServiceWorkers()) {
         isServiceWorkerProcess = true;
-        registrableDomain = downcast<ServiceWorkerProcessProxy>(webProcessProxy).registrableDomain();
+        registrableDomain = webProcessProxy.registrableDomain();
     }
 #endif
 

Deleted: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp	2019-09-09 17:02:14 UTC (rev 249647)
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2017 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.
- */
-
-#include "config.h"
-#include "ServiceWorkerProcessProxy.h"
-
-#if ENABLE(SERVICE_WORKER)
-
-#include "AuthenticationChallengeDisposition.h"
-#include "AuthenticationChallengeProxy.h"
-#include "AuthenticationDecisionListener.h"
-#include "WebCredential.h"
-#include "WebPageGroup.h"
-#include "WebPreferencesStore.h"
-#include "WebProcessMessages.h"
-#include "WebProcessPool.h"
-#include "WebSWContextManagerConnectionMessages.h"
-#include <WebCore/NotImplemented.h>
-#include <WebCore/RegistrationDatabase.h>
-
-namespace WebKit {
-using namespace WebCore;
-
-Ref<ServiceWorkerProcessProxy> ServiceWorkerProcessProxy::create(WebProcessPool& pool, const RegistrableDomain& registrableDomain, WebsiteDataStore& store)
-{
-    auto proxy = adoptRef(*new ServiceWorkerProcessProxy { pool, registrableDomain, store });
-    proxy->connect();
-    return proxy;
-}
-
-ServiceWorkerProcessProxy::ServiceWorkerProcessProxy(WebProcessPool& pool, const RegistrableDomain& registrableDomain, WebsiteDataStore& store)
-    : WebProcessProxy { pool, &store, IsPrewarmed::No }
-    , m_registrableDomain(registrableDomain)
-    , m_serviceWorkerPageProxyID(WebPageProxyIdentifier::generate())
-    , m_serviceWorkerPageID(PageIdentifier::generate())
-{
-}
-
-ServiceWorkerProcessProxy::~ServiceWorkerProcessProxy()
-{
-}
-
-bool ServiceWorkerProcessProxy::hasRegisteredServiceWorkers(const String& serviceWorkerDirectory)
-{
-    String registrationFile = WebCore::serviceWorkerRegistrationDatabaseFilename(serviceWorkerDirectory);
-    return FileSystem::fileExists(registrationFile);
-}
-
-void ServiceWorkerProcessProxy::getLaunchOptions(ProcessLauncher::LaunchOptions& launchOptions)
-{
-    WebProcessProxy::getLaunchOptions(launchOptions);
-
-    launchOptions.extraInitializationData.add("service-worker-process"_s, "1"_s);
-    launchOptions.extraInitializationData.add("registrable-domain"_s, registrableDomain().string());
-}
-
-void ServiceWorkerProcessProxy::start(const WebPreferencesStore& store, Optional<PAL::SessionID> initialSessionID)
-{
-    send(Messages::WebProcess::EstablishWorkerContextConnectionToNetworkProcess { processPool().defaultPageGroup().pageGroupID(), m_serviceWorkerPageProxyID, m_serviceWorkerPageID, store, initialSessionID.valueOr(PAL::SessionID::defaultSessionID()) }, 0);
-}
-
-void ServiceWorkerProcessProxy::setUserAgent(const String& userAgent)
-{
-    send(Messages::WebSWContextManagerConnection::SetUserAgent { userAgent }, 0);
-}
-
-void ServiceWorkerProcessProxy::updatePreferencesStore(const WebPreferencesStore& store)
-{
-    send(Messages::WebSWContextManagerConnection::UpdatePreferencesStore { store }, 0);
-}
-
-} // namespace WebKit
-
-#endif // ENABLE(SERVICE_WORKER)

Deleted: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h	2019-09-09 17:02:14 UTC (rev 249647)
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2017 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
-
-#if ENABLE(SERVICE_WORKER)
-
-#include "WebProcessProxy.h"
-#include <WebCore/RegistrableDomain.h>
-
-namespace WebKit {
-class AuthenticationChallengeProxy;
-struct WebPreferencesStore;
-
-class ServiceWorkerProcessProxy final : public WebProcessProxy {
-public:
-    static Ref<ServiceWorkerProcessProxy> create(WebProcessPool&, const WebCore::RegistrableDomain&, WebsiteDataStore&);
-    ~ServiceWorkerProcessProxy();
-
-    static bool hasRegisteredServiceWorkers(const String& serviceWorkerDirectory);
-
-    void start(const WebPreferencesStore&, Optional<PAL::SessionID> initialSessionID);
-    void setUserAgent(const String&);
-    void updatePreferencesStore(const WebPreferencesStore&);
-
-    const WebCore::RegistrableDomain& registrableDomain() { return m_registrableDomain; }
-    WebPageProxyIdentifier webPageProxyID() const { return m_serviceWorkerPageProxyID; }
-    WebCore::PageIdentifier webPageID() const { return m_serviceWorkerPageID; }
-
-private:
-    // AuxiliaryProcessProxy
-    void getLaunchOptions(ProcessLauncher::LaunchOptions&) final;
-
-    bool isServiceWorkerProcess() const final { return true; }
-
-    ServiceWorkerProcessProxy(WebProcessPool&, const WebCore::RegistrableDomain&, WebsiteDataStore&);
-
-    WebCore::RegistrableDomain m_registrableDomain;
-    WebPageProxyIdentifier m_serviceWorkerPageProxyID;
-    WebCore::PageIdentifier m_serviceWorkerPageID;
-};
-
-} // namespace WebKit
-
-SPECIALIZE_TYPE_TRAITS_BEGIN(WebKit::ServiceWorkerProcessProxy)
-    static bool isType(const WebKit::WebProcessProxy& webProcessProxy) { return webProcessProxy.isServiceWorkerProcess(); }
-SPECIALIZE_TYPE_TRAITS_END()
-
-#endif // ENABLE(SERVICE_WORKER)

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2019-09-09 17:02:14 UTC (rev 249647)
@@ -49,7 +49,6 @@
 #include "PerActivityStateCPUUsageSampler.h"
 #include "PluginProcessManager.h"
 #include "SandboxExtension.h"
-#include "ServiceWorkerProcessProxy.h"
 #include "StatisticsData.h"
 #include "TextChecker.h"
 #include "UIGamepad.h"
@@ -86,6 +85,7 @@
 #include <WebCore/PlatformScreen.h>
 #include <WebCore/ProcessIdentifier.h>
 #include <WebCore/ProcessWarming.h>
+#include <WebCore/RegistrationDatabase.h>
 #include <WebCore/ResourceRequest.h>
 #include <WebCore/RuntimeApplicationChecks.h>
 #include <WebCore/RuntimeEnabledFeatures.h>
@@ -709,8 +709,8 @@
     if (m_serviceWorkerProcesses.isEmpty())
         sendToAllProcesses(Messages::WebProcess::RegisterServiceWorkerClients { });
 
-    auto serviceWorkerProcessProxy = ServiceWorkerProcessProxy::create(*this, registrableDomain, *websiteDataStore);
-    m_serviceWorkerProcesses.add(WTFMove(registrableDomain), serviceWorkerProcessProxy.ptr());
+    auto serviceWorkerProcessProxy = WebProcessProxy::createForServiceWorkers(*this, WTFMove(registrableDomain), *websiteDataStore);
+    m_serviceWorkerProcesses.add(serviceWorkerProcessProxy->registrableDomain(), serviceWorkerProcessProxy.ptr());
 
     updateProcessAssertions();
     initializeNewWebProcess(serviceWorkerProcessProxy, websiteDataStore);
@@ -718,9 +718,9 @@
     auto* serviceWorkerProcessProxyPtr = serviceWorkerProcessProxy.ptr();
     m_processes.append(WTFMove(serviceWorkerProcessProxy));
 
-    serviceWorkerProcessProxyPtr->start(m_serviceWorkerPreferences ? m_serviceWorkerPreferences.value() : m_defaultPageGroup->preferences().store(), sessionID);
+    serviceWorkerProcessProxyPtr->establishServiceWorkerContext(m_serviceWorkerPreferences ? m_serviceWorkerPreferences.value() : m_defaultPageGroup->preferences().store(), sessionID.valueOr(PAL::SessionID::defaultSessionID()));
     if (!m_serviceWorkerUserAgent.isNull())
-        serviceWorkerProcessProxyPtr->setUserAgent(m_serviceWorkerUserAgent);
+        serviceWorkerProcessProxyPtr->setServiceWorkerUserAgent(m_serviceWorkerUserAgent);
 }
 #endif
 
@@ -1126,8 +1126,8 @@
     });
 
 #if ENABLE(SERVICE_WORKER)
-    if (is<ServiceWorkerProcessProxy>(*process)) {
-        auto* removedProcess = m_serviceWorkerProcesses.take(downcast<ServiceWorkerProcessProxy>(*process).registrableDomain());
+    if (process->isRunningServiceWorkers()) {
+        auto* removedProcess = m_serviceWorkerProcesses.take(process->registrableDomain());
         ASSERT_UNUSED(removedProcess, removedProcess == process);
         updateProcessAssertions();
     }
@@ -1187,7 +1187,7 @@
         if (process == m_prewarmedProcess || process == m_dummyProcessProxy)
             continue;
 #if ENABLE(SERVICE_WORKER)
-        if (is<ServiceWorkerProcessProxy>(*process))
+        if (process->isRunningServiceWorkers())
             continue;
 #endif
         if (mustMatchDataStore && &process->websiteDataStore() != &websiteDataStore)
@@ -1241,12 +1241,12 @@
     auto page = process->createWebPage(pageClient, WTFMove(pageConfiguration));
 
 #if ENABLE(SERVICE_WORKER)
-    ASSERT(!is<ServiceWorkerProcessProxy>(*process));
+    ASSERT(!process->isRunningServiceWorkers());
 
     if (!m_serviceWorkerPreferences) {
         m_serviceWorkerPreferences = page->preferencesStore();
         for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values())
-            serviceWorkerProcess->updatePreferencesStore(*m_serviceWorkerPreferences);
+            serviceWorkerProcess->updateServiceWorkerPreferencesStore(*m_serviceWorkerPreferences);
     }
 #endif
 
@@ -1274,7 +1274,7 @@
         return;
     m_serviceWorkerUserAgent = userAgent;
     for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values())
-        serviceWorkerProcess->setUserAgent(m_serviceWorkerUserAgent);
+        serviceWorkerProcess->setServiceWorkerUserAgent(m_serviceWorkerUserAgent);
 }
 
 bool WebProcessPool::mayHaveRegisteredServiceWorkers(const WebsiteDataStore& store)
@@ -1288,7 +1288,7 @@
 
     return m_mayHaveRegisteredServiceWorkers.ensure(serviceWorkerRegistrationDirectory, [&] {
         // FIXME: Make this computation on a background thread.
-        return ServiceWorkerProcessProxy::hasRegisteredServiceWorkers(serviceWorkerRegistrationDirectory);
+        return FileSystem::fileExists(WebCore::serviceWorkerRegistrationDatabaseFilename(serviceWorkerRegistrationDirectory));
     }).iterator->value;
 }
 #endif
@@ -2132,9 +2132,9 @@
         if (!m_serviceWorkerProcesses.isEmpty() && m_foregroundWebProcessCounter.value()) {
             // FIXME: We can do better than this once we have process per origin.
             for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values()) {
-                auto& registrableDomain = serviceWorkerProcess->registrableDomain();
+                auto registrableDomain = serviceWorkerProcess->registrableDomain();
                 if (!m_foregroundTokensForServiceWorkerProcesses.contains(registrableDomain))
-                    m_foregroundTokensForServiceWorkerProcesses.add(registrableDomain, serviceWorkerProcess->throttler().foregroundActivityToken());
+                    m_foregroundTokensForServiceWorkerProcesses.add(WTFMove(registrableDomain), serviceWorkerProcess->throttler().foregroundActivityToken());
             }
             m_backgroundTokensForServiceWorkerProcesses.clear();
             return;
@@ -2142,9 +2142,9 @@
         if (!m_serviceWorkerProcesses.isEmpty() && m_backgroundWebProcessCounter.value()) {
             // FIXME: We can do better than this once we have process per origin.
             for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values()) {
-                auto& registrableDomain = serviceWorkerProcess->registrableDomain();
+                auto registrableDomain = serviceWorkerProcess->registrableDomain();
                 if (!m_backgroundTokensForServiceWorkerProcesses.contains(registrableDomain))
-                    m_backgroundTokensForServiceWorkerProcesses.add(registrableDomain, serviceWorkerProcess->throttler().backgroundActivityToken());
+                    m_backgroundTokensForServiceWorkerProcesses.add(WTFMove(registrableDomain), serviceWorkerProcess->throttler().backgroundActivityToken());
             }
             m_foregroundTokensForServiceWorkerProcesses.clear();
             return;
@@ -2198,10 +2198,9 @@
 {
 #if ENABLE(SERVICE_WORKER)
     // FIXME: This is inefficient.
-    for (auto* serviceWorkerProcess : m_serviceWorkerProcesses.values()) {
-        if (serviceWorkerProcess->webPageProxyID() == pageID)
-            return true;
-    }
+    return WTF::anyOf(m_serviceWorkerProcesses.values(), [pageID](auto* process) {
+        return process->hasServiceWorkerPageProxy(pageID);
+    });
 #endif
     return false;
 }

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2019-09-09 17:02:14 UTC (rev 249647)
@@ -38,7 +38,6 @@
 #include "PlugInAutoStartProvider.h"
 #include "PluginInfoStore.h"
 #include "ProcessThrottler.h"
-#include "ServiceWorkerProcessProxy.h"
 #include "StatisticsRequest.h"
 #include "VisitedLinkStore.h"
 #include "WebContextClient.h"
@@ -100,7 +99,6 @@
 class HighPerformanceGraphicsUsageSampler;
 class UIGamepad;
 class PerActivityStateCPUUsageSampler;
-class ServiceWorkerProcessProxy;
 class SuspendedPageProxy;
 class WebAutomationSession;
 class WebContextSupplement;
@@ -382,7 +380,7 @@
     bool isServiceWorkerPageID(WebPageProxyIdentifier) const;
 #if ENABLE(SERVICE_WORKER)
     void establishWorkerContextConnectionToNetworkProcess(NetworkProcessProxy&, WebCore::RegistrableDomain&&, Optional<PAL::SessionID>);
-    const HashMap<WebCore::RegistrableDomain, ServiceWorkerProcessProxy*>& serviceWorkerProxies() const { return m_serviceWorkerProcesses; }
+    const HashMap<WebCore::RegistrableDomain, WebProcessProxy*>& serviceWorkerProxies() const { return m_serviceWorkerProcesses; }
     void setAllowsAnySSLCertificateForServiceWorker(bool allows) { m_allowsAnySSLCertificateForServiceWorker = allows; }
     bool allowsAnySSLCertificateForServiceWorker() const { return m_allowsAnySSLCertificateForServiceWorker; }
     void updateServiceWorkerUserAgent(const String& userAgent);
@@ -620,7 +618,7 @@
 
     WebProcessProxy* m_processWithPageCache { nullptr };
 #if ENABLE(SERVICE_WORKER)
-    HashMap<WebCore::RegistrableDomain, ServiceWorkerProcessProxy*> m_serviceWorkerProcesses;
+    HashMap<WebCore::RegistrableDomain, WebProcessProxy*> m_serviceWorkerProcesses;
     bool m_waitingForWorkerContextProcessConnection { false };
     bool m_allowsAnySSLCertificateForServiceWorker { false };
     bool m_shouldDisableServiceWorkerProcessTerminationDelay { false };

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp	2019-09-09 17:02:14 UTC (rev 249647)
@@ -49,6 +49,7 @@
 #include "WebProcessMessages.h"
 #include "WebProcessPool.h"
 #include "WebProcessProxyMessages.h"
+#include "WebSWContextManagerConnectionMessages.h"
 #include "WebUserContentControllerProxy.h"
 #include "WebsiteData.h"
 #include "WebsiteDataFetchOption.h"
@@ -133,6 +134,15 @@
     return proxy;
 }
 
+Ref<WebProcessProxy> WebProcessProxy::createForServiceWorkers(WebProcessPool& processPool, RegistrableDomain&& registrableDomain, WebsiteDataStore& websiteDataStore)
+{
+    auto proxy = adoptRef(*new WebProcessProxy(processPool, &websiteDataStore, IsPrewarmed::No));
+    proxy->m_registrableDomain = WTFMove(registrableDomain);
+    proxy->m_serviceWorkerInformation = ServiceWorkerInformation { WebPageProxyIdentifier::generate(), PageIdentifier::generate() };
+    proxy->connect();
+    return proxy;
+}
+
 WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore* websiteDataStore, IsPrewarmed isPrewarmed)
     : AuxiliaryProcessProxy(processPool.alwaysRunsAtBackgroundPriority())
     , m_responsivenessTimer(*this)
@@ -277,6 +287,11 @@
         processPool().setShouldMakeNextWebProcessLaunchFailForTesting(false);
         launchOptions.shouldMakeProcessLaunchFailForTesting = true;
     }
+
+    if (m_serviceWorkerInformation) {
+        launchOptions.extraInitializationData.add("service-worker-process"_s, "1"_s);
+        launchOptions.extraInitializationData.add("registrable-domain"_s, m_registrableDomain->string());
+    }
 }
 
 #if !PLATFORM(GTK) && !PLATFORM(WPE)
@@ -751,9 +766,9 @@
     for (auto& callback : isResponsiveCallbacks)
         callback(isWebProcessResponsive);
 
-    // If the service worker process becomes unresponsive, kill it ourselves since there are no native clients to do it.
-    if (isServiceWorkerProcess()) {
-        RELEASE_LOG_ERROR(PerformanceLogging, "%p - WebProcessProxy::didBecomeUnresponsive() Terminating Service Worker process with pid %d because it is unresponsive", this, processIdentifier());
+    // If the web process becomes unresponsive and only runs service workers, kill it ourselves since there are no native clients to do it.
+    if (isRunningServiceWorkers() && m_pageMap.isEmpty()) {
+        RELEASE_LOG_ERROR(PerformanceLogging, "%p - WebProcessProxy::didBecomeUnresponsive() Terminating service worker-only web process with pid %d because it is unresponsive", this, processIdentifier());
         terminate();
     }
 }
@@ -886,7 +901,7 @@
 
 bool WebProcessProxy::canBeAddedToWebProcessCache() const
 {
-    if (isServiceWorkerProcess())
+    if (isRunningServiceWorkers())
         return false;
 
     if (WebKit::isInspectorProcessPool(processPool()))
@@ -1202,7 +1217,7 @@
 void WebProcessProxy::didSetAssertionState(AssertionState state)
 {
 #if PLATFORM(IOS_FAMILY)
-    if (isServiceWorkerProcess())
+    if (isRunningServiceWorkers())
         return;
 
     ASSERT(!m_backgroundToken || !m_foregroundToken);
@@ -1378,10 +1393,7 @@
     if (hasVisiblePage)
         return;
 
-    if (isServiceWorkerProcess())
-        RELEASE_LOG_ERROR(PerformanceLogging, "%p - WebProcessProxy::didExceedCPULimit() Terminating Service Worker process with pid %d that has exceeded the background CPU limit", this, processIdentifier());
-    else
-        RELEASE_LOG_ERROR(PerformanceLogging, "%p - WebProcessProxy::didExceedCPULimit() Terminating background WebProcess with pid %d that has exceeded the background CPU limit", this, processIdentifier());
+    RELEASE_LOG_ERROR(PerformanceLogging, "%p - WebProcessProxy::didExceedCPULimit() Terminating background WebProcess with pid %d that has exceeded the background CPU limit", this, processIdentifier());
     logDiagnosticMessageForResourceLimitTermination(DiagnosticLoggingKeys::exceededBackgroundCPULimitKey());
     requestTermination(ProcessTerminationReason::ExceededCPULimit);
 }
@@ -1480,6 +1492,25 @@
 
 #endif
 
+#if ENABLE(SERVICE_WORKER)
+void WebProcessProxy::establishServiceWorkerContext(const WebPreferencesStore& store, PAL::SessionID sessionID)
+{
+    send(Messages::WebProcess::EstablishWorkerContextConnectionToNetworkProcess { processPool().defaultPageGroup().pageGroupID(), m_serviceWorkerInformation->serviceWorkerPageProxyID, m_serviceWorkerInformation->serviceWorkerPageID, store, sessionID }, 0);
+}
+
+void WebProcessProxy::setServiceWorkerUserAgent(const String& userAgent)
+{
+    ASSERT(m_serviceWorkerInformation);
+    send(Messages::WebSWContextManagerConnection::SetUserAgent { userAgent }, 0);
+}
+
+void WebProcessProxy::updateServiceWorkerPreferencesStore(const WebPreferencesStore& store)
+{
+    ASSERT(m_serviceWorkerInformation);
+    send(Messages::WebSWContextManagerConnection::UpdatePreferencesStore { store }, 0);
+}
+#endif
+
 } // namespace WebKit
 
 #undef MESSAGE_CHECK

Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.h (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.h	2019-09-09 17:02:14 UTC (rev 249647)
@@ -82,6 +82,7 @@
 enum class WebsiteDataType;
 struct WebNavigationDataStore;
 struct WebPageCreationParameters;
+struct WebPreferencesStore;
 struct WebsiteData;
 
 #if PLATFORM(IOS_FAMILY)
@@ -109,6 +110,8 @@
     enum class ShouldLaunchProcess : bool { No, Yes };
 
     static Ref<WebProcessProxy> create(WebProcessPool&, WebsiteDataStore*, IsPrewarmed, ShouldLaunchProcess = ShouldLaunchProcess::Yes);
+    static Ref<WebProcessProxy> createForServiceWorkers(WebProcessPool&, WebCore::RegistrableDomain&&, WebsiteDataStore&);
+
     ~WebProcessProxy();
 
     static void forWebPagesWithOrigin(PAL::SessionID, const WebCore::SecurityOriginData&, const Function<void(WebPageProxy&)>&);
@@ -149,7 +152,7 @@
 
     void activePagesDomainsForTesting(CompletionHandler<void(Vector<String>&&)>&&); // This is what is reported to ActivityMonitor.
 
-    virtual bool isServiceWorkerProcess() const { return false; }
+    bool isRunningServiceWorkers() const { return !!m_serviceWorkerInformation; }
 
     void didCreateWebPageInProcess(WebCore::PageIdentifier);
 
@@ -309,6 +312,14 @@
     void ref() final { ThreadSafeRefCounted::ref(); }
     void deref() final { ThreadSafeRefCounted::deref(); }
 
+#if ENABLE(SERVICE_WORKER)
+    void establishServiceWorkerContext(const WebPreferencesStore&, PAL::SessionID);
+    void startForServiceWorkers(const WebPreferencesStore&, PAL::SessionID);
+    void setServiceWorkerUserAgent(const String&);
+    void updateServiceWorkerPreferencesStore(const WebPreferencesStore&);
+    bool hasServiceWorkerPageProxy(WebPageProxyIdentifier pageProxyID) { return m_serviceWorkerInformation && m_serviceWorkerInformation->serviceWorkerPageProxyID == pageProxyID; }
+#endif
+
 protected:
     WebProcessProxy(WebProcessPool&, WebsiteDataStore*, IsPrewarmed);
 
@@ -476,6 +487,12 @@
 #if PLATFORM(COCOA)
     MediaCaptureSandboxExtensions m_mediaCaptureSandboxExtensions { SandboxExtensionType::None };
 #endif
+
+    struct ServiceWorkerInformation {
+        WebPageProxyIdentifier serviceWorkerPageProxyID;
+        WebCore::PageIdentifier serviceWorkerPageID;
+    };
+    Optional<ServiceWorkerInformation> m_serviceWorkerInformation;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp (249646 => 249647)


--- trunk/Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/UIProcess/glib/WebProcessPoolGLib.cpp	2019-09-09 17:02:14 UTC (rev 249647)
@@ -103,7 +103,7 @@
 void WebProcessPool::platformInitializeWebProcess(const WebProcessProxy& process, WebProcessCreationParameters& parameters)
 {
 #if PLATFORM(WPE)
-    parameters.isServiceWorkerProcess = process.isServiceWorkerProcess();
+    parameters.isServiceWorkerProcess = process.isRunningServiceWorkers();
 
     if (!parameters.isServiceWorkerProcess) {
         parameters.hostClientFileDescriptor = wpe_renderer_host_create_client();

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (249646 => 249647)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-09-09 15:35:48 UTC (rev 249646)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2019-09-09 17:02:14 UTC (rev 249647)
@@ -879,7 +879,6 @@
 		4143751C20EAEA2D00FAD06C /* cn.microdone.cmb.safari.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 4143751B20EAEA1E00FAD06C /* cn.microdone.cmb.safari.sb */; };
 		414DD37920BF43F5006959FB /* com.cisco.webex.plugin.gpc64.sb in Resources */ = {isa = PBXBuildFile; fileRef = 414DD37820BF43EA006959FB /* com.cisco.webex.plugin.gpc64.sb */; };
 		414DD37A20BF49A5006959FB /* com.cisco.webex.plugin.gpc64.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 414DD37820BF43EA006959FB /* com.cisco.webex.plugin.gpc64.sb */; };
-		414DEDD71F9EDDE50047C40D /* ServiceWorkerProcessProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 414DEDD51F9EDDDF0047C40D /* ServiceWorkerProcessProxy.h */; };
 		4157E4B020E2ECDF00A6C0D7 /* com.google.o1dbrowserplugin.sb in Copy Plug-in Sandbox Profiles */ = {isa = PBXBuildFile; fileRef = 4157E4AF20E2EC9800A6C0D7 /* com.google.o1dbrowserplugin.sb */; };
 		4176901422FDD41B00B1576D /* NetworkRTCProvider.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4176901322FDD41B00B1576D /* NetworkRTCProvider.mm */; };
 		417915AF2256BB7500D6F97E /* WebSocketChannel.h in Headers */ = {isa = PBXBuildFile; fileRef = 417915AD2256BB7400D6F97E /* WebSocketChannel.h */; };
@@ -3137,8 +3136,6 @@
 		413CCD4F20DEBC2F0065A21A /* com.google.googletalkbrowserplugin.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.google.googletalkbrowserplugin.sb; sourceTree = "<group>"; };
 		4143751B20EAEA1E00FAD06C /* cn.microdone.cmb.safari.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = cn.microdone.cmb.safari.sb; sourceTree = "<group>"; };
 		414DD37820BF43EA006959FB /* com.cisco.webex.plugin.gpc64.sb */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = com.cisco.webex.plugin.gpc64.sb; sourceTree = "<group>"; };
-		414DEDD51F9EDDDF0047C40D /* ServiceWorkerProcessProxy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerProcessProxy.h; sourceTree = "<group>"; };
-		414DEDD61F9EDDE00047C40D /* ServiceWorkerProcessProxy.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerProcessProxy.cpp; sourceTree = "<group>"; };
 		41518535222704F5005430C6 /* ServiceWorkerFetchTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerFetchTask.h; sourceTree = "<group>"; };
 		41518536222704F6005430C6 /* ServiceWorkerFetchTask.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerFetchTask.cpp; sourceTree = "<group>"; };
 		4151853822270F53005430C6 /* ServiceWorkerFetchTask.messages.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ServiceWorkerFetchTask.messages.in; sourceTree = "<group>"; };
@@ -7777,8 +7774,6 @@
 				BC111B08112F5E3C00337BAB /* ResponsivenessTimer.cpp */,
 				1A30066C1110F4F70031937C /* ResponsivenessTimer.h */,
 				5CA98549210BEB5A0057EB6B /* SafeBrowsingWarning.h */,
-				414DEDD61F9EDDE00047C40D /* ServiceWorkerProcessProxy.cpp */,
-				414DEDD51F9EDDDF0047C40D /* ServiceWorkerProcessProxy.h */,
 				51A4D5A816CAC4FF000E615E /* StatisticsRequest.cpp */,
 				514BDED216C98EDD00E4E25E /* StatisticsRequest.h */,
 				515C415A207D74E000726E02 /* SuspendedPageProxy.cpp */,
@@ -9746,7 +9741,6 @@
 				E18E6918169B667B009B6670 /* SecItemShimProxyMessages.h in Headers */,
 				570AB8F320AE3BD700B8BE87 /* SecKeyProxyStore.h in Headers */,
 				514D9F5719119D35000063A7 /* ServicesController.h in Headers */,
-				414DEDD71F9EDDE50047C40D /* ServiceWorkerProcessProxy.h in Headers */,
 				1AFDE65A1954A42B00C48FFA /* SessionState.h in Headers */,
 				1A002D49196B345D00B9AD44 /* SessionStateCoding.h in Headers */,
 				46BEB6DF22FBB16B00269867 /* SessionStorageNamespace.h in Headers */,
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to