Title: [239534] trunk
Revision
239534
Author
cdu...@apple.com
Date
2018-12-21 19:23:08 -0800 (Fri, 21 Dec 2018)

Log Message

navigator.userAgent in service workers does not reflect customUserAgent set by client
https://bugs.webkit.org/show_bug.cgi?id=192951

Reviewed by Youenn Fablet.

Source/WebCore:

Whenever a service worker client registers itself, also pass its effective user agent.
In the network process, for each origin, we store the latest client's user agent and
use it when starting the service worker.

* dom/Document.cpp:
(WebCore::Document::setServiceWorkerConnection):
* loader/DocumentLoader.cpp:
(WebCore::DocumentLoader::registerTemporaryServiceWorkerClient):
* workers/service/SWClientConnection.h:
* workers/service/server/SWServer.cpp:
(WebCore::SWServer::serviceWorkerClientUserAgent const):
(WebCore::SWServer::installContextData):
(WebCore::SWServer::runServiceWorker):
(WebCore::SWServer::registerServiceWorkerClient):
* workers/service/server/SWServer.h:
* workers/service/server/SWServerToContextConnection.h:
* workers/service/server/SWServerWorker.cpp:
(WebCore::SWServerWorker::userAgent const):
* workers/service/server/SWServerWorker.h:

Source/WebKit:

* NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
(WebKit::WebSWServerConnection::registerServiceWorkerClient):
* NetworkProcess/ServiceWorker/WebSWServerConnection.h:
* NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in:
* NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
(WebKit::WebSWServerToContextConnection::installServiceWorkerContext):
* NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h:
* WebProcess/Storage/WebSWClientConnection.cpp:
(WebKit::WebSWClientConnection::registerServiceWorkerClient):
* WebProcess/Storage/WebSWClientConnection.h:
* WebProcess/Storage/WebSWContextManagerConnection.cpp:
(WebKit::WebSWContextManagerConnection::installServiceWorker):
* WebProcess/Storage/WebSWContextManagerConnection.h:
* WebProcess/Storage/WebSWContextManagerConnection.messages.in:

Tools:

Extend API test coverage.

* TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
(-[SWCustomUserAgentDelegate initWithUserAgent:]):
(-[SWCustomUserAgentDelegate _webView:decidePolicyForNavigationAction:userInfo:decisionHandler:]):
(-[SWUserAgentMessageHandler initWithExpectedMessage:]):
(-[SWUserAgentMessageHandler userContentController:didReceiveScriptMessage:]):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (239533 => 239534)


--- trunk/Source/WebCore/ChangeLog	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/ChangeLog	2018-12-22 03:23:08 UTC (rev 239534)
@@ -1,3 +1,30 @@
+2018-12-21  Chris Dumez  <cdu...@apple.com>
+
+        navigator.userAgent in service workers does not reflect customUserAgent set by client
+        https://bugs.webkit.org/show_bug.cgi?id=192951
+
+        Reviewed by Youenn Fablet.
+
+        Whenever a service worker client registers itself, also pass its effective user agent.
+        In the network process, for each origin, we store the latest client's user agent and
+        use it when starting the service worker.
+
+        * dom/Document.cpp:
+        (WebCore::Document::setServiceWorkerConnection):
+        * loader/DocumentLoader.cpp:
+        (WebCore::DocumentLoader::registerTemporaryServiceWorkerClient):
+        * workers/service/SWClientConnection.h:
+        * workers/service/server/SWServer.cpp:
+        (WebCore::SWServer::serviceWorkerClientUserAgent const):
+        (WebCore::SWServer::installContextData):
+        (WebCore::SWServer::runServiceWorker):
+        (WebCore::SWServer::registerServiceWorkerClient):
+        * workers/service/server/SWServer.h:
+        * workers/service/server/SWServerToContextConnection.h:
+        * workers/service/server/SWServerWorker.cpp:
+        (WebCore::SWServerWorker::userAgent const):
+        * workers/service/server/SWServerWorker.h:
+
 2018-12-21  Youenn Fablet  <you...@apple.com>
 
         RTCRtpSender.setParameters() does set active parameter

Modified: trunk/Source/WebCore/dom/Document.cpp (239533 => 239534)


--- trunk/Source/WebCore/dom/Document.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/dom/Document.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -8472,7 +8472,7 @@
         return;
 
     auto controllingServiceWorkerRegistrationIdentifier = activeServiceWorker() ? makeOptional<ServiceWorkerRegistrationIdentifier>(activeServiceWorker()->registrationIdentifier()) : WTF::nullopt;
-    m_serviceWorkerConnection->registerServiceWorkerClient(topOrigin(), ServiceWorkerClientData::from(*this, *serviceWorkerConnection), controllingServiceWorkerRegistrationIdentifier);
+    m_serviceWorkerConnection->registerServiceWorkerClient(topOrigin(), ServiceWorkerClientData::from(*this, *serviceWorkerConnection), controllingServiceWorkerRegistrationIdentifier, userAgent(url()));
 }
 #endif
 

Modified: trunk/Source/WebCore/loader/DocumentLoader.cpp (239533 => 239534)


--- trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/loader/DocumentLoader.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -1791,7 +1791,7 @@
         topOrigin = SecurityOrigin::create(url);
     else
         topOrigin = &m_frame->mainFrame().document()->topOrigin();
-    m_temporaryServiceWorkerClient->serviceWorkerConnection->registerServiceWorkerClient(*topOrigin, WTFMove(data), m_serviceWorkerRegistrationData->identifier);
+    m_temporaryServiceWorkerClient->serviceWorkerConnection->registerServiceWorkerClient(*topOrigin, WTFMove(data), m_serviceWorkerRegistrationData->identifier, m_frame->loader().userAgent(url));
 #else
     UNUSED_PARAM(url);
 #endif

Modified: trunk/Source/WebCore/workers/service/SWClientConnection.h (239533 => 239534)


--- trunk/Source/WebCore/workers/service/SWClientConnection.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/workers/service/SWClientConnection.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -80,7 +80,7 @@
     virtual bool mayHaveServiceWorkerRegisteredForOrigin(const SecurityOriginData&) const = 0;
     virtual void syncTerminateWorker(ServiceWorkerIdentifier) = 0;
 
-    virtual void registerServiceWorkerClient(const SecurityOrigin& topOrigin, const ServiceWorkerClientData&, const Optional<ServiceWorkerRegistrationIdentifier>&) = 0;
+    virtual void registerServiceWorkerClient(const SecurityOrigin& topOrigin, const ServiceWorkerClientData&, const Optional<ServiceWorkerRegistrationIdentifier>&, const String& userAgent) = 0;
     virtual void unregisterServiceWorkerClient(DocumentIdentifier) = 0;
 
     virtual void finishFetchingScriptInServer(const ServiceWorkerFetchResult&) = 0;

Modified: trunk/Source/WebCore/workers/service/server/SWServer.cpp (239533 => 239534)


--- trunk/Source/WebCore/workers/service/server/SWServer.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/workers/service/server/SWServer.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -92,6 +92,14 @@
     return clientIterator->value;
 }
 
+String SWServer::serviceWorkerClientUserAgent(const ClientOrigin& clientOrigin) const
+{
+    auto iterator = m_clientIdentifiersPerOrigin.find(clientOrigin);
+    if (iterator == m_clientIdentifiersPerOrigin.end())
+        return String();
+    return iterator->value.userAgent;
+}
+
 SWServerWorker* SWServer::activeWorkerFromRegistrationID(ServiceWorkerRegistrationIdentifier identifier)
 {
     auto* registration = m_registrationsByID.get(identifier);
@@ -548,10 +556,11 @@
 
     registration->setPreInstallationWorker(worker.ptr());
     worker->setState(SWServerWorker::State::Running);
+    auto userAgent = worker->userAgent();
     auto result = m_runningOrTerminatingWorkers.add(data.serviceWorkerIdentifier, WTFMove(worker));
     ASSERT_UNUSED(result, result.isNewEntry);
 
-    connection->installServiceWorkerContext(data, m_sessionID);
+    connection->installServiceWorkerContext(data, m_sessionID, userAgent);
 }
 
 void SWServer::runServiceWorkerIfNecessary(ServiceWorkerIdentifier identifier, RunServiceWorkerCallback&& callback)
