From 2f42c8cf72c856d004b6e2a356e1ff42d1780697 Mon Sep 17 00:00:00 2001 From: wxiaoguang Date: Mon, 27 Apr 2026 00:37:03 +0800 Subject: [PATCH] Fix fetch action redirect (#37437) And add tests for its behavior --- .../js/features/common-fetch-action.test.ts | 22 ++++++++++++++++++- web_src/js/features/common-fetch-action.ts | 10 +++++---- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/web_src/js/features/common-fetch-action.test.ts b/web_src/js/features/common-fetch-action.test.ts index b6b39620d00..25c611c3ae5 100644 --- a/web_src/js/features/common-fetch-action.test.ts +++ b/web_src/js/features/common-fetch-action.test.ts @@ -1,4 +1,4 @@ -import {execPseudoSelectorCommands} from './common-fetch-action.ts'; +import {execPseudoSelectorCommands, handleFetchActionSuccessJson} from './common-fetch-action.ts'; test('execPseudoSelectorCommands', () => { window.document.body.innerHTML = ` @@ -37,3 +37,23 @@ test('execPseudoSelectorCommands', () => { expect(ret.targets.length).toEqual(2); expect(ret.targets).toEqual(Array.from(document.querySelectorAll('#d1 .x'))); }); + +test('handleFetchActionSuccessJson', async () => { + const spyAssign = vi.spyOn(window.location, 'assign').mockImplementation(() => {}); + const spyReload = vi.spyOn(window.location, 'reload').mockImplementation(() => {}); + + await handleFetchActionSuccessJson(document.body, {redirect: '/'}); + expect(spyAssign).toHaveBeenCalledTimes(1); + expect(spyReload).toHaveBeenCalledTimes(0); + vi.resetAllMocks(); + + await handleFetchActionSuccessJson(document.body, {redirect: ''}); + expect(spyAssign).toHaveBeenCalledTimes(0); + expect(spyReload).toHaveBeenCalledTimes(1); + vi.resetAllMocks(); + + await handleFetchActionSuccessJson(document.body, {}); + expect(spyAssign).toHaveBeenCalledTimes(0); + expect(spyReload).toHaveBeenCalledTimes(1); + vi.resetAllMocks(); +}); diff --git a/web_src/js/features/common-fetch-action.ts b/web_src/js/features/common-fetch-action.ts index a96e69915f3..96bc2e2adb3 100644 --- a/web_src/js/features/common-fetch-action.ts +++ b/web_src/js/features/common-fetch-action.ts @@ -34,7 +34,7 @@ function fetchActionDoRedirect(redirect: string) { // * Also do so in development, to make sure the redirection logic is always tested by real users const needBackendHelp = redirect.includes('#'); if (runModeIsProd && !needBackendHelp) { - window.location.href = redirect; + window.location.assign(redirect); return; } @@ -66,11 +66,13 @@ function toggleLoadingIndicator(el: HTMLElement, opt: FetchActionOpts, isLoading } } -async function handleFetchActionSuccessJson(el: HTMLElement, respJson: any) { +export async function handleFetchActionSuccessJson(el: HTMLElement, respJson: any) { ignoreAreYouSure(el); // ignore the areYouSure check before reloading - if (typeof respJson?.redirect === 'string') { - fetchActionDoRedirect(respJson.redirect); + const redirect = respJson?.redirect; + if (typeof redirect === 'string' && redirect) { + fetchActionDoRedirect(redirect); } else { + // reserved behavior, in the future, there can be more fields to introduce more behaviors window.location.reload(); } }