feat: Reinitialize frontend with SvelteKit and TypeScript

- Delete old Vite+Svelte frontend
- Initialize new SvelteKit project with TypeScript
- Configure Tailwind CSS v4 + DaisyUI
- Implement JWT authentication with auto-refresh
- Create login page with form validation (Zod)
- Add protected route guards
- Update Docker configuration for single-stage build
- Add E2E tests with Playwright (6/11 passing)
- Fix Svelte 5 reactivity with $state() runes

Known issues:
- 5 E2E tests failing (timing/async issues)
- Token refresh implementation needs debugging
- Validation error display timing
This commit is contained in:
2026-02-17 16:19:59 -05:00
parent 54df6018f5
commit de2d83092e
28274 changed files with 3816354 additions and 90 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,85 @@
import EventTarget from '../event/EventTarget.js';
import BrowserWindow from './BrowserWindow.js';
import Location from '../location/Location.js';
import * as PropertySymbol from '../PropertySymbol.js';
/**
* Browser window with limited access due to CORS restrictions in iframes.
*/
export default class CrossOriginBrowserWindow extends EventTarget implements CrossOriginBrowserWindow {
#private;
readonly window: this;
readonly location: Location;
[PropertySymbol.self]: BrowserWindow | CrossOriginBrowserWindow;
[PropertySymbol.top]: BrowserWindow | CrossOriginBrowserWindow;
[PropertySymbol.parent]: BrowserWindow | CrossOriginBrowserWindow;
/**
* Constructor.
*
* @param target Target window.
* @param [parent] Parent window.
*/
constructor(target: BrowserWindow, parent?: BrowserWindow);
/**
* Returns self.
*
* @returns Self.
*/
get self(): BrowserWindow | CrossOriginBrowserWindow;
/**
* Returns self.
*
* @param self Self.
*/
set self(self: BrowserWindow | CrossOriginBrowserWindow | null);
/**
* Returns top.
*
* @returns Top.
*/
get top(): BrowserWindow | CrossOriginBrowserWindow;
/**
* Returns parent.
*
* @returns Parent.
*/
get parent(): BrowserWindow | CrossOriginBrowserWindow;
/**
* Returns parent.
*
* @param parent Parent.
*/
set parent(parent: BrowserWindow | null);
/**
* Returns the opener.
*
* @returns Opener.
*/
get opener(): BrowserWindow | CrossOriginBrowserWindow | null;
/**
* Returns the closed state.
*
* @returns Closed state.
*/
get closed(): boolean;
/**
* Shifts focus away from the window.
*/
blur(): void;
/**
* Gives focus to the window.
*/
focus(): void;
/**
* Closes the window.
*/
close(): void;
/**
* Safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it spawned, or between a page and an iframe embedded within it.
*
* @param message Message.
* @param [targetOrigin=*] Target origin.
* @param transfer Transfer. Not implemented.
*/
postMessage(message: unknown, targetOrigin?: string, transfer?: unknown[]): void;
}
//# sourceMappingURL=CrossOriginBrowserWindow.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"CrossOriginBrowserWindow.d.ts","sourceRoot":"","sources":["../../src/window/CrossOriginBrowserWindow.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAG/C,OAAO,QAAQ,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBACpB,SAAQ,WACR,YAAW,wBAAwB;;IAEnC,SAAgB,MAAM,OAAQ;IAC9B,SAAgB,QAAQ,EAAE,QAAQ,CAAC;IAG5B,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,wBAAwB,CAAQ;IAC/D,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,aAAa,GAAG,wBAAwB,CAAC;IAC/D,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,wBAAwB,CAAC;IAKjF;;;;;OAKG;gBACS,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,aAAa;IA0BzD;;;;OAIG;IACH,IAAW,IAAI,IAAI,aAAa,GAAG,wBAAwB,CAE1D;IAED;;;;OAIG;IACH,IAAW,IAAI,CAAC,IAAI,EAAE,aAAa,GAAG,wBAAwB,GAAG,IAAI,EAEpE;IAED;;;;OAIG;IACH,IAAW,GAAG,IAAI,aAAa,GAAG,wBAAwB,CAEzD;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAI,aAAa,GAAG,wBAAwB,CAE5D;IAED;;;;OAIG;IACH,IAAW,MAAM,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,EAE7C;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAI,aAAa,GAAG,wBAAwB,GAAG,IAAI,CAEnE;IAED;;;;OAIG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED;;OAEG;IACI,IAAI,IAAI,IAAI;IAInB;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;;;;;OAMG;IACI,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,SAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,IAAI;CAGpF"}

View File

@@ -0,0 +1,120 @@
import EventTarget from '../event/EventTarget.js';
import DOMException from '../exception/DOMException.js';
import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js';
import * as PropertySymbol from '../PropertySymbol.js';
/**
* Browser window with limited access due to CORS restrictions in iframes.
*/
export default class CrossOriginBrowserWindow extends EventTarget {
window = this;
location;
// Internal properties
[PropertySymbol.self] = this;
// Private properties
#targetWindow;
/**
* Constructor.
*
* @param target Target window.
* @param [parent] Parent window.
*/
constructor(target, parent) {
super();
this[PropertySymbol.parent] = parent ?? this;
this[PropertySymbol.top] = parent ?? this;
this.location = new Proxy({}, {
get: () => {
throw new DOMException(`Blocked a frame with origin "${this.parent.location.origin}" from accessing a cross-origin frame.`, DOMExceptionNameEnum.securityError);
},
set: () => {
throw new DOMException(`Blocked a frame with origin "${this.parent.location.origin}" from accessing a cross-origin frame.`, DOMExceptionNameEnum.securityError);
}
});
this.#targetWindow = target;
}
/**
* Returns self.
*
* @returns Self.
*/
get self() {
return this[PropertySymbol.self];
}
/**
* Returns self.
*
* @param self Self.
*/
set self(self) {
this[PropertySymbol.self] = self;
}
/**
* Returns top.
*
* @returns Top.
*/
get top() {
return this[PropertySymbol.top];
}
/**
* Returns parent.
*
* @returns Parent.
*/
get parent() {
return this[PropertySymbol.parent];
}
/**
* Returns parent.
*
* @param parent Parent.
*/
set parent(parent) {
this[PropertySymbol.parent] = parent;
}
/**
* Returns the opener.
*
* @returns Opener.
*/
get opener() {
return this.#targetWindow.opener;
}
/**
* Returns the closed state.
*
* @returns Closed state.
*/
get closed() {
return this.#targetWindow.closed;
}
/**
* Shifts focus away from the window.
*/
blur() {
this.#targetWindow.blur();
}
/**
* Gives focus to the window.
*/
focus() {
this.#targetWindow.focus();
}
/**
* Closes the window.
*/
close() {
this.#targetWindow.close();
}
/**
* Safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it spawned, or between a page and an iframe embedded within it.
*
* @param message Message.
* @param [targetOrigin=*] Target origin.
* @param transfer Transfer. Not implemented.
*/
postMessage(message, targetOrigin = '*', transfer) {
this.#targetWindow.postMessage(message, targetOrigin, transfer);
}
}
//# sourceMappingURL=CrossOriginBrowserWindow.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"CrossOriginBrowserWindow.js","sourceRoot":"","sources":["../../src/window/CrossOriginBrowserWindow.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAElD,OAAO,YAAY,MAAM,8BAA8B,CAAC;AACxD,OAAO,oBAAoB,MAAM,sCAAsC,CAAC;AAExE,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAEvD;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBACpB,SAAQ,WAAW;IAGH,MAAM,GAAG,IAAI,CAAC;IACd,QAAQ,CAAW;IAEnC,sBAAsB;IACf,CAAC,cAAc,CAAC,IAAI,CAAC,GAA6C,IAAI,CAAC;IAI9E,qBAAqB;IACrB,aAAa,CAAgB;IAE7B;;;;;OAKG;IACH,YAAY,MAAqB,EAAE,MAAsB;QACxD,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC;QAC7C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,IAAI,CAAC;QAE1C,IAAI,CAAC,QAAQ,GAAa,IAAI,KAAK,CAClC,EAAE,EACF;YACC,GAAG,EAAE,GAAG,EAAE;gBACT,MAAM,IAAI,YAAY,CACrB,gCAAgC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,wCAAwC,EACnG,oBAAoB,CAAC,aAAa,CAClC,CAAC;YACH,CAAC;YACD,GAAG,EAAE,GAAG,EAAE;gBACT,MAAM,IAAI,YAAY,CACrB,gCAAgC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,wCAAwC,EACnG,oBAAoB,CAAC,aAAa,CAClC,CAAC;YACH,CAAC;SACD,CACD,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACH,IAAW,IAAI;QACd,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAW,IAAI,CAAC,IAAqD;QACpE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAW,GAAG;QACb,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED;;;;OAIG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED;;;;OAIG;IACH,IAAW,MAAM,CAAC,MAA4B;QAC7C,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;IACtC,CAAC;IAED;;;;OAIG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,IAAW,MAAM;QAChB,OAAO,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IAClC,CAAC;IAED;;OAEG;IACI,IAAI;QACV,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED;;OAEG;IACI,KAAK;QACX,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACI,KAAK;QACX,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC5B,CAAC;IAED;;;;;;OAMG;IACI,WAAW,CAAC,OAAgB,EAAE,YAAY,GAAG,GAAG,EAAE,QAAoB;QAC5E,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;CACD"}

View File

@@ -0,0 +1,94 @@
import VirtualConsolePrinter from '../console/VirtualConsolePrinter.js';
import IOptionalBrowserPageViewport from '../browser/types/IOptionalBrowserPageViewport.js';
import IBrowserFrame from '../browser/types/IBrowserFrame.js';
import IBrowserSettings from '../browser/types/IBrowserSettings.js';
/**
* API for detached windows to be able to access features of the browser.
*/
export default class DetachedWindowAPI {
#private;
/**
* Constructor.
*
* @param browserFrame Browser frame.
*/
constructor(browserFrame: IBrowserFrame);
/**
* Returns settings.
*
* @returns Settings.
*/
get settings(): IBrowserSettings;
/**
* Returns virtual console printer.
*
* @returns Virtual console printer.
*/
get virtualConsolePrinter(): VirtualConsolePrinter;
/**
* Waits for all async tasks to complete.
*
* @returns Promise.
*/
waitUntilComplete(): Promise<void>;
/**
* Waits for all async tasks to complete.
*
* @deprecated Use waitUntilComplete() instead.
* @returns Promise.
*/
whenAsyncComplete(): Promise<void>;
/**
* Aborts all async tasks.
*/
abort(): Promise<void>;
/**
* Aborts all async tasks.
*
* @deprecated Use abort() instead.
*/
cancelAsync(): Promise<void>;
/**
* Aborts all async tasks and closes the window.
*/
close(): Promise<void>;
/**
* Sets the URL without navigating the browser.
*
* @param url URL.
*/
setURL(url: string): void;
/**
* Sets the viewport.
*
* @param viewport Viewport.
*/
setViewport(viewport: IOptionalBrowserPageViewport): void;
/**
* Sets the window size.
*
* @deprecated Use setViewport() instead.
* @param options Options.
* @param options.width Width.
* @param options.height Height.
*/
setWindowSize(options: {
width?: number;
height?: number;
}): void;
/**
* Sets the window width.
*
* @deprecated Use setViewport() instead.
* @param width Width.
*/
setInnerWidth(width: number): void;
/**
* Sets the window height.
*
* @deprecated Use setViewport() instead.
* @param height Height.
*/
setInnerHeight(height: number): void;
}
//# sourceMappingURL=DetachedWindowAPI.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DetachedWindowAPI.d.ts","sourceRoot":"","sources":["../../src/window/DetachedWindowAPI.ts"],"names":[],"mappings":"AAAA,OAAO,qBAAqB,MAAM,qCAAqC,CAAC;AACxE,OAAO,4BAA4B,MAAM,kDAAkD,CAAC;AAC5F,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAEpE;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;;IAGrC;;;;OAIG;gBACS,YAAY,EAAE,aAAa;IAIvC;;;;OAIG;IACH,IAAW,QAAQ,IAAI,gBAAgB,CAEtC;IAED;;;;OAIG;IACH,IAAW,qBAAqB,IAAI,qBAAqB,CAExD;IAED;;;;OAIG;IACI,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC;;;;;OAKG;IACI,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIzC;;OAEG;IACI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B;;;;OAIG;IACI,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAInC;;OAEG;IACI,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B;;;;OAIG;IACI,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIhC;;;;OAIG;IACI,WAAW,CAAC,QAAQ,EAAE,4BAA4B,GAAG,IAAI;IAIhE;;;;;;;OAOG;IACI,aAAa,CAAC,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAOxE;;;;;OAKG;IACI,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAIzC;;;;;OAKG;IACI,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;CAG3C"}

View File

@@ -0,0 +1,116 @@
/**
* API for detached windows to be able to access features of the browser.
*/
export default class DetachedWindowAPI {
#browserFrame;
/**
* Constructor.
*
* @param browserFrame Browser frame.
*/
constructor(browserFrame) {
this.#browserFrame = browserFrame;
}
/**
* Returns settings.
*
* @returns Settings.
*/
get settings() {
return this.#browserFrame.page.context.browser.settings;
}
/**
* Returns virtual console printer.
*
* @returns Virtual console printer.
*/
get virtualConsolePrinter() {
return this.#browserFrame.page.virtualConsolePrinter;
}
/**
* Waits for all async tasks to complete.
*
* @returns Promise.
*/
waitUntilComplete() {
return this.#browserFrame.waitUntilComplete();
}
/**
* Waits for all async tasks to complete.
*
* @deprecated Use waitUntilComplete() instead.
* @returns Promise.
*/
whenAsyncComplete() {
return this.waitUntilComplete();
}
/**
* Aborts all async tasks.
*/
abort() {
return this.#browserFrame.abort();
}
/**
* Aborts all async tasks.
*
* @deprecated Use abort() instead.
*/
cancelAsync() {
return this.abort();
}
/**
* Aborts all async tasks and closes the window.
*/
close() {
return this.#browserFrame.page.close();
}
/**
* Sets the URL without navigating the browser.
*
* @param url URL.
*/
setURL(url) {
this.#browserFrame.url = url;
}
/**
* Sets the viewport.
*
* @param viewport Viewport.
*/
setViewport(viewport) {
this.#browserFrame.page.setViewport(viewport);
}
/**
* Sets the window size.
*
* @deprecated Use setViewport() instead.
* @param options Options.
* @param options.width Width.
* @param options.height Height.
*/
setWindowSize(options) {
this.setViewport({
width: options?.width,
height: options?.height
});
}
/**
* Sets the window width.
*
* @deprecated Use setViewport() instead.
* @param width Width.
*/
setInnerWidth(width) {
this.setViewport({ width });
}
/**
* Sets the window height.
*
* @deprecated Use setViewport() instead.
* @param height Height.
*/
setInnerHeight(height) {
this.setViewport({ height });
}
}
//# sourceMappingURL=DetachedWindowAPI.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"DetachedWindowAPI.js","sourceRoot":"","sources":["../../src/window/DetachedWindowAPI.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACrC,aAAa,CAAiB;IAE9B;;;;OAIG;IACH,YAAY,YAA2B;QACtC,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACH,IAAW,QAAQ;QAClB,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzD,CAAC;IAED;;;;OAIG;IACH,IAAW,qBAAqB;QAC/B,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,qBAAqB,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACI,iBAAiB;QACvB,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,EAAE,CAAC;IAC/C,CAAC;IAED;;;;;OAKG;IACI,iBAAiB;QACvB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IACjC,CAAC;IAED;;OAEG;IACI,KAAK;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IACnC,CAAC;IAED;;;;OAIG;IACI,WAAW;QACjB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACI,KAAK;QACX,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IACxC,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,GAAW;QACxB,IAAI,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACI,WAAW,CAAC,QAAsC;QACxD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC/C,CAAC;IAED;;;;;;;OAOG;IACI,aAAa,CAAC,OAA4C;QAChE,IAAI,CAAC,WAAW,CAAC;YAChB,KAAK,EAAE,OAAO,EAAE,KAAK;YACrB,MAAM,EAAE,OAAO,EAAE,MAAM;SACvB,CAAC,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACI,aAAa,CAAC,KAAa;QACjC,IAAI,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACI,cAAc,CAAC,MAAc;QACnC,IAAI,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9B,CAAC;CACD"}

View File