@@ -602,7 +611,7 @@
     auto* contextConnection = worker->contextConnection();
     ASSERT(contextConnection);
 
-    contextConnection->installServiceWorkerContext(worker->contextData(), m_sessionID);
+    contextConnection->installServiceWorkerContext(worker->contextData(), m_sessionID, worker->userAgent());
 
     return true;
 }
@@ -731,7 +740,7 @@
     return m_registrations.get(iterator->value->registrationKey());
 }
 
-void SWServer::registerServiceWorkerClient(ClientOrigin&& clientOrigin, ServiceWorkerClientData&& data, const Optional<ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier)
+void SWServer::registerServiceWorkerClient(ClientOrigin&& clientOrigin, ServiceWorkerClientData&& data, const Optional<ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, String&& userAgent)
 {
     auto clientIdentifier = data.identifier;
 
@@ -744,6 +753,11 @@
 
     ASSERT(!clientIdentifiersForOrigin.identifiers.contains(clientIdentifier));
     clientIdentifiersForOrigin.identifiers.append(clientIdentifier);
+
+    if (!clientIdentifiersForOrigin.userAgent.isNull() && clientIdentifiersForOrigin.userAgent != userAgent)
+        RELEASE_LOG_ERROR(ServiceWorker, "%p - SWServer::registerServiceWorkerClient: Service worker has clients using different user agents", this);
+    clientIdentifiersForOrigin.userAgent = WTFMove(userAgent);
+
     clientIdentifiersForOrigin.terminateServiceWorkersTimer = nullptr;
 
     m_clientsBySecurityOrigin.ensure(clientOrigin.clientOrigin, [] {

Modified: trunk/Source/WebCore/workers/service/server/SWServer.h (239533 => 239534)


--- trunk/Source/WebCore/workers/service/server/SWServer.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/workers/service/server/SWServer.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -141,6 +141,7 @@
 
     WEBCORE_EXPORT SWServerWorker* workerByID(ServiceWorkerIdentifier) const;
     Optional<ServiceWorkerClientData> serviceWorkerClientWithOriginByID(const ClientOrigin&, const ServiceWorkerClientIdentifier&) const;
+    String serviceWorkerClientUserAgent(const ClientOrigin&) const;
     WEBCORE_EXPORT SWServerWorker* activeWorkerFromRegistrationID(ServiceWorkerRegistrationIdentifier);
 
     WEBCORE_EXPORT void markAllWorkersForOriginAsTerminated(const SecurityOriginData&);
@@ -163,7 +164,7 @@
     
     WEBCORE_EXPORT static HashSet<SWServer*>& allServers();
 
-    WEBCORE_EXPORT void registerServiceWorkerClient(ClientOrigin&&, ServiceWorkerClientData&&, const Optional<ServiceWorkerRegistrationIdentifier>&);
+    WEBCORE_EXPORT void registerServiceWorkerClient(ClientOrigin&&, ServiceWorkerClientData&&, const Optional<ServiceWorkerRegistrationIdentifier>&, String&& userAgent);
     WEBCORE_EXPORT void unregisterServiceWorkerClient(const ClientOrigin&, ServiceWorkerClientIdentifier);
 
     using RunServiceWorkerCallback = WTF::Function<void(SWServerToContextConnection*)>;
@@ -220,6 +221,7 @@
     struct Clients {
         Vector<ServiceWorkerClientIdentifier> identifiers;
         std::unique_ptr<Timer> terminateServiceWorkersTimer;
+        String userAgent;
     };
     HashMap<ClientOrigin, Clients> m_clientIdentifiersPerOrigin;
     HashMap<ServiceWorkerClientIdentifier, ServiceWorkerClientData> m_clientsById;

Modified: trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.h (239533 => 239534)


--- trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/workers/service/server/SWServerToContextConnection.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -53,7 +53,7 @@
     SWServerToContextConnectionIdentifier identifier() const { return m_identifier; }
 
     // Messages to the SW host process
-    virtual void installServiceWorkerContext(const ServiceWorkerContextData&, PAL::SessionID) = 0;
+    virtual void installServiceWorkerContext(const ServiceWorkerContextData&, PAL::SessionID, const String& userAgent) = 0;
     virtual void fireInstallEvent(ServiceWorkerIdentifier) = 0;
     virtual void fireActivateEvent(ServiceWorkerIdentifier) = 0;
     virtual void terminateWorker(ServiceWorkerIdentifier) = 0;

Modified: trunk/Source/WebCore/workers/service/server/SWServerWorker.cpp (239533 => 239534)


--- trunk/Source/WebCore/workers/service/server/SWServerWorker.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/workers/service/server/SWServerWorker.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -136,6 +136,11 @@
     return m_server.matchAll(*this, options, WTFMove(callback));
 }
 
+String SWServerWorker::userAgent() const
+{
+    return m_server.serviceWorkerClientUserAgent(origin());
+}
+
 void SWServerWorker::claim()
 {
     return m_server.claim(*this);

Modified: trunk/Source/WebCore/workers/service/server/SWServerWorker.h (239533 => 239534)


--- trunk/Source/WebCore/workers/service/server/SWServerWorker.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebCore/workers/service/server/SWServerWorker.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -109,9 +109,10 @@
     WEBCORE_EXPORT const SecurityOriginData& securityOrigin() const;
 
     WEBCORE_EXPORT SWServerToContextConnection* contextConnection();
+    String userAgent() const;
 
 private:
-    SWServerWorker(SWServer&, SWServerRegistration&, const URL&, const String& script, const ContentSecurityPolicyResponseHeaders&,  WorkerType, ServiceWorkerIdentifier, HashMap<URL, ServiceWorkerContextData::ImportedScript>&&);
+    SWServerWorker(SWServer&, SWServerRegistration&, const URL&, const String& script, const ContentSecurityPolicyResponseHeaders&, WorkerType, ServiceWorkerIdentifier, HashMap<URL, ServiceWorkerContextData::ImportedScript>&&);
 
     void callWhenActivatedHandler(bool success);
 

Modified: trunk/Source/WebKit/ChangeLog (239533 => 239534)


--- trunk/Source/WebKit/ChangeLog	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/ChangeLog	2018-12-22 03:23:08 UTC (rev 239534)
@@ -1,3 +1,25 @@
+2018-12-21  Chris Dumez  <cdu...@apple.com>
+
+        navigator.userAgent in service workers does not reflect customUserAgent set by client
+        https://bugs.webkit.org/show_bug.cgi?id=192951
+
+        Reviewed by Youenn Fablet.
+
+        * NetworkProcess/ServiceWorker/WebSWServerConnection.cpp:
+        (WebKit::WebSWServerConnection::registerServiceWorkerClient):
+        * NetworkProcess/ServiceWorker/WebSWServerConnection.h:
+        * NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in:
+        * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
+        (WebKit::WebSWServerToContextConnection::installServiceWorkerContext):
+        * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h:
+        * WebProcess/Storage/WebSWClientConnection.cpp:
+        (WebKit::WebSWClientConnection::registerServiceWorkerClient):
+        * WebProcess/Storage/WebSWClientConnection.h:
+        * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+        (WebKit::WebSWContextManagerConnection::installServiceWorker):
+        * WebProcess/Storage/WebSWContextManagerConnection.h:
+        * WebProcess/Storage/WebSWContextManagerConnection.messages.in:
+
 2018-12-21  Alex Christensen  <achristen...@webkit.org>
 
         Expand use of sourceApplicationAuditData

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp (239533 => 239534)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -291,11 +291,11 @@
     send(Messages::WebSWClientConnection::DidGetRegistrations { registrationMatchRequestIdentifier, registrations });
 }
 
-void WebSWServerConnection::registerServiceWorkerClient(SecurityOriginData&& topOrigin, ServiceWorkerClientData&& data, const Optional<ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier)
+void WebSWServerConnection::registerServiceWorkerClient(SecurityOriginData&& topOrigin, ServiceWorkerClientData&& data, const Optional<ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, String&& userAgent)
 {
     auto clientOrigin = ClientOrigin { WTFMove(topOrigin), SecurityOriginData::fromURL(data.url) };
     m_clientOrigins.add(data.identifier, clientOrigin);
-    server().registerServiceWorkerClient(WTFMove(clientOrigin), WTFMove(data), controllingServiceWorkerRegistrationIdentifier);
+    server().registerServiceWorkerClient(WTFMove(clientOrigin), WTFMove(data), controllingServiceWorkerRegistrationIdentifier, WTFMove(userAgent));
 }
 
 void WebSWServerConnection::unregisterServiceWorkerClient(const ServiceWorkerClientIdentifier& clientIdentifier)

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h (239533 => 239534)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -93,7 +93,7 @@
     void matchRegistration(uint64_t registrationMatchRequestIdentifier, const WebCore::SecurityOriginData& topOrigin, const URL& clientURL);
     void getRegistrations(uint64_t registrationMatchRequestIdentifier, const WebCore::SecurityOriginData& topOrigin, const URL& clientURL);
 
-    void registerServiceWorkerClient(WebCore::SecurityOriginData&& topOrigin, WebCore::ServiceWorkerClientData&&, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>&);
+    void registerServiceWorkerClient(WebCore::SecurityOriginData&& topOrigin, WebCore::ServiceWorkerClientData&&, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>&, String&& userAgent);
     void unregisterServiceWorkerClient(const WebCore::ServiceWorkerClientIdentifier&);
 
     IPC::Connection* messageSenderConnection() final { return m_contentConnection.ptr(); }

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in (239533 => 239534)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in	2018-12-22 03:23:08 UTC (rev 239534)
@@ -39,7 +39,7 @@
     MatchRegistration(uint64_t serviceRegistrationMatchRequestIdentifier, struct WebCore::SecurityOriginData topOrigin, URL clientURL)
     WhenRegistrationReady(uint64_t serviceRegistrationMatchRequestIdentifier, struct WebCore::SecurityOriginData topOrigin, URL clientURL)
     GetRegistrations(uint64_t serviceRegistrationMatchRequestIdentifier, struct WebCore::SecurityOriginData topOrigin, URL clientURL)
-    RegisterServiceWorkerClient(struct WebCore::SecurityOriginData topOrigin, struct WebCore::ServiceWorkerClientData data, Optional<WebCore::ServiceWorkerRegistrationIdentifier> controllingServiceWorkerRegistrationIdentifier)
+    RegisterServiceWorkerClient(struct WebCore::SecurityOriginData topOrigin, struct WebCore::ServiceWorkerClientData data, Optional<WebCore::ServiceWorkerRegistrationIdentifier> controllingServiceWorkerRegistrationIdentifier, String userAgent)
     UnregisterServiceWorkerClient(struct WebCore::ServiceWorkerClientIdentifier identifier)
 
     SyncTerminateWorker(WebCore::ServiceWorkerIdentifier workerIdentifier) -> () LegacySync

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp (239533 => 239534)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -57,9 +57,9 @@
     // FIXME: Do what here...?
 }
 
-void WebSWServerToContextConnection::installServiceWorkerContext(const ServiceWorkerContextData& data, PAL::SessionID sessionID)
+void WebSWServerToContextConnection::installServiceWorkerContext(const ServiceWorkerContextData& data, PAL::SessionID sessionID, const String& userAgent)
 {
-    send(Messages::WebSWContextManagerConnection::InstallServiceWorker { data, sessionID });
+    send(Messages::WebSWContextManagerConnection::InstallServiceWorker { data, sessionID, userAgent });
 }
 
 void WebSWServerToContextConnection::fireInstallEvent(ServiceWorkerIdentifier serviceWorkerIdentifier)

Modified: trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h (239533 => 239534)


--- trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -57,7 +57,7 @@
     uint64_t messageSenderDestinationID() final;
 
     // Messages to the SW host WebProcess
-    void installServiceWorkerContext(const WebCore::ServiceWorkerContextData&, PAL::SessionID) final;
+    void installServiceWorkerContext(const WebCore::ServiceWorkerContextData&, PAL::SessionID, const String& userAgent) final;
     void fireInstallEvent(WebCore::ServiceWorkerIdentifier) final;
     void fireActivateEvent(WebCore::ServiceWorkerIdentifier) final;
     void terminateWorker(WebCore::ServiceWorkerIdentifier) final;

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp (239533 => 239534)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -93,9 +93,9 @@
     WebProcess::singleton().send(Messages::WebProcessPool::PostMessageToServiceWorker(destinationIdentifier, WTFMove(message), sourceIdentifier, serverConnectionIdentifier()), 0);
 }
 
