Changeset 275751 in webkit


Ignore:
Timestamp:
Apr 9, 2021 1:54:34 AM (16 months ago)
Author:
ysuzuki@apple.com
Message:

ServiceWorker should save module scripts
https://bugs.webkit.org/show_bug.cgi?id=224356
<rdar://problem/75634897>

Reviewed by Youenn Fablet.

Source/WebCore:

Test: http/wpt/service-workers/persistent-modules.html

In this patch, we call setScriptResource / scriptResource while loading service-worker module scripts in module loaders,
so that we can ensure that they are saved on the disk.

  • bindings/js/ScriptModuleLoader.cpp:

(WebCore::ScriptModuleLoader::notifyFinished):

  • bindings/js/WorkerModuleScriptLoader.cpp:

(WebCore::WorkerModuleScriptLoader::load):
(WebCore::WorkerModuleScriptLoader::notifyFinished):
(WebCore::WorkerModuleScriptLoader::notifyClientFinished):

  • bindings/js/WorkerModuleScriptLoader.h:

LayoutTests:

  • http/wpt/service-workers/persistent-modules-expected.txt: Added.
  • http/wpt/service-workers/persistent-modules.html: Added.
  • http/wpt/service-workers/resources/persistent-imported-module-script.py: Added.

(main):

  • http/wpt/service-workers/resources/persistent-module-worker.js: Added.
