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

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

* Update shell/browser/native_window_mac.mm

Co-authored-by: Charles Kerr <charles@charleskerr.com>

---------

Co-authored-by: Hans Halverson <hans_halverson@alumni.brown.edu>
Co-authored-by: Charles Kerr <charles@charleskerr.com>
This commit is contained in:
Shelley Vohr 2024-07-31 01:21:20 +02:00 committed by GitHub
parent 87fb2ad70c
commit ed3242adc1
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 "third_party/skia/include/core/SkRegion.h"
@ -300,6 +301,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

@ -1391,13 +1391,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];
if (vibrantView != nil) {
[window_ setVibrantView:nil];
}
return;
}
@ -1453,9 +1459,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<views::NativeViewHost>(), 0);
vibrant_native_view_host_->Attach(vibrantView);
rootView->DeprecatedLayoutImmediately();
UpdateVibrancyRadii(IsFullscreen());
}