-void WebSWClientConnection::registerServiceWorkerClient(const SecurityOrigin& topOrigin, const WebCore::ServiceWorkerClientData& data, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier)
+void WebSWClientConnection::registerServiceWorkerClient(const SecurityOrigin& topOrigin, const WebCore::ServiceWorkerClientData& data, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>& controllingServiceWorkerRegistrationIdentifier, const String& userAgent)
 {
-    send(Messages::WebSWServerConnection::RegisterServiceWorkerClient { topOrigin.data(), data, controllingServiceWorkerRegistrationIdentifier });
+    send(Messages::WebSWServerConnection::RegisterServiceWorkerClient { topOrigin.data(), data, controllingServiceWorkerRegistrationIdentifier, userAgent });
 }
 
 void WebSWClientConnection::unregisterServiceWorkerClient(DocumentIdentifier contextIdentifier)

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h (239533 => 239534)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -76,7 +76,7 @@
     void scheduleJobInServer(const WebCore::ServiceWorkerJobData&) final;
     void finishFetchingScriptInServer(const WebCore::ServiceWorkerFetchResult&) final;
     void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destinationIdentifier, WebCore::MessageWithMessagePorts&&, const WebCore::ServiceWorkerOrClientIdentifier& source) final;
-    void registerServiceWorkerClient(const WebCore::SecurityOrigin& topOrigin, const WebCore::ServiceWorkerClientData&, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>&) final;
+    void registerServiceWorkerClient(const WebCore::SecurityOrigin& topOrigin, const WebCore::ServiceWorkerClientData&, const Optional<WebCore::ServiceWorkerRegistrationIdentifier>&, const String& userAgent) final;
     void unregisterServiceWorkerClient(WebCore::DocumentIdentifier) final;
 
     void matchRegistration(WebCore::SecurityOriginData&& topOrigin, const URL& clientURL, RegistrationCallback&&) final;

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (239533 => 239534)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp	2018-12-22 03:23:08 UTC (rev 239534)
@@ -135,7 +135,7 @@
     m_storageBlockingPolicy = static_cast<SecurityOrigin::StorageBlockingPolicy>(store.getUInt32ValueForKey(WebPreferencesKey::storageBlockingPolicyKey()));
 }
 
-void WebSWContextManagerConnection::installServiceWorker(const ServiceWorkerContextData& data, SessionID sessionID)
+void WebSWContextManagerConnection::installServiceWorker(const ServiceWorkerContextData& data, SessionID sessionID, String&& userAgent)
 {
     LOG(ServiceWorker, "WebSWContextManagerConnection::installServiceWorker for worker %s", data.serviceWorkerIdentifier.loggingString().utf8().data());
 
@@ -145,13 +145,17 @@
     pageConfiguration.databaseProvider = WebDatabaseProvider::getOrCreate(m_pageGroupID);
 #endif
 
+    auto effectiveUserAgent =  WTFMove(userAgent);
+    if (effectiveUserAgent.isNull())
+        effectiveUserAgent = m_userAgent;
+
     // 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>(*this, sessionID, m_pageID, ++m_previousServiceWorkerID, m_userAgent);
+    auto frameLoaderClient = std::make_unique<ServiceWorkerFrameLoaderClient>(*this, sessionID, m_pageID, ++m_previousServiceWorkerID, effectiveUserAgent);
     pageConfiguration.loaderClientForMainFrame = frameLoaderClient.get();
     m_loaders.add(WTFMove(frameLoaderClient));
 
-    auto serviceWorkerThreadProxy = ServiceWorkerThreadProxy::create(WTFMove(pageConfiguration), data, sessionID, String { m_userAgent }, WebProcess::singleton().cacheStorageProvider(), m_storageBlockingPolicy);
+    auto serviceWorkerThreadProxy = ServiceWorkerThreadProxy::create(WTFMove(pageConfiguration), data, sessionID, WTFMove(effectiveUserAgent), WebProcess::singleton().cacheStorageProvider(), m_storageBlockingPolicy);
     SWContextManager::singleton().registerServiceWorkerThreadForInstall(WTFMove(serviceWorkerThreadProxy));
 
     LOG(ServiceWorker, "Context process PID: %i created worker thread\n", getCurrentProcessID());

Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h (239533 => 239534)


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h	2018-12-22 03:23:08 UTC (rev 239534)
@@ -76,7 +76,7 @@
 
     // IPC messages.
     void serviceWorkerStartedWithMessage(Optional<WebCore::ServiceWorkerJobDataIdentifier>, WebCore::ServiceWorkerIdentifier, const String& exceptionMessage) final;
-    void installServiceWorker(const WebCore::ServiceWorkerContextData&, PAL::SessionID);
+    void installServiceWorker(const WebCore::ServiceWorkerContextData&, PAL::SessionID, String&& userAgent);
     void startFetch(WebCore::SWServerConnectionIdentifier, WebCore::ServiceWorkerIdentifier, WebCore::FetchIdentifier, WebCore::ResourceRequest&&, WebCore::FetchOptions&&, IPC::FormDataReference&&, String&& referrer);
     void cancelFetch(WebCore::SWServerConnectionIdentifier, WebCore::ServiceWorkerIdentifier, WebCore::FetchIdentifier);
     void postMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destinationIdentifier, WebCore::MessageWithMessagePorts&&, WebCore::ServiceWorkerOrClientData&& sourceData);

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


