From 31551aba9d0895b262f8f2252cda5a2538da19ed Mon Sep 17 00:00:00 2001 From: "trop[bot]" <37223003+trop[bot]@users.noreply.github.com> Date: Wed, 31 Jul 2024 19:59:27 -0500 Subject: [PATCH] fix: vibrant view is inserted into Views API hierarchy (#43128) * fix: vibrant view is inserted into Views API hierarchy (#42263) Co-authored-by: Hans Halverson * Update shell/browser/native_window_mac.mm Co-authored-by: Charles Kerr Co-authored-by: Shelley Vohr --------- Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Hans Halverson Co-authored-by: Shelley Vohr --- shell/browser/native_window_mac.h | 4 ++++ shell/browser/native_window_mac.mm | 24 +++++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) 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 15b3854a9f6..5682c88e04e 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -1393,13 +1393,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; } @@ -1455,9 +1461,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()); }