Chromium Code Reviews| 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 7b3915aaac0eec2ae7e42d89ecbea6a1915a3734..38e1429f6938a901f19c101d1a1211a711e4307d 100644 |
| --- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
| +++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp |
| @@ -26,11 +26,14 @@ |
| #include "bindings/core/v8/ScriptController.h" |
| #include "bindings/core/v8/ScriptSourceCode.h" |
| +#include "bindings/core/v8/ScriptState.h" |
| #include "core/HTMLNames.h" |
| #include "core/SVGNames.h" |
| #include "core/dom/Document.h" |
| #include "core/dom/DocumentParserTiming.h" |
| #include "core/dom/IgnoreDestructiveWriteCountIncrementer.h" |
| +#include "core/dom/Modulator.h" |
| +#include "core/dom/ModuleScript.h" |
| #include "core/dom/ScriptLoaderClient.h" |
| #include "core/dom/ScriptRunner.h" |
| #include "core/dom/ScriptableDocumentParser.h" |
| @@ -60,6 +63,48 @@ |
| namespace blink { |
| +class ScriptElementModuleClient |
| + : public GarbageCollectedFinalized<ScriptElementModuleClient>, |
| + public ModuleTreeClient { |
| + USING_GARBAGE_COLLECTED_MIXIN(ScriptElementModuleClient); |
| + |
| + public: |
| + static ScriptElementModuleClient* create(Element* element) { |
| + return new ScriptElementModuleClient(element); |
| + } |
| + virtual ~ScriptElementModuleClient() = default; |
| + |
| + DECLARE_TRACE(); |
| + |
| + private: |
| + ScriptElementModuleClient(Element* element) : m_element(element) {} |
| + |
| + // Implements ModuleTreeClient |
| + void notifyFinishedModuleTree(ModuleScript*) override; |
| + |
| + Member<Element> m_element; |
| +}; |
| + |
| +void ScriptElementModuleClient::notifyFinishedModuleTree( |
| + ModuleScript* moduleScript) { |
| + printf("notifyFinishedModuleTree!!! moduleScript: %p\n", moduleScript); |
| + if (!moduleScript) |
| + return; |
| + DCHECK(moduleScript->instantiationState() == |
| + InstantiationState::Instantiated); |
| + |
| + LocalFrame* frame = m_element->document().frame(); |
| + |
| + // TODO(kouhei): Actually we should just return w/ the prepared script here. |
| + // In this prototype, we will execute the module immediately just for fun. :) |
| + Modulator::from(frame)->executeModule(moduleScript->record()); |
| +} |
| + |
| +DEFINE_TRACE(ScriptElementModuleClient) { |
| + visitor->trace(m_element); |
| + ModuleTreeClient::trace(visitor); |
| +} |
| + |
| ScriptLoader::ScriptLoader(Element* element, |
| bool parserInserted, |
| bool alreadyStarted, |
| @@ -90,6 +135,7 @@ ScriptLoader::~ScriptLoader() {} |
| DEFINE_TRACE(ScriptLoader) { |
| visitor->trace(m_element); |
| visitor->trace(m_resource); |
| + visitor->trace(m_elementModuleClient); |
| visitor->trace(m_pendingScript); |
| PendingScriptClient::trace(visitor); |
| } |
| @@ -260,6 +306,7 @@ bool ScriptLoader::prepareScript(const TextPosition& scriptStartPosition, |
| if (m_documentWriteIntervention == |
| DocumentWriteIntervention::FetchDocWrittenScriptDeferIdle) |
| defer = FetchRequest::IdleLoad; |
| + |
| if (!fetchScript(client->sourceAttributeValue(), defer)) |
| return false; |
| } |
| @@ -335,10 +382,24 @@ bool ScriptLoader::fetchScript(const String& sourceUrl, |
| return false; |
| DCHECK(!m_resource); |
| + |
| if (!stripLeadingAndTrailingHTMLSpaces(sourceUrl).isEmpty()) { |
| - FetchRequest request( |
| - ResourceRequest(elementDocument->completeURL(sourceUrl)), |
| - m_element->localName()); |
| + KURL url = elementDocument->completeURL(sourceUrl); |
| + if (RuntimeEnabledFeatures::moduleScriptsEnabled() && |
| + client()->typeAttributeValue() == "module") { |
| + m_elementModuleClient = ScriptElementModuleClient::create(m_element); |
| + |
| + // TODO(kouhei): Per spec, we should actually pass in "settings object" |
| + // which contains the baseURL. |
| + KURL baseURL = elementDocument->baseURL(); |
| + |
| + Document* elementDocument = &(m_element->document()); |
| + Modulator::from(elementDocument->frame()) |
|
dominicc (has gone to gerrit)
2017/01/11 03:23:48
Feel like all these places need guards against shu
kouhei (in TOK)
2017/01/17 05:26:13
Is Line 381 isConnected check enough? Would you he
|
| + ->fetchTree(url, baseURL, m_elementModuleClient); |
| + return true; |
| + } |
| + |
| + FetchRequest request(ResourceRequest(url), m_element->localName()); |
| CrossOriginAttributeValue crossOrigin = crossOriginAttributeValue( |
| m_element->fastGetAttribute(HTMLNames::crossoriginAttr)); |