Changeset 286944 in webkit


Ignore:
Timestamp:
Dec 13, 2021 2:41:06 AM (7 months ago)
Author:
youenn@apple.com
Message:

Fix ServiceWorker downloads
https://bugs.webkit.org/show_bug.cgi?id=202142
<rdar://problem/55721934>

Reviewed by Alex Christensen.

Source/WebCore:

Add API to ask the fetch task to become a download.

Tests: http/tests/workers/service/service-worker-download-body.https.html

http/tests/workers/service/service-worker-download-stream.https.html
http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https.html
http/wpt/service-workers/fetch-service-worker-preload-download.https.html

  • workers/service/context/ServiceWorkerFetch.h:
  • workers/service/context/ServiceWorkerThreadProxy.cpp:
  • workers/service/context/ServiceWorkerThreadProxy.h:

Source/WebKit:

Add ServiceWorkerDownloadTask class as a NetworkDataTask whose purpose is to download the content of a response given from service worker.
Add a way to convert ServiceWorkerFetchTask into downloads:

  • If a preload is ongoing and can be used for navigation, use this preload as the download NetworkLoad.
  • If a preload does not exist, create a ServiceWorkerDownloadTask and a corresponding NetworkLoad to start downloading the service worker response data.

When creating a ServiceWorkerDownloadTask, the WebServiceWorkerFetchTaskClient will be notified to start sending response data using ServiceWorkerDownloadTask
instead of ServiceWorkerFetchTask messages. This allows cancelling the ServiceWorkerFetchTask without any issue.

Note that the service worker lifetime is not augmented: if the service worker exits due to all its clients being closed, the download will fail.

Increase unified build files to 112.

  • CMakeLists.txt:
  • DerivedSources-input.xcfilelist:
  • DerivedSources-output.xcfilelist:
  • DerivedSources.make:
  • NetworkProcess/NetworkConnectionToWebProcess.cpp:
  • NetworkProcess/NetworkLoad.cpp:
  • NetworkProcess/NetworkLoad.h:
  • NetworkProcess/NetworkResourceLoader.cpp:
  • NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.cpp: Added.
  • NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.h: Added.
  • NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.messages.in: Added.
  • NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
  • NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h:
  • NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp:
  • NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.h:
  • NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
  • NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h:
  • NetworkProcess/storage/NetworkStorageManager.cpp:
  • Scripts/generate-unified-sources.sh:
  • Scripts/webkit/messages.py:
  • Scripts/webkit/tests/TestWithCVPixelBufferMessageReceiver.cpp:

(WebKit::TestWithCVPixelBuffer::didReceiveMessage):

  • Scripts/webkit/tests/TestWithIfMessageMessageReceiver.cpp:

(WebKit::TestWithIfMessage::didReceiveMessage):

  • Scripts/webkit/tests/TestWithImageDataMessageReceiver.cpp:

(WebKit::TestWithImageData::didReceiveMessage):

  • Scripts/webkit/tests/TestWithLegacyReceiverMessageReceiver.cpp:

(WebKit::TestWithLegacyReceiver::didReceiveTestWithLegacyReceiverMessage):

  • Scripts/webkit/tests/TestWithSemaphoreMessageReceiver.cpp:

(WebKit::TestWithSemaphore::didReceiveMessage):

  • Scripts/webkit/tests/TestWithStreamBufferMessageReceiver.cpp:

(WebKit::TestWithStreamBuffer::didReceiveMessage):

  • Scripts/webkit/tests/TestWithStreamMessageReceiver.cpp:

(WebKit::TestWithStream::didReceiveStreamMessage):

  • Scripts/webkit/tests/TestWithoutAttributesMessageReceiver.cpp:

(WebKit::TestWithoutAttributes::didReceiveMessage):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::receivedPolicyDecision):

  • UIProcess/WebProcessPool.cpp:

(WebKit::WebProcessPool::download):
(WebKit::WebProcessPool::createDownloadProxy):

  • Sources.txt:
  • UnifiedSources-output.xcfilelist:
  • WebKit.xcodeproj/project.pbxproj:
  • WebProcess/Storage/WebSWContextManagerConnection.cpp:
  • WebProcess/Storage/WebSWContextManagerConnection.h:
  • WebProcess/Storage/WebSWContextManagerConnection.messages.in:
  • WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
  • WebProcess/Storage/WebServiceWorkerFetchTaskClient.h:

Tools:

Add test runner API to log the total download size.
This helps ensuring that service worker loads are correctly downloaded and do not rely on networking.

  • WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
  • WebKitTestRunner/InjectedBundle/TestRunner.cpp:
  • WebKitTestRunner/InjectedBundle/TestRunner.h:
  • WebKitTestRunner/TestController.cpp:
  • WebKitTestRunner/TestController.h:
  • WebKitTestRunner/TestInvocation.cpp:

LayoutTests:

  • http/tests/workers/service/resources/service-worker-download-worker.js:
  • http/tests/workers/service/service-worker-download-body.https-expected.txt: Added.
  • http/tests/workers/service/service-worker-download-body.https.html: Added.
  • http/tests/workers/service/service-worker-download-stream.https-expected.txt: Added.
  • http/tests/workers/service/service-worker-download-stream.https.html: Added.
  • http/tests/workers/service/service-worker-download.https-expected.txt:
  • http/tests/workers/service/service-worker-download.https.html:
  • http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https-expected.txt: Added.
  • http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https.html: Added.
  • http/wpt/service-workers/fetch-service-worker-preload-download.https-expected.txt: Added.
  • http/wpt/service-workers/fetch-service-worker-preload-download.https.html: Added.
  • http/wpt/service-workers/fetch-service-worker-preload-worker.js:
  • http/wpt/service-workers/resources/fetch-service-worker-preload-script.py:
  • platform/ios/http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https-expected.txt: Added.
  • platform/ios/http/wpt/service-workers/fetch-service-worker-preload-download.https-expected.txt: Added.