@@ -0,0 +1,75 @@
import * as PropertySymbol from '../PropertySymbol.js';
import Window from './Window.js';
import { Buffer } from 'buffer';
/**
* Browser window.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/Window.
*/
export default class GlobalWindow extends Window {
Array: typeof Array;
ArrayBuffer: typeof ArrayBuffer;
Boolean: typeof Boolean;
Buffer: typeof Buffer;
DataView: typeof DataView;
Date: typeof Date;
Error: typeof Error;
EvalError: typeof EvalError;
Float32Array: typeof Float32Array;
Float64Array: typeof Float64Array;
Function: typeof Function;
Infinity: typeof Infinity;
Int16Array: typeof Int16Array;
Int32Array: typeof Int32Array;
Int8Array: typeof Int8Array;
Intl: typeof Intl;
JSON: typeof JSON;
Map: MapConstructor;
Math: typeof Math;
NaN: typeof NaN;
Number: typeof Number;
Object: typeof Object;
Promise: typeof Promise;
RangeError: typeof RangeError;
ReferenceError: typeof ReferenceError;
RegExp: typeof RegExp;
Set: SetConstructor;
String: typeof String;
Symbol: Function;
SyntaxError: typeof SyntaxError;
TypeError: typeof TypeError;
URIError: typeof URIError;
Uint16Array: typeof Uint16Array;
Uint32Array: typeof Uint32Array;
Uint8Array: typeof Uint8Array;
Uint8ClampedArray: typeof Uint8ClampedArray;
WeakMap: WeakMapConstructor;
WeakSet: WeakSetConstructor;
decodeURI: typeof decodeURI;
decodeURIComponent: typeof decodeURIComponent;
encodeURI: typeof encodeURI;
encodeURIComponent: typeof encodeURIComponent;
eval: typeof eval;
/**
* @deprecated
*/
escape: (str: string) => string;
global: typeof globalThis;
isFinite: typeof isFinite;
isNaN: typeof isNaN;
parseFloat: typeof parseFloat;
parseInt: typeof parseInt;
undefined: typeof undefined;
/**
* @deprecated
*/
unescape: (str: string) => string;
gc: () => void;
v8debug?: unknown;
/**
* Setup of VM context.
*/
protected [PropertySymbol.setupVMContext](): void;
}
//# sourceMappingURL=GlobalWindow.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"GlobalWindow.d.ts","sourceRoot":"","sources":["../../src/window/GlobalWindow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,MAAM;IAExC,KAAK,EAAE,OAAO,KAAK,CAAoB;IACvC,WAAW,EAAE,OAAO,WAAW,CAA0B;IACzD,OAAO,EAAE,OAAO,OAAO,CAAsB;IAC7C,MAAM,EAAE,OAAO,MAAM,CAAU;IAC/B,QAAQ,EAAE,OAAO,QAAQ,CAAuB;IAChD,IAAI,EAAE,OAAO,IAAI,CAAmB;IACpC,KAAK,EAAE,OAAO,KAAK,CAAoB;IACvC,SAAS,EAAE,OAAO,SAAS,CAAwB;IACnD,YAAY,EAAE,OAAO,YAAY,CAA2B;IAC5D,YAAY,EAAE,OAAO,YAAY,CAA2B;IAC5D,QAAQ,EAAE,OAAO,QAAQ,CAAuB;IAChD,QAAQ,EAAE,OAAO,QAAQ,CAAuB;IAChD,UAAU,EAAE,OAAO,UAAU,CAAyB;IACtD,UAAU,EAAE,OAAO,UAAU,CAAyB;IACtD,SAAS,EAAE,OAAO,SAAS,CAAwB;IACnD,IAAI,EAAE,OAAO,IAAI,CAAmB;IACpC,IAAI,EAAE,OAAO,IAAI,CAAmB;IACpC,GAAG,EAAE,cAAc,CAAkB;IACrC,IAAI,EAAE,OAAO,IAAI,CAAmB;IACpC,GAAG,EAAE,OAAO,GAAG,CAAkB;IACjC,MAAM,EAAE,OAAO,MAAM,CAAqB;IAC1C,MAAM,EAAE,OAAO,MAAM,CAAqB;IAC1C,OAAO,EAAE,OAAO,OAAO,CAAsB;IAC7C,UAAU,EAAE,OAAO,UAAU,CAAyB;IACtD,cAAc,EAAE,OAAO,cAAc,CAA6B;IAClE,MAAM,EAAE,OAAO,MAAM,CAAqB;IAC1C,GAAG,EAAE,cAAc,CAAkB;IACrC,MAAM,EAAE,OAAO,MAAM,CAAqB;IAC1C,MAAM,EAAE,QAAQ,CAAqB;IACrC,WAAW,EAAE,OAAO,WAAW,CAA0B;IACzD,SAAS,EAAE,OAAO,SAAS,CAAwB;IACnD,QAAQ,EAAE,OAAO,QAAQ,CAAuB;IAChD,WAAW,EAAE,OAAO,WAAW,CAA0B;IACzD,WAAW,EAAE,OAAO,WAAW,CAA0B;IACzD,UAAU,EAAE,OAAO,UAAU,CAAyB;IACtD,iBAAiB,EAAE,OAAO,iBAAiB,CAAgC;IAC3E,OAAO,EAAE,kBAAkB,CAAsB;IACjD,OAAO,EAAE,kBAAkB,CAAsB;IACjD,SAAS,EAAE,OAAO,SAAS,CAAwB;IACnD,kBAAkB,EAAE,OAAO,kBAAkB,CAAiC;IAC9E,SAAS,EAAE,OAAO,SAAS,CAAwB;IACnD,kBAAkB,EAAE,OAAO,kBAAkB,CAAiC;IAC9E,IAAI,EAAE,OAAO,IAAI,CAAmB;IAC3C;;OAEG;IACI,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAqB;IACpD,MAAM,EAAE,OAAO,UAAU,CAAc;IACvC,QAAQ,EAAE,OAAO,QAAQ,CAAuB;IAChD,KAAK,EAAE,OAAO,KAAK,CAAoB;IACvC,UAAU,EAAE,OAAO,UAAU,CAAyB;IACtD,QAAQ,EAAE,OAAO,QAAQ,CAAuB;IAChD,SAAS,EAAE,OAAO,SAAS,CAAwB;IAC1D;;OAEG;IACI,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAuB;IACxD,EAAE,EAAE,MAAM,IAAI,CAAiB;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAsB;IAE9C;;OAEG;cACgB,CAAC,cAAc,CAAC,cAAc,CAAC,IAAI,IAAI;CAG1D"}

View File

