Title: [225716] trunk
Revision
225716
Author
[email protected]
Date
2017-12-08 17:05:58 -0800 (Fri, 08 Dec 2017)

Log Message

Service Worker should use a correct user agent
https://bugs.webkit.org/show_bug.cgi?id=180566
<rdar://problem/35926295>

Patch by Youenn Fablet <[email protected]> on 2017-12-08
Reviewed by Chris Dumez.

Source/WebCore:

Test: http/wpt/service-workers/useragent.https.html

Make ServiceWorkerFrameLoaderClient return a valid UserAgent.
Pass user agent to ServiceWorkerThread so that navigation.userAgent is correctly initialized.
Allow ServiceWorkerFrameLoaderClient to clean itself when no longer needed.

* loader/EmptyFrameLoaderClient.h:
* workers/service/context/ServiceWorkerThread.cpp:
(WebCore::ServiceWorkerThread::ServiceWorkerThread):
* workers/service/context/ServiceWorkerThread.h:
* workers/service/context/ServiceWorkerThreadProxy.cpp:
(WebCore::ServiceWorkerThreadProxy::ServiceWorkerThreadProxy):
(WebCore::ServiceWorkerThreadProxy::frameLoaderClient):
* workers/service/context/ServiceWorkerThreadProxy.h:

Source/WebKit:

Add support to set service worker user agent from UIProcess to service worker process.
One user agent is currently supported per service worker process and it can be changed at any given time.
Only new service worker will use the new value.
Once a service worker is launched, it will stay with the same user agent value.

This sets both navigator.userAgent and User-Agent header name used for fetch within a service worker.
Compute the service worker process user agent by picking the last user agent set for a web page.

* UIProcess/ServiceWorkerProcessProxy.cpp:
(WebKit::ServiceWorkerProcessProxy::start):
(WebKit::ServiceWorkerProcessProxy::setUserAgent):
* UIProcess/ServiceWorkerProcessProxy.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::setApplicationNameForUserAgent):
* UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess):
(WebKit::WebProcessPool::createWebPage):
(WebKit::WebProcessPool::updateServiceWorkerUserAgent):
* UIProcess/WebProcessPool.h:
* WebProcess/Storage/WebSWContextManagerConnection.cpp:
(WebKit::WebSWContextManagerConnection::installServiceWorker):
(WebKit::WebSWContextManagerConnection::setUserAgent):
(WebKit::WebSWContextManagerConnection::removeFrameLoaderClient):
* WebProcess/Storage/WebSWContextManagerConnection.h:
* WebProcess/Storage/WebSWContextManagerConnection.messages.in:

LayoutTests:

* http/wpt/service-workers/useragent-worker.js: Added.
(async.doTest):
* http/wpt/service-workers/useragent.https-expected.txt: Added.
* http/wpt/service-workers/useragent.https.html: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (225715 => 225716)


--- trunk/LayoutTests/ChangeLog	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/LayoutTests/ChangeLog	2017-12-09 01:05:58 UTC (rev 225716)
@@ -1,3 +1,16 @@
+2017-12-08  Youenn Fablet  <[email protected]>
+
+        Service Worker should use a correct user agent
+        https://bugs.webkit.org/show_bug.cgi?id=180566
+        <rdar://problem/35926295>
+
+        Reviewed by Chris Dumez.
+
+        * http/wpt/service-workers/useragent-worker.js: Added.
+        (async.doTest):
+        * http/wpt/service-workers/useragent.https-expected.txt: Added.
+        * http/wpt/service-workers/useragent.https.html: Added.
+
 2017-12-07  Simon Fraser  <[email protected]>
 
         Wrong caret position for input field inside a fixed position parent on iOS 11

Added: trunk/LayoutTests/http/wpt/service-workers/useragent-worker.js (0 => 225716)


