Browse Source

fix: quit after Chromium is fully started (#21506)

* fix: quit when chromium is fully started

* test: remove hacks on app.quit

* chore: RunUntilIdle is unnecessary
trop[bot] 5 years ago
parent
commit
8c531ed424

+ 17 - 2
atom/browser/browser.cc

@@ -25,6 +25,21 @@
 
 namespace atom {
 
+namespace {
+
+// Call |quit| after Chromium is fully started.
+//
+// This is important for quitting immediately in the "ready" event, when
+// certain initialization task may still be pending, and quitting at that time
+// could end up with crash on exit.
+void RunQuitClosure(base::OnceClosure quit) {
+  // On Linux/Windows the "ready" event is emitted in "PreMainMessageLoopRun",
+  // make sure we quit after message loop has run for once.
+  base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(quit));
+}
+
+}  // namespace
+
 Browser::LoginItemSettings::LoginItemSettings() = default;
 Browser::LoginItemSettings::~LoginItemSettings() = default;
 Browser::LoginItemSettings::LoginItemSettings(const LoginItemSettings& other) =
@@ -93,7 +108,7 @@ void Browser::Shutdown() {
     observer.OnQuit();
 
   if (quit_main_message_loop_) {
-    std::move(quit_main_message_loop_).Run();
+    RunQuitClosure(std::move(quit_main_message_loop_));
   } else {
     // There is no message loop available so we are in early stage, wait until
     // the quit_main_message_loop_ is available.
@@ -195,7 +210,7 @@ void Browser::PreMainMessageLoopRun() {
 
 void Browser::SetMainMessageLoopQuitClosure(base::OnceClosure quit_closure) {
   if (is_shutdown_)
-    std::move(quit_closure).Run();
+    RunQuitClosure(std::move(quit_closure));
   else
     quit_main_message_loop_ = std::move(quit_closure);
 }

+ 1 - 3
spec/fixtures/api/command-line/main.js

@@ -9,7 +9,5 @@ app.on('ready', () => {
   process.stdout.write(JSON.stringify(payload))
   process.stdout.end()
 
-  setImmediate(() => {
-    app.quit()
-  })
+  app.quit()
 })

+ 1 - 3
spec/fixtures/api/cookie-app/main.js

@@ -42,8 +42,6 @@ app.on('ready', async function () {
   } finally {
     process.stdout.end()
 
-    setImmediate(() => {
-      app.quit()
-    })
+    app.quit()
   }
 })

+ 1 - 3
spec/fixtures/api/ipc-main-listeners/main.js

@@ -4,7 +4,5 @@ app.on('ready', () => {
   process.stdout.write(JSON.stringify(ipcMain.eventNames()))
   process.stdout.end()
 
-  setImmediate(() => {
-    app.quit()
-  })
+  app.quit()
 })

+ 1 - 1
spec/fixtures/api/leak-exit-browserview.js

@@ -2,5 +2,5 @@ const { BrowserView, app } = require('electron')
 app.on('ready', function () {
   new BrowserView({})  // eslint-disable-line
 
-  process.nextTick(() => app.quit())
+  app.quit()
 })

+ 1 - 1
spec/fixtures/api/leak-exit-webcontents.js

@@ -2,5 +2,5 @@ const { app, webContents } = require('electron')
 app.on('ready', function () {
   webContents.create({})
 
-  process.nextTick(() => app.quit())
+  app.quit()
 })

+ 1 - 1
spec/fixtures/api/leak-exit-webcontentsview.js

@@ -3,5 +3,5 @@ app.on('ready', function () {
   const web = webContents.create({})
   new WebContentsView(web)  // eslint-disable-line
 
-  process.nextTick(() => app.quit())
+  app.quit()
 })

+ 1 - 3
spec/fixtures/api/locale-check/main.js

@@ -4,7 +4,5 @@ app.on('ready', () => {
   process.stdout.write(app.getLocale())
   process.stdout.end()
 
-  setImmediate(() => {
-    app.quit()
-  })
+  app.quit()
 })