@@ -0,0 +1,78 @@
import * as PropertySymbol from '../PropertySymbol.js';
import Window from './Window.js';
import { Buffer } from 'buffer';
/**
* Browser window.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/Window.
*/
export default class GlobalWindow extends Window {
// Node.js Globals
Array = globalThis.Array;
ArrayBuffer = globalThis.ArrayBuffer;
Boolean = globalThis.Boolean;
Buffer = Buffer;
DataView = globalThis.DataView;
Date = globalThis.Date;
Error = globalThis.Error;
EvalError = globalThis.EvalError;
Float32Array = globalThis.Float32Array;
Float64Array = globalThis.Float64Array;
Function = globalThis.Function;
Infinity = globalThis.Infinity;
Int16Array = globalThis.Int16Array;
Int32Array = globalThis.Int32Array;
Int8Array = globalThis.Int8Array;
Intl = globalThis.Intl;
JSON = globalThis.JSON;
Map = globalThis.Map;
Math = globalThis.Math;
NaN = globalThis.NaN;
Number = globalThis.Number;
Object = globalThis.Object;
Promise = globalThis.Promise;
RangeError = globalThis.RangeError;
ReferenceError = globalThis.ReferenceError;
RegExp = globalThis.RegExp;
Set = globalThis.Set;
String = globalThis.String;
Symbol = globalThis.Symbol;
SyntaxError = globalThis.SyntaxError;
TypeError = globalThis.TypeError;
URIError = globalThis.URIError;
Uint16Array = globalThis.Uint16Array;
Uint32Array = globalThis.Uint32Array;
Uint8Array = globalThis.Uint8Array;
Uint8ClampedArray = globalThis.Uint8ClampedArray;
WeakMap = globalThis.WeakMap;
WeakSet = globalThis.WeakSet;
decodeURI = globalThis.decodeURI;
decodeURIComponent = globalThis.decodeURIComponent;
encodeURI = globalThis.encodeURI;
encodeURIComponent = globalThis.encodeURIComponent;
eval = globalThis.eval;
/**
* @deprecated
*/
escape = globalThis.escape;
global = globalThis;
isFinite = globalThis.isFinite;
isNaN = globalThis.isNaN;
parseFloat = globalThis.parseFloat;
parseInt = globalThis.parseInt;
undefined = globalThis.undefined;
/**
* @deprecated
*/
unescape = globalThis.unescape;
gc = globalThis.gc;
v8debug = globalThis.v8debug;
/**
* Setup of VM context.
*/
[PropertySymbol.setupVMContext]() {
// Do nothing
}
}
//# sourceMappingURL=GlobalWindow.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"GlobalWindow.js","sourceRoot":"","sources":["../../src/window/GlobalWindow.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,MAAM;IAC/C,kBAAkB;IACX,KAAK,GAAiB,UAAU,CAAC,KAAK,CAAC;IACvC,WAAW,GAAuB,UAAU,CAAC,WAAW,CAAC;IACzD,OAAO,GAAmB,UAAU,CAAC,OAAO,CAAC;IAC7C,MAAM,GAAkB,MAAM,CAAC;IAC/B,QAAQ,GAAoB,UAAU,CAAC,QAAQ,CAAC;IAChD,IAAI,GAAgB,UAAU,CAAC,IAAI,CAAC;IACpC,KAAK,GAAiB,UAAU,CAAC,KAAK,CAAC;IACvC,SAAS,GAAqB,UAAU,CAAC,SAAS,CAAC;IACnD,YAAY,GAAwB,UAAU,CAAC,YAAY,CAAC;IAC5D,YAAY,GAAwB,UAAU,CAAC,YAAY,CAAC;IAC5D,QAAQ,GAAoB,UAAU,CAAC,QAAQ,CAAC;IAChD,QAAQ,GAAoB,UAAU,CAAC,QAAQ,CAAC;IAChD,UAAU,GAAsB,UAAU,CAAC,UAAU,CAAC;IACtD,UAAU,GAAsB,UAAU,CAAC,UAAU,CAAC;IACtD,SAAS,GAAqB,UAAU,CAAC,SAAS,CAAC;IACnD,IAAI,GAAgB,UAAU,CAAC,IAAI,CAAC;IACpC,IAAI,GAAgB,UAAU,CAAC,IAAI,CAAC;IACpC,GAAG,GAAmB,UAAU,CAAC,GAAG,CAAC;IACrC,IAAI,GAAgB,UAAU,CAAC,IAAI,CAAC;IACpC,GAAG,GAAe,UAAU,CAAC,GAAG,CAAC;IACjC,MAAM,GAAkB,UAAU,CAAC,MAAM,CAAC;IAC1C,MAAM,GAAkB,UAAU,CAAC,MAAM,CAAC;IAC1C,OAAO,GAAmB,UAAU,CAAC,OAAO,CAAC;IAC7C,UAAU,GAAsB,UAAU,CAAC,UAAU,CAAC;IACtD,cAAc,GAA0B,UAAU,CAAC,cAAc,CAAC;IAClE,MAAM,GAAkB,UAAU,CAAC,MAAM,CAAC;IAC1C,GAAG,GAAmB,UAAU,CAAC,GAAG,CAAC;IACrC,MAAM,GAAkB,UAAU,CAAC,MAAM,CAAC;IAC1C,MAAM,GAAa,UAAU,CAAC,MAAM,CAAC;IACrC,WAAW,GAAuB,UAAU,CAAC,WAAW,CAAC;IACzD,SAAS,GAAqB,UAAU,CAAC,SAAS,CAAC;IACnD,QAAQ,GAAoB,UAAU,CAAC,QAAQ,CAAC;IAChD,WAAW,GAAuB,UAAU,CAAC,WAAW,CAAC;IACzD,WAAW,GAAuB,UAAU,CAAC,WAAW,CAAC;IACzD,UAAU,GAAsB,UAAU,CAAC,UAAU,CAAC;IACtD,iBAAiB,GAA6B,UAAU,CAAC,iBAAiB,CAAC;IAC3E,OAAO,GAAuB,UAAU,CAAC,OAAO,CAAC;IACjD,OAAO,GAAuB,UAAU,CAAC,OAAO,CAAC;IACjD,SAAS,GAAqB,UAAU,CAAC,SAAS,CAAC;IACnD,kBAAkB,GAA8B,UAAU,CAAC,kBAAkB,CAAC;IAC9E,SAAS,GAAqB,UAAU,CAAC,SAAS,CAAC;IACnD,kBAAkB,GAA8B,UAAU,CAAC,kBAAkB,CAAC;IAC9E,IAAI,GAAgB,UAAU,CAAC,IAAI,CAAC;IAC3C;;OAEG;IACI,MAAM,GAA4B,UAAU,CAAC,MAAM,CAAC;IACpD,MAAM,GAAsB,UAAU,CAAC;IACvC,QAAQ,GAAoB,UAAU,CAAC,QAAQ,CAAC;IAChD,KAAK,GAAiB,UAAU,CAAC,KAAK,CAAC;IACvC,UAAU,GAAsB,UAAU,CAAC,UAAU,CAAC;IACtD,QAAQ,GAAoB,UAAU,CAAC,QAAQ,CAAC;IAChD,SAAS,GAAqB,UAAU,CAAC,SAAS,CAAC;IAC1D;;OAEG;IACI,QAAQ,GAA4B,UAAU,CAAC,QAAQ,CAAC;IACxD,EAAE,GAAe,UAAU,CAAC,EAAE,CAAC;IAC/B,OAAO,GAAa,UAAU,CAAC,OAAO,CAAC;IAE9C;;OAEG;IACgB,CAAC,cAAc,CAAC,cAAc,CAAC;QACjD,aAAa;IACd,CAAC;CACD"}

View File

@@ -0,0 +1,68 @@
import { Buffer } from 'buffer';
export default interface INodeJSGlobal {
Array: typeof Array;
ArrayBuffer: typeof ArrayBuffer;
Boolean: typeof Boolean;
Buffer: typeof Buffer;
DataView: typeof DataView;
Date: typeof Date;
Error: typeof Error;
EvalError: typeof EvalError;
Float32Array: typeof Float32Array;
Float64Array: typeof Float64Array;
Function: typeof Function;
Infinity: typeof Infinity;
Int16Array: typeof Int16Array;
Int32Array: typeof Int32Array;
Int8Array: typeof Int8Array;
Intl: typeof Intl;
JSON: typeof JSON;
Map: MapConstructor;
Math: typeof Math;
NaN: typeof NaN;
Number: typeof Number;
Object: typeof Object;
Promise: typeof Promise;
RangeError: typeof RangeError;
ReferenceError: typeof ReferenceError;
RegExp: typeof RegExp;
Set: SetConstructor;
String: typeof String;
Symbol: Function;
SyntaxError: typeof SyntaxError;
TypeError: typeof TypeError;
URIError: typeof URIError;
Uint16Array: typeof Uint16Array;
Uint32Array: typeof Uint32Array;
Uint8Array: typeof Uint8Array;
Uint8ClampedArray: typeof Uint8ClampedArray;
WeakMap: WeakMapConstructor;
WeakSet: WeakSetConstructor;
clearInterval: (intervalId: NodeJS.Timeout) => void;
clearTimeout: (timeoutId: NodeJS.Timeout) => void;
decodeURI: typeof decodeURI;
decodeURIComponent: typeof decodeURIComponent;
encodeURI: typeof encodeURI;
encodeURIComponent: typeof encodeURIComponent;
eval: typeof eval;
global: typeof globalThis;
isFinite: typeof isFinite;
isNaN: typeof isNaN;
parseFloat: typeof parseFloat;
parseInt: typeof parseInt;
setInterval: (callback: (...args: any[]) => void, ms?: number, ...args: any[]) => NodeJS.Timeout;
setTimeout: (callback: (...args: any[]) => void, ms?: number, ...args: any[]) => NodeJS.Timeout;
queueMicrotask: typeof queueMicrotask;
undefined: typeof undefined;
gc: () => void;
v8debug?: any;
/**
* @deprecated
*/
escape: (str: string) => string;
/**
* @deprecated
*/
unescape: (str: string) => string;
}
//# sourceMappingURL=INodeJSGlobal.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"INodeJSGlobal.d.ts","sourceRoot":"","sources":["../../src/window/INodeJSGlobal.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=INodeJSGlobal.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"INodeJSGlobal.js","sourceRoot":"","sources":["../../src/window/INodeJSGlobal.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,6 @@
export default interface IScrollToOptions {
top?: number;
left?: number;
behavior?: 'auto' | 'smooth';
}
//# sourceMappingURL=IScrollToOptions.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"IScrollToOptions.d.ts","sourceRoot":"","sources":["../../src/window/IScrollToOptions.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,WAAW,gBAAgB;IACxC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC7B"}

View File

@@ -0,0 +1,2 @@
export {};
//# sourceMappingURL=IScrollToOptions.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"IScrollToOptions.js","sourceRoot":"","sources":["../../src/window/IScrollToOptions.ts"],"names":[],"mappings":""}

View File

