From e645ea88e03a1b2aa31afb5177548a6a0192c63c Mon Sep 17 00:00:00 2001 From: Hans Halverson Date: Wed, 5 Jun 2024 11:14:22 -0700 Subject: [PATCH] fix: vibrant view is inserted into Views API hierarchy (#42263) --- 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 cf6f0c1d9d8f..15180fc804a1 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 4eb94a6bda77..1383e4235983 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_ = new views::NativeViewHost(); + rootView->AddChildViewAt(vibrant_native_view_host_, 0); + vibrant_native_view_host_->Attach(vibrantView); + + rootView->DeprecatedLayoutImmediately(); UpdateVibrancyRadii(IsFullscreen()); }