Commit c25901b6 authored by Kouhei Ueno's avatar Kouhei Ueno Committed by Commit Bot

ScriptPromiseResolver: Use TaskHandle instead of Timer

Clean up. Should not change any behavior.

After this CL, the TaskHandle retains the ScriptPromiseResolver by its
Persistent. Thus, the KeepAliveWhilePending in ResolveOrReject script
forbidden path is removed.

Bug: None
Change-Id: I72bd9998d621b9d375faa9b1eb90d6ecf3dec2e6
Reviewed-on: https://chromium-review.googlesource.com/1164157Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Commit-Queue: Kouhei Ueno <kouhei@chromium.org>
Cr-Commit-Position: refs/heads/master@{#581151}
parent c6d07724
......@@ -14,9 +14,6 @@ ScriptPromiseResolver::ScriptPromiseResolver(ScriptState* script_state)
: PausableObject(ExecutionContext::From(script_state)),
state_(kPending),
script_state_(script_state),
timer_(GetExecutionContext()->GetTaskRunner(TaskType::kMicrotask),
this,
&ScriptPromiseResolver::OnTimerFired),
resolver_(script_state) {
if (GetExecutionContext()->IsContextDestroyed()) {
state_ = kDetached;
......@@ -31,18 +28,18 @@ void ScriptPromiseResolver::Reject(ExceptionState& exception_state) {
}
void ScriptPromiseResolver::Pause() {
timer_.Stop();
deferred_resolve_task_.Cancel();
}
void ScriptPromiseResolver::Unpause() {
if (state_ == kResolving || state_ == kRejecting)
timer_.StartOneShot(TimeDelta(), FROM_HERE);
ScheduleResolveOrReject();
}
void ScriptPromiseResolver::Detach() {
if (state_ == kDetached)
return;
timer_.Stop();
deferred_resolve_task_.Cancel();
state_ = kDetached;
resolver_.Clear();
value_.Clear();
......@@ -61,17 +58,6 @@ void ScriptPromiseResolver::KeepAliveWhilePending() {
keep_alive_ = this;
}
void ScriptPromiseResolver::OnTimerFired(TimerBase*) {
DCHECK(state_ == kResolving || state_ == kRejecting);
if (!GetScriptState()->ContextIsValid()) {
Detach();
return;
}
ScriptState::Scope scope(script_state_);
ResolveOrRejectImmediately();
}
void ScriptPromiseResolver::ResolveOrRejectImmediately() {
DCHECK(!GetExecutionContext()->IsContextDestroyed());
DCHECK(!GetExecutionContext()->IsContextPaused());
......@@ -86,6 +72,24 @@ void ScriptPromiseResolver::ResolveOrRejectImmediately() {
Detach();
}
void ScriptPromiseResolver::ScheduleResolveOrReject() {
deferred_resolve_task_ = PostCancellableTask(
*GetExecutionContext()->GetTaskRunner(TaskType::kMicrotask), FROM_HERE,
WTF::Bind(&ScriptPromiseResolver::ResolveOrRejectDeferred,
WrapPersistent(this)));
}
void ScriptPromiseResolver::ResolveOrRejectDeferred() {
DCHECK(state_ == kResolving || state_ == kRejecting);
if (!GetScriptState()->ContextIsValid()) {
Detach();
return;
}
ScriptState::Scope scope(script_state_);
ResolveOrRejectImmediately();
}
void ScriptPromiseResolver::Trace(blink::Visitor* visitor) {
visitor->Trace(script_state_);
PausableObject::Trace(visitor);
......
......@@ -15,7 +15,7 @@
#include "third_party/blink/renderer/platform/bindings/script_state.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/heap/self_keep_alive.h"
#include "third_party/blink/renderer/platform/timer.h"
#include "third_party/blink/renderer/platform/web_task_runner.h"
#include "v8/include/v8.h"
namespace blink {
......@@ -153,20 +153,19 @@ class CORE_EXPORT ScriptPromiseResolver
// resolve.
// See: http://crbug.com/663476
if (ScriptForbiddenScope::IsScriptForbidden()) {
// Retain this object until it is actually resolved or rejected.
KeepAliveWhilePending();
timer_.StartOneShot(TimeDelta(), FROM_HERE);
ScheduleResolveOrReject();
return;
}
ResolveOrRejectImmediately();
}
void ResolveOrRejectImmediately();
void OnTimerFired(TimerBase*);
void ScheduleResolveOrReject();
void ResolveOrRejectDeferred();
ResolutionState state_;
const Member<ScriptState> script_state_;
TaskRunnerTimer<ScriptPromiseResolver> timer_;
TaskHandle deferred_resolve_task_;
Resolver resolver_;
ScopedPersistent<v8::Value> value_;
......
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