Linux: Fix crash when closing a browser with pending requests (see issue #2622).
This change fixes an issue where the cancel_callback for a pending request might already have been executed when the OnBrowserDestroyed notification is received.
This commit is contained in:
parent
241941a44a
commit
2814054863
|
@ -479,7 +479,9 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
|
|
||||||
if (!allow) {
|
if (!allow) {
|
||||||
// Cancel the request.
|
// Cancel the request.
|
||||||
std::move(state->cancel_callback_).Run(net::ERR_ABORTED);
|
if (state->cancel_callback_) {
|
||||||
|
std::move(state->cancel_callback_).Run(net::ERR_ABORTED);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -748,7 +750,9 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::move(state->cancel_callback_).Run(net::ERR_CONTENT_DECODING_FAILED);
|
if (state->cancel_callback_) {
|
||||||
|
std::move(state->cancel_callback_).Run(net::ERR_CONTENT_DECODING_FAILED);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnRequestComplete(
|
void OnRequestComplete(
|
||||||
|
@ -758,7 +762,10 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
CEF_REQUIRE_IOT();
|
CEF_REQUIRE_IOT();
|
||||||
|
|
||||||
RequestState* state = GetState(id);
|
RequestState* state = GetState(id);
|
||||||
DCHECK(state);
|
if (!state) {
|
||||||
|
// The request may have been canceled.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Redirection of standard custom schemes is handled with a restart, so we
|
// Redirection of standard custom schemes is handled with a restart, so we
|
||||||
// get completion notifications for both the original (redirected) request
|
// get completion notifications for both the original (redirected) request
|
||||||
|
@ -889,9 +896,14 @@ class InterceptedRequestHandlerWrapper : public InterceptedRequestHandler {
|
||||||
|
|
||||||
// Cancel any pending requests.
|
// Cancel any pending requests.
|
||||||
while (!request_map_.empty()) {
|
while (!request_map_.empty()) {
|
||||||
// Results in a call to RemoveState().
|
auto cancel_callback =
|
||||||
std::move(request_map_.begin()->second->cancel_callback_)
|
std::move(request_map_.begin()->second->cancel_callback_);
|
||||||
.Run(net::ERR_ABORTED);
|
if (cancel_callback) {
|
||||||
|
// Results in a call to RemoveState().
|
||||||
|
std::move(cancel_callback).Run(net::ERR_ABORTED);
|
||||||
|
} else {
|
||||||
|
RemoveState(request_map_.begin()->first);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue