Diff
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (225293 => 225294)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2017-11-29 21:47:37 UTC (rev 225294)
@@ -1,3 +1,14 @@
+2017-11-29 Youenn Fablet <you...@apple.com>
+
+ Add support for FetchEvent.clientId
+ https://bugs.webkit.org/show_bug.cgi?id=180052
+
+ Reviewed by Chris Dumez.
+
+ * web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt:
+ * web-platform-tests/service-workers/service-worker/resources/clients-get-worker.js:
+ * web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js:
+
2017-11-29 Ms2ger <ms2...@igalia.com>
Rebaseline imported/w3c/web-platform-tests/resource-timing/single-entry-per-resource.html.
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt (225293 => 225294)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt 2017-11-29 21:47:37 UTC (rev 225294)
@@ -4,7 +4,7 @@
FAIL Service Worker responds to fetch event with string assert_unreached: unexpected rejection: assert_equals: The character set of the response created with a string should be UTF-8 expected "UTF-8" but got "windows-1252" Reached unreachable code
FAIL Service Worker responds to fetch event with blob body assert_unreached: unexpected rejection: assert_equals: Service Worker should respond to fetch with a test string expected "Test blob" but got "" Reached unreachable code
FAIL Service Worker responds to fetch event with the referrer URL assert_unreached: unexpected rejection: assert_equals: Service Worker should respond to fetch with the referrer URL expected "Referrer: https://localhost:9443/service-workers/service-worker/fetch-event.https.html" but got "" Reached unreachable code
-FAIL Service Worker responds to fetch event with an existing client id assert_unreached: unexpected rejection: assert_equals: Service Worker should respond to fetch with a client id expected "Client ID Not Found" but got "Client ID Found: " Reached unreachable code
+PASS Service Worker responds to fetch event with an existing client id
PASS Service Worker does not respond to fetch event
PASS Service Worker responds to fetch event with null response body
PASS Service Worker fetches other file in fetch event
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/clients-get-worker.js (225293 => 225294)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/clients-get-worker.js 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/clients-get-worker.js 2017-11-29 21:47:37 UTC (rev 225294)
@@ -4,9 +4,9 @@
// the `event` object. In the case of the `onmessage` handler, it provides the
// Client instance attributes of the requested clients.
self._onfetch_ = function(e) {
- if (e.request.mode === 'navigate' && e.clientId !== null) {
+ if (e.request.mode === 'navigate' && e.clientId !== "") {
e.respondWith(Response.error(
- '`clientId` incorrectly set to non-null value for request with mode `navigate`'
+ '`clientId` incorrectly set to non-empty value for request with mode `navigate`'
));
return;
}
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js (225293 => 225294)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/resources/fetch-event-test-worker.js 2017-11-29 21:47:37 UTC (rev 225294)
@@ -29,7 +29,7 @@
function handleClientId(event) {
var body;
- if (event.clientId !== null) {
+ if (event.clientId !== "") {
body = 'Client ID Found: ' + event.clientId;
} else {
body = 'Client ID Not Found';
Modified: trunk/Source/WebCore/ChangeLog (225293 => 225294)
--- trunk/Source/WebCore/ChangeLog 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/ChangeLog 2017-11-29 21:47:37 UTC (rev 225294)
@@ -1,5 +1,34 @@
2017-11-29 Youenn Fablet <you...@apple.com>
+ Add support for FetchEvent.clientId
+ https://bugs.webkit.org/show_bug.cgi?id=180052
+
+ Reviewed by Chris Dumez.
+
+ Covered by updated test.
+
+ Add script execution context identifier as a FetchOptions parameter.
+ This is then sent to the service worker process which can then set FetchEvent.clientId appropriately.
+ If the fetch is for a subresource, clientId is used directly.
+ If it is a navigation, clientId is set to targetClientId.
+
+ * loader/FetchOptions.h:
+ (WebCore::FetchOptions::encode const):
+ (WebCore::FetchOptions::decode):
+ * loader/cache/CachedResourceLoader.cpp:
+ (WebCore::CachedResourceLoader::prepareFetch):
+ * loader/cache/CachedResourceRequest.cpp:
+ (WebCore::CachedResourceRequest::setClientIdentifierIfNeeded):
+ * loader/cache/CachedResourceRequest.h:
+ * workers/service/context/ServiceWorkerFetch.cpp:
+ (WebCore::ServiceWorkerFetch::dispatchFetchEvent):
+ * workers/service/context/ServiceWorkerFetch.h:
+ * workers/service/context/ServiceWorkerThread.cpp:
+ (WebCore::ServiceWorkerThread::postFetchTask):
+ * workers/service/context/ServiceWorkerThread.h:
+
+2017-11-29 Youenn Fablet <you...@apple.com>
+
Flaky crash in WebCore::DOMGuardedObject::clear() during service worker tests
https://bugs.webkit.org/show_bug.cgi?id=180045
<rdar://problem/35737288>
Modified: trunk/Source/WebCore/loader/FetchOptions.h (225293 => 225294)
--- trunk/Source/WebCore/loader/FetchOptions.h 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/loader/FetchOptions.h 2017-11-29 21:47:37 UTC (rev 225294)
@@ -28,6 +28,7 @@
#pragma once
+#include "DocumentIdentifier.h"
#include "ReferrerPolicy.h"
#include <wtf/text/WTFString.h>
@@ -44,8 +45,10 @@
FetchOptions(Destination, Mode, Credentials, Cache, Redirect, ReferrerPolicy, String&&, bool);
FetchOptions isolatedCopy() const { return { destination, mode, credentials, cache, redirect, referrerPolicy, integrity.isolatedCopy(), keepAlive }; }
+ template<class Encoder> void encodePersistent(Encoder&) const;
+ template<class Decoder> static bool decodePersistent(Decoder&, FetchOptions&);
template<class Encoder> void encode(Encoder&) const;
- template<class Decoder> static bool decode(Decoder&, FetchOptions&);
+ template<class Decoder> static std::optional<FetchOptions> decode(Decoder&);
Destination destination { Destination::EmptyString };
Mode mode { Mode::NoCors };
@@ -55,6 +58,7 @@
ReferrerPolicy referrerPolicy { ReferrerPolicy::EmptyString };
String integrity;
bool keepAlive { false };
+ std::optional<DocumentIdentifier> clientIdentifier;
};
inline FetchOptions::FetchOptions(Destination destination, Mode mode, Credentials credentials, Cache cache, Redirect redirect, ReferrerPolicy referrerPolicy, String&& integrity, bool keepAlive)
@@ -155,8 +159,9 @@
namespace WebCore {
-template<class Encoder> inline void FetchOptions::encode(Encoder& encoder) const
+template<class Encoder> inline void FetchOptions::encodePersistent(Encoder& encoder) const
{
+ // Changes to encoding here should bump NetworkCache Storage format version.
encoder << destination;
encoder << mode;
encoder << credentials;
@@ -167,7 +172,7 @@
encoder << keepAlive;
}
-template<class Decoder> inline bool FetchOptions::decode(Decoder& decoder, FetchOptions& options)
+template<class Decoder> inline bool FetchOptions::decodePersistent(Decoder& decoder, FetchOptions& options)
{
FetchOptions::Destination destination;
if (!decoder.decode(destination))
@@ -213,4 +218,25 @@
return true;
}
+template<class Encoder> inline void FetchOptions::encode(Encoder& encoder) const
+{
+ encodePersistent(encoder);
+ encoder << clientIdentifier;
+}
+
+template<class Decoder> inline std::optional<FetchOptions> FetchOptions::decode(Decoder& decoder)
+{
+ FetchOptions options;
+ if (!decodePersistent(decoder, options))
+ return std::nullopt;
+
+ std::optional<std::optional<DocumentIdentifier>> clientIdentifier;
+ decoder >> clientIdentifier;
+ if (!clientIdentifier)
+ return std::nullopt;
+ options.clientIdentifier = WTFMove(clientIdentifier.value());
+
+ return WTFMove(options);
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp (225293 => 225294)
--- trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/loader/cache/CachedResourceLoader.cpp 2017-11-29 21:47:37 UTC (rev 225294)
@@ -693,6 +693,7 @@
if (!request.origin())
request.setOrigin(document->securityOrigin());
#if ENABLE(SERVICE_WORKER)
+ request.setClientIdentifierIfNeeded(document->identifier());
if (auto* activeServiceWorker = document->activeServiceWorker())
request.setSelectedServiceWorkerIdentifierIfNeeded(activeServiceWorker->identifier());
#endif
Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp (225293 => 225294)
--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.cpp 2017-11-29 21:47:37 UTC (rev 225294)
@@ -274,6 +274,12 @@
}
#if ENABLE(SERVICE_WORKER)
+void CachedResourceRequest::setClientIdentifierIfNeeded(DocumentIdentifier clientIdentifier)
+{
+ if (!m_options.clientIdentifier)
+ m_options.clientIdentifier = clientIdentifier;
+}
+
void CachedResourceRequest::setSelectedServiceWorkerIdentifierIfNeeded(ServiceWorkerIdentifier identifier)
{
if (isNonSubresourceRequest(m_options.destination))
Modified: trunk/Source/WebCore/loader/cache/CachedResourceRequest.h (225293 => 225294)
--- trunk/Source/WebCore/loader/cache/CachedResourceRequest.h 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/loader/cache/CachedResourceRequest.h 2017-11-29 21:47:37 UTC (rev 225294)
@@ -98,6 +98,7 @@
static String splitFragmentIdentifierFromRequestURL(ResourceRequest&);
#if ENABLE(SERVICE_WORKER)
+ void setClientIdentifierIfNeeded(DocumentIdentifier);
void setSelectedServiceWorkerIdentifierIfNeeded(ServiceWorkerIdentifier);
void setNavigationServiceWorkerRegistrationData(const std::optional<ServiceWorkerRegistrationData>&);
#endif
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp (225293 => 225294)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp 2017-11-29 21:47:37 UTC (rev 225294)
@@ -33,6 +33,7 @@
#include "FetchRequest.h"
#include "FetchResponse.h"
#include "ResourceRequest.h"
+#include "ServiceWorkerClientIdentifier.h"
#include "WorkerGlobalScope.h"
namespace WebCore {
@@ -89,7 +90,7 @@
client->didFinish();
}
-Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&& client, WorkerGlobalScope& globalScope, ResourceRequest&& request, FetchOptions&& options)
+Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&& client, WorkerGlobalScope& globalScope, std::optional<ServiceWorkerClientIdentifier> clientId, ResourceRequest&& request, FetchOptions&& options)
{
ASSERT(globalScope.isServiceWorkerGlobalScope());
@@ -96,9 +97,14 @@
auto requestHeaders = FetchHeaders::create(FetchHeaders::Guard::Immutable, HTTPHeaderMap { request.httpHeaderFields() });
auto fetchRequest = FetchRequest::create(globalScope, FetchBody::fromFormData(request.httpBody()), WTFMove(requestHeaders), WTFMove(request), WTFMove(options), request.httpReferrer());
- // FIXME: Initialize other FetchEvent::Init fields.
FetchEvent::Init init;
init.request = WTFMove(fetchRequest);
+ if (options.mode == FetchOptions::Mode::Navigate) {
+ // FIXME: Set reservedClientId.
+ if (clientId)
+ init.targetClientId = clientId->toString();
+ } else if (clientId)
+ init.clientId = clientId->toString();
init.cancelable = true;
auto event = FetchEvent::create(eventNames().fetchEvent, WTFMove(init), Event::IsTrusted::Yes);
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h (225293 => 225294)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h 2017-11-29 21:47:37 UTC (rev 225294)
@@ -37,6 +37,7 @@
class FormData;
class ResourceRequest;
class ResourceResponse;
+struct ServiceWorkerClientIdentifier;
class SharedBuffer;
class WorkerGlobalScope;
@@ -53,7 +54,7 @@
virtual void didNotHandle() = 0;
};
-Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&&, WorkerGlobalScope&, ResourceRequest&&, FetchOptions&&);
+Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&&, WorkerGlobalScope&, std::optional<ServiceWorkerClientIdentifier>, ResourceRequest&&, FetchOptions&&);
};
} // namespace WebCore
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp (225293 => 225294)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp 2017-11-29 21:47:37 UTC (rev 225294)
@@ -94,12 +94,12 @@
WorkerThread::runEventLoop();
}
-void ServiceWorkerThread::postFetchTask(Ref<ServiceWorkerFetch::Client>&& client, ResourceRequest&& request, FetchOptions&& options)
+void ServiceWorkerThread::postFetchTask(Ref<ServiceWorkerFetch::Client>&& client, std::optional<ServiceWorkerClientIdentifier>&& clientId, ResourceRequest&& request, FetchOptions&& options)
{
// FIXME: instead of directly using runLoop(), we should be using something like WorkerGlobalScopeProxy.
// FIXME: request and options come straigth from IPC so are already isolated. We should be able to take benefit of that.
- runLoop().postTaskForMode([this, client = WTFMove(client), request = request.isolatedCopy(), options = options.isolatedCopy()] (ScriptExecutionContext& context) mutable {
- auto fetchEvent = ServiceWorkerFetch::dispatchFetchEvent(WTFMove(client), downcast<WorkerGlobalScope>(context), WTFMove(request), WTFMove(options));
+ runLoop().postTaskForMode([this, client = WTFMove(client), clientId, request = request.isolatedCopy(), options = options.isolatedCopy()] (ScriptExecutionContext& context) mutable {
+ auto fetchEvent = ServiceWorkerFetch::dispatchFetchEvent(WTFMove(client), downcast<WorkerGlobalScope>(context), clientId, WTFMove(request), WTFMove(options));
updateExtendedEventsSet(fetchEvent.ptr());
}, WorkerRunLoop::defaultMode());
}
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h (225293 => 225294)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.h 2017-11-29 21:47:37 UTC (rev 225294)
@@ -57,7 +57,9 @@
WorkerObjectProxy& workerObjectProxy() const { return m_workerObjectProxy; }
WEBCORE_EXPORT void postFetchTask(Ref<ServiceWorkerFetch::Client>&&, ResourceRequest&&, FetchOptions&&);
+ WEBCORE_EXPORT void postFetchTask(Ref<ServiceWorkerFetch::Client>&&, std::optional<ServiceWorkerClientIdentifier>&&, ResourceRequest&&, FetchOptions&&);
WEBCORE_EXPORT void postMessageToServiceWorkerGlobalScope(Ref<SerializedScriptValue>&&, std::unique_ptr<MessagePortChannelArray>&&, ServiceWorkerClientIdentifier sourceIdentifier, ServiceWorkerClientData&& sourceData);
+
void fireInstallEvent();
void fireActivateEvent();
Modified: trunk/Source/WebKit/ChangeLog (225293 => 225294)
--- trunk/Source/WebKit/ChangeLog 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebKit/ChangeLog 2017-11-29 21:47:37 UTC (rev 225294)
@@ -1,3 +1,21 @@
+2017-11-29 Youenn Fablet <you...@apple.com>
+
+ Add support for FetchEvent.clientId
+ https://bugs.webkit.org/show_bug.cgi?id=180052
+
+ Reviewed by Chris Dumez.
+
+ Using FetchOption persistency coders for cache API and modernizing IPC FetchOptions decoding.
+
+ * WebKit/Shared/WebCoreArgumentCoders.cpp:
+ * NetworkProcess/cache/CacheStorageEngineCache.cpp:
+ (WebKit::CacheStorage::Cache::encode):
+ (WebKit::CacheStorage::Cache::decodeRecordHeader):
+ * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+ (WebKit::WebSWContextManagerConnection::startFetch):
+ * WebProcess/Storage/WebSWContextManagerConnection.cpp:
+ (WebKit::WebSWContextManagerConnection::startFetch):
+
2017-11-29 Alex Christensen <achristen...@webkit.org>
Make WebFrameLoaderClient more robust against null pointer dereferencing
Modified: trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCache.cpp (225293 => 225294)
--- trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCache.cpp 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebKit/NetworkProcess/cache/CacheStorageEngineCache.cpp 2017-11-29 21:47:37 UTC (rev 225294)
@@ -539,7 +539,7 @@
encoder << recordInformation.size;
encoder << record.requestHeadersGuard;
record.request.encodeWithoutPlatformData(encoder);
- encoder << record.options;
+ record.options.encodePersistent(encoder);
encoder << record.referrer;
encoder << record.responseHeadersGuard;
@@ -580,7 +580,7 @@
if (!record.request.decodeWithoutPlatformData(decoder))
return std::nullopt;
- if (!decoder.decode(record.options))
+ if (!FetchOptions::decodePersistent(decoder, record.options))
return std::nullopt;
if (!decoder.decode(record.referrer))
Modified: trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp (225293 => 225294)
--- trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebKit/Shared/WebCoreArgumentCoders.cpp 2017-11-29 21:47:37 UTC (rev 225294)
@@ -290,8 +290,9 @@
if (!decoder.decode(request))
return std::nullopt;
- WebCore::FetchOptions options;
- if (!decoder.decode(options))
+ std::optional<WebCore::FetchOptions> options;
+ decoder >> options;
+ if (!options)
return std::nullopt;
String referrer;
@@ -337,7 +338,7 @@
}
}
- return {{ WTFMove(identifier), WTFMove(updateResponseCounter), WTFMove(requestHeadersGuard), WTFMove(request), WTFMove(options), WTFMove(referrer), WTFMove(responseHeadersGuard), WTFMove(response), WTFMove(responseBody), responseBodySize }};
+ return {{ WTFMove(identifier), WTFMove(updateResponseCounter), WTFMove(requestHeadersGuard), WTFMove(request), WTFMove(options.value()), WTFMove(referrer), WTFMove(responseHeadersGuard), WTFMove(response), WTFMove(responseBody), responseBodySize }};
}
void ArgumentCoder<EventTrackingRegions>::encode(Encoder& encoder, const EventTrackingRegions& eventTrackingRegions)
Modified: trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp (225293 => 225294)
--- trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2017-11-29 21:42:00 UTC (rev 225293)
+++ trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp 2017-11-29 21:47:37 UTC (rev 225294)
@@ -141,9 +141,12 @@
}
auto client = WebServiceWorkerFetchTaskClient::create(m_connectionToStorageProcess.copyRef(), serverConnectionIdentifier, fetchIdentifier);
+ std::optional<ServiceWorkerClientIdentifier> clientId;
+ if (options.clientIdentifier)
+ clientId = ServiceWorkerClientIdentifier { serverConnectionIdentifier, options.clientIdentifier.value() };
request.setHTTPBody(formData.takeData());
- serviceWorkerThreadProxy->thread().postFetchTask(WTFMove(client), WTFMove(request), WTFMove(options));
+ serviceWorkerThreadProxy->thread().postFetchTask(WTFMove(client), WTFMove(clientId), WTFMove(request), WTFMove(options));
}
void WebSWContextManagerConnection::postMessageToServiceWorkerGlobalScope(ServiceWorkerIdentifier destinationIdentifier, const IPC::DataReference& message, ServiceWorkerClientIdentifier sourceIdentifier, ServiceWorkerClientData&& sourceData)