@@ -0,0 +1,4 @@
import { Script } from 'vm';
declare const _default: Script;
export default _default;
//# sourceMappingURL=VMGlobalPropertyScript.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"VMGlobalPropertyScript.d.ts","sourceRoot":"","sources":["../../src/window/VMGlobalPropertyScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;;AAE5B,wBA0DG"}

View File

@@ -0,0 +1,61 @@
import { Script } from 'vm';
export default new Script(`
this.ArrayBuffer = globalThis.ArrayBuffer;
this.Boolean = globalThis.Boolean;
this.DataView = globalThis.DataView;
this.Date = globalThis.Date;
this.Error = globalThis.Error;
this.EvalError = globalThis.EvalError;
this.Float32Array = globalThis.Float32Array;
this.Float64Array = globalThis.Float64Array;
this.GLOBAL = globalThis.GLOBAL;
this.Infinity = globalThis.Infinity;
this.Int16Array = globalThis.Int16Array;
this.Int32Array = globalThis.Int32Array;
this.Int8Array = globalThis.Int8Array;
this.Intl = globalThis.Intl;
this.JSON = globalThis.JSON;
this.Map = globalThis.Map;
this.Math = globalThis.Math;
this.NaN = globalThis.NaN;
this.Number = globalThis.Number;
this.Promise = globalThis.Promise;
this.RangeError = globalThis.RangeError;
this.ReferenceError = globalThis.ReferenceError;
this.RegExp = globalThis.RegExp;
this.Reflect = globalThis.Reflect;
this.Set = globalThis.Set;
this.Symbol = globalThis.Symbol;
this.SyntaxError = globalThis.SyntaxError;
this.String = globalThis.String;
this.TypeError = globalThis.TypeError;
this.URIError = globalThis.URIError;
this.Uint16Array = globalThis.Uint16Array;
this.Uint32Array = globalThis.Uint32Array;
this.Uint8Array = globalThis.Uint8Array;
this.Uint8ClampedArray = globalThis.Uint8ClampedArray;
this.WeakMap = globalThis.WeakMap;
this.WeakSet = globalThis.WeakSet;
this.decodeURI = globalThis.decodeURI;
this.decodeURIComponent = globalThis.decodeURIComponent;
this.encodeURI = globalThis.encodeURI;
this.encodeURIComponent = globalThis.encodeURIComponent;
this.eval = globalThis.eval;
this.escape = globalThis.escape;
this.global = globalThis.global;
this.isFinite = globalThis.isFinite;
this.isNaN = globalThis.isNaN;
this.parseFloat = globalThis.parseFloat;
this.parseInt = globalThis.parseInt;
this.root = globalThis.root;
this.undefined = globalThis.undefined;
this.unescape = globalThis.unescape;
this.gc = globalThis.gc;
this.v8debug = globalThis.v8debug;
this.AbortController = globalThis.AbortController;
this.AbortSignal = globalThis.AbortSignal;
this.Array = globalThis.Array;
this.Object = globalThis.Object;
this.Function = globalThis.Function;
`);
//# sourceMappingURL=VMGlobalPropertyScript.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"VMGlobalPropertyScript.js","sourceRoot":"","sources":["../../src/window/VMGlobalPropertyScript.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,IAAI,CAAC;AAE5B,eAAe,IAAI,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DzB,CAAC,CAAC"}

36
frontend/node_modules/happy-dom/lib/window/Window.d.ts generated vendored Normal file
View File

@@ -0,0 +1,36 @@
import DetachedWindowAPI from './DetachedWindowAPI.js';
import IOptionalBrowserSettings from '../browser/types/IOptionalBrowserSettings.js';
import BrowserWindow from './BrowserWindow.js';
/**
* Window.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/Window.
*/
export default class Window extends BrowserWindow {
readonly happyDOM: DetachedWindowAPI;
/**
* Constructor.
*
* @param [options] Options.
* @param [options.width] Window width. Defaults to "1024".
* @param [options.height] Window height. Defaults to "768".
* @param [options.innerWidth] Inner width. Deprecated. Defaults to "1024".
* @param [options.innerHeight] Inner height. Deprecated. Defaults to "768".
* @param [options.url] URL.
* @param [options.console] Console.
* @param [options.settings] Settings.
*/
constructor(options?: {
width?: number;
height?: number;
/** @deprecated Replaced by the "width" property. */
innerWidth?: number;
/** @deprecated Replaced by the "height" property. */
innerHeight?: number;
url?: string;
console?: Console;
settings?: IOptionalBrowserSettings;
});
}
//# sourceMappingURL=Window.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"Window.d.ts","sourceRoot":"","sources":["../../src/window/Window.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AACvD,OAAO,wBAAwB,MAAM,8CAA8C,CAAC;AACpF,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAG/C;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,aAAa;IAEhD,SAAgB,QAAQ,EAAE,iBAAiB,CAAC;IAE5C;;;;;;;;;;;OAWG;gBACS,OAAO,CAAC,EAAE;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,oDAAoD;QACpD,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,qDAAqD;QACrD,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,wBAAwB,CAAC;KACpC;CAuBD"}

45
frontend/node_modules/happy-dom/lib/window/Window.js generated vendored Normal file
View File

@@ -0,0 +1,45 @@
import DetachedWindowAPI from './DetachedWindowAPI.js';
import BrowserWindow from './BrowserWindow.js';
import DetachedBrowser from '../browser/detached-browser/DetachedBrowser.js';
/**
* Window.
*
* Reference:
* https://developer.mozilla.org/en-US/docs/Web/API/Window.
*/
export default class Window extends BrowserWindow {
// Detached Window API.
happyDOM;
/**
* Constructor.
*
* @param [options] Options.
* @param [options.width] Window width. Defaults to "1024".
* @param [options.height] Window height. Defaults to "768".
* @param [options.innerWidth] Inner width. Deprecated. Defaults to "1024".
* @param [options.innerHeight] Inner height. Deprecated. Defaults to "768".
* @param [options.url] URL.
* @param [options.console] Console.
* @param [options.settings] Settings.
*/
constructor(options) {
const browser = new DetachedBrowser(BrowserWindow, {
console: options?.console,
settings: options?.settings
});
const browserPage = browser.defaultContext.pages[0];
const browserFrame = browserPage.mainFrame;
if (options && (options.width || options.height || options.innerWidth || options.innerHeight)) {
Object.assign(browserPage.viewport, {
width: options.width || options.innerWidth || browserPage.viewport.width,
height: options.height || options.innerHeight || browserPage.viewport.height
});
}
super(browserFrame, {
url: options?.url
});
browserFrame.window = this;
this.happyDOM = new DetachedWindowAPI(browserFrame);
}
}
//# sourceMappingURL=Window.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"Window.js","sourceRoot":"","sources":["../../src/window/Window.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAEvD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAE7E;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,aAAa;IAChD,uBAAuB;IACP,QAAQ,CAAoB;IAE5C;;;;;;;;;;;OAWG;IACH,YAAY,OAUX;QACA,MAAM,OAAO,GAAG,IAAI,eAAe,CAAC,aAAa,EAAE;YAClD,OAAO,EAAE,OAAO,EAAE,OAAO;YACzB,QAAQ,EAAE,OAAO,EAAE,QAAQ;SAC3B,CAAC,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,YAAY,GAAG,WAAW,CAAC,SAAS,CAAC;QAE3C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/F,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE;gBACnC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,IAAI,WAAW,CAAC,QAAQ,CAAC,KAAK;gBACxE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM;aAC5E,CAAC,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,YAAY,EAAE;YACnB,GAAG,EAAE,OAAO,EAAE,GAAG;SACjB,CAAC,CAAC;QAEH,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC;QAE3B,IAAI,CAAC,QAAQ,GAAG,IAAI,iBAAiB,CAAC,YAAY,CAAC,CAAC;IACrD,CAAC;CACD"}

View File

