Diff
Modified: trunk/LayoutTests/imported/w3c/ChangeLog (226190 => 226191)
--- trunk/LayoutTests/imported/w3c/ChangeLog 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/LayoutTests/imported/w3c/ChangeLog 2017-12-20 19:16:10 UTC (rev 226191)
@@ -1,3 +1,13 @@
+2017-12-20 Youenn Fablet <[email protected]>
+
+ Support service worker interception of request with blob body
+ https://bugs.webkit.org/show_bug.cgi?id=181035
+
+ Reviewed by Chris Dumez.
+
+ * web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt:
+ * web-platform-tests/service-workers/service-worker/fetch-request-xhr.https-expected.txt:
+
2017-12-20 Chris Dumez <[email protected]>
Do not reuse resource for memory cache if selected service worker differs
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt (226190 => 226191)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt 2017-12-20 19:16:10 UTC (rev 226191)
@@ -16,6 +16,6 @@
PASS Service Worker should intercept EventSource
PASS Service Worker responds to fetch event with the correct integrity_metadata
PASS FetchEvent#body is a string
-FAIL FetchEvent#body is a blob assert_equals: expected "it's me the blob and more blob!" but got ""
+PASS FetchEvent#body is a blob
PASS Service Worker responds to fetch event with the correct keepalive value
Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https-expected.txt (226190 => 226191)
--- trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https-expected.txt 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https-expected.txt 2017-12-20 19:16:10 UTC (rev 226191)
@@ -5,10 +5,10 @@
PASS event.request has the expected headers for cross-origin GET.
PASS event.request has the expected headers for cross-origin POST.
PASS FetchEvent#request.body contains XHR request data (string)
-FAIL FetchEvent#request.body contains XHR request data (blob) promise_test: Unhandled rejection with value: object "Error: assert_equals: expected "test blob" but got """
+PASS FetchEvent#request.body contains XHR request data (blob)
PASS FetchEvent#request.method is set to XHR method
PASS XHR using OPTIONS method
-FAIL XHR with form data promise_test: Unhandled rejection with value: object "Error: assert_true: form data response content is as expected expected true got false"
+FAIL XHR with form data promise_test: Unhandled rejection with value: object "Error: assert_equals: expected (string) "POST" but got (undefined) undefined"
FAIL XHR with mode/credentials set promise_test: Unhandled rejection with value: object "Error: assert_equals: expected "include" but got "same-origin""
PASS XHR to data URL
PASS restore global state
Modified: trunk/Source/WebCore/ChangeLog (226190 => 226191)
--- trunk/Source/WebCore/ChangeLog 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebCore/ChangeLog 2017-12-20 19:16:10 UTC (rev 226191)
@@ -1,3 +1,24 @@
+2017-12-20 Youenn Fablet <[email protected]>
+
+ Support service worker interception of request with blob body
+ https://bugs.webkit.org/show_bug.cgi?id=181035
+
+ Reviewed by Chris Dumez.
+
+ Covered by updated test.
+
+ Add support for getting blob request bodies within service worker.
+ Disable interception of requests with form datas.
+
+ * Modules/fetch/FetchBody.cpp:
+ (WebCore::FetchBody::fromFormData):
+ * Modules/fetch/FetchBody.h:
+ * workers/service/context/ServiceWorkerFetch.cpp:
+ (WebCore::ServiceWorkerFetch::dispatchFetchEvent):
+ * workers/service/context/ServiceWorkerFetch.h:
+ * workers/service/context/ServiceWorkerThread.cpp:
+ (WebCore::ServiceWorkerThread::postFetchTask):
+
2017-12-20 Jeremy Jones <[email protected]>
Send fullscreenChange earlier, in webkitWillEnterFullscreen
Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.cpp (226190 => 226191)
--- trunk/Source/WebCore/Modules/fetch/FetchBody.cpp 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.cpp 2017-12-20 19:16:10 UTC (rev 226191)
@@ -70,18 +70,24 @@
});
}
-std::optional<FetchBody> FetchBody::fromFormData(FormData* formData)
+std::optional<FetchBody> FetchBody::fromFormData(FormData& formData)
{
- if (!formData || formData->isEmpty())
- return std::nullopt;
+ ASSERT(!formData.isEmpty());
- if (auto buffer = formData->asSharedBuffer()) {
+ if (auto buffer = formData.asSharedBuffer()) {
FetchBody body;
body.m_consumer.setData(buffer.releaseNonNull());
return WTFMove(body);
}
- // FIXME: Support blob and form data bodies.
+ auto url = ""
+ if (!url.isNull()) {
+ // FIXME: Properly set mime type and size of the blob.
+ Ref<const Blob> blob = Blob::deserialize(url, { }, 0, { });
+ return FetchBody { WTFMove(blob) };
+ }
+
+ // FIXME: Support form data bodies.
return std::nullopt;
}
Modified: trunk/Source/WebCore/Modules/fetch/FetchBody.h (226190 => 226191)
--- trunk/Source/WebCore/Modules/fetch/FetchBody.h 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebCore/Modules/fetch/FetchBody.h 2017-12-20 19:16:10 UTC (rev 226191)
@@ -58,7 +58,7 @@
static FetchBody extract(ScriptExecutionContext&, Init&&, String&);
FetchBody() = default;
- static std::optional<FetchBody> fromFormData(FormData*);
+ static std::optional<FetchBody> fromFormData(FormData&);
void loadingFailed();
void loadingSucceeded();
Modified: trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp (226190 => 226191)
--- trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp 2017-12-20 19:16:10 UTC (rev 226191)
@@ -910,7 +910,7 @@
auto familyNameString = folded.createCFString();
RetainPtr<CFDictionaryRef> attributes;
#if CAN_DISALLOW_USER_INSTALLED_FONTS
- if (m_allowUserInstalledFonts == FontCache::AllowUserInstalledFonts::No) {
+ if (m_allowUserInstalledFonts == AllowUserInstalledFonts::No) {
CFTypeRef keys[] = { kCTFontFamilyNameAttribute, kCTFontUserInstalledAttribute };
CFTypeRef values[] = { familyNameString.get(), kCFBooleanFalse };
attributes = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, keys, values, WTF_ARRAY_LENGTH(keys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
@@ -948,7 +948,7 @@
#endif
RetainPtr<CFDictionaryRef> attributes;
#if CAN_DISALLOW_USER_INSTALLED_FONTS
- if (m_allowUserInstalledFonts == FontCache::AllowUserInstalledFonts::No) {
+ if (m_allowUserInstalledFonts == AllowUserInstalledFonts::No) {
CFTypeRef keys[] = { kCTFontEnabledAttribute, nameAttribute, kCTFontUserInstalledAttribute };
CFTypeRef values[] = { kCFBooleanTrue, postScriptNameString.get(), kCFBooleanFalse };
attributes = adoptCF(CFDictionaryCreate(kCFAllocatorDefault, keys, values, WTF_ARRAY_LENGTH(keys), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks));
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp (226190 => 226191)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp 2017-12-20 19:16:10 UTC (rev 226191)
@@ -91,13 +91,24 @@
});
}
-Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&& client, WorkerGlobalScope& globalScope, std::optional<ServiceWorkerClientIdentifier> clientId, ResourceRequest&& request, String&& referrer, FetchOptions&& options)
+void dispatchFetchEvent(Ref<Client>&& client, ServiceWorkerGlobalScope& globalScope, std::optional<ServiceWorkerClientIdentifier> clientId, ResourceRequest&& request, String&& referrer, FetchOptions&& options)
{
ASSERT(globalScope.isServiceWorkerGlobalScope());
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), WTFMove(referrer));
+ auto* formData = request.httpBody();
+ std::optional<FetchBody> body;
+ if (formData && !formData->isEmpty()) {
+ body = FetchBody::fromFormData(*formData);
+ if (!body) {
+ client->didNotHandle();
+ return;
+ }
+ }
+
+ auto fetchRequest = FetchRequest::create(globalScope, WTFMove(body), WTFMove(requestHeaders), WTFMove(request), WTFMove(options), WTFMove(referrer));
+
FetchEvent::Init init;
init.request = WTFMove(fetchRequest);
if (options.mode == FetchOptions::Mode::Navigate) {
@@ -118,12 +129,13 @@
if (!event->respondWithEntered()) {
if (event->defaultPrevented()) {
client->didFail();
- return event;
+ return;
}
client->didNotHandle();
// FIXME: Handle soft update.
}
- return event;
+
+ globalScope.updateExtendedEventsSet(event.ptr());
}
} // namespace ServiceWorkerFetch
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h (226190 => 226191)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h 2017-12-20 19:16:10 UTC (rev 226191)
@@ -38,8 +38,8 @@
class ResourceRequest;
class ResourceResponse;
struct ServiceWorkerClientIdentifier;
+class ServiceWorkerGlobalScope;
class SharedBuffer;
-class WorkerGlobalScope;
namespace ServiceWorkerFetch {
class Client : public ThreadSafeRefCounted<Client> {
@@ -54,7 +54,7 @@
virtual void didNotHandle() = 0;
};
-Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&&, WorkerGlobalScope&, std::optional<ServiceWorkerClientIdentifier>, ResourceRequest&&, String&& referrer, FetchOptions&&);
+void dispatchFetchEvent(Ref<Client>&&, ServiceWorkerGlobalScope&, std::optional<ServiceWorkerClientIdentifier>, ResourceRequest&&, String&& referrer, FetchOptions&&);
};
} // namespace WebCore
Modified: trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp (226190 => 226191)
--- trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp 2017-12-20 19:16:10 UTC (rev 226191)
@@ -96,9 +96,7 @@
// 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([client = WTFMove(client), clientId, request = request.isolatedCopy(), referrer = referrer.isolatedCopy(), options = options.isolatedCopy()] (ScriptExecutionContext& context) mutable {
- auto& serviceWorkerGlobalScope = downcast<ServiceWorkerGlobalScope>(context);
- auto fetchEvent = ServiceWorkerFetch::dispatchFetchEvent(WTFMove(client), serviceWorkerGlobalScope, clientId, WTFMove(request), WTFMove(referrer), WTFMove(options));
- serviceWorkerGlobalScope.updateExtendedEventsSet(fetchEvent.ptr());
+ ServiceWorkerFetch::dispatchFetchEvent(WTFMove(client), downcast<ServiceWorkerGlobalScope>(context), clientId, WTFMove(request), WTFMove(referrer), WTFMove(options));
}, WorkerRunLoop::defaultMode());
}
Modified: trunk/Source/WebKit/ChangeLog (226190 => 226191)
--- trunk/Source/WebKit/ChangeLog 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebKit/ChangeLog 2017-12-20 19:16:10 UTC (rev 226191)
@@ -1,3 +1,23 @@
+2017-12-20 Youenn Fablet <[email protected]>
+
+ Support service worker interception of request with blob body
+ https://bugs.webkit.org/show_bug.cgi?id=181035
+
+ Reviewed by Chris Dumez.
+
+ In case of service worker, remove the connection check to get access to the blob registry.
+ Apply this for cloning blobs registered by another process.
+
+ * NetworkProcess/FileAPI/NetworkBlobRegistry.cpp:
+ (WebKit::NetworkBlobRegistry::registerBlobURL):
+ * NetworkProcess/FileAPI/NetworkBlobRegistry.h:
+ * NetworkProcess/NetworkConnectionToWebProcess.cpp:
+ (WebKit::NetworkConnectionToWebProcess::registerBlobURLFromURL):
+ * NetworkProcess/NetworkConnectionToWebProcess.h:
+ * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
+ * WebProcess/FileAPI/BlobRegistryProxy.cpp:
+ (WebKit::BlobRegistryProxy::registerBlobURL):
+
2017-12-20 Daniel Bates <[email protected]>
Remove Alternative Presentation Button
Modified: trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp (226190 => 226191)
--- trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp 2017-12-20 19:16:10 UTC (rev 226191)
@@ -71,16 +71,19 @@
mapIterator->value.add(url);
}
-void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connection, const WebCore::URL& url, const WebCore::URL& srcURL)
+void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connection, const WebCore::URL& url, const WebCore::URL& srcURL, bool shouldBypassConnectionCheck)
{
// The connection may not be registered if NetworkProcess prevously crashed for any reason.
BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection);
- if (mapIterator == m_blobsForConnection.end())
- return;
+ if (mapIterator == m_blobsForConnection.end()) {
+ if (!shouldBypassConnectionCheck)
+ return;
+ mapIterator = m_blobsForConnection.add(connection, HashSet<URL>()).iterator;
+ }
blobRegistry().registerBlobURL(url, srcURL);
- ASSERT(mapIterator->value.contains(srcURL));
+ ASSERT(shouldBypassConnectionCheck || mapIterator->value.contains(srcURL));
mapIterator->value.add(url);
}
Modified: trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.h (226190 => 226191)
--- trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.h 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.h 2017-12-20 19:16:10 UTC (rev 226191)
@@ -48,7 +48,7 @@
void registerFileBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const String& path, RefPtr<SandboxExtension>&&, const String& contentType);
void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, Vector<WebCore::BlobPart>&&, const String& contentType);
- void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL);
+ void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, bool shouldBypassConnectionCheck);
void registerBlobURLOptionallyFileBacked(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, const String& fileBackedPath, const String& contentType);
void registerBlobURLForSlice(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, int64_t start, int64_t end);
void unregisterBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp (226190 => 226191)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp 2017-12-20 19:16:10 UTC (rev 226191)
@@ -389,9 +389,9 @@
NetworkBlobRegistry::singleton().registerBlobURL(this, url, WTFMove(blobParts), contentType);
}
-void NetworkConnectionToWebProcess::registerBlobURLFromURL(const URL& url, const URL& srcURL)
+void NetworkConnectionToWebProcess::registerBlobURLFromURL(const URL& url, const URL& srcURL, bool shouldBypassConnectionCheck)
{
- NetworkBlobRegistry::singleton().registerBlobURL(this, url, srcURL);
+ NetworkBlobRegistry::singleton().registerBlobURL(this, url, srcURL, shouldBypassConnectionCheck);
}
void NetworkConnectionToWebProcess::preregisterSandboxExtensionsForOptionallyFileBackedBlob(const Vector<String>& filePaths, SandboxExtension::HandleArray&& handles)
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h (226190 => 226191)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h 2017-12-20 19:16:10 UTC (rev 226191)
@@ -110,7 +110,7 @@
void registerFileBlobURL(const WebCore::URL&, const String& path, SandboxExtension::Handle&&, const String& contentType);
void registerBlobURL(const WebCore::URL&, Vector<WebCore::BlobPart>&&, const String& contentType);
- void registerBlobURLFromURL(const WebCore::URL&, const WebCore::URL& srcURL);
+ void registerBlobURLFromURL(const WebCore::URL&, const WebCore::URL& srcURL, bool shouldBypassConnectionCheck);
void preregisterSandboxExtensionsForOptionallyFileBackedBlob(const Vector<String>& fileBackedPath, SandboxExtension::HandleArray&&);
void registerBlobURLOptionallyFileBacked(const WebCore::URL&, const WebCore::URL& srcURL, const String& fileBackedPath, const String& contentType);
void registerBlobURLForSlice(const WebCore::URL&, const WebCore::URL& srcURL, int64_t start, int64_t end);
Modified: trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in (226190 => 226191)
--- trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in 2017-12-20 19:16:10 UTC (rev 226191)
@@ -42,7 +42,7 @@
RegisterFileBlobURL(WebCore::URL url, String path, WebKit::SandboxExtension::Handle extensionHandle, String contentType)
RegisterBlobURL(WebCore::URL url, Vector<WebCore::BlobPart> blobParts, String contentType)
- RegisterBlobURLFromURL(WebCore::URL url, WebCore::URL srcURL)
+ RegisterBlobURLFromURL(WebCore::URL url, WebCore::URL srcURL, bool shouldBypassConnectionCheck)
PreregisterSandboxExtensionsForOptionallyFileBackedBlob(Vector<String> filePaths, WebKit::SandboxExtension::HandleArray extensionHandles)
RegisterBlobURLOptionallyFileBacked(WebCore::URL url, WebCore::URL srcURL, String fileBackedPath, String contentType)
RegisterBlobURLForSlice(WebCore::URL url, WebCore::URL srcURL, int64_t start, int64_t end)
Modified: trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.cpp (226190 => 226191)
--- trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.cpp 2017-12-20 18:55:53 UTC (rev 226190)
+++ trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.cpp 2017-12-20 19:16:10 UTC (rev 226191)
@@ -31,6 +31,7 @@
#include "WebCoreArgumentCoders.h"
#include "WebProcess.h"
#include <WebCore/BlobDataFileReference.h>
+#include <WebCore/SWContextManager.h>
using namespace WebCore;
@@ -54,7 +55,11 @@
void BlobRegistryProxy::registerBlobURL(const URL& url, const URL& srcURL)
{
- WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLFromURL(url, srcURL), 0);
+ bool shouldBypassConnectionCheck = false;
+#if ENABLE(SERVICE_WORKER)
+ shouldBypassConnectionCheck = SWContextManager::singleton().connection();
+#endif
+ WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLFromURL { url, srcURL, shouldBypassConnectionCheck }, 0);
}
void BlobRegistryProxy::registerBlobURLOptionallyFileBacked(const URL& url, const URL& srcURL, RefPtr<WebCore::BlobDataFileReference>&& file, const String& contentType)