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

Unified Diff: third_party/WebKit/Source/core/dom/ModulePendingScript.cpp

Issue 2815453006: Introduce ModulePendingScript (Closed)
Patch Set: Rebase Created 3 years, 8 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/dom/ModulePendingScript.cpp
diff --git a/third_party/WebKit/Source/core/dom/ModulePendingScript.cpp b/third_party/WebKit/Source/core/dom/ModulePendingScript.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..f0184b10301e3baabe64eac13abc195cadc1dc99
--- /dev/null
+++ b/third_party/WebKit/Source/core/dom/ModulePendingScript.cpp
@@ -0,0 +1,82 @@
+// 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_(nullptr), pending_script_(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->InstantiationState() ==
+ 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);
+}
+
+ModulePendingScript::ModulePendingScript(ScriptElementBase* element,
+ ModulePendingScriptTreeClient* client)
+ : PendingScript(element, TextPosition()), module_tree_client_(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);
+}
+
+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

Powered by Google App Engine
This is Rietveld 408576698