From b0ad924dc91ff9fc371c2f0821bf7481c97e747c Mon Sep 17 00:00:00 2001 From: Kelvin Amoaba <97001695+AmoabaKelvin@users.noreply.github.com> Date: Tue, 27 Oct 2026 13:36:38 +0000 Subject: [PATCH] fix(browser): keep the Annotate pick armed when a page rewrites its URL fragment (#34423) --- .../browser/browser-grab-session-controller.ts | 6 +++--- .../browser-manager-grab-selection.test.ts | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/browser/browser-grab-session-controller.ts b/src/main/browser/browser-grab-session-controller.ts index 03e951f2f7d..7e971821fd2 100644 --- a/src/main/browser/browser-grab-session-controller.ts +++ b/src/main/browser/browser-grab-session-controller.ts @@ -133,14 +133,14 @@ export class BrowserGrabSessionController { } } - // Subframe navigations, such as ad loads, must not cancel the selection. + // Subframe loads and in-place URL updates (scroll spies) keep the overlay's document. const handleNavigation = ( _event: unknown, _url: unknown, - _isInPlace: unknown, + isInPlace: boolean, isMainFrame: boolean ): void => { - if (isMainFrame) { + if (isMainFrame && !isInPlace) { settleOnce({ opId, kind: 'cancelled', reason: 'navigation' }) } } diff --git a/src/main/browser/browser-manager-grab-selection.test.ts b/src/main/browser/browser-manager-grab-selection.test.ts index a1a3d471e7d..e2fc4b52207 100644 --- a/src/main/browser/browser-manager-grab-selection.test.ts +++ b/src/main/browser/browser-manager-grab-selection.test.ts @@ -546,6 +546,21 @@ describe('browserManager grab operations', () => { expect(browserManager.hasActiveGrabOp('tab-1')).toBe(true) }) + + it('does not cancel grab when the page rewrites its URL in place', async () => { + guestExecuteJavaScriptMock.mockImplementation(() => new Promise(() => {})) + + void browserManager.awaitGrabSelection('tab-1', 'op-1', guest) + + const navHandler = guestOnMock.mock.calls.findLast( + ([event]) => event === 'did-start-navigation' + )?.[1] as ((...args: unknown[]) => void) | undefined + + expect(navHandler).toBeTypeOf('function') + navHandler?.(null, 'https://example.com/#section-2', true, true) + + expect(browserManager.hasActiveGrabOp('tab-1')).toBe(true) + }) }) describe('destruction auto-cancel', () => {