2014-10-31 18:17:05 +00:00
|
|
|
// Copyright (c) 2013 GitHub, Inc.
|
2014-04-25 09:49:37 +00:00
|
|
|
// Use of this source code is governed by the MIT license that can be
|
2013-04-12 07:04:46 +00:00
|
|
|
// found in the LICENSE file.
|
|
|
|
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/native_window_mac.h"
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2017-10-05 22:57:27 +00:00
|
|
|
#include <AvailabilityMacros.h>
|
2018-05-02 11:43:45 +00:00
|
|
|
#include <objc/objc-runtime.h>
|
2018-04-19 07:41:36 +00:00
|
|
|
|
2020-01-29 17:03:53 +00:00
|
|
|
#include <algorithm>
|
2016-10-26 00:55:34 +00:00
|
|
|
#include <string>
|
2020-01-29 17:03:53 +00:00
|
|
|
#include <utility>
|
2019-05-02 12:05:37 +00:00
|
|
|
#include <vector>
|
2013-04-15 16:25:08 +00:00
|
|
|
|
2014-05-15 07:19:02 +00:00
|
|
|
#include "base/mac/mac_util.h"
|
2016-04-03 02:59:21 +00:00
|
|
|
#include "base/mac/scoped_cftyperef.h"
|
2019-08-07 07:17:32 +00:00
|
|
|
#include "base/numerics/ranges.h"
|
2014-05-15 07:19:02 +00:00
|
|
|
#include "base/strings/sys_string_conversions.h"
|
2020-03-05 20:19:05 +00:00
|
|
|
#include "base/task/post_task.h"
|
2019-06-05 00:27:07 +00:00
|
|
|
#include "components/remote_cocoa/app_shim/native_widget_ns_window_bridge.h"
|
chore: bump chromium to 92.0.4475.0 (master) (#28462)
* chore: bump chromium in DEPS to 91.0.4464.0
* chore: rebuild chromium/dcheck.patch with import-patches -3
Mechanical only; no code changes
* chore: remove content_browser_main_loop.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
The function being patched (BrowserMainLoop::MainMessageLoopRun()) no
longer exists.
NB: if removing this introduces regressions the likely fix will be to
add a similar patch for ShellBrowserMainParts::WillRunMainMessageLoop()
which has similar code and was added at the same time this was removed.
* chore: rebuild chromium/put_back_deleted_colors_for_autofill.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/disable_color_correct_rendering.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/eat_allow_disabling_blink_scheduler_throttling_per_renderview.patch with patch
Mechanical only; no code changes
* chore: rebuild chromium/gpu_notify_when_dxdiag_request_fails.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/ui_gtk_public_header.patch manually
no code changes
* chore: rebuild chromium/web_contents.patch with import-patches -3
Mechanical only; no code changes
* chore: remove v8/skip_global_registration_of_shared_arraybuffer_backing_stores.patch
Refs: https://chromium-review.googlesource.com/c/v8/v8/+/2763874
This patch has been merged upstream
* chore: export patches
* chore: update add_trustedauthclient_to_urlloaderfactory.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2757969
Sync with removal of render_frame_id_
* chore: sync chromium/put_back_deleted_colors_for_autofill.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2785841
SkColorFromColorId() no longer takes theme, scheme args
* chore: sync chromium/put_back_deleted_colors_for_autofill.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2772143
Change new calls to GetDarkSchemeColor to fit our patched call signature
* chore: update add_trustedauthclient_to_urlloaderfactory.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2757969
Sync with removal of render_frame_id_ in our mojom
* chore: update chromium/frame_host_manager.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2740008
UrlInfo ctor now takes UrlInfo::OriginIsolationRequest instead of a bool
* chore: update chromium/revert_remove_contentrendererclient_shouldfork.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2755314
Upstream has removed `history_list_length_` which we were comparing to 0
to calculate our `is_initial_navigation` bool when calling ShouldFork().
ShouldFork() is ours and none of the code paths actually use that param,
so this commit removes it altogether.
* chore: update permissions_to_register
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2789074
Replace all uses of APIPermission::ID enum with Mojo type
* refactor: update return type of PreMainMessageLoopRun()
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
Used to return void; now returns an int errorcode.
Note: 2725153 also has some nice doc updates about Browser's "stages"
* refactor: sync ElectronBrowserMainParts to MainParts changes
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
RunMainMessageLoopParts has been replaced with WillRunMainMessageLoop
so `BrowserMainLoop::result_code_` is no longer available to us for our
exit_code_ pointer.
This variable held a dual role: (1) of course, hold the exit code, but
also (2) was a nullptr before the message loop was ready, indicating to
anyone calling SetExitCode() that we were still in startup and could
just exit() without any extra steps. exit_code_ still fulfills these two
roles but is now a base::Optional.
* chore: update ElectronBrowserMainParts::PreDefaultMainMessageLoopRun
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
BrowserMainParts::BrowsePreDefaultMainMesssageLoopRun() has been
removed; move that work to the new WillRunMainMessageLoop().
* refactor: stop using CallbackList; it has been removed.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2785973
* refactor: update use of threadpools.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2773408
The upstream code is still in flux (e.g. reverts and re-lands) but the
tl;dr for this commit is (1) include thread_pool.h if you're using it
and (2) don't instantiate pools directly.
* refactor: remove routing_id from CreateLoaderAndStart
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762858
NB: One logic branch in ProxyingURLLoaderFactory::CreateLoaderAndStart
calls std::make_unique<InProgressRequest>, which needs a routing_id.
This PR uses the member field `routing_id_` since there's no longer one
being passed into CreateLoaderAndStart.
* refactor: sync to upstream ParittionOptions churn
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771318
PartitionOptions' enums have changed.
* refactor: update Manifest::Location usage
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771320
tldr: s/Manifest::FOO/ManifestLocation::kFoo/
* chore: bump chromium in DEPS to 91.0.4465.0
* update patches
* refactor: update extensions::Manifest to upstream
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771320
- extensions::Manifest::COMPONENT
+ extensions::mojom::ManifestLocation::kExternalComponent
* refactor: sync with upstream UrlInfo ctor changes
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2740008
UrlInfo ctor now takes UrlInfo::OriginIsolationRequest instead of a bool
* chore: update invocation of convert_protocol_to_json.py
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2792623
python3 is being used in parts of the upstream build, but the copy of
convert_protocol_to_json.py invoked in v8/third_party/inspector_protocol
is not python3-friendly. Node has a py2+3-friendly version of it in its
tools directory, so call it instead.
* chore: use extensions::mojom::APIPermissionID
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791122
tldr:
- extensions::APIPermission::kFoo
+ extensions::mojom::APIPermissionID::kFoo
* chore: Remove support for TLS1.0/1.1 in SSLVersionMin policy
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2765737
Remove TLS v1.0 & 1.1 from our SSLProtocolVersionFromString() function.
This is the same change made upstream at
https://chromium-review.googlesource.com/c/chromium/src/+/2765737/8/chrome/browser/ssl/ssl_config_service_manager_pref.cc
* fixup! chore: update ElectronBrowserMainParts::PreDefaultMainMessageLoopRun
* chore: Use IDType for permission change subscriptions.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791431
tldr: {Subscribe,Unsubscribe}PermissionStatusChange's tag type used to
be an int; now it's the new SubscriptionId type (which is an IdType64).
* chore: sync PowerMonitor code to upstream refactor
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2752635
tldr: PowerMonitor has been split into PowerStateObserver,
PowerSuspendObserver, and PowerThermalObserver to reduce number of tasks
posted to consumers who only need notifications for one of those things
instead of all of them.
* chore: use PartitionOptions's new Cookies field
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771318
* Revert "refactor: remove routing_id from CreateLoaderAndStart"
This reverts commit 8c9773b87a3c84f9073a47089eb2b6889d745245.
8c9773b was only a partial fix; reverting to start & try again.
* update patches
* chore: bump chromium in DEPS to 91.0.4466.0
* chore: update chromium/accelerator.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2795472
tldr: sync patch with upstream renamed variable & macro names.
* chore: update chromium/gtk_visibility.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2796200
tldr: no code changes; just updating the diff to apply cleanly.
note: ooh upstream Wayland hacking!
* chore: update chromium/picture-in-picture.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2710023
tldr: no code changes; just updating the diff to apply cleanly.
* chore: update chromium/worker_feat_add_hook_to_notify_script_ready.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2775573
tldr: no code changes; just updating the diff to apply cleanly.
* chore: export_all_patches
* chore: update chromium/feat_add_set_theme_source_to_allow_apps_to.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2796511
tldr: NotifyObservers has been renamed to NotifyOnNativeThemeUpdated,
so update the invocation in our patch.
* chore: update ElectronBrowserClient w/upstream API
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797454
tldr: GetDevToolsManagerDelegate() was returning an owned raw pointer.
Replaced it with CreateDevToolsManagerDelegate() which uses unique_ptr<>.
* chore: handle new content::PermissionType::FILE_HANDLING in toV8()
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762201
`file-handling` string confirmed in https://chromium-review.googlesource.com/c/chromium/src/+/2762201/18/chrome/browser/ui/webui/settings/site_settings_helper.cc
* refactor: remove routing_id from CreateLoaderAndStart pt 1
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762858
Part 1: the easiest ones
* 2796724: Support Python3
https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2796724
* chore: bump chromium in DEPS to 91.0.4468.0
* 2668974: WebShare: Implement SharingServicePicker
https://chromium-review.googlesource.com/c/chromium/src/+/2668974
* 2802766: Apply modernize-make-unique to media/
https://chromium-review.googlesource.com/c/chromium/src/+/2802766
* 2802823: Apply modernize-make-unique to gpu/
https://chromium-review.googlesource.com/c/chromium/src/+/2802823
* 2803041: Apply modernize-make-unique to remaining files
https://chromium-review.googlesource.com/c/chromium/src/+/2803041
* 2798873: Convert GtkKeyBindingsHandler build checks to runtime checks
https://chromium-review.googlesource.com/c/chromium/src/+/2798873
* 2733595: [ch-r] Parse ACCEPT_CH H2/3 frame and restart with new headers if needed
https://chromium-review.googlesource.com/c/chromium/src/+/2733595
* chore: update patch indices
* 2795107: Remove unused PermissionRequest IDs.
https://chromium-review.googlesource.com/c/chromium/src/+/2795107
* chore: bump chromium in DEPS to 91.0.4469.0
* chore: fixup patch indices
* chore: bump chromium in DEPS to 91.0.4469.5
* PiP 1.5: Add microphone, camera, and hang up buttons to the PiP window
https://chromium-review.googlesource.com/c/chromium/src/+/2710023
* fixup! refactor: remove routing_id from CreateLoaderAndStart
* refactor: use URLLoaderNetworkServiceObserver for auth requests from SimpleURLLoader
* fixup! chore: fixup patch indices
* 2724817: Expand scope of wasm-eval to all URLs
https://chromium-review.googlesource.com/c/chromium/src/+/2724817
* Fixup patch after rebase
* chore: bump chromium in DEPS to 91.0.4472.0
* 2797341: [ozone/x11] Enabled the global shortcut listener.
https://chromium-review.googlesource.com/c/chromium/src/+/2797341
* 2805553: Reland Add GTK ColorMixers to ColorPipeline P1
https://chromium-review.googlesource.com/c/chromium/src/+/2805553
* 2804366: PiP 1.5: Label back to tab button with origin and center it
https://chromium-review.googlesource.com/c/chromium/src/+/2804366
* 2784730: Fix crash on AX mode change in NativeViewHost without a Widget
https://chromium-review.googlesource.com/c/chromium/src/+/2784730
* chore: update patch indices
* 2810174: Add PdfAnnotationsEnabled policy.
https://chromium-review.googlesource.com/c/chromium/src/+/2810174
* 2807829: Allow capturers to indicate if they want a WakeLock or not.
https://chromium-review.googlesource.com/c/chromium/src/+/2807829
* chore: bump chromium in DEPS to 92.0.4473.0
* chore: bump chromium in DEPS to 92.0.4474.0
* chore: bump chromium in DEPS to 92.0.4475.0
* chore: update patches
* chore: updates patches
* chore: update is_media_key patch to handle new ozone impl
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797341
* fix: ExecuteJavascript requests now need to be flagged as non-bf-aware
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2787195
* chore: icon_util_x11 is now icon_util_linux
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791362
* build: update sysroots
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2628496
* build: fix missing symbols on linux build
* use_ozone and use_x11 are not exclusive
* new button view to build for pip
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797341
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2804366
* chore: fix broken gtk_util color patch
* chore: remove patch conflict
* build: update linux manifests
* chore: build bttlb on all platforms for pip
* chore: add thread_pool include for views delegate win
* chore: fix lint
* chore: add node patches for V8 changes
* build: add missing base include on windows
* fix: update frame host manager patch for new state transitions
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2714464
* chore: update windows zip manifests
* chore: update mac zip manifests
* chore: fix patch linting
* refactor: implement missing URLLoaderNetworkServiceObserver methods
It is against The Mojo Rules to leave hanging callbacks. These always
have to be called.
Refs: https://github.com/electron/electron/commit/186528aab9f8e29d658f07d220bb7f627980edda
* spec: fix locale test on local linux
* fix: pass the exit code correctly in new PreMainMessageLoopRun
Refs: https://github.com/electron/electron/commit/2622e91c4493ceb032e2f80cb484885bb8f97475
* fix: ensure we early-exit when request_handler_ is not provided
Refs: https://github.com/electron/electron/commit/93077afbfb6db248a0c0cc447d7ad2c9ccfda1d5
* fix: strongly set result_code in the BrowserMainLoop
* fix: invalid usage of non-targetted PostTask
You must always either use a host threadpool or specify a target
thread. In this case we did neither after this refactor.
Refs: https://github.com/electron/electron/pull/28462/commits/4e33ee0ad35a710bd34641cb0376bdee6aea2d1f
* chore: fix gn check
* chore: remove stray .rej files in patch
* chore: add mojo error code to url loader failure
* build: ensure CI is truthy in arm test env
* fix: handle windowCaptureMacV2 being enabled when fetching media source id
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2709931
Co-authored-by: Charles Kerr <charles@charleskerr.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
Co-authored-by: deepak1556 <hop2deep@gmail.com>
Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>
Co-authored-by: Samuel Attard <sattard@slack-corp.com>
2021-04-15 17:44:35 +00:00
|
|
|
#include "components/remote_cocoa/browser/scoped_cg_window_id.h"
|
2015-04-13 12:10:51 +00:00
|
|
|
#include "content/public/browser/browser_accessibility_state.h"
|
2020-03-05 20:19:05 +00:00
|
|
|
#include "content/public/browser/browser_task_traits.h"
|
|
|
|
#include "content/public/browser/browser_thread.h"
|
2019-08-15 06:51:15 +00:00
|
|
|
#include "content/public/browser/desktop_media_id.h"
|
chore: bump chromium to 92.0.4475.0 (master) (#28462)
* chore: bump chromium in DEPS to 91.0.4464.0
* chore: rebuild chromium/dcheck.patch with import-patches -3
Mechanical only; no code changes
* chore: remove content_browser_main_loop.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
The function being patched (BrowserMainLoop::MainMessageLoopRun()) no
longer exists.
NB: if removing this introduces regressions the likely fix will be to
add a similar patch for ShellBrowserMainParts::WillRunMainMessageLoop()
which has similar code and was added at the same time this was removed.
* chore: rebuild chromium/put_back_deleted_colors_for_autofill.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/disable_color_correct_rendering.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/eat_allow_disabling_blink_scheduler_throttling_per_renderview.patch with patch
Mechanical only; no code changes
* chore: rebuild chromium/gpu_notify_when_dxdiag_request_fails.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/ui_gtk_public_header.patch manually
no code changes
* chore: rebuild chromium/web_contents.patch with import-patches -3
Mechanical only; no code changes
* chore: remove v8/skip_global_registration_of_shared_arraybuffer_backing_stores.patch
Refs: https://chromium-review.googlesource.com/c/v8/v8/+/2763874
This patch has been merged upstream
* chore: export patches
* chore: update add_trustedauthclient_to_urlloaderfactory.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2757969
Sync with removal of render_frame_id_
* chore: sync chromium/put_back_deleted_colors_for_autofill.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2785841
SkColorFromColorId() no longer takes theme, scheme args
* chore: sync chromium/put_back_deleted_colors_for_autofill.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2772143
Change new calls to GetDarkSchemeColor to fit our patched call signature
* chore: update add_trustedauthclient_to_urlloaderfactory.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2757969
Sync with removal of render_frame_id_ in our mojom
* chore: update chromium/frame_host_manager.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2740008
UrlInfo ctor now takes UrlInfo::OriginIsolationRequest instead of a bool
* chore: update chromium/revert_remove_contentrendererclient_shouldfork.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2755314
Upstream has removed `history_list_length_` which we were comparing to 0
to calculate our `is_initial_navigation` bool when calling ShouldFork().
ShouldFork() is ours and none of the code paths actually use that param,
so this commit removes it altogether.
* chore: update permissions_to_register
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2789074
Replace all uses of APIPermission::ID enum with Mojo type
* refactor: update return type of PreMainMessageLoopRun()
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
Used to return void; now returns an int errorcode.
Note: 2725153 also has some nice doc updates about Browser's "stages"
* refactor: sync ElectronBrowserMainParts to MainParts changes
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
RunMainMessageLoopParts has been replaced with WillRunMainMessageLoop
so `BrowserMainLoop::result_code_` is no longer available to us for our
exit_code_ pointer.
This variable held a dual role: (1) of course, hold the exit code, but
also (2) was a nullptr before the message loop was ready, indicating to
anyone calling SetExitCode() that we were still in startup and could
just exit() without any extra steps. exit_code_ still fulfills these two
roles but is now a base::Optional.
* chore: update ElectronBrowserMainParts::PreDefaultMainMessageLoopRun
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
BrowserMainParts::BrowsePreDefaultMainMesssageLoopRun() has been
removed; move that work to the new WillRunMainMessageLoop().
* refactor: stop using CallbackList; it has been removed.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2785973
* refactor: update use of threadpools.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2773408
The upstream code is still in flux (e.g. reverts and re-lands) but the
tl;dr for this commit is (1) include thread_pool.h if you're using it
and (2) don't instantiate pools directly.
* refactor: remove routing_id from CreateLoaderAndStart
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762858
NB: One logic branch in ProxyingURLLoaderFactory::CreateLoaderAndStart
calls std::make_unique<InProgressRequest>, which needs a routing_id.
This PR uses the member field `routing_id_` since there's no longer one
being passed into CreateLoaderAndStart.
* refactor: sync to upstream ParittionOptions churn
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771318
PartitionOptions' enums have changed.
* refactor: update Manifest::Location usage
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771320
tldr: s/Manifest::FOO/ManifestLocation::kFoo/
* chore: bump chromium in DEPS to 91.0.4465.0
* update patches
* refactor: update extensions::Manifest to upstream
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771320
- extensions::Manifest::COMPONENT
+ extensions::mojom::ManifestLocation::kExternalComponent
* refactor: sync with upstream UrlInfo ctor changes
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2740008
UrlInfo ctor now takes UrlInfo::OriginIsolationRequest instead of a bool
* chore: update invocation of convert_protocol_to_json.py
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2792623
python3 is being used in parts of the upstream build, but the copy of
convert_protocol_to_json.py invoked in v8/third_party/inspector_protocol
is not python3-friendly. Node has a py2+3-friendly version of it in its
tools directory, so call it instead.
* chore: use extensions::mojom::APIPermissionID
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791122
tldr:
- extensions::APIPermission::kFoo
+ extensions::mojom::APIPermissionID::kFoo
* chore: Remove support for TLS1.0/1.1 in SSLVersionMin policy
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2765737
Remove TLS v1.0 & 1.1 from our SSLProtocolVersionFromString() function.
This is the same change made upstream at
https://chromium-review.googlesource.com/c/chromium/src/+/2765737/8/chrome/browser/ssl/ssl_config_service_manager_pref.cc
* fixup! chore: update ElectronBrowserMainParts::PreDefaultMainMessageLoopRun
* chore: Use IDType for permission change subscriptions.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791431
tldr: {Subscribe,Unsubscribe}PermissionStatusChange's tag type used to
be an int; now it's the new SubscriptionId type (which is an IdType64).
* chore: sync PowerMonitor code to upstream refactor
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2752635
tldr: PowerMonitor has been split into PowerStateObserver,
PowerSuspendObserver, and PowerThermalObserver to reduce number of tasks
posted to consumers who only need notifications for one of those things
instead of all of them.
* chore: use PartitionOptions's new Cookies field
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771318
* Revert "refactor: remove routing_id from CreateLoaderAndStart"
This reverts commit 8c9773b87a3c84f9073a47089eb2b6889d745245.
8c9773b was only a partial fix; reverting to start & try again.
* update patches
* chore: bump chromium in DEPS to 91.0.4466.0
* chore: update chromium/accelerator.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2795472
tldr: sync patch with upstream renamed variable & macro names.
* chore: update chromium/gtk_visibility.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2796200
tldr: no code changes; just updating the diff to apply cleanly.
note: ooh upstream Wayland hacking!
* chore: update chromium/picture-in-picture.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2710023
tldr: no code changes; just updating the diff to apply cleanly.
* chore: update chromium/worker_feat_add_hook_to_notify_script_ready.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2775573
tldr: no code changes; just updating the diff to apply cleanly.
* chore: export_all_patches
* chore: update chromium/feat_add_set_theme_source_to_allow_apps_to.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2796511
tldr: NotifyObservers has been renamed to NotifyOnNativeThemeUpdated,
so update the invocation in our patch.
* chore: update ElectronBrowserClient w/upstream API
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797454
tldr: GetDevToolsManagerDelegate() was returning an owned raw pointer.
Replaced it with CreateDevToolsManagerDelegate() which uses unique_ptr<>.
* chore: handle new content::PermissionType::FILE_HANDLING in toV8()
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762201
`file-handling` string confirmed in https://chromium-review.googlesource.com/c/chromium/src/+/2762201/18/chrome/browser/ui/webui/settings/site_settings_helper.cc
* refactor: remove routing_id from CreateLoaderAndStart pt 1
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762858
Part 1: the easiest ones
* 2796724: Support Python3
https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2796724
* chore: bump chromium in DEPS to 91.0.4468.0
* 2668974: WebShare: Implement SharingServicePicker
https://chromium-review.googlesource.com/c/chromium/src/+/2668974
* 2802766: Apply modernize-make-unique to media/
https://chromium-review.googlesource.com/c/chromium/src/+/2802766
* 2802823: Apply modernize-make-unique to gpu/
https://chromium-review.googlesource.com/c/chromium/src/+/2802823
* 2803041: Apply modernize-make-unique to remaining files
https://chromium-review.googlesource.com/c/chromium/src/+/2803041
* 2798873: Convert GtkKeyBindingsHandler build checks to runtime checks
https://chromium-review.googlesource.com/c/chromium/src/+/2798873
* 2733595: [ch-r] Parse ACCEPT_CH H2/3 frame and restart with new headers if needed
https://chromium-review.googlesource.com/c/chromium/src/+/2733595
* chore: update patch indices
* 2795107: Remove unused PermissionRequest IDs.
https://chromium-review.googlesource.com/c/chromium/src/+/2795107
* chore: bump chromium in DEPS to 91.0.4469.0
* chore: fixup patch indices
* chore: bump chromium in DEPS to 91.0.4469.5
* PiP 1.5: Add microphone, camera, and hang up buttons to the PiP window
https://chromium-review.googlesource.com/c/chromium/src/+/2710023
* fixup! refactor: remove routing_id from CreateLoaderAndStart
* refactor: use URLLoaderNetworkServiceObserver for auth requests from SimpleURLLoader
* fixup! chore: fixup patch indices
* 2724817: Expand scope of wasm-eval to all URLs
https://chromium-review.googlesource.com/c/chromium/src/+/2724817
* Fixup patch after rebase
* chore: bump chromium in DEPS to 91.0.4472.0
* 2797341: [ozone/x11] Enabled the global shortcut listener.
https://chromium-review.googlesource.com/c/chromium/src/+/2797341
* 2805553: Reland Add GTK ColorMixers to ColorPipeline P1
https://chromium-review.googlesource.com/c/chromium/src/+/2805553
* 2804366: PiP 1.5: Label back to tab button with origin and center it
https://chromium-review.googlesource.com/c/chromium/src/+/2804366
* 2784730: Fix crash on AX mode change in NativeViewHost without a Widget
https://chromium-review.googlesource.com/c/chromium/src/+/2784730
* chore: update patch indices
* 2810174: Add PdfAnnotationsEnabled policy.
https://chromium-review.googlesource.com/c/chromium/src/+/2810174
* 2807829: Allow capturers to indicate if they want a WakeLock or not.
https://chromium-review.googlesource.com/c/chromium/src/+/2807829
* chore: bump chromium in DEPS to 92.0.4473.0
* chore: bump chromium in DEPS to 92.0.4474.0
* chore: bump chromium in DEPS to 92.0.4475.0
* chore: update patches
* chore: updates patches
* chore: update is_media_key patch to handle new ozone impl
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797341
* fix: ExecuteJavascript requests now need to be flagged as non-bf-aware
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2787195
* chore: icon_util_x11 is now icon_util_linux
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791362
* build: update sysroots
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2628496
* build: fix missing symbols on linux build
* use_ozone and use_x11 are not exclusive
* new button view to build for pip
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797341
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2804366
* chore: fix broken gtk_util color patch
* chore: remove patch conflict
* build: update linux manifests
* chore: build bttlb on all platforms for pip
* chore: add thread_pool include for views delegate win
* chore: fix lint
* chore: add node patches for V8 changes
* build: add missing base include on windows
* fix: update frame host manager patch for new state transitions
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2714464
* chore: update windows zip manifests
* chore: update mac zip manifests
* chore: fix patch linting
* refactor: implement missing URLLoaderNetworkServiceObserver methods
It is against The Mojo Rules to leave hanging callbacks. These always
have to be called.
Refs: https://github.com/electron/electron/commit/186528aab9f8e29d658f07d220bb7f627980edda
* spec: fix locale test on local linux
* fix: pass the exit code correctly in new PreMainMessageLoopRun
Refs: https://github.com/electron/electron/commit/2622e91c4493ceb032e2f80cb484885bb8f97475
* fix: ensure we early-exit when request_handler_ is not provided
Refs: https://github.com/electron/electron/commit/93077afbfb6db248a0c0cc447d7ad2c9ccfda1d5
* fix: strongly set result_code in the BrowserMainLoop
* fix: invalid usage of non-targetted PostTask
You must always either use a host threadpool or specify a target
thread. In this case we did neither after this refactor.
Refs: https://github.com/electron/electron/pull/28462/commits/4e33ee0ad35a710bd34641cb0376bdee6aea2d1f
* chore: fix gn check
* chore: remove stray .rej files in patch
* chore: add mojo error code to url loader failure
* build: ensure CI is truthy in arm test env
* fix: handle windowCaptureMacV2 being enabled when fetching media source id
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2709931
Co-authored-by: Charles Kerr <charles@charleskerr.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
Co-authored-by: deepak1556 <hop2deep@gmail.com>
Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>
Co-authored-by: Samuel Attard <sattard@slack-corp.com>
2021-04-15 17:44:35 +00:00
|
|
|
#include "content/public/common/content_features.h"
|
2021-03-29 10:45:08 +00:00
|
|
|
#include "shell/browser/javascript_environment.h"
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/native_browser_view_mac.h"
|
2020-02-04 20:19:40 +00:00
|
|
|
#include "shell/browser/ui/cocoa/electron_native_widget_mac.h"
|
|
|
|
#include "shell/browser/ui/cocoa/electron_ns_window.h"
|
|
|
|
#include "shell/browser/ui/cocoa/electron_ns_window_delegate.h"
|
|
|
|
#include "shell/browser/ui/cocoa/electron_preview_item.h"
|
|
|
|
#include "shell/browser/ui/cocoa/electron_touch_bar.h"
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/ui/cocoa/root_view_mac.h"
|
2021-01-30 23:15:10 +00:00
|
|
|
#include "shell/browser/ui/cocoa/window_buttons_view.h"
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/browser/ui/inspectable_web_contents.h"
|
|
|
|
#include "shell/browser/ui/inspectable_web_contents_view.h"
|
|
|
|
#include "shell/browser/window_list.h"
|
2020-01-23 18:13:08 +00:00
|
|
|
#include "shell/common/gin_converters/gfx_converter.h"
|
2019-10-25 13:03:28 +00:00
|
|
|
#include "shell/common/gin_helper/dictionary.h"
|
2019-06-19 20:46:59 +00:00
|
|
|
#include "shell/common/options_switches.h"
|
2020-02-03 22:01:10 +00:00
|
|
|
#include "shell/common/process_util.h"
|
2016-04-02 12:17:38 +00:00
|
|
|
#include "skia/ext/skia_utils_mac.h"
|
2019-08-15 06:51:15 +00:00
|
|
|
#include "third_party/webrtc/modules/desktop_capture/mac/window_list_utils.h"
|
2021-03-16 09:41:59 +00:00
|
|
|
#include "ui/display/screen.h"
|
2015-10-20 23:33:43 +00:00
|
|
|
#include "ui/gfx/skia_util.h"
|
2018-03-07 16:40:36 +00:00
|
|
|
#include "ui/gl/gpu_switching_manager.h"
|
2018-04-24 10:00:44 +00:00
|
|
|
#include "ui/views/background.h"
|
2019-08-22 21:16:56 +00:00
|
|
|
#include "ui/views/cocoa/native_widget_mac_ns_window_host.h"
|
2018-04-19 06:26:34 +00:00
|
|
|
#include "ui/views/widget/widget.h"
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2019-08-22 21:16:56 +00:00
|
|
|
// This view would inform Chromium to resize the hosted views::View.
|
|
|
|
//
|
|
|
|
// The overrided methods should behave the same with BridgedContentView.
|
2020-03-17 17:58:57 +00:00
|
|
|
@interface ElectronAdaptedContentView : NSView {
|
2019-08-22 21:16:56 +00:00
|
|
|
@private
|
|
|
|
views::NativeWidgetMacNSWindowHost* bridge_host_;
|
|
|
|
}
|
|
|
|
@end
|
|
|
|
|
2020-03-17 17:58:57 +00:00
|
|
|
@implementation ElectronAdaptedContentView
|
2019-08-22 21:16:56 +00:00
|
|
|
|
|
|
|
- (id)initWithShell:(electron::NativeWindowMac*)shell {
|
|
|
|
if ((self = [self init])) {
|
|
|
|
bridge_host_ = views::NativeWidgetMacNSWindowHost::GetFromNativeWindow(
|
|
|
|
shell->GetNativeWindow());
|
|
|
|
}
|
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)viewDidMoveToWindow {
|
|
|
|
// When this view is added to a window, AppKit calls setFrameSize before it is
|
|
|
|
// added to the window, so the behavior in setFrameSize is not triggered.
|
|
|
|
NSWindow* window = [self window];
|
|
|
|
if (window)
|
|
|
|
[self setFrameSize:NSZeroSize];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void)setFrameSize:(NSSize)newSize {
|
|
|
|
// The size passed in here does not always use
|
|
|
|
// -[NSWindow contentRectForFrameRect]. The following ensures that the
|
|
|
|
// contentView for a frameless window can extend over the titlebar of the new
|
|
|
|
// window containing it, since AppKit requires a titlebar to give frameless
|
|
|
|
// windows correct shadows and rounded corners.
|
|
|
|
NSWindow* window = [self window];
|
|
|
|
if (window && [window contentView] == self) {
|
|
|
|
newSize = [window contentRectForFrameRect:[window frame]].size;
|
|
|
|
// Ensure that the window geometry be updated on the host side before the
|
|
|
|
// view size is updated.
|
|
|
|
bridge_host_->GetInProcessNSWindowBridge()->UpdateWindowGeometry();
|
|
|
|
}
|
|
|
|
|
|
|
|
[super setFrameSize:newSize];
|
|
|
|
|
|
|
|
// The OnViewSizeChanged is marked private in derived class.
|
|
|
|
static_cast<remote_cocoa::mojom::NativeWidgetNSWindowHost*>(bridge_host_)
|
|
|
|
->OnViewSizeChanged(gfx::Size(newSize.width, newSize.height));
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
2018-07-10 01:43:42 +00:00
|
|
|
// This view always takes the size of its superview. It is intended to be used
|
|
|
|
// as a NSWindow's contentView. It is needed because NSWindow's implementation
|
|
|
|
// explicitly resizes the contentView at inopportune times.
|
|
|
|
@interface FullSizeContentView : NSView
|
|
|
|
@end
|
|
|
|
|
|
|
|
@implementation FullSizeContentView
|
|
|
|
|
|
|
|
// This method is directly called by NSWindow during a window resize on OSX
|
|
|
|
// 10.10.0, beta 2. We must override it to prevent the content view from
|
|
|
|
// shrinking.
|
|
|
|
- (void)setFrameSize:(NSSize)size {
|
|
|
|
if ([self superview])
|
|
|
|
size = [[self superview] bounds].size;
|
|
|
|
[super setFrameSize:size];
|
|
|
|
}
|
|
|
|
|
|
|
|
// The contentView gets moved around during certain full-screen operations.
|
|
|
|
// This is less than ideal, and should eventually be removed.
|
|
|
|
- (void)viewDidMoveToSuperview {
|
|
|
|
[self setFrame:[[self superview] bounds]];
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
2020-02-04 20:19:40 +00:00
|
|
|
@interface ElectronProgressBar : NSProgressIndicator
|
2014-09-17 07:58:08 +00:00
|
|
|
@end
|
|
|
|
|
2020-02-04 20:19:40 +00:00
|
|
|
@implementation ElectronProgressBar
|
2014-09-17 07:58:08 +00:00
|
|
|
|
|
|
|
- (void)drawRect:(NSRect)dirtyRect {
|
|
|
|
if (self.style != NSProgressIndicatorBarStyle)
|
|
|
|
return;
|
|
|
|
// Draw edges of rounded rect.
|
|
|
|
NSRect rect = NSInsetRect([self bounds], 1.0, 1.0);
|
2014-09-18 08:17:49 +00:00
|
|
|
CGFloat radius = rect.size.height / 2;
|
2018-04-20 18:47:04 +00:00
|
|
|
NSBezierPath* bezier_path = [NSBezierPath bezierPathWithRoundedRect:rect
|
|
|
|
xRadius:radius
|
|
|
|
yRadius:radius];
|
2014-09-18 08:17:49 +00:00
|
|
|
[bezier_path setLineWidth:2.0];
|
|
|
|
[[NSColor grayColor] set];
|
|
|
|
[bezier_path stroke];
|
2014-09-17 07:58:08 +00:00
|
|
|
|
|
|
|
// Fill the rounded rect.
|
2014-09-18 08:17:49 +00:00
|
|
|
rect = NSInsetRect(rect, 2.0, 2.0);
|
|
|
|
radius = rect.size.height / 2;
|
2018-04-20 18:47:04 +00:00
|
|
|
bezier_path = [NSBezierPath bezierPathWithRoundedRect:rect
|
|
|
|
xRadius:radius
|
|
|
|
yRadius:radius];
|
2014-09-18 08:17:49 +00:00
|
|
|
[bezier_path setLineWidth:1.0];
|
|
|
|
[bezier_path addClip];
|
2014-09-17 07:58:08 +00:00
|
|
|
|
|
|
|
// Calculate the progress width.
|
2018-04-20 18:47:04 +00:00
|
|
|
rect.size.width =
|
|
|
|
floor(rect.size.width * ([self doubleValue] / [self maxValue]));
|
2014-09-17 07:58:08 +00:00
|
|
|
|
|
|
|
// Fill the progress bar with color blue.
|
|
|
|
[[NSColor colorWithSRGBRed:0.2 green:0.6 blue:1 alpha:1] set];
|
|
|
|
NSRectFill(rect);
|
|
|
|
}
|
|
|
|
|
|
|
|
@end
|
|
|
|
|
2019-10-25 13:03:28 +00:00
|
|
|
namespace gin {
|
2016-06-17 01:54:50 +00:00
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
template <>
|
2019-06-19 21:23:04 +00:00
|
|
|
struct Converter<electron::NativeWindowMac::TitleBarStyle> {
|
2018-04-20 18:47:04 +00:00
|
|
|
static bool FromV8(v8::Isolate* isolate,
|
|
|
|
v8::Handle<v8::Value> val,
|
2019-06-19 21:23:04 +00:00
|
|
|
electron::NativeWindowMac::TitleBarStyle* out) {
|
|
|
|
using TitleBarStyle = electron::NativeWindowMac::TitleBarStyle;
|
2016-06-17 01:54:50 +00:00
|
|
|
std::string title_bar_style;
|
|
|
|
if (!ConvertFromV8(isolate, val, &title_bar_style))
|
|
|
|
return false;
|
|
|
|
if (title_bar_style == "hidden") {
|
2020-10-27 17:51:45 +00:00
|
|
|
*out = TitleBarStyle::kHidden;
|
2018-02-20 17:09:54 +00:00
|
|
|
} else if (title_bar_style == "hiddenInset") {
|
2020-10-27 17:51:45 +00:00
|
|
|
*out = TitleBarStyle::kHiddenInset;
|
2017-06-05 20:30:08 +00:00
|
|
|
} else if (title_bar_style == "customButtonsOnHover") {
|
2020-10-27 17:51:45 +00:00
|
|
|
*out = TitleBarStyle::kCustomButtonsOnHover;
|
2016-06-17 01:54:50 +00:00
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-08-24 15:44:48 +00:00
|
|
|
template <>
|
|
|
|
struct Converter<electron::NativeWindowMac::VisualEffectState> {
|
|
|
|
static bool FromV8(v8::Isolate* isolate,
|
|
|
|
v8::Handle<v8::Value> val,
|
|
|
|
electron::NativeWindowMac::VisualEffectState* out) {
|
|
|
|
using VisualEffectState = electron::NativeWindowMac::VisualEffectState;
|
|
|
|
std::string visual_effect_state;
|
|
|
|
if (!ConvertFromV8(isolate, val, &visual_effect_state))
|
|
|
|
return false;
|
|
|
|
if (visual_effect_state == "followWindow") {
|
2020-10-27 17:51:45 +00:00
|
|
|
*out = VisualEffectState::kFollowWindow;
|
2020-08-24 15:44:48 +00:00
|
|
|
} else if (visual_effect_state == "active") {
|
2020-10-27 17:51:45 +00:00
|
|
|
*out = VisualEffectState::kActive;
|
2020-08-24 15:44:48 +00:00
|
|
|
} else if (visual_effect_state == "inactive") {
|
2020-10-27 17:51:45 +00:00
|
|
|
*out = VisualEffectState::kInactive;
|
2020-08-24 15:44:48 +00:00
|
|
|
} else {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-10-25 13:03:28 +00:00
|
|
|
} // namespace gin
|
2016-06-17 01:54:50 +00:00
|
|
|
|
2019-06-19 21:23:04 +00:00
|
|
|
namespace electron {
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2018-05-02 11:43:45 +00:00
|
|
|
namespace {
|
|
|
|
|
|
|
|
bool IsFramelessWindow(NSView* view) {
|
2019-04-17 21:10:04 +00:00
|
|
|
NSWindow* nswindow = [view window];
|
|
|
|
if (![nswindow respondsToSelector:@selector(shell)])
|
|
|
|
return false;
|
2020-02-04 20:19:40 +00:00
|
|
|
NativeWindow* window = [static_cast<ElectronNSWindow*>(nswindow) shell];
|
2018-05-02 11:43:45 +00:00
|
|
|
return window && !window->has_frame();
|
|
|
|
}
|
|
|
|
|
|
|
|
IMP original_set_frame_size = nullptr;
|
|
|
|
IMP original_view_did_move_to_superview = nullptr;
|
|
|
|
|
|
|
|
// This method is directly called by NSWindow during a window resize on OSX
|
|
|
|
// 10.10.0, beta 2. We must override it to prevent the content view from
|
|
|
|
// shrinking.
|
|
|
|
void SetFrameSize(NSView* self, SEL _cmd, NSSize size) {
|
|
|
|
if (!IsFramelessWindow(self)) {
|
|
|
|
auto original =
|
|
|
|
reinterpret_cast<decltype(&SetFrameSize)>(original_set_frame_size);
|
|
|
|
return original(self, _cmd, size);
|
|
|
|
}
|
|
|
|
// For frameless window, resize the view to cover full window.
|
|
|
|
if ([self superview])
|
|
|
|
size = [[self superview] bounds].size;
|
|
|
|
auto super_impl = reinterpret_cast<decltype(&SetFrameSize)>(
|
|
|
|
[[self superclass] instanceMethodForSelector:_cmd]);
|
|
|
|
super_impl(self, _cmd, size);
|
|
|
|
}
|
|
|
|
|
|
|
|
// The contentView gets moved around during certain full-screen operations.
|
|
|
|
// This is less than ideal, and should eventually be removed.
|
|
|
|
void ViewDidMoveToSuperview(NSView* self, SEL _cmd) {
|
|
|
|
if (!IsFramelessWindow(self)) {
|
|
|
|
// [BridgedContentView viewDidMoveToSuperview];
|
|
|
|
auto original = reinterpret_cast<decltype(&ViewDidMoveToSuperview)>(
|
|
|
|
original_view_did_move_to_superview);
|
2018-05-02 12:36:51 +00:00
|
|
|
if (original)
|
|
|
|
original(self, _cmd);
|
|
|
|
return;
|
2018-05-02 11:43:45 +00:00
|
|
|
}
|
|
|
|
[self setFrame:[[self superview] bounds]];
|
|
|
|
}
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
2019-10-25 13:03:28 +00:00
|
|
|
NativeWindowMac::NativeWindowMac(const gin_helper::Dictionary& options,
|
2018-04-08 11:20:43 +00:00
|
|
|
NativeWindow* parent)
|
2018-05-21 22:18:38 +00:00
|
|
|
: NativeWindow(options, parent), root_view_(new RootViewMac(this)) {
|
2020-03-05 20:19:05 +00:00
|
|
|
ui::NativeTheme::GetInstanceForNativeUi()->AddObserver(this);
|
2021-03-16 09:41:59 +00:00
|
|
|
display::Screen::GetScreen()->AddObserver(this);
|
2020-03-05 20:19:05 +00:00
|
|
|
|
2014-01-06 10:58:30 +00:00
|
|
|
int width = 800, height = 600;
|
2015-11-13 05:58:31 +00:00
|
|
|
options.Get(options::kWidth, &width);
|
|
|
|
options.Get(options::kHeight, &height);
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2016-12-20 21:49:35 +00:00
|
|
|
NSRect main_screen_rect = [[[NSScreen screens] firstObject] frame];
|
2018-04-24 08:23:08 +00:00
|
|
|
gfx::Rect bounds(round((NSWidth(main_screen_rect) - width) / 2),
|
2018-05-01 04:58:42 +00:00
|
|
|
round((NSHeight(main_screen_rect) - height) / 2), width,
|
2018-04-24 08:23:08 +00:00
|
|
|
height);
|
2013-09-11 10:10:28 +00:00
|
|
|
|
2018-04-24 10:00:44 +00:00
|
|
|
options.Get(options::kResizable, &resizable_);
|
|
|
|
options.Get(options::kTitleBarStyle, &title_bar_style_);
|
|
|
|
options.Get(options::kZoomToPageWidth, &zoom_to_page_width_);
|
|
|
|
options.Get(options::kSimpleFullScreen, &always_simple_fullscreen_);
|
2020-12-16 05:30:39 +00:00
|
|
|
options.GetOptional(options::kTrafficLightPosition, &traffic_light_position_);
|
2020-08-24 15:44:48 +00:00
|
|
|
options.Get(options::kVisualEffectState, &visual_effect_state_);
|
2015-05-06 14:08:24 +00:00
|
|
|
|
2021-01-30 23:15:10 +00:00
|
|
|
if (options.Has(options::kFullscreenWindowTitle)) {
|
2021-03-29 10:45:08 +00:00
|
|
|
EmitWarning(
|
|
|
|
node::Environment::GetCurrent(JavascriptEnvironment::GetIsolate()),
|
|
|
|
"\"fullscreenWindowTitle\" option has been deprecated and is "
|
|
|
|
"no-op now.",
|
|
|
|
"electron");
|
2021-01-30 23:15:10 +00:00
|
|
|
}
|
|
|
|
|
2016-01-18 22:46:35 +00:00
|
|
|
bool minimizable = true;
|
|
|
|
options.Get(options::kMinimizable, &minimizable);
|
2016-01-23 07:51:52 +00:00
|
|
|
|
2016-01-22 21:24:33 +00:00
|
|
|
bool maximizable = true;
|
|
|
|
options.Get(options::kMaximizable, &maximizable);
|
|
|
|
|
2016-01-18 22:46:35 +00:00
|
|
|
bool closable = true;
|
|
|
|
options.Get(options::kClosable, &closable);
|
|
|
|
|
2017-03-30 20:47:11 +00:00
|
|
|
std::string tabbingIdentifier;
|
|
|
|
options.Get(options::kTabbingIdentifier, &tabbingIdentifier);
|
2017-03-27 14:15:17 +00:00
|
|
|
|
2015-11-19 08:39:45 +00:00
|
|
|
std::string windowType;
|
|
|
|
options.Get(options::kType, &windowType);
|
|
|
|
|
|
|
|
bool useStandardWindow = true;
|
|
|
|
// eventually deprecate separate "standardWindow" option in favor of
|
|
|
|
// standard / textured window types
|
|
|
|
options.Get(options::kStandardWindow, &useStandardWindow);
|
|
|
|
if (windowType == "textured") {
|
|
|
|
useStandardWindow = false;
|
|
|
|
}
|
|
|
|
|
2021-02-09 16:38:35 +00:00
|
|
|
// The window without titlebar is treated the same with frameless window.
|
|
|
|
if (title_bar_style_ != TitleBarStyle::kNormal)
|
|
|
|
set_has_frame(false);
|
|
|
|
|
2018-09-26 23:00:57 +00:00
|
|
|
NSUInteger styleMask = NSWindowStyleMaskTitled;
|
2021-02-09 16:38:35 +00:00
|
|
|
|
|
|
|
// The NSWindowStyleMaskFullSizeContentView style removes rounded corners
|
|
|
|
// for framless window.
|
|
|
|
bool rounded_corner = true;
|
|
|
|
options.Get(options::kRoundedCorners, &rounded_corner);
|
|
|
|
if (!rounded_corner && !has_frame())
|
|
|
|
styleMask = NSWindowStyleMaskFullSizeContentView;
|
|
|
|
|
2019-05-28 17:23:16 +00:00
|
|
|
if (minimizable)
|
2016-01-18 22:46:35 +00:00
|
|
|
styleMask |= NSMiniaturizableWindowMask;
|
2019-05-28 17:23:16 +00:00
|
|
|
if (closable)
|
2018-09-26 23:00:57 +00:00
|
|
|
styleMask |= NSWindowStyleMaskClosable;
|
2019-05-28 17:23:16 +00:00
|
|
|
if (resizable_)
|
|
|
|
styleMask |= NSResizableWindowMask;
|
|
|
|
if (!useStandardWindow || transparent() || !has_frame())
|
2015-05-06 14:08:24 +00:00
|
|
|
styleMask |= NSTexturedBackgroundWindowMask;
|
2015-12-21 18:55:23 +00:00
|
|
|
|
2018-04-24 08:23:08 +00:00
|
|
|
// Create views::Widget and assign window_ with it.
|
|
|
|
// TODO(zcbenz): Get rid of the window_ in future.
|
|
|
|
views::Widget::InitParams params;
|
|
|
|
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
|
|
|
|
params.bounds = bounds;
|
|
|
|
params.delegate = this;
|
|
|
|
params.type = views::Widget::InitParams::TYPE_WINDOW;
|
2020-02-04 20:19:40 +00:00
|
|
|
params.native_widget = new ElectronNativeWidgetMac(this, styleMask, widget());
|
2019-08-15 20:50:58 +00:00
|
|
|
widget()->Init(std::move(params));
|
2020-02-04 20:19:40 +00:00
|
|
|
window_ = static_cast<ElectronNSWindow*>(
|
2019-01-09 20:25:19 +00:00
|
|
|
widget()->GetNativeWindow().GetNativeNSWindow());
|
2018-04-24 08:23:08 +00:00
|
|
|
|
2015-08-05 04:46:32 +00:00
|
|
|
[window_ setEnableLargerThanScreen:enable_larger_than_screen()];
|
2013-09-11 10:10:28 +00:00
|
|
|
|
2020-02-04 20:19:40 +00:00
|
|
|
window_delegate_.reset([[ElectronNSWindowDelegate alloc] initWithShell:this]);
|
2015-03-25 10:51:29 +00:00
|
|
|
[window_ setDelegate:window_delegate_];
|
2014-03-15 11:28:23 +00:00
|
|
|
|
2016-06-20 05:49:24 +00:00
|
|
|
// Only use native parent window for non-modal windows.
|
|
|
|
if (parent && !is_modal()) {
|
2017-05-01 20:21:05 +00:00
|
|
|
SetParentWindow(parent);
|
2016-06-19 03:06:08 +00:00
|
|
|
}
|
|
|
|
|
2015-08-05 04:46:32 +00:00
|
|
|
if (transparent()) {
|
2016-01-19 23:24:16 +00:00
|
|
|
// Setting the background color to clear will also hide the shadow.
|
2014-12-23 19:17:56 +00:00
|
|
|
[window_ setBackgroundColor:[NSColor clearColor]];
|
|
|
|
}
|
2015-04-25 02:35:28 +00:00
|
|
|
|
2015-11-19 08:39:45 +00:00
|
|
|
if (windowType == "desktop") {
|
|
|
|
[window_ setLevel:kCGDesktopWindowLevel - 1];
|
2015-11-20 05:06:42 +00:00
|
|
|
[window_ setDisableKeyOrMainWindow:YES];
|
2018-04-20 18:47:04 +00:00
|
|
|
[window_ setCollectionBehavior:(NSWindowCollectionBehaviorCanJoinAllSpaces |
|
|
|
|
NSWindowCollectionBehaviorStationary |
|
|
|
|
NSWindowCollectionBehaviorIgnoresCycle)];
|
2015-11-19 08:39:45 +00:00
|
|
|
}
|
|
|
|
|
2016-06-13 08:10:28 +00:00
|
|
|
bool focusable;
|
|
|
|
if (options.Get(options::kFocusable, &focusable) && !focusable)
|
|
|
|
[window_ setDisableKeyOrMainWindow:YES];
|
|
|
|
|
2016-06-17 02:02:37 +00:00
|
|
|
if (transparent() || !has_frame()) {
|
2019-02-25 17:21:57 +00:00
|
|
|
// Don't show title bar.
|
|
|
|
[window_ setTitlebarAppearsTransparent:YES];
|
|
|
|
[window_ setTitleVisibility:NSWindowTitleHidden];
|
2016-06-17 01:54:50 +00:00
|
|
|
// Remove non-transparent corners, see http://git.io/vfonD.
|
2015-04-18 12:08:22 +00:00
|
|
|
[window_ setOpaque:NO];
|
2021-01-30 23:15:10 +00:00
|
|
|
// Hide the window buttons.
|
|
|
|
InternalSetStandardButtonsVisibility(false);
|
2016-06-17 01:54:50 +00:00
|
|
|
}
|
2014-12-23 19:17:56 +00:00
|
|
|
|
2017-03-30 20:46:34 +00:00
|
|
|
// Create a tab only if tabbing identifier is specified and window has
|
|
|
|
// a native title bar.
|
2017-03-30 20:47:11 +00:00
|
|
|
if (tabbingIdentifier.empty() || transparent() || !has_frame()) {
|
2018-04-17 23:45:26 +00:00
|
|
|
if (@available(macOS 10.12, *)) {
|
2017-03-30 20:46:34 +00:00
|
|
|
[window_ setTabbingMode:NSWindowTabbingModeDisallowed];
|
|
|
|
}
|
|
|
|
} else {
|
2018-04-17 23:45:26 +00:00
|
|
|
if (@available(macOS 10.12, *)) {
|
2017-03-30 20:47:11 +00:00
|
|
|
[window_ setTabbingIdentifier:base::SysUTF8ToNSString(tabbingIdentifier)];
|
2017-03-27 14:15:17 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-24 10:00:44 +00:00
|
|
|
// Resize to content bounds.
|
2014-05-15 07:19:02 +00:00
|
|
|
bool use_content_size = false;
|
2015-11-13 05:58:31 +00:00
|
|
|
options.Get(options::kUseContentSize, &use_content_size);
|
2018-04-24 10:00:44 +00:00
|
|
|
if (!has_frame() || use_content_size)
|
|
|
|
SetContentSize(gfx::Size(width, height));
|
2017-08-13 06:28:33 +00:00
|
|
|
|
2014-03-15 11:28:23 +00:00
|
|
|
// Enable the NSView to accept first mouse event.
|
|
|
|
bool acceptsFirstMouse = false;
|
2015-11-13 05:58:31 +00:00
|
|
|
options.Get(options::kAcceptFirstMouse, &acceptsFirstMouse);
|
2015-04-27 03:47:26 +00:00
|
|
|
[window_ setAcceptsFirstMouse:acceptsFirstMouse];
|
2013-04-12 07:04:46 +00:00
|
|
|
|
2015-04-27 04:08:22 +00:00
|
|
|
// Disable auto-hiding cursor.
|
|
|
|
bool disableAutoHideCursor = false;
|
2015-11-13 05:58:31 +00:00
|
|
|
options.Get(options::kDisableAutoHideCursor, &disableAutoHideCursor);
|
2015-04-27 04:08:22 +00:00
|
|
|
[window_ setDisableAutoHideCursor:disableAutoHideCursor];
|
|
|
|
|
2016-01-25 07:02:43 +00:00
|
|
|
// Use an NSEvent monitor to listen for the wheel event.
|
|
|
|
BOOL __block began = NO;
|
|
|
|
wheel_event_monitor_ = [NSEvent
|
2018-04-20 18:47:04 +00:00
|
|
|
addLocalMonitorForEventsMatchingMask:NSScrollWheelMask
|
|
|
|
handler:^(NSEvent* event) {
|
|
|
|
if ([[event window] windowNumber] !=
|
|
|
|
[window_ windowNumber])
|
|
|
|
return event;
|
|
|
|
|
|
|
|
if (!began && (([event phase] ==
|
|
|
|
NSEventPhaseMayBegin) ||
|
|
|
|
([event phase] ==
|
|
|
|
NSEventPhaseBegan))) {
|
|
|
|
this->NotifyWindowScrollTouchBegin();
|
|
|
|
began = YES;
|
|
|
|
} else if (began &&
|
|
|
|
(([event phase] ==
|
|
|
|
NSEventPhaseEnded) ||
|
|
|
|
([event phase] ==
|
|
|
|
NSEventPhaseCancelled))) {
|
|
|
|
this->NotifyWindowScrollTouchEnd();
|
|
|
|
began = NO;
|
|
|
|
}
|
|
|
|
return event;
|
|
|
|
}];
|
2016-01-21 17:40:21 +00:00
|
|
|
|
2016-06-08 20:56:45 +00:00
|
|
|
// Set maximizable state last to ensure zoom button does not get reset
|
|
|
|
// by calls to other APIs.
|
2016-08-04 23:47:03 +00:00
|
|
|
SetMaximizable(maximizable);
|
2018-04-10 08:30:46 +00:00
|
|
|
|
2018-05-08 07:02:57 +00:00
|
|
|
// Default content view.
|
|
|
|
SetContentView(new views::View());
|
2021-01-30 23:15:10 +00:00
|
|
|
AddContentViewLayers();
|
2018-08-24 21:33:27 +00:00
|
|
|
|
|
|
|
original_frame_ = [window_ frame];
|
2018-10-10 05:38:52 +00:00
|
|
|
original_level_ = [window_ level];
|
2018-04-08 11:20:43 +00:00
|
|
|
}
|
|
|
|
|
2020-09-23 01:53:32 +00:00
|
|
|
NativeWindowMac::~NativeWindowMac() {}
|
|
|
|
|
2018-05-08 03:51:27 +00:00
|
|
|
void NativeWindowMac::SetContentView(views::View* view) {
|
2018-05-02 06:39:43 +00:00
|
|
|
views::View* root_view = GetContentsView();
|
2018-05-08 03:51:27 +00:00
|
|
|
if (content_view())
|
|
|
|
root_view->RemoveChildView(content_view());
|
2018-05-01 04:58:42 +00:00
|
|
|
|
2018-05-08 03:51:27 +00:00
|
|
|
set_content_view(view);
|
|
|
|
root_view->AddChildView(content_view());
|
2018-05-01 04:58:42 +00:00
|
|
|
|
2018-05-02 06:39:43 +00:00
|
|
|
if (buttons_view_) {
|
|
|
|
// Ensure the buttons view are always floated on the top.
|
|
|
|
[buttons_view_ removeFromSuperview];
|
|
|
|
[[window_ contentView] addSubview:buttons_view_];
|
2018-05-01 04:58:42 +00:00
|
|
|
}
|
2018-05-02 06:39:43 +00:00
|
|
|
|
|
|
|
root_view->Layout();
|
2018-05-01 04:58:42 +00:00
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::Close() {
|
2016-05-25 23:25:51 +00:00
|
|
|
if (!IsClosable()) {
|
|
|
|
WindowList::WindowCloseCancelled(this);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2021-05-04 10:11:16 +00:00
|
|
|
// If a sheet is attached to the window when we call
|
|
|
|
// [window_ performClose:nil], the window won't close properly
|
|
|
|
// even after the user has ended the sheet.
|
|
|
|
// Ensure it's closed before calling [window_ performClose:nil].
|
|
|
|
SetEnabled(true);
|
|
|
|
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ performClose:nil];
|
2020-03-30 16:48:20 +00:00
|
|
|
|
|
|
|
// Closing a sheet doesn't trigger windowShouldClose,
|
|
|
|
// so we need to manually call it ourselves here.
|
|
|
|
if (is_modal() && parent() && IsVisible()) {
|
|
|
|
NotifyWindowCloseButtonClicked();
|
|
|
|
}
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2013-05-01 08:12:00 +00:00
|
|
|
void NativeWindowMac::CloseImmediately() {
|
2018-11-10 13:53:35 +00:00
|
|
|
// Retain the child window before closing it. If the last reference to the
|
|
|
|
// NSWindow goes away inside -[NSWindow close], then bad stuff can happen.
|
|
|
|
// See e.g. http://crbug.com/616701.
|
|
|
|
base::scoped_nsobject<NSWindow> child_window(window_,
|
|
|
|
base::scoped_policy::RETAIN);
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ close];
|
2013-05-01 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::Focus(bool focus) {
|
2013-10-03 01:39:17 +00:00
|
|
|
if (!IsVisible())
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (focus) {
|
2019-02-26 01:44:38 +00:00
|
|
|
[[NSApplication sharedApplication] activateIgnoringOtherApps:NO];
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ makeKeyAndOrderFront:nil];
|
2013-05-25 07:08:58 +00:00
|
|
|
} else {
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ orderBack:nil];
|
2013-05-25 07:08:58 +00:00
|
|
|
}
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2013-05-16 14:56:52 +00:00
|
|
|
bool NativeWindowMac::IsFocused() {
|
2014-04-11 04:45:48 +00:00
|
|
|
return [window_ isKeyWindow];
|
2013-05-16 14:56:52 +00:00
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::Show() {
|
2016-06-20 05:49:24 +00:00
|
|
|
if (is_modal() && parent()) {
|
2020-03-30 16:48:20 +00:00
|
|
|
NSWindow* window = parent()->GetNativeWindow().GetNativeNSWindow();
|
2016-09-29 18:49:24 +00:00
|
|
|
if ([window_ sheetParent] == nil)
|
2020-03-30 16:48:20 +00:00
|
|
|
[window beginSheet:window_
|
2019-01-09 20:25:19 +00:00
|
|
|
completionHandler:^(NSModalResponse){
|
|
|
|
}];
|
2016-06-20 05:49:24 +00:00
|
|
|
return;
|
|
|
|
}
|
2017-09-14 05:43:22 +00:00
|
|
|
|
2017-05-01 20:10:48 +00:00
|
|
|
// Reattach the window to the parent to actually show it.
|
|
|
|
if (parent())
|
|
|
|
InternalSetParentWindow(parent(), true);
|
2016-06-20 05:49:24 +00:00
|
|
|
|
2014-12-28 01:41:13 +00:00
|
|
|
// This method is supposed to put focus on window, however if the app does not
|
|
|
|
// have focus then "makeKeyAndOrderFront" will only show the window.
|
|
|
|
[NSApp activateIgnoringOtherApps:YES];
|
|
|
|
|
2014-10-17 14:51:20 +00:00
|
|
|
[window_ makeKeyAndOrderFront:nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::ShowInactive() {
|
2017-05-01 21:01:48 +00:00
|
|
|
// Reattach the window to the parent to actually show it.
|
|
|
|
if (parent())
|
|
|
|
InternalSetParentWindow(parent(), true);
|
2017-09-14 05:43:22 +00:00
|
|
|
|
2014-09-09 06:47:04 +00:00
|
|
|
[window_ orderFrontRegardless];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::Hide() {
|
2021-04-16 15:42:09 +00:00
|
|
|
// If a sheet is attached to the window when we call [window_ orderOut:nil],
|
|
|
|
// the sheet won't be able to show again on the same window.
|
|
|
|
// Ensure it's closed before calling [window_ orderOut:nil].
|
2021-05-04 10:11:16 +00:00
|
|
|
SetEnabled(true);
|
2021-04-16 15:42:09 +00:00
|
|
|
|
2016-06-20 05:49:24 +00:00
|
|
|
if (is_modal() && parent()) {
|
|
|
|
[window_ orderOut:nil];
|
2019-01-09 20:25:19 +00:00
|
|
|
[parent()->GetNativeWindow().GetNativeNSWindow() endSheet:window_];
|
2016-06-20 05:49:24 +00:00
|
|
|
return;
|
|
|
|
}
|
2017-09-14 05:43:22 +00:00
|
|
|
|
2017-05-01 20:10:48 +00:00
|
|
|
// Deattach the window from the parent before.
|
|
|
|
if (parent())
|
|
|
|
InternalSetParentWindow(parent(), false);
|
2016-06-20 05:49:24 +00:00
|
|
|
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ orderOut:nil];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2013-10-03 00:27:59 +00:00
|
|
|
bool NativeWindowMac::IsVisible() {
|
2019-03-20 22:33:59 +00:00
|
|
|
bool occluded = [window_ occlusionState] == NSWindowOcclusionStateVisible;
|
|
|
|
|
|
|
|
// For a window to be visible, it must be visible to the user in the
|
|
|
|
// foreground of the app, which means that it should not be minimized or
|
|
|
|
// occluded
|
|
|
|
return [window_ isVisible] && !occluded && !IsMinimized();
|
2013-10-03 00:27:59 +00:00
|
|
|
}
|
|
|
|
|
2021-04-21 14:56:25 +00:00
|
|
|
void NativeWindowMac::SetFullScreenTransitionState(
|
|
|
|
FullScreenTransitionState state) {
|
|
|
|
fullscreen_transition_state_ = state;
|
|
|
|
}
|
|
|
|
|
2016-06-17 08:38:44 +00:00
|
|
|
bool NativeWindowMac::IsEnabled() {
|
2016-06-20 05:49:24 +00:00
|
|
|
return [window_ attachedSheet] == nil;
|
2016-06-17 08:38:44 +00:00
|
|
|
}
|
|
|
|
|
2018-02-06 13:21:53 +00:00
|
|
|
void NativeWindowMac::SetEnabled(bool enable) {
|
2021-05-04 10:11:16 +00:00
|
|
|
if (!enable) {
|
2018-04-20 18:47:04 +00:00
|
|
|
[window_ beginSheet:window_
|
|
|
|
completionHandler:^(NSModalResponse returnCode) {
|
|
|
|
NSLog(@"modal enabled");
|
|
|
|
return;
|
|
|
|
}];
|
2021-05-04 10:11:16 +00:00
|
|
|
} else if ([window_ attachedSheet]) {
|
|
|
|
[window_ endSheet:[window_ attachedSheet]];
|
2018-02-06 13:21:53 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::Maximize() {
|
2016-04-22 23:15:00 +00:00
|
|
|
if (IsMaximized())
|
|
|
|
return;
|
|
|
|
|
2018-08-24 21:33:27 +00:00
|
|
|
// Take note of the current window size
|
|
|
|
if (IsNormal())
|
|
|
|
original_frame_ = [window_ frame];
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ zoom:nil];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::Unmaximize() {
|
2016-04-22 23:15:00 +00:00
|
|
|
if (!IsMaximized())
|
|
|
|
return;
|
|
|
|
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ zoom:nil];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2014-06-28 01:17:37 +00:00
|
|
|
bool NativeWindowMac::IsMaximized() {
|
2018-09-26 23:00:57 +00:00
|
|
|
if (([window_ styleMask] & NSWindowStyleMaskResizable) != 0) {
|
2016-03-05 06:39:13 +00:00
|
|
|
return [window_ isZoomed];
|
|
|
|
} else {
|
|
|
|
NSRect rectScreen = [[NSScreen mainScreen] visibleFrame];
|
|
|
|
NSRect rectWindow = [window_ frame];
|
|
|
|
return (rectScreen.origin.x == rectWindow.origin.x &&
|
|
|
|
rectScreen.origin.y == rectWindow.origin.y &&
|
|
|
|
rectScreen.size.width == rectWindow.size.width &&
|
|
|
|
rectScreen.size.height == rectWindow.size.height);
|
|
|
|
}
|
2014-05-14 21:58:49 +00:00
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::Minimize() {
|
2018-08-24 21:33:27 +00:00
|
|
|
if (IsMinimized())
|
|
|
|
return;
|
|
|
|
|
|
|
|
// Take note of the current window size
|
|
|
|
if (IsNormal())
|
|
|
|
original_frame_ = [window_ frame];
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ miniaturize:nil];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::Restore() {
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ deminiaturize:nil];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2014-07-26 05:58:26 +00:00
|
|
|
bool NativeWindowMac::IsMinimized() {
|
|
|
|
return [window_ isMiniaturized];
|
|
|
|
}
|
|
|
|
|
2021-04-21 14:56:25 +00:00
|
|
|
void NativeWindowMac::HandlePendingFullscreenTransitions() {
|
|
|
|
if (pending_transitions_.empty())
|
|
|
|
return;
|
|
|
|
|
|
|
|
bool next_transition = pending_transitions_.front();
|
|
|
|
pending_transitions_.pop();
|
|
|
|
SetFullScreen(next_transition);
|
|
|
|
}
|
|
|
|
|
2014-11-25 06:34:14 +00:00
|
|
|
void NativeWindowMac::SetFullScreen(bool fullscreen) {
|
2021-04-21 14:56:25 +00:00
|
|
|
// [NSWindow -toggleFullScreen] is an asynchronous operation, which means
|
|
|
|
// that it's possible to call it while a fullscreen transition is currently
|
|
|
|
// in process. This can create weird behavior (incl. phantom windows),
|
|
|
|
// so we want to schedule a transition for when the current one has completed.
|
|
|
|
if (fullscreen_transition_state() != FullScreenTransitionState::NONE) {
|
|
|
|
if (!pending_transitions_.empty()) {
|
|
|
|
bool last_pending = pending_transitions_.back();
|
|
|
|
// Only push new transitions if they're different than the last transition
|
|
|
|
// in the queue.
|
|
|
|
if (last_pending != fullscreen)
|
|
|
|
pending_transitions_.push(fullscreen);
|
|
|
|
} else {
|
|
|
|
pending_transitions_.push(fullscreen);
|
|
|
|
}
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2013-06-04 10:15:03 +00:00
|
|
|
if (fullscreen == IsFullscreen())
|
2013-04-12 07:04:46 +00:00
|
|
|
return;
|
|
|
|
|
2018-08-24 21:33:27 +00:00
|
|
|
// Take note of the current window size
|
|
|
|
if (IsNormal())
|
|
|
|
original_frame_ = [window_ frame];
|
2021-04-21 14:56:25 +00:00
|
|
|
|
|
|
|
// This needs to be set here because it can be the case that
|
|
|
|
// SetFullScreen is called by a user before windowWillEnterFullScreen
|
|
|
|
// or windowWillExitFullScreen are invoked, and so a potential transition
|
|
|
|
// could be dropped.
|
|
|
|
fullscreen_transition_state_ = fullscreen
|
|
|
|
? FullScreenTransitionState::ENTERING
|
|
|
|
: FullScreenTransitionState::EXITING;
|
|
|
|
|
2018-01-19 14:27:36 +00:00
|
|
|
[window_ toggleFullScreenMode:nil];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2015-04-21 13:35:36 +00:00
|
|
|
bool NativeWindowMac::IsFullscreen() const {
|
2018-09-26 23:00:57 +00:00
|
|
|
return [window_ styleMask] & NSWindowStyleMaskFullScreen;
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2016-01-15 04:54:12 +00:00
|
|
|
void NativeWindowMac::SetBounds(const gfx::Rect& bounds, bool animate) {
|
2016-07-11 07:44:42 +00:00
|
|
|
// Do nothing if in fullscreen mode.
|
|
|
|
if (IsFullscreen())
|
|
|
|
return;
|
|
|
|
|
2016-07-07 11:02:18 +00:00
|
|
|
// Check size constraints since setFrame does not check it.
|
|
|
|
gfx::Size size = bounds.size();
|
|
|
|
size.SetToMax(GetMinimumSize());
|
|
|
|
gfx::Size max_size = GetMaximumSize();
|
|
|
|
if (!max_size.IsEmpty())
|
|
|
|
size.SetToMin(max_size);
|
|
|
|
|
|
|
|
NSRect cocoa_bounds = NSMakeRect(bounds.x(), 0, size.width(), size.height());
|
2015-05-01 14:40:46 +00:00
|
|
|
// Flip coordinates based on the primary screen.
|
2016-12-20 21:49:35 +00:00
|
|
|
NSScreen* screen = [[NSScreen screens] firstObject];
|
2018-04-20 18:47:04 +00:00
|
|
|
cocoa_bounds.origin.y = NSHeight([screen frame]) - size.height() - bounds.y();
|
2015-05-01 14:40:46 +00:00
|
|
|
|
2016-01-15 04:54:12 +00:00
|
|
|
[window_ setFrame:cocoa_bounds display:YES animate:animate];
|
2015-05-01 10:50:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
gfx::Rect NativeWindowMac::GetBounds() {
|
2015-05-01 14:40:46 +00:00
|
|
|
NSRect frame = [window_ frame];
|
2015-05-04 04:06:03 +00:00
|
|
|
gfx::Rect bounds(frame.origin.x, 0, NSWidth(frame), NSHeight(frame));
|
2016-12-20 21:49:35 +00:00
|
|
|
NSScreen* screen = [[NSScreen screens] firstObject];
|
2015-05-04 04:06:03 +00:00
|
|
|
bounds.set_y(NSHeight([screen frame]) - NSMaxY(frame));
|
|
|
|
return bounds;
|
2015-05-01 10:50:53 +00:00
|
|
|
}
|
|
|
|
|
2018-08-24 21:33:27 +00:00
|
|
|
bool NativeWindowMac::IsNormal() {
|
|
|
|
return NativeWindow::IsNormal() && !IsSimpleFullScreen();
|
|
|
|
}
|
|
|
|
|
|
|
|
gfx::Rect NativeWindowMac::GetNormalBounds() {
|
|
|
|
if (IsNormal()) {
|
2018-09-26 23:00:57 +00:00
|
|
|
return GetBounds();
|
2018-08-24 21:33:27 +00:00
|
|
|
}
|
|
|
|
NSRect frame = original_frame_;
|
|
|
|
gfx::Rect bounds(frame.origin.x, 0, NSWidth(frame), NSHeight(frame));
|
|
|
|
NSScreen* screen = [[NSScreen screens] firstObject];
|
|
|
|
bounds.set_y(NSHeight([screen frame]) - NSMaxY(frame));
|
|
|
|
return bounds;
|
|
|
|
// Works on OS_WIN !
|
|
|
|
// return widget()->GetRestoredBounds();
|
|
|
|
}
|
|
|
|
|
2015-10-05 08:19:01 +00:00
|
|
|
void NativeWindowMac::SetContentSizeConstraints(
|
|
|
|
const extensions::SizeConstraints& size_constraints) {
|
2015-10-06 07:15:23 +00:00
|
|
|
auto convertSize = [this](const gfx::Size& size) {
|
|
|
|
// Our frameless window still has titlebar attached, so setting contentSize
|
|
|
|
// will result in actual content size being larger.
|
|
|
|
if (!has_frame()) {
|
|
|
|
NSRect frame = NSMakeRect(0, 0, size.width(), size.height());
|
2018-05-02 12:28:28 +00:00
|
|
|
NSRect content = [window_ originalContentRectForFrameRect:frame];
|
2015-10-06 07:15:23 +00:00
|
|
|
return content.size;
|
|
|
|
} else {
|
|
|
|
return NSMakeSize(size.width(), size.height());
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2014-04-11 04:45:48 +00:00
|
|
|
NSView* content = [window_ contentView];
|
2015-10-05 08:19:01 +00:00
|
|
|
if (size_constraints.HasMinimumSize()) {
|
2015-10-06 07:15:23 +00:00
|
|
|
NSSize min_size = convertSize(size_constraints.GetMinimumSize());
|
2015-10-05 12:09:29 +00:00
|
|
|
[window_ setContentMinSize:[content convertSize:min_size toView:nil]];
|
2015-10-05 08:19:01 +00:00
|
|
|
}
|
|
|
|
if (size_constraints.HasMaximumSize()) {
|
2015-10-06 07:15:23 +00:00
|
|
|
NSSize max_size = convertSize(size_constraints.GetMaximumSize());
|
2015-10-05 12:09:29 +00:00
|
|
|
[window_ setContentMaxSize:[content convertSize:max_size toView:nil]];
|
2015-10-05 08:19:01 +00:00
|
|
|
}
|
|
|
|
NativeWindow::SetContentSizeConstraints(size_constraints);
|
2013-04-18 07:38:04 +00:00
|
|
|
}
|
|
|
|
|
2019-08-15 06:51:15 +00:00
|
|
|
bool NativeWindowMac::MoveAbove(const std::string& sourceId) {
|
|
|
|
const content::DesktopMediaID id = content::DesktopMediaID::Parse(sourceId);
|
|
|
|
if (id.type != content::DesktopMediaID::TYPE_WINDOW)
|
|
|
|
return false;
|
|
|
|
|
|
|
|
// Check if the window source is valid.
|
|
|
|
const CGWindowID window_id = id.id;
|
|
|
|
if (!webrtc::GetWindowOwnerPid(window_id))
|
|
|
|
return false;
|
|
|
|
|
|
|
|
[window_ orderWindow:NSWindowAbove relativeTo:id.id];
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
void NativeWindowMac::MoveTop() {
|
2018-04-03 13:04:32 +00:00
|
|
|
[window_ orderWindow:NSWindowAbove relativeTo:0];
|
|
|
|
}
|
2018-04-24 10:00:44 +00:00
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::SetResizable(bool resizable) {
|
2018-09-26 23:00:57 +00:00
|
|
|
SetStyleMask(resizable, NSWindowStyleMaskResizable);
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2013-04-18 07:38:04 +00:00
|
|
|
bool NativeWindowMac::IsResizable() {
|
2018-09-26 23:00:57 +00:00
|
|
|
return [window_ styleMask] & NSWindowStyleMaskResizable;
|
2013-04-18 07:38:04 +00:00
|
|
|
}
|
|
|
|
|
2016-01-18 22:46:35 +00:00
|
|
|
void NativeWindowMac::SetMovable(bool movable) {
|
|
|
|
[window_ setMovable:movable];
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::IsMovable() {
|
|
|
|
return [window_ isMovable];
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::SetMinimizable(bool minimizable) {
|
2016-01-23 11:12:19 +00:00
|
|
|
SetStyleMask(minimizable, NSMiniaturizableWindowMask);
|
2021-01-30 23:15:10 +00:00
|
|
|
if (buttons_view_)
|
|
|
|
[[buttons_view_ viewWithTag:1] setEnabled:minimizable];
|
2016-01-18 22:46:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::IsMinimizable() {
|
|
|
|
return [window_ styleMask] & NSMiniaturizableWindowMask;
|
|
|
|
}
|
|
|
|
|
2016-01-22 21:24:33 +00:00
|
|
|
void NativeWindowMac::SetMaximizable(bool maximizable) {
|
2020-03-17 17:58:57 +00:00
|
|
|
maximizable_ = maximizable;
|
2016-01-22 21:24:33 +00:00
|
|
|
[[window_ standardWindowButton:NSWindowZoomButton] setEnabled:maximizable];
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::IsMaximizable() {
|
|
|
|
return [[window_ standardWindowButton:NSWindowZoomButton] isEnabled];
|
|
|
|
}
|
|
|
|
|
2016-01-23 07:47:37 +00:00
|
|
|
void NativeWindowMac::SetFullScreenable(bool fullscreenable) {
|
2018-04-20 18:47:04 +00:00
|
|
|
SetCollectionBehavior(fullscreenable,
|
|
|
|
NSWindowCollectionBehaviorFullScreenPrimary);
|
2016-01-23 11:12:19 +00:00
|
|
|
// On EL Capitan this flag is required to hide fullscreen button.
|
2018-04-20 18:47:04 +00:00
|
|
|
SetCollectionBehavior(!fullscreenable,
|
|
|
|
NSWindowCollectionBehaviorFullScreenAuxiliary);
|
2021-01-30 23:15:10 +00:00
|
|
|
if (buttons_view_)
|
|
|
|
[[buttons_view_ viewWithTag:2] setEnabled:fullscreenable];
|
2016-01-22 21:24:33 +00:00
|
|
|
}
|
|
|
|
|
2016-01-23 07:47:37 +00:00
|
|
|
bool NativeWindowMac::IsFullScreenable() {
|
2016-01-23 11:12:19 +00:00
|
|
|
NSUInteger collectionBehavior = [window_ collectionBehavior];
|
|
|
|
return collectionBehavior & NSWindowCollectionBehaviorFullScreenPrimary;
|
2016-01-22 21:24:33 +00:00
|
|
|
}
|
|
|
|
|
2016-01-18 22:46:35 +00:00
|
|
|
void NativeWindowMac::SetClosable(bool closable) {
|
2018-09-26 23:00:57 +00:00
|
|
|
SetStyleMask(closable, NSWindowStyleMaskClosable);
|
2021-01-30 23:15:10 +00:00
|
|
|
if (buttons_view_)
|
|
|
|
[[buttons_view_ viewWithTag:0] setEnabled:closable];
|
2016-01-18 22:46:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::IsClosable() {
|
2018-09-26 23:00:57 +00:00
|
|
|
return [window_ styleMask] & NSWindowStyleMaskClosable;
|
2016-01-18 22:46:35 +00:00
|
|
|
}
|
|
|
|
|
2019-07-24 22:58:51 +00:00
|
|
|
void NativeWindowMac::SetAlwaysOnTop(ui::ZOrderLevel z_order,
|
2019-10-18 19:57:34 +00:00
|
|
|
const std::string& level_name,
|
|
|
|
int relative_level) {
|
|
|
|
if (z_order == ui::ZOrderLevel::kNormal) {
|
|
|
|
SetWindowLevel(NSNormalWindowLevel);
|
|
|
|
return;
|
2016-09-22 16:22:28 +00:00
|
|
|
}
|
2017-01-24 04:36:09 +00:00
|
|
|
|
2019-10-18 19:57:34 +00:00
|
|
|
int level = NSNormalWindowLevel;
|
|
|
|
if (level_name == "floating") {
|
|
|
|
level = NSFloatingWindowLevel;
|
|
|
|
} else if (level_name == "torn-off-menu") {
|
|
|
|
level = NSTornOffMenuWindowLevel;
|
|
|
|
} else if (level_name == "modal-panel") {
|
|
|
|
level = NSModalPanelWindowLevel;
|
|
|
|
} else if (level_name == "main-menu") {
|
|
|
|
level = NSMainMenuWindowLevel;
|
|
|
|
} else if (level_name == "status") {
|
|
|
|
level = NSStatusWindowLevel;
|
|
|
|
} else if (level_name == "pop-up-menu") {
|
|
|
|
level = NSPopUpMenuWindowLevel;
|
|
|
|
} else if (level_name == "screen-saver") {
|
|
|
|
level = NSScreenSaverWindowLevel;
|
|
|
|
} else if (level_name == "dock") {
|
|
|
|
// Deprecated by macOS, but kept for backwards compatibility
|
|
|
|
level = NSDockWindowLevel;
|
2017-01-24 04:36:09 +00:00
|
|
|
}
|
2019-07-27 05:25:51 +00:00
|
|
|
|
2019-10-18 19:57:34 +00:00
|
|
|
SetWindowLevel(level + relative_level);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::SetWindowLevel(int unbounded_level) {
|
|
|
|
int level = std::min(
|
|
|
|
std::max(unbounded_level, CGWindowLevelForKey(kCGMinimumWindowLevelKey)),
|
|
|
|
CGWindowLevelForKey(kCGMaximumWindowLevelKey));
|
|
|
|
ui::ZOrderLevel z_order_level = level == NSNormalWindowLevel
|
|
|
|
? ui::ZOrderLevel::kNormal
|
|
|
|
: ui::ZOrderLevel::kFloatingWindow;
|
|
|
|
bool did_z_order_level_change = z_order_level != GetZOrderLevel();
|
|
|
|
|
|
|
|
was_maximizable_ = IsMaximizable();
|
|
|
|
|
|
|
|
// We need to explicitly keep the NativeWidget up to date, since it stores the
|
|
|
|
// window level in a local variable, rather than reading it from the NSWindow.
|
|
|
|
// Unfortunately, it results in a second setLevel call. It's not ideal, but we
|
|
|
|
// don't expect this to cause any user-visible jank.
|
|
|
|
widget()->SetZOrderLevel(z_order_level);
|
|
|
|
[window_ setLevel:level];
|
|
|
|
|
|
|
|
// Set level will make the zoom button revert to default, probably
|
|
|
|
// a bug of Cocoa or macOS.
|
2020-03-17 17:58:57 +00:00
|
|
|
SetMaximizable(was_maximizable_);
|
2019-10-18 19:57:34 +00:00
|
|
|
|
2019-07-27 05:25:51 +00:00
|
|
|
// This must be notified at the very end or IsAlwaysOnTop
|
|
|
|
// will not yet have been updated to reflect the new status
|
2019-10-18 19:57:34 +00:00
|
|
|
if (did_z_order_level_change)
|
2019-07-27 05:25:51 +00:00
|
|
|
NativeWindow::NotifyWindowAlwaysOnTopChanged();
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2019-07-24 22:58:51 +00:00
|
|
|
ui::ZOrderLevel NativeWindowMac::GetZOrderLevel() {
|
|
|
|
return widget()->GetZOrderLevel();
|
2013-04-18 07:38:04 +00:00
|
|
|
}
|
|
|
|
|
2013-05-10 12:34:05 +00:00
|
|
|
void NativeWindowMac::Center() {
|
2014-04-11 04:45:48 +00:00
|
|
|
[window_ center];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2017-02-14 03:41:24 +00:00
|
|
|
void NativeWindowMac::Invalidate() {
|
|
|
|
[window_ flushWindow];
|
2017-02-14 19:09:15 +00:00
|
|
|
[[window_ contentView] setNeedsDisplay:YES];
|
2017-02-14 03:41:24 +00:00
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::SetTitle(const std::string& title) {
|
2016-06-17 01:54:50 +00:00
|
|
|
[window_ setTitle:base::SysUTF8ToNSString(title)];
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2013-04-18 06:30:05 +00:00
|
|
|
std::string NativeWindowMac::GetTitle() {
|
2018-04-20 18:47:04 +00:00
|
|
|
return base::SysNSStringToUTF8([window_ title]);
|
2013-04-18 06:30:05 +00:00
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::FlashFrame(bool flash) {
|
|
|
|
if (flash) {
|
|
|
|
attention_request_id_ = [NSApp requestUserAttention:NSInformationalRequest];
|
|
|
|
} else {
|
|
|
|
[NSApp cancelUserAttentionRequest:attention_request_id_];
|
|
|
|
attention_request_id_ = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
void NativeWindowMac::SetSkipTaskbar(bool skip) {}
|
2014-06-16 02:29:51 +00:00
|
|
|
|
2019-03-27 12:10:23 +00:00
|
|
|
bool NativeWindowMac::IsExcludedFromShownWindowsMenu() {
|
|
|
|
NSWindow* window = GetNativeWindow().GetNativeNSWindow();
|
|
|
|
return [window isExcludedFromWindowsMenu];
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::SetExcludedFromShownWindowsMenu(bool excluded) {
|
|
|
|
NSWindow* window = GetNativeWindow().GetNativeNSWindow();
|
|
|
|
[window setExcludedFromWindowsMenu:excluded];
|
|
|
|
}
|
|
|
|
|
2021-03-16 09:41:59 +00:00
|
|
|
void NativeWindowMac::OnDisplayMetricsChanged(const display::Display& display,
|
|
|
|
uint32_t changed_metrics) {
|
|
|
|
// We only want to force screen recalibration if we're in simpleFullscreen
|
|
|
|
// mode.
|
|
|
|
if (!is_simple_fullscreen_)
|
|
|
|
return;
|
|
|
|
|
|
|
|
base::PostTask(FROM_HERE, {content::BrowserThread::UI},
|
|
|
|
base::BindOnce(&NativeWindow::UpdateFrame, GetWeakPtr()));
|
|
|
|
}
|
|
|
|
|
2017-08-13 06:28:33 +00:00
|
|
|
void NativeWindowMac::SetSimpleFullScreen(bool simple_fullscreen) {
|
2019-01-09 20:25:19 +00:00
|
|
|
NSWindow* window = GetNativeWindow().GetNativeNSWindow();
|
2017-08-13 06:28:33 +00:00
|
|
|
|
|
|
|
if (simple_fullscreen && !is_simple_fullscreen_) {
|
|
|
|
is_simple_fullscreen_ = true;
|
|
|
|
|
2018-10-10 05:38:52 +00:00
|
|
|
// Take note of the current window size and level
|
|
|
|
if (IsNormal()) {
|
2018-08-24 21:33:27 +00:00
|
|
|
original_frame_ = [window_ frame];
|
2018-10-10 05:38:52 +00:00
|
|
|
original_level_ = [window_ level];
|
|
|
|
}
|
2017-08-13 06:28:33 +00:00
|
|
|
|
|
|
|
simple_fullscreen_options_ = [NSApp currentSystemPresentationOptions];
|
2017-09-12 18:27:30 +00:00
|
|
|
simple_fullscreen_mask_ = [window styleMask];
|
2017-08-13 06:28:33 +00:00
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
// We can simulate the pre-Lion fullscreen by auto-hiding the dock and menu
|
|
|
|
// bar
|
2017-08-13 06:28:33 +00:00
|
|
|
NSApplicationPresentationOptions options =
|
2019-05-14 15:49:46 +00:00
|
|
|
NSApplicationPresentationAutoHideDock |
|
2017-08-13 06:28:33 +00:00
|
|
|
NSApplicationPresentationAutoHideMenuBar;
|
|
|
|
[NSApp setPresentationOptions:options];
|
|
|
|
|
|
|
|
was_maximizable_ = IsMaximizable();
|
|
|
|
was_movable_ = IsMovable();
|
|
|
|
|
|
|
|
NSRect fullscreenFrame = [window.screen frame];
|
|
|
|
|
2018-10-10 05:38:52 +00:00
|
|
|
// If our app has dock hidden, set the window level higher so another app's
|
|
|
|
// menu bar doesn't appear on top of our fullscreen app.
|
|
|
|
if ([[NSRunningApplication currentApplication] activationPolicy] !=
|
|
|
|
NSApplicationActivationPolicyRegular) {
|
|
|
|
window.level = NSPopUpMenuWindowLevel;
|
|
|
|
}
|
|
|
|
|
2021-01-30 23:15:10 +00:00
|
|
|
if (!window_button_visibility_.has_value()) {
|
2018-07-03 08:20:56 +00:00
|
|
|
// Lets keep previous behaviour - hide window controls in titled
|
|
|
|
// fullscreen mode when not specified otherwise.
|
2021-01-19 10:12:09 +00:00
|
|
|
InternalSetWindowButtonVisibility(false);
|
2017-08-13 06:28:33 +00:00
|
|
|
}
|
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
[window setFrame:fullscreenFrame display:YES animate:YES];
|
2017-08-13 06:28:33 +00:00
|
|
|
|
2017-09-12 18:27:30 +00:00
|
|
|
// Fullscreen windows can't be resized, minimized, maximized, or moved
|
|
|
|
SetMinimizable(false);
|
|
|
|
SetResizable(false);
|
|
|
|
SetMaximizable(false);
|
|
|
|
SetMovable(false);
|
2017-08-13 06:28:33 +00:00
|
|
|
} else if (!simple_fullscreen && is_simple_fullscreen_) {
|
|
|
|
is_simple_fullscreen_ = false;
|
|
|
|
|
2021-01-19 10:12:09 +00:00
|
|
|
// Restore default window controls visibility state.
|
|
|
|
if (!window_button_visibility_.has_value()) {
|
|
|
|
bool visibility;
|
|
|
|
if (has_frame())
|
|
|
|
visibility = true;
|
|
|
|
else
|
|
|
|
visibility = title_bar_style_ != TitleBarStyle::kNormal;
|
|
|
|
InternalSetWindowButtonVisibility(visibility);
|
|
|
|
}
|
2018-07-03 08:20:56 +00:00
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
[window setFrame:original_frame_ display:YES animate:YES];
|
2018-10-10 05:38:52 +00:00
|
|
|
window.level = original_level_;
|
2017-08-13 06:28:33 +00:00
|
|
|
|
|
|
|
[NSApp setPresentationOptions:simple_fullscreen_options_];
|
2017-09-12 18:27:30 +00:00
|
|
|
|
|
|
|
// Restore original style mask
|
|
|
|
ScopedDisableResize disable_resize;
|
|
|
|
[window_ setStyleMask:simple_fullscreen_mask_];
|
|
|
|
|
2017-08-13 06:28:33 +00:00
|
|
|
// Restore window manipulation abilities
|
2017-09-12 18:27:30 +00:00
|
|
|
SetMaximizable(was_maximizable_);
|
|
|
|
SetMovable(was_movable_);
|
2017-08-13 06:28:33 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::IsSimpleFullScreen() {
|
|
|
|
return is_simple_fullscreen_;
|
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
void NativeWindowMac::SetKiosk(bool kiosk) {
|
2014-06-09 05:04:59 +00:00
|
|
|
if (kiosk && !is_kiosk_) {
|
|
|
|
kiosk_options_ = [NSApp currentSystemPresentationOptions];
|
2013-04-12 07:04:46 +00:00
|
|
|
NSApplicationPresentationOptions options =
|
2019-05-14 15:49:46 +00:00
|
|
|
NSApplicationPresentationHideDock |
|
|
|
|
NSApplicationPresentationHideMenuBar |
|
|
|
|
NSApplicationPresentationDisableAppleMenu |
|
|
|
|
NSApplicationPresentationDisableProcessSwitching |
|
|
|
|
NSApplicationPresentationDisableForceQuit |
|
|
|
|
NSApplicationPresentationDisableSessionTermination |
|
2013-04-12 07:04:46 +00:00
|
|
|
NSApplicationPresentationDisableHideApplication;
|
|
|
|
[NSApp setPresentationOptions:options];
|
|
|
|
is_kiosk_ = true;
|
2021-04-21 14:56:25 +00:00
|
|
|
SetFullScreen(true);
|
2014-06-09 05:04:59 +00:00
|
|
|
} else if (!kiosk && is_kiosk_) {
|
|
|
|
[NSApp setPresentationOptions:kiosk_options_];
|
2021-04-21 14:56:25 +00:00
|
|
|
is_kiosk_ = false;
|
|
|
|
SetFullScreen(false);
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::IsKiosk() {
|
|
|
|
return is_kiosk_;
|
|
|
|
}
|
|
|
|
|
2018-03-06 04:21:47 +00:00
|
|
|
void NativeWindowMac::SetBackgroundColor(SkColor color) {
|
2018-04-24 11:08:14 +00:00
|
|
|
base::ScopedCFTypeRef<CGColorRef> cgcolor(
|
|
|
|
skia::CGColorCreateFromSkColor(color));
|
2018-10-10 03:37:07 +00:00
|
|
|
[[[window_ contentView] layer] setBackgroundColor:cgcolor];
|
2015-10-23 03:35:33 +00:00
|
|
|
}
|
|
|
|
|
2019-12-13 16:08:30 +00:00
|
|
|
SkColor NativeWindowMac::GetBackgroundColor() {
|
2021-03-15 00:26:47 +00:00
|
|
|
CGColorRef color = [[[window_ contentView] layer] backgroundColor];
|
|
|
|
if (!color)
|
|
|
|
return SK_ColorTRANSPARENT;
|
|
|
|
return skia::CGColorRefToSkColor(color);
|
2019-12-13 16:08:30 +00:00
|
|
|
}
|
|
|
|
|
2016-01-23 00:15:49 +00:00
|
|
|
void NativeWindowMac::SetHasShadow(bool has_shadow) {
|
|
|
|
[window_ setHasShadow:has_shadow];
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::HasShadow() {
|
|
|
|
return [window_ hasShadow];
|
|
|
|
}
|
|
|
|
|
2017-09-29 02:26:02 +00:00
|
|
|
void NativeWindowMac::SetOpacity(const double opacity) {
|
2019-08-07 07:17:32 +00:00
|
|
|
const double boundedOpacity = base::ClampToRange(opacity, 0.0, 1.0);
|
|
|
|
[window_ setAlphaValue:boundedOpacity];
|
2017-09-29 02:26:02 +00:00
|
|
|
}
|
|
|
|
|
2017-10-02 15:08:10 +00:00
|
|
|
double NativeWindowMac::GetOpacity() {
|
|
|
|
return [window_ alphaValue];
|
|
|
|
}
|
|
|
|
|
2014-05-27 06:15:34 +00:00
|
|
|
void NativeWindowMac::SetRepresentedFilename(const std::string& filename) {
|
|
|
|
[window_ setRepresentedFilename:base::SysUTF8ToNSString(filename)];
|
|
|
|
}
|
|
|
|
|
2014-07-18 13:42:26 +00:00
|
|
|
std::string NativeWindowMac::GetRepresentedFilename() {
|
|
|
|
return base::SysNSStringToUTF8([window_ representedFilename]);
|
|
|
|
}
|
|
|
|
|
2014-05-27 06:15:34 +00:00
|
|
|
void NativeWindowMac::SetDocumentEdited(bool edited) {
|
|
|
|
[window_ setDocumentEdited:edited];
|
|
|
|
}
|
|
|
|
|
2014-07-24 07:48:33 +00:00
|
|
|
bool NativeWindowMac::IsDocumentEdited() {
|
|
|
|
return [window_ isDocumentEdited];
|
|
|
|
}
|
|
|
|
|
2018-04-09 10:35:05 +00:00
|
|
|
void NativeWindowMac::SetIgnoreMouseEvents(bool ignore, bool forward) {
|
2015-12-06 02:14:54 +00:00
|
|
|
[window_ setIgnoresMouseEvents:ignore];
|
2018-04-09 10:35:05 +00:00
|
|
|
|
|
|
|
if (!ignore) {
|
|
|
|
SetForwardMouseMessages(NO);
|
|
|
|
} else {
|
|
|
|
SetForwardMouseMessages(forward);
|
|
|
|
}
|
2015-12-06 02:14:54 +00:00
|
|
|
}
|
|
|
|
|
2016-06-22 08:40:01 +00:00
|
|
|
void NativeWindowMac::SetContentProtection(bool enable) {
|
2018-04-20 18:47:04 +00:00
|
|
|
[window_
|
|
|
|
setSharingType:enable ? NSWindowSharingNone : NSWindowSharingReadOnly];
|
2016-06-22 08:40:01 +00:00
|
|
|
}
|
|
|
|
|
2019-07-08 02:34:18 +00:00
|
|
|
void NativeWindowMac::SetFocusable(bool focusable) {
|
|
|
|
// No known way to unfocus the window if it had the focus. Here we do not
|
|
|
|
// want to call Focus(false) because it moves the window to the back, i.e.
|
|
|
|
// at the bottom in term of z-order.
|
|
|
|
[window_ setDisableKeyOrMainWindow:!focusable];
|
|
|
|
}
|
|
|
|
|
2021-04-21 10:32:19 +00:00
|
|
|
bool NativeWindowMac::IsFocusable() {
|
|
|
|
return ![window_ disableKeyOrMainWindow];
|
|
|
|
}
|
|
|
|
|
2018-12-22 01:49:26 +00:00
|
|
|
void NativeWindowMac::AddBrowserView(NativeBrowserView* view) {
|
2018-10-02 01:49:26 +00:00
|
|
|
[CATransaction begin];
|
|
|
|
[CATransaction setDisableActions:YES];
|
|
|
|
|
2018-03-06 06:04:40 +00:00
|
|
|
if (!view) {
|
2018-10-02 01:49:26 +00:00
|
|
|
[CATransaction commit];
|
Implement initial, experimental BrowserView API
Right now, `<webview>` is the only way to embed additional content in a
`BrowserWindow`. Unfortunately `<webview>` suffers from a [number of
problems](https://github.com/electron/electron/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Awebview%20).
To make matters worse, many of these are upstream Chromium bugs instead
of Electron-specific bugs.
For us at [Figma](https://www.figma.com), the main issue is very slow
performance.
Despite the upstream improvements to `<webview>` through the OOPIF work, it is
probable that there will continue to be `<webview>`-specific bugs in the
future.
Therefore, this introduces a `<webview>` alternative to called `BrowserView`,
which...
- is a thin wrapper around `api::WebContents` (so bugs in `BrowserView` will
likely also be bugs in `BrowserWindow` web contents)
- is instantiated in the main process like `BrowserWindow` (and unlike
`<webview>`, which lives in the DOM of a `BrowserWindow` web contents)
- needs to be added to a `BrowserWindow` to display something on the screen
This implements the most basic API. The API is expected to evolve and change in
the near future and has consequently been marked as experimental. Please do not
use this API in production unless you are prepared to deal with breaking
changes.
In the future, we will want to change the API to support multiple
`BrowserView`s per window. We will also want to consider z-ordering
auto-resizing, and possibly even nested views.
2017-04-11 17:47:30 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2018-12-22 01:49:26 +00:00
|
|
|
add_browser_view(view);
|
2020-08-26 03:04:13 +00:00
|
|
|
if (view->GetInspectableWebContentsView()) {
|
|
|
|
auto* native_view = view->GetInspectableWebContentsView()
|
|
|
|
->GetNativeView()
|
|
|
|
.GetNativeNSView();
|
|
|
|
[[window_ contentView] addSubview:native_view
|
|
|
|
positioned:NSWindowAbove
|
|
|
|
relativeTo:nil];
|
|
|
|
native_view.hidden = NO;
|
|
|
|
}
|
2018-10-02 01:49:26 +00:00
|
|
|
|
|
|
|
[CATransaction commit];
|
Implement initial, experimental BrowserView API
Right now, `<webview>` is the only way to embed additional content in a
`BrowserWindow`. Unfortunately `<webview>` suffers from a [number of
problems](https://github.com/electron/electron/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aopen%20label%3Awebview%20).
To make matters worse, many of these are upstream Chromium bugs instead
of Electron-specific bugs.
For us at [Figma](https://www.figma.com), the main issue is very slow
performance.
Despite the upstream improvements to `<webview>` through the OOPIF work, it is
probable that there will continue to be `<webview>`-specific bugs in the
future.
Therefore, this introduces a `<webview>` alternative to called `BrowserView`,
which...
- is a thin wrapper around `api::WebContents` (so bugs in `BrowserView` will
likely also be bugs in `BrowserWindow` web contents)
- is instantiated in the main process like `BrowserWindow` (and unlike
`<webview>`, which lives in the DOM of a `BrowserWindow` web contents)
- needs to be added to a `BrowserWindow` to display something on the screen
This implements the most basic API. The API is expected to evolve and change in
the near future and has consequently been marked as experimental. Please do not
use this API in production unless you are prepared to deal with breaking
changes.
In the future, we will want to change the API to support multiple
`BrowserView`s per window. We will also want to consider z-ordering
auto-resizing, and possibly even nested views.
2017-04-11 17:47:30 +00:00
|
|
|
}
|
|
|
|
|
2018-12-22 01:49:26 +00:00
|
|
|
void NativeWindowMac::RemoveBrowserView(NativeBrowserView* view) {
|
|
|
|
[CATransaction begin];
|
|
|
|
[CATransaction setDisableActions:YES];
|
|
|
|
|
|
|
|
if (!view) {
|
|
|
|
[CATransaction commit];
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2020-08-26 03:04:13 +00:00
|
|
|
if (view->GetInspectableWebContentsView())
|
|
|
|
[view->GetInspectableWebContentsView()->GetNativeView().GetNativeNSView()
|
|
|
|
removeFromSuperview];
|
2018-12-22 01:49:26 +00:00
|
|
|
remove_browser_view(view);
|
|
|
|
|
|
|
|
[CATransaction commit];
|
|
|
|
}
|
|
|
|
|
2021-02-10 07:23:35 +00:00
|
|
|
void NativeWindowMac::SetTopBrowserView(NativeBrowserView* view) {
|
|
|
|
[CATransaction begin];
|
|
|
|
[CATransaction setDisableActions:YES];
|
|
|
|
|
|
|
|
if (!view) {
|
|
|
|
[CATransaction commit];
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
remove_browser_view(view);
|
|
|
|
add_browser_view(view);
|
|
|
|
if (view->GetInspectableWebContentsView()) {
|
|
|
|
auto* native_view = view->GetInspectableWebContentsView()
|
|
|
|
->GetNativeView()
|
|
|
|
.GetNativeNSView();
|
|
|
|
[[window_ contentView] addSubview:native_view
|
|
|
|
positioned:NSWindowAbove
|
|
|
|
relativeTo:nil];
|
|
|
|
native_view.hidden = NO;
|
|
|
|
}
|
|
|
|
|
|
|
|
[CATransaction commit];
|
|
|
|
}
|
|
|
|
|
2017-05-01 20:10:48 +00:00
|
|
|
void NativeWindowMac::SetParentWindow(NativeWindow* parent) {
|
2017-05-01 20:21:05 +00:00
|
|
|
InternalSetParentWindow(parent, IsVisible());
|
2017-05-01 20:10:48 +00:00
|
|
|
}
|
|
|
|
|
2017-05-23 09:41:59 +00:00
|
|
|
gfx::NativeView NativeWindowMac::GetNativeView() const {
|
2018-03-06 04:31:12 +00:00
|
|
|
return [window_ contentView];
|
2017-03-14 11:56:24 +00:00
|
|
|
}
|
|
|
|
|
2017-09-14 05:43:22 +00:00
|
|
|
gfx::NativeWindow NativeWindowMac::GetNativeWindow() const {
|
2014-04-11 04:45:48 +00:00
|
|
|
return window_;
|
2013-05-03 11:31:24 +00:00
|
|
|
}
|
|
|
|
|
2017-05-23 09:41:59 +00:00
|
|
|
gfx::AcceleratedWidget NativeWindowMac::GetAcceleratedWidget() const {
|
2019-08-15 06:51:15 +00:00
|
|
|
return [window_ windowNumber];
|
|
|
|
}
|
|
|
|
|
|
|
|
content::DesktopMediaID NativeWindowMac::GetDesktopMediaID() const {
|
chore: bump chromium to 92.0.4475.0 (master) (#28462)
* chore: bump chromium in DEPS to 91.0.4464.0
* chore: rebuild chromium/dcheck.patch with import-patches -3
Mechanical only; no code changes
* chore: remove content_browser_main_loop.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
The function being patched (BrowserMainLoop::MainMessageLoopRun()) no
longer exists.
NB: if removing this introduces regressions the likely fix will be to
add a similar patch for ShellBrowserMainParts::WillRunMainMessageLoop()
which has similar code and was added at the same time this was removed.
* chore: rebuild chromium/put_back_deleted_colors_for_autofill.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/disable_color_correct_rendering.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/eat_allow_disabling_blink_scheduler_throttling_per_renderview.patch with patch
Mechanical only; no code changes
* chore: rebuild chromium/gpu_notify_when_dxdiag_request_fails.patch with import-patches -3
Mechanical only; no code changes
* chore: rebuild chromium/ui_gtk_public_header.patch manually
no code changes
* chore: rebuild chromium/web_contents.patch with import-patches -3
Mechanical only; no code changes
* chore: remove v8/skip_global_registration_of_shared_arraybuffer_backing_stores.patch
Refs: https://chromium-review.googlesource.com/c/v8/v8/+/2763874
This patch has been merged upstream
* chore: export patches
* chore: update add_trustedauthclient_to_urlloaderfactory.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2757969
Sync with removal of render_frame_id_
* chore: sync chromium/put_back_deleted_colors_for_autofill.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2785841
SkColorFromColorId() no longer takes theme, scheme args
* chore: sync chromium/put_back_deleted_colors_for_autofill.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2772143
Change new calls to GetDarkSchemeColor to fit our patched call signature
* chore: update add_trustedauthclient_to_urlloaderfactory.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2757969
Sync with removal of render_frame_id_ in our mojom
* chore: update chromium/frame_host_manager.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2740008
UrlInfo ctor now takes UrlInfo::OriginIsolationRequest instead of a bool
* chore: update chromium/revert_remove_contentrendererclient_shouldfork.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2755314
Upstream has removed `history_list_length_` which we were comparing to 0
to calculate our `is_initial_navigation` bool when calling ShouldFork().
ShouldFork() is ours and none of the code paths actually use that param,
so this commit removes it altogether.
* chore: update permissions_to_register
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2789074
Replace all uses of APIPermission::ID enum with Mojo type
* refactor: update return type of PreMainMessageLoopRun()
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
Used to return void; now returns an int errorcode.
Note: 2725153 also has some nice doc updates about Browser's "stages"
* refactor: sync ElectronBrowserMainParts to MainParts changes
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
RunMainMessageLoopParts has been replaced with WillRunMainMessageLoop
so `BrowserMainLoop::result_code_` is no longer available to us for our
exit_code_ pointer.
This variable held a dual role: (1) of course, hold the exit code, but
also (2) was a nullptr before the message loop was ready, indicating to
anyone calling SetExitCode() that we were still in startup and could
just exit() without any extra steps. exit_code_ still fulfills these two
roles but is now a base::Optional.
* chore: update ElectronBrowserMainParts::PreDefaultMainMessageLoopRun
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2725153
BrowserMainParts::BrowsePreDefaultMainMesssageLoopRun() has been
removed; move that work to the new WillRunMainMessageLoop().
* refactor: stop using CallbackList; it has been removed.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2785973
* refactor: update use of threadpools.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2773408
The upstream code is still in flux (e.g. reverts and re-lands) but the
tl;dr for this commit is (1) include thread_pool.h if you're using it
and (2) don't instantiate pools directly.
* refactor: remove routing_id from CreateLoaderAndStart
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762858
NB: One logic branch in ProxyingURLLoaderFactory::CreateLoaderAndStart
calls std::make_unique<InProgressRequest>, which needs a routing_id.
This PR uses the member field `routing_id_` since there's no longer one
being passed into CreateLoaderAndStart.
* refactor: sync to upstream ParittionOptions churn
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771318
PartitionOptions' enums have changed.
* refactor: update Manifest::Location usage
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771320
tldr: s/Manifest::FOO/ManifestLocation::kFoo/
* chore: bump chromium in DEPS to 91.0.4465.0
* update patches
* refactor: update extensions::Manifest to upstream
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771320
- extensions::Manifest::COMPONENT
+ extensions::mojom::ManifestLocation::kExternalComponent
* refactor: sync with upstream UrlInfo ctor changes
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2740008
UrlInfo ctor now takes UrlInfo::OriginIsolationRequest instead of a bool
* chore: update invocation of convert_protocol_to_json.py
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2792623
python3 is being used in parts of the upstream build, but the copy of
convert_protocol_to_json.py invoked in v8/third_party/inspector_protocol
is not python3-friendly. Node has a py2+3-friendly version of it in its
tools directory, so call it instead.
* chore: use extensions::mojom::APIPermissionID
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791122
tldr:
- extensions::APIPermission::kFoo
+ extensions::mojom::APIPermissionID::kFoo
* chore: Remove support for TLS1.0/1.1 in SSLVersionMin policy
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2765737
Remove TLS v1.0 & 1.1 from our SSLProtocolVersionFromString() function.
This is the same change made upstream at
https://chromium-review.googlesource.com/c/chromium/src/+/2765737/8/chrome/browser/ssl/ssl_config_service_manager_pref.cc
* fixup! chore: update ElectronBrowserMainParts::PreDefaultMainMessageLoopRun
* chore: Use IDType for permission change subscriptions.
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791431
tldr: {Subscribe,Unsubscribe}PermissionStatusChange's tag type used to
be an int; now it's the new SubscriptionId type (which is an IdType64).
* chore: sync PowerMonitor code to upstream refactor
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2752635
tldr: PowerMonitor has been split into PowerStateObserver,
PowerSuspendObserver, and PowerThermalObserver to reduce number of tasks
posted to consumers who only need notifications for one of those things
instead of all of them.
* chore: use PartitionOptions's new Cookies field
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2771318
* Revert "refactor: remove routing_id from CreateLoaderAndStart"
This reverts commit 8c9773b87a3c84f9073a47089eb2b6889d745245.
8c9773b was only a partial fix; reverting to start & try again.
* update patches
* chore: bump chromium in DEPS to 91.0.4466.0
* chore: update chromium/accelerator.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2795472
tldr: sync patch with upstream renamed variable & macro names.
* chore: update chromium/gtk_visibility.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2796200
tldr: no code changes; just updating the diff to apply cleanly.
note: ooh upstream Wayland hacking!
* chore: update chromium/picture-in-picture.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2710023
tldr: no code changes; just updating the diff to apply cleanly.
* chore: update chromium/worker_feat_add_hook_to_notify_script_ready.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2775573
tldr: no code changes; just updating the diff to apply cleanly.
* chore: export_all_patches
* chore: update chromium/feat_add_set_theme_source_to_allow_apps_to.patch
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2796511
tldr: NotifyObservers has been renamed to NotifyOnNativeThemeUpdated,
so update the invocation in our patch.
* chore: update ElectronBrowserClient w/upstream API
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797454
tldr: GetDevToolsManagerDelegate() was returning an owned raw pointer.
Replaced it with CreateDevToolsManagerDelegate() which uses unique_ptr<>.
* chore: handle new content::PermissionType::FILE_HANDLING in toV8()
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762201
`file-handling` string confirmed in https://chromium-review.googlesource.com/c/chromium/src/+/2762201/18/chrome/browser/ui/webui/settings/site_settings_helper.cc
* refactor: remove routing_id from CreateLoaderAndStart pt 1
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2762858
Part 1: the easiest ones
* 2796724: Support Python3
https://chromium-review.googlesource.com/c/infra/luci/python-adb/+/2796724
* chore: bump chromium in DEPS to 91.0.4468.0
* 2668974: WebShare: Implement SharingServicePicker
https://chromium-review.googlesource.com/c/chromium/src/+/2668974
* 2802766: Apply modernize-make-unique to media/
https://chromium-review.googlesource.com/c/chromium/src/+/2802766
* 2802823: Apply modernize-make-unique to gpu/
https://chromium-review.googlesource.com/c/chromium/src/+/2802823
* 2803041: Apply modernize-make-unique to remaining files
https://chromium-review.googlesource.com/c/chromium/src/+/2803041
* 2798873: Convert GtkKeyBindingsHandler build checks to runtime checks
https://chromium-review.googlesource.com/c/chromium/src/+/2798873
* 2733595: [ch-r] Parse ACCEPT_CH H2/3 frame and restart with new headers if needed
https://chromium-review.googlesource.com/c/chromium/src/+/2733595
* chore: update patch indices
* 2795107: Remove unused PermissionRequest IDs.
https://chromium-review.googlesource.com/c/chromium/src/+/2795107
* chore: bump chromium in DEPS to 91.0.4469.0
* chore: fixup patch indices
* chore: bump chromium in DEPS to 91.0.4469.5
* PiP 1.5: Add microphone, camera, and hang up buttons to the PiP window
https://chromium-review.googlesource.com/c/chromium/src/+/2710023
* fixup! refactor: remove routing_id from CreateLoaderAndStart
* refactor: use URLLoaderNetworkServiceObserver for auth requests from SimpleURLLoader
* fixup! chore: fixup patch indices
* 2724817: Expand scope of wasm-eval to all URLs
https://chromium-review.googlesource.com/c/chromium/src/+/2724817
* Fixup patch after rebase
* chore: bump chromium in DEPS to 91.0.4472.0
* 2797341: [ozone/x11] Enabled the global shortcut listener.
https://chromium-review.googlesource.com/c/chromium/src/+/2797341
* 2805553: Reland Add GTK ColorMixers to ColorPipeline P1
https://chromium-review.googlesource.com/c/chromium/src/+/2805553
* 2804366: PiP 1.5: Label back to tab button with origin and center it
https://chromium-review.googlesource.com/c/chromium/src/+/2804366
* 2784730: Fix crash on AX mode change in NativeViewHost without a Widget
https://chromium-review.googlesource.com/c/chromium/src/+/2784730
* chore: update patch indices
* 2810174: Add PdfAnnotationsEnabled policy.
https://chromium-review.googlesource.com/c/chromium/src/+/2810174
* 2807829: Allow capturers to indicate if they want a WakeLock or not.
https://chromium-review.googlesource.com/c/chromium/src/+/2807829
* chore: bump chromium in DEPS to 92.0.4473.0
* chore: bump chromium in DEPS to 92.0.4474.0
* chore: bump chromium in DEPS to 92.0.4475.0
* chore: update patches
* chore: updates patches
* chore: update is_media_key patch to handle new ozone impl
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797341
* fix: ExecuteJavascript requests now need to be flagged as non-bf-aware
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2787195
* chore: icon_util_x11 is now icon_util_linux
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2791362
* build: update sysroots
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2628496
* build: fix missing symbols on linux build
* use_ozone and use_x11 are not exclusive
* new button view to build for pip
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2797341
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2804366
* chore: fix broken gtk_util color patch
* chore: remove patch conflict
* build: update linux manifests
* chore: build bttlb on all platforms for pip
* chore: add thread_pool include for views delegate win
* chore: fix lint
* chore: add node patches for V8 changes
* build: add missing base include on windows
* fix: update frame host manager patch for new state transitions
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2714464
* chore: update windows zip manifests
* chore: update mac zip manifests
* chore: fix patch linting
* refactor: implement missing URLLoaderNetworkServiceObserver methods
It is against The Mojo Rules to leave hanging callbacks. These always
have to be called.
Refs: https://github.com/electron/electron/commit/186528aab9f8e29d658f07d220bb7f627980edda
* spec: fix locale test on local linux
* fix: pass the exit code correctly in new PreMainMessageLoopRun
Refs: https://github.com/electron/electron/commit/2622e91c4493ceb032e2f80cb484885bb8f97475
* fix: ensure we early-exit when request_handler_ is not provided
Refs: https://github.com/electron/electron/commit/93077afbfb6db248a0c0cc447d7ad2c9ccfda1d5
* fix: strongly set result_code in the BrowserMainLoop
* fix: invalid usage of non-targetted PostTask
You must always either use a host threadpool or specify a target
thread. In this case we did neither after this refactor.
Refs: https://github.com/electron/electron/pull/28462/commits/4e33ee0ad35a710bd34641cb0376bdee6aea2d1f
* chore: fix gn check
* chore: remove stray .rej files in patch
* chore: add mojo error code to url loader failure
* build: ensure CI is truthy in arm test env
* fix: handle windowCaptureMacV2 being enabled when fetching media source id
Refs: https://chromium-review.googlesource.com/c/chromium/src/+/2709931
Co-authored-by: Charles Kerr <charles@charleskerr.com>
Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
Co-authored-by: deepak1556 <hop2deep@gmail.com>
Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>
Co-authored-by: Samuel Attard <sattard@slack-corp.com>
2021-04-15 17:44:35 +00:00
|
|
|
auto desktop_media_id = content::DesktopMediaID(
|
|
|
|
content::DesktopMediaID::TYPE_WINDOW, GetAcceleratedWidget());
|
|
|
|
// c.f.
|
|
|
|
// https://source.chromium.org/chromium/chromium/src/+/master:chrome/browser/media/webrtc/native_desktop_media_list.cc;l=372?q=kWindowCaptureMacV2&ss=chromium
|
|
|
|
if (base::FeatureList::IsEnabled(features::kWindowCaptureMacV2)) {
|
|
|
|
if (remote_cocoa::ScopedCGWindowID::Get(desktop_media_id.id)) {
|
|
|
|
desktop_media_id.window_id = desktop_media_id.id;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return desktop_media_id;
|
2016-01-07 20:38:35 +00:00
|
|
|
}
|
|
|
|
|
2018-12-11 17:45:55 +00:00
|
|
|
NativeWindowHandle NativeWindowMac::GetNativeWindowHandle() const {
|
|
|
|
return [window_ contentView];
|
2018-11-08 17:03:19 +00:00
|
|
|
}
|
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
void NativeWindowMac::SetProgressBar(double progress,
|
|
|
|
const NativeWindow::ProgressState state) {
|
2014-09-17 07:58:08 +00:00
|
|
|
NSDockTile* dock_tile = [NSApp dockTile];
|
|
|
|
|
2019-02-04 23:59:06 +00:00
|
|
|
// Sometimes macOS would install a default contentView for dock, we must
|
|
|
|
// verify whether NSProgressIndicator has been installed.
|
|
|
|
bool first_time = !dock_tile.contentView ||
|
|
|
|
[[dock_tile.contentView subviews] count] == 0 ||
|
|
|
|
![[[dock_tile.contentView subviews] lastObject]
|
|
|
|
isKindOfClass:[NSProgressIndicator class]];
|
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
// For the first time API invoked, we need to create a ContentView in
|
|
|
|
// DockTile.
|
2019-02-04 23:59:06 +00:00
|
|
|
if (first_time) {
|
|
|
|
NSImageView* image_view = [[[NSImageView alloc] init] autorelease];
|
2014-09-17 07:58:08 +00:00
|
|
|
[image_view setImage:[NSApp applicationIconImage]];
|
|
|
|
[dock_tile setContentView:image_view];
|
|
|
|
|
2019-02-04 23:59:06 +00:00
|
|
|
NSRect frame = NSMakeRect(0.0f, 0.0f, dock_tile.size.width, 15.0);
|
|
|
|
NSProgressIndicator* progress_indicator =
|
2020-02-04 20:19:40 +00:00
|
|
|
[[[ElectronProgressBar alloc] initWithFrame:frame] autorelease];
|
2014-09-17 07:58:08 +00:00
|
|
|
[progress_indicator setStyle:NSProgressIndicatorBarStyle];
|
|
|
|
[progress_indicator setIndeterminate:NO];
|
|
|
|
[progress_indicator setBezeled:YES];
|
|
|
|
[progress_indicator setMinValue:0];
|
|
|
|
[progress_indicator setMaxValue:1];
|
|
|
|
[progress_indicator setHidden:NO];
|
2016-06-16 21:57:23 +00:00
|
|
|
[dock_tile.contentView addSubview:progress_indicator];
|
2014-09-17 07:58:08 +00:00
|
|
|
}
|
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
NSProgressIndicator* progress_indicator = static_cast<NSProgressIndicator*>(
|
2019-02-04 23:59:06 +00:00
|
|
|
[[[dock_tile contentView] subviews] lastObject]);
|
2014-09-17 07:58:08 +00:00
|
|
|
if (progress < 0) {
|
|
|
|
[progress_indicator setHidden:YES];
|
|
|
|
} else if (progress > 1) {
|
2014-09-21 10:56:03 +00:00
|
|
|
[progress_indicator setHidden:NO];
|
2014-09-17 07:58:08 +00:00
|
|
|
[progress_indicator setIndeterminate:YES];
|
2014-09-21 10:56:03 +00:00
|
|
|
[progress_indicator setDoubleValue:1];
|
2014-09-17 07:58:08 +00:00
|
|
|
} else {
|
2014-09-21 10:56:03 +00:00
|
|
|
[progress_indicator setHidden:NO];
|
2014-09-17 07:58:08 +00:00
|
|
|
[progress_indicator setDoubleValue:progress];
|
|
|
|
}
|
|
|
|
[dock_tile display];
|
|
|
|
}
|
|
|
|
|
2015-02-11 01:14:26 +00:00
|
|
|
void NativeWindowMac::SetOverlayIcon(const gfx::Image& overlay,
|
2018-04-20 18:47:04 +00:00
|
|
|
const std::string& description) {}
|
2015-02-07 19:56:03 +00:00
|
|
|
|
2020-08-19 20:31:25 +00:00
|
|
|
void NativeWindowMac::SetVisibleOnAllWorkspaces(bool visible,
|
2021-02-02 12:24:04 +00:00
|
|
|
bool visibleOnFullScreen,
|
|
|
|
bool skipTransformProcessType) {
|
2020-08-19 20:31:25 +00:00
|
|
|
// In order for NSWindows to be visible on fullscreen we need to functionally
|
|
|
|
// mimic app.dock.hide() since Apple changed the underlying functionality of
|
|
|
|
// NSWindows starting with 10.14 to disallow NSWindows from floating on top of
|
|
|
|
// fullscreen apps.
|
2021-02-02 12:24:04 +00:00
|
|
|
if (!skipTransformProcessType) {
|
|
|
|
ProcessSerialNumber psn = {0, kCurrentProcess};
|
|
|
|
if (visibleOnFullScreen) {
|
|
|
|
[window_ setCanHide:NO];
|
|
|
|
TransformProcessType(&psn, kProcessTransformToUIElementApplication);
|
|
|
|
} else {
|
|
|
|
[window_ setCanHide:YES];
|
|
|
|
TransformProcessType(&psn, kProcessTransformToForegroundApplication);
|
|
|
|
}
|
2020-08-19 20:31:25 +00:00
|
|
|
}
|
|
|
|
|
2016-01-23 11:12:19 +00:00
|
|
|
SetCollectionBehavior(visible, NSWindowCollectionBehaviorCanJoinAllSpaces);
|
2020-08-19 20:31:25 +00:00
|
|
|
SetCollectionBehavior(visibleOnFullScreen,
|
|
|
|
NSWindowCollectionBehaviorFullScreenAuxiliary);
|
2015-03-26 06:18:37 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::IsVisibleOnAllWorkspaces() {
|
2015-03-27 11:41:07 +00:00
|
|
|
NSUInteger collectionBehavior = [window_ collectionBehavior];
|
|
|
|
return collectionBehavior & NSWindowCollectionBehaviorCanJoinAllSpaces;
|
2015-03-26 06:18:37 +00:00
|
|
|
}
|
|
|
|
|
2016-11-28 19:38:40 +00:00
|
|
|
void NativeWindowMac::SetAutoHideCursor(bool auto_hide) {
|
|
|
|
[window_ setDisableAutoHideCursor:!auto_hide];
|
|
|
|
}
|
|
|
|
|
2021-05-11 07:45:21 +00:00
|
|
|
void NativeWindowMac::UpdateVibrancyRadii(bool fullscreen) {
|
|
|
|
NSView* vibrant_view = [window_ vibrantView];
|
|
|
|
NSVisualEffectView* effect_view = (NSVisualEffectView*)vibrant_view;
|
|
|
|
|
|
|
|
if (effect_view != nil && !vibrancy_type_.empty()) {
|
|
|
|
const bool no_rounded_corner =
|
|
|
|
[window_ styleMask] & NSWindowStyleMaskFullSizeContentView;
|
|
|
|
if (!has_frame() && !is_modal() && !no_rounded_corner) {
|
|
|
|
CGFloat radius;
|
|
|
|
if (fullscreen) {
|
|
|
|
radius = 0.0f;
|
|
|
|
} else if (@available(macOS 11.0, *)) {
|
|
|
|
radius = 9.0f;
|
|
|
|
} else {
|
|
|
|
// Smaller corner radius on versions prior to Big Sur.
|
|
|
|
radius = 5.0f;
|
|
|
|
}
|
|
|
|
|
|
|
|
CGFloat dimension = 2 * radius + 1;
|
|
|
|
NSSize size = NSMakeSize(dimension, dimension);
|
|
|
|
NSImage* maskImage = [NSImage imageWithSize:size
|
|
|
|
flipped:NO
|
|
|
|
drawingHandler:^BOOL(NSRect rect) {
|
|
|
|
NSBezierPath* bezierPath = [NSBezierPath
|
|
|
|
bezierPathWithRoundedRect:rect
|
|
|
|
xRadius:radius
|
|
|
|
yRadius:radius];
|
|
|
|
[[NSColor blackColor] set];
|
|
|
|
[bezierPath fill];
|
|
|
|
return YES;
|
|
|
|
}];
|
|
|
|
|
|
|
|
[maskImage setCapInsets:NSEdgeInsetsMake(radius, radius, radius, radius)];
|
|
|
|
[maskImage setResizingMode:NSImageResizingModeStretch];
|
|
|
|
[effect_view setMaskImage:maskImage];
|
2021-05-14 09:05:34 +00:00
|
|
|
[window_ setCornerMask:maskImage];
|
2021-05-11 07:45:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-11-07 20:22:41 +00:00
|
|
|
void NativeWindowMac::SetVibrancy(const std::string& type) {
|
2019-02-25 17:21:57 +00:00
|
|
|
NSView* vibrant_view = [window_ vibrantView];
|
2016-11-10 10:59:25 +00:00
|
|
|
|
2019-02-25 17:21:57 +00:00
|
|
|
if (type.empty()) {
|
|
|
|
if (vibrant_view == nil)
|
|
|
|
return;
|
2016-11-10 10:59:25 +00:00
|
|
|
|
2019-02-25 17:21:57 +00:00
|
|
|
[vibrant_view removeFromSuperview];
|
|
|
|
[window_ setVibrantView:nil];
|
2018-02-12 18:38:37 +00:00
|
|
|
|
2019-02-25 17:21:57 +00:00
|
|
|
return;
|
|
|
|
}
|
2018-02-12 18:38:37 +00:00
|
|
|
|
2021-05-11 07:45:21 +00:00
|
|
|
vibrancy_type_ = type;
|
2016-11-07 20:22:41 +00:00
|
|
|
|
2019-02-25 17:21:57 +00:00
|
|
|
NSVisualEffectView* effect_view = (NSVisualEffectView*)vibrant_view;
|
|
|
|
if (effect_view == nil) {
|
|
|
|
effect_view = [[[NSVisualEffectView alloc]
|
|
|
|
initWithFrame:[[window_ contentView] bounds]] autorelease];
|
|
|
|
[window_ setVibrantView:(NSView*)effect_view];
|
|
|
|
|
|
|
|
[effect_view setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
|
|
|
|
[effect_view setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
|
2020-08-24 15:44:48 +00:00
|
|
|
|
2020-10-27 17:51:45 +00:00
|
|
|
if (visual_effect_state_ == VisualEffectState::kActive) {
|
2020-08-24 15:44:48 +00:00
|
|
|
[effect_view setState:NSVisualEffectStateActive];
|
2020-10-27 17:51:45 +00:00
|
|
|
} else if (visual_effect_state_ == VisualEffectState::kInactive) {
|
2020-08-24 15:44:48 +00:00
|
|
|
[effect_view setState:NSVisualEffectStateInactive];
|
|
|
|
} else {
|
|
|
|
[effect_view setState:NSVisualEffectStateFollowsWindowActiveState];
|
|
|
|
}
|
2020-01-13 06:43:00 +00:00
|
|
|
|
2019-02-25 17:21:57 +00:00
|
|
|
[[window_ contentView] addSubview:effect_view
|
|
|
|
positioned:NSWindowBelow
|
|
|
|
relativeTo:nil];
|
2021-05-11 07:45:21 +00:00
|
|
|
|
|
|
|
UpdateVibrancyRadii(IsFullscreen());
|
2019-02-25 17:21:57 +00:00
|
|
|
}
|
2016-11-07 20:22:41 +00:00
|
|
|
|
2020-02-11 16:23:10 +00:00
|
|
|
std::string dep_warn = " has been deprecated and removed as of macOS 10.15.";
|
2019-07-03 21:56:03 +00:00
|
|
|
node::Environment* env =
|
2021-03-29 10:45:08 +00:00
|
|
|
node::Environment::GetCurrent(JavascriptEnvironment::GetIsolate());
|
2019-07-03 21:56:03 +00:00
|
|
|
|
|
|
|
NSVisualEffectMaterial vibrancyType;
|
2019-02-25 17:21:57 +00:00
|
|
|
if (type == "appearance-based") {
|
2020-02-03 22:01:10 +00:00
|
|
|
EmitWarning(env, "NSVisualEffectMaterialAppearanceBased" + dep_warn,
|
|
|
|
"electron");
|
2019-02-25 17:21:57 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialAppearanceBased;
|
|
|
|
} else if (type == "light") {
|
2020-02-03 22:01:10 +00:00
|
|
|
EmitWarning(env, "NSVisualEffectMaterialLight" + dep_warn, "electron");
|
2019-02-25 17:21:57 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialLight;
|
|
|
|
} else if (type == "dark") {
|
2020-02-03 22:01:10 +00:00
|
|
|
EmitWarning(env, "NSVisualEffectMaterialDark" + dep_warn, "electron");
|
2019-02-25 17:21:57 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialDark;
|
|
|
|
} else if (type == "titlebar") {
|
|
|
|
vibrancyType = NSVisualEffectMaterialTitlebar;
|
2018-06-20 12:27:55 +00:00
|
|
|
}
|
2019-02-25 17:21:57 +00:00
|
|
|
|
|
|
|
if (@available(macOS 10.11, *)) {
|
|
|
|
if (type == "selection") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialSelection;
|
2019-02-25 17:21:57 +00:00
|
|
|
} else if (type == "menu") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialMenu;
|
2019-02-25 17:21:57 +00:00
|
|
|
} else if (type == "popover") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialPopover;
|
2019-02-25 17:21:57 +00:00
|
|
|
} else if (type == "sidebar") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialSidebar;
|
2019-02-25 17:21:57 +00:00
|
|
|
} else if (type == "medium-light") {
|
2020-02-03 22:01:10 +00:00
|
|
|
EmitWarning(env, "NSVisualEffectMaterialMediumLight" + dep_warn,
|
|
|
|
"electron");
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialMediumLight;
|
2019-02-25 17:21:57 +00:00
|
|
|
} else if (type == "ultra-dark") {
|
2020-02-03 22:01:10 +00:00
|
|
|
EmitWarning(env, "NSVisualEffectMaterialUltraDark" + dep_warn,
|
|
|
|
"electron");
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialUltraDark;
|
2019-02-25 17:21:57 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-11 19:10:45 +00:00
|
|
|
if (@available(macOS 10.14, *)) {
|
|
|
|
if (type == "header") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialHeaderView;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "sheet") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialSheet;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "window") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialWindowBackground;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "hud") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialHUDWindow;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "fullscreen-ui") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialFullScreenUI;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "tooltip") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialToolTip;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "content") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialContentBackground;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "under-window") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialUnderWindowBackground;
|
2019-07-11 19:10:45 +00:00
|
|
|
} else if (type == "under-page") {
|
2020-02-11 16:23:10 +00:00
|
|
|
vibrancyType = NSVisualEffectMaterialUnderPageBackground;
|
2019-07-11 19:10:45 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-07-03 21:56:03 +00:00
|
|
|
if (vibrancyType)
|
|
|
|
[effect_view setMaterial:vibrancyType];
|
2016-11-07 20:22:41 +00:00
|
|
|
}
|
|
|
|
|
2021-01-19 10:12:09 +00:00
|
|
|
void NativeWindowMac::SetWindowButtonVisibility(bool visible) {
|
|
|
|
window_button_visibility_ = visible;
|
|
|
|
InternalSetWindowButtonVisibility(visible);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::GetWindowButtonVisibility() const {
|
|
|
|
if (buttons_view_)
|
|
|
|
return ![buttons_view_ isHidden];
|
|
|
|
else
|
|
|
|
return ![window_ standardWindowButton:NSWindowZoomButton].hidden ||
|
|
|
|
![window_ standardWindowButton:NSWindowMiniaturizeButton].hidden ||
|
|
|
|
![window_ standardWindowButton:NSWindowCloseButton].hidden;
|
|
|
|
}
|
|
|
|
|
2020-12-16 05:30:39 +00:00
|
|
|
void NativeWindowMac::SetTrafficLightPosition(
|
|
|
|
base::Optional<gfx::Point> position) {
|
|
|
|
traffic_light_position_ = std::move(position);
|
2021-01-30 23:15:10 +00:00
|
|
|
if (buttons_view_) {
|
2020-12-16 05:30:39 +00:00
|
|
|
[buttons_view_ setMargin:position];
|
|
|
|
[buttons_view_ viewDidMoveToWindow];
|
|
|
|
}
|
2020-03-05 22:22:12 +00:00
|
|
|
}
|
|
|
|
|
2020-12-16 05:30:39 +00:00
|
|
|
base::Optional<gfx::Point> NativeWindowMac::GetTrafficLightPosition() const {
|
2020-03-05 22:22:12 +00:00
|
|
|
return traffic_light_position_;
|
|
|
|
}
|
|
|
|
|
2020-12-18 00:50:51 +00:00
|
|
|
void NativeWindowMac::RedrawTrafficLights() {
|
2021-01-30 23:15:10 +00:00
|
|
|
if (buttons_view_)
|
|
|
|
[buttons_view_ setNeedsDisplayForButtons];
|
2020-12-18 00:50:51 +00:00
|
|
|
}
|
|
|
|
|
2021-03-16 09:41:59 +00:00
|
|
|
// In simpleFullScreen mode, update the frame for new bounds.
|
|
|
|
void NativeWindowMac::UpdateFrame() {
|
|
|
|
NSWindow* window = GetNativeWindow().GetNativeNSWindow();
|
|
|
|
NSRect fullscreenFrame = [window.screen frame];
|
|
|
|
[window setFrame:fullscreenFrame display:YES animate:YES];
|
|
|
|
}
|
|
|
|
|
2017-03-01 00:14:02 +00:00
|
|
|
void NativeWindowMac::SetTouchBar(
|
2019-10-31 07:56:00 +00:00
|
|
|
std::vector<gin_helper::PersistentDictionary> items) {
|
2018-04-20 10:23:21 +00:00
|
|
|
if (@available(macOS 10.12.2, *)) {
|
2020-02-04 20:19:40 +00:00
|
|
|
touch_bar_.reset([[ElectronTouchBar alloc]
|
2018-04-20 10:23:21 +00:00
|
|
|
initWithDelegate:window_delegate_.get()
|
|
|
|
window:this
|
2019-10-31 07:56:00 +00:00
|
|
|
settings:std::move(items)]);
|
2018-04-20 10:23:21 +00:00
|
|
|
[window_ setTouchBar:nil];
|
|
|
|
}
|
2016-11-27 11:54:12 +00:00
|
|
|
}
|
|
|
|
|
2017-03-01 00:08:12 +00:00
|
|
|
void NativeWindowMac::RefreshTouchBarItem(const std::string& item_id) {
|
2018-04-20 10:23:21 +00:00
|
|
|
if (@available(macOS 10.12.2, *)) {
|
|
|
|
if (touch_bar_ && [window_ touchBar])
|
|
|
|
[touch_bar_ refreshTouchBarItem:[window_ touchBar] id:item_id];
|
|
|
|
}
|
2016-12-16 06:24:51 +00:00
|
|
|
}
|
|
|
|
|
2018-04-19 07:12:11 +00:00
|
|
|
void NativeWindowMac::SetEscapeTouchBarItem(
|
2019-10-31 07:56:00 +00:00
|
|
|
gin_helper::PersistentDictionary item) {
|
2018-04-20 10:23:21 +00:00
|
|
|
if (@available(macOS 10.12.2, *)) {
|
|
|
|
if (touch_bar_ && [window_ touchBar])
|
2019-10-31 07:56:00 +00:00
|
|
|
[touch_bar_ setEscapeTouchBarItem:std::move(item)
|
|
|
|
forTouchBar:[window_ touchBar]];
|
2018-04-20 10:23:21 +00:00
|
|
|
}
|
2017-03-27 00:22:52 +00:00
|
|
|
}
|
|
|
|
|
2020-12-18 00:50:51 +00:00
|
|
|
void NativeWindowMac::SelectPreviousTab() {
|
|
|
|
if (@available(macOS 10.12, *)) {
|
|
|
|
[window_ selectPreviousTab:nil];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::SelectNextTab() {
|
|
|
|
if (@available(macOS 10.12, *)) {
|
|
|
|
[window_ selectNextTab:nil];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::MergeAllWindows() {
|
|
|
|
if (@available(macOS 10.12, *)) {
|
|
|
|
[window_ mergeAllWindows:nil];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::MoveTabToNewWindow() {
|
|
|
|
if (@available(macOS 10.12, *)) {
|
|
|
|
[window_ moveTabToNewWindow:nil];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::ToggleTabBar() {
|
|
|
|
if (@available(macOS 10.12, *)) {
|
|
|
|
[window_ toggleTabBar:nil];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool NativeWindowMac::AddTabbedWindow(NativeWindow* window) {
|
|
|
|
if (window_ == window->GetNativeWindow().GetNativeNSWindow()) {
|
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
if (@available(macOS 10.12, *))
|
|
|
|
[window_ addTabbedWindow:window->GetNativeWindow().GetNativeNSWindow()
|
|
|
|
ordered:NSWindowAbove];
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::SetAspectRatio(double aspect_ratio,
|
|
|
|
const gfx::Size& extra_size) {
|
|
|
|
NativeWindow::SetAspectRatio(aspect_ratio, extra_size);
|
|
|
|
|
|
|
|
// Reset the behaviour to default if aspect_ratio is set to 0 or less.
|
|
|
|
if (aspect_ratio > 0.0)
|
|
|
|
[window_ setAspectRatio:NSMakeSize(aspect_ratio, 1.0)];
|
|
|
|
else
|
|
|
|
[window_ setResizeIncrements:NSMakeSize(1.0, 1.0)];
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::PreviewFile(const std::string& path,
|
|
|
|
const std::string& display_name) {
|
|
|
|
preview_item_.reset([[ElectronPreviewItem alloc]
|
|
|
|
initWithURL:[NSURL fileURLWithPath:base::SysUTF8ToNSString(path)]
|
|
|
|
title:base::SysUTF8ToNSString(display_name)]);
|
|
|
|
[[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::CloseFilePreview() {
|
|
|
|
if ([QLPreviewPanel sharedPreviewPanelExists]) {
|
|
|
|
[[QLPreviewPanel sharedPreviewPanel] close];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-02-22 06:09:38 +00:00
|
|
|
gfx::Rect NativeWindowMac::ContentBoundsToWindowBounds(
|
|
|
|
const gfx::Rect& bounds) const {
|
|
|
|
if (has_frame()) {
|
|
|
|
gfx::Rect window_bounds(
|
|
|
|
[window_ frameRectForContentRect:bounds.ToCGRect()]);
|
|
|
|
int frame_height = window_bounds.height() - bounds.height();
|
|
|
|
window_bounds.set_y(window_bounds.y() - frame_height);
|
|
|
|
return window_bounds;
|
|
|
|
} else {
|
|
|
|
return bounds;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gfx::Rect NativeWindowMac::WindowBoundsToContentBounds(
|
|
|
|
const gfx::Rect& bounds) const {
|
|
|
|
if (has_frame()) {
|
|
|
|
gfx::Rect content_bounds(
|
|
|
|
[window_ contentRectForFrameRect:bounds.ToCGRect()]);
|
|
|
|
int frame_height = bounds.height() - content_bounds.height();
|
|
|
|
content_bounds.set_y(content_bounds.y() + frame_height);
|
|
|
|
return content_bounds;
|
|
|
|
} else {
|
|
|
|
return bounds;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-30 23:15:10 +00:00
|
|
|
void NativeWindowMac::NotifyWindowEnterFullScreen() {
|
|
|
|
NativeWindow::NotifyWindowEnterFullScreen();
|
|
|
|
// Restore the window title under fullscreen mode.
|
|
|
|
if (buttons_view_)
|
|
|
|
[window_ setTitleVisibility:NSWindowTitleVisible];
|
|
|
|
RedrawTrafficLights();
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::NotifyWindowLeaveFullScreen() {
|
|
|
|
NativeWindow::NotifyWindowLeaveFullScreen();
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::NotifyWindowWillEnterFullScreen() {
|
|
|
|
// Remove the buttonsView otherwise window buttons won't show under
|
|
|
|
// fullscreen mode.
|
|
|
|
if (buttons_view_) {
|
|
|
|
[buttons_view_ removeFromSuperview];
|
|
|
|
InternalSetStandardButtonsVisibility(true);
|
|
|
|
}
|
2021-05-11 07:45:21 +00:00
|
|
|
|
|
|
|
UpdateVibrancyRadii(true);
|
2021-01-30 23:15:10 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::NotifyWindowWillLeaveFullScreen() {
|
2021-02-05 01:03:12 +00:00
|
|
|
// Hide window title and restore buttonsView when leaving fullscreen.
|
|
|
|
if (buttons_view_) {
|
2021-01-30 23:15:10 +00:00
|
|
|
[window_ setTitleVisibility:NSWindowTitleHidden];
|
2021-02-05 01:03:12 +00:00
|
|
|
InternalSetStandardButtonsVisibility(false);
|
|
|
|
[[window_ contentView] addSubview:buttons_view_];
|
|
|
|
}
|
2021-04-21 14:56:25 +00:00
|
|
|
|
2021-01-30 23:15:10 +00:00
|
|
|
RedrawTrafficLights();
|
2021-05-11 07:45:21 +00:00
|
|
|
UpdateVibrancyRadii(false);
|
2021-01-30 23:15:10 +00:00
|
|
|
}
|
|
|
|
|
2020-12-18 00:50:51 +00:00
|
|
|
void NativeWindowMac::Cleanup() {
|
|
|
|
DCHECK(!IsClosed());
|
|
|
|
ui::NativeTheme::GetInstanceForNativeUi()->RemoveObserver(this);
|
2021-03-16 09:41:59 +00:00
|
|
|
display::Screen::GetScreen()->RemoveObserver(this);
|
2020-12-18 00:50:51 +00:00
|
|
|
[NSEvent removeMonitor:wheel_event_monitor_];
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::OverrideNSWindowContentView() {
|
|
|
|
// When using `views::Widget` to hold WebContents, Chromium would use
|
|
|
|
// `BridgedContentView` as content view, which does not support draggable
|
|
|
|
// regions. In order to make draggable regions work, we have to replace the
|
|
|
|
// content view with a simple NSView.
|
|
|
|
if (has_frame()) {
|
|
|
|
container_view_.reset(
|
|
|
|
[[ElectronAdaptedContentView alloc] initWithShell:this]);
|
|
|
|
} else {
|
|
|
|
container_view_.reset([[FullSizeContentView alloc] init]);
|
|
|
|
[container_view_ setFrame:[[[window_ contentView] superview] bounds]];
|
|
|
|
}
|
|
|
|
[container_view_
|
|
|
|
setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
|
|
|
|
[window_ setContentView:container_view_];
|
2021-01-30 23:15:10 +00:00
|
|
|
AddContentViewLayers();
|
2020-12-18 00:50:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::SetStyleMask(bool on, NSUInteger flag) {
|
|
|
|
// Changing the styleMask of a frameless windows causes it to change size so
|
|
|
|
// we explicitly disable resizing while setting it.
|
|
|
|
ScopedDisableResize disable_resize;
|
|
|
|
|
|
|
|
bool was_maximizable = IsMaximizable();
|
|
|
|
if (on)
|
|
|
|
[window_ setStyleMask:[window_ styleMask] | flag];
|
|
|
|
else
|
|
|
|
[window_ setStyleMask:[window_ styleMask] & (~flag)];
|
|
|
|
// Change style mask will make the zoom button revert to default, probably
|
|
|
|
// a bug of Cocoa or macOS.
|
|
|
|
SetMaximizable(was_maximizable);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::SetCollectionBehavior(bool on, NSUInteger flag) {
|
|
|
|
bool was_maximizable = IsMaximizable();
|
|
|
|
if (on)
|
|
|
|
[window_ setCollectionBehavior:[window_ collectionBehavior] | flag];
|
|
|
|
else
|
|
|
|
[window_ setCollectionBehavior:[window_ collectionBehavior] & (~flag)];
|
|
|
|
// Change collectionBehavior will make the zoom button revert to default,
|
|
|
|
// probably a bug of Cocoa or macOS.
|
|
|
|
SetMaximizable(was_maximizable);
|
|
|
|
}
|
|
|
|
|
2018-04-24 10:00:44 +00:00
|
|
|
bool NativeWindowMac::CanResize() const {
|
|
|
|
return resizable_;
|
|
|
|
}
|
|
|
|
|
2018-05-02 06:39:43 +00:00
|
|
|
views::View* NativeWindowMac::GetContentsView() {
|
|
|
|
return root_view_.get();
|
|
|
|
}
|
|
|
|
|
2020-12-18 00:50:51 +00:00
|
|
|
void NativeWindowMac::OnNativeThemeUpdated(ui::NativeTheme* observed_theme) {
|
|
|
|
base::PostTask(
|
|
|
|
FROM_HERE, {content::BrowserThread::UI},
|
|
|
|
base::BindOnce(&NativeWindow::RedrawTrafficLights, GetWeakPtr()));
|
|
|
|
}
|
|
|
|
|
2021-01-30 23:15:10 +00:00
|
|
|
void NativeWindowMac::AddContentViewLayers() {
|
2018-07-10 01:43:42 +00:00
|
|
|
// Make sure the bottom corner is rounded for non-modal windows:
|
2018-11-06 04:42:19 +00:00
|
|
|
// http://crbug.com/396264.
|
|
|
|
if (!is_modal()) {
|
2018-09-20 17:24:55 +00:00
|
|
|
// For normal window, we need to explicitly set layer for contentView to
|
|
|
|
// make setBackgroundColor work correctly.
|
|
|
|
// There is no need to do so for frameless window, and doing so would make
|
|
|
|
// titleBarStyle stop working.
|
|
|
|
if (has_frame()) {
|
|
|
|
base::scoped_nsobject<CALayer> background_layer([[CALayer alloc] init]);
|
|
|
|
[background_layer
|
|
|
|
setAutoresizingMask:kCALayerWidthSizable | kCALayerHeightSizable];
|
|
|
|
[[window_ contentView] setLayer:background_layer];
|
|
|
|
}
|
2018-07-10 01:43:42 +00:00
|
|
|
[[window_ contentView] setWantsLayer:YES];
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!has_frame()) {
|
|
|
|
// In OSX 10.10, adding subviews to the root view for the NSView hierarchy
|
|
|
|
// produces warnings. To eliminate the warnings, we resize the contentView
|
|
|
|
// to fill the window, and add subviews to that.
|
|
|
|
// http://crbug.com/380412
|
|
|
|
if (!original_set_frame_size) {
|
|
|
|
Class cl = [[window_ contentView] class];
|
|
|
|
original_set_frame_size = class_replaceMethod(
|
|
|
|
cl, @selector(setFrameSize:), (IMP)SetFrameSize, "v@:{_NSSize=ff}");
|
|
|
|
original_view_did_move_to_superview =
|
|
|
|
class_replaceMethod(cl, @selector(viewDidMoveToSuperview),
|
|
|
|
(IMP)ViewDidMoveToSuperview, "v@:");
|
|
|
|
[[window_ contentView] viewDidMoveToWindow];
|
|
|
|
}
|
|
|
|
|
2021-01-30 23:15:10 +00:00
|
|
|
// Create a custom window buttons view.
|
|
|
|
if (title_bar_style_ != TitleBarStyle::kNormal) {
|
|
|
|
buttons_view_.reset(
|
|
|
|
[[WindowButtonsView alloc] initWithMargin:traffic_light_position_]);
|
|
|
|
if (title_bar_style_ == TitleBarStyle::kCustomButtonsOnHover)
|
|
|
|
[buttons_view_ setShowOnHover:YES];
|
|
|
|
if (title_bar_style_ == TitleBarStyle::kHiddenInset &&
|
|
|
|
!traffic_light_position_)
|
|
|
|
[buttons_view_ setMargin:gfx::Point(12, 11)];
|
|
|
|
|
|
|
|
if (!IsClosable())
|
|
|
|
[[buttons_view_ viewWithTag:0] setEnabled:NO];
|
|
|
|
if (!IsMinimizable())
|
|
|
|
[[buttons_view_ viewWithTag:1] setEnabled:NO];
|
|
|
|
if (!IsFullScreenable())
|
|
|
|
[[buttons_view_ viewWithTag:2] setEnabled:NO];
|
2019-05-28 17:23:16 +00:00
|
|
|
|
2018-07-10 01:43:42 +00:00
|
|
|
[[window_ contentView] addSubview:buttons_view_];
|
2020-12-11 19:03:08 +00:00
|
|
|
}
|
2018-07-10 01:43:42 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-19 10:12:09 +00:00
|
|
|
void NativeWindowMac::InternalSetWindowButtonVisibility(bool visible) {
|
2021-01-30 23:15:10 +00:00
|
|
|
if (buttons_view_)
|
2021-01-19 10:12:09 +00:00
|
|
|
[buttons_view_ setHidden:!visible];
|
2021-01-30 23:15:10 +00:00
|
|
|
else
|
|
|
|
InternalSetStandardButtonsVisibility(visible);
|
|
|
|
}
|
|
|
|
|
|
|
|
void NativeWindowMac::InternalSetStandardButtonsVisibility(bool visible) {
|
|
|
|
[[window_ standardWindowButton:NSWindowCloseButton] setHidden:!visible];
|
|
|
|
[[window_ standardWindowButton:NSWindowMiniaturizeButton] setHidden:!visible];
|
|
|
|
[[window_ standardWindowButton:NSWindowZoomButton] setHidden:!visible];
|
2021-01-19 10:12:09 +00:00
|
|
|
}
|
|
|
|
|
2018-04-20 18:47:04 +00:00
|
|
|
void NativeWindowMac::InternalSetParentWindow(NativeWindow* parent,
|
|
|
|
bool attach) {
|
2017-09-14 05:43:22 +00:00
|
|
|
if (is_modal())
|
|
|
|
return;
|
|
|
|
|
|
|
|
NativeWindow::SetParentWindow(parent);
|
|
|
|
|
|
|
|
// Do not remove/add if we are already properly attached.
|
2019-01-09 20:25:19 +00:00
|
|
|
if (attach && parent &&
|
|
|
|
[window_ parentWindow] == parent->GetNativeWindow().GetNativeNSWindow())
|
2017-09-14 05:43:22 +00:00
|
|
|
return;
|
|
|
|
|
|
|
|
// Remove current parent window.
|
|
|
|
if ([window_ parentWindow])
|
|
|
|
[[window_ parentWindow] removeChildWindow:window_];
|
|
|
|
|
|
|
|
// Set new parent window.
|
|
|
|
// Note that this method will force the window to become visible.
|
|
|
|
if (parent && attach)
|
2019-01-09 20:25:19 +00:00
|
|
|
[parent->GetNativeWindow().GetNativeNSWindow()
|
|
|
|
addChildWindow:window_
|
|
|
|
ordered:NSWindowAbove];
|
2017-09-14 05:43:22 +00:00
|
|
|
}
|
|
|
|
|
2018-04-09 10:35:05 +00:00
|
|
|
void NativeWindowMac::SetForwardMouseMessages(bool forward) {
|
|
|
|
[window_ setAcceptsMouseMovedEvents:forward];
|
|
|
|
}
|
|
|
|
|
2013-04-12 07:04:46 +00:00
|
|
|
// static
|
2019-10-25 13:03:28 +00:00
|
|
|
NativeWindow* NativeWindow::Create(const gin_helper::Dictionary& options,
|
2018-04-08 11:20:43 +00:00
|
|
|
NativeWindow* parent) {
|
|
|
|
return new NativeWindowMac(options, parent);
|
2013-04-12 07:04:46 +00:00
|
|
|
}
|
|
|
|
|
2019-06-19 21:23:04 +00:00
|
|
|
} // namespace electron
|