Commit 78d57ea2 authored by Erik Chen's avatar Erik Chen Committed by Commit Bot

Destroy RenderWidgets asynchronously from IPC.

Asynchronous IPCs can be invoked re-entrantly from DevTools debugger. This means
that it is not safe to synchronously destroy RenderWidget from IPC.

Bug: 998419
Change-Id: I7bce6c00c82c93606fe978d5db1711035197fb37
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1776737
Commit-Queue: Erik Chen <erikchen@chromium.org>
Commit-Queue: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Auto-Submit: Erik Chen <erikchen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#691871}
parent 46c88a3f
...@@ -697,11 +697,14 @@ bool RenderWidget::ShouldHandleImeEvents() const { ...@@ -697,11 +697,14 @@ bool RenderWidget::ShouldHandleImeEvents() const {
void RenderWidget::OnClose() { void RenderWidget::OnClose() {
DCHECK(popup_ || pepper_fullscreen_); DCHECK(popup_ || pepper_fullscreen_);
// It is always safe to synchronously destroy this object from an IPC message.
// That's because the IPC message is asynchronous, which means it can never be
// called from a nested context.
PrepareForClose(); PrepareForClose();
Close(base::WrapUnique(this));
// IPCs can be invoked from nested message loops. We must dispatch this
// task non-nested to avoid re-entrancy issues.
GetCleanupTaskRunner()->PostNonNestableTask(
FROM_HERE,
base::BindOnce(&RenderWidget::Close, close_weak_ptr_factory_.GetWeakPtr(),
base::WrapUnique(this)));
} }
void RenderWidget::PrepareForClose() { void RenderWidget::PrepareForClose() {
......
...@@ -472,9 +472,8 @@ class PopupRenderWidget : public RenderWidget { ...@@ -472,9 +472,8 @@ class PopupRenderWidget : public RenderWidget {
void Shutdown(std::unique_ptr<RenderWidget> widget) { void Shutdown(std::unique_ptr<RenderWidget> widget) {
shutdown_ = true; shutdown_ = true;
// OnClose takes ownership and destroys the widget. widget->PrepareForClose();
widget->OnClose(); widget->Close(std::move(widget));
widget.release();
} }
protected: protected:
......
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