--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in	2018-12-22 03:23:08 UTC (rev 239534)
@@ -23,7 +23,7 @@
 #if ENABLE(SERVICE_WORKER)
 
 messages -> WebSWContextManagerConnection {
-    InstallServiceWorker(struct WebCore::ServiceWorkerContextData contextData, PAL::SessionID sessionID)
+    InstallServiceWorker(struct WebCore::ServiceWorkerContextData contextData, PAL::SessionID sessionID, String userAgent)
     StartFetch(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, WebCore::FetchIdentifier fetchIdentifier, WebCore::ResourceRequest request, struct WebCore::FetchOptions options, IPC::FormDataReference requestBody, String referrer)
     CancelFetch(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, WebCore::FetchIdentifier fetchIdentifier)
     PostMessageToServiceWorker(WebCore::ServiceWorkerIdentifier destinationIdentifier, struct WebCore::MessageWithMessagePorts message, WebCore::ServiceWorkerOrClientData sourceData)

Modified: trunk/Tools/ChangeLog (239533 => 239534)


--- trunk/Tools/ChangeLog	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Tools/ChangeLog	2018-12-22 03:23:08 UTC (rev 239534)
@@ -1,3 +1,18 @@
+2018-12-21  Chris Dumez  <cdu...@apple.com>
+
+        navigator.userAgent in service workers does not reflect customUserAgent set by client
+        https://bugs.webkit.org/show_bug.cgi?id=192951
+
+        Reviewed by Youenn Fablet.
+
+        Extend API test coverage.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm:
+        (-[SWCustomUserAgentDelegate initWithUserAgent:]):
+        (-[SWCustomUserAgentDelegate _webView:decidePolicyForNavigationAction:userInfo:decisionHandler:]):
+        (-[SWUserAgentMessageHandler initWithExpectedMessage:]):
+        (-[SWUserAgentMessageHandler userContentController:didReceiveScriptMessage:]):
+
 2018-12-21  Jiewen Tan  <jiewen_...@apple.com>
 
         [WebAuthN] userPresence should always be true

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm (239533 => 239534)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2018-12-22 02:19:01 UTC (rev 239533)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm	2018-12-22 03:23:08 UTC (rev 239534)
@@ -514,16 +514,25 @@
 }
 
 @interface SWCustomUserAgentDelegate : NSObject <WKNavigationDelegate> {
+    NSString *_userAgent;
 }
