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)