Index: third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
index ec7c860544ae8c0e3604351a42930aa4cdadd58b..633b689545b11727474f9c09ec38d66685332167 100644 |
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
@@ -481,16 +481,75 @@ bool ScriptLoader::PrepareScript(const TextPosition& script_start_position, |
break; |
// - "module": |
- case ScriptType::kModule: |
- // TODO(hiroshige): Implement inline module scripts. |
- element_document.AddConsoleMessage(ConsoleMessage::Create( |
- kJSMessageSource, kErrorMessageLevel, |
- "Inline module script is not yet supported", |
- SourceLocation::Create(element_document.Url().GetString(), |
- script_start_position.line_.OneBasedInt(), |
- script_start_position.column_.OneBasedInt(), |
- nullptr))); |
- return false; |
+ case ScriptType::kModule: { |
+ // Dup of FetchScript() logic. |
+ |
+ // 15. "Let CORS setting be the current state of the element's |
+ // crossorigin content attribute." |
+ CrossOriginAttributeValue cross_origin = |
+ GetCrossOriginAttributeValue(element_->CrossOriginAttributeValue()); |
+ |
+ // 16. "Let module script credentials mode be determined by switching |
+ // on CORS setting:" |
+ WebURLRequest::FetchCredentialsMode credentials_mode = |
+ WebURLRequest::kFetchCredentialsModeOmit; |
+ switch (cross_origin) { |
+ case kCrossOriginAttributeNotSet: |
+ credentials_mode = WebURLRequest::kFetchCredentialsModeOmit; |
+ break; |
+ case kCrossOriginAttributeAnonymous: |
+ credentials_mode = WebURLRequest::kFetchCredentialsModeSameOrigin; |
+ break; |
+ case kCrossOriginAttributeUseCredentials: |
+ credentials_mode = WebURLRequest::kFetchCredentialsModeInclude; |
+ break; |
+ } |
+ // 17. "If the script element has a nonce attribute, |
+ // then let cryptographic nonce be that attribute's value. |
+ // Otherwise, let cryptographic nonce be the empty string." |
+ String nonce; |
+ if (element_->IsNonceableElement()) |
+ nonce = element_->nonce(); |
+ |
+ // 19. "Let parser state be "parser-inserted" |
+ // if the script element has been flagged as "parser-inserted", |
+ // and "not parser-inserted" otherwise." |
+ ParserDisposition parser_state = |
+ IsParserInserted() ? kParserInserted : kNotParserInserted; |
+ |
+ // End of dup. |
+ KURL script_url = |
+ (!element_document.IsInDocumentWrite() && parser_inserted_) |
+ ? element_document.Url() |
+ : KURL(); |
+ |
+ // 1. Let base URL be the script element's node document's document |
+ // base URL. |
+ KURL base_url = element_document.BaseURL(); |
+ |
+ // 2. Let script be the result of creating a module script using |
+ // source text, settings, base URL, cryptographic nonce, parser state, |
+ // and module script credentials mode. |
+ Modulator* modulator = Modulator::From( |
+ ToScriptStateForMainWorld(element_document.GetFrame())); |
+ ScriptModule record = modulator->CompileModule( |
+ ScriptContent(), base_url, kSharableCrossOrigin); |
+ // 3. If this returns null, set the script's script to null and abort |
+ // these substeps; the script is ready. |
+ if (record.IsNull()) { |
+ return false; |
+ } |
+ |
+ ModuleScript* script = ModuleScript::Create( |
+ modulator, record, base_url, nonce, parser_state, credentials_mode); |
+ |
+ // 4. Fetch the descendants of script (using an empty ancestor list). |
+ // When this asynchronously completes, set the script's script to |
+ // the result. At that time, the script is ready. |
+ DCHECK(!module_tree_client_); |
+ module_tree_client_ = ModulePendingScriptTreeClient::Create(); |
+ modulator->FetchDescendantsForInlineScript(script, module_tree_client_); |
hiroshige
2017/04/26 04:54:59
[not specced]
This CL jumps to Step 5. of
https://
|
+ } |
} |
} |