From 127d617db5c40080ab44aeef014cf02954b2b0ff Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Thu, 27 Jun 2019 19:01:28 -0700 Subject: [PATCH] fix: delay emitting screen events by a tick to avoid re-entrancy crash (#19016) --- shell/browser/api/atom_api_screen.cc | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/shell/browser/api/atom_api_screen.cc b/shell/browser/api/atom_api_screen.cc index d8fc8b8b0093..783910b95274 100644 --- a/shell/browser/api/atom_api_screen.cc +++ b/shell/browser/api/atom_api_screen.cc @@ -51,6 +51,19 @@ std::vector MetricsToArray(uint32_t metrics) { return array; } +void DelayEmit(Screen* screen, + const base::StringPiece& name, + const display::Display& display) { + screen->Emit(name, display); +} + +void DelayEmitWithMetrics(Screen* screen, + const base::StringPiece& name, + const display::Display& display, + const std::vector& metrics) { + screen->Emit(name, display, metrics); +} + } // namespace Screen::Screen(v8::Isolate* isolate, display::Screen* screen) @@ -100,16 +113,23 @@ static gfx::Rect DIPToScreenRect(electron::NativeWindow* window, #endif void Screen::OnDisplayAdded(const display::Display& new_display) { - Emit("display-added", new_display); + base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask( + FROM_HERE, base::Bind(&DelayEmit, base::Unretained(this), "display-added", + new_display)); } void Screen::OnDisplayRemoved(const display::Display& old_display) { - Emit("display-removed", old_display); + base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask( + FROM_HERE, base::Bind(&DelayEmit, base::Unretained(this), + "display-removed", old_display)); } void Screen::OnDisplayMetricsChanged(const display::Display& display, uint32_t changed_metrics) { - Emit("display-metrics-changed", display, MetricsToArray(changed_metrics)); + base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask( + FROM_HERE, base::Bind(&DelayEmitWithMetrics, base::Unretained(this), + "display-metrics-changed", display, + MetricsToArray(changed_metrics))); } // static