| // 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/ModulePendingScript.h" |
| |
| #include "core/dom/ScriptLoader.h" |
| #include "core/frame/LocalFrame.h" |
| |
| namespace blink { |
| |
| ModulePendingScriptTreeClient::ModulePendingScriptTreeClient() |
| : module_script_(this, nullptr), pending_script_(this, nullptr) {} |
| |
| void ModulePendingScriptTreeClient::SetPendingScript( |
| ModulePendingScript* pending_script) { |
| DCHECK(!pending_script_); |
| pending_script_ = pending_script; |
| |
| if (finished_) { |
| pending_script_->NotifyModuleTreeLoadFinished(); |
| } |
| } |
| |
| void ModulePendingScriptTreeClient::NotifyModuleTreeLoadFinished( |
| ModuleScript* module_script) { |
| DCHECK(!(module_script && module_script->State() == |
| ModuleInstantiationState::kUninstantiated)); |
| DCHECK(!finished_); |
| finished_ = true; |
| module_script_ = module_script; |
| |
| if (pending_script_) |
| pending_script_->NotifyModuleTreeLoadFinished(); |
| } |
| |
| DEFINE_TRACE(ModulePendingScriptTreeClient) { |
| visitor->Trace(module_script_); |
| visitor->Trace(pending_script_); |
| ModuleTreeClient::Trace(visitor); |
| } |
| |
| DEFINE_TRACE_WRAPPERS(ModulePendingScriptTreeClient) { |
| visitor->TraceWrappers(module_script_); |
| visitor->TraceWrappers(pending_script_); |
| ModuleTreeClient::TraceWrappers(visitor); |
| } |
| |
| ModulePendingScript::ModulePendingScript(ScriptElementBase* element, |
| ModulePendingScriptTreeClient* client) |
| : PendingScript(element, TextPosition()), |
| module_tree_client_(this, client) { |
| CHECK(this->GetElement()); |
| DCHECK(module_tree_client_); |
| client->SetPendingScript(this); |
| } |
| |
| ModulePendingScript::~ModulePendingScript() {} |
| |
| void ModulePendingScript::DisposeInternal() { |
| module_tree_client_ = nullptr; |
| } |
| |
| DEFINE_TRACE(ModulePendingScript) { |
| visitor->Trace(module_tree_client_); |
| PendingScript::Trace(visitor); |
| } |
| |
| DEFINE_TRACE_WRAPPERS(ModulePendingScript) { |
| visitor->TraceWrappers(module_tree_client_); |
| PendingScript::TraceWrappers(visitor); |
| } |
| |
| void ModulePendingScript::NotifyModuleTreeLoadFinished() { |
| CHECK(!IsReady()); |
| ready_ = true; |
| |
| if (Client()) |
| Client()->PendingScriptFinished(this); |
| } |
| |
| Script* ModulePendingScript::GetSource(const KURL& document_url, |
| bool& error_occurred) const { |
| CHECK(IsReady()); |
| error_occurred = ErrorOccurred(); |
| return GetModuleScript(); |
| } |
| |
| bool ModulePendingScript::ErrorOccurred() const { |
| CHECK(IsReady()); |
| return !GetModuleScript(); |
| } |
| |
| } // namespace blink |