diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index d2f3a35991..e332caaed0 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -1565,6 +1565,13 @@ screen readers Sets a 16 x 16 pixel overlay onto the current taskbar icon, usually used to convey some sort of application status or to passively notify the user. +#### `win.invalidateShadow()` _macOS_ + +Invalidates the window shadow so that it is recomputed based on the current window shape. + +`BrowserWindows` that are transparent can sometimes leave behind visual artifacts on macOS. +This method can be used to clear these artifacts when, for example, performing an animation. + #### `win.setHasShadow(hasShadow)` * `hasShadow` boolean diff --git a/shell/browser/api/electron_api_base_window.cc b/shell/browser/api/electron_api_base_window.cc index 79648aee3f..fa9951cdb6 100644 --- a/shell/browser/api/electron_api_base_window.cc +++ b/shell/browser/api/electron_api_base_window.cc @@ -639,6 +639,10 @@ std::string BaseWindow::GetBackgroundColor(gin_helper::Arguments* args) { return ToRGBHex(window_->GetBackgroundColor()); } +void BaseWindow::InvalidateShadow() { + window_->InvalidateShadow(); +} + void BaseWindow::SetHasShadow(bool has_shadow) { window_->SetHasShadow(has_shadow); } @@ -1259,6 +1263,7 @@ void BaseWindow::BuildPrototype(v8::Isolate* isolate, .SetMethod("isVisibleOnAllWorkspaces", &BaseWindow::IsVisibleOnAllWorkspaces) #if BUILDFLAG(IS_MAC) + .SetMethod("invalidateShadow", &BaseWindow::InvalidateShadow) .SetMethod("_getAlwaysOnTopLevel", &BaseWindow::GetAlwaysOnTopLevel) .SetMethod("setAutoHideCursor", &BaseWindow::SetAutoHideCursor) #endif diff --git a/shell/browser/api/electron_api_base_window.h b/shell/browser/api/electron_api_base_window.h index 9552a13a59..01649ede90 100644 --- a/shell/browser/api/electron_api_base_window.h +++ b/shell/browser/api/electron_api_base_window.h @@ -156,6 +156,7 @@ class BaseWindow : public gin_helper::TrackableObject, bool IsTabletMode() const; virtual void SetBackgroundColor(const std::string& color_name); std::string GetBackgroundColor(gin_helper::Arguments* args); + void InvalidateShadow(); void SetHasShadow(bool has_shadow); bool HasShadow(); void SetOpacity(const double opacity); diff --git a/shell/browser/native_window.cc b/shell/browser/native_window.cc index 47429f0864..a566ee8cfb 100644 --- a/shell/browser/native_window.cc +++ b/shell/browser/native_window.cc @@ -421,6 +421,8 @@ void NativeWindow::SetParentWindow(NativeWindow* parent) { parent_ = parent; } +void NativeWindow::InvalidateShadow() {} + void NativeWindow::SetAutoHideCursor(bool auto_hide) {} void NativeWindow::SelectPreviousTab() {} diff --git a/shell/browser/native_window.h b/shell/browser/native_window.h index 493207833d..3b6ae8d271 100644 --- a/shell/browser/native_window.h +++ b/shell/browser/native_window.h @@ -169,6 +169,7 @@ class NativeWindow : public base::SupportsUserData, virtual bool IsTabletMode() const; virtual void SetBackgroundColor(SkColor color) = 0; virtual SkColor GetBackgroundColor() = 0; + virtual void InvalidateShadow(); virtual void SetHasShadow(bool has_shadow) = 0; virtual bool HasShadow() = 0; virtual void SetOpacity(const double opacity) = 0; diff --git a/shell/browser/native_window_mac.h b/shell/browser/native_window_mac.h index 2d6722bad7..5cde63c13c 100644 --- a/shell/browser/native_window_mac.h +++ b/shell/browser/native_window_mac.h @@ -94,6 +94,7 @@ class NativeWindowMac : public NativeWindow, bool IsKiosk() override; void SetBackgroundColor(SkColor color) override; SkColor GetBackgroundColor() override; + void InvalidateShadow() override; void SetHasShadow(bool has_shadow) override; bool HasShadow() override; void SetOpacity(const double opacity) override; diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index a651feb475..186c3e8a64 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -226,8 +226,8 @@ NativeWindowMac::NativeWindowMac(const gin_helper::Dictionary& options, NSUInteger styleMask = NSWindowStyleMaskTitled; - // Removing NSWindowStyleMaskTitled removes window title, which removes - // rounded corners of window. + // The NSWindowStyleMaskFullSizeContentView style removes rounded corners + // for frameless window. bool rounded_corner = true; options.Get(options::kRoundedCorners, &rounded_corner); if (!rounded_corner && !has_frame()) @@ -1061,6 +1061,10 @@ bool NativeWindowMac::HasShadow() { return [window_ hasShadow]; } +void NativeWindowMac::InvalidateShadow() { + [window_ invalidateShadow]; +} + void NativeWindowMac::SetOpacity(const double opacity) { const double boundedOpacity = base::clamp(opacity, 0.0, 1.0); [window_ setAlphaValue:boundedOpacity];