Index: third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp |
diff --git a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp |
index 84495a0fa933bb8973003c976e5a480058c7f392..91b50ac9891ca3dba4c87e2a9c12f4f72c64f3f3 100644 |
--- a/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp |
+++ b/third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp |
@@ -10,11 +10,11 @@ |
#include "core/inspector/ConsoleMessage.h" |
#include "core/loader/modulescript/ModuleScriptLoaderClient.h" |
#include "core/loader/modulescript/ModuleScriptLoaderRegistry.h" |
-#include "platform/loader/fetch/FetchUtils.h" |
-#include "platform/loader/fetch/ResourceFetcher.h" |
+#include "core/loader/modulescript/WorkletModuleScriptFetcher.h" |
+#include "core/workers/MainThreadWorkletGlobalScope.h" |
+#include "platform/loader/fetch/Resource.h" |
#include "platform/loader/fetch/ResourceLoaderOptions.h" |
#include "platform/loader/fetch/ResourceLoadingLog.h" |
-#include "platform/network/mime/MIMETypeRegistry.h" |
#include "platform/weborigin/SecurityPolicy.h" |
#include "platform/wtf/text/AtomicString.h" |
@@ -69,7 +69,6 @@ void ModuleScriptLoader::AdvanceState(ModuleScriptLoader::State new_state) { |
if (state_ == State::kFinished) { |
registry_->ReleaseFinishedLoader(this); |
client_->NotifyNewSingleModuleFinished(module_script_); |
- SetResource(nullptr); |
} |
} |
@@ -134,6 +133,9 @@ void ModuleScriptLoader::Fetch(const ModuleScriptFetchRequest& module_request, |
fetch_params.SetDecoderOptions( |
TextResourceDecoderOptions::CreateAlwaysUseUTF8ForText()); |
+ nonce_ = module_request.Nonce(); |
+ parser_state_ = module_request.ParserState(); |
+ |
// Step 6. If the caller specified custom steps to perform the fetch, |
// perform them on request, setting the is top-level flag if the top-level |
// module fetch flag is set. Return from this algorithm, and when the custom |
@@ -141,106 +143,41 @@ void ModuleScriptLoader::Fetch(const ModuleScriptFetchRequest& module_request, |
// steps. |
// Otherwise, fetch request. Return from this algorithm, and run the remaining |
// steps as part of the fetch's process response for the response response. |
- // TODO(ServiceWorker team): Perform the "custom steps" for module usage |
- // inside service worker. |
- nonce_ = module_request.Nonce(); |
- parser_state_ = module_request.ParserState(); |
- |
- ScriptResource* resource = ScriptResource::Fetch(fetch_params, fetcher); |
- if (state_ == State::kFinished) { |
- // ScriptResource::fetch() has succeeded synchronously, |
- // ::notifyFinished() already took care of the |resource|. |
- return; |
- } |
- |
- if (!resource) { |
- // ScriptResource::fetch() has failed synchronously. |
- AdvanceState(State::kFinished); |
- return; |
- } |
- |
- // ScriptResource::fetch() is processed asynchronously. |
- SetResource(resource); |
-} |
- |
-namespace { |
- |
-bool WasModuleLoadSuccessful(Resource* resource, |
- ConsoleMessage** error_message = nullptr) { |
- // Implements conditions in Step 7 of |
- // https://html.spec.whatwg.org/#fetch-a-single-module-script |
- |
- // - response's type is "error" |
- if (resource->ErrorOccurred()) { |
- return false; |
- } |
- |
- const auto& response = resource->GetResponse(); |
- // - response's status is not an ok status |
- if (response.IsHTTP() && !FetchUtils::IsOkStatus(response.HttpStatusCode())) { |
- return false; |
+ ExecutionContext* execution_context = |
+ ExecutionContext::From(modulator_->GetScriptState()); |
+ if (execution_context->IsMainThreadWorkletGlobalScope()) { |
+ MainThreadWorkletGlobalScope* global_scope = |
+ ToMainThreadWorkletGlobalScope(execution_context); |
+ module_fetcher_ = new WorkletModuleScriptFetcher( |
+ fetch_params, fetcher, modulator_, |
+ global_scope->GetModuleResponsesMapProxy()); |
+ } else { |
+ module_fetcher_ = |
+ new ModuleScriptFetcher(fetch_params, fetcher, modulator_); |
} |
- |
- // The result of extracting a MIME type from response's header list |
- // (ignoring parameters) is not a JavaScript MIME type |
- // Note: 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. |
- // We use ResourceResponse::httpContentType() instead of mimeType(), as |
- // mimeType() may be rewritten by mime sniffer. |
- if (!MIMETypeRegistry::IsSupportedJavaScriptMIMEType( |
- response.HttpContentType())) { |
- if (error_message) { |
- String message = |
- "Failed to load module script: The server responded with a " |
- "non-JavaScript MIME type of \"" + |
- response.HttpContentType() + |
- "\". Strict MIME type checking is enforced for module scripts per " |
- "HTML spec."; |
- *error_message = ConsoleMessage::CreateForRequest( |
- kJSMessageSource, kErrorMessageLevel, message, |
- response.Url().GetString(), resource->Identifier()); |
- } |
- return false; |
- } |
- |
- return true; |
+ module_fetcher_->Fetch(this); |
} |
-} // namespace |
- |
-// ScriptResourceClient callback handler |
-void ModuleScriptLoader::NotifyFinished(Resource*) { |
+void ModuleScriptLoader::NotifyFetchFinished( |
+ WTF::Optional<ModuleScriptCreationParams> params) { |
// Note: "conditions" referred in Step 7 is implemented in |
// wasModuleLoadSuccessful(). |
// Step 7. If any of the following conditions are met, set moduleMap[url] to |
// null, asynchronously complete this algorithm with null, and abort these |
// steps. |
- ConsoleMessage* error_message = nullptr; |
- if (!WasModuleLoadSuccessful(GetResource(), &error_message)) { |
- if (error_message) { |
- ExecutionContext::From(modulator_->GetScriptState()) |
- ->AddConsoleMessage(error_message); |
- } |
- |
+ if (!params.has_value()) { |
AdvanceState(State::kFinished); |
return; |
} |
// Step 8. Let source text be the result of UTF-8 decoding response's body. |
- String source_text = GetResource()->SourceText(); |
- |
- AccessControlStatus access_control_status = |
- GetResource()->CalculateAccessControlStatus(); |
- |
// Step 9. Let module script be the result of creating a module script given |
// source text, module map settings object, response's url, cryptographic |
// nonce, parser state, and credentials mode. |
module_script_ = ModuleScript::Create( |
- source_text, modulator_, GetResource()->GetResponse().Url(), nonce_, |
- parser_state_, |
- GetResource()->GetResourceRequest().GetFetchCredentialsMode(), |
- access_control_status); |
+ params->GetSourceText(), modulator_, params->GetResponseUrl(), nonce_, |
+ parser_state_, params->GetFetchCredentialsMode(), |
+ params->GetAccessControlStatus()); |
AdvanceState(State::kFinished); |
} |
@@ -250,7 +187,7 @@ DEFINE_TRACE(ModuleScriptLoader) { |
visitor->Trace(module_script_); |
visitor->Trace(registry_); |
visitor->Trace(client_); |
- ResourceOwner<ScriptResource>::Trace(visitor); |
+ visitor->Trace(module_fetcher_); |
} |
} // namespace blink |