Changeset 226191 in webkit


Ignore:
Timestamp:
Dec 20, 2017 11:16:10 AM (6 years ago)
Author:
commit-queue@webkit.org
Message:

Support service worker interception of request with blob body
https://bugs.webkit.org/show_bug.cgi?id=181035

Patch by Youenn Fablet <youenn@apple.com> on 2017-12-20
Reviewed by Chris Dumez.

LayoutTests/imported/w3c:

  • 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:

Source/WebCore:

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):

Source/WebKit:

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):

Location:
trunk
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r226188 r226191  
     12017-12-20  Youenn Fablet  <youenn@apple.com>
     2
     3        Support service worker interception of request with blob body
     4        https://bugs.webkit.org/show_bug.cgi?id=181035
     5
     6        Reviewed by Chris Dumez.
     7
     8        * web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt:
     9        * web-platform-tests/service-workers/service-worker/fetch-request-xhr.https-expected.txt:
     10
    1112017-12-20  Chris Dumez  <cdumez@apple.com>
    212
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-event.https-expected.txt

    r226066 r226191  
    1717PASS Service Worker responds to fetch event with the correct integrity_metadata
    1818PASS FetchEvent#body is a string
    19 FAIL FetchEvent#body is a blob assert_equals: expected "it's me the blob and more blob!" but got ""
     19PASS FetchEvent#body is a blob
    2020PASS Service Worker responds to fetch event with the correct keepalive value
    2121
  • trunk/LayoutTests/imported/w3c/web-platform-tests/service-workers/service-worker/fetch-request-xhr.https-expected.txt

    r226126 r226191  
    66PASS event.request has the expected headers for cross-origin POST.
    77PASS FetchEvent#request.body contains XHR request data (string)
    8 FAIL FetchEvent#request.body contains XHR request data (blob) promise_test: Unhandled rejection with value: object "Error: assert_equals: expected "test blob" but got """
     8PASS FetchEvent#request.body contains XHR request data (blob)
    99PASS FetchEvent#request.method is set to XHR method
    1010PASS XHR using OPTIONS method
    11 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"
     11FAIL XHR with form data promise_test: Unhandled rejection with value: object "Error: assert_equals: expected (string) "POST" but got (undefined) undefined"
    1212FAIL XHR with mode/credentials set promise_test: Unhandled rejection with value: object "Error: assert_equals: expected "include" but got "same-origin""
    1313PASS XHR to data URL
  • trunk/Source/WebCore/ChangeLog

    r226190 r226191  
     12017-12-20  Youenn Fablet  <youenn@apple.com>
     2
     3        Support service worker interception of request with blob body
     4        https://bugs.webkit.org/show_bug.cgi?id=181035
     5
     6        Reviewed by Chris Dumez.
     7
     8        Covered by updated test.
     9
     10        Add support for getting blob request bodies within service worker.
     11        Disable interception of requests with form datas.
     12
     13        * Modules/fetch/FetchBody.cpp:
     14        (WebCore::FetchBody::fromFormData):
     15        * Modules/fetch/FetchBody.h:
     16        * workers/service/context/ServiceWorkerFetch.cpp:
     17        (WebCore::ServiceWorkerFetch::dispatchFetchEvent):
     18        * workers/service/context/ServiceWorkerFetch.h:
     19        * workers/service/context/ServiceWorkerThread.cpp:
     20        (WebCore::ServiceWorkerThread::postFetchTask):
     21
    1222017-12-20  Jeremy Jones  <jeremyj@apple.com>
    223
  • trunk/Source/WebCore/Modules/fetch/FetchBody.cpp

    r226162 r226191  
    7171}
    7272
    73 std::optional<FetchBody> FetchBody::fromFormData(FormData* formData)
    74 {
    75     if (!formData || formData->isEmpty())
    76         return std::nullopt;
    77 
    78     if (auto buffer = formData->asSharedBuffer()) {
     73std::optional<FetchBody> FetchBody::fromFormData(FormData& formData)
     74{
     75    ASSERT(!formData.isEmpty());
     76
     77    if (auto buffer = formData.asSharedBuffer()) {
    7978        FetchBody body;
    8079        body.m_consumer.setData(buffer.releaseNonNull());
     
    8281    }
    8382
    84     // FIXME: Support blob and form data bodies.
     83    auto url = formData.asBlobURL();
     84    if (!url.isNull()) {
     85        // FIXME: Properly set mime type and size of the blob.
     86        Ref<const Blob> blob = Blob::deserialize(url, { }, 0, { });
     87        return FetchBody { WTFMove(blob) };
     88    }
     89
     90    // FIXME: Support form data bodies.
    8591    return std::nullopt;
    8692}
  • trunk/Source/WebCore/Modules/fetch/FetchBody.h

    r224956 r226191  
    5959    FetchBody() = default;
    6060
    61     static std::optional<FetchBody> fromFormData(FormData*);
     61    static std::optional<FetchBody> fromFormData(FormData&);
    6262
    6363    void loadingFailed();
  • trunk/Source/WebCore/platform/graphics/cocoa/FontCacheCoreText.cpp

    r226172 r226191  
    911911            RetainPtr<CFDictionaryRef> attributes;
    912912#if CAN_DISALLOW_USER_INSTALLED_FONTS
    913             if (m_allowUserInstalledFonts == FontCache::AllowUserInstalledFonts::No) {
     913            if (m_allowUserInstalledFonts == AllowUserInstalledFonts::No) {
    914914                CFTypeRef keys[] = { kCTFontFamilyNameAttribute, kCTFontUserInstalledAttribute };
    915915                CFTypeRef values[] = { familyNameString.get(), kCFBooleanFalse };
     
    949949            RetainPtr<CFDictionaryRef> attributes;
    950950#if CAN_DISALLOW_USER_INSTALLED_FONTS
    951             if (m_allowUserInstalledFonts == FontCache::AllowUserInstalledFonts::No) {
     951            if (m_allowUserInstalledFonts == AllowUserInstalledFonts::No) {
    952952                CFTypeRef keys[] = { kCTFontEnabledAttribute, nameAttribute, kCTFontUserInstalledAttribute };
    953953                CFTypeRef values[] = { kCFBooleanTrue, postScriptNameString.get(), kCFBooleanFalse };
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.cpp

    r226126 r226191  
    9292}
    9393
    94 Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&& client, WorkerGlobalScope& globalScope, std::optional<ServiceWorkerClientIdentifier> clientId, ResourceRequest&& request, String&& referrer, FetchOptions&& options)
     94void dispatchFetchEvent(Ref<Client>&& client, ServiceWorkerGlobalScope& globalScope, std::optional<ServiceWorkerClientIdentifier> clientId, ResourceRequest&& request, String&& referrer, FetchOptions&& options)
    9595{
    9696    ASSERT(globalScope.isServiceWorkerGlobalScope());
    9797
    9898    auto requestHeaders = FetchHeaders::create(FetchHeaders::Guard::Immutable, HTTPHeaderMap { request.httpHeaderFields() });
    99     auto fetchRequest = FetchRequest::create(globalScope, FetchBody::fromFormData(request.httpBody()), WTFMove(requestHeaders),  WTFMove(request), WTFMove(options), WTFMove(referrer));
     99
     100    auto* formData = request.httpBody();
     101    std::optional<FetchBody> body;
     102    if (formData && !formData->isEmpty()) {
     103        body = FetchBody::fromFormData(*formData);
     104        if (!body) {
     105            client->didNotHandle();
     106            return;
     107        }
     108    }
     109
     110    auto fetchRequest = FetchRequest::create(globalScope, WTFMove(body), WTFMove(requestHeaders),  WTFMove(request), WTFMove(options), WTFMove(referrer));
    100111
    101112    FetchEvent::Init init;
     
    119130        if (event->defaultPrevented()) {
    120131            client->didFail();
    121             return event;
     132            return;
    122133        }
    123134        client->didNotHandle();
    124135        // FIXME: Handle soft update.
    125136    }
    126     return event;
     137
     138    globalScope.updateExtendedEventsSet(event.ptr());
    127139}
    128140
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h

    r226126 r226191  
    3939class ResourceResponse;
    4040struct ServiceWorkerClientIdentifier;
     41class ServiceWorkerGlobalScope;
    4142class SharedBuffer;
    42 class WorkerGlobalScope;
    4343
    4444namespace ServiceWorkerFetch {
     
    5555};
    5656
    57 Ref<FetchEvent> dispatchFetchEvent(Ref<Client>&&, WorkerGlobalScope&, std::optional<ServiceWorkerClientIdentifier>, ResourceRequest&&, String&& referrer, FetchOptions&&);
     57void dispatchFetchEvent(Ref<Client>&&, ServiceWorkerGlobalScope&, std::optional<ServiceWorkerClientIdentifier>, ResourceRequest&&, String&& referrer, FetchOptions&&);
    5858};
    5959
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThread.cpp

    r226126 r226191  
    9797    // FIXME: request and options come straigth from IPC so are already isolated. We should be able to take benefit of that.
    9898    runLoop().postTaskForMode([client = WTFMove(client), clientId, request = request.isolatedCopy(), referrer = referrer.isolatedCopy(), options = options.isolatedCopy()] (ScriptExecutionContext& context) mutable {
    99         auto& serviceWorkerGlobalScope = downcast<ServiceWorkerGlobalScope>(context);
    100         auto fetchEvent = ServiceWorkerFetch::dispatchFetchEvent(WTFMove(client), serviceWorkerGlobalScope, clientId, WTFMove(request), WTFMove(referrer), WTFMove(options));
    101         serviceWorkerGlobalScope.updateExtendedEventsSet(fetchEvent.ptr());
     99        ServiceWorkerFetch::dispatchFetchEvent(WTFMove(client), downcast<ServiceWorkerGlobalScope>(context), clientId, WTFMove(request), WTFMove(referrer), WTFMove(options));
    102100    }, WorkerRunLoop::defaultMode());
    103101}
  • trunk/Source/WebKit/ChangeLog

    r226189 r226191  
     12017-12-20  Youenn Fablet  <youenn@apple.com>
     2
     3        Support service worker interception of request with blob body
     4        https://bugs.webkit.org/show_bug.cgi?id=181035
     5
     6        Reviewed by Chris Dumez.
     7
     8        In case of service worker, remove the connection check to get access to the blob registry.
     9        Apply this for cloning blobs registered by another process.
     10
     11        * NetworkProcess/FileAPI/NetworkBlobRegistry.cpp:
     12        (WebKit::NetworkBlobRegistry::registerBlobURL):
     13        * NetworkProcess/FileAPI/NetworkBlobRegistry.h:
     14        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     15        (WebKit::NetworkConnectionToWebProcess::registerBlobURLFromURL):
     16        * NetworkProcess/NetworkConnectionToWebProcess.h:
     17        * NetworkProcess/NetworkConnectionToWebProcess.messages.in:
     18        * WebProcess/FileAPI/BlobRegistryProxy.cpp:
     19        (WebKit::BlobRegistryProxy::registerBlobURL):
     20
    1212017-12-20  Daniel Bates  <dabates@apple.com>
    222
  • trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.cpp

    r216764 r226191  
    7272}
    7373
    74 void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connection, const WebCore::URL& url, const WebCore::URL& srcURL)
     74void NetworkBlobRegistry::registerBlobURL(NetworkConnectionToWebProcess* connection, const WebCore::URL& url, const WebCore::URL& srcURL, bool shouldBypassConnectionCheck)
    7575{
    7676    // The connection may not be registered if NetworkProcess prevously crashed for any reason.
    7777    BlobForConnectionMap::iterator mapIterator = m_blobsForConnection.find(connection);
    78     if (mapIterator == m_blobsForConnection.end())
    79         return;
     78    if (mapIterator == m_blobsForConnection.end()) {
     79        if (!shouldBypassConnectionCheck)
     80            return;
     81        mapIterator = m_blobsForConnection.add(connection, HashSet<URL>()).iterator;
     82    }
    8083
    8184    blobRegistry().registerBlobURL(url, srcURL);
    8285
    83     ASSERT(mapIterator->value.contains(srcURL));
     86    ASSERT(shouldBypassConnectionCheck || mapIterator->value.contains(srcURL));
    8487    mapIterator->value.add(url);
    8588}
  • trunk/Source/WebKit/NetworkProcess/FileAPI/NetworkBlobRegistry.h

    r209184 r226191  
    4949    void registerFileBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const String& path, RefPtr<SandboxExtension>&&, const String& contentType);
    5050    void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, Vector<WebCore::BlobPart>&&, const String& contentType);
    51     void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL);
     51    void registerBlobURL(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, bool shouldBypassConnectionCheck);
    5252    void registerBlobURLOptionallyFileBacked(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, const String& fileBackedPath, const String& contentType);
    5353    void registerBlobURLForSlice(NetworkConnectionToWebProcess*, const WebCore::URL&, const WebCore::URL& srcURL, int64_t start, int64_t end);
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r225934 r226191  
    390390}
    391391
    392 void NetworkConnectionToWebProcess::registerBlobURLFromURL(const URL& url, const URL& srcURL)
    393 {
    394     NetworkBlobRegistry::singleton().registerBlobURL(this, url, srcURL);
     392void NetworkConnectionToWebProcess::registerBlobURLFromURL(const URL& url, const URL& srcURL, bool shouldBypassConnectionCheck)
     393{
     394    NetworkBlobRegistry::singleton().registerBlobURL(this, url, srcURL, shouldBypassConnectionCheck);
    395395}
    396396
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h

    r225934 r226191  
    111111    void registerFileBlobURL(const WebCore::URL&, const String& path, SandboxExtension::Handle&&, const String& contentType);
    112112    void registerBlobURL(const WebCore::URL&, Vector<WebCore::BlobPart>&&, const String& contentType);
    113     void registerBlobURLFromURL(const WebCore::URL&, const WebCore::URL& srcURL);
     113    void registerBlobURLFromURL(const WebCore::URL&, const WebCore::URL& srcURL, bool shouldBypassConnectionCheck);
    114114    void preregisterSandboxExtensionsForOptionallyFileBackedBlob(const Vector<String>& fileBackedPath, SandboxExtension::HandleArray&&);
    115115    void registerBlobURLOptionallyFileBacked(const WebCore::URL&, const WebCore::URL& srcURL, const String& fileBackedPath, const String& contentType);
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in

    r225934 r226191  
    4343    RegisterFileBlobURL(WebCore::URL url, String path, WebKit::SandboxExtension::Handle extensionHandle, String contentType)
    4444    RegisterBlobURL(WebCore::URL url, Vector<WebCore::BlobPart> blobParts, String contentType)
    45     RegisterBlobURLFromURL(WebCore::URL url, WebCore::URL srcURL)
     45    RegisterBlobURLFromURL(WebCore::URL url, WebCore::URL srcURL, bool shouldBypassConnectionCheck)
    4646    PreregisterSandboxExtensionsForOptionallyFileBackedBlob(Vector<String> filePaths, WebKit::SandboxExtension::HandleArray extensionHandles)
    4747    RegisterBlobURLOptionallyFileBacked(WebCore::URL url, WebCore::URL srcURL, String fileBackedPath, String contentType)
  • trunk/Source/WebKit/WebProcess/FileAPI/BlobRegistryProxy.cpp

    r225282 r226191  
    3232#include "WebProcess.h"
    3333#include <WebCore/BlobDataFileReference.h>
     34#include <WebCore/SWContextManager.h>
    3435
    3536using namespace WebCore;
     
    5556void BlobRegistryProxy::registerBlobURL(const URL& url, const URL& srcURL)
    5657{
    57     WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLFromURL(url, srcURL), 0);
     58    bool shouldBypassConnectionCheck = false;
     59#if ENABLE(SERVICE_WORKER)
     60    shouldBypassConnectionCheck = SWContextManager::singleton().connection();
     61#endif
     62    WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RegisterBlobURLFromURL { url, srcURL, shouldBypassConnectionCheck }, 0);
    5863}
    5964
Note: See TracChangeset for help on using the changeset viewer.