--- trunk/LayoutTests/http/wpt/service-workers/useragent-worker.js	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/useragent-worker.js	2017-12-09 01:05:58 UTC (rev 225716)
@@ -0,0 +1,25 @@
+_onactivate_ = (e) => e.waitUntil(clients.claim());
+
+async function doTest(event)
+{
+    if (!event.data.startsWith("USERAGENT")) {
+        event.source.postMessage("FAIL: received unexpected message from client");
+        return;
+    }
+
+    if (event.data ="" "USERAGENT-NAVIGATOR") {
+        event.source.postMessage(navigator.userAgent);
+        return;
+    }
+
+    if (event.data ="" "USERAGENT-FETCH") {
+        var response = await fetch("/fetch/api/resources/inspect-headers.py?headers=User-Agent")
+        event.source.postMessage(response.headers.get("x-request-user-agent"));
+        return;
+    }
+
+    event.source.postMessage("FAIL: Unknown test");
+}
+
+
+self.addEventListener("message", doTest);

Added: trunk/LayoutTests/http/wpt/service-workers/useragent.https-expected.txt (0 => 225716)


--- trunk/LayoutTests/http/wpt/service-workers/useragent.https-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/useragent.https-expected.txt	2017-12-09 01:05:58 UTC (rev 225716)
@@ -0,0 +1,5 @@
+
+PASS Setup worker 
+PASS Test service worker navigator.userAgent 
+PASS Test service worker User-Agent header 
+

Added: trunk/LayoutTests/http/wpt/service-workers/useragent.https.html (0 => 225716)