@@ -0,0 +1,75 @@
import AsyncTaskManager from '../async-task-manager/AsyncTaskManager.js';
import IBrowser from '../browser/types/IBrowser.js';
import IBrowserContext from '../browser/types/IBrowserContext.js';
import IBrowserFrame from '../browser/types/IBrowserFrame.js';
import IBrowserPage from '../browser/types/IBrowserPage.js';
import IBrowserSettings from '../browser/types/IBrowserSettings.js';
import * as PropertySymbol from '../PropertySymbol.js';
import BrowserWindow from './BrowserWindow.js';
/**
* API for accessing the Browser in a Window context without exposing the Browser as accessible properties.
*
* The Browser should never be exposed to scripts, as the scripts could then manipulate it, which would lead to security issues.
*/
export default class WindowBrowserContext {
#private;
private static [PropertySymbol.browserFrames];
private static [PropertySymbol.windowInternalId];
/**
* Browser window.
*
* @param window Window.
*/
constructor(window: BrowserWindow);
/**
* Returns the browser settings of the window.
*
* @returns Browser settings.
*/
getSettings(): IBrowserSettings | null;
/**
* Returns the browser.
*
* @returns Browser.
*/
getBrowser(): IBrowser | null;
/**
* Returns the browser page.
*
* @returns Browser page.
*/
getBrowserPage(): IBrowserPage | null;
/**
* Returns the browser context.
*
* @returns Browser context.
*/
getBrowserContext(): IBrowserContext | null;
/**
* Returns the browser frame of the window.
*
* @returns Browser frame.
*/
getBrowserFrame(): IBrowserFrame | null;
/**
* Returns the async task manager of the window.
*
* @returns Async task manager.
*/
getAsyncTaskManager(): AsyncTaskManager | null;
/**
* Assigns the window to a browser frame.
*
* @param window Window.
* @param browserFrame Browser frame.
*/
static setWindowBrowserFrameRelation(window: BrowserWindow, browserFrame: IBrowserFrame): void;
/**
* Assigns the window to a browser frame.
*
* @param window Window.
* @param browserFrame Browser frame.
*/
static removeWindowBrowserFrameRelation(window: BrowserWindow): void;
}
//# sourceMappingURL=WindowBrowserContext.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"WindowBrowserContext.d.ts","sourceRoot":"","sources":["../../src/window/WindowBrowserContext.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,2CAA2C,CAAC;AACzE,OAAO,QAAQ,MAAM,8BAA8B,CAAC;AACpD,OAAO,eAAe,MAAM,qCAAqC,CAAC;AAClE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAC9D,OAAO,YAAY,MAAM,kCAAkC,CAAC;AAC5D,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AACpE,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAE/C;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAoB;;IACxC,OAAO,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,CAAyC;IACtF,OAAO,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAK;IAGrD;;;;OAIG;gBACS,MAAM,EAAE,aAAa;IAIjC;;;;OAIG;IACI,WAAW,IAAI,gBAAgB,GAAG,IAAI;IAI7C;;;;OAIG;IACI,UAAU,IAAI,QAAQ,GAAG,IAAI;IAIpC;;;;OAIG;IACI,cAAc,IAAI,YAAY,GAAG,IAAI;IAI5C;;;;OAIG;IACI,iBAAiB,IAAI,eAAe,GAAG,IAAI;IAIlD;;;;OAIG;IACI,eAAe,IAAI,aAAa,GAAG,IAAI;IAW9C;;;;OAIG;IACI,mBAAmB,IAAI,gBAAgB,GAAG,IAAI;IAIrD;;;;;OAKG;WACW,6BAA6B,CAC1C,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,aAAa,GACzB,IAAI;IASP;;;;;OAKG;WACW,gCAAgC,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;CAG3E"}

View File

