diff --git a/shell/browser/native_window_mac.h b/shell/browser/native_window_mac.h index cf6f0c1d9d8..15180fc804a 100644 --- a/shell/browser/native_window_mac.h +++ b/shell/browser/native_window_mac.h @@ -12,6 +12,7 @@ #include #include +#include "base/memory/raw_ptr.h" #include "electron/shell/common/api/api.mojom.h" #include "shell/browser/native_window.h" #include "ui/display/display_observer.h" @@ -299,6 +300,9 @@ class NativeWindowMac : public NativeWindow, std::string vibrancy_type_; + // A views::NativeViewHost wrapping the vibrant view. Owned by the root view. + raw_ptr vibrant_native_view_host_ = nullptr; + // The presentation options before entering simple fullscreen mode. NSApplicationPresentationOptions simple_fullscreen_options_; }; diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index 6c284bfd1f1..9b6e94ce0c8 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -1394,13 +1394,19 @@ void NativeWindowMac::SetVibrancy(const std::string& type) { NativeWindow::SetVibrancy(type); NSVisualEffectView* vibrantView = [window_ vibrantView]; + views::View* rootView = GetContentsView(); if (type.empty()) { - if (vibrantView == nil) - return; + if (vibrant_native_view_host_ != nullptr) { + // Transfers ownership back to caller in the form of a unique_ptr which is + // subsequently deleted. + rootView->RemoveChildViewT(vibrant_native_view_host_); + vibrant_native_view_host_ = nullptr; + } - [vibrantView removeFromSuperview]; - [window_ setVibrantView:nil]; + if (vibrantView != nil) { + [window_ setVibrantView:nil]; + } return; } @@ -1456,9 +1462,13 @@ void NativeWindowMac::SetVibrancy(const std::string& type) { [vibrantView setState:NSVisualEffectStateFollowsWindowActiveState]; } - [[window_ contentView] addSubview:vibrantView - positioned:NSWindowBelow - relativeTo:nil]; + // Vibrant view is inserted into the root view hierarchy underneath all + // other views. + vibrant_native_view_host_ = rootView->AddChildViewAt( + std::make_unique(), 0); + vibrant_native_view_host_->Attach(vibrantView); + + rootView->DeprecatedLayoutImmediately(); UpdateVibrancyRadii(IsFullscreen()); }