From 3686248354a28c8913f03ccaa755be97bba58d6f Mon Sep 17 00:00:00 2001 From: Shane Osbourne Date: Fri, 28 Mar 2025 18:18:45 +0000 Subject: [PATCH 1/7] ntp: send background-tab on windows middle-click --- .../app/favorites/integration-tests/favorites.page.js | 10 ++++++++++ .../app/favorites/integration-tests/favorites.spec.js | 7 +++++++ special-pages/pages/new-tab/app/utils.js | 7 ++++++- .../pages/new-tab/messages/types/open-target.json | 2 +- special-pages/pages/new-tab/types/new-tab.ts | 2 +- 5 files changed, 25 insertions(+), 3 deletions(-) diff --git a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js index 12585ac2ad..578a52de7b 100644 --- a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js +++ b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js @@ -32,6 +32,16 @@ export class FavoritesPage { expect(calls[1].payload.params).toStrictEqual({ id: 'id-many-1', url: 'https://example.com/?id=id-many-1', target: 'new-window' }); } + async opensInBackgroundTab() { + await this.nthFavorite(0).click({ button: 'middle' }); + const calls = await this.ntp.mocks.waitForCallCount({ method: 'favorites_open', count: 1 }); + expect(calls[0].payload.params).toStrictEqual({ + id: 'id-many-1', + url: 'https://example.com/?id=id-many-1', + target: 'background-tab', + }); + } + async opensInSameTab() { await this.nthFavorite(0).click(); const calls = await this.ntp.mocks.waitForCallCount({ method: 'favorites_open', count: 1 }); diff --git a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js index c0e49c789a..345b8c4505 100644 --- a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js +++ b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js @@ -51,6 +51,13 @@ test.describe('newtab favorites', () => { await ntp.openPage({ platformName: 'macos' }); await favorites.opensInNewWindow(); }); + test('Opens a favorite in background tab', async ({ page }, workerInfo) => { + const ntp = NewtabPage.create(page, workerInfo); + const favorites = new FavoritesPage(ntp); + await ntp.reducedMotion(); + await ntp.openPage({ platformName: 'windows' }); + await favorites.opensInBackgroundTab(); + }); test('Adds an item', async ({ page }, workerInfo) => { const ntp = NewtabPage.create(page, workerInfo); const favorites = new FavoritesPage(ntp); diff --git a/special-pages/pages/new-tab/app/utils.js b/special-pages/pages/new-tab/app/utils.js index 5bcd1bd1c2..63e7ba23b5 100644 --- a/special-pages/pages/new-tab/app/utils.js +++ b/special-pages/pages/new-tab/app/utils.js @@ -70,7 +70,12 @@ export function eventToTarget(event, platformName) { const isControlClick = platformName === 'macos' ? event.metaKey : event.ctrlKey; if (isControlClick) { return 'new-tab'; - } else if (event.shiftKey || event.button === 1 /* middle click */) { + } else if (event.shiftKey) { + return 'new-window'; + } else if (event.button === 1 /* middle click */) { + if (platformName === 'windows') { + return 'background-tab'; + } return 'new-window'; } return 'same-tab'; diff --git a/special-pages/pages/new-tab/messages/types/open-target.json b/special-pages/pages/new-tab/messages/types/open-target.json index 9b9db911ac..1b915914ee 100644 --- a/special-pages/pages/new-tab/messages/types/open-target.json +++ b/special-pages/pages/new-tab/messages/types/open-target.json @@ -2,5 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Open Target", "type": "string", - "enum": ["same-tab", "new-tab", "new-window"] + "enum": ["same-tab", "new-tab", "new-window", "background-tab"] } diff --git a/special-pages/pages/new-tab/types/new-tab.ts b/special-pages/pages/new-tab/types/new-tab.ts index ca8c9483b8..2452bf81f9 100644 --- a/special-pages/pages/new-tab/types/new-tab.ts +++ b/special-pages/pages/new-tab/types/new-tab.ts @@ -6,7 +6,7 @@ * @module NewTab Messages */ -export type OpenTarget = "same-tab" | "new-tab" | "new-window"; +export type OpenTarget = "same-tab" | "new-tab" | "new-window" | "background-tab"; /** * Represents the expansion state of a widget */ From 8dd03fa6884bb51f17568c1f5a514fbd4bb59f7c Mon Sep 17 00:00:00 2001 From: Ivy Grey Date: Fri, 28 Mar 2025 13:10:28 -0700 Subject: [PATCH 2/7] Consistency, macOS compatability --- .../favorites/integration-tests/favorites.page.js | 12 ++---------- special-pages/pages/new-tab/app/utils.js | 5 +---- .../pages/new-tab/messages/types/open-target.json | 2 +- special-pages/pages/new-tab/types/new-tab.ts | 2 +- special-pages/shared/handlers.js | 4 ++-- 5 files changed, 7 insertions(+), 18 deletions(-) diff --git a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js index 578a52de7b..e9e78900eb 100644 --- a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js +++ b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js @@ -20,8 +20,10 @@ export class FavoritesPage { async opensInNewTab() { await this.nthFavorite(0).click({ modifiers: ['Meta'] }); + await this.nthFavorite(0).click({ button: 'middle' }); const calls = await this.ntp.mocks.waitForCallCount({ method: 'favorites_open', count: 1 }); expect(calls[0].payload.params).toStrictEqual({ id: 'id-many-1', url: 'https://example.com/?id=id-many-1', target: 'new-tab' }); + expect(calls[1].payload.params).toStrictEqual({ id: 'id-many-1', url: 'https://example.com/?id=id-many-1', target: 'new-tab' }); } async opensInNewWindow() { @@ -32,16 +34,6 @@ export class FavoritesPage { expect(calls[1].payload.params).toStrictEqual({ id: 'id-many-1', url: 'https://example.com/?id=id-many-1', target: 'new-window' }); } - async opensInBackgroundTab() { - await this.nthFavorite(0).click({ button: 'middle' }); - const calls = await this.ntp.mocks.waitForCallCount({ method: 'favorites_open', count: 1 }); - expect(calls[0].payload.params).toStrictEqual({ - id: 'id-many-1', - url: 'https://example.com/?id=id-many-1', - target: 'background-tab', - }); - } - async opensInSameTab() { await this.nthFavorite(0).click(); const calls = await this.ntp.mocks.waitForCallCount({ method: 'favorites_open', count: 1 }); diff --git a/special-pages/pages/new-tab/app/utils.js b/special-pages/pages/new-tab/app/utils.js index 63e7ba23b5..21d3a0ab2d 100644 --- a/special-pages/pages/new-tab/app/utils.js +++ b/special-pages/pages/new-tab/app/utils.js @@ -73,10 +73,7 @@ export function eventToTarget(event, platformName) { } else if (event.shiftKey) { return 'new-window'; } else if (event.button === 1 /* middle click */) { - if (platformName === 'windows') { - return 'background-tab'; - } - return 'new-window'; + return 'new-tab'; } return 'same-tab'; } diff --git a/special-pages/pages/new-tab/messages/types/open-target.json b/special-pages/pages/new-tab/messages/types/open-target.json index 1b915914ee..9b9db911ac 100644 --- a/special-pages/pages/new-tab/messages/types/open-target.json +++ b/special-pages/pages/new-tab/messages/types/open-target.json @@ -2,5 +2,5 @@ "$schema": "http://json-schema.org/draft-07/schema#", "title": "Open Target", "type": "string", - "enum": ["same-tab", "new-tab", "new-window", "background-tab"] + "enum": ["same-tab", "new-tab", "new-window"] } diff --git a/special-pages/pages/new-tab/types/new-tab.ts b/special-pages/pages/new-tab/types/new-tab.ts index 2452bf81f9..ca8c9483b8 100644 --- a/special-pages/pages/new-tab/types/new-tab.ts +++ b/special-pages/pages/new-tab/types/new-tab.ts @@ -6,7 +6,7 @@ * @module NewTab Messages */ -export type OpenTarget = "same-tab" | "new-tab" | "new-window" | "background-tab"; +export type OpenTarget = "same-tab" | "new-tab" | "new-window"; /** * Represents the expansion state of a widget */ diff --git a/special-pages/shared/handlers.js b/special-pages/shared/handlers.js index b5b19523a5..0061bd8220 100644 --- a/special-pages/shared/handlers.js +++ b/special-pages/shared/handlers.js @@ -5,9 +5,9 @@ */ export function eventToTarget(event, platformName) { const isControlClick = platformName === 'macos' ? event.metaKey : event.ctrlKey; - if (isControlClick) { + if (isControlClick || ('button' in event && event.button === 1) /* middle click */) { return 'new-tab'; - } else if (event.shiftKey || ('button' in event && event.button === 1) /* middle click */) { + } else if (event.shiftKey) { return 'new-window'; } return 'same-tab'; From ce0ef5fd276c21a83ac2bd49f7df7f469225d8c7 Mon Sep 17 00:00:00 2001 From: Ivy Grey Date: Fri, 28 Mar 2025 13:11:56 -0700 Subject: [PATCH 3/7] Remove unused test --- .../app/favorites/integration-tests/favorites.spec.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js index 345b8c4505..c0e49c789a 100644 --- a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js +++ b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.spec.js @@ -51,13 +51,6 @@ test.describe('newtab favorites', () => { await ntp.openPage({ platformName: 'macos' }); await favorites.opensInNewWindow(); }); - test('Opens a favorite in background tab', async ({ page }, workerInfo) => { - const ntp = NewtabPage.create(page, workerInfo); - const favorites = new FavoritesPage(ntp); - await ntp.reducedMotion(); - await ntp.openPage({ platformName: 'windows' }); - await favorites.opensInBackgroundTab(); - }); test('Adds an item', async ({ page }, workerInfo) => { const ntp = NewtabPage.create(page, workerInfo); const favorites = new FavoritesPage(ntp); From 0a95d441f73ff7e4cc29e61a67db9a5bd67b3ef6 Mon Sep 17 00:00:00 2001 From: Ivy Grey Date: Fri, 28 Mar 2025 13:22:27 -0700 Subject: [PATCH 4/7] Fix test --- .../new-tab/app/favorites/integration-tests/favorites.page.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js index e9e78900eb..9488f445a7 100644 --- a/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js +++ b/special-pages/pages/new-tab/app/favorites/integration-tests/favorites.page.js @@ -28,10 +28,8 @@ export class FavoritesPage { async opensInNewWindow() { await this.nthFavorite(0).click({ modifiers: ['Shift'] }); - await this.nthFavorite(0).click({ button: 'middle' }); - const calls = await this.ntp.mocks.waitForCallCount({ method: 'favorites_open', count: 2 }); + const calls = await this.ntp.mocks.waitForCallCount({ method: 'favorites_open', count: 1 }); expect(calls[0].payload.params).toStrictEqual({ id: 'id-many-1', url: 'https://example.com/?id=id-many-1', target: 'new-window' }); - expect(calls[1].payload.params).toStrictEqual({ id: 'id-many-1', url: 'https://example.com/?id=id-many-1', target: 'new-window' }); } async opensInSameTab() { From 66c69c0af69a509b4c38460aaa99f203c1e4fd88 Mon Sep 17 00:00:00 2001 From: Ivy Grey Date: Fri, 28 Mar 2025 14:03:58 -0700 Subject: [PATCH 5/7] Fix test --- .../new-tab/app/activity/integration-tests/activity.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js b/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js index 290c585bf3..b37e0bf1a5 100644 --- a/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js +++ b/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js @@ -208,7 +208,7 @@ export class ActivityPage { expect(calls[2].payload.params).toStrictEqual({ url, - target: 'new-window', + target: 'new-tab', }); expect(calls[3].payload.params).toStrictEqual({ From ef49f41c0c30f88f0eab90a26dd8db65b03fa443 Mon Sep 17 00:00:00 2001 From: Ivy Grey Date: Fri, 28 Mar 2025 14:13:39 -0700 Subject: [PATCH 6/7] (Sorry, I can't run integration tests locally) --- .../new-tab/app/activity/integration-tests/activity.page.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js b/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js index b37e0bf1a5..bc7dc3c95a 100644 --- a/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js +++ b/special-pages/pages/new-tab/app/activity/integration-tests/activity.page.js @@ -208,12 +208,12 @@ export class ActivityPage { expect(calls[2].payload.params).toStrictEqual({ url, - target: 'new-tab', + target: 'new-window', }); expect(calls[3].payload.params).toStrictEqual({ url, - target: 'new-window', + target: 'new-tab', }); } From 22fa7a4f721b5182a0840f3eb5bf15657bb785d6 Mon Sep 17 00:00:00 2001 From: Ivy Grey Date: Fri, 28 Mar 2025 14:26:00 -0700 Subject: [PATCH 7/7] Last fix --- special-pages/pages/history/integration-tests/history.page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/special-pages/pages/history/integration-tests/history.page.js b/special-pages/pages/history/integration-tests/history.page.js index a709b6aebe..ed827264bb 100644 --- a/special-pages/pages/history/integration-tests/history.page.js +++ b/special-pages/pages/history/integration-tests/history.page.js @@ -204,7 +204,7 @@ export class HistoryTestPage { expect(calls[3].payload.params).toStrictEqual({ url, - target: 'new-window', + target: 'new-tab', }); }