--- trunk/LayoutTests/http/wpt/service-workers/useragent.https.html	                        (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/useragent.https.html	2017-12-09 01:05:58 UTC (rev 225716)
@@ -0,0 +1,60 @@
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+<script>
+var scope = "/WebKit/service-workers/useragent.https.html";
+var activeWorker;
+var userAgent;
+
+promise_test(async (test) => {
+    var registration = await navigator.serviceWorker.getRegistration(scope);
+    if (registration && registration.scope === scope)
+        await registration.unregister();
+
+    var response = await fetch("/fetch/api/resources/inspect-headers.py?headers=User-Agent")
+    userAgent = response.headers.get("x-request-user-agent");
+
+    var registration = await navigator.serviceWorker.register("useragent-worker.js", { scope : scope });
+    activeWorker = registration.active;
+    if (activeWorker)
+        return;
+    activeWorker = registration.installing;
+    return new Promise(resolve => {
+        activeWorker.addEventListener('statechange', () => {
+            if (activeWorker.state === "activated")
+                resolve();
+        });
+    });
+}, "Setup worker");
+
+promise_test(async (test) => {
+    var promise = new Promise((resolve, reject) => {
+        navigator.serviceWorker.addEventListener("message", (event) => {
+            resolve(event.data);
+        });
+    });
+
+    activeWorker.postMessage("USERAGENT-NAVIGATOR");
+    var serviceWorkerUserAgent = await promise;
+
+    assert_equals(serviceWorkerUserAgent, navigator.userAgent);
+}, "Test service worker navigator.userAgent");
+
+promise_test(async (test) => {
+    var promise = new Promise((resolve, reject) => {
+        navigator.serviceWorker.addEventListener("message", (event) => {
+            resolve(event.data);
+        });
+    });
+
+    activeWorker.postMessage("USERAGENT-FETCH");
+    var serviceWorkerUserAgent = await promise;
+
+    assert_equals(serviceWorkerUserAgent, userAgent);
+}, "Test service worker User-Agent header");
+</script>
+</body>
+</html>

Modified: trunk/Source/WebCore/ChangeLog (225715 => 225716)


--- trunk/Source/WebCore/ChangeLog	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/ChangeLog	2017-12-09 01:05:58 UTC (rev 225716)
@@ -1,3 +1,26 @@
+2017-12-08  Youenn Fablet  <[email protected]>
+
+        Service Worker should use a correct user agent
+        https://bugs.webkit.org/show_bug.cgi?id=180566
+        <rdar://problem/35926295>
+
+        Reviewed by Chris Dumez.
+
+        Test: http/wpt/service-workers/useragent.https.html
+
+        Make ServiceWorkerFrameLoaderClient return a valid UserAgent.
+        Pass user agent to ServiceWorkerThread so that navigation.userAgent is correctly initialized.
+        Allow ServiceWorkerFrameLoaderClient to clean itself when no longer needed.
+
+        * loader/EmptyFrameLoaderClient.h:
+        * workers/service/context/ServiceWorkerThread.cpp:
+        (WebCore::ServiceWorkerThread::ServiceWorkerThread):
+        * workers/service/context/ServiceWorkerThread.h:
+        * workers/service/context/ServiceWorkerThreadProxy.cpp:
+        (WebCore::ServiceWorkerThreadProxy::ServiceWorkerThreadProxy):
+        (WebCore::ServiceWorkerThreadProxy::frameLoaderClient):
+        * workers/service/context/ServiceWorkerThreadProxy.h:
+
 2017-12-07  Simon Fraser  <[email protected]>
 
         Wrong caret position for input field inside a fixed position parent on iOS 11

Modified: trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h (225715 => 225716)


--- trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h	2017-12-09 01:05:58 UTC (rev 225716)
@@ -30,7 +30,7 @@
 class WEBCORE_EXPORT EmptyFrameLoaderClient : public FrameLoaderClient {
     Ref<DocumentLoader> createDocumentLoader(const ResourceRequest&, const SubstituteData&) override;
 
-    void frameLoaderDestroyed() final { }
+    void frameLoaderDestroyed() override { }
 
     uint64_t frameID() const override { return 0; }
     uint64_t pageID() const override { return 0; }
@@ -149,7 +149,7 @@
     void updateCachedDocumentLoader(DocumentLoader&) final { }
     void setTitle(const StringWithDirection&, const URL&) final { }
 
-    String userAgent(const URL&) final { return emptyString(); }
+    String userAgent(const URL&) override { return emptyString(); }
 
     void savePlatformDataToCachedFrame(CachedFrame*) final { }
     void transitionToCommittedFromCachedFrame(CachedFrame*) final { }

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp (225715 => 225716)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp	2017-12-09 01:05:58 UTC (rev 225716)
@@ -67,12 +67,11 @@
 
 // FIXME: Use a valid WorkerReportingProxy
 // FIXME: Use a valid WorkerObjectProxy
-// FIXME: Use a valid user agent
 // FIXME: Use a valid isOnline flag
 // FIXME: Use valid runtime flags
 
-ServiceWorkerThread::ServiceWorkerThread(const ServiceWorkerContextData& data, PAL::SessionID, WorkerLoaderProxy& loaderProxy, WorkerDebuggerProxy& debuggerProxy, IDBClient::IDBConnectionProxy* idbConnectionProxy, SocketProvider* socketProvider)
-    : WorkerThread(data.scriptURL, "serviceworker:" + Inspector::IdentifiersFactory::createIdentifier(), ASCIILiteral("WorkerUserAgent"), /* isOnline */ false, data.script, loaderProxy, debuggerProxy, DummyServiceWorkerThreadProxy::shared(), WorkerThreadStartMode::Normal, ContentSecurityPolicyResponseHeaders { }, false, SecurityOrigin::create(data.scriptURL).get(), MonotonicTime::now(), idbConnectionProxy, socketProvider, JSC::RuntimeFlags::createAllEnabled(), SessionID::defaultSessionID())
+ServiceWorkerThread::ServiceWorkerThread(const ServiceWorkerContextData& data, PAL::SessionID, String&& userAgent, WorkerLoaderProxy& loaderProxy, WorkerDebuggerProxy& debuggerProxy, IDBClient::IDBConnectionProxy* idbConnectionProxy, SocketProvider* socketProvider)
+    : WorkerThread(data.scriptURL, "serviceworker:" + Inspector::IdentifiersFactory::createIdentifier(), WTFMove(userAgent), /* isOnline */ false, data.script, loaderProxy, debuggerProxy, DummyServiceWorkerThreadProxy::shared(), WorkerThreadStartMode::Normal, ContentSecurityPolicyResponseHeaders { }, false, SecurityOrigin::create(data.scriptURL).get(), MonotonicTime::now(), idbConnectionProxy, socketProvider, JSC::RuntimeFlags::createAllEnabled(), SessionID::defaultSessionID())
     , m_data(data.isolatedCopy())
     , m_workerObjectProxy(DummyServiceWorkerThreadProxy::shared())
 {

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h (225715 => 225716)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h	2017-12-09 01:05:58 UTC (rev 225716)
@@ -73,7 +73,7 @@
     void runEventLoop() override;
 
 private:
-    WEBCORE_EXPORT ServiceWorkerThread(const ServiceWorkerContextData&, PAL::SessionID, WorkerLoaderProxy&, WorkerDebuggerProxy&, IDBClient::IDBConnectionProxy*, SocketProvider*);
+    WEBCORE_EXPORT ServiceWorkerThread(const ServiceWorkerContextData&, PAL::SessionID, String&& userAgent, WorkerLoaderProxy&, WorkerDebuggerProxy&, IDBClient::IDBConnectionProxy*, SocketProvider*);
 
     ServiceWorkerContextData m_data;
     WorkerObjectProxy& m_workerObjectProxy;

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp (225715 => 225716)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp	2017-12-09 01:05:58 UTC (rev 225716)
@@ -56,10 +56,10 @@
 #endif
 }
 
-ServiceWorkerThreadProxy::ServiceWorkerThreadProxy(PageConfiguration&& pageConfiguration, const ServiceWorkerContextData& data, PAL::SessionID sessionID, CacheStorageProvider& cacheStorageProvider)
+ServiceWorkerThreadProxy::ServiceWorkerThreadProxy(PageConfiguration&& pageConfiguration, const ServiceWorkerContextData& data, PAL::SessionID sessionID, String&& userAgent, CacheStorageProvider& cacheStorageProvider)
     : m_page(createPageForServiceWorker(WTFMove(pageConfiguration), data.scriptURL))
     , m_document(*m_page->mainFrame().document())
-    , m_serviceWorkerThread(ServiceWorkerThread::create(data, sessionID, *this, *this, idbConnectionProxy(m_document), m_document->socketProvider()))
+    , m_serviceWorkerThread(ServiceWorkerThread::create(data, sessionID, WTFMove(userAgent), *this, *this, idbConnectionProxy(m_document), m_document->socketProvider()))
     , m_cacheStorageProvider(cacheStorageProvider)
     , m_sessionID(sessionID)
     , m_inspectorProxy(*this)

Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h (225715 => 225716)


--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h	2017-12-09 01:05:58 UTC (rev 225716)
@@ -60,7 +60,7 @@
     void setTerminatingOrTerminated(bool terminating) { m_isTerminatingOrTerminated = terminating; }
 
 private:
-    WEBCORE_EXPORT ServiceWorkerThreadProxy(PageConfiguration&&, const ServiceWorkerContextData&, PAL::SessionID, CacheStorageProvider&);
+    WEBCORE_EXPORT ServiceWorkerThreadProxy(PageConfiguration&&, const ServiceWorkerContextData&, PAL::SessionID, String&& userAgent, CacheStorageProvider&);
 
     // WorkerLoaderProxy
     bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task&&, const String& mode) final;

Modified: trunk/Source/WebKit/ChangeLog (225715 => 225716)


--- trunk/Source/WebKit/ChangeLog	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/ChangeLog	2017-12-09 01:05:58 UTC (rev 225716)
@@ -1,3 +1,37 @@
+2017-12-08  Youenn Fablet  <[email protected]>
+
+        Service Worker should use a correct user agent
+        https://bugs.webkit.org/show_bug.cgi?id=180566
+        <rdar://problem/35926295>
+
+        Reviewed by Chris Dumez.
+
+        Add support to set service worker user agent from UIProcess to service worker process.
+        One user agent is currently supported per service worker process and it can be changed at any given time.
+        Only new service worker will use the new value.
+        Once a service worker is launched, it will stay with the same user agent value.
+
+        This sets both navigator.userAgent and User-Agent header name used for fetch within a service worker.
+        Compute the service worker process user agent by picking the last user agent set for a web page.
+
+        * UIProcess/ServiceWorkerProcessProxy.cpp:
+        (WebKit::ServiceWorkerProcessProxy::start):
+        (WebKit::ServiceWorkerProcessProxy::setUserAgent):
+        * UIProcess/ServiceWorkerProcessProxy.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::setApplicationNameForUserAgent):
+        * UIProcess/WebProcessPool.cpp:
+        (WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess):
+        (WebKit::WebProcessPool::createWebPage):
+        (WebKit::WebProcessPool::updateServiceWorkerUserAgent):
+        * UIProcess/WebProcessPool.h:
+        * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+        (WebKit::WebSWContextManagerConnection::installServiceWorker):
+        (WebKit::WebSWContextManagerConnection::setUserAgent):
+        (WebKit::WebSWContextManagerConnection::removeFrameLoaderClient):
+        * WebProcess/Storage/WebSWContextManagerConnection.h:
+        * WebProcess/Storage/WebSWContextManagerConnection.messages.in:
+
 2017-12-07  Simon Fraser  <[email protected]>
 
         Wrong caret position for input field inside a fixed position parent on iOS 11