Location:
trunk
Files:
12 added
51 edited
2 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r286942 r286944  
     12021-12-13  Youenn Fablet  <youenn@apple.com>
     2
     3        Fix ServiceWorker downloads
     4        https://bugs.webkit.org/show_bug.cgi?id=202142
     5        <rdar://problem/55721934>
     6
     7        Reviewed by Alex Christensen.
     8
     9        * http/tests/workers/service/resources/service-worker-download-worker.js:
     10        * http/tests/workers/service/service-worker-download-body.https-expected.txt: Added.
     11        * http/tests/workers/service/service-worker-download-body.https.html: Added.
     12        * http/tests/workers/service/service-worker-download-stream.https-expected.txt: Added.
     13        * http/tests/workers/service/service-worker-download-stream.https.html: Added.
     14        * http/tests/workers/service/service-worker-download.https-expected.txt:
     15        * http/tests/workers/service/service-worker-download.https.html:
     16        * http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https-expected.txt: Added.
     17        * http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https.html: Added.
     18        * http/wpt/service-workers/fetch-service-worker-preload-download.https-expected.txt: Added.
     19        * http/wpt/service-workers/fetch-service-worker-preload-download.https.html: Added.
     20        * http/wpt/service-workers/fetch-service-worker-preload-worker.js:
     21        * http/wpt/service-workers/resources/fetch-service-worker-preload-script.py:
     22        * platform/ios/http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https-expected.txt: Added.
     23        * platform/ios/http/wpt/service-workers/fetch-service-worker-preload-download.https-expected.txt: Added.
     24
    1252021-12-13  Martin Robinson  <mrobinson@webkit.org>
    226
  • trunk/LayoutTests/http/tests/workers/service/resources/service-worker-download-worker.js

    r228551 r286944  
    11self.addEventListener("fetch", (event) => {
     2    if (event.request.url.includes("download-body")) {
     3        const response = new Response("a download body", {"headers" : [["Content-Type", "application/binary"]]});
     4        event.respondWith(response);
     5        return;
     6    }
     7    if (event.request.url.includes("download-stream")) {
     8        const stream = new ReadableStream({
     9            start: (controller) => {
     10                const encoder = new TextEncoder();
     11                controller.enqueue(encoder.encode("a first chunk, "));
     12                setTimeout(() => { controller.enqueue(encoder.encode("then a second chunk")); }, 100);
     13                setTimeout(() => { controller.close(); }, 200);
     14            }
     15        });
     16        const response = new Response(stream, {"headers" : [["Content-Type", "application/binary"]]});
     17        event.respondWith(response);
     18        return;
     19    }
    220    event.respondWith(fetch(event.request.url));
    321});
  • trunk/LayoutTests/http/tests/workers/service/service-worker-download-body.https.html

    r286943 r286944  
    88  testRunner.dumpAsText();
    99  testRunner.setShouldLogDownloadCallbacks(true);
     10  testRunner.setShouldLogDownloadSize(true);
    1011  testRunner.waitUntilDownloadFinished();
    1112  testRunner.setShouldDownloadUndisplayableMIMETypes(true);
     
    1516{
    1617    await interceptedFrame("resources/service-worker-download-worker.js", "/workers/service/resources/");
    17     window.location = "/workers/service/resources/download-binary.py";
     18    window.location = "/workers/service/resources/download-body";
    1819}
    1920doTest();
  • trunk/LayoutTests/http/tests/workers/service/service-worker-download-stream.https.html

    r286943 r286944  
    88  testRunner.dumpAsText();
    99  testRunner.setShouldLogDownloadCallbacks(true);
     10  testRunner.setShouldLogDownloadSize(true);
    1011  testRunner.waitUntilDownloadFinished();
    1112  testRunner.setShouldDownloadUndisplayableMIMETypes(true);
     
    1516{
    1617    await interceptedFrame("resources/service-worker-download-worker.js", "/workers/service/resources/");
    17     window.location = "/workers/service/resources/download-binary.py";
     18    window.location = "/workers/service/resources/download-stream";
    1819}
    1920doTest();
  • trunk/LayoutTests/http/tests/workers/service/service-worker-download.https-expected.txt

    r274768 r286944  
    11Download started.
    22Downloading URL with suggested filename "download-binary.py"
     3Download size: 9.
    34Download completed.
    45
  • trunk/LayoutTests/http/tests/workers/service/service-worker-download.https.html

    r274768 r286944  
    88  testRunner.dumpAsText();
    99  testRunner.setShouldLogDownloadCallbacks(true);
     10  testRunner.setShouldLogDownloadSize(true);
    1011  testRunner.waitUntilDownloadFinished();
    1112  testRunner.setShouldDownloadUndisplayableMIMETypes(true);
  • trunk/LayoutTests/http/wpt/service-workers/fetch-service-worker-preload-worker.js

    r286361 r286944  
    2424
    2525self.addEventListener('fetch', (event) => {
     26    if (event.request.url.includes("no-fetch-event-handling"))
     27        return;
    2628    event.respondWith(fetch(event.request));
    2729});
  • trunk/LayoutTests/http/wpt/service-workers/resources/fetch-service-worker-preload-script.py

    r286361 r286944  
    3232        value = b"nothing"
    3333    response.headers.set(b"Cache-Control", b"no-cache")
     34
     35    if b"download" in request.GET:
     36        response.headers.set(b"Content-Type", b"text/vcard")
     37        return value.decode()
     38
    3439    response.headers.set(b"Content-Type", b"text/html")
    3540    return "<html><body><script>window.value = '%s';</script></body></html>" % value.decode()
  • trunk/Source/WebCore/ChangeLog

    r286943 r286944  
     12021-12-13  Youenn Fablet  <youenn@apple.com>
     2
     3        Fix ServiceWorker downloads
     4        https://bugs.webkit.org/show_bug.cgi?id=202142
     5        <rdar://problem/55721934>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add API to ask the fetch task to become a download.
     10
     11        Tests: http/tests/workers/service/service-worker-download-body.https.html
     12               http/tests/workers/service/service-worker-download-stream.https.html
     13               http/wpt/service-workers/fetch-service-worker-preload-download-through-direct-preload.https.html
     14               http/wpt/service-workers/fetch-service-worker-preload-download.https.html
     15
     16        * workers/service/context/ServiceWorkerFetch.h:
     17        * workers/service/context/ServiceWorkerThreadProxy.cpp:
     18        * workers/service/context/ServiceWorkerThreadProxy.h:
     19
    1202021-12-13  Kimmo Kinnunen  <kkinnunen@apple.com>
    221
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerFetch.h

    r286419 r286944  
    5959    virtual void cancel() = 0;
    6060    virtual void continueDidReceiveResponse() = 0;
     61    virtual void convertFetchToDownload() = 0;
    6162};
    6263
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.cpp

    r286419 r286944  
    243243}
    244244
     245
     246void ServiceWorkerThreadProxy::convertFetchToDownload(SWServerConnectionIdentifier connectionIdentifier, FetchIdentifier fetchIdentifier)
     247{
     248    RELEASE_LOG(ServiceWorker, "ServiceWorkerThreadProxy::convertFetchToDownload %llu", fetchIdentifier.toUInt64());
     249
     250    auto client = m_ongoingFetchTasks.take(std::make_pair(connectionIdentifier, fetchIdentifier));
     251    if (!client)
     252        return;
     253
     254    postTaskForModeToWorkerOrWorkletGlobalScope([client = Ref { *client }] (auto&) {
     255        client->convertFetchToDownload();
     256    }, WorkerRunLoop::defaultMode());
     257}
     258
    245259void ServiceWorkerThreadProxy::continueDidReceiveFetchResponse(SWServerConnectionIdentifier connectionIdentifier, FetchIdentifier fetchIdentifier)
    246260{
  • trunk/Source/WebCore/workers/service/context/ServiceWorkerThreadProxy.h

    r286419 r286944  
    7878    WEBCORE_EXPORT void startFetch(SWServerConnectionIdentifier, FetchIdentifier, Ref<ServiceWorkerFetch::Client>&&, std::optional<ScriptExecutionContextIdentifier>&&, ResourceRequest&&, String&& referrer, FetchOptions&&, bool isServiceWorkerNavigationPreloadEnabled);
    7979    WEBCORE_EXPORT void cancelFetch(SWServerConnectionIdentifier, FetchIdentifier);
     80    WEBCORE_EXPORT void convertFetchToDownload(SWServerConnectionIdentifier, FetchIdentifier);
    8081    WEBCORE_EXPORT void continueDidReceiveFetchResponse(SWServerConnectionIdentifier, FetchIdentifier);
    8182    WEBCORE_EXPORT void removeFetch(SWServerConnectionIdentifier, FetchIdentifier);
  • trunk/Source/WebKit/CMakeLists.txt

    r286601 r286944  
    198198    NetworkProcess/NetworkSocketStream
    199199
     200    NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask
    200201    NetworkProcess/ServiceWorker/ServiceWorkerFetchTask
    201202    NetworkProcess/ServiceWorker/WebSWServerConnection
  • trunk/Source/WebKit/ChangeLog

    r286943 r286944  
     12021-12-13  Youenn Fablet  <youenn@apple.com>
     2
     3        Fix ServiceWorker downloads
     4        https://bugs.webkit.org/show_bug.cgi?id=202142
     5        <rdar://problem/55721934>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add ServiceWorkerDownloadTask class as a NetworkDataTask whose purpose is to download the content of a response given from service worker.
     10        Add a way to convert ServiceWorkerFetchTask into downloads:
     11        - If a preload is ongoing and can be used for navigation, use this preload as the download NetworkLoad.
     12        - If a preload does not exist, create a ServiceWorkerDownloadTask and a corresponding NetworkLoad to start downloading the service worker response data.
     13        When creating a ServiceWorkerDownloadTask, the WebServiceWorkerFetchTaskClient will be notified to start sending response data using ServiceWorkerDownloadTask
     14        instead of ServiceWorkerFetchTask messages. This allows cancelling the ServiceWorkerFetchTask without any issue.
     15
     16        Note that the service worker lifetime is not augmented: if the service worker exits due to all its clients being closed, the download will fail.
     17
     18        Increase unified build files to 112.
     19
     20        * CMakeLists.txt:
     21        * DerivedSources-input.xcfilelist:
     22        * DerivedSources-output.xcfilelist:
     23        * DerivedSources.make:
     24        * NetworkProcess/NetworkConnectionToWebProcess.cpp:
     25        * NetworkProcess/NetworkLoad.cpp:
     26        * NetworkProcess/NetworkLoad.h:
     27        * NetworkProcess/NetworkResourceLoader.cpp:
     28        * NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.cpp: Added.
     29        * NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.h: Added.
     30        * NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.messages.in: Added.
     31        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp:
     32        * NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h:
     33        * NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp:
     34        * NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.h:
     35        * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp:
     36        * NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h:
     37        * NetworkProcess/storage/NetworkStorageManager.cpp:
     38        * Scripts/generate-unified-sources.sh:
     39        * Scripts/webkit/messages.py:
     40        * Scripts/webkit/tests/TestWithCVPixelBufferMessageReceiver.cpp:
     41        (WebKit::TestWithCVPixelBuffer::didReceiveMessage):
     42        * Scripts/webkit/tests/TestWithIfMessageMessageReceiver.cpp:
     43        (WebKit::TestWithIfMessage::didReceiveMessage):
     44        * Scripts/webkit/tests/TestWithImageDataMessageReceiver.cpp:
     45        (WebKit::TestWithImageData::didReceiveMessage):
     46        * Scripts/webkit/tests/TestWithLegacyReceiverMessageReceiver.cpp:
     47        (WebKit::TestWithLegacyReceiver::didReceiveTestWithLegacyReceiverMessage):
     48        * Scripts/webkit/tests/TestWithSemaphoreMessageReceiver.cpp:
     49        (WebKit::TestWithSemaphore::didReceiveMessage):
     50        * Scripts/webkit/tests/TestWithStreamBufferMessageReceiver.cpp:
     51        (WebKit::TestWithStreamBuffer::didReceiveMessage):
     52        * Scripts/webkit/tests/TestWithStreamMessageReceiver.cpp:
     53        (WebKit::TestWithStream::didReceiveStreamMessage):
     54        * Scripts/webkit/tests/TestWithoutAttributesMessageReceiver.cpp:
     55        (WebKit::TestWithoutAttributes::didReceiveMessage):
     56        * UIProcess/WebPageProxy.cpp:
     57        (WebKit::WebPageProxy::receivedPolicyDecision):
     58        * UIProcess/WebProcessPool.cpp:
     59        (WebKit::WebProcessPool::download):
     60        (WebKit::WebProcessPool::createDownloadProxy):
     61        * Sources.txt:
     62        * UnifiedSources-output.xcfilelist:
     63        * WebKit.xcodeproj/project.pbxproj:
     64        * WebProcess/Storage/WebSWContextManagerConnection.cpp:
     65        * WebProcess/Storage/WebSWContextManagerConnection.h:
     66        * WebProcess/Storage/WebSWContextManagerConnection.messages.in:
     67        * WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp:
     68        * WebProcess/Storage/WebServiceWorkerFetchTaskClient.h:
     69
    1702021-12-13  Kimmo Kinnunen  <kkinnunen@apple.com>
    271
  • trunk/Source/WebKit/DerivedSources-input.xcfilelist

    r286601 r286944  
    8888$(PROJECT_DIR)/NetworkProcess/NetworkSocketChannel.messages.in
    8989$(PROJECT_DIR)/NetworkProcess/NetworkSocketStream.messages.in
     90$(PROJECT_DIR)/NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.messages.in
    9091$(PROJECT_DIR)/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.messages.in
    9192$(PROJECT_DIR)/NetworkProcess/ServiceWorker/WebSWServerConnection.messages.in
  • trunk/Source/WebKit/DerivedSources-output.xcfilelist

    r286601 r286944  
    397397$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/SecItemShimProxyMessages.h
    398398$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/SecItemShimProxyMessagesReplies.h
     399$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/ServiceWorkerDownloadTaskMessageReceiver.cpp
     400$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/ServiceWorkerDownloadTaskMessages.h
     401$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/ServiceWorkerDownloadTaskMessagesReplies.h
    399402$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/ServiceWorkerFetchTaskMessageReceiver.cpp
    400403$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/ServiceWorkerFetchTaskMessages.h
  • trunk/Source/WebKit/DerivedSources.make

    r286601 r286944  
    133133        NetworkProcess/NetworkSocketChannel \
    134134        NetworkProcess/ServiceWorker/WebSWServerConnection \
     135        NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask \
    135136        NetworkProcess/ServiceWorker/ServiceWorkerFetchTask \
    136137        NetworkProcess/ServiceWorker/WebSWServerToContextConnection \
  • trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp

    r286012 r286944  
    696696    RELEASE_ASSERT(RunLoop::isMain());
    697697
    698     // In case a response is served from service worker, we do not have yet the ability to convert the load.
    699     if (!mainResourceLoadIdentifier || response.source() == ResourceResponse::Source::ServiceWorker) {
     698    if (!mainResourceLoadIdentifier) {
    700699        m_networkProcess->downloadManager().startDownload(m_sessionID, downloadID, request, isNavigatingToAppBoundDomain);
    701700        return;
  • trunk/Source/WebKit/NetworkProcess/NetworkLoad.cpp

    r284301 r286944  
    5757}
    5858
     59NetworkLoad::NetworkLoad(NetworkLoadClient& client, NetworkSession& networkSession, const Function<RefPtr<NetworkDataTask>(NetworkDataTaskClient&)>& createTask)
     60    : m_client(client)
     61    , m_networkProcess(networkSession.networkProcess())
     62    , m_task(createTask(*this))
     63{
     64}
     65
    5966void NetworkLoad::start()
    6067{
  • trunk/Source/WebKit/NetworkProcess/NetworkLoad.h

    r284301 r286944  
    4747public:
    4848    NetworkLoad(NetworkLoadClient&, WebCore::BlobRegistryImpl*, NetworkLoadParameters&&, NetworkSession&);
     49    NetworkLoad(NetworkLoadClient&, NetworkSession&, const Function<RefPtr<NetworkDataTask>(NetworkDataTaskClient&)>&);
    4950    ~NetworkLoad();
    5051
  • trunk/Source/WebKit/NetworkProcess/NetworkResourceLoader.cpp

    r286937 r286944  
    485485    LOADER_RELEASE_LOG("convertToDownload: (downloadID=%" PRIu64 ", hasNetworkLoad=%d, hasResponseCompletionHandler=%d)", downloadID.toUInt64(), !!m_networkLoad, !!m_responseCompletionHandler);
    486486
     487#if ENABLE(SERVICE_WORKER)
     488    if (m_serviceWorkerFetchTask && m_serviceWorkerFetchTask->convertToDownload(m_connection->networkProcess().downloadManager(), downloadID, request, response))
     489        return;
     490#endif
     491
    487492    // This can happen if the resource came from the disk cache.
    488493    if (!m_networkLoad) {
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp

    r286774 r286944  
    3232#include "FormDataReference.h"
    3333#include "Logging.h"
     34#include "NetworkLoad.h"
    3435#include "NetworkProcess.h"
    3536#include "NetworkResourceLoader.h"
     
    303304void ServiceWorkerFetchTask::cancelFromClient()
    304305{
    305     SWFETCH_RELEASE_LOG("cancelFromClient:");
     306    SWFETCH_RELEASE_LOG("cancelFromClient: isDone=%d", m_isDone);
     307    if (m_isDone)
     308        return;
     309
    306310    sendToServiceWorker(Messages::WebSWContextManagerConnection::CancelFetch { m_serverConnectionIdentifier, m_serviceWorkerIdentifier, m_fetchIdentifier });
    307311}
     
    419423}
    420424
     425bool ServiceWorkerFetchTask::convertToDownload(DownloadManager& manager, DownloadID downloadID, const ResourceRequest& request, const ResourceResponse& response)
     426{
     427    if (m_preloader  && !m_preloader->isServiceWorkerNavigationPreloadEnabled())
     428        return m_preloader->convertToDownload(manager, downloadID, request, response);
     429
     430    auto* session = this->session();
     431    if (!session || !m_serviceWorkerConnection)
     432        return false;
     433
     434    m_isDone = true;
     435
     436    // FIXME: We might want to keep the service worker alive until the download ends.
     437    RefPtr<ServiceWorkerDownloadTask> serviceWorkerDownloadTask;
     438    auto serviceWorkerDownloadLoad = makeUnique<NetworkLoad>(m_loader, *session, [&](auto& client) {
     439        serviceWorkerDownloadTask =  ServiceWorkerDownloadTask::create(*session, client, *m_serviceWorkerConnection, m_serviceWorkerIdentifier, m_serverConnectionIdentifier, m_fetchIdentifier, request, downloadID);
     440        return serviceWorkerDownloadTask.copyRef();
     441    });
     442
     443    ResponseCompletionHandler completionHandler = [serviceWorkerDownloadTask = WTFMove(serviceWorkerDownloadTask)](auto policy) {
     444        if (policy != PolicyAction::Download) {
     445            serviceWorkerDownloadTask->stop();
     446            return;
     447        }
     448        serviceWorkerDownloadTask->start();
     449    };
     450
     451    manager.convertNetworkLoadToDownload(downloadID, WTFMove(serviceWorkerDownloadLoad), WTFMove(completionHandler), { }, request, response);
     452    return true;
     453}
     454
    421455} // namespace WebKit
    422456
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.h

    r286361 r286944  
    2929
    3030#include "DataReference.h"
     31#include "DownloadID.h"
    3132#include <WebCore/FetchIdentifier.h>
    3233#include <WebCore/ResourceRequest.h>
     
    5556
    5657namespace WebKit {
     58class DownloadManager;
    5759class NetworkResourceLoader;
    5860class NetworkSession;
     
    8587    void cannotHandle();
    8688    void contextClosed();
     89
     90    bool convertToDownload(DownloadManager&, DownloadID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
    8791
    8892private:
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp

    r286937 r286944  
    2929#if ENABLE(SERVICE_WORKER)
    3030
     31#include "DownloadManager.h"
    3132#include "Logging.h"
    3233#include "NetworkCache.h"
     
    243244}
    244245
     246bool ServiceWorkerNavigationPreloader::convertToDownload(DownloadManager& manager, DownloadID downloadID, const WebCore::ResourceRequest& request, const WebCore::ResourceResponse& response)
     247{
     248    if (!m_networkLoad)
     249        return false;
     250
     251    manager.convertNetworkLoadToDownload(downloadID, std::exchange(m_networkLoad, nullptr), WTFMove(m_responseCompletionHandler), { }, request, response);
     252    return true;
     253}
     254
    245255} // namespace WebKit
    246256
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.h

    r286937 r286944  
    2828#if ENABLE(SERVICE_WORKER)
    2929
     30#include "DownloadID.h"
    3031#include "NetworkCacheEntry.h"
    3132#include "NetworkLoadClient.h"
     
    4041namespace WebKit {
    4142
     43class DownloadManager;
    4244class NetworkLoad;
    4345class NetworkSession;
     
    6062    const WebCore::NetworkLoadMetrics& networkLoadMetrics() const { return m_networkLoadMetrics; }
    6163    bool isServiceWorkerNavigationPreloadEnabled() const { return m_state.enabled; }
     64
     65    bool convertToDownload(DownloadManager&, DownloadID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
    6266
    6367private:
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.cpp

    r286012 r286944  
    3434#include "NetworkProcess.h"
    3535#include "NetworkProcessProxyMessages.h"
     36#include "ServiceWorkerDownloadTaskMessages.h"
    3637#include "ServiceWorkerFetchTask.h"
    3738#include "ServiceWorkerFetchTaskMessages.h"
     
    5960    for (auto& fetch : fetches.values())
    6061        fetch->contextClosed();
     62
     63    auto downloads = WTFMove(m_ongoingDownloads);
     64    for (auto& download : downloads.values())
     65        download->contextClosed();
    6166
    6267    if (m_server && m_server->contextConnectionForRegistrableDomain(registrableDomain()) == this)
     
    198203}
    199204
     205void WebSWServerToContextConnection::registerDownload(ServiceWorkerDownloadTask& task)
     206{
     207    ASSERT(!m_ongoingDownloads.contains(task.fetchIdentifier()));
     208    m_ongoingDownloads.add(task.fetchIdentifier(), task);
     209    m_connection.connection().addThreadMessageReceiver(Messages::ServiceWorkerDownloadTask::messageReceiverName(), &task, task.fetchIdentifier().toUInt64());
     210}
     211
     212void WebSWServerToContextConnection::unregisterDownload(ServiceWorkerDownloadTask& task)
     213{
     214    m_ongoingDownloads.remove(task.fetchIdentifier());
     215    m_connection.connection().removeThreadMessageReceiver(Messages::ServiceWorkerDownloadTask::messageReceiverName(), task.fetchIdentifier().toUInt64());
     216}
     217
    200218WebCore::ProcessIdentifier WebSWServerToContextConnection::webProcessIdentifier() const
    201219{
  • trunk/Source/WebKit/NetworkProcess/ServiceWorker/WebSWServerToContextConnection.h

    r286012 r286944  
    3030#include "MessageReceiver.h"
    3131#include "MessageSender.h"
     32#include "ServiceWorkerDownloadTask.h"
    3233#include "ServiceWorkerFetchTask.h"
    3334#include "WebPageProxyIdentifier.h"
     
    7576    void registerFetch(ServiceWorkerFetchTask&);
    7677    void unregisterFetch(ServiceWorkerFetchTask&);
     78    void registerDownload(ServiceWorkerDownloadTask&);
     79    void unregisterDownload(ServiceWorkerDownloadTask&);
    7780
    7881    WebCore::ProcessIdentifier webProcessIdentifier() const;
     82    NetworkProcess& networkProcess() { return m_connection.networkProcess(); }
    7983
    8084private:
     
    104108    WeakPtr<WebCore::SWServer> m_server;
    105109    HashMap<WebCore::FetchIdentifier, WeakPtr<ServiceWorkerFetchTask>> m_ongoingFetches;
     110    HashMap<WebCore::FetchIdentifier, WeakPtr<ServiceWorkerDownloadTask>> m_ongoingDownloads;
    106111    bool m_isThrottleable { true };
    107112    WebPageProxyIdentifier m_webPageProxyID;
  • trunk/Source/WebKit/NetworkProcess/storage/LocalStorageManager.h

    r286936 r286944  
    2626#pragma once
    2727
     28#include "Connection.h"
    2829#include "StorageAreaIdentifier.h"
     30#include <wtf/WorkQueue.h>
    2931
    3032namespace WebCore {
  • trunk/Source/WebKit/Scripts/generate-unified-sources.sh

    r286936 r286944  
    1515fi
    1616
    17 UnifiedSourceCppFileCount=112
     17UnifiedSourceCppFileCount=115
    1818UnifiedSourceMmFileCount=80
    1919
  • trunk/Source/WebKit/Scripts/webkit/messages.py

    r286825 r286944  
    11271127            result.append('        return;\n')
    11281128            result.append('#endif // ENABLE(IPC_TESTING_API)\n')
    1129             result.append('    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled stream message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());\n')
     1129            result.append('    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled stream message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());\n')
    11301130        result.append('}\n')
    11311131    elif async_messages or receiver.has_attribute(WANTS_DISPATCH_MESSAGE_ATTRIBUTE) or receiver.has_attribute(WANTS_ASYNC_DISPATCH_MESSAGE_ATTRIBUTE):
     
    11501150            result.append('        return;\n')
    11511151            result.append('#endif // ENABLE(IPC_TESTING_API)\n')
    1152             result.append('    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());\n')
     1152            result.append('    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());\n')
    11531153        result.append('}\n')
    11541154
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithCVPixelBufferMessageReceiver.cpp

    r286005 r286944  
    5454        return;
    5555#endif // ENABLE(IPC_TESTING_API)
    56     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     56    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    5757}
    5858
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithIfMessageMessageReceiver.cpp

    r282755 r286944  
    5555        return;
    5656#endif // ENABLE(IPC_TESTING_API)
    57     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     57    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    5858}
    5959
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithImageDataMessageReceiver.cpp

    r282755 r286944  
    4747        return;
    4848#endif // ENABLE(IPC_TESTING_API)
    49     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     49    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    5050}
    5151
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithLegacyReceiverMessageReceiver.cpp

    r283702 r286944  
    136136        return;
    137137#endif // ENABLE(IPC_TESTING_API)
    138     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     138    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    139139}
    140140
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithSemaphoreMessageReceiver.cpp

    r282755 r286944  
    4444        return;
    4545#endif // ENABLE(IPC_TESTING_API)
    46     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     46    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    4747}
    4848
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithStreamBufferMessageReceiver.cpp

    r282755 r286944  
    4444        return;
    4545#endif // ENABLE(IPC_TESTING_API)
    46     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     46    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    4747}
    4848
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithStreamMessageReceiver.cpp

    r282115 r286944  
    6161        return;
    6262#endif // ENABLE(IPC_TESTING_API)
    63     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled stream message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     63    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled stream message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    6464}
    6565
  • trunk/Source/WebKit/Scripts/webkit/tests/TestWithoutAttributesMessageReceiver.cpp

    r283702 r286944  
    136136        return;
    137137#endif // ENABLE(IPC_TESTING_API)
    138     ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, description(decoder.messageName()), decoder.destinationID());
     138    ASSERT_NOT_REACHED_WITH_MESSAGE("Unhandled message %s to %" PRIu64, IPC::description(decoder.messageName()), decoder.destinationID());
    139139}
    140140
  • trunk/Source/WebKit/Sources.txt

    r286936 r286944  
    134134NetworkProcess/PrivateClickMeasurement/PrivateClickMeasurementManagerProxy.cpp
    135135
    136 NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp @no-unify
     136NetworkProcess/ServiceWorker/ServiceWorkerDownloadTask.cpp
     137NetworkProcess/ServiceWorker/ServiceWorkerFetchTask.cpp
    137138NetworkProcess/ServiceWorker/ServiceWorkerNavigationPreloader.cpp
    138139NetworkProcess/ServiceWorker/ServiceWorkerSoftUpdateLoader.cpp
     
    881882RemoteTextureViewMessageReceiver.cpp
    882883RemoteWebLockRegistryMessageReceiver.cpp
     884ServiceWorkerDownloadTaskMessageReceiver.cpp
    883885WebBroadcastChannelRegistryMessageReceiver.cpp
    884886WebLockRegistryProxyMessageReceiver.cpp
  • trunk/Source/WebKit/UnifiedSources-output.xcfilelist

    r286936 r286944  
    1919$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource111.cpp
    2020$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource112.cpp
     21$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource113.cpp
     22$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource114.cpp
     23$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource115.cpp
    2124$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource12-mm.mm
    2225$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit/unified-sources/UnifiedSource12.cpp
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r286943 r286944  
    396396                1CAECB6527465AE400AB78D0 /* UnifiedSource109.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CAECB5D27465AE300AB78D0 /* UnifiedSource109.cpp */; };
    397397                1CAECB6627465AE400AB78D0 /* UnifiedSource111.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CAECB5E27465AE300AB78D0 /* UnifiedSource111.cpp */; };
     398                3CAECB6627465AE400AB78D0 /* UnifiedSource113.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3CAECB5E27465AE300AB78D0 /* UnifiedSource113.cpp */; };
     399                4CAECB6627465AE400AB78D0 /* UnifiedSource114.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CAECB5E27465AE300AB78D0 /* UnifiedSource114.cpp */; };
     400                5CAECB6627465AE400AB78D0 /* UnifiedSource115.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5CAECB5E27465AE300AB78D0 /* UnifiedSource115.cpp */; };
    398401                1CAECB6727465AE400AB78D0 /* UnifiedSource108.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CAECB5F27465AE300AB78D0 /* UnifiedSource108.cpp */; };
    399402                1CAECB6827465AE400AB78D0 /* UnifiedSource110.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1CAECB6027465AE300AB78D0 /* UnifiedSource110.cpp */; };
     
    882885                41DC459C1E3DBB2800B11F51 /* LibWebRTCSocketClient.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DC459A1E3DBB2400B11F51 /* LibWebRTCSocketClient.h */; };
    883886                41DD72AB2682167300A90C71 /* NWSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 41DD72AA2682167300A90C71 /* NWSPI.h */; };
    884                 41DE7C6C22278F1E00532B65 /* ServiceWorkerFetchTask.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41518536222704F6005430C6 /* ServiceWorkerFetchTask.cpp */; };
    885887                41E0A7CB23B645CD00561060 /* WebSocketChannel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 417915AC2256BB7400D6F97E /* WebSocketChannel.cpp */; };
    886888                41E242E026E0C908009A8C64 /* NetworkRTCUtilitiesCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41E242DF26E0C904009A8C64 /* NetworkRTCUtilitiesCocoa.mm */; };
     
    32173219                1CAECB5D27465AE300AB78D0 /* UnifiedSource109.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource109.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource109.cpp"; sourceTree = BUILT_PRODUCTS_DIR; };
    32183220                1CAECB5E27465AE300AB78D0 /* UnifiedSource111.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource111.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource111.cpp"; sourceTree = BUILT_PRODUCTS_DIR; };
     3221                3CAECB5E27465AE300AB78D0 /* UnifiedSource113.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource113.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource113.cpp"; sourceTree = BUILT_PRODUCTS_DIR; };
     3222                4CAECB5E27465AE300AB78D0 /* UnifiedSource114.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource114.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource114.cpp"; sourceTree = BUILT_PRODUCTS_DIR; };
     3223                5CAECB5E27465AE300AB78D0 /* UnifiedSource115.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource115.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource115.cpp"; sourceTree = BUILT_PRODUCTS_DIR; };
    32193224                1CAECB5F27465AE300AB78D0 /* UnifiedSource108.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource108.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource108.cpp"; sourceTree = BUILT_PRODUCTS_DIR; };
    32203225                1CAECB6027465AE300AB78D0 /* UnifiedSource110.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = UnifiedSource110.cpp; path = "DerivedSources/WebKit/unified-sources/UnifiedSource110.cpp"; sourceTree = BUILT_PRODUCTS_DIR; };
     
    41894194                41FCD6BE23CE044000C62567 /* RemoteSampleBufferDisplayLayerManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteSampleBufferDisplayLayerManager.cpp; sourceTree = "<group>"; };
    41904195                41FCD6BF23CE044000C62567 /* RemoteSampleBufferDisplayLayerManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteSampleBufferDisplayLayerManager.h; sourceTree = "<group>"; };
     4196                41FFD2DA275A560B00501BBF /* ServiceWorkerDownloadTask.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ServiceWorkerDownloadTask.cpp; sourceTree = "<group>"; };
     4197                41FFD2DB275A560C00501BBF /* ServiceWorkerDownloadTask.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ServiceWorkerDownloadTask.h; sourceTree = "<group>"; };
     4198                41FFD2DC275A6A9400501BBF /* ServiceWorkerDownloadTask.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = ServiceWorkerDownloadTask.messages.in; sourceTree = "<group>"; };
    41914199                4450AEBF1DC3FAE5009943F2 /* SharedMemoryCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SharedMemoryCocoa.cpp; sourceTree = "<group>"; };
    41924200                4459984122833E6000E61373 /* SyntheticEditingCommandType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SyntheticEditingCommandType.h; sourceTree = "<group>"; };
     
    82578265                                1CAECB5E27465AE300AB78D0 /* UnifiedSource111.cpp */,
    82588266                                93E799D12760AA5A0074008A /* UnifiedSource112.cpp */,
     8267                                3CAECB5E27465AE300AB78D0 /* UnifiedSource113.cpp */,
     8268                                4CAECB5E27465AE300AB78D0 /* UnifiedSource114.cpp */,
     8269                                5CAECB5E27465AE300AB78D0 /* UnifiedSource115.cpp */,
    82598270                        );
    82608271                        name = "unified-sources";
     
    1042210433                        isa = PBXGroup;
    1042310434                        children = (
     10435                                41FFD2DA275A560B00501BBF /* ServiceWorkerDownloadTask.cpp */,
     10436                                41FFD2DB275A560C00501BBF /* ServiceWorkerDownloadTask.h */,
     10437                                41FFD2DC275A6A9400501BBF /* ServiceWorkerDownloadTask.messages.in */,
    1042410438                                41518536222704F6005430C6 /* ServiceWorkerFetchTask.cpp */,
    1042510439                                41518535222704F5005430C6 /* ServiceWorkerFetchTask.h */,
     
    1533215346                                7BCF70DE2615D06E00E4FB70 /* ScopedRenderingResourcesRequestCocoa.mm in Sources */,
    1533315347                                E18E6917169B667B009B6670 /* SecItemShimProxyMessageReceiver.cpp in Sources */,
    15334                                 41DE7C6C22278F1E00532B65 /* ServiceWorkerFetchTask.cpp in Sources */,
    1533515348                                2D92A787212B6AB100F493FD /* ShareableBitmap.cpp in Sources */,
    1533615349                                2DC18FEBF337B9671C88E3CD /* SharedBufferCopy.cpp in Sources */,
     
    1554415557                                1CAECB6627465AE400AB78D0 /* UnifiedSource111.cpp in Sources */,
    1554515558                                93E799D22760AA5B0074008A /* UnifiedSource112.cpp in Sources */,
     15559                                3CAECB6627465AE400AB78D0 /* UnifiedSource113.cpp in Sources */,
     15560                                4CAECB6627465AE400AB78D0 /* UnifiedSource114.cpp in Sources */,
     15561                                5CAECB6627465AE400AB78D0 /* UnifiedSource115.cpp in Sources */,
    1554615562                                E38A1FC023A551BF00D2374F /* UserInterfaceIdiom.mm in Sources */,
    1554715563                                CD491B0D1E732E4D00009066 /* UserMediaCaptureManagerMessageReceiver.cpp in Sources */,
  • trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.cpp

    r286656 r286944  
    394394}
    395395
     396void WebSWContextManagerConnection::convertFetchToDownload(SWServerConnectionIdentifier serverConnectionIdentifier, ServiceWorkerIdentifier serviceWorkerIdentifier, FetchIdentifier fetchIdentifier)
     397{
     398    if (auto* serviceWorkerThreadProxy = SWContextManager::singleton().serviceWorkerThreadProxy(serviceWorkerIdentifier))
     399        serviceWorkerThreadProxy->convertFetchToDownload(serverConnectionIdentifier, fetchIdentifier);
     400}
     401
    396402void WebSWContextManagerConnection::didFailHeartBeatCheck(ServiceWorkerIdentifier serviceWorkerIdentifier)
    397403{
  • trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.h

    r286419 r286944  
    107107    void close();
    108108    void setThrottleState(bool isThrottleable);
     109    void convertFetchToDownload(WebCore::SWServerConnectionIdentifier, WebCore::ServiceWorkerIdentifier, WebCore::FetchIdentifier);
     110    void cancelFetchDownload(WebCore::ServiceWorkerIdentifier, WebCore::FetchIdentifier);
    109111
    110112    Ref<IPC::Connection> m_connectionToNetworkProcess;
  • trunk/Source/WebKit/WebProcess/Storage/WebSWContextManagerConnection.messages.in

    r286419 r286944  
    4444    Close()
    4545    SetThrottleState(bool isThrottleable)
     46
     47    ConvertFetchToDownload(WebCore::SWServerConnectionIdentifier serverConnectionIdentifier, WebCore::ServiceWorkerIdentifier serviceWorkerIdentifier, WebCore::FetchIdentifier identifier)
    4648}
    4749
  • trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.cpp

    r284095 r286944  
    3131#include "FormDataReference.h"
    3232#include "Logging.h"
     33#include "ServiceWorkerDownloadTaskMessages.h"
    3334#include "ServiceWorkerFetchTaskMessages.h"
    3435#include "SharedBufferDataReference.h"
     
    8586    }
    8687
    87     m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveData { buffer.get(), static_cast<int64_t>(buffer->size()) }, m_fetchIdentifier);
     88    if (m_isDownload)
     89        m_connection->send(Messages::ServiceWorkerDownloadTask::DidReceiveData { buffer.get(), static_cast<int64_t>(buffer->size()) }, m_fetchIdentifier);
     90    else
     91        m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveData { buffer.get(), static_cast<int64_t>(buffer->size()) }, m_fetchIdentifier);
    8892}
    8993
     
    108112    URL blobURL = formData->asBlobURL();
    109113    if (blobURL.isNull()) {
    110         m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveFormData { IPC::FormDataReference { WTFMove(formData) } }, m_fetchIdentifier);
     114        if (m_isDownload)
     115            m_connection->send(Messages::ServiceWorkerDownloadTask::DidReceiveFormData { IPC::FormDataReference { WTFMove(formData) } }, m_fetchIdentifier);
     116        else
     117            m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveFormData { IPC::FormDataReference { WTFMove(formData) } }, m_fetchIdentifier);
    111118        return;
    112119    }
     
    136143        return;
    137144
    138     m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveData { { data, size }, static_cast<int64_t>(size) }, m_fetchIdentifier);
     145    if (m_isDownload)
     146        m_connection->send(Messages::ServiceWorkerDownloadTask::DidReceiveData { { data, size }, static_cast<int64_t>(size) }, m_fetchIdentifier);
     147    else
     148        m_connection->send(Messages::ServiceWorkerFetchTask::DidReceiveData { { data, size }, static_cast<int64_t>(size) }, m_fetchIdentifier);
    139149}
    140150
     
    158168    }
    159169
    160     m_connection->send(Messages::ServiceWorkerFetchTask::DidFail { error }, m_fetchIdentifier);
     170    if (m_isDownload)
     171        m_connection->send(Messages::ServiceWorkerDownloadTask::DidFail { error }, m_fetchIdentifier);
     172    else
     173        m_connection->send(Messages::ServiceWorkerFetchTask::DidFail { error }, m_fetchIdentifier);
    161174
    162175    cleanup();
     
    175188    }
    176189
    177     m_connection->send(Messages::ServiceWorkerFetchTask::DidFinish { }, m_fetchIdentifier);
     190    if (m_isDownload)
     191        m_connection->send(Messages::ServiceWorkerDownloadTask::DidFinish { }, m_fetchIdentifier);
     192    else
     193        m_connection->send(Messages::ServiceWorkerFetchTask::DidFinish { }, m_fetchIdentifier);
    178194
    179195    cleanup();
     
    193209{
    194210    m_connection = nullptr;
     211}
     212
     213void WebServiceWorkerFetchTaskClient::convertFetchToDownload()
     214{
     215    m_isDownload = true;
     216    continueDidReceiveResponse();
    195217}
    196218
  • trunk/Source/WebKit/WebProcess/Storage/WebServiceWorkerFetchTaskClient.h

    r284075 r286944  
    5757    void cancel() final;
    5858    void continueDidReceiveResponse() final;
     59    void convertFetchToDownload() final;
    5960
    6061    void cleanup();
     
    8586    std::variant<std::nullptr_t, Ref<WebCore::SharedBuffer>, Ref<WebCore::FormData>, UniqueRef<WebCore::ResourceError>> m_responseData;
    8687    bool m_didFinish { false };
     88    bool m_isDownload { false };
    8789};
    8890
  • trunk/Tools/ChangeLog

    r286943 r286944  
     12021-12-13  Youenn Fablet  <youenn@apple.com>
     2
     3        Fix ServiceWorker downloads
     4        https://bugs.webkit.org/show_bug.cgi?id=202142
     5        <rdar://problem/55721934>
     6
     7        Reviewed by Alex Christensen.
     8
     9        Add test runner API to log the total download size.
     10        This helps ensuring that service worker loads are correctly downloaded and do not rely on networking.
     11
     12        * WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl:
     13        * WebKitTestRunner/InjectedBundle/TestRunner.cpp:
     14        * WebKitTestRunner/InjectedBundle/TestRunner.h:
     15        * WebKitTestRunner/TestController.cpp:
     16        * WebKitTestRunner/TestController.h:
     17        * WebKitTestRunner/TestInvocation.cpp:
     18
    1192021-12-13  Kimmo Kinnunen  <kkinnunen@apple.com>
    220
  • trunk/Tools/WebKitTestRunner/InjectedBundle/Bindings/TestRunner.idl

    r285089 r286944  
    4040    undefined waitUntilDownloadFinished();
    4141    undefined setShouldLogDownloadCallbacks(boolean value);
     42    undefined setShouldLogDownloadSize(boolean value);
    4243
    4344    const unsigned short RENDER_TREE_SHOW_ALL_LAYERS            = 1;
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.cpp

    r285089 r286944  
    10091009}
    10101010
     1011void TestRunner::setShouldLogDownloadSize(bool value)
     1012{
     1013    postPageMessage("SetShouldLogDownloadSize", value);
     1014}
     1015
    10111016void TestRunner::setAuthenticationUsername(JSStringRef username)
    10121017{
  • trunk/Tools/WebKitTestRunner/InjectedBundle/TestRunner.h

    r285089 r286944  
    216216    bool shouldFinishAfterDownload() const { return m_shouldFinishAfterDownload; }
    217217    void setShouldLogDownloadCallbacks(bool);
     218    void setShouldLogDownloadSize(bool);
    218219
    219220    bool shouldAllowEditing() const { return m_shouldAllowEditing; }
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r285993 r286944  
    147147        TestController::downloadDidReceiveAuthenticationChallenge,
    148148        TestController::decideDestinationWithSuggestedFilename,
    149         nullptr, // didWriteData
     149        TestController::downloadDidWriteData,
    150150        TestController::downloadDidFinish,
    151151        TestController::downloadDidFail
     
    11091109    }
    11101110
     1111    m_downloadTotalBytesWritten = { };
     1112
    11111113    return m_doneResetting;
    11121114}
     
    22382240void TestController::downloadDidFinish(WKDownloadRef)
    22392241{
     2242    if (m_shouldLogDownloadSize)
     2243        m_currentInvocation->outputText(makeString("Download size: ", m_downloadTotalBytesWritten.value_or(0), ".\n"));
    22402244    if (m_shouldLogDownloadCallbacks)
    22412245        m_currentInvocation->outputText("Download completed.\n");
     
    22682272{
    22692273    static_cast<TestController*>(const_cast<void*>(clientInfo))->didReceiveAuthenticationChallenge(nullptr, authenticationChallenge);
     2274}
     2275
     2276void TestController::downloadDidWriteData(long long totalBytesWritten)
     2277{
     2278    if (!m_shouldLogDownloadCallbacks)
     2279        return;
     2280    m_downloadTotalBytesWritten = totalBytesWritten;
     2281}
     2282
     2283void TestController::downloadDidWriteData(WKDownloadRef download, long long bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite, const void* clientInfo)
     2284{
     2285    static_cast<TestController*>(const_cast<void*>(clientInfo))->downloadDidWriteData(totalBytesWritten);
    22702286}
    22712287
  • trunk/Tools/WebKitTestRunner/TestController.h

    r284575 r286944  
    191191    void setShouldLogCanAuthenticateAgainstProtectionSpace(bool shouldLog) { m_shouldLogCanAuthenticateAgainstProtectionSpace = shouldLog; }
    192192    void setShouldLogDownloadCallbacks(bool shouldLog) { m_shouldLogDownloadCallbacks = shouldLog; }
     193    void setShouldLogDownloadSize(bool shouldLog) { m_shouldLogDownloadSize = shouldLog; }
    193194
    194195    bool isCurrentInvocation(TestInvocation* invocation) const { return invocation == m_currentInvocation.get(); }
     
    474475    bool downloadDidReceiveServerRedirectToURL(WKDownloadRef, WKURLRequestRef);
    475476    static void downloadDidReceiveAuthenticationChallenge(WKDownloadRef, WKAuthenticationChallengeRef, const void *clientInfo);
    476    
     477
     478    void downloadDidWriteData(long long totalBytesWritten);
     479    static void downloadDidWriteData(WKDownloadRef, long long bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite, const void* clientInfo);
     480
    477481    static void webProcessDidTerminate(WKPageRef,  WKProcessTerminationReason, const void* clientInfo);
    478482    void webProcessDidTerminate(WKProcessTerminationReason);
     
    664668
    665669    bool m_isMediaKeySystemPermissionGranted { true };
     670
     671    std::optional<long long> m_downloadTotalBytesWritten;
     672    bool m_shouldLogDownloadSize { false };
    666673};
    667674
  • trunk/Tools/WebKitTestRunner/TestInvocation.cpp

    r285168 r286944  
    538538    }
    539539
     540    if (WKStringIsEqualToUTF8CString(messageName, "SetShouldLogDownloadSize")) {
     541        TestController::singleton().setShouldLogDownloadSize(booleanValue(messageBody));
     542        return;
     543    }
     544
    540545    if (WKStringIsEqualToUTF8CString(messageName, "SetAuthenticationUsername")) {
    541546        WKStringRef username = stringValue(messageBody);
Note: See TracChangeset for help on using the changeset viewer.