From 71b36ef54d776eb2f64c68a20626f56116fe6ebc Mon Sep 17 00:00:00 2001 From: Heilig Benedek Date: Wed, 13 Sep 2017 09:36:28 +0200 Subject: [PATCH] don't show the dummy window for the rest of the dialogs too on mac --- atom/browser/api/atom_api_window.cc | 1 + .../browser/atom_javascript_dialog_manager.cc | 3 +- atom/browser/native_window.cc | 1 + atom/browser/native_window.h | 9 ++++ atom/browser/native_window_views.cc | 2 - atom/browser/ui/file_dialog_mac.mm | 46 +++++++++++++------ atom/browser/ui/message_box_mac.mm | 9 ++-- 7 files changed, 51 insertions(+), 20 deletions(-) diff --git a/atom/browser/api/atom_api_window.cc b/atom/browser/api/atom_api_window.cc index 2d240eff3640..c4acc04b4e4f 100644 --- a/atom/browser/api/atom_api_window.cc +++ b/atom/browser/api/atom_api_window.cc @@ -144,6 +144,7 @@ void Window::Init(v8::Isolate* isolate, options, parent.IsEmpty() ? nullptr : parent->window_.get())); web_contents->SetOwnerWindow(window_.get()); + window_->SetIsOffScreenDummy(api_web_contents_->IsOffScreen()); #if defined(TOOLKIT_VIEWS) // Sets the window icon. diff --git a/atom/browser/atom_javascript_dialog_manager.cc b/atom/browser/atom_javascript_dialog_manager.cc index 23a7ee71298d..c593b2bfba1d 100644 --- a/atom/browser/atom_javascript_dialog_manager.cc +++ b/atom/browser/atom_javascript_dialog_manager.cc @@ -41,8 +41,7 @@ void AtomJavaScriptDialogManager::RunJavaScriptDialog( buttons.push_back("Cancel"); } - atom::ShowMessageBox(api_web_contents_->IsOffScreen() ? nullptr : - NativeWindow::FromWebContents(web_contents), + atom::ShowMessageBox(NativeWindow::FromWebContents(web_contents), atom::MessageBoxType::MESSAGE_BOX_TYPE_NONE, buttons, -1, 0, atom::MessageBoxOptions::MESSAGE_BOX_NONE, "", base::UTF16ToUTF8(message_text), "", "", false, diff --git a/atom/browser/native_window.cc b/atom/browser/native_window.cc index b22ddfb2509c..43aad44c101a 100644 --- a/atom/browser/native_window.cc +++ b/atom/browser/native_window.cc @@ -65,6 +65,7 @@ NativeWindow::NativeWindow( aspect_ratio_(0.0), parent_(parent), is_modal_(false), + is_osr_dummy_(false), inspectable_web_contents_(inspectable_web_contents), weak_factory_(this) { options.Get(options::kFrame, &has_frame_); diff --git a/atom/browser/native_window.h b/atom/browser/native_window.h index c492f29e6afc..c65219c3c88c 100644 --- a/atom/browser/native_window.h +++ b/atom/browser/native_window.h @@ -237,6 +237,12 @@ class NativeWindow : public base::SupportsUserData, const std::vector& values, const std::vector& labels) {} virtual void HideAutofillPopup(content::RenderFrameHost* frame_host) {} + void SetIsOffScreenDummy(bool is_dummy) { + is_osr_dummy_ = is_dummy; + } + bool IsOffScreenDummy() { + return is_osr_dummy_; + } // Public API used by platform-dependent delegates and observers to send UI // related notifications. @@ -368,6 +374,9 @@ class NativeWindow : public base::SupportsUserData, // Is this a modal window. bool is_modal_; + // Is this a dummy window for an offscreen WebContents. + bool is_osr_dummy_; + // The page this window is viewing. brightray::InspectableWebContents* inspectable_web_contents_; diff --git a/atom/browser/native_window_views.cc b/atom/browser/native_window_views.cc index 296cff8aa70d..711f3b60459f 100644 --- a/atom/browser/native_window_views.cc +++ b/atom/browser/native_window_views.cc @@ -1361,8 +1361,6 @@ void NativeWindowViews::ShowAutofillPopup( const gfx::RectF& bounds, const std::vector& values, const std::vector& labels) { - // auto wc = atom::api::WebContents::FromWrappedClass( - // v8::Isolate::GetCurrent(), web_contents()); autofill_popup_->CreateView( frame_host, web_contents->IsOffScreenOrEmbedderOffscreen(), diff --git a/atom/browser/ui/file_dialog_mac.mm b/atom/browser/ui/file_dialog_mac.mm index cdc10d6cb430..59acc389e322 100644 --- a/atom/browser/ui/file_dialog_mac.mm +++ b/atom/browser/ui/file_dialog_mac.mm @@ -112,7 +112,8 @@ void SetupDialogForProperties(NSOpenPanel* dialog, int properties) { // Run modal dialog with parent window and return user's choice. int RunModalDialog(NSSavePanel* dialog, atom::NativeWindow* parent_window) { __block int chosen = NSFileHandlingPanelCancelButton; - if (!parent_window || !parent_window->GetNativeWindow()) { + if (!parent_window || !parent_window->GetNativeWindow() || + parent_window->IsOffScreenDummy()) { chosen = [dialog runModal]; } else { NSWindow* window = parent_window->GetNativeWindow(); @@ -164,11 +165,9 @@ void ShowOpenDialog(const DialogSettings& settings, // only store the pointer, by duplication we can force gcd to store a copy. __block OpenDialogCallback callback = c; - NSWindow* window = settings.parent_window ? - settings.parent_window->GetNativeWindow() : - nullptr; - [dialog beginSheetModalForWindow:window - completionHandler:^(NSInteger chosen) { + if (!settings.parent_window || !settings.parent_window->GetNativeWindow() || + settings.parent_window->IsOffScreenDummy()) { + int chosen = [dialog runModal]; if (chosen == NSFileHandlingPanelCancelButton) { callback.Run(false, std::vector()); } else { @@ -176,7 +175,19 @@ void ShowOpenDialog(const DialogSettings& settings, ReadDialogPaths(dialog, &paths); callback.Run(true, paths); } - }]; + } else { + NSWindow* window = settings.parent_window->GetNativeWindow(); + [dialog beginSheetModalForWindow:window + completionHandler:^(NSInteger chosen) { + if (chosen == NSFileHandlingPanelCancelButton) { + callback.Run(false, std::vector()); + } else { + std::vector paths; + ReadDialogPaths(dialog, &paths); + callback.Run(true, paths); + } + }]; + } } bool ShowSaveDialog(const DialogSettings& settings, @@ -203,18 +214,27 @@ void ShowSaveDialog(const DialogSettings& settings, __block SaveDialogCallback callback = c; - NSWindow* window = settings.parent_window ? - settings.parent_window->GetNativeWindow() : - nullptr; - [dialog beginSheetModalForWindow:window - completionHandler:^(NSInteger chosen) { + if (!settings.parent_window || !settings.parent_window->GetNativeWindow() || + settings.parent_window->IsOffScreenDummy()) { + int chosen = [dialog runModal]; if (chosen == NSFileHandlingPanelCancelButton) { callback.Run(false, base::FilePath()); } else { std::string path = base::SysNSStringToUTF8([[dialog URL] path]); callback.Run(true, base::FilePath(path)); } - }]; + } else { + NSWindow* window = settings.parent_window->GetNativeWindow(); + [dialog beginSheetModalForWindow:window + completionHandler:^(NSInteger chosen) { + if (chosen == NSFileHandlingPanelCancelButton) { + callback.Run(false, base::FilePath()); + } else { + std::string path = base::SysNSStringToUTF8([[dialog URL] path]); + callback.Run(true, base::FilePath(path)); + } + }]; + } } } // namespace file_dialog diff --git a/atom/browser/ui/message_box_mac.mm b/atom/browser/ui/message_box_mac.mm index 3429b667e735..c116a2da3a05 100644 --- a/atom/browser/ui/message_box_mac.mm +++ b/atom/browser/ui/message_box_mac.mm @@ -146,7 +146,8 @@ int ShowMessageBox(NativeWindow* parent_window, // Use runModal for synchronous alert without parent, since we don't have a // window to wait for. - if (!parent_window || !parent_window->GetNativeWindow()) + if (!parent_window || !parent_window->GetNativeWindow() || + parent_window->IsOffScreenDummy()) return [[alert autorelease] runModal]; int ret_code = -1; @@ -184,8 +185,10 @@ void ShowMessageBox(NativeWindow* parent_window, // Use runModal for synchronous alert without parent, since we don't have a // window to wait for. - if (!parent_window || !parent_window->GetNativeWindow()) { - [[alert autorelease] runModal]; + if (!parent_window || !parent_window->GetNativeWindow() || + parent_window->IsOffScreenDummy()) { + int ret = [[alert autorelease] runModal]; + callback.Run(ret, false); } else { ModalDelegate* delegate = [[ModalDelegate alloc] initWithCallback:callback andAlert:alert