From 713d8c4167a07971775db847adca880f49e8d381 Mon Sep 17 00:00:00 2001 From: Shelley Vohr Date: Tue, 3 Oct 2023 21:27:40 +0200 Subject: [PATCH] feat: add `tabbingIdentifier` property to `BrowserWindow` (#39980) feat: add tabbingIdentifier property to BrowserWindow --- docs/api/browser-window.md | 4 ++++ shell/browser/api/electron_api_base_window.cc | 9 +++++++++ shell/browser/api/electron_api_base_window.h | 3 +-- shell/browser/native_window.cc | 4 ++++ shell/browser/native_window.h | 1 + shell/browser/native_window_mac.h | 1 + shell/browser/native_window_mac.mm | 7 +++++++ spec/api-browser-window-spec.ts | 17 +++++++++++++---- 8 files changed, 40 insertions(+), 6 deletions(-) diff --git a/docs/api/browser-window.md b/docs/api/browser-window.md index f3d621c995..283e958149 100644 --- a/docs/api/browser-window.md +++ b/docs/api/browser-window.md @@ -475,6 +475,10 @@ events. A `Integer` property representing the unique ID of the window. Each ID is unique among all `BrowserWindow` instances of the entire Electron application. +#### `win.tabbingIdentifier` _macOS_ _Readonly_ + +A `string` (optional) property that is equal to the `tabbingIdentifier` passed to the `BrowserWindow` constructor or `undefined` if none was set. + #### `win.autoHideMenuBar` A `boolean` property that determines whether the window menu bar should hide itself automatically. Once set, the menu bar will only show when users press the single `Alt` key. diff --git a/shell/browser/api/electron_api_base_window.cc b/shell/browser/api/electron_api_base_window.cc index 8bccf457a0..373a536a46 100644 --- a/shell/browser/api/electron_api_base_window.cc +++ b/shell/browser/api/electron_api_base_window.cc @@ -953,6 +953,14 @@ void BaseWindow::AddTabbedWindow(NativeWindow* window, args->ThrowError("AddTabbedWindow cannot be called by a window on itself."); } +v8::Local BaseWindow::GetTabbingIdentifier() { + auto tabbing_id = window_->GetTabbingIdentifier(); + if (!tabbing_id.has_value()) + return v8::Undefined(isolate()); + + return gin::ConvertToV8(isolate(), tabbing_id.value()); +} + void BaseWindow::SetAutoHideMenuBar(bool auto_hide) { window_->SetAutoHideMenuBar(auto_hide); } @@ -1305,6 +1313,7 @@ void BaseWindow::BuildPrototype(v8::Isolate* isolate, .SetMethod("moveTabToNewWindow", &BaseWindow::MoveTabToNewWindow) .SetMethod("toggleTabBar", &BaseWindow::ToggleTabBar) .SetMethod("addTabbedWindow", &BaseWindow::AddTabbedWindow) + .SetProperty("tabbingIdentifier", &BaseWindow::GetTabbingIdentifier) .SetMethod("setWindowButtonVisibility", &BaseWindow::SetWindowButtonVisibility) .SetMethod("_getWindowButtonVisibility", diff --git a/shell/browser/api/electron_api_base_window.h b/shell/browser/api/electron_api_base_window.h index 3f2a02eb40..c3fd773bb0 100644 --- a/shell/browser/api/electron_api_base_window.h +++ b/shell/browser/api/electron_api_base_window.h @@ -198,9 +198,7 @@ class BaseWindow : public gin_helper::TrackableObject, bool GetWindowButtonVisibility() const; void SetWindowButtonPosition(absl::optional position); absl::optional GetWindowButtonPosition() const; -#endif -#if BUILDFLAG(IS_MAC) bool IsHiddenInMissionControl(); void SetHiddenInMissionControl(bool hidden); #endif @@ -215,6 +213,7 @@ class BaseWindow : public gin_helper::TrackableObject, void MoveTabToNewWindow(); void ToggleTabBar(); void AddTabbedWindow(NativeWindow* window, gin_helper::Arguments* args); + v8::Local GetTabbingIdentifier(); void SetAutoHideMenuBar(bool auto_hide); bool IsMenuBarAutoHide(); void SetMenuBarVisibility(bool visible); diff --git a/shell/browser/native_window.cc b/shell/browser/native_window.cc index 469d9cd01a..d76b235027 100644 --- a/shell/browser/native_window.cc +++ b/shell/browser/native_window.cc @@ -481,6 +481,10 @@ bool NativeWindow::AddTabbedWindow(NativeWindow* window) { return true; // for non-Mac platforms } +absl::optional NativeWindow::GetTabbingIdentifier() const { + return ""; // for non-Mac platforms +} + void NativeWindow::SetVibrancy(const std::string& type) { vibrancy_ = type; } diff --git a/shell/browser/native_window.h b/shell/browser/native_window.h index d2ec3c9fe9..79bc09f9c8 100644 --- a/shell/browser/native_window.h +++ b/shell/browser/native_window.h @@ -256,6 +256,7 @@ class NativeWindow : public base::SupportsUserData, virtual void MoveTabToNewWindow(); virtual void ToggleTabBar(); virtual bool AddTabbedWindow(NativeWindow* window); + virtual absl::optional GetTabbingIdentifier() const; // Toggle the menu bar. virtual void SetAutoHideMenuBar(bool auto_hide); diff --git a/shell/browser/native_window_mac.h b/shell/browser/native_window_mac.h index a1c70ba2a0..238d4347f4 100644 --- a/shell/browser/native_window_mac.h +++ b/shell/browser/native_window_mac.h @@ -145,6 +145,7 @@ class NativeWindowMac : public NativeWindow, void MoveTabToNewWindow() override; void ToggleTabBar() override; bool AddTabbedWindow(NativeWindow* window) override; + absl::optional GetTabbingIdentifier() const override; void SetAspectRatio(double aspect_ratio, const gfx::Size& extra_size) override; void PreviewFile(const std::string& path, diff --git a/shell/browser/native_window_mac.mm b/shell/browser/native_window_mac.mm index b8f660b6a0..5f39747fb1 100644 --- a/shell/browser/native_window_mac.mm +++ b/shell/browser/native_window_mac.mm @@ -1643,6 +1643,13 @@ bool NativeWindowMac::AddTabbedWindow(NativeWindow* window) { return true; } +absl::optional NativeWindowMac::GetTabbingIdentifier() const { + if ([window_ tabbingMode] == NSWindowTabbingModeDisallowed) + return absl::nullopt; + + return base::SysNSStringToUTF8([window_ tabbingIdentifier]); +} + void NativeWindowMac::SetAspectRatio(double aspect_ratio, const gfx::Size& extra_size) { NativeWindow::SetAspectRatio(aspect_ratio, extra_size); diff --git a/spec/api-browser-window-spec.ts b/spec/api-browser-window-spec.ts index d194e7c385..37e0a19be7 100644 --- a/spec/api-browser-window-spec.ts +++ b/spec/api-browser-window-spec.ts @@ -2060,10 +2060,7 @@ describe('BrowserWindow module', () => { beforeEach(() => { w = new BrowserWindow({ show: false }); }); - afterEach(async () => { - await closeWindow(w); - w = null as unknown as BrowserWindow; - }); + afterEach(closeAllWindows); describe('BrowserWindow.selectPreviousTab()', () => { it('does not throw', () => { @@ -2132,6 +2129,18 @@ describe('BrowserWindow module', () => { }).to.throw('AddTabbedWindow cannot be called by a window on itself.'); }); }); + + describe('BrowserWindow.tabbingIdentifier', () => { + it('is undefined if no tabbingIdentifier was set', () => { + const w = new BrowserWindow({ show: false }); + expect(w.tabbingIdentifier).to.be.undefined('tabbingIdentifier'); + }); + + it('returns the window tabbingIdentifier', () => { + const w = new BrowserWindow({ show: false, tabbingIdentifier: 'group1' }); + expect(w.tabbingIdentifier).to.equal('group1'); + }); + }); }); describe('autoHideMenuBar state', () => {