fix: vibrant view is inserted into Views API hierarchy (#42263)

This commit is contained in:
Hans Halverson 2024-06-05 11:14:22 -07:00 committed by GitHub
parent 484cf26787
commit e645ea88e0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 21 additions and 7 deletions

View file

@ -12,6 +12,7 @@
#include <string>
#include <vector>
#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<views::NativeViewHost> vibrant_native_view_host_ = nullptr;
// The presentation options before entering simple fullscreen mode.
NSApplicationPresentationOptions simple_fullscreen_options_;
};

View file

@ -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());
}