@@ -0,0 +1,94 @@
import * as PropertySymbol from '../PropertySymbol.js';
/**
* API for accessing the Browser in a Window context without exposing the Browser as accessible properties.
*
* The Browser should never be exposed to scripts, as the scripts could then manipulate it, which would lead to security issues.
*/
export default class WindowBrowserContext {
static [PropertySymbol.browserFrames] = new Map();
static [PropertySymbol.windowInternalId] = 0;
#window;
/**
* Browser window.
*
* @param window Window.
*/
constructor(window) {
this.#window = window;
}
/**
* Returns the browser settings of the window.
*
* @returns Browser settings.
*/
getSettings() {
return this.getBrowserFrame()?.page?.context?.browser?.settings || null;
}
/**
* Returns the browser.
*
* @returns Browser.
*/
getBrowser() {
return this.getBrowserFrame()?.page?.context?.browser || null;
}
/**
* Returns the browser page.
*
* @returns Browser page.
*/
getBrowserPage() {
return this.getBrowserFrame()?.page || null;
}
/**
* Returns the browser context.
*
* @returns Browser context.
*/
getBrowserContext() {
return this.getBrowserFrame()?.page?.context || null;
}
/**
* Returns the browser frame of the window.
*
* @returns Browser frame.
*/
getBrowserFrame() {
if (!this.#window) {
return null;
}
return (this.constructor[PropertySymbol.browserFrames].get(this.#window[PropertySymbol.internalId]) || null);
}
/**
* Returns the async task manager of the window.
*
* @returns Async task manager.
*/
getAsyncTaskManager() {
return this.getBrowserFrame()?.[PropertySymbol.asyncTaskManager] || null;
}
/**
* Assigns the window to a browser frame.
*
* @param window Window.
* @param browserFrame Browser frame.
*/
static setWindowBrowserFrameRelation(window, browserFrame) {
const browserFrames = this[PropertySymbol.browserFrames];
if (window[PropertySymbol.internalId] === -1) {
window[PropertySymbol.internalId] = this[PropertySymbol.windowInternalId];
this[PropertySymbol.windowInternalId]++;
}
browserFrames.set(window[PropertySymbol.internalId], browserFrame);
}
/**
* Assigns the window to a browser frame.
*
* @param window Window.
* @param browserFrame Browser frame.
*/
static removeWindowBrowserFrameRelation(window) {
this[PropertySymbol.browserFrames].delete(window[PropertySymbol.internalId]);
}
}
//# sourceMappingURL=WindowBrowserContext.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"WindowBrowserContext.js","sourceRoot":"","sources":["../../src/window/WindowBrowserContext.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AAGvD;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,oBAAoB;IAChC,MAAM,CAAC,CAAC,cAAc,CAAC,aAAa,CAAC,GAA+B,IAAI,GAAG,EAAE,CAAC;IAC9E,MAAM,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACrD,OAAO,CAAgB;IAEvB;;;;OAIG;IACH,YAAY,MAAqB;QAChC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACI,WAAW;QACjB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC;IACzE,CAAC;IAED;;;;OAIG;IACI,UAAU;QAChB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACI,cAAc;QACpB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,IAAI,IAAI,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACI,iBAAiB;QACvB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC;IACtD,CAAC;IAED;;;;OAIG;IACI,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACb,CAAC;QACD,OAAO,CACwB,IAAI,CAAC,WAAY,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,GAAG,CAChF,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CACvC,IAAI,IAAI,CACT,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,mBAAmB;QACzB,OAAO,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,IAAI,CAAC;IAC1E,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,6BAA6B,CAC1C,MAAqB,EACrB,YAA2B;QAE3B,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACzD,IAAI,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9C,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,CAAC;YAC1E,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACzC,CAAC;QACD,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IACpE,CAAC;IAED;;;;;OAKG;IACI,MAAM,CAAC,gCAAgC,CAAC,MAAqB;QACnE,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;IAC9E,CAAC"}

View File

@@ -0,0 +1,15 @@
import BrowserWindow from './BrowserWindow.js';
/**
* Extends classes with a "window" property, so that they internally can access it's Window context.
*
* By using WindowBrowserContext, the classes can get access to their Browser context, for accessing settings or navigating the browser.
*/
export default class WindowContextClassExtender {
/**
* Extends classes with a "window" property.
*
* @param window Window.
*/
static extendClasses(window: BrowserWindow): void;
}
//# sourceMappingURL=WindowContextClassExtender.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"WindowContextClassExtender.d.ts","sourceRoot":"","sources":["../../src/window/WindowContextClassExtender.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAiD/C;;;;GAIG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAC9C;;;;OAIG;WACW,aAAa,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;CAyOxD"}

View File

@@ -0,0 +1,291 @@
import * as PropertySymbol from '../PropertySymbol.js';
import DocumentImplementation from '../nodes/document/Document.js';
import HTMLDocumentImplementation from '../nodes/html-document/HTMLDocument.js';
import XMLDocumentImplementation from '../nodes/xml-document/XMLDocument.js';
import DocumentFragmentImplementation from '../nodes/document-fragment/DocumentFragment.js';
import TextImplementation from '../nodes/text/Text.js';
import CommentImplementation from '../nodes/comment/Comment.js';
import ImageImplementation from '../nodes/html-image-element/Image.js';
import AudioImplementation from '../nodes/html-audio-element/Audio.js';
import NodeIteratorImplementation from '../tree-walker/NodeIterator.js';
import TreeWalkerImplementation from '../tree-walker/TreeWalker.js';
import MutationObserverImplementation from '../mutation-observer/MutationObserver.js';
import MessagePortImplementation from '../event/MessagePort.js';
import DataTransferImplementation from '../event/DataTransfer.js';
import DataTransferItemImplementation from '../event/DataTransferItem.js';
import DataTransferItemListImplementation from '../event/DataTransferItemList.js';
import XMLSerializerImplementation from '../xml-serializer/XMLSerializer.js';
import CSSStyleSheetImplementation from '../css/CSSStyleSheet.js';
import DOMExceptionImplementation from '../exception/DOMException.js';
import CSSUnitValueImplementation from '../css/CSSUnitValue.js';
import SelectionImplementation from '../selection/Selection.js';
import HeadersImplementation from '../fetch/Headers.js';
import RequestImplementation from '../fetch/Request.js';
import ResponseImplementation from '../fetch/Response.js';
import EventTargetImplementation from '../event/EventTarget.js';
import XMLHttpRequestUploadImplementation from '../xml-http-request/XMLHttpRequestUpload.js';
import XMLHttpRequestEventTargetImplementation from '../xml-http-request/XMLHttpRequestEventTarget.js';
import AbortControllerImplementation from '../fetch/AbortController.js';
import AbortSignalImplementation from '../fetch/AbortSignal.js';
import FormDataImplementation from '../form-data/FormData.js';
import PermissionsImplementation from '../permissions/Permissions.js';
import PermissionStatusImplementation from '../permissions/PermissionStatus.js';
import ClipboardItemImplementation from '../clipboard/ClipboardItem.js';
import XMLHttpRequestImplementation from '../xml-http-request/XMLHttpRequest.js';
import DOMParserImplementation from '../dom-parser/DOMParser.js';
import RangeImplementation from '../range/Range.js';
import VTTCueImplementation from '../nodes/html-media-element/VTTCue.js';
import TextTrackImplementation from '../nodes/html-media-element/TextTrack.js';
import TextTrackListImplementation from '../nodes/html-media-element/TextTrackList.js';
import TextTrackCueImplementation from '../nodes/html-media-element/TextTrackCue.js';
import RemotePlaybackImplementation from '../nodes/html-media-element/RemotePlayback.js';
import FileReaderImplementation from '../file/FileReader.js';
import MediaStreamImplementation from '../nodes/html-media-element/MediaStream.js';
import MediaStreamTrackImplementation from '../nodes/html-media-element/MediaStreamTrack.js';
import CanvasCaptureMediaStreamTrackImplementation from '../nodes/html-canvas-element/CanvasCaptureMediaStreamTrack.js';
import NamedNodeMapImplementation from '../nodes/element/NamedNodeMap.js';
/**
* Extends classes with a "window" property, so that they internally can access it's Window context.
*
* By using WindowBrowserContext, the classes can get access to their Browser context, for accessing settings or navigating the browser.
*/
export default class WindowContextClassExtender {
/**
* Extends classes with a "window" property.
*
* @param window Window.
*/
static extendClasses(window) {
/* eslint-disable jsdoc/require-jsdoc */
// Document
class Document extends DocumentImplementation {
}
Document.prototype[PropertySymbol.window] = window;
window.Document = Document;
// HTMLDocument
class HTMLDocument extends HTMLDocumentImplementation {
}
HTMLDocument.prototype[PropertySymbol.window] = window;
window.HTMLDocument = HTMLDocument;
// XMLDocument
class XMLDocument extends XMLDocumentImplementation {
}
XMLDocument.prototype[PropertySymbol.window] = window;
window.XMLDocument = XMLDocument;
// DocumentFragment
class DocumentFragment extends DocumentFragmentImplementation {
}
DocumentFragment.prototype[PropertySymbol.window] = window;
window.DocumentFragment = DocumentFragment;
// Text
class Text extends TextImplementation {
}
Text.prototype[PropertySymbol.window] = window;
window.Text = Text;
// Comment
class Comment extends CommentImplementation {
}
Comment.prototype[PropertySymbol.window] = window;
window.Comment = Comment;
// Image
class Image extends ImageImplementation {
}
Image.prototype[PropertySymbol.window] = window;
window.Image = Image;
// Audio
class Audio extends AudioImplementation {
}
Audio.prototype[PropertySymbol.window] = window;
window.Audio = Audio;
// NodeIterator
class NodeIterator extends NodeIteratorImplementation {
}
NodeIterator.prototype[PropertySymbol.window] = window;
window.NodeIterator = NodeIterator;
// TreeWalker
class TreeWalker extends TreeWalkerImplementation {
}
TreeWalker.prototype[PropertySymbol.window] = window;
window.TreeWalker = TreeWalker;
// MutationObserver
class MutationObserver extends MutationObserverImplementation {
}
MutationObserver.prototype[PropertySymbol.window] = window;
window.MutationObserver = MutationObserver;
// MessagePort
class MessagePort extends MessagePortImplementation {
}
MessagePort.prototype[PropertySymbol.window] = window;
window.MessagePort = MessagePort;
// DataTransfer
class DataTransfer extends DataTransferImplementation {
}
DataTransfer.prototype[PropertySymbol.window] = window;
window.DataTransfer = DataTransfer;
// DataTransferItem
class DataTransferItem extends DataTransferItemImplementation {
}
DataTransferItem.prototype[PropertySymbol.window] = window;
window.DataTransferItem = DataTransferItem;
// DataTransferItemList
class DataTransferItemList extends DataTransferItemListImplementation {
}
DataTransferItemList.prototype[PropertySymbol.window] = window;
window.DataTransferItemList = DataTransferItemList;
// XMLSerializer
class XMLSerializer extends XMLSerializerImplementation {
}
XMLSerializer.prototype[PropertySymbol.window] = window;
window.XMLSerializer = XMLSerializer;
// CSSStyleSheet
class CSSStyleSheet extends CSSStyleSheetImplementation {
}
CSSStyleSheet.prototype[PropertySymbol.window] = window;
window.CSSStyleSheet = CSSStyleSheet;
// DOMException
class DOMException extends DOMExceptionImplementation {
}
window.DOMException = DOMException;
// CSSUnitValue
class CSSUnitValue extends CSSUnitValueImplementation {
}
CSSUnitValue.prototype[PropertySymbol.window] = window;
window.CSSUnitValue = CSSUnitValue;
// Selection
class Selection extends SelectionImplementation {
}
Selection.prototype[PropertySymbol.window] = window;
window.Selection = Selection;
// Headers
class Headers extends HeadersImplementation {
}
Headers.prototype[PropertySymbol.window] = window;
window.Headers = Headers;
// Request
class Request extends RequestImplementation {
}
Request.prototype[PropertySymbol.window] = window;
window.Request = Request;
// Response
class Response extends ResponseImplementation {
}
Response.prototype[PropertySymbol.window] = window;
Response[PropertySymbol.window] = window;
window.Response = Response;
// XMLHttpRequestEventTarget
class EventTarget extends EventTargetImplementation {
}
EventTarget.prototype[PropertySymbol.window] = window;
window.EventTarget = EventTarget;
// XMLHttpRequestUpload
class XMLHttpRequestUpload extends XMLHttpRequestUploadImplementation {
}
XMLHttpRequestUpload.prototype[PropertySymbol.window] = window;
window.XMLHttpRequestUpload = XMLHttpRequestUpload;
// XMLHttpRequestEventTarget
class XMLHttpRequestEventTarget extends XMLHttpRequestEventTargetImplementation {
}
XMLHttpRequestEventTarget.prototype[PropertySymbol.window] = window;
window.XMLHttpRequestEventTarget =
XMLHttpRequestEventTarget;
// AbortController
class AbortController extends AbortControllerImplementation {
}
AbortController.prototype[PropertySymbol.window] = window;
window.AbortController = AbortController;
// AbortSignal
class AbortSignal extends AbortSignalImplementation {
}
AbortSignal.prototype[PropertySymbol.window] = window;
AbortSignal[PropertySymbol.window] = window;
window.AbortSignal = AbortSignal;
// FormData
class FormData extends FormDataImplementation {
}
FormData.prototype[PropertySymbol.window] = window;
window.FormData = FormData;
// Permissions
class Permissions extends PermissionsImplementation {
}
Permissions.prototype[PropertySymbol.window] = window;
window.Permissions = Permissions;
// PermissionStatus
class PermissionStatus extends PermissionStatusImplementation {
}
PermissionStatus.prototype[PropertySymbol.window] = window;
window.PermissionStatus = PermissionStatus;
// ClipboardItem
class ClipboardItem extends ClipboardItemImplementation {
}
ClipboardItem.prototype[PropertySymbol.window] = window;
window.ClipboardItem = ClipboardItem;
// XMLHttpRequest
class XMLHttpRequest extends XMLHttpRequestImplementation {
}
XMLHttpRequest.prototype[PropertySymbol.window] = window;
window.XMLHttpRequest = XMLHttpRequest;
// DOMParser
class DOMParser extends DOMParserImplementation {
}
DOMParser.prototype[PropertySymbol.window] = window;
window.DOMParser = DOMParser;
// Range
class Range extends RangeImplementation {
}
Range.prototype[PropertySymbol.window] = window;
window.Range = Range;
// VTTCue
class VTTCue extends VTTCueImplementation {
}
VTTCue.prototype[PropertySymbol.window] = window;
window.VTTCue = VTTCue;
// TextTrack
class TextTrack extends TextTrackImplementation {
}
TextTrack.prototype[PropertySymbol.window] = window;
window.TextTrack = TextTrack;
// TextTrackList
class TextTrackList extends TextTrackListImplementation {
}
TextTrackList.prototype[PropertySymbol.window] = window;
window.TextTrackList = TextTrackList;
// TextTrackCue
class TextTrackCue extends TextTrackCueImplementation {
}
TextTrackCue.prototype[PropertySymbol.window] = window;
window.TextTrackCue = TextTrackCue;
// RemotePlayback
class RemotePlayback extends RemotePlaybackImplementation {
}
RemotePlayback.prototype[PropertySymbol.window] = window;
window.RemotePlayback = RemotePlayback;
// FileReader
class FileReader extends FileReaderImplementation {
}
FileReader.prototype[PropertySymbol.window] = window;
window.FileReader = FileReader;
// MediaStream
class MediaStream extends MediaStreamImplementation {
}
MediaStream.prototype[PropertySymbol.window] = window;
window.MediaStream = MediaStream;
// MediaStreamTrack
class MediaStreamTrack extends MediaStreamTrackImplementation {
}
MediaStreamTrack.prototype[PropertySymbol.window] = window;
window.MediaStreamTrack = MediaStreamTrack;
// MediaStreamTrack
class CanvasCaptureMediaStreamTrack extends CanvasCaptureMediaStreamTrackImplementation {
}
CanvasCaptureMediaStreamTrack.prototype[PropertySymbol.window] = window;
window.CanvasCaptureMediaStreamTrack =
CanvasCaptureMediaStreamTrack;
// NamedNodeMap
class NamedNodeMap extends NamedNodeMapImplementation {
}
NamedNodeMap.prototype[PropertySymbol.window] = window;
window.NamedNodeMap = NamedNodeMap;
/* eslint-enable jsdoc/require-jsdoc */
}
}
//# sourceMappingURL=WindowContextClassExtender.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,30 @@
import BrowserWindow from './BrowserWindow.js';
import CrossOriginBrowserWindow from './CrossOriginBrowserWindow.js';
import IBrowserFrame from '../browser/types/IBrowserFrame.js';
/**
* Window page open handler.
*/
export default class WindowPageOpenUtility {
/**
* Opens a page.
*
* @param browserFrame Browser frame.
* @param [options] Options.
* @param [options.url] URL.
* @param [options.target] Target.
* @param [options.features] Window features.
*/
static openPage(browserFrame: IBrowserFrame, options?: {
url?: string;
target?: string;
features?: string;
}): BrowserWindow | CrossOriginBrowserWindow | null;
/**
* Returns window features.
*
* @param features Window features string.
* @returns Window features.
*/
private static getWindowFeatures;
}
//# sourceMappingURL=WindowPageOpenUtility.d.ts.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"WindowPageOpenUtility.d.ts","sourceRoot":"","sources":["../../src/window/WindowPageOpenUtility.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,oBAAoB,CAAC;AAC/C,OAAO,wBAAwB,MAAM,+BAA+B,CAAC;AACrE,OAAO,aAAa,MAAM,mCAAmC,CAAC;AAM9D;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACzC;;;;;;;;OAQG;WACW,QAAQ,CACrB,YAAY,EAAE,aAAa,EAC3B,OAAO,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KAClB,GACC,aAAa,GAAG,wBAAwB,GAAG,IAAI;IA4GlD;;;;;OAKG;IACH,OAAO,CAAC,MAAM,CAAC,iBAAiB;CA6DhC"}

View File

@@ -0,0 +1,158 @@
import CrossOriginBrowserWindow from './CrossOriginBrowserWindow.js';
import FetchCORSUtility from '../fetch/utilities/FetchCORSUtility.js';
import BrowserFrameURL from '../browser/utilities/BrowserFrameURL.js';
import { URL } from 'url';
import * as PropertySymbol from '../PropertySymbol.js';
/**
* Window page open handler.
*/
export default class WindowPageOpenUtility {
/**
* Opens a page.
*
* @param browserFrame Browser frame.
* @param [options] Options.
* @param [options.url] URL.
* @param [options.target] Target.
* @param [options.features] Window features.
*/
static openPage(browserFrame, options) {
const features = this.getWindowFeatures(options?.features || '');
const target = options?.target !== undefined ? String(options.target) : null;
const originURL = new URL(browserFrame.window.location.href);
const targetURL = BrowserFrameURL.getRelativeURL(browserFrame, options.url);
const oldWindow = browserFrame.window;
let targetFrame;
if (browserFrame.window !== oldWindow) {
return null;
}
switch (target) {
case '_self':
targetFrame = browserFrame;
break;
case '_top':
targetFrame = browserFrame.page.mainFrame;
break;
case '_parent':
targetFrame = browserFrame.parentFrame ?? browserFrame;
break;
case '_blank':
default:
const newPage = browserFrame.page.context.newPage();
targetFrame = newPage.mainFrame;
targetFrame[PropertySymbol.openerFrame] = browserFrame;
break;
}
targetFrame
.goto(targetURL.href, {
referrer: features.noreferrer ? undefined : browserFrame.window.location.origin,
referrerPolicy: features.noreferrer ? 'no-referrer' : undefined
})
.catch((error) => {
if (targetFrame.page?.console) {
targetFrame.page.console.error(error);
}
else {
throw error;
}
});
if (targetURL.protocol === 'javascript:') {
return targetFrame.window;
}
// When using a detached Window instance directly and not via the Browser API we will not navigate and the window for the frame will not have changed.
if (targetFrame === browserFrame && browserFrame.window === oldWindow) {
return null;
}
if (features.popup && target !== '_self' && target !== '_top' && target !== '_parent') {
targetFrame[PropertySymbol.popup] = true;
if (features?.width || features?.height) {
targetFrame.page.setViewport({
width: features?.width,
height: features?.height
});
}
if (features?.left) {
targetFrame.window.screenLeft = features.left;
targetFrame.window.screenX = features.left;
}
if (features?.top) {
targetFrame.window.screenTop = features.top;
targetFrame.window.screenY = features.top;
}
}
if (target &&
target !== '_self' &&
target !== '_top' &&
target !== '_parent' &&
target !== '_blank') {
targetFrame.window.name = target;
}
const isCORS = FetchCORSUtility.isCORS(originURL, targetFrame.url);
if (!features.noopener &&
!features.noreferrer &&
browserFrame.window &&
targetFrame[PropertySymbol.openerFrame] &&
targetFrame.window !== browserFrame.window) {
targetFrame[PropertySymbol.openerWindow] = isCORS
? new CrossOriginBrowserWindow(browserFrame.window)
: browserFrame.window;
}
if (features.noopener || features.noreferrer) {
return null;
}
if (isCORS) {
return new CrossOriginBrowserWindow(targetFrame.window, browserFrame.window);
}
return targetFrame.window;
}
/**
* Returns window features.
*
* @param features Window features string.
* @returns Window features.
*/
static getWindowFeatures(features) {
const parts = features.split(',');
const result = {
popup: false,
width: 0,
height: 0,
left: 0,
top: 0,
noopener: false,
noreferrer: false
};
for (const part of parts) {
const [key, value] = part.split('=');
switch (key) {
case 'popup':
result.popup = !value || value === 'yes' || value === '1' || value === 'true';
break;
case 'width':
case 'innerWidth':
result.width = parseInt(value, 10);
break;
case 'height':
case 'innerHeight':
result.height = parseInt(value, 10);
break;
case 'left':
case 'screenX':
result.left = parseInt(value, 10);
break;
case 'top':
case 'screenY':
result.top = parseInt(value, 10);
break;
case 'noopener':
result.noopener = true;
break;
case 'noreferrer':
result.noreferrer = true;
break;
}
}
return result;
}
}
//# sourceMappingURL=WindowPageOpenUtility.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"WindowPageOpenUtility.js","sourceRoot":"","sources":["../../src/window/WindowPageOpenUtility.ts"],"names":[],"mappings":"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"}