Commit 737f592b authored by Kouhei Ueno's avatar Kouhei Ueno Committed by Commit Bot

ScriptLoader: Refactor ScriptLoader::ExecuteAsyncTask for its readability.

No change in behavior expected.

- ScriptRunner::GetPendingScriptIfAsync is now renamed to GetPendingScriptOfAsyncScript() and DCHECKs if the script loader is actually async.
- ScriptRunner::IsAsync() is introduced for an existing call-site which called the func just to see if the ScriptLoader is async.

Bug: 838761
Change-Id: I0cbe73c36706e1e4ae053dd3c438d2eb77c62699
Reviewed-on: https://chromium-review.googlesource.com/1036712
Commit-Queue: Kouhei Ueno <kouhei@chromium.org>
Reviewed-by: default avatarHiroshige Hayashizaki <hiroshige@chromium.org>
Reviewed-by: default avatarDaniel Vogelheim <vogelheim@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#557206}
parent a12a839e
...@@ -964,10 +964,9 @@ bool ScriptLoader::IsScriptForEventSupported() const { ...@@ -964,10 +964,9 @@ bool ScriptLoader::IsScriptForEventSupported() const {
DeprecatedEqualIgnoringCase(event_attribute, "onload()"); DeprecatedEqualIgnoringCase(event_attribute, "onload()");
} }
PendingScript* ScriptLoader::GetPendingScriptIfScriptIsAsync() { PendingScript* ScriptLoader::GetPendingScriptIfScriptOfAsyncScript() {
if (pending_script_ && async_exec_type_ == ScriptRunner::kAsync) DCHECK(IsAsync());
return pending_script_; return pending_script_;
return nullptr;
} }
} // namespace blink } // namespace blink
...@@ -121,16 +121,24 @@ class CORE_EXPORT ScriptLoader : public GarbageCollectedFinalized<ScriptLoader>, ...@@ -121,16 +121,24 @@ class CORE_EXPORT ScriptLoader : public GarbageCollectedFinalized<ScriptLoader>,
void HandleSourceAttribute(const String& source_url); void HandleSourceAttribute(const String& source_url);
void HandleAsyncAttribute(); void HandleAsyncAttribute();
// IsReady only makes sense for scripts controlled by ScriptRunner.
virtual bool IsReady() const { virtual bool IsReady() const {
return pending_script_ && pending_script_->IsReady(); return pending_script_ && pending_script_->IsReady();
} }
void SetFetchDocWrittenScriptDeferIdle(); void SetFetchDocWrittenScriptDeferIdle();
// To support script streaming, the ScriptRunner may need to access the // IsAsync only makes sense for scripts controlled by ScriptRunner.
// PendingScript. This breaks the intended layering, so please use with bool IsAsync() const {
// care. (Method is virtual to support testing.) DCHECK_NE(async_exec_type_, ScriptRunner::kNone);
virtual PendingScript* GetPendingScriptIfScriptIsAsync(); return async_exec_type_ == ScriptRunner::kAsync;
}
// GetPendingScriptIfScriptOfAsyncScript only makes sense for scripts
// controlled by ScriptRunner. To support script streaming, the ScriptRunner
// may need to access the PendingScript. This breaks the intended layering, so
// please use with care. (Method is virtual to support testing.)
virtual PendingScript* GetPendingScriptIfScriptOfAsyncScript();
protected: protected:
ScriptLoader(ScriptElementBase*, ScriptLoader(ScriptElementBase*,
......
...@@ -202,8 +202,7 @@ bool ScriptRunner::ExecuteInOrderTask() { ...@@ -202,8 +202,7 @@ bool ScriptRunner::ExecuteInOrderTask() {
if (in_order_scripts_to_execute_soon_.IsEmpty()) if (in_order_scripts_to_execute_soon_.IsEmpty())
return false; return false;
DCHECK(!in_order_scripts_to_execute_soon_.front() DCHECK(!in_order_scripts_to_execute_soon_.front()->IsAsync())
->GetPendingScriptIfScriptIsAsync())
<< "In-order scripts queue should not contain any async script."; << "In-order scripts queue should not contain any async script.";
in_order_scripts_to_execute_soon_.TakeFirst()->Execute(); in_order_scripts_to_execute_soon_.TakeFirst()->Execute();
...@@ -213,18 +212,25 @@ bool ScriptRunner::ExecuteInOrderTask() { ...@@ -213,18 +212,25 @@ bool ScriptRunner::ExecuteInOrderTask() {
} }
bool ScriptRunner::ExecuteAsyncTask() { bool ScriptRunner::ExecuteAsyncTask() {
for (auto iter = async_scripts_to_execute_soon_.begin(); // Find an async script loader which is not currently streaming.
iter != async_scripts_to_execute_soon_.end(); ++iter) { auto it = std::find_if(async_scripts_to_execute_soon_.begin(),
PendingScript* pending_script = (*iter)->GetPendingScriptIfScriptIsAsync(); async_scripts_to_execute_soon_.end(),
if (!pending_script || !pending_script->IsCurrentlyStreaming()) { [](ScriptLoader* loader) {
ScriptLoader* loader = *iter; PendingScript* pending_script =
async_scripts_to_execute_soon_.erase(iter); loader->GetPendingScriptIfScriptOfAsyncScript();
loader->Execute(); DCHECK(pending_script);
document_->DecrementLoadEventDelayCount(); return !pending_script->IsCurrentlyStreaming();
return true; });
} if (it == async_scripts_to_execute_soon_.end()) {
return false;
} }
return false;
// Remove the async script loader from the ready-to-exec set and execute.
ScriptLoader* async_script_to_execute = *it;
async_scripts_to_execute_soon_.erase(it);
async_script_to_execute->Execute();
document_->DecrementLoadEventDelayCount();
return true;
} }
void ScriptRunner::ExecuteTask() { void ScriptRunner::ExecuteTask() {
...@@ -279,7 +285,7 @@ bool ScriptRunner::DoTryStream(ScriptLoader* script_loader) { ...@@ -279,7 +285,7 @@ bool ScriptRunner::DoTryStream(ScriptLoader* script_loader) {
script_loader) != async_scripts_to_execute_soon_.end()); script_loader) != async_scripts_to_execute_soon_.end());
PendingScript* pending_script = PendingScript* pending_script =
script_loader->GetPendingScriptIfScriptIsAsync(); script_loader->GetPendingScriptIfScriptOfAsyncScript();
if (!pending_script) if (!pending_script)
return false; return false;
......
...@@ -84,6 +84,7 @@ class CORE_EXPORT ScriptRunner final ...@@ -84,6 +84,7 @@ class CORE_EXPORT ScriptRunner final
// Execute the first task in in_order_scripts_to_execute_soon_. // Execute the first task in in_order_scripts_to_execute_soon_.
// Returns true if task was run, and false otherwise. // Returns true if task was run, and false otherwise.
bool ExecuteInOrderTask(); bool ExecuteInOrderTask();
// Execute any task in async_scripts_to_execute_soon_. // Execute any task in async_scripts_to_execute_soon_.
// Returns true if task was run, and false otherwise. // Returns true if task was run, and false otherwise.
bool ExecuteAsyncTask(); bool ExecuteAsyncTask();
......
...@@ -104,7 +104,7 @@ class MockScriptLoader final : public ScriptLoader { ...@@ -104,7 +104,7 @@ class MockScriptLoader final : public ScriptLoader {
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
PendingScript* GetPendingScriptIfScriptIsAsync() override { PendingScript* GetPendingScriptIfScriptOfAsyncScript() override {
return mock_pending_script_if_script_is_async_.Get(); return mock_pending_script_if_script_is_async_.Get();
} }
MockPendingScript* GetMockPendingScript() { MockPendingScript* GetMockPendingScript() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment