Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(360)

Unified Diff: third_party/WebKit/Source/core/loader/modulescript/ModuleScriptLoader.cpp

Issue 2939773005: [POC] Implement "module responses map" concept (Closed)
Patch Set: rebase Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698