Browse Source

fix: Showing the about panel is async on all platforms (#37508)

fix: Showing the about panel is async on all platforms (#37440)

* fix: about panel is a base::Value::Dict

* nix this test for a diff PR

* what if the about dialog was not blocking

* add this test back in

* document synchronicity

* github editor is a fan of spaces

Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com>
Co-authored-by: Calvin <[email protected]>
trop[bot] 2 years ago
parent
commit
5abfb3a6bc
4 changed files with 13 additions and 4 deletions
  1. 1 1
      docs/api/app.md
  2. 5 2
      shell/browser/browser_linux.cc
  3. 3 1
      shell/browser/browser_win.cc
  4. 4 0
      spec/api-app-spec.ts

+ 1 - 1
docs/api/app.md

@@ -1357,7 +1357,7 @@ This API must be called after the `ready` event is emitted.
 
 ### `app.showAboutPanel()`
 
-Show the app's about panel options. These options can be overridden with `app.setAboutPanelOptions(options)`.
+Show the app's about panel options. These options can be overridden with `app.setAboutPanelOptions(options)`. This function runs asynchronously.
 
 ### `app.setAboutPanelOptions(options)`
 

+ 5 - 2
shell/browser/browser_linux.cc

@@ -212,8 +212,11 @@ void Browser::ShowAboutPanel() {
     }
   }
 
-  gtk_dialog_run(GTK_DIALOG(dialog));
-  gtk_widget_destroy(dialogWidget);
+  // destroy the widget when it closes
+  g_signal_connect_swapped(dialogWidget, "response",
+                           G_CALLBACK(gtk_widget_destroy), dialogWidget);
+
+  gtk_widget_show_all(dialogWidget);
 }
 
 void Browser::SetAboutPanelOptions(base::Value::Dict options) {

+ 3 - 1
shell/browser/browser_win.cc

@@ -2,6 +2,7 @@
 // Use of this source code is governed by the MIT license that can be
 // found in the LICENSE file.
 
+#include "base/functional/bind.h"
 #include "shell/browser/browser.h"
 
 // must come before other includes. fixes bad #defines from <shlwapi.h>.
@@ -765,7 +766,8 @@ void Browser::ShowAboutPanel() {
   settings.message = aboutMessage;
   settings.icon = image;
   settings.type = electron::MessageBoxType::kInformation;
-  electron::ShowMessageBoxSync(settings);
+  electron::ShowMessageBox(settings,
+                           base::BindOnce([](int, bool) { /* do nothing. */ }));
 }
 
 void Browser::SetAboutPanelOptions(base::Value::Dict options) {

+ 4 - 0
spec/api-app-spec.ts

@@ -1871,6 +1871,10 @@ describe('app module', () => {
         version: '1.2.3'
       });
     });
+
+    it('app.showAboutPanel() does not crash & runs asynchronously', () => {
+      app.showAboutPanel();
+    });
   });
 });