Changeset 275751 in webkit
- Timestamp:
- Apr 9, 2021 1:54:34 AM (16 months ago)
- Location:
- trunk
- Files:
-
- 4 added
- 5 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/http/wpt/service-workers/persistent-modules-expected.txt (added)
-
LayoutTests/http/wpt/service-workers/persistent-modules.html (added)
-
LayoutTests/http/wpt/service-workers/resources/persistent-imported-module-script.py (added)
-
LayoutTests/http/wpt/service-workers/resources/persistent-module-worker.js (added)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/bindings/js/ScriptModuleLoader.cpp (modified) (4 diffs)
-
Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp (modified) (2 diffs)
-
Source/WebCore/bindings/js/WorkerModuleScriptLoader.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r275748 r275751 1 2021-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 1 15 2021-04-08 Jiewen Tan <jiewen_tan@apple.com> 2 16 -
trunk/Source/WebCore/ChangeLog
r275750 r275751 1 2021-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 1 22 2021-04-08 Fujii Hironori <Hironori.Fujii@sony.com> 2 23 -
trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp
r274404 r275751 370 370 responseURL.setFragmentIdentifier(sourceURL.fragmentIdentifier()); 371 371 } 372 373 m_requestURLToResponseURLMap.add(sourceURL.string(), responseURL);374 372 return responseURL; 375 373 }; … … 409 407 } 410 408 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)); 412 411 promise->resolveWithCallback([&] (JSDOMGlobalObject& jsGlobalObject) { 413 412 return JSC::JSSourceCode::create(jsGlobalObject.vm(), … … 416 415 } else { 417 416 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()); 421 422 if (workerScriptLoader.error().isAccessControl()) { 422 423 rejectToPropagateNetworkError(promise.get(), ModuleFetchFailureKind::WasErrored, "Cross-origin script load denied by Cross-Origin Resource Sharing policy."_s); … … 433 434 } 434 435 435 if (!MIMETypeRegistry::isSupportedJavaScriptMIMEType( workerScriptLoader.responseMIMEType())) {436 if (!MIMETypeRegistry::isSupportedJavaScriptMIMEType(loader.responseMIMEType())) { 436 437 // https://html.spec.whatwg.org/multipage/webappapis.html#fetch-a-single-module-script 437 438 // The result of extracting a MIME type from response's header list (ignoring parameters) is not a JavaScript MIME type. 438 439 // 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); 450 459 promise->resolveWithCallback([&] (JSDOMGlobalObject& jsGlobalObject) { 451 460 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() }); 453 462 }); 454 463 } -
trunk/Source/WebCore/bindings/js/WorkerModuleScriptLoader.cpp
r273203 r275751 62 62 m_sourceURL = WTFMove(sourceURL); 63 63 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 64 77 ResourceRequest request { m_sourceURL }; 65 78 … … 95 108 ASSERT(m_promise); 96 109 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 121 void WorkerModuleScriptLoader::notifyClientFinished() 122 { 97 123 auto protectedThis = makeRef(*this); 124 98 125 if (m_client) 99 126 m_client->notifyFinished(*this, WTFMove(m_sourceURL), m_promise.releaseNonNull()); -
trunk/Source/WebCore/bindings/js/WorkerModuleScriptLoader.h
r273205 r275751 27 27 28 28 #include "ModuleScriptLoader.h" 29 #include "ScriptBuffer.h" 29 30 #include "WorkerScriptFetcher.h" 30 31 #include "WorkerScriptLoaderClient.h" … … 55 56 static String taskMode(); 56 57 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; } 57 64 58 65 private: … … 62 69 void notifyFinished() final; 63 70 71 void notifyClientFinished(); 72 64 73 Ref<WorkerScriptLoader> m_scriptLoader; 65 74 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 }; 66 80 }; 67 81
Note: See TracChangeset
for help on using the changeset viewer.