WebKit Bugzilla
Attachment 358012 Details for
Bug 192951
: navigator.userAgent in service workers does not reflect customUserAgent set by client
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-192951-20181221190610.patch (text/plain), 34.47 KB, created by
Chris Dumez
on 2018-12-21 19:06:12 PST
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Chris Dumez
Created:
2018-12-21 19:06:12 PST
Size:
34.47 KB
patch
obsolete
>Subversion Revision: 239533 >diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog >index 24291ccefc4f8271e4ba829b7e3040b12bccf0ba..58702b97a791973f0cab89889b269492224459b8 100644 >--- a/Source/WebCore/ChangeLog >+++ b/Source/WebCore/ChangeLog >@@ -1,3 +1,30 @@ >+2018-12-21 Chris Dumez <cdumez@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 <youenn@apple.com> > > RTCRtpSender.setParameters() does set active parameter >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 1a222fc62adc11507ca7e04ee1159a49e4f964b8..d5241a3bb5e650661b9c302d0592e7ed3959cd5d 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,25 @@ >+2018-12-21 Chris Dumez <cdumez@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 <achristensen@webkit.org> > > Expand use of sourceApplicationAuditData >diff --git a/Source/WebCore/dom/Document.cpp b/Source/WebCore/dom/Document.cpp >index 9ca30cc72512c88a6ab0c821204cddad1af1472d..ec66be7661d21606e57cd1f749cdcd42c17f5edc 100644 >--- a/Source/WebCore/dom/Document.cpp >+++ b/Source/WebCore/dom/Document.cpp >@@ -8472,7 +8472,7 @@ void Document::setServiceWorkerConnection(SWClientConnection* serviceWorkerConne > 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 > >diff --git a/Source/WebCore/loader/DocumentLoader.cpp b/Source/WebCore/loader/DocumentLoader.cpp >index d531db49292d801ca1e932b56bc3a5a801514b09..4754beab7aa95a6f1e3f925322b91e9f169c56f6 100644 >--- a/Source/WebCore/loader/DocumentLoader.cpp >+++ b/Source/WebCore/loader/DocumentLoader.cpp >@@ -1791,7 +1791,7 @@ void DocumentLoader::registerTemporaryServiceWorkerClient(const URL& url) > 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 >diff --git a/Source/WebCore/workers/service/SWClientConnection.h b/Source/WebCore/workers/service/SWClientConnection.h >index b6f9e16bf69b1319762be75ca3b8231dd11038b9..3c00914b19a18ccbceceface44e2ea8ba72eb4ec 100644 >--- a/Source/WebCore/workers/service/SWClientConnection.h >+++ b/Source/WebCore/workers/service/SWClientConnection.h >@@ -80,7 +80,7 @@ public: > 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; >diff --git a/Source/WebCore/workers/service/server/SWServer.cpp b/Source/WebCore/workers/service/server/SWServer.cpp >index bcb197ca2ca7bf75991110137dd09916191346b6..4377b00dc0e8a4de7a25e0acde7429804061ee67 100644 >--- a/Source/WebCore/workers/service/server/SWServer.cpp >+++ b/Source/WebCore/workers/service/server/SWServer.cpp >@@ -92,6 +92,14 @@ Optional<ServiceWorkerClientData> SWServer::serviceWorkerClientWithOriginByID(co > 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 @@ void SWServer::installContextData(const ServiceWorkerContextData& data) > > 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 @@ bool SWServer::runServiceWorker(ServiceWorkerIdentifier identifier) > 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 @@ SWServerRegistration* SWServer::registrationFromServiceWorkerIdentifier(ServiceW > 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 @@ void SWServer::registerServiceWorkerClient(ClientOrigin&& clientOrigin, ServiceW > > 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, [] { >diff --git a/Source/WebCore/workers/service/server/SWServer.h b/Source/WebCore/workers/service/server/SWServer.h >index c3910d6be21d12be54f457f6bd201dd57af6854b..2d7404811d45be3e64a293b89dfddf21f5f3715e 100644 >--- a/Source/WebCore/workers/service/server/SWServer.h >+++ b/Source/WebCore/workers/service/server/SWServer.h >@@ -141,6 +141,7 @@ public: > > 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 @@ public: > > 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 @@ private: > struct Clients { > Vector<ServiceWorkerClientIdentifier> identifiers; > std::unique_ptr<Timer> terminateServiceWorkersTimer; >+ String userAgent; > }; > HashMap<ClientOrigin, Clients> m_clientIdentifiersPerOrigin; > HashMap<ServiceWorkerClientIdentifier, ServiceWorkerClientData> m_clientsById; >diff --git a/Source/WebCore/workers/service/server/SWServerToContextConnection.h b/Source/WebCore/workers/service/server/SWServerToContextConnection.h >index 771da75ce9859576f7fed99ae774303884d42b3a..df4f175e51b6a8b2ef464e944dcbc17099959b14 100644 >--- a/Source/WebCore/workers/service/server/SWServerToContextConnection.h >+++ b/Source/WebCore/workers/service/server/SWServerToContextConnection.h >@@ -53,7 +53,7 @@ public: > 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; >diff --git a/Source/WebCore/workers/service/server/SWServerWorker.cpp b/Source/WebCore/workers/service/server/SWServerWorker.cpp >index c8b68e6b9b8ff2384c00c46eef76f716190e8b69..b4d7b9d361a1d9d09ccbaf6afe4aebf514b7a99b 100644 >--- a/Source/WebCore/workers/service/server/SWServerWorker.cpp >+++ b/Source/WebCore/workers/service/server/SWServerWorker.cpp >@@ -136,6 +136,11 @@ void SWServerWorker::matchAll(const ServiceWorkerClientQueryOptions& options, Se > 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); >diff --git a/Source/WebCore/workers/service/server/SWServerWorker.h b/Source/WebCore/workers/service/server/SWServerWorker.h >index a31dba714485514f437f3ad40878cb532597244b..a73c86dcd2ecd38e21cc7fb2f0372f4182137012 100644 >--- a/Source/WebCore/workers/service/server/SWServerWorker.h >+++ b/Source/WebCore/workers/service/server/SWServerWorker.h >@@ -109,9 +109,10 @@ public: > 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); > >diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp >index 97cbf45d8838468ca34a6f17fe43ee462ced42a3..76d8fbd3a3d4fe220907776643673a54e3faa805 100644 >--- a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp >+++ b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.cpp >@@ -291,11 +291,11 @@ void WebSWServerConnection::getRegistrations(uint64_t registrationMatchRequestId > 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) >diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h >index 307da2c9f69c444273353b5432641ce1679522a9..7974ede6d672257f577cad5fb1e62a046dd291e0 100644 >--- a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h >+++ b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.h >@@ -93,7 +93,7 @@ private: > 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(); } >diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in >index 7cbc230a4330e24eae2ed0cab28c88ef94f72338..f7543ff82957f2745ffb93fac564be16acdd1987 100644 >--- a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in >+++ b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in >@@ -39,7 +39,7 @@ messages -> WebSWServerConnection { > 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 >diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp >index fc9afd7461f3d14361798ac7c223c7ac862e6f9d..ce40db167b7b1934abff9ad56eb2a91cfe51797e 100644 >--- a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp >+++ b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp >@@ -57,9 +57,9 @@ void WebSWServerToContextConnection::connectionClosed() > // 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) >diff --git a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h >index 0129ad8dbee15539e94c8ee93bf11efef095a757..3b6909e23a56cc6c4f1ba3cdbdbe13d7d1c3a06c 100644 >--- a/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h >+++ b/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h >@@ -57,7 +57,7 @@ private: > 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; >diff --git a/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp b/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp >index 574c920ec30562405bdfbd7a9ee927bd597462cf..a555ca3c00083bd95eaed0323d52bb3e603986bb 100644 >--- a/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp >+++ b/Source/WebKit/WebProcess/Storage/WebSWClientConnection.cpp >@@ -93,9 +93,9 @@ void WebSWClientConnection::postMessageToServiceWorker(ServiceWorkerIdentifier d > 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) >diff --git a/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h b/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h >index b92eebff90f9bcd34488da7e4967b9d34989251b..4c712fcdcd315c02cda75dd9768465f53e88ad54 100644 >--- a/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h >+++ b/Source/WebKit/WebProcess/Storage/WebSWClientConnection.h >@@ -76,7 +76,7 @@ private: > 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; >diff --git a/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp b/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp >index ef65c42e3b02032413c89a1150958a070fbecd32..e46cf80ea79c230f4f2f0f2a9b44490c83a80a8a 100644 >--- a/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp >+++ b/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp >@@ -135,7 +135,7 @@ void WebSWContextManagerConnection::updatePreferencesStore(const WebPreferencesS > 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 @@ void WebSWContextManagerConnection::installServiceWorker(const ServiceWorkerCont > 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()); >diff --git a/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h b/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h >index 307f087ba58fba0e5bb0c330fe84169a879dab27..0d24144982324f2ecc866c0fb4165f57697d1538 100644 >--- a/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h >+++ b/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h >@@ -76,7 +76,7 @@ private: > > // 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); >diff --git a/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in b/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in >index 04e07a8f0abc65417a3ac28aad616335779cb692..dfe5a38e16ece8bfcb062fccd8c4e60ecdf21c13 100644 >--- a/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in >+++ b/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in >@@ -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) >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index 09e26b9dce86ab08d1713043dd658433e3806307..b8d6aac3f16aa09f5a5146f4c96cc00c728e46f9 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,18 @@ >+2018-12-21 Chris Dumez <cdumez@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_tan@apple.com> > > [WebAuthN] userPresence should always be true >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm >index 0ade2f8ae66eae6e3626839f9b2913c460b79a69..e324c29f4aca097e5659761940fe947469e7b30d 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm >@@ -514,30 +514,50 @@ TEST(ServiceWorkers, Basic) > } > > @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); > } > > @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 @@ TEST(ServiceWorkers, UserAgentOverride) > > 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 @@ TEST(ServiceWorkers, UserAgentOverride) > 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 @@ TEST(ServiceWorkers, UserAgentOverride) > > 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)
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 192951
:
357857
|
357971
|
357994
| 358012