Commit 3386c51e authored by Yutaka Hirano's avatar Yutaka Hirano Committed by Commit Bot

Speculative fix for crash in StreamPromiseResolver constructor

Handle the case where creating a v8::Promise::Resolver fails due to
forcible worker shutdown.

Bug: 1123468
Change-Id: Ifcdc90bc3d9cd6de878bf7d377fbefedb345f6b8
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2400795Reviewed-by: default avatarAdam Rice <ricea@chromium.org>
Commit-Queue: Yutaka Hirano <yhirano@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805652}
parent f066f47e
...@@ -34,16 +34,19 @@ StreamPromiseResolver* StreamPromiseResolver::CreateRejected( ...@@ -34,16 +34,19 @@ StreamPromiseResolver* StreamPromiseResolver::CreateRejected(
return promise; return promise;
} }
// The constructor crashes if a v8::Promise::Resolver object cannot be created. StreamPromiseResolver::StreamPromiseResolver(ScriptState* script_state) {
// TODO(ricea): If necessary change this to make all the methods no-op instead. v8::Local<v8::Promise::Resolver> resolver;
StreamPromiseResolver::StreamPromiseResolver(ScriptState* script_state) if (v8::Promise::Resolver::New(script_state->GetContext())
: resolver_(script_state->GetIsolate(), .ToLocal(&resolver)) {
v8::Promise::Resolver::New(script_state->GetContext()) resolver_.Set(script_state->GetIsolate(), resolver);
.ToLocalChecked()) {} }
}
void StreamPromiseResolver::Resolve(ScriptState* script_state, void StreamPromiseResolver::Resolve(ScriptState* script_state,
v8::Local<v8::Value> value) { v8::Local<v8::Value> value) {
DCHECK(!resolver_.IsEmpty()); if (resolver_.IsEmpty()) {
return;
}
if (is_settled_) { if (is_settled_) {
return; return;
} }
...@@ -61,7 +64,9 @@ void StreamPromiseResolver::ResolveWithUndefined(ScriptState* script_state) { ...@@ -61,7 +64,9 @@ void StreamPromiseResolver::ResolveWithUndefined(ScriptState* script_state) {
void StreamPromiseResolver::Reject(ScriptState* script_state, void StreamPromiseResolver::Reject(ScriptState* script_state,
v8::Local<v8::Value> reason) { v8::Local<v8::Value> reason) {
DCHECK(!resolver_.IsEmpty()); if (resolver_.IsEmpty()) {
return;
}
if (is_settled_) { if (is_settled_) {
return; return;
} }
...@@ -80,17 +85,27 @@ ScriptPromise StreamPromiseResolver::GetScriptPromise( ...@@ -80,17 +85,27 @@ ScriptPromise StreamPromiseResolver::GetScriptPromise(
v8::Local<v8::Promise> StreamPromiseResolver::V8Promise( v8::Local<v8::Promise> StreamPromiseResolver::V8Promise(
v8::Isolate* isolate) const { v8::Isolate* isolate) const {
DCHECK(!resolver_.IsEmpty()); if (resolver_.IsEmpty()) {
return v8::Local<v8::Promise>();
}
return resolver_.NewLocal(isolate)->GetPromise(); return resolver_.NewLocal(isolate)->GetPromise();
} }
void StreamPromiseResolver::MarkAsHandled(v8::Isolate* isolate) { void StreamPromiseResolver::MarkAsHandled(v8::Isolate* isolate) {
V8Promise(isolate)->MarkAsHandled(); v8::Local<v8::Promise> promise = V8Promise(isolate);
if (promise.IsEmpty()) {
return;
}
promise->MarkAsHandled();
} }
v8::Promise::PromiseState StreamPromiseResolver::State( v8::Promise::PromiseState StreamPromiseResolver::State(
v8::Isolate* isolate) const { v8::Isolate* isolate) const {
return V8Promise(isolate)->State(); v8::Local<v8::Promise> promise = V8Promise(isolate);
if (promise.IsEmpty()) {
return v8::Promise::PromiseState::kPending;
}
return promise->State();
} }
void StreamPromiseResolver::Trace(Visitor* visitor) const { void StreamPromiseResolver::Trace(Visitor* visitor) const {
......
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