From a0f3b0956ddcb938077602e99385a577dff7458a Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Thu, 27 Jun 2019 14:09:08 -0700 Subject: [PATCH] fix: delay emitting screen events by a tick to avoid re-entrancy crash --- shell/browser/api/atom_api_screen.cc | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/shell/browser/api/atom_api_screen.cc b/shell/browser/api/atom_api_screen.cc index d8fc8b8b0093c..203a92f851e7f 100644 --- a/shell/browser/api/atom_api_screen.cc +++ b/shell/browser/api/atom_api_screen.cc @@ -99,17 +99,38 @@ static gfx::Rect DIPToScreenRect(electron::NativeWindow* window, #endif +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, + std::vector metrics) { + screen->Emit(name, display); +} + void Screen::OnDisplayAdded(const display::Display& new_display) { - Emit("display-added", new_display); + base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::UI}, + base::Bind(&DelayEmit, base::Unretained(this), + "display-added", new_display)); } void Screen::OnDisplayRemoved(const display::Display& old_display) { - Emit("display-removed", old_display); + base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::UI}, + 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::PostTaskWithTraits( + FROM_HERE, {content::BrowserThread::UI}, + base::Bind(&DelayEmitWithMetrics, base::Unretained(this), + "display-metrics-changed", display, + MetricsToArray(changed_metrics))); } // static