Modified: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp (225715 => 225716)


--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp	2017-12-09 01:05:58 UTC (rev 225716)
@@ -31,6 +31,7 @@
 #include "WebPreferencesStore.h"
 #include "WebProcessMessages.h"
 #include "WebProcessPool.h"
+#include "WebSWContextManagerConnectionMessages.h"
 #include <WebCore/NotImplemented.h>
 
 namespace WebKit {
@@ -61,9 +62,14 @@
 
 void ServiceWorkerProcessProxy::start(const WebPreferencesStore& store)
 {
-    send(Messages::WebProcess::EstablishWorkerContextConnectionToStorageProcess(m_serviceWorkerPageID, store), 0);
+    send(Messages::WebProcess::EstablishWorkerContextConnectionToStorageProcess { m_serviceWorkerPageID, store }, 0);
 }
 
+void ServiceWorkerProcessProxy::setUserAgent(const String& userAgent)
+{
+    send(Messages::WebSWContextManagerConnection::SetUserAgent { userAgent }, 0);
+}
+
 void ServiceWorkerProcessProxy::didReceiveAuthenticationChallenge(uint64_t pageID, uint64_t frameID, Ref<AuthenticationChallengeProxy>&& challenge)
 {
     UNUSED_PARAM(pageID);

Modified: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h (225715 => 225716)


--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h	2017-12-09 01:05:58 UTC (rev 225716)
@@ -39,6 +39,8 @@
     void didReceiveAuthenticationChallenge(uint64_t pageID, uint64_t frameID, Ref<AuthenticationChallengeProxy>&&);
 
     void start(const WebPreferencesStore&);
+    void setUserAgent(const String&);
+
     uint64_t pageID() const { return m_serviceWorkerPageID; }
 
 private:

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (225715 => 225716)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2017-12-09 01:05:58 UTC (rev 225716)
@@ -2330,12 +2330,18 @@
     m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID, websitePolicies), m_pageID);
 }
 
