mirror of
https://github.com/electron/electron.git
synced 2026-01-08 07:04:01 -05:00
* chore: bump chromium in DEPS to 142.0.7429.0
* chore: bump chromium in DEPS to 142.0.7430.0
* 6954508: Reland Migrate WrappableWithNamedPropertyInterceptor to gin::Wrappable | https://chromium-review.googlesource.com/c/chromium/src/+/6954508
* https://chromium-review.googlesource.com/c/chromium/src/+/6955633
* 5584820: Fix font face resolution when renderer is blocked | https://chromium-review.googlesource.com/c/chromium/src/+/5584820
* chore: export patches
* chore: remove patch that keeley says is ok to remove in comments
* chore: bump chromium in DEPS to 142.0.7432.0
* chore: export patches
* chore: bump chromium in DEPS to 142.0.7434.0
* 6973697: Use type tags for data stored in V8 internal fields | https://chromium-review.googlesource.com/c/chromium/src/+/6973697
* 6976272: Revert Reland mac: click through content area in main window | https://chromium-review.googlesource.com/c/chromium/src/+/6976272
* chore: export patches
* 6938086: Rename native_widget_types.h -> native_ui_types.h | https://chromium-review.googlesource.com/c/chromium/src/+/6938086
* 6951252: Correct PersistentCache backed code cache context grouping
* chore: bump chromium in DEPS to 142.0.7436.0
* 6981628: Reland Use unordered_map in AcceleratorMap | https://chromium-review.googlesource.com/c/chromium/src/+/6981628
* chore: export patches
* chore: resolve patch conflict with main
* chore: merge conflict with main
* chore: bump chromium in DEPS to 142.0.7438.0
* chore: bump chromium in DEPS to 142.0.7440.0
* chore: bump chromium in DEPS to 142.0.7442.0
* chore: bump chromium in DEPS to 142.0.7444.0
* chore: bump chromium in DEPS to 143.0.7445.0
* chore: bump chromium in DEPS to 143.0.7447.0
* chore: bump chromium in DEPS to 143.0.7449.0
* chore: bump chromium in DEPS to 143.0.7451.0
* 7001364: Migrate GURL accessors to Get* variants in //content | https://chromium-review.googlesource.com/c/chromium/src/+/7001364
* 6986521: Implicit second value 'any' instead of 'span-all' for fallback query | https://chromium-review.googlesource.com/c/chromium/src/+/6986521
* chore: update chromium patches
* chore: update chromium patches
* chore: update patches
* fix: parse macOS SDK version across line break
https://chromium-review.googlesource.com/c/chromium/src/+/6980166
* fix: replace v8::Object::SetPrototype() usage
https://chromium-review.googlesource.com/c/v8/v8/+/6983465
https://github.com/nodejs/node/pull/55453
* fix: regenerate filenames.libcxx.gni
https://chromium-review.googlesource.com/c/chromium/src/+/6980307
* fix: replace additional usages of SetPrototype
https://chromium-review.googlesource.com/c/v8/v8/+/6983465
* build: use macos 15 minimum
https://chromium-review.googlesource.com/c/chromium/src/+/6980166
* ci: ignore missing dir for strip_universal_deep
* fix: js2c compilation failure
https://chromium-review.googlesource.com/c/chromium/src/+/6950738
See patch description explaining MacOS 26 SDK headers incompatibility.
* fixup! chore: export patches
* feat: add new memory-eviction exit reason
https://chromium-review.googlesource.com/c/chromium/src/+/6991933
* fix: set JSON reader parsing options
https://chromium-review.googlesource.com/c/chromium/src/+/6992114
* fix: provide DeviceEmulationCacheBehavior param
https://chromium-review.googlesource.com/c/chromium/src/+/6965238
* fix: views::NonClientFrameView -> views::FrameView
https://chromium-review.googlesource.com/c/chromium/src/+/7005027
https://chromium-review.googlesource.com/c/chromium/src/+/6966937
* fix: check new forced colors enum value
https://chromium-review.googlesource.com/c/chromium/src/+/6944403
* fix: migrate NetworkConditions -> MatchedNetworkConditions
https://chromium-review.googlesource.com/c/chromium/src/+/6827307
* fix: migrate GURL string methods to Get*()
https://chromium-review.googlesource.com/c/chromium/src/+/7007010
* fix: disable C++ modules in electron_lib builds
https://chromium-review.googlesource.com/c/chromium/src/+/6950738
* fix: partially revert is_headless_mode removal
https://chromium-review.googlesource.com/c/chromium/src/+/6955633
This patch should likely be reworked. For now, this partially reverts the
removal of a required class property to restore behavior.
* Revert "build: use macos 15 minimum"
This reverts commit 2fc12d6acc.
Initially this change was made to test if it fixes libcxx
compilation issues. As that's now resolved by disabling libcxx
modules, this can be reverted.
* fix: disable C++ modules in libnode builds
* fixup! fix: replace v8::Object::SetPrototype() usage https://chromium-review.googlesource.com/c/v8/v8/+/6983465 https://github.com/nodejs/node/pull/55453
* fixup! fix: replace v8::Object::SetPrototype() usage https://chromium-review.googlesource.com/c/v8/v8/+/6983465 https://github.com/nodejs/node/pull/55453
* build: switch to macos-15 runner
build/mac/find_sdk.py now requires macOS 15 SDK as a minimum version. The
macos 15 runners default to an Xcode using the 15 SDK and removes older
versions.
* fixup! fix: check new forced colors enum value https://chromium-review.googlesource.com/c/chromium/src/+/6944403
* fixup! fix: migrate GURL string methods to Get*() https://chromium-review.googlesource.com/c/chromium/src/+/7007010
* fix: use std::u16string for Extension::Create() error parameter
https://chromium-review.googlesource.com/c/chromium/src/+/6975452
* fix: add missing image_skia include
https://chromium-review.googlesource.com/c/chromium/src/+/6986762
* fixup! fix: add missing image_skia include https://chromium-review.googlesource.com/c/chromium/src/+/6986762
* fix: remove outdated V8 flag
https://chromium-review.googlesource.com/c/v8/v8/+/6948286
* fix: disable protocol handler DCHECK
https://chromium-review.googlesource.com/c/chromium/src/+/6727594
Ignore the extension custom protocol handler registry DCHECK until
we invest in supporting it. Replacing this DCHECK seems harmless
and will unblock the roll.
* fix: replace deprecated usage of SetPrototype
https://chromium-review.googlesource.com/c/v8/v8/+/6983465
* fixup! fix: migrate NetworkConditions -> MatchedNetworkConditions https://chromium-review.googlesource.com/c/chromium/src/+/6827307
* fixup! fix: migrate GURL string methods to Get*() https://chromium-review.googlesource.com/c/chromium/src/+/7007010
* chore: remove patch already included in roll
* chore: remove extraneous formatting added to patch
* chore: remove fix_harden_blink_scriptstate_maybefrom.patch
https://chromium-review.googlesource.com/c/chromium/src/+/6973697
No longer needed since the above CL landed.
* 6973697: Use type tags for data stored in V8 internal fields
https://chromium-review.googlesource.com/c/chromium/src/+/6973697
* chore: update patches
* fixup! chore: export patches
* chore: restore electron embedder data tag patch
---------
Co-authored-by: electron-roller[bot] <84116207+electron-roller[bot]@users.noreply.github.com>
Co-authored-by: Alice Zhao <alicelovescake@anthropic.com>
Co-authored-by: Keeley Hammond <vertedinde@electronjs.org>
Co-authored-by: Samuel Maddock <smaddock@slack-corp.com>
Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
321 lines
12 KiB
Objective-C
321 lines
12 KiB
Objective-C
// Copyright (c) 2013 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_NATIVE_WINDOW_MAC_H_
|
|
#define ELECTRON_SHELL_BROWSER_NATIVE_WINDOW_MAC_H_
|
|
|
|
#import <Cocoa/Cocoa.h>
|
|
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "base/memory/raw_ptr.h"
|
|
#include "shell/browser/native_window.h"
|
|
#include "third_party/skia/include/core/SkRegion.h"
|
|
#include "ui/display/display_observer.h"
|
|
#include "ui/native_theme/native_theme_observer.h"
|
|
#include "ui/views/controls/native/native_view_host.h"
|
|
|
|
@class ElectronNSWindow;
|
|
@class ElectronNSWindowDelegate;
|
|
@class ElectronPreviewItem;
|
|
@class ElectronTouchBar;
|
|
@class WindowButtonsProxy;
|
|
|
|
namespace electron {
|
|
|
|
class RootViewMac;
|
|
class NativeAppWindowFrameViewMacClient;
|
|
|
|
class NativeWindowMac : public NativeWindow,
|
|
public ui::NativeThemeObserver,
|
|
public display::DisplayObserver {
|
|
public:
|
|
NativeWindowMac(const gin_helper::Dictionary& options, NativeWindow* parent);
|
|
~NativeWindowMac() override;
|
|
|
|
// NativeWindow:
|
|
void OnTitleChanged() override;
|
|
void SetContentView(views::View* view) override;
|
|
void Close() override;
|
|
void CloseImmediately() override;
|
|
void Focus(bool focus) override;
|
|
bool IsFocused() const override;
|
|
void Show() override;
|
|
void ShowInactive() override;
|
|
void Hide() override;
|
|
bool IsVisible() const override;
|
|
bool IsEnabled() const override;
|
|
void SetEnabled(bool enable) override;
|
|
void Maximize() override;
|
|
void Unmaximize() override;
|
|
bool IsMaximized() const override;
|
|
void Minimize() override;
|
|
void Restore() override;
|
|
bool IsMinimized() const override;
|
|
void SetFullScreen(bool fullscreen) override;
|
|
bool IsFullscreen() const override;
|
|
void SetBounds(const gfx::Rect& bounds, bool animate = false) override;
|
|
gfx::Rect GetBounds() const override;
|
|
bool IsNormal() const override;
|
|
gfx::Rect GetNormalBounds() const override;
|
|
void SetSizeConstraints(
|
|
const extensions::SizeConstraints& window_constraints) override;
|
|
void SetContentSizeConstraints(
|
|
const extensions::SizeConstraints& size_constraints) override;
|
|
void SetResizable(bool resizable) override;
|
|
bool MoveAbove(const std::string& sourceId) override;
|
|
void MoveTop() override;
|
|
bool IsResizable() const override;
|
|
void SetMovable(bool movable) override;
|
|
bool IsMovable() const override;
|
|
void SetMinimizable(bool minimizable) override;
|
|
bool IsMinimizable() const override;
|
|
void SetMaximizable(bool maximizable) override;
|
|
bool IsMaximizable() const override;
|
|
void SetFullScreenable(bool fullscreenable) override;
|
|
bool IsFullScreenable() const override;
|
|
void SetClosable(bool closable) override;
|
|
bool IsClosable() const override;
|
|
void SetAlwaysOnTop(ui::ZOrderLevel z_order,
|
|
const std::string& level,
|
|
int relative_level) override;
|
|
std::string GetAlwaysOnTopLevel() const override;
|
|
ui::ZOrderLevel GetZOrderLevel() const override;
|
|
void Center() override;
|
|
void Invalidate() override;
|
|
void FlashFrame(bool flash) override;
|
|
void SetSkipTaskbar(bool skip) override;
|
|
void SetExcludedFromShownWindowsMenu(bool excluded) override;
|
|
bool IsExcludedFromShownWindowsMenu() const override;
|
|
void SetSimpleFullScreen(bool simple_fullscreen) override;
|
|
bool IsSimpleFullScreen() const override;
|
|
void SetKiosk(bool kiosk) override;
|
|
bool IsKiosk() const override;
|
|
void SetBackgroundColor(SkColor color) override;
|
|
SkColor GetBackgroundColor() const override;
|
|
void InvalidateShadow() override;
|
|
void SetHasShadow(bool has_shadow) override;
|
|
bool HasShadow() const override;
|
|
void SetOpacity(const double opacity) override;
|
|
double GetOpacity() const override;
|
|
void SetRepresentedFilename(const std::string& filename) override;
|
|
std::string GetRepresentedFilename() const override;
|
|
void SetDocumentEdited(bool edited) override;
|
|
bool IsDocumentEdited() const override;
|
|
void SetIgnoreMouseEvents(bool ignore, bool forward) override;
|
|
bool IsHiddenInMissionControl() const override;
|
|
void SetHiddenInMissionControl(bool hidden) override;
|
|
void SetContentProtection(bool enable) override;
|
|
bool IsContentProtected() const override;
|
|
void SetFocusable(bool focusable) override;
|
|
bool IsFocusable() const override;
|
|
void SetParentWindow(NativeWindow* parent) override;
|
|
content::DesktopMediaID GetDesktopMediaID() const override;
|
|
gfx::NativeView GetNativeView() const override;
|
|
gfx::NativeWindow GetNativeWindow() const override;
|
|
gfx::AcceleratedWidget GetAcceleratedWidget() const override;
|
|
NativeWindowHandle GetNativeWindowHandle() const override;
|
|
void SetProgressBar(double progress, const ProgressState state) override;
|
|
void SetOverlayIcon(const gfx::Image& overlay,
|
|
const std::string& description) override;
|
|
void SetVisibleOnAllWorkspaces(bool visible,
|
|
bool visibleOnFullScreen,
|
|
bool skipTransformProcessType) override;
|
|
bool IsVisibleOnAllWorkspaces() const override;
|
|
void SetAutoHideCursor(bool auto_hide) override;
|
|
void SetVibrancy(const std::string& type, int duration) override;
|
|
void SetWindowButtonVisibility(bool visible) override;
|
|
bool GetWindowButtonVisibility() const override;
|
|
void SetWindowButtonPosition(std::optional<gfx::Point> position) override;
|
|
std::optional<gfx::Point> GetWindowButtonPosition() const override;
|
|
void RedrawTrafficLights() override;
|
|
void UpdateFrame() override;
|
|
void SetTouchBar(
|
|
std::vector<gin_helper::PersistentDictionary> items) override;
|
|
void RefreshTouchBarItem(const std::string& item_id) override;
|
|
void SetEscapeTouchBarItem(gin_helper::PersistentDictionary item) override;
|
|
void SelectPreviousTab() override;
|
|
void SelectNextTab() override;
|
|
void ShowAllTabs() override;
|
|
void MergeAllWindows() override;
|
|
void MoveTabToNewWindow() override;
|
|
void ToggleTabBar() override;
|
|
bool AddTabbedWindow(NativeWindow* window) override;
|
|
std::optional<std::string> GetTabbingIdentifier() const override;
|
|
void SetAspectRatio(double aspect_ratio,
|
|
const gfx::Size& extra_size) override;
|
|
void PreviewFile(const std::string& path,
|
|
const std::string& display_name) override;
|
|
void CloseFilePreview() override;
|
|
gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& bounds) const override;
|
|
gfx::Rect WindowBoundsToContentBounds(const gfx::Rect& bounds) const override;
|
|
std::optional<gfx::Rect> GetWindowControlsOverlayRect() override;
|
|
void NotifyWindowEnterFullScreen() override;
|
|
void NotifyWindowLeaveFullScreen() override;
|
|
void SetActive(bool is_key) override;
|
|
bool IsActive() const override;
|
|
// Remove the specified child window without closing it.
|
|
void RemoveChildWindow(NativeWindow* child) override;
|
|
void RemoveChildFromParentWindow() override;
|
|
// Attach child windows, if the window is visible.
|
|
void AttachChildren() override;
|
|
// Detach window from parent without destroying it.
|
|
void DetachChildren() override;
|
|
|
|
void NotifyWindowWillEnterFullScreen();
|
|
void NotifyWindowDidFailToEnterFullScreen();
|
|
void NotifyWindowWillLeaveFullScreen();
|
|
|
|
// Cleanup observers when window is getting closed. Note that the destructor
|
|
// can be called much later after window gets closed, so we should not do
|
|
// cleanup in destructor.
|
|
void Cleanup();
|
|
|
|
void SetBorderless(bool borderless);
|
|
|
|
void UpdateVibrancyRadii(bool fullscreen);
|
|
|
|
void UpdateWindowOriginalFrame();
|
|
|
|
bool IsPanel();
|
|
|
|
// Set the attribute of NSWindow while work around a bug of zoom button.
|
|
bool HasStyleMask(NSUInteger flag) const;
|
|
void SetStyleMask(bool on, NSUInteger flag);
|
|
void SetCollectionBehavior(bool on, NSUInteger flag);
|
|
void SetWindowLevel(int level);
|
|
|
|
bool HandleDeferredClose();
|
|
void SetHasDeferredWindowClose(bool defer_close) {
|
|
has_deferred_window_close_ = defer_close;
|
|
}
|
|
|
|
void set_wants_to_be_visible(bool visible) { wants_to_be_visible_ = visible; }
|
|
bool wants_to_be_visible() const { return wants_to_be_visible_; }
|
|
|
|
enum class VisualEffectState {
|
|
kFollowWindow,
|
|
kActive,
|
|
kInactive,
|
|
};
|
|
|
|
ElectronPreviewItem* preview_item() const { return preview_item_; }
|
|
ElectronTouchBar* touch_bar() const { return touch_bar_; }
|
|
bool zoom_to_page_width() const { return zoom_to_page_width_; }
|
|
bool always_simple_fullscreen() const { return always_simple_fullscreen_; }
|
|
|
|
// We need to save the result of windowWillUseStandardFrame:defaultFrame
|
|
// because macOS calls it with what it refers to as the "best fit" frame for a
|
|
// zoom. This means that even if an aspect ratio is set, macOS might adjust it
|
|
// to better fit the screen.
|
|
//
|
|
// Thus, we can't just calculate the maximized aspect ratio'd sizing from
|
|
// the current visible screen and compare that to the current window's frame
|
|
// to determine whether a window is maximized.
|
|
NSRect default_frame_for_zoom() const { return default_frame_for_zoom_; }
|
|
void set_default_frame_for_zoom(NSRect frame) {
|
|
default_frame_for_zoom_ = frame;
|
|
}
|
|
|
|
protected:
|
|
// views::WidgetDelegate:
|
|
views::View* GetContentsView() override;
|
|
bool CanMaximize() const override;
|
|
std::unique_ptr<views::FrameView> CreateFrameView(
|
|
views::Widget* widget) override;
|
|
void OnWidgetInitialized() override;
|
|
|
|
// ui::NativeThemeObserver:
|
|
void OnNativeThemeUpdated(ui::NativeTheme* observed_theme) override;
|
|
|
|
// display::DisplayObserver:
|
|
void OnDisplayMetricsChanged(const display::Display& display,
|
|
uint32_t changed_metrics) override;
|
|
|
|
private:
|
|
// Add custom layers to the content view.
|
|
void AddContentViewLayers();
|
|
|
|
void InternalSetWindowButtonVisibility(bool visible);
|
|
void InternalSetParentWindow(NativeWindow* parent, bool attach);
|
|
void SetForwardMouseMessages(bool forward);
|
|
|
|
void UpdateZoomButton();
|
|
|
|
ElectronNSWindow* window_; // Weak ref, managed by widget_.
|
|
|
|
ElectronNSWindowDelegate* __strong window_delegate_;
|
|
ElectronPreviewItem* __strong preview_item_;
|
|
ElectronTouchBar* __strong touch_bar_;
|
|
|
|
// The views::View that fills the client area.
|
|
std::unique_ptr<RootViewMac> root_view_;
|
|
|
|
bool fullscreen_before_kiosk_ = false;
|
|
bool is_kiosk_ = false;
|
|
bool zoom_to_page_width_ = false;
|
|
std::optional<gfx::Point> traffic_light_position_;
|
|
|
|
// Trying to close an NSWindow during a fullscreen transition will cause the
|
|
// window to lock up. Use this to track if CloseWindow was called during a
|
|
// fullscreen transition, to defer the -[NSWindow close] call until the
|
|
// transition is complete.
|
|
bool has_deferred_window_close_ = false;
|
|
|
|
// If true, the window is either visible, or wants to be visible but is
|
|
// currently hidden due to having a hidden parent.
|
|
bool wants_to_be_visible_ = false;
|
|
|
|
NSInteger attention_request_id_ = 0; // identifier from requestUserAttention
|
|
|
|
// The presentation options before entering kiosk mode.
|
|
NSApplicationPresentationOptions kiosk_options_;
|
|
|
|
// The "visualEffectState" option.
|
|
VisualEffectState visual_effect_state_ = VisualEffectState::kFollowWindow;
|
|
|
|
// The visibility mode of window button controls when explicitly set through
|
|
// setWindowButtonVisibility().
|
|
std::optional<bool> window_button_visibility_;
|
|
|
|
// Controls the position and visibility of window buttons.
|
|
WindowButtonsProxy* __strong buttons_proxy_;
|
|
|
|
std::unique_ptr<SkRegion> draggable_region_;
|
|
|
|
// Maximizable window state; necessary for persistence through redraws.
|
|
bool maximizable_ = true;
|
|
|
|
bool user_set_bounds_maximized_ = false;
|
|
|
|
// Simple (pre-Lion) Fullscreen Settings
|
|
bool always_simple_fullscreen_ = false;
|
|
bool is_simple_fullscreen_ = false;
|
|
bool was_maximizable_ = false;
|
|
bool was_movable_ = false;
|
|
bool is_active_ = false;
|
|
NSRect original_frame_;
|
|
NSInteger original_level_;
|
|
NSUInteger simple_fullscreen_mask_;
|
|
NSRect default_frame_for_zoom_;
|
|
|
|
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_;
|
|
|
|
// Client that provides app-specific frame behaviors to NativeFrameViewMac.
|
|
std::unique_ptr<NativeAppWindowFrameViewMacClient> frame_view_client_;
|
|
};
|
|
|
|
} // namespace electron
|
|
|
|
#endif // ELECTRON_SHELL_BROWSER_NATIVE_WINDOW_MAC_H_
|