Skip to content

Commit

Permalink
#1230@patch: Fixes issue where it is not possible to set "globalThis.…
Browse files Browse the repository at this point in the history
…location.href" when using Happy DOM in the global scope (e.g. by using @happy-dom/global-registrator).
  • Loading branch information
capricorn86 committed Jan 24, 2024
1 parent b5ce97d commit e8c3f28
Show file tree
Hide file tree
Showing 17 changed files with 145 additions and 56 deletions.
4 changes: 2 additions & 2 deletions packages/global-registrator/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
6 changes: 6 additions & 0 deletions packages/global-registrator/test/react/React.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ async function main(): Promise<void> {
}
}

/** @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();

Expand Down
1 change: 1 addition & 0 deletions packages/happy-dom/src/PropertySymbol.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
3 changes: 1 addition & 2 deletions packages/happy-dom/src/browser/BrowserFrame.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -84,7 +83,7 @@ export default class BrowserFrame implements IBrowserFrame {
* @param url URL.
*/
public set url(url) {
(<Location>this.window.location) = new Location(
this.window.location[PropertySymbol.setURL](
this,
BrowserFrameURL.getRelativeURL(this, url).href
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -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.');
}
(<Location>this.window.location) = new Location(
this.window.location[PropertySymbol.setURL](
this,
BrowserFrameURL.getRelativeURL(this, url).href
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down Expand Up @@ -77,7 +76,7 @@ export default class BrowserFrameNavigator {

if (!BrowserFrameValidator.validateFrameNavigation(frame)) {
if (!frame.page.context.browser.settings.navigation.disableFallbackToSetURL) {
(<Location>frame.window.location) = new Location(frame, targetURL.href);
frame.window.location[PropertySymbol.setURL](frame, targetURL.href);
}

return null;
Expand Down
2 changes: 1 addition & 1 deletion packages/happy-dom/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
2 changes: 1 addition & 1 deletion packages/happy-dom/src/nodes/document/Document.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
2 changes: 1 addition & 1 deletion packages/happy-dom/src/nodes/document/IDocument.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
Original file line number Diff line number Diff line change
@@ -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.
Expand Down Expand Up @@ -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;
}
}
2 changes: 1 addition & 1 deletion packages/happy-dom/src/window/BrowserWindow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
2 changes: 1 addition & 1 deletion packages/happy-dom/src/window/CrossOriginBrowserWindow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

/**
Expand Down
2 changes: 1 addition & 1 deletion packages/happy-dom/src/window/IBrowserWindow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
2 changes: 1 addition & 1 deletion packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts
Original file line number Diff line number Diff line change
@@ -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';

/**
Expand Down
1 change: 0 additions & 1 deletion packages/happy-dom/test/browser/BrowserFrame.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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);
});
});

Expand Down
Loading

0 comments on commit e8c3f28

Please sign in to comment.