| Index: third_party/WebKit/Source/core/dom/ModulatorImpl.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/ModulatorImpl.cpp b/third_party/WebKit/Source/core/dom/ModulatorImpl.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..a7bd6ad11c9aa3e556f06450e6bf9e5a41320aad
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/core/dom/ModulatorImpl.cpp
|
| @@ -0,0 +1,144 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "core/dom/ModulatorImpl.h"
|
| +
|
| +#include "core/dom/Document.h"
|
| +#include "core/dom/ExecutionContext.h"
|
| +#include "core/dom/ModuleMap.h"
|
| +#include "core/dom/ModuleScript.h"
|
| +#include "core/dom/ScriptModuleResolverImpl.h"
|
| +#include "core/dom/TaskRunnerHelper.h"
|
| +#include "core/frame/LocalFrame.h"
|
| +#include "core/loader/modulescript//ModuleScriptFetchRequest.h"
|
| +#include "core/loader/modulescript/ModuleScriptLoaderRegistry.h"
|
| +#include "core/loader/modulescript/ModuleTreeLinkerRegistry.h"
|
| +#include "platform/loader/fetch/ResourceFetcher.h"
|
| +
|
| +namespace blink {
|
| +
|
| +ModulatorImpl* ModulatorImpl::create(RefPtr<ScriptState> scriptState,
|
| + Document& document) {
|
| + return new ModulatorImpl(
|
| + std::move(scriptState),
|
| + TaskRunnerHelper::get(TaskType::Networking, &document), &document,
|
| + document.fetcher());
|
| +}
|
| +
|
| +ModulatorImpl::ModulatorImpl(RefPtr<ScriptState> scriptState,
|
| + RefPtr<WebTaskRunner> taskRunner,
|
| + ExecutionContext* executionContext,
|
| + ResourceFetcher* fetcher)
|
| + : m_scriptState(std::move(scriptState)),
|
| + m_taskRunner(std::move(taskRunner)),
|
| + m_executionContext(executionContext),
|
| + m_fetcher(fetcher),
|
| + m_map(ModuleMap::create(this)),
|
| + m_loaderRegistry(ModuleScriptLoaderRegistry::create()),
|
| + m_treeLinkerRegistry(ModuleTreeLinkerRegistry::create()),
|
| + m_scriptModuleResolver(ScriptModuleResolverImpl::create(this)) {
|
| + DCHECK(m_scriptState);
|
| + DCHECK(m_taskRunner);
|
| + DCHECK(m_executionContext);
|
| + DCHECK(m_fetcher);
|
| +}
|
| +
|
| +ModulatorImpl::~ModulatorImpl() {}
|
| +
|
| +ReferrerPolicy ModulatorImpl::referrerPolicy() {
|
| + return m_executionContext->getReferrerPolicy();
|
| +}
|
| +
|
| +void ModulatorImpl::fetchTree(const ModuleScriptFetchRequest& request,
|
| + ModuleTreeClient* client) {
|
| + // Step 1. Perform the internal module script graph fetching procedure given
|
| + // url, settings object, destination, cryptographic nonce, parser state,
|
| + // credentials mode, settings object, a new empty list, "client", and with the
|
| + // top-level module fetch flag set. If the caller of this algorithm specified
|
| + // custom perform the fetch steps, pass those along as well.
|
| +
|
| + // Note: "Fetch a module script graph" algorithm doesn't have "referrer" as
|
| + // its argument.
|
| + DCHECK(request.referrer().isNull());
|
| +
|
| + AncestorList emptyAncestorList;
|
| + fetchTreeInternal(request, emptyAncestorList,
|
| + ModuleGraphLevel::TopLevelModuleFetch, client);
|
| +
|
| + // Step 2. When the internal module script graph fetching procedure
|
| + // asynchronously completes with result, asynchronously complete this
|
| + // algorithm with result.
|
| + // Note: We delegate to ModuleTreeLinker to notify ModuleTreeClient.
|
| +}
|
| +
|
| +void ModulatorImpl::fetchTreeInternal(const ModuleScriptFetchRequest& request,
|
| + const AncestorList& ancestorList,
|
| + ModuleGraphLevel level,
|
| + ModuleTreeClient* client) {
|
| + m_treeLinkerRegistry->fetch(request, ancestorList, level, this, client);
|
| +}
|
| +
|
| +void ModulatorImpl::fetchSingle(const ModuleScriptFetchRequest& request,
|
| + ModuleGraphLevel level,
|
| + SingleModuleClient* client) {
|
| + m_map->retrieveAndFetchIfNeeded(request, level, client);
|
| +}
|
| +
|
| +void ModulatorImpl::fetchNewSingleModule(
|
| + const ModuleScriptFetchRequest& request,
|
| + ModuleGraphLevel level,
|
| + ModuleScriptLoaderClient* client) {
|
| + m_loaderRegistry->fetch(request, level, this, m_fetcher.get(), client);
|
| +}
|
| +
|
| +ModuleScript* ModulatorImpl::retrieveFetchedModuleScript(const KURL& url) {
|
| + return m_map->retrieveFetchedModuleScript(url);
|
| +}
|
| +
|
| +ScriptModule ModulatorImpl::compileModule(const String& script,
|
| + const String& urlStr) {
|
| + // Implements Steps 3-6 of
|
| + // https://html.spec.whatwg.org/multipage/webappapis.html#creating-a-module-script
|
| +
|
| + // Step 3. Let realm be the provided environment settings object's Realm.
|
| + // Note: Realm is v8::Context.
|
| + // Step 4. If scripting is disabled for the given environment settings
|
| + // object's responsible browsing context, then let script source be the empty
|
| + // string. Otherwise, let script source be the provided script source.
|
| + // TODO(kouhei): if(m_executionContext->canExecuteScripts) after the CL
|
| + // landed.
|
| + // Step 5. Let result be ParseModule(script source, realm, script).
|
| + // Step 6. If result is a List of errors, report the exception given by the
|
| + // first element of result for script, return null, and abort these steps.
|
| + // Note: reporting is routed via V8Initializer::messageHandlerInMainThread.
|
| + ScriptState::Scope scope(m_scriptState.get());
|
| + return ScriptModule::compile(m_scriptState->isolate(), script, urlStr);
|
| +}
|
| +
|
| +ScriptValue ModulatorImpl::instantiateModule(ScriptModule scriptModule) {
|
| + ScriptState::Scope scope(m_scriptState.get());
|
| + return scriptModule.instantiate(m_scriptState.get());
|
| +}
|
| +
|
| +Vector<String> ModulatorImpl::moduleRequestsFromScriptModule(
|
| + ScriptModule scriptModule) {
|
| + ScriptState::Scope scope(m_scriptState.get());
|
| + return scriptModule.moduleRequests(m_scriptState.get());
|
| +}
|
| +
|
| +void ModulatorImpl::executeModule(ScriptModule scriptModule) {
|
| + ScriptState::Scope scope(m_scriptState.get());
|
| + scriptModule.evaluate(m_scriptState.get());
|
| +}
|
| +
|
| +DEFINE_TRACE(ModulatorImpl) {
|
| + visitor->trace(m_executionContext);
|
| + visitor->trace(m_fetcher);
|
| + visitor->trace(m_map);
|
| + visitor->trace(m_loaderRegistry);
|
| + visitor->trace(m_treeLinkerRegistry);
|
| + visitor->trace(m_scriptModuleResolver);
|
| +}
|
| +
|
| +} // namespace blink
|
|
|