+- (instancetype)initWithUserAgent:(NSString *)userAgent;
 @end
 
 @implementation SWCustomUserAgentDelegate
 
+- (instancetype)initWithUserAgent:(NSString *)userAgent
+{
+    self = [super init];
+    _userAgent = userAgent;
+    return self;
+}
+
 - (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
 {
     _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
     if (navigationAction.targetFrame.mainFrame)
-        [websitePolicies setCustomUserAgent:@"Foo Custom UserAgent"];
+        [websitePolicies setCustomUserAgent:_userAgent];
 
     decisionHandler(WKNavigationActionPolicyAllow, websitePolicies);
 }
@@ -530,14 +539,25 @@
 
 @end
 
-@interface SWUserAgentMessageHandler : NSObject <WKScriptMessageHandler>
+@interface SWUserAgentMessageHandler : NSObject <WKScriptMessageHandler> {
+@public
+    NSString *expectedMessage;
+}
+- (instancetype)initWithExpectedMessage:(NSString *)expectedMessage;
 @end
 
 @implementation SWUserAgentMessageHandler
+
+- (instancetype)initWithExpectedMessage:(NSString *)_expectedMessage
+{
+    self = [super init];
+    expectedMessage = _expectedMessage;
+    return self;
+}
+
 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
 {
-    // FIXME: navigator.userAgent currently does not reflect the custom user agent set by the client (https://bugs.webkit.org/show_bug.cgi?id=192951).
-    // EXPECT_WK_STREQ(@"Message from worker: Foo Custom UserAgent", [message body]);
+    EXPECT_WK_STREQ(expectedMessage, [message body]);
     done = true;
 }
 @end
@@ -563,7 +583,7 @@
 
     auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
 
-    auto messageHandler = adoptNS([[SWUserAgentMessageHandler alloc] init]);
+    auto messageHandler = adoptNS([[SWUserAgentMessageHandler alloc] initWithExpectedMessage:@"Message from worker: Foo Custom UserAgent"]);
     [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
 
     auto handler = adoptNS([[SWSchemes alloc] init]);
@@ -572,10 +592,10 @@
     handler->expectedUserAgent = @"Foo Custom UserAgent";
     [configuration setURLSchemeHandler:handler.get() forURLScheme:@"SW"];
 
-    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
     [webView.get().configuration.processPool _registerURLSchemeServiceWorkersCanHandle:@"sw"];
 
-    auto delegate = adoptNS([[SWCustomUserAgentDelegate alloc] init]);
+    auto delegate = adoptNS([[SWCustomUserAgentDelegate alloc] initWithUserAgent:@"Foo Custom UserAgent"]);
     [webView setNavigationDelegate:delegate.get()];
 
     NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/main.html"]];
@@ -583,6 +603,36 @@
 
     TestWebKitAPI::Util::run(&done);
     done = false;
+
+    // Restore from disk.
+    webView = nullptr;
+    delegate = nullptr;
+    handler = nullptr;
+    messageHandler = nullptr;
+    configuration = nullptr;
+
+    configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+
+    messageHandler = adoptNS([[SWUserAgentMessageHandler alloc] initWithExpectedMessage:@"Message from worker: Bar Custom UserAgent"]);
+    [[configuration userContentController] addScriptMessageHandler:messageHandler.get() name:@"sw"];
+
+    handler = adoptNS([[SWSchemes alloc] init]);
+    handler->resources.set("sw://host/main.html", ResourceInfo { @"text/html", mainBytes });
+    handler->resources.set("sw://host/sw.js", ResourceInfo { @"application/_javascript_", userAgentSWBytes });
+    handler->expectedUserAgent = @"Bar Custom UserAgent";
+    [configuration setURLSchemeHandler:handler.get() forURLScheme:@"SW"];
+
+    webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
+    [webView.get().configuration.processPool _registerURLSchemeServiceWorkersCanHandle:@"sw"];
+
+    delegate = adoptNS([[SWCustomUserAgentDelegate alloc] initWithUserAgent:@"Bar Custom UserAgent"]);
+    [webView setNavigationDelegate:delegate.get()];
+
+    request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/main.html"]];
+    [webView loadRequest:request];
+
+    TestWebKitAPI::Util::run(&done);
+    done = false;
 }
 
 TEST(ServiceWorkers, RestoreFromDisk)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to