- 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
94 lines
2.7 KiB
JavaScript
94 lines
2.7 KiB
JavaScript
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
|