-void WebPageProxy::setUserAgent(const String& userAgent)
+void WebPageProxy::setUserAgent(String&& userAgent)
 {
     if (m_userAgent == userAgent)
         return;
-    m_userAgent = userAgent;
+    m_userAgent = WTFMove(userAgent);
 
+#if ENABLE(SERVICE_WORKER)
+    // We update the service worker there at the moment to be sure we use values used by actual web pages.
+    // FIXME: Refactor this when we have a better User-Agent story.
+    process().processPool().updateServiceWorkerUserAgent(m_userAgent);
+#endif
+
     if (!isValid())
         return;
     m_process->send(Messages::WebPage::SetUserAgent(m_userAgent), m_pageID);
@@ -2365,7 +2371,7 @@
         return;
     }
 
-    setUserAgent(m_customUserAgent);
+    setUserAgent(String { m_customUserAgent });
 }
 
 void WebPageProxy::resumeActiveDOMObjectsAndAnimations()

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (225715 => 225716)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2017-12-09 01:05:58 UTC (rev 225716)
@@ -1268,7 +1268,7 @@
     void resetState(ResetStateReason);
     void resetStateAfterProcessExited();
 
-    void setUserAgent(const String&);
+    void setUserAgent(String&&);
 
     // IPC::MessageReceiver
     // Implemented in generated WebPageProxyMessageReceiver.cpp

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (225715 => 225716)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp	2017-12-09 01:05:58 UTC (rev 225716)
@@ -1011,6 +1011,17 @@
     return process->createWebPage(pageClient, WTFMove(pageConfiguration));
 }
 
