Skip to content

Commit

Permalink
fix: delay emitting screen events by a tick to avoid re-entrancy crash (
Browse files Browse the repository at this point in the history
  • Loading branch information
trop[bot] authored and zcbenz committed Jun 28, 2019
1 parent 61d9d7c commit 714fa6f
Showing 1 changed file with 23 additions and 3 deletions.
26 changes: 23 additions & 3 deletions atom/browser/api/atom_api_screen.cc
Expand Up @@ -52,6 +52,19 @@ std::vector<std::string> 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<std::string>& metrics) {
screen->Emit(name, display, metrics);
}

} // namespace

Screen::Screen(v8::Isolate* isolate, display::Screen* screen)
Expand Down Expand Up @@ -101,16 +114,23 @@ static gfx::Rect DIPToScreenRect(atom::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
Expand Down

0 comments on commit 714fa6f

Please sign in to comment.