Location:
trunk
Files:
4 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r275748 r275751  
     12021-04-09  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        ServiceWorker should save module scripts
     4        https://bugs.webkit.org/show_bug.cgi?id=224356
     5        <rdar://problem/75634897>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        * http/wpt/service-workers/persistent-modules-expected.txt: Added.
     10        * http/wpt/service-workers/persistent-modules.html: Added.
     11        * http/wpt/service-workers/resources/persistent-imported-module-script.py: Added.
     12        (main):
     13        * http/wpt/service-workers/resources/persistent-module-worker.js: Added.
     14
    1152021-04-08  Jiewen Tan  <jiewen_tan@apple.com>
    216
  • trunk/Source/WebCore/ChangeLog

    r275750 r275751  
     12021-04-09  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        ServiceWorker should save module scripts
     4        https://bugs.webkit.org/show_bug.cgi?id=224356
     5        <rdar://problem/75634897>
     6
     7        Reviewed by Youenn Fablet.
     8
     9        Test: http/wpt/service-workers/persistent-modules.html
     10
     11        In this patch, we call setScriptResource / scriptResource while loading service-worker module scripts in module loaders,
     12        so that we can ensure that they are saved on the disk.
     13
     14        * bindings/js/ScriptModuleLoader.cpp:
     15        (WebCore::ScriptModuleLoader::notifyFinished):
     16        * bindings/js/WorkerModuleScriptLoader.cpp:
     17        (WebCore::WorkerModuleScriptLoader::load):
     18        (WebCore::WorkerModuleScriptLoader::notifyFinished):
     19        (WebCore::WorkerModuleScriptLoader::notifyClientFinished):
     20        * bindings/js/WorkerModuleScriptLoader.h:
     21
    1222021-04-08  Fujii Hironori  <Hironori.Fujii@sony.com>
    223
  • trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp

    r274404 r275751  
    370370                responseURL.setFragmentIdentifier(sourceURL.fragmentIdentifier());
    371371        }
    372 
    373         m_requestURLToResponseURLMap.add(sourceURL.string(), responseURL);
    374372        return responseURL;
    375373    };
     
    409407        }
    410408
    411         canonicalizeAndRegisterResponseURL(cachedScript.response().url(), cachedScript.hasRedirections(), cachedScript.response().source());
     409        URL responseURL = canonicalizeAndRegisterResponseURL(cachedScript.response().url(), cachedScript.hasRedirections(), cachedScript.response().source());
     410        m_requestURLToResponseURLMap.add(sourceURL.string(), WTFMove(responseURL));
    412411        promise->resolveWithCallback([&] (JSDOMGlobalObject& jsGlobalObject) {
    413412            return JSC::JSSourceCode::create(jsGlobalObject.vm(),
     
    416415    } else {
    417416        auto& loader = static_cast<WorkerModuleScriptLoader&>(moduleScriptLoader);
    418         auto& workerScriptLoader = loader.scriptLoader();
    419 
    420         if (workerScriptLoader.failed()) {
     417
     418        if (loader.failed()) {
     419            ASSERT(!loader.retrievedFromServiceWorkerCache());
     420            auto& workerScriptLoader = loader.scriptLoader();
     421            ASSERT(workerScriptLoader.failed());
    421422            if (workerScriptLoader.error().isAccessControl()) {
    422423                rejectToPropagateNetworkError(promise.get(), ModuleFetchFailureKind::WasErrored, "Cross-origin script load denied by Cross-Origin Resource Sharing policy."_s);
     
    433434        }
    434435
    435         if (!MIMETypeRegistry::isSupportedJavaScriptMIMEType(workerScriptLoader.responseMIMEType())) {
     436        if (!MIMETypeRegistry::isSupportedJavaScriptMIMEType(loader.responseMIMEType())) {
    436437            // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-single-module-script
    437438            // The result of extracting a MIME type from response's header list (ignoring parameters) is not a JavaScript MIME type.
    438439            // For historical reasons, fetching a classic script does not include MIME type checking. In contrast, module scripts will fail to load if they are not of a correct MIME type.
    439             promise->reject(TypeError, makeString("'", workerScriptLoader.responseMIMEType(), "' is not a valid JavaScript MIME type."));
    440             return;
    441         }
    442 
    443         if (auto* parameters = loader.parameters()) {
    444             // If this is top-level-module, then we extract referrer-policy and apply to the dependent modules.
    445             if (parameters->isTopLevelModule())
    446                 static_cast<WorkerScriptFetcher&>(loader.scriptFetcher()).setReferrerPolicy(loader.referrerPolicy());
    447         }
    448 
    449         URL responseURL = canonicalizeAndRegisterResponseURL(workerScriptLoader.responseURL(), workerScriptLoader.isRedirected(), workerScriptLoader.responseSource());
     440            promise->reject(TypeError, makeString("'", loader.responseMIMEType(), "' is not a valid JavaScript MIME type."));
     441            return;
     442        }
     443
     444        URL responseURL = loader.responseURL();
     445        if (!loader.retrievedFromServiceWorkerCache()) {
     446            auto& workerScriptLoader = loader.scriptLoader();
     447            if (auto* parameters = loader.parameters()) {
     448                // If this is top-level-module, then we extract referrer-policy and apply to the dependent modules.
     449                if (parameters->isTopLevelModule())
     450                    static_cast<WorkerScriptFetcher&>(loader.scriptFetcher()).setReferrerPolicy(loader.referrerPolicy());
     451            }
     452            responseURL = canonicalizeAndRegisterResponseURL(responseURL, workerScriptLoader.isRedirected(), workerScriptLoader.responseSource());
     453#if ENABLE(SERVICE_WORKER)
     454            if (is<ServiceWorkerGlobalScope>(m_context))
     455                downcast<ServiceWorkerGlobalScope>(m_context).setScriptResource(sourceURL, ServiceWorkerContextData::ImportedScript { loader.script(), responseURL, loader.responseMIMEType() });
     456#endif
     457        }
     458        m_requestURLToResponseURLMap.add(sourceURL.string(), responseURL);
    450459        promise->resolveWithCallback([&] (JSDOMGlobalObject& jsGlobalObject) {
    451460            return JSC::JSSourceCode::create(jsGlobalObject.vm(),
    452                 JSC::SourceCode { ScriptSourceCode { workerScriptLoader.script(), WTFMove(responseURL), { }, JSC::SourceProviderSourceType::Module, loader.scriptFetcher() }.jsSourceCode() });
     461                JSC::SourceCode { ScriptSourceCode { loader.script(), WTFMove(responseURL), { }, JSC::SourceProviderSourceType::Module, loader.scriptFetcher() }.jsSourceCode() });
    453462        });
    454463    }
  • trunk/Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp

    r273203 r275751  
    6262    m_sourceURL = WTFMove(sourceURL);
    6363
     64#if ENABLE(SERVICE_WORKER)
     65    if (is<ServiceWorkerGlobalScope>(context)) {
     66        if (auto* scriptResource = downcast<ServiceWorkerGlobalScope>(context).scriptResource(m_sourceURL)) {
     67            m_script = scriptResource->script;
     68            m_responseURL = scriptResource->responseURL;
     69            m_responseMIMEType = scriptResource->mimeType;
     70            m_retrievedFromServiceWorkerCache = true;
     71            notifyClientFinished();
     72            return true;
     73        }
     74    }
     75#endif
     76
    6477    ResourceRequest request { m_sourceURL };
    6578
     
    95108    ASSERT(m_promise);
    96109
     110    if (m_scriptLoader->failed())
     111        m_failed = true;
     112    else {
     113        m_script = m_scriptLoader->script();
     114        m_responseURL = m_scriptLoader->responseURL();
     115        m_responseMIMEType = m_scriptLoader->responseMIMEType();
     116    }
     117
     118    notifyClientFinished();
     119}
     120
     121void WorkerModuleScriptLoader::notifyClientFinished()
     122{
    97123    auto protectedThis = makeRef(*this);
     124
    98125    if (m_client)
    99126        m_client->notifyFinished(*this, WTFMove(m_sourceURL), m_promise.releaseNonNull());
  • trunk/Source/WebCore/bindings/js/WorkerModuleScriptLoader.h

    r273205 r275751  
    2727
    2828#include "ModuleScriptLoader.h"
     29#include "ScriptBuffer.h"
    2930#include "WorkerScriptFetcher.h"
    3031#include "WorkerScriptLoaderClient.h"
     
    5556    static String taskMode();
    5657    ReferrerPolicy referrerPolicy();
     58    bool failed() const { return m_failed; }
     59    bool retrievedFromServiceWorkerCache() const { return m_retrievedFromServiceWorkerCache; }
     60
     61    const ScriptBuffer& script() { return m_script; }
     62    const URL& responseURL() const { return m_responseURL; }
     63    const String& responseMIMEType() const { return m_responseMIMEType; }
    5764
    5865private:
     
    6269    void notifyFinished() final;
    6370
     71    void notifyClientFinished();
     72
    6473    Ref<WorkerScriptLoader> m_scriptLoader;
    6574    URL m_sourceURL;
     75    ScriptBuffer m_script;
     76    URL m_responseURL;
     77    String m_responseMIMEType;
     78    bool m_failed { false };
     79    bool m_retrievedFromServiceWorkerCache { false };
    6680};
    6781
Note: See TracChangeset for help on using the changeset viewer.