diff --git a/atom/browser/browser.cc b/atom/browser/browser.cc index e89f52283b3c..b60df0dd44a5 100644 --- a/atom/browser/browser.cc +++ b/atom/browser/browser.cc @@ -15,6 +15,7 @@ namespace atom { Browser::Browser() : is_quiting_(false), + is_exiting_(false), is_ready_(false), is_shutdown_(false) { WindowList::AddObserver(this); @@ -49,9 +50,12 @@ void Browser::Exit(int code) { // Message loop is not ready, quit directly. exit(code); } else { - // Prepare to quit when all windows have been closed.. + // Prepare to quit when all windows have been closed. is_quiting_ = true; + // Remember this caller so that we don't emit unrelated events. + is_exiting_ = true; + // Must destroy windows before quitting, otherwise bad things can happen. atom::WindowList* window_list = atom::WindowList::GetInstance(); if (window_list->size() == 0) { @@ -175,7 +179,9 @@ void Browser::OnWindowCloseCancelled(NativeWindow* window) { } void Browser::OnWindowAllClosed() { - if (is_quiting_) + if (is_exiting_) + Shutdown(); + else if (is_quiting_) NotifyAndShutdown(); else FOR_EACH_OBSERVER(BrowserObserver, observers_, OnWindowAllClosed()); diff --git a/atom/browser/browser.h b/atom/browser/browser.h index 634e14e60262..67aae152c317 100644 --- a/atom/browser/browser.h +++ b/atom/browser/browser.h @@ -189,10 +189,13 @@ class Browser : public WindowListObserver { // Observers of the browser. base::ObserverList observers_; + // Whether `app.exit()` has been called + bool is_exiting_; + // Whether "ready" event has been emitted. bool is_ready_; - // The browse is being shutdown. + // The browser is being shutdown. bool is_shutdown_; std::string version_override_;