diff --git a/shell/browser/api/electron_api_base_window.cc b/shell/browser/api/electron_api_base_window.cc index 506350baa80e..27d9da1ba7db 100644 --- a/shell/browser/api/electron_api_base_window.cc +++ b/shell/browser/api/electron_api_base_window.cc @@ -362,8 +362,7 @@ void BaseWindow::SetContentView(gin::Handle view) { } void BaseWindow::CloseImmediately() { - if (!window_->IsClosed()) - window_->CloseImmediately(); + window_->CloseImmediately(); } void BaseWindow::Close() { diff --git a/shell/browser/native_window.cc b/shell/browser/native_window.cc index 19232b6259b0..b6e7d9a9901c 100644 --- a/shell/browser/native_window.cc +++ b/shell/browser/native_window.cc @@ -284,10 +284,6 @@ void NativeWindow::InitFromOptions(const gin_helper::Dictionary& options) { Show(); } -bool NativeWindow::IsClosed() const { - return is_closed_; -} - void NativeWindow::SetSize(const gfx::Size& size, bool animate) { SetBounds(gfx::Rect(GetPosition(), size), animate); } @@ -525,8 +521,23 @@ void NativeWindow::NotifyWindowCloseButtonClicked() { CloseImmediately(); } +void NativeWindow::Close() { + if (!IsClosable()) { + WindowList::WindowCloseCancelled(this); + return; + } + + if (!is_closed()) + CloseImpl(); +} + +void NativeWindow::CloseImmediately() { + if (!is_closed()) + CloseImmediatelyImpl(); +} + void NativeWindow::NotifyWindowClosed() { - if (is_closed_) + if (is_closed()) return; is_closed_ = true; diff --git a/shell/browser/native_window.h b/shell/browser/native_window.h index 831cf8947aa8..176931bc2eb4 100644 --- a/shell/browser/native_window.h +++ b/shell/browser/native_window.h @@ -82,9 +82,10 @@ class NativeWindow : public base::SupportsUserData, virtual void SetContentView(views::View* view) = 0; - virtual void Close() = 0; - virtual void CloseImmediately() = 0; - virtual bool IsClosed() const; + // wrapper around CloseImpl that checks that window_ can be closed + void Close(); + // wrapper around CloseImmediatelyImpl that checks that window_ can be closed + void CloseImmediately(); virtual void Focus(bool focus) = 0; virtual bool IsFocused() const = 0; virtual void Show() = 0; @@ -435,6 +436,8 @@ class NativeWindow : public base::SupportsUserData, protected: friend class api::BrowserView; + [[nodiscard]] constexpr bool is_closed() const { return is_closed_; } + NativeWindow(const gin_helper::Dictionary& options, NativeWindow* parent); // views::WidgetDelegate: @@ -444,6 +447,9 @@ class NativeWindow : public base::SupportsUserData, void set_content_view(views::View* view) { content_view_ = view; } + virtual void CloseImpl() = 0; + virtual void CloseImmediatelyImpl() = 0; + // The boolean parsing of the "titleBarOverlay" option bool titlebar_overlay_ = false; diff --git a/shell/browser/native_window_mac.h b/shell/browser/native_window_mac.h index 5420e14aecd7..d4c07ba6fc06 100644 --- a/shell/browser/native_window_mac.h +++ b/shell/browser/native_window_mac.h @@ -38,8 +38,8 @@ class NativeWindowMac : public NativeWindow, // NativeWindow: void SetContentView(views::View* view) override; - void Close() override; - void CloseImmediately() override; + void CloseImpl() override; + void CloseImmediatelyImpl() override; void Focus(bool focus) override; bool IsFocused() const override; void Show() override; diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index 6d8a2712420b..2610ddeaf03c 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -33,7 +33,6 @@ #include "shell/browser/ui/cocoa/root_view_mac.h" #include "shell/browser/ui/cocoa/window_buttons_proxy.h" #include "shell/browser/ui/drag_util.h" -#include "shell/browser/window_list.h" #include "shell/common/gin_converters/gfx_converter.h" #include "shell/common/gin_helper/dictionary.h" #include "shell/common/node_util.h" @@ -331,12 +330,7 @@ void NativeWindowMac::SetContentView(views::View* view) { root_view->DeprecatedLayoutImmediately(); } -void NativeWindowMac::Close() { - if (!IsClosable()) { - WindowList::WindowCloseCancelled(this); - return; - } - +void NativeWindowMac::CloseImpl() { if (fullscreen_transition_state() != FullScreenTransitionState::kNone) { SetHasDeferredWindowClose(true); return; @@ -372,7 +366,7 @@ void NativeWindowMac::Close() { } } -void NativeWindowMac::CloseImmediately() { +void NativeWindowMac::CloseImmediatelyImpl() { // Ensure we're detached from the parent window before closing. RemoveChildFromParentWindow(); @@ -1692,7 +1686,7 @@ bool NativeWindowMac::IsActive() const { } void NativeWindowMac::Cleanup() { - DCHECK(!IsClosed()); + DCHECK(!is_closed()); ui::NativeTheme::GetInstanceForNativeUi()->RemoveObserver(this); display::Screen::GetScreen()->RemoveObserver(this); [window_ cleanup]; diff --git a/shell/browser/native_window_views.cc b/shell/browser/native_window_views.cc index f9c659a9ddd0..dd1af72d13c1 100644 --- a/shell/browser/native_window_views.cc +++ b/shell/browser/native_window_views.cc @@ -31,7 +31,6 @@ #include "shell/browser/ui/views/root_view.h" #include "shell/browser/web_contents_preferences.h" #include "shell/browser/web_view_manager.h" -#include "shell/browser/window_list.h" #include "shell/common/electron_constants.h" #include "shell/common/gin_converters/image_converter.h" #include "shell/common/gin_helper/dictionary.h" @@ -473,16 +472,11 @@ void NativeWindowViews::SetContentView(views::View* view) { root_view_.GetMainView()->DeprecatedLayoutImmediately(); } -void NativeWindowViews::Close() { - if (!IsClosable()) { - WindowList::WindowCloseCancelled(this); - return; - } - +void NativeWindowViews::CloseImpl() { widget()->Close(); } -void NativeWindowViews::CloseImmediately() { +void NativeWindowViews::CloseImmediatelyImpl() { widget()->CloseNow(); } diff --git a/shell/browser/native_window_views.h b/shell/browser/native_window_views.h index b65221bcdba2..650a026b4807 100644 --- a/shell/browser/native_window_views.h +++ b/shell/browser/native_window_views.h @@ -48,8 +48,8 @@ class NativeWindowViews : public NativeWindow, // NativeWindow: void SetContentView(views::View* view) override; - void Close() override; - void CloseImmediately() override; + void CloseImpl() override; + void CloseImmediatelyImpl() override; void Focus(bool focus) override; bool IsFocused() const override; void Show() override; diff --git a/shell/browser/window_list.cc b/shell/browser/window_list.cc index 188402d0e6bb..bd9cfbfe53e2 100644 --- a/shell/browser/window_list.cc +++ b/shell/browser/window_list.cc @@ -84,7 +84,7 @@ void WindowList::CloseAllWindows() { std::ranges::reverse(weak_windows); #endif for (const auto& window : weak_windows) { - if (window && !window->IsClosed()) + if (window) window->Close(); } } @@ -95,7 +95,7 @@ void WindowList::DestroyAllWindows() { ConvertToWeakPtrVector(GetInstance()->windows_); for (const auto& window : weak_windows) { - if (window && !window->IsClosed()) + if (window) window->CloseImmediately(); } }