Skip to content

Commit

Permalink
Merge pull request #1231 from capricorn86/task/1230-windowlocationhre…
Browse files Browse the repository at this point in the history
…f-=-value-returns-aboutblank-in-v1300

#1230@patch: Fixes issue where it is not possible to set "globalThis.…
  • Loading branch information
capricorn86 committed Jan 24, 2024
2 parents b5ce97d + e8c3f28 commit 1a85ba1
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 1a85ba1

Please sign in to comment.