From e8c3f28a064c03401dd7e6c41370b17b4ab4ea4d Mon Sep 17 00:00:00 2001 From: David Ortner Date: Wed, 24 Jan 2024 01:47:13 +0100 Subject: [PATCH] #1230@patch: Fixes issue where it is not possible to set "globalThis.location.href" when using Happy DOM in the global scope (e.g. by using @happy-dom/global-registrator). --- packages/global-registrator/package.json | 4 +- .../test/react/React.test.tsx | 6 + packages/happy-dom/src/PropertySymbol.ts | 1 + .../happy-dom/src/browser/BrowserFrame.ts | 3 +- .../detached-browser/DetachedBrowserFrame.ts | 3 +- .../utilities/BrowserFrameNavigator.ts | 3 +- packages/happy-dom/src/index.ts | 2 +- .../happy-dom/src/nodes/document/Document.ts | 2 +- .../happy-dom/src/nodes/document/IDocument.ts | 2 +- .../src/{location => url}/Location.ts | 18 ++- .../happy-dom/src/window/BrowserWindow.ts | 2 +- .../src/window/CrossOriginBrowserWindow.ts | 2 +- .../happy-dom/src/window/IBrowserWindow.ts | 2 +- .../src/window/ICrossOriginBrowserWindow.ts | 2 +- .../test/browser/BrowserFrame.test.ts | 1 - .../DetachedBrowserFrame.test.ts | 146 +++++++++++++----- .../happy-dom/test/location/Location.test.ts | 2 +- 17 files changed, 145 insertions(+), 56 deletions(-) rename packages/happy-dom/src/{location => url}/Location.ts (71%) diff --git a/packages/global-registrator/package.json b/packages/global-registrator/package.json index b417cd915..a7ee641c3 100644 --- a/packages/global-registrator/package.json +++ b/packages/global-registrator/package.json @@ -65,10 +65,10 @@ "access": "public" }, "scripts": { - "compile": "tsc && tsc --moduleResolution Node --module CommonJS --outDir cjs && npm run change-cjs-file-extension", + "compile": "rm -rf lib cjs && tsc && tsc --moduleResolution Node --module CommonJS --outDir cjs && npm run change-cjs-file-extension", "change-cjs-file-extension": "node ../happy-dom/bin/change-file-extension.cjs --dir=./cjs --fromExt=.js --toExt=.cjs", "watch": "npm run compile && tsc -w --preserveWatchOutput", - "test": "tsc --project ./test && node ../happy-dom/bin/change-file-extension.cjs --dir=./tmp --fromExt=.js --toExt=.cjs && node ./tmp/react/React.test.cjs", + "test": "rm -rf tmp && tsc --project ./test && node ../happy-dom/bin/change-file-extension.cjs --dir=./tmp --fromExt=.js --toExt=.cjs && node ./tmp/react/React.test.cjs", "test:debug": "tsc --project ./test && node ../happy-dom/bin/change-file-extension.cjs --dir=./tmp --fromExt=.js --toExt=.cjs && node --inspect-brk ./tmp/react/React.test.cjs" }, "dependencies": { diff --git a/packages/global-registrator/test/react/React.test.tsx b/packages/global-registrator/test/react/React.test.tsx index a17fa9d52..e7b8cac87 100644 --- a/packages/global-registrator/test/react/React.test.tsx +++ b/packages/global-registrator/test/react/React.test.tsx @@ -49,6 +49,12 @@ async function main(): Promise { } } + /** @see https://github.com/capricorn86/happy-dom/issues/1230 */ + globalThis.location.href = 'https://example.com/'; + if (globalThis.location.href !== 'https://example.com/') { + throw Error('The property "location.href" could not be set.'); + } + await mountReactComponent(); unmountReactComponent(); diff --git a/packages/happy-dom/src/PropertySymbol.ts b/packages/happy-dom/src/PropertySymbol.ts index 116b41550..97d69c481 100644 --- a/packages/happy-dom/src/PropertySymbol.ts +++ b/packages/happy-dom/src/PropertySymbol.ts @@ -148,3 +148,4 @@ export const options = Symbol('options'); export const content = Symbol('content'); export const mode = Symbol('mode'); export const host = Symbol('host'); +export const setURL = Symbol('setURL'); diff --git a/packages/happy-dom/src/browser/BrowserFrame.ts b/packages/happy-dom/src/browser/BrowserFrame.ts index fccaff3c8..c04dd8da8 100644 --- a/packages/happy-dom/src/browser/BrowserFrame.ts +++ b/packages/happy-dom/src/browser/BrowserFrame.ts @@ -5,7 +5,6 @@ import IBrowserFrame from './types/IBrowserFrame.js'; import BrowserWindow from '../window/BrowserWindow.js'; import IBrowserWindow from '../window/IBrowserWindow.js'; import ICrossOriginBrowserWindow from '../window/ICrossOriginBrowserWindow.js'; -import Location from '../location/Location.js'; import IResponse from '../fetch/types/IResponse.js'; import IGoToOptions from './types/IGoToOptions.js'; import { Script } from 'vm'; @@ -84,7 +83,7 @@ export default class BrowserFrame implements IBrowserFrame { * @param url URL. */ public set url(url) { - (this.window.location) = new Location( + this.window.location[PropertySymbol.setURL]( this, BrowserFrameURL.getRelativeURL(this, url).href ); diff --git a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts index f602d9136..38ade2c03 100644 --- a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts +++ b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts @@ -2,7 +2,6 @@ import DetachedBrowserPage from './DetachedBrowserPage.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import AsyncTaskManager from '../../async-task-manager/AsyncTaskManager.js'; import IBrowserFrame from '../types/IBrowserFrame.js'; -import Location from '../../location/Location.js'; import IResponse from '../../fetch/types/IResponse.js'; import IGoToOptions from '../types/IGoToOptions.js'; import { Script } from 'vm'; @@ -99,7 +98,7 @@ export default class DetachedBrowserFrame implements IBrowserFrame { if (!this.window) { throw new Error('The frame has been destroyed, the "window" property is not set.'); } - (this.window.location) = new Location( + this.window.location[PropertySymbol.setURL]( this, BrowserFrameURL.getRelativeURL(this, url).href ); diff --git a/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts b/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts index fc95b2fba..c0ffef2d9 100644 --- a/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts +++ b/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts @@ -5,7 +5,6 @@ import IResponse from '../../fetch/types/IResponse.js'; import DocumentReadyStateManager from '../../nodes/document/DocumentReadyStateManager.js'; import IBrowserWindow from '../../window/IBrowserWindow.js'; import WindowErrorUtility from '../../window/WindowErrorUtility.js'; -import Location from '../../location/Location.js'; import AbortController from '../../fetch/AbortController.js'; import BrowserFrameFactory from './BrowserFrameFactory.js'; import BrowserFrameURL from './BrowserFrameURL.js'; @@ -77,7 +76,7 @@ export default class BrowserFrameNavigator { if (!BrowserFrameValidator.validateFrameNavigation(frame)) { if (!frame.page.context.browser.settings.navigation.disableFallbackToSetURL) { - (frame.window.location) = new Location(frame, targetURL.href); + frame.window.location[PropertySymbol.setURL](frame, targetURL.href); } return null; diff --git a/packages/happy-dom/src/index.ts b/packages/happy-dom/src/index.ts index c2d3e866b..d2b8cb3ec 100644 --- a/packages/happy-dom/src/index.ts +++ b/packages/happy-dom/src/index.ts @@ -56,7 +56,7 @@ import File from './file/File.js'; import FileReader from './file/FileReader.js'; import FormData from './form-data/FormData.js'; import History from './history/History.js'; -import Location from './location/Location.js'; +import Location from './url/Location.js'; import MutationObserver from './mutation-observer/MutationObserver.js'; import MutationRecord from './mutation-observer/MutationRecord.js'; import Attr from './nodes/attr/Attr.js'; diff --git a/packages/happy-dom/src/nodes/document/Document.ts b/packages/happy-dom/src/nodes/document/Document.ts index b0db19604..9bd4d4623 100644 --- a/packages/happy-dom/src/nodes/document/Document.ts +++ b/packages/happy-dom/src/nodes/document/Document.ts @@ -32,7 +32,7 @@ import IHTMLCollection from '../element/IHTMLCollection.js'; import IHTMLLinkElement from '../html-link-element/IHTMLLinkElement.js'; import IHTMLStyleElement from '../html-style-element/IHTMLStyleElement.js'; import DocumentReadyStateEnum from './DocumentReadyStateEnum.js'; -import Location from '../../location/Location.js'; +import Location from '../../url/Location.js'; import Selection from '../../selection/Selection.js'; import IShadowRoot from '../shadow-root/IShadowRoot.js'; import Range from '../../range/Range.js'; diff --git a/packages/happy-dom/src/nodes/document/IDocument.ts b/packages/happy-dom/src/nodes/document/IDocument.ts index fb6f3953e..f22073753 100644 --- a/packages/happy-dom/src/nodes/document/IDocument.ts +++ b/packages/happy-dom/src/nodes/document/IDocument.ts @@ -17,7 +17,7 @@ import Selection from '../../selection/Selection.js'; import IHTMLCollection from '../element/IHTMLCollection.js'; import IHTMLScriptElement from '../html-script-element/IHTMLScriptElement.js'; import CSSStyleSheet from '../../css/CSSStyleSheet.js'; -import Location from '../../location/Location.js'; +import Location from '../../url/Location.js'; import DocumentReadyStateEnum from './DocumentReadyStateEnum.js'; import INodeList from '../node/INodeList.js'; import Range from '../../range/Range.js'; diff --git a/packages/happy-dom/src/location/Location.ts b/packages/happy-dom/src/url/Location.ts similarity index 71% rename from packages/happy-dom/src/location/Location.ts rename to packages/happy-dom/src/url/Location.ts index 8ca82ecbe..1a2aafc0b 100644 --- a/packages/happy-dom/src/location/Location.ts +++ b/packages/happy-dom/src/url/Location.ts @@ -1,5 +1,6 @@ -import URL from '../url/URL.js'; +import URL from './URL.js'; import IBrowserFrame from '../browser/types/IBrowserFrame.js'; +import * as PropertySymbol from '../PropertySymbol.js'; /** * Location. @@ -60,4 +61,19 @@ export default class Location extends URL { .goto(this.href) .catch((error) => this.#browserFrame.page.console.error(error)); } + + /** + * Replaces the current URL state with the provided one without navigating to the new URL. + * + * @param browserFrame Browser frame that must match the current one as validation. + * @param url URL. + */ + public [PropertySymbol.setURL](browserFrame: IBrowserFrame, url: string): void { + if (this.#browserFrame !== browserFrame) { + throw new Error('Failed to set URL. Browser frame mismatch.'); + } + + // @ts-ignore + super.href = url; + } } diff --git a/packages/happy-dom/src/window/BrowserWindow.ts b/packages/happy-dom/src/window/BrowserWindow.ts index 8bf8a841c..676314ac4 100644 --- a/packages/happy-dom/src/window/BrowserWindow.ts +++ b/packages/happy-dom/src/window/BrowserWindow.ts @@ -48,7 +48,7 @@ import EventTarget from '../event/EventTarget.js'; import MessagePort from '../event/MessagePort.js'; import { URLSearchParams } from 'url'; import URL from '../url/URL.js'; -import Location from '../location/Location.js'; +import Location from '../url/Location.js'; import MutationObserver from '../mutation-observer/MutationObserver.js'; import MutationRecord from '../mutation-observer/MutationRecord.js'; import XMLSerializer from '../xml-serializer/XMLSerializer.js'; diff --git a/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts b/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts index 1f24c8683..3d2508ddc 100644 --- a/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts +++ b/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts @@ -2,7 +2,7 @@ import EventTarget from '../event/EventTarget.js'; import IBrowserWindow from './IBrowserWindow.js'; import DOMException from '../exception/DOMException.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; -import Location from '../location/Location.js'; +import Location from '../url/Location.js'; import ICrossOriginBrowserWindow from './ICrossOriginBrowserWindow.js'; /** diff --git a/packages/happy-dom/src/window/IBrowserWindow.ts b/packages/happy-dom/src/window/IBrowserWindow.ts index fcc188d79..36e4e482e 100644 --- a/packages/happy-dom/src/window/IBrowserWindow.ts +++ b/packages/happy-dom/src/window/IBrowserWindow.ts @@ -48,7 +48,7 @@ import MediaQueryListEvent from '../event/events/MediaQueryListEvent.js'; import EventTarget from '../event/EventTarget.js'; import { URLSearchParams } from 'url'; import URL from '../url/URL.js'; -import Location from '../location/Location.js'; +import Location from '../url/Location.js'; import MutationObserver from '../mutation-observer/MutationObserver.js'; import MutationRecord from '../mutation-observer/MutationRecord.js'; import DOMParser from '../dom-parser/DOMParser.js'; diff --git a/packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts b/packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts index 7c98770b4..23f24cce2 100644 --- a/packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts +++ b/packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts @@ -1,5 +1,5 @@ import IBrowserWindow from './IBrowserWindow.js'; -import Location from '../location/Location.js'; +import Location from '../url/Location.js'; import IEventTarget from '../event/IEventTarget.js'; /** diff --git a/packages/happy-dom/test/browser/BrowserFrame.test.ts b/packages/happy-dom/test/browser/BrowserFrame.test.ts index 6654dbc1e..a32b79518 100644 --- a/packages/happy-dom/test/browser/BrowserFrame.test.ts +++ b/packages/happy-dom/test/browser/BrowserFrame.test.ts @@ -117,7 +117,6 @@ describe('BrowserFrame', () => { const location = page.mainFrame.window.location; page.mainFrame.url = 'http://localhost:3000'; expect(page.mainFrame.window.location.href).toBe('http://localhost:3000/'); - expect(page.mainFrame.window.location).not.toBe(location); }); }); diff --git a/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts b/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts index fc2eb3085..e16c3d8ef 100644 --- a/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts +++ b/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts @@ -1,7 +1,6 @@ import { Script } from 'vm'; import DetachedBrowser from '../../../src/browser/detached-browser/DetachedBrowser'; import Event from '../../../src/event/Event'; -import Window from '../../../src/window/Window'; import BrowserWindow from '../../../src/window/BrowserWindow'; import IRequest from '../../../src/fetch/types/IRequest'; import IResponse from '../../../src/fetch/types/IResponse'; @@ -24,7 +23,9 @@ describe('DetachedBrowserFrame', () => { describe('get childFrames()', () => { it('Returns child frames.', () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; expect(page.mainFrame.childFrames).toEqual([]); const frame1 = BrowserFrameFactory.newChildFrame(page.mainFrame); @@ -36,7 +37,9 @@ describe('DetachedBrowserFrame', () => { describe('get parentFrame()', () => { it('Returns the parent frame.', () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; expect(page.mainFrame.parentFrame).toBe(null); const frame1 = BrowserFrameFactory.newChildFrame(page.mainFrame); @@ -58,7 +61,9 @@ describe('DetachedBrowserFrame', () => { describe('get window()', () => { it('Returns the window.', () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); expect(page.mainFrame.window).toBeInstanceOf(BrowserWindow); expect(page.mainFrame.window.console).toBe(page.console); @@ -68,7 +73,9 @@ describe('DetachedBrowserFrame', () => { describe('get content()', () => { it('Returns the document HTML content.', () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; page.mainFrame.window.document.write('
test
'); expect(page.content).toBe('
test
'); @@ -78,7 +85,9 @@ describe('DetachedBrowserFrame', () => { describe('set content()', () => { it('Sets the document HTML content.', () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; page.mainFrame.content = '
test
'; expect(page.mainFrame.window.document.documentElement.outerHTML).toBe( @@ -90,7 +99,9 @@ describe('DetachedBrowserFrame', () => { const browser = new DetachedBrowser(BrowserWindow, { settings: { errorCapture: BrowserErrorCaptureEnum.disabled } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; page.mainFrame.content = '
test
'; page.mainFrame.window.document.addEventListener('load', () => { @@ -111,7 +122,9 @@ describe('DetachedBrowserFrame', () => { describe('get url()', () => { it('Returns the document URL.', () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; page.mainFrame.url = 'http://localhost:3000'; expect(page.mainFrame.url).toBe('http://localhost:3000/'); @@ -121,19 +134,22 @@ describe('DetachedBrowserFrame', () => { describe('set url()', () => { it('Sets the document URL.', () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const location = page.mainFrame.window.location; page.mainFrame.url = 'http://localhost:3000'; expect(page.mainFrame.window.location.href).toBe('http://localhost:3000/'); - expect(page.mainFrame.window.location).not.toBe(location); }); }); describe('waitUntilComplete()', () => { it('Waits for all pages to complete.', async () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const frame1 = BrowserFrameFactory.newChildFrame(page.mainFrame); const frame2 = BrowserFrameFactory.newChildFrame(page.mainFrame); @@ -185,7 +201,9 @@ describe('DetachedBrowserFrame', () => { describe('abort()', () => { it('Aborts all ongoing operations.', async () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.newPage(); const frame1 = BrowserFrameFactory.newChildFrame(page.mainFrame); const frame2 = BrowserFrameFactory.newChildFrame(page.mainFrame); @@ -203,7 +221,9 @@ describe('DetachedBrowserFrame', () => { describe('evaluate()', () => { it("Evaluates a code string in the frame's context.", () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; expect(page.mainFrame.evaluate('globalThis.test = 1')).toBe(1); expect(page.mainFrame.window['test']).toBe(1); @@ -211,7 +231,9 @@ describe('DetachedBrowserFrame', () => { it("Evaluates a VM script in the frame's context.", () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; expect(page.mainFrame.evaluate(new Script('globalThis.test = 1'))).toBe(1); expect(page.mainFrame.window['test']).toBe(1); @@ -231,7 +253,9 @@ describe('DetachedBrowserFrame', () => { }); const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.newPage(); const oldWindow = page.mainFrame.window; const response = await page.mainFrame.goto('http://localhost:3000', { @@ -251,7 +275,9 @@ describe('DetachedBrowserFrame', () => { it('Navigates to a URL with "javascript:" as protocol.', async () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const oldWindow = page.mainFrame.window; const response = await page.mainFrame.goto('javascript:document.write("test");'); @@ -265,7 +291,9 @@ describe('DetachedBrowserFrame', () => { it('Navigates to a URL with "about:" as protocol.', async () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; const response = await page.mainFrame.goto('about:blank'); @@ -277,7 +305,9 @@ describe('DetachedBrowserFrame', () => { it('Aborts request if it times out.', async () => { const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; let error: Error | null = null; @@ -317,7 +347,9 @@ describe('DetachedBrowserFrame', () => { }); const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; const response = await page.mainFrame.goto('http://localhost:3000'); @@ -339,7 +371,9 @@ describe('DetachedBrowserFrame', () => { }); const browser = new DetachedBrowser(BrowserWindow); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; let error: Error | null = null; @@ -368,7 +402,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childFrame = BrowserFrameFactory.newChildFrame(page.mainFrame); const oldWindow = childFrame.window; @@ -397,7 +433,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childFrame = BrowserFrameFactory.newChildFrame(page.mainFrame); const oldWindow = childFrame.window; @@ -422,7 +460,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -452,7 +492,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -478,7 +520,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; @@ -506,7 +550,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -535,7 +581,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -564,7 +612,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -591,7 +641,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -617,7 +669,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; @@ -646,7 +700,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childFrame = BrowserFrameFactory.newChildFrame(page.mainFrame); const oldWindow = childFrame.window; @@ -670,7 +726,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childFrame = BrowserFrameFactory.newChildFrame(page.mainFrame); const oldWindow = childFrame.window; @@ -698,7 +756,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -723,7 +783,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const childPage = browser.newPage(); childPage.mainFrame[PropertySymbol.openerFrame] = page.mainFrame; @@ -749,7 +811,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; @@ -774,7 +838,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.newPage(); const oldWindow = page.mainFrame.window; @@ -796,7 +862,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const oldWindow = page.mainFrame.window; @@ -818,7 +886,9 @@ describe('DetachedBrowserFrame', () => { } } }); - browser.defaultContext.pages[0].mainFrame.window = new Window(); + browser.defaultContext.pages[0].mainFrame.window = new BrowserWindow( + browser.defaultContext.pages[0].mainFrame + ); const page = browser.defaultContext.pages[0]; const oldWindow = page.mainFrame.window; diff --git a/packages/happy-dom/test/location/Location.test.ts b/packages/happy-dom/test/location/Location.test.ts index dd60f6398..8a25dc126 100644 --- a/packages/happy-dom/test/location/Location.test.ts +++ b/packages/happy-dom/test/location/Location.test.ts @@ -3,7 +3,7 @@ import BrowserFrame from '../../src/browser/BrowserFrame.js'; import IBrowserFrame from '../../src/browser/types/IBrowserFrame.js'; import IGoToOptions from '../../src/browser/types/IGoToOptions.js'; import IResponse from '../../src/fetch/types/IResponse.js'; -import Location from '../../src/location/Location.js'; +import Location from '../../src/url/Location.js'; import { beforeEach, describe, it, expect, vi } from 'vitest'; const HREF = 'https://google.com/some-path/?key=value&key2=value2#hash';