+#if ENABLE(SERVICE_WORKER)
+void WebProcessPool::updateServiceWorkerUserAgent(const String& userAgent)
+{
+    if (m_serviceWorkerUserAgent == userAgent)
+        return;
+    m_serviceWorkerUserAgent = userAgent;
+    if (m_serviceWorkerProcess)
+        m_serviceWorkerProcess->setUserAgent(m_serviceWorkerUserAgent);
+}
+#endif
+
 void WebProcessPool::pageAddedToProcess(WebPageProxy& page)
 {
     auto result = m_sessionToPagesMap.add(page.sessionID(), HashSet<WebPageProxy*>()).iterator->value.add(&page);

Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (225715 => 225716)


--- trunk/Source/WebKit/UIProcess/WebProcessPool.h	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h	2017-12-09 01:05:58 UTC (rev 225716)
@@ -328,6 +328,7 @@
     ServiceWorkerProcessProxy* serviceWorkerProxy() const { return m_serviceWorkerProcess; }
     void setAllowsAnySSLCertificateForServiceWorker(bool allows) { m_allowsAnySSLCertificateForServiceWorker = allows; }
     bool allowsAnySSLCertificateForServiceWorker() const { return m_allowsAnySSLCertificateForServiceWorker; }
+    void updateServiceWorkerUserAgent(const String& userAgent);
 #endif
 
 #if PLATFORM(COCOA)
@@ -494,6 +495,7 @@
     ServiceWorkerProcessProxy* m_serviceWorkerProcess { nullptr };
     bool m_waitingForWorkerContextProcessConnection { false };
     bool m_allowsAnySSLCertificateForServiceWorker { false };
+    String m_serviceWorkerUserAgent;
 #endif
 
     Ref<WebPageGroup> m_defaultPageGroup;

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (225715 => 225716)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2017-12-09 01:05:58 UTC (rev 225716)
@@ -50,6 +50,7 @@
 #include <WebCore/SerializedScriptValue.h>
 #include <WebCore/ServiceWorkerClientData.h>
 #include <WebCore/ServiceWorkerClientIdentifier.h>
+#include <WebCore/UserAgent.h>
 #include <pal/SessionID.h>
 
 #if USE(QUICK_LOOK)
@@ -63,13 +64,17 @@
 
 class ServiceWorkerFrameLoaderClient final : public EmptyFrameLoaderClient {
 public:
-    ServiceWorkerFrameLoaderClient(PAL::SessionID sessionID, uint64_t pageID, uint64_t frameID)
-        : m_sessionID(sessionID)
+    ServiceWorkerFrameLoaderClient(WebSWContextManagerConnection& connection, PAL::SessionID sessionID, uint64_t pageID, uint64_t frameID, const String& userAgent)
+        : m_connection(connection)
+        , m_sessionID(sessionID)
         , m_pageID(pageID)
         , m_frameID(frameID)
+        , m_userAgent(userAgent)
     {
     }
 
+    void setUserAgent(String&& userAgent) { m_userAgent = WTFMove(userAgent); }
+
 private:
     Ref<DocumentLoader> createDocumentLoader(const ResourceRequest& request, const SubstituteData& substituteData) final
     {
@@ -76,22 +81,30 @@
         return WebDocumentLoader::create(request, substituteData);
     }
 
+    void frameLoaderDestroyed() final { m_connection.removeFrameLoaderClient(*this); }
+
     PAL::SessionID sessionID() const final { return m_sessionID; }
     uint64_t pageID() const final { return m_pageID; }
     uint64_t frameID() const final { return m_frameID; }
+    String userAgent(const URL&) final { return m_userAgent; }
 
+    WebSWContextManagerConnection& m_connection;
     PAL::SessionID m_sessionID;
     uint64_t m_pageID { 0 };
     uint64_t m_frameID { 0 };
+    String m_userAgent;
 };
 
 WebSWContextManagerConnection::WebSWContextManagerConnection(Ref<IPC::Connection>&& connection, uint64_t pageID, const WebPreferencesStore& store)
     : m_connectionToStorageProcess(WTFMove(connection))
     , m_pageID(pageID)
+    , m_userAgent(standardUserAgentWithApplicationName({ }))
 {
     updatePreferences(store);
 }
 
+WebSWContextManagerConnection::~WebSWContextManagerConnection() = default;
+
 void WebSWContextManagerConnection::updatePreferences(const WebPreferencesStore& store)
 {
     RuntimeEnabledFeatures::sharedFeatures().setServiceWorkerEnabled(true);
@@ -113,15 +126,27 @@
 
     // FIXME: This method should be moved directly to WebCore::SWContextManager::Connection
     // If it weren't for ServiceWorkerFrameLoaderClient's dependence on WebDocumentLoader, this could already happen.
-    auto frameLoaderClient = std::make_unique<ServiceWorkerFrameLoaderClient>(sessionID, m_pageID, ++m_previousServiceWorkerID);
-    pageConfiguration.loaderClientForMainFrame = frameLoaderClient.release();
+    auto frameLoaderClient = std::make_unique<ServiceWorkerFrameLoaderClient>(*this, sessionID, m_pageID, ++m_previousServiceWorkerID, m_userAgent);
+    pageConfiguration.loaderClientForMainFrame = frameLoaderClient.get();
+    m_loaders.add(WTFMove(frameLoaderClient));
 
-    auto serviceWorkerThreadProxy = ServiceWorkerThreadProxy::create(WTFMove(pageConfiguration), data, sessionID, WebProcess::singleton().cacheStorageProvider());
+    auto serviceWorkerThreadProxy = ServiceWorkerThreadProxy::create(WTFMove(pageConfiguration), data, sessionID, String { m_userAgent }, WebProcess::singleton().cacheStorageProvider());
     SWContextManager::singleton().registerServiceWorkerThreadForInstall(WTFMove(serviceWorkerThreadProxy));
 
     LOG(ServiceWorker, "Context process PID: %i created worker thread\n", getpid());
 }
 
+void WebSWContextManagerConnection::setUserAgent(String&& userAgent)
+{
+    m_userAgent = WTFMove(userAgent);
+}
+
+void WebSWContextManagerConnection::removeFrameLoaderClient(ServiceWorkerFrameLoaderClient& client)
+{
+    auto result = m_loaders.remove(&client);
+    ASSERT_UNUSED(result, result);
+}
+
 void WebSWContextManagerConnection::serviceWorkerStartedWithMessage(std::optional<ServiceWorkerJobDataIdentifier> jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, const String& exceptionMessage)
 {
     if (exceptionMessage.isEmpty())

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h (225715 => 225716)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h	2017-12-09 01:05:58 UTC (rev 225716)
@@ -46,15 +46,19 @@
 
 namespace WebKit {
 
+class ServiceWorkerFrameLoaderClient;
 struct WebPreferencesStore;
 
 class WebSWContextManagerConnection final : public WebCore::SWContextManager::Connection, public IPC::MessageReceiver {
 public:
     WebSWContextManagerConnection(Ref<IPC::Connection>&&, uint64_t pageID, const WebPreferencesStore&);
+    ~WebSWContextManagerConnection();
 
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
     void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
 
+    void removeFrameLoaderClient(ServiceWorkerFrameLoaderClient&);
+
 private:
     void updatePreferences(const WebPreferencesStore&);
 
@@ -83,16 +87,19 @@
     void matchAllCompleted(uint64_t matchAllRequestIdentifier, Vector<WebCore::ServiceWorkerClientInformation>&&);
     void claimCompleted(uint64_t claimRequestIdentifier);
     void didFinishSkipWaiting(uint64_t callbackID);
+    void setUserAgent(String&& userAgent);
 
     Ref<IPC::Connection> m_connectionToStorageProcess;
     uint64_t m_pageID { 0 };
     uint64_t m_previousServiceWorkerID { 0 };
 
+    HashSet<std::unique_ptr<ServiceWorkerFrameLoaderClient>> m_loaders;
     HashMap<uint64_t, FindClientByIdentifierCallback> m_findClientByIdentifierRequests;
     HashMap<uint64_t, WebCore::ServiceWorkerClientsMatchAllCallback> m_matchAllRequests;
     HashMap<uint64_t, WTF::CompletionHandler<void()>> m_claimRequests;
     HashMap<uint64_t, WTF::Function<void()>> m_skipWaitingRequests;
     uint64_t m_previousRequestIdentifier { 0 };
+    String m_userAgent;
 };
 
 } // namespace WebKit

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in (225715 => 225716)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in	2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in	2017-12-09 01:05:58 UTC (rev 225716)
@@ -35,6 +35,7 @@
     MatchAllCompleted(uint64_t matchAllRequestIdentifier, Vector<WebCore::ServiceWorkerClientInformation> clientsData)
     ClaimCompleted(uint64_t claimRequestIdentifier)
     DidFinishSkipWaiting(uint64_t callbackID)
+    SetUserAgent(String userAgent)
 }
 
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to