Diff
Modified: trunk/LayoutTests/ChangeLog (225715 => 225716)
--- trunk/LayoutTests/ChangeLog 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/LayoutTests/ChangeLog 2017-12-09 01:05:58 UTC (rev 225716)
@@ -1,3 +1,16 @@
+2017-12-08 Youenn Fablet <[email protected]>
+
+ Service Worker should use a correct user agent
+ https://bugs.webkit.org/show_bug.cgi?id=180566
+ <rdar://problem/35926295>
+
+ Reviewed by Chris Dumez.
+
+ * http/wpt/service-workers/useragent-worker.js: Added.
+ (async.doTest):
+ * http/wpt/service-workers/useragent.https-expected.txt: Added.
+ * http/wpt/service-workers/useragent.https.html: Added.
+
2017-12-07 Simon Fraser <[email protected]>
Wrong caret position for input field inside a fixed position parent on iOS 11
Added: trunk/LayoutTests/http/wpt/service-workers/useragent-worker.js (0 => 225716)
--- trunk/LayoutTests/http/wpt/service-workers/useragent-worker.js (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/useragent-worker.js 2017-12-09 01:05:58 UTC (rev 225716)
@@ -0,0 +1,25 @@
+_onactivate_ = (e) => e.waitUntil(clients.claim());
+
+async function doTest(event)
+{
+ if (!event.data.startsWith("USERAGENT")) {
+ event.source.postMessage("FAIL: received unexpected message from client");
+ return;
+ }
+
+ if (event.data ="" "USERAGENT-NAVIGATOR") {
+ event.source.postMessage(navigator.userAgent);
+ return;
+ }
+
+ if (event.data ="" "USERAGENT-FETCH") {
+ var response = await fetch("/fetch/api/resources/inspect-headers.py?headers=User-Agent")
+ event.source.postMessage(response.headers.get("x-request-user-agent"));
+ return;
+ }
+
+ event.source.postMessage("FAIL: Unknown test");
+}
+
+
+self.addEventListener("message", doTest);
Added: trunk/LayoutTests/http/wpt/service-workers/useragent.https-expected.txt (0 => 225716)
--- trunk/LayoutTests/http/wpt/service-workers/useragent.https-expected.txt (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/useragent.https-expected.txt 2017-12-09 01:05:58 UTC (rev 225716)
@@ -0,0 +1,5 @@
+
+PASS Setup worker
+PASS Test service worker navigator.userAgent
+PASS Test service worker User-Agent header
+
Added: trunk/LayoutTests/http/wpt/service-workers/useragent.https.html (0 => 225716)
--- trunk/LayoutTests/http/wpt/service-workers/useragent.https.html (rev 0)
+++ trunk/LayoutTests/http/wpt/service-workers/useragent.https.html 2017-12-09 01:05:58 UTC (rev 225716)
@@ -0,0 +1,60 @@
+<html>
+<head>
+<script src=""
+<script src=""
+</head>
+<body>
+<script>
+var scope = "/WebKit/service-workers/useragent.https.html";
+var activeWorker;
+var userAgent;
+
+promise_test(async (test) => {
+ var registration = await navigator.serviceWorker.getRegistration(scope);
+ if (registration && registration.scope === scope)
+ await registration.unregister();
+
+ var response = await fetch("/fetch/api/resources/inspect-headers.py?headers=User-Agent")
+ userAgent = response.headers.get("x-request-user-agent");
+
+ var registration = await navigator.serviceWorker.register("useragent-worker.js", { scope : scope });
+ activeWorker = registration.active;
+ if (activeWorker)
+ return;
+ activeWorker = registration.installing;
+ return new Promise(resolve => {
+ activeWorker.addEventListener('statechange', () => {
+ if (activeWorker.state === "activated")
+ resolve();
+ });
+ });
+}, "Setup worker");
+
+promise_test(async (test) => {
+ var promise = new Promise((resolve, reject) => {
+ navigator.serviceWorker.addEventListener("message", (event) => {
+ resolve(event.data);
+ });
+ });
+
+ activeWorker.postMessage("USERAGENT-NAVIGATOR");
+ var serviceWorkerUserAgent = await promise;
+
+ assert_equals(serviceWorkerUserAgent, navigator.userAgent);
+}, "Test service worker navigator.userAgent");
+
+promise_test(async (test) => {
+ var promise = new Promise((resolve, reject) => {
+ navigator.serviceWorker.addEventListener("message", (event) => {
+ resolve(event.data);
+ });
+ });
+
+ activeWorker.postMessage("USERAGENT-FETCH");
+ var serviceWorkerUserAgent = await promise;
+
+ assert_equals(serviceWorkerUserAgent, userAgent);
+}, "Test service worker User-Agent header");
+</script>
+</body>
+</html>
Modified: trunk/Source/WebCore/ChangeLog (225715 => 225716)
--- trunk/Source/WebCore/ChangeLog 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/ChangeLog 2017-12-09 01:05:58 UTC (rev 225716)
@@ -1,3 +1,26 @@
+2017-12-08 Youenn Fablet <[email protected]>
+
+ Service Worker should use a correct user agent
+ https://bugs.webkit.org/show_bug.cgi?id=180566
+ <rdar://problem/35926295>
+
+ Reviewed by Chris Dumez.
+
+ Test: http/wpt/service-workers/useragent.https.html
+
+ Make ServiceWorkerFrameLoaderClient return a valid UserAgent.
+ Pass user agent to ServiceWorkerThread so that navigation.userAgent is correctly initialized.
+ Allow ServiceWorkerFrameLoaderClient to clean itself when no longer needed.
+
+ * loader/EmptyFrameLoaderClient.h:
+ * workers/service/context/ServiceWorkerThread.cpp:
+ (WebCore::ServiceWorkerThread::ServiceWorkerThread):
+ * workers/service/context/ServiceWorkerThread.h:
+ * workers/service/context/ServiceWorkerThreadProxy.cpp:
+ (WebCore::ServiceWorkerThreadProxy::ServiceWorkerThreadProxy):
+ (WebCore::ServiceWorkerThreadProxy::frameLoaderClient):
+ * workers/service/context/ServiceWorkerThreadProxy.h:
+
2017-12-07 Simon Fraser <[email protected]>
Wrong caret position for input field inside a fixed position parent on iOS 11
Modified: trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h (225715 => 225716)
--- trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/loader/EmptyFrameLoaderClient.h 2017-12-09 01:05:58 UTC (rev 225716)
@@ -30,7 +30,7 @@
class WEBCORE_EXPORT EmptyFrameLoaderClient : public FrameLoaderClient {
Ref<DocumentLoader> createDocumentLoader(const ResourceRequest&, const SubstituteData&) override;
- void frameLoaderDestroyed() final { }
+ void frameLoaderDestroyed() override { }
uint64_t frameID() const override { return 0; }
uint64_t pageID() const override { return 0; }
@@ -149,7 +149,7 @@
void updateCachedDocumentLoader(DocumentLoader&) final { }
void setTitle(const StringWithDirection&, const URL&) final { }
- String userAgent(const URL&) final { return emptyString(); }
+ String userAgent(const URL&) override { return emptyString(); }
void savePlatformDataToCachedFrame(CachedFrame*) final { }
void transitionToCommittedFromCachedFrame(CachedFrame*) final { }
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp (225715 => 225716)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp 2017-12-09 01:05:58 UTC (rev 225716)
@@ -67,12 +67,11 @@
// FIXME: Use a valid WorkerReportingProxy
// FIXME: Use a valid WorkerObjectProxy
-// FIXME: Use a valid user agent
// FIXME: Use a valid isOnline flag
// FIXME: Use valid runtime flags
-ServiceWorkerThread::ServiceWorkerThread(const ServiceWorkerContextData& data, PAL::SessionID, WorkerLoaderProxy& loaderProxy, WorkerDebuggerProxy& debuggerProxy, IDBClient::IDBConnectionProxy* idbConnectionProxy, SocketProvider* socketProvider)
- : WorkerThread(data.scriptURL, "serviceworker:" + Inspector::IdentifiersFactory::createIdentifier(), ASCIILiteral("WorkerUserAgent"), /* isOnline */ false, data.script, loaderProxy, debuggerProxy, DummyServiceWorkerThreadProxy::shared(), WorkerThreadStartMode::Normal, ContentSecurityPolicyResponseHeaders { }, false, SecurityOrigin::create(data.scriptURL).get(), MonotonicTime::now(), idbConnectionProxy, socketProvider, JSC::RuntimeFlags::createAllEnabled(), SessionID::defaultSessionID())
+ServiceWorkerThread::ServiceWorkerThread(const ServiceWorkerContextData& data, PAL::SessionID, String&& userAgent, WorkerLoaderProxy& loaderProxy, WorkerDebuggerProxy& debuggerProxy, IDBClient::IDBConnectionProxy* idbConnectionProxy, SocketProvider* socketProvider)
+ : WorkerThread(data.scriptURL, "serviceworker:" + Inspector::IdentifiersFactory::createIdentifier(), WTFMove(userAgent), /* isOnline */ false, data.script, loaderProxy, debuggerProxy, DummyServiceWorkerThreadProxy::shared(), WorkerThreadStartMode::Normal, ContentSecurityPolicyResponseHeaders { }, false, SecurityOrigin::create(data.scriptURL).get(), MonotonicTime::now(), idbConnectionProxy, socketProvider, JSC::RuntimeFlags::createAllEnabled(), SessionID::defaultSessionID())
, m_data(data.isolatedCopy())
, m_workerObjectProxy(DummyServiceWorkerThreadProxy::shared())
{
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h (225715 => 225716)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h 2017-12-09 01:05:58 UTC (rev 225716)
@@ -73,7 +73,7 @@
void runEventLoop() override;
private:
- WEBCORE_EXPORT ServiceWorkerThread(const ServiceWorkerContextData&, PAL::SessionID, WorkerLoaderProxy&, WorkerDebuggerProxy&, IDBClient::IDBConnectionProxy*, SocketProvider*);
+ WEBCORE_EXPORT ServiceWorkerThread(const ServiceWorkerContextData&, PAL::SessionID, String&& userAgent, WorkerLoaderProxy&, WorkerDebuggerProxy&, IDBClient::IDBConnectionProxy*, SocketProvider*);
ServiceWorkerContextData m_data;
WorkerObjectProxy& m_workerObjectProxy;
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp (225715 => 225716)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp 2017-12-09 01:05:58 UTC (rev 225716)
@@ -56,10 +56,10 @@
#endif
}
-ServiceWorkerThreadProxy::ServiceWorkerThreadProxy(PageConfiguration&& pageConfiguration, const ServiceWorkerContextData& data, PAL::SessionID sessionID, CacheStorageProvider& cacheStorageProvider)
+ServiceWorkerThreadProxy::ServiceWorkerThreadProxy(PageConfiguration&& pageConfiguration, const ServiceWorkerContextData& data, PAL::SessionID sessionID, String&& userAgent, CacheStorageProvider& cacheStorageProvider)
: m_page(createPageForServiceWorker(WTFMove(pageConfiguration), data.scriptURL))
, m_document(*m_page->mainFrame().document())
- , m_serviceWorkerThread(ServiceWorkerThread::create(data, sessionID, *this, *this, idbConnectionProxy(m_document), m_document->socketProvider()))
+ , m_serviceWorkerThread(ServiceWorkerThread::create(data, sessionID, WTFMove(userAgent), *this, *this, idbConnectionProxy(m_document), m_document->socketProvider()))
, m_cacheStorageProvider(cacheStorageProvider)
, m_sessionID(sessionID)
, m_inspectorProxy(*this)
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h (225715 => 225716)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h 2017-12-09 01:05:58 UTC (rev 225716)
@@ -60,7 +60,7 @@
void setTerminatingOrTerminated(bool terminating) { m_isTerminatingOrTerminated = terminating; }
private:
- WEBCORE_EXPORT ServiceWorkerThreadProxy(PageConfiguration&&, const ServiceWorkerContextData&, PAL::SessionID, CacheStorageProvider&);
+ WEBCORE_EXPORT ServiceWorkerThreadProxy(PageConfiguration&&, const ServiceWorkerContextData&, PAL::SessionID, String&& userAgent, CacheStorageProvider&);
// WorkerLoaderProxy
bool postTaskForModeToWorkerGlobalScope(ScriptExecutionContext::Task&&, const String& mode) final;
Modified: trunk/Source/WebKit/ChangeLog (225715 => 225716)
--- trunk/Source/WebKit/ChangeLog 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/ChangeLog 2017-12-09 01:05:58 UTC (rev 225716)
@@ -1,3 +1,37 @@
+2017-12-08 Youenn Fablet <[email protected]>
+
+ Service Worker should use a correct user agent
+ https://bugs.webkit.org/show_bug.cgi?id=180566
+ <rdar://problem/35926295>
+
+ Reviewed by Chris Dumez.
+
+ Add support to set service worker user agent from UIProcess to service worker process.
+ One user agent is currently supported per service worker process and it can be changed at any given time.
+ Only new service worker will use the new value.
+ Once a service worker is launched, it will stay with the same user agent value.
+
+ This sets both navigator.userAgent and User-Agent header name used for fetch within a service worker.
+ Compute the service worker process user agent by picking the last user agent set for a web page.
+
+ * UIProcess/ServiceWorkerProcessProxy.cpp:
+ (WebKit::ServiceWorkerProcessProxy::start):
+ (WebKit::ServiceWorkerProcessProxy::setUserAgent):
+ * UIProcess/ServiceWorkerProcessProxy.h:
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::setApplicationNameForUserAgent):
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::establishWorkerContextConnectionToStorageProcess):
+ (WebKit::WebProcessPool::createWebPage):
+ (WebKit::WebProcessPool::updateServiceWorkerUserAgent):
+ * UIProcess/WebProcessPool.h:
+ * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+ (WebKit::WebSWContextManagerConnection::installServiceWorker):
+ (WebKit::WebSWContextManagerConnection::setUserAgent):
+ (WebKit::WebSWContextManagerConnection::removeFrameLoaderClient):
+ * WebProcess/Storage/WebSWContextManagerConnection.h:
+ * WebProcess/Storage/WebSWContextManagerConnection.messages.in:
+
2017-12-07 Simon Fraser <[email protected]>
Wrong caret position for input field inside a fixed position parent on iOS 11
Modified: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp (225715 => 225716)
--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp 2017-12-09 01:05:58 UTC (rev 225716)
@@ -31,6 +31,7 @@
#include "WebPreferencesStore.h"
#include "WebProcessMessages.h"
#include "WebProcessPool.h"
+#include "WebSWContextManagerConnectionMessages.h"
#include <WebCore/NotImplemented.h>
namespace WebKit {
@@ -61,9 +62,14 @@
void ServiceWorkerProcessProxy::start(const WebPreferencesStore& store)
{
- send(Messages::WebProcess::EstablishWorkerContextConnectionToStorageProcess(m_serviceWorkerPageID, store), 0);
+ send(Messages::WebProcess::EstablishWorkerContextConnectionToStorageProcess { m_serviceWorkerPageID, store }, 0);
}
+void ServiceWorkerProcessProxy::setUserAgent(const String& userAgent)
+{
+ send(Messages::WebSWContextManagerConnection::SetUserAgent { userAgent }, 0);
+}
+
void ServiceWorkerProcessProxy::didReceiveAuthenticationChallenge(uint64_t pageID, uint64_t frameID, Ref<AuthenticationChallengeProxy>&& challenge)
{
UNUSED_PARAM(pageID);
Modified: trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h (225715 => 225716)
--- trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.h 2017-12-09 01:05:58 UTC (rev 225716)
@@ -39,6 +39,8 @@
void didReceiveAuthenticationChallenge(uint64_t pageID, uint64_t frameID, Ref<AuthenticationChallengeProxy>&&);
void start(const WebPreferencesStore&);
+ void setUserAgent(const String&);
+
uint64_t pageID() const { return m_serviceWorkerPageID; }
private:
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (225715 => 225716)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2017-12-09 01:05:58 UTC (rev 225716)
@@ -2330,12 +2330,18 @@
m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID, websitePolicies), m_pageID);
}
-void WebPageProxy::setUserAgent(const String& userAgent)
+void WebPageProxy::setUserAgent(String&& userAgent)
{
if (m_userAgent == userAgent)
return;
- m_userAgent = userAgent;
+ m_userAgent = WTFMove(userAgent);
+#if ENABLE(SERVICE_WORKER)
+ // We update the service worker there at the moment to be sure we use values used by actual web pages.
+ // FIXME: Refactor this when we have a better User-Agent story.
+ process().processPool().updateServiceWorkerUserAgent(m_userAgent);
+#endif
+
if (!isValid())
return;
m_process->send(Messages::WebPage::SetUserAgent(m_userAgent), m_pageID);
@@ -2365,7 +2371,7 @@
return;
}
- setUserAgent(m_customUserAgent);
+ setUserAgent(String { m_customUserAgent });
}
void WebPageProxy::resumeActiveDOMObjectsAndAnimations()
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (225715 => 225716)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.h 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h 2017-12-09 01:05:58 UTC (rev 225716)
@@ -1268,7 +1268,7 @@
void resetState(ResetStateReason);
void resetStateAfterProcessExited();
- void setUserAgent(const String&);
+ void setUserAgent(String&&);
// IPC::MessageReceiver
// Implemented in generated WebPageProxyMessageReceiver.cpp
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (225715 => 225716)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2017-12-09 01:05:58 UTC (rev 225716)
@@ -1011,6 +1011,17 @@
return process->createWebPage(pageClient, WTFMove(pageConfiguration));
}
+#if ENABLE(SERVICE_WORKER)
+void WebProcessPool::updateServiceWorkerUserAgent(const String& userAgent)
+{
+ if (m_serviceWorkerUserAgent == userAgent)
+ return;
+ m_serviceWorkerUserAgent = userAgent;
+ if (m_serviceWorkerProcess)
+ m_serviceWorkerProcess->setUserAgent(m_serviceWorkerUserAgent);
+}
+#endif
+
void WebProcessPool::pageAddedToProcess(WebPageProxy& page)
{
auto result = m_sessionToPagesMap.add(page.sessionID(), HashSet<WebPageProxy*>()).iterator->value.add(&page);
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (225715 => 225716)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2017-12-09 01:05:58 UTC (rev 225716)
@@ -328,6 +328,7 @@
ServiceWorkerProcessProxy* serviceWorkerProxy() const { return m_serviceWorkerProcess; }
void setAllowsAnySSLCertificateForServiceWorker(bool allows) { m_allowsAnySSLCertificateForServiceWorker = allows; }
bool allowsAnySSLCertificateForServiceWorker() const { return m_allowsAnySSLCertificateForServiceWorker; }
+ void updateServiceWorkerUserAgent(const String& userAgent);
#endif
#if PLATFORM(COCOA)
@@ -494,6 +495,7 @@
ServiceWorkerProcessProxy* m_serviceWorkerProcess { nullptr };
bool m_waitingForWorkerContextProcessConnection { false };
bool m_allowsAnySSLCertificateForServiceWorker { false };
+ String m_serviceWorkerUserAgent;
#endif
Ref<WebPageGroup> m_defaultPageGroup;
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (225715 => 225716)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2017-12-09 01:05:58 UTC (rev 225716)
@@ -50,6 +50,7 @@
#include <WebCore/SerializedScriptValue.h>
#include <WebCore/ServiceWorkerClientData.h>
#include <WebCore/ServiceWorkerClientIdentifier.h>
+#include <WebCore/UserAgent.h>
#include <pal/SessionID.h>
#if USE(QUICK_LOOK)
@@ -63,13 +64,17 @@
class ServiceWorkerFrameLoaderClient final : public EmptyFrameLoaderClient {
public:
- ServiceWorkerFrameLoaderClient(PAL::SessionID sessionID, uint64_t pageID, uint64_t frameID)
- : m_sessionID(sessionID)
+ ServiceWorkerFrameLoaderClient(WebSWContextManagerConnection& connection, PAL::SessionID sessionID, uint64_t pageID, uint64_t frameID, const String& userAgent)
+ : m_connection(connection)
+ , m_sessionID(sessionID)
, m_pageID(pageID)
, m_frameID(frameID)
+ , m_userAgent(userAgent)
{
}
+ void setUserAgent(String&& userAgent) { m_userAgent = WTFMove(userAgent); }
+
private:
Ref<DocumentLoader> createDocumentLoader(const ResourceRequest& request, const SubstituteData& substituteData) final
{
@@ -76,22 +81,30 @@
return WebDocumentLoader::create(request, substituteData);
}
+ void frameLoaderDestroyed() final { m_connection.removeFrameLoaderClient(*this); }
+
PAL::SessionID sessionID() const final { return m_sessionID; }
uint64_t pageID() const final { return m_pageID; }
uint64_t frameID() const final { return m_frameID; }
+ String userAgent(const URL&) final { return m_userAgent; }
+ WebSWContextManagerConnection& m_connection;
PAL::SessionID m_sessionID;
uint64_t m_pageID { 0 };
uint64_t m_frameID { 0 };
+ String m_userAgent;
};
WebSWContextManagerConnection::WebSWContextManagerConnection(Ref<IPC::Connection>&& connection, uint64_t pageID, const WebPreferencesStore& store)
: m_connectionToStorageProcess(WTFMove(connection))
, m_pageID(pageID)
+ , m_userAgent(standardUserAgentWithApplicationName({ }))
{
updatePreferences(store);
}
+WebSWContextManagerConnection::~WebSWContextManagerConnection() = default;
+
void WebSWContextManagerConnection::updatePreferences(const WebPreferencesStore& store)
{
RuntimeEnabledFeatures::sharedFeatures().setServiceWorkerEnabled(true);
@@ -113,15 +126,27 @@
// FIXME: This method should be moved directly to WebCore::SWContextManager::Connection
// If it weren't for ServiceWorkerFrameLoaderClient's dependence on WebDocumentLoader, this could already happen.
- auto frameLoaderClient = std::make_unique<ServiceWorkerFrameLoaderClient>(sessionID, m_pageID, ++m_previousServiceWorkerID);
- pageConfiguration.loaderClientForMainFrame = frameLoaderClient.release();
+ auto frameLoaderClient = std::make_unique<ServiceWorkerFrameLoaderClient>(*this, sessionID, m_pageID, ++m_previousServiceWorkerID, m_userAgent);
+ pageConfiguration.loaderClientForMainFrame = frameLoaderClient.get();
+ m_loaders.add(WTFMove(frameLoaderClient));
- auto serviceWorkerThreadProxy = ServiceWorkerThreadProxy::create(WTFMove(pageConfiguration), data, sessionID, WebProcess::singleton().cacheStorageProvider());
+ auto serviceWorkerThreadProxy = ServiceWorkerThreadProxy::create(WTFMove(pageConfiguration), data, sessionID, String { m_userAgent }, WebProcess::singleton().cacheStorageProvider());
SWContextManager::singleton().registerServiceWorkerThreadForInstall(WTFMove(serviceWorkerThreadProxy));
LOG(ServiceWorker, "Context process PID: %i created worker thread\n", getpid());
}
+void WebSWContextManagerConnection::setUserAgent(String&& userAgent)
+{
+ m_userAgent = WTFMove(userAgent);
+}
+
+void WebSWContextManagerConnection::removeFrameLoaderClient(ServiceWorkerFrameLoaderClient& client)
+{
+ auto result = m_loaders.remove(&client);
+ ASSERT_UNUSED(result, result);
+}
+
void WebSWContextManagerConnection::serviceWorkerStartedWithMessage(std::optional<ServiceWorkerJobDataIdentifier> jobDataIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, const String& exceptionMessage)
{
if (exceptionMessage.isEmpty())
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h (225715 => 225716)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h 2017-12-09 01:05:58 UTC (rev 225716)
@@ -46,15 +46,19 @@
namespace WebKit {
+class ServiceWorkerFrameLoaderClient;
struct WebPreferencesStore;
class WebSWContextManagerConnection final : public WebCore::SWContextManager::Connection, public IPC::MessageReceiver {
public:
WebSWContextManagerConnection(Ref<IPC::Connection>&&, uint64_t pageID, const WebPreferencesStore&);
+ ~WebSWContextManagerConnection();
void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
+ void removeFrameLoaderClient(ServiceWorkerFrameLoaderClient&);
+
private:
void updatePreferences(const WebPreferencesStore&);
@@ -83,16 +87,19 @@
void matchAllCompleted(uint64_t matchAllRequestIdentifier, Vector<WebCore::ServiceWorkerClientInformation>&&);
void claimCompleted(uint64_t claimRequestIdentifier);
void didFinishSkipWaiting(uint64_t callbackID);
+ void setUserAgent(String&& userAgent);
Ref<IPC::Connection> m_connectionToStorageProcess;
uint64_t m_pageID { 0 };
uint64_t m_previousServiceWorkerID { 0 };
+ HashSet<std::unique_ptr<ServiceWorkerFrameLoaderClient>> m_loaders;
HashMap<uint64_t, FindClientByIdentifierCallback> m_findClientByIdentifierRequests;
HashMap<uint64_t, WebCore::ServiceWorkerClientsMatchAllCallback> m_matchAllRequests;
HashMap<uint64_t, WTF::CompletionHandler<void()>> m_claimRequests;
HashMap<uint64_t, WTF::Function<void()>> m_skipWaitingRequests;
uint64_t m_previousRequestIdentifier { 0 };
+ String m_userAgent;
};
} // namespace WebKit
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in (225715 => 225716)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in 2017-12-09 00:00:14 UTC (rev 225715)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in 2017-12-09 01:05:58 UTC (rev 225716)
@@ -35,6 +35,7 @@
MatchAllCompleted(uint64_t matchAllRequestIdentifier, Vector<WebCore::ServiceWorkerClientInformation> clientsData)
ClaimCompleted(uint64_t claimRequestIdentifier)
DidFinishSkipWaiting(uint64_t callbackID)
+ SetUserAgent(String userAgent)
}
#endif