
When using `views::WebView` on macOS `NativeWidgetMacNSWindowHost` contains a layer and compositor responsible for drawing web contents. To trigger drawing `NativeWidgetMacNSWindowHost::OnVisibilityChanged` needs to be called and `[NSWindow orderFrontRegardless]` does not trigger `[NSWindow orderWindow:relativeTo:]` which can change `NativeWidgetMacNSWindowHost` visiblity with stack: ``` views::NativeWidgetMacNSWindowHost::OnVisibilityChanged(bool) remote_cocoa::NativeWidgetNSWindowBridge::OnVisibilityChanged() -[ViewsNSWindowDelegate onWindowOrderChanged:] -[NativeWidgetMacNSWindow orderWindow:relativeTo:] ``` `views::Widget` has method for showing inactive window: `views::Widget::ShowInactive` which triggers `NativeWidgetMacNSWindowHost::OnVisibilityChanged` with stack: ``` views::NativeWidgetMacNSWindowHost::OnVisibilityChanged(bool) remote_cocoa::NativeWidgetNSWindowBridge::SetVisibilityState(remote_cocoa::mojom::WindowVisibilityState) views::NativeWidgetMacNSWindowHost::SetVisibilityState(remote_cocoa::mojom::WindowVisibilityState) views::NativeWidgetMac::Show(ui::mojom::WindowShowState, gfx::Rect const&) views::Widget::ShowInactive() + 168 ``` However this call seems to be insufficient to bring window to front, therefore `[NSWindow orderFrontRegardless]` still needs to be called. Calling `views::Widget::ShowInactive` ensures that all logic related to showing Chromium widget will be properly executed, but onfortunately it does not call `[NSWindow orderWindow:relativeTo:]` which is used to disabling headless mode by the `ElectronNSWindow`, therefore we need to trigger it manually through exposed `[ElectronNSWindow disableHeadlessMode]`. Fixes: #45415 Co-authored-by: Michał Pichliński <michal.pichlinski@here.io>
55 lines
1.7 KiB
Objective-C
55 lines
1.7 KiB
Objective-C
// Copyright (c) 2018 GitHub, Inc.
|
|
// Use of this source code is governed by the MIT license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef ELECTRON_SHELL_BROWSER_UI_COCOA_ELECTRON_NS_WINDOW_H_
|
|
#define ELECTRON_SHELL_BROWSER_UI_COCOA_ELECTRON_NS_WINDOW_H_
|
|
|
|
#include "base/memory/raw_ptr.h"
|
|
#include "components/remote_cocoa/app_shim/native_widget_mac_nswindow.h"
|
|
#include "shell/browser/ui/cocoa/event_dispatching_window.h"
|
|
#include "ui/views/widget/native_widget_mac.h"
|
|
|
|
namespace electron {
|
|
|
|
class NativeWindowMac;
|
|
|
|
// Prevents window from resizing during the scope.
|
|
class ScopedDisableResize {
|
|
public:
|
|
ScopedDisableResize() { disable_resize_++; }
|
|
~ScopedDisableResize() { disable_resize_--; }
|
|
|
|
// True if there are 1+ nested ScopedDisableResize objects in the scope
|
|
static bool IsResizeDisabled() { return disable_resize_ > 0; }
|
|
|
|
private:
|
|
static int disable_resize_;
|
|
};
|
|
|
|
} // namespace electron
|
|
|
|
class ElectronNativeWindowObserver;
|
|
|
|
@interface ElectronNSWindow : NativeWidgetMacNSWindow {
|
|
@private
|
|
raw_ptr<electron::NativeWindowMac> shell_;
|
|
}
|
|
@property BOOL acceptsFirstMouse;
|
|
@property BOOL enableLargerThanScreen;
|
|
@property BOOL disableAutoHideCursor;
|
|
@property BOOL disableKeyOrMainWindow;
|
|
@property(nonatomic, retain) NSVisualEffectView* vibrantView;
|
|
@property(nonatomic, retain) NSImage* cornerMask;
|
|
- (id)initWithShell:(electron::NativeWindowMac*)shell
|
|
styleMask:(NSUInteger)styleMask;
|
|
- (void)cleanup;
|
|
- (electron::NativeWindowMac*)shell;
|
|
- (id)accessibilityFocusedUIElement;
|
|
- (NSRect)originalContentRectForFrameRect:(NSRect)frameRect;
|
|
- (BOOL)toggleFullScreenMode:(id)sender;
|
|
- (NSImage*)_cornerMask;
|
|
- (void)disableHeadlessMode;
|
|
@end
|
|
|
|
#endif // ELECTRON_SHELL_BROWSER_UI_COCOA_ELECTRON_NS_WINDOW_H_
|