@dooboostore/dom-parser 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/cjs/DomParser.js +33 -12
  2. package/dist/cjs/DomParser.js.map +2 -2
  3. package/dist/cjs/node/DocumentBase.js +4 -0
  4. package/dist/cjs/node/DocumentBase.js.map +2 -2
  5. package/dist/cjs/node/elements/Element.js.map +1 -1
  6. package/dist/cjs/node/elements/ElementBase.js +12 -2
  7. package/dist/cjs/node/elements/ElementBase.js.map +2 -2
  8. package/dist/cjs/node/elements/HTMLElement.js.map +1 -1
  9. package/dist/cjs/node/elements/HTMLElementBase.js +154 -2
  10. package/dist/cjs/node/elements/HTMLElementBase.js.map +2 -2
  11. package/dist/cjs/window/WindowBase.js +128 -7
  12. package/dist/cjs/window/WindowBase.js.map +2 -2
  13. package/dist/esm/DomParser.js +33 -12
  14. package/dist/esm/DomParser.js.map +2 -2
  15. package/dist/esm/node/DocumentBase.js +4 -0
  16. package/dist/esm/node/DocumentBase.js.map +2 -2
  17. package/dist/esm/node/elements/ElementBase.js +12 -2
  18. package/dist/esm/node/elements/ElementBase.js.map +2 -2
  19. package/dist/esm/node/elements/HTMLElementBase.js +154 -2
  20. package/dist/esm/node/elements/HTMLElementBase.js.map +2 -2
  21. package/dist/esm/window/WindowBase.js +128 -7
  22. package/dist/esm/window/WindowBase.js.map +2 -2
  23. package/dist/esm-bundle/dooboostore-dom-parser.esm.js +504 -195
  24. package/dist/esm-bundle/dooboostore-dom-parser.esm.js.map +3 -3
  25. package/dist/types/DomParser.d.ts +4 -0
  26. package/dist/types/DomParser.d.ts.map +1 -1
  27. package/dist/types/node/DocumentBase.d.ts +2 -0
  28. package/dist/types/node/DocumentBase.d.ts.map +1 -1
  29. package/dist/types/node/elements/Element.d.ts +1 -0
  30. package/dist/types/node/elements/Element.d.ts.map +1 -1
  31. package/dist/types/node/elements/ElementBase.d.ts +2 -2
  32. package/dist/types/node/elements/ElementBase.d.ts.map +1 -1
  33. package/dist/types/node/elements/HTMLElement.d.ts +32 -1
  34. package/dist/types/node/elements/HTMLElement.d.ts.map +1 -1
  35. package/dist/types/node/elements/HTMLElementBase.d.ts +11 -2
  36. package/dist/types/node/elements/HTMLElementBase.d.ts.map +1 -1
  37. package/dist/types/window/WindowBase.d.ts +12 -2
  38. package/dist/types/window/WindowBase.d.ts.map +1 -1
  39. package/dist/umd-bundle/dooboostore-dom-parser.umd.js +504 -195
  40. package/dist/umd-bundle/dooboostore-dom-parser.umd.js.map +3 -3
  41. package/package.json +1 -1
  42. package/src/DomParser.ts +457 -436
  43. package/src/node/DocumentBase.ts +7 -2
  44. package/src/node/elements/Element.ts +24 -23
  45. package/src/node/elements/ElementBase.ts +50 -41
  46. package/src/node/elements/HTMLElement.ts +36 -1
  47. package/src/node/elements/HTMLElementBase.ts +191 -5
  48. package/src/window/WindowBase.ts +1128 -919
@@ -298,10 +298,14 @@ class NavigatorBase {
298
298
  }
299
299
  }
300
300
  class WindowBase {
301
- constructor(document, initialUrl) {
301
+ constructor(config) {
302
302
  // Event system
303
303
  this._eventListeners = [];
304
- this.closed = false;
304
+ // Timers and intervals tracking
305
+ this._timers = /* @__PURE__ */ new Set();
306
+ this._intervals = /* @__PURE__ */ new Set();
307
+ this._animationFrames = /* @__PURE__ */ new Set();
308
+ this._closed = false;
305
309
  this.cookieStore = {};
306
310
  this.customElements = {};
307
311
  this.devicePixelRatio = 1;
@@ -526,11 +530,13 @@ class WindowBase {
526
530
  this.performance = {};
527
531
  // WindowSessionStorage
528
532
  this.sessionStorage = {};
529
- this.document = document || new import_DocumentBase.DocumentBase();
533
+ const documentBase = new import_DocumentBase.DocumentBase();
530
534
  if (this.document && this.document.setWindow) {
531
535
  this.document.setWindow(this);
532
536
  }
533
- this._location = new LocationBase(initialUrl);
537
+ this._location = new LocationBase(config?.initialUrl);
538
+ documentBase.setLocation(this._location);
539
+ this.document = documentBase;
534
540
  this.history = new HistoryBase(this);
535
541
  this.navigator = new NavigatorBase();
536
542
  this.clientInformation = this.navigator;
@@ -573,6 +579,9 @@ class WindowBase {
573
579
  }
574
580
  });
575
581
  }
582
+ get closed() {
583
+ return this._closed;
584
+ }
576
585
  get location() {
577
586
  return this._location;
578
587
  }
@@ -593,6 +602,103 @@ class WindowBase {
593
602
  captureEvents() {
594
603
  }
595
604
  close() {
605
+ if (this._closed) return;
606
+ this._closed = true;
607
+ this._timers.forEach((id) => clearTimeout(id));
608
+ this._timers.clear();
609
+ this._intervals.forEach((id) => clearInterval(id));
610
+ this._intervals.clear();
611
+ this._animationFrames.forEach((id) => clearTimeout(id));
612
+ this._animationFrames.clear();
613
+ this._eventListeners.forEach((listener) => {
614
+ listener.listener = null;
615
+ });
616
+ this._eventListeners.length = 0;
617
+ this.onload = null;
618
+ this.onunload = null;
619
+ this.onbeforeunload = null;
620
+ this.onpopstate = null;
621
+ this.onerror = null;
622
+ this.onmessage = null;
623
+ this.onhashchange = null;
624
+ if (this.document) {
625
+ const doc = this.document;
626
+ if (doc.body) {
627
+ this.clearNodeRecursively(doc.body);
628
+ }
629
+ if (doc.head) {
630
+ this.clearNodeRecursively(doc.head);
631
+ }
632
+ if (doc.documentElement) {
633
+ this.clearNodeRecursively(doc.documentElement);
634
+ }
635
+ if (doc.setWindow) {
636
+ doc.setWindow(null);
637
+ }
638
+ if (doc._eventListeners) {
639
+ doc._eventListeners.forEach((listener) => {
640
+ listener.listener = null;
641
+ });
642
+ doc._eventListeners.length = 0;
643
+ }
644
+ }
645
+ if (this.history) {
646
+ const hist = this.history;
647
+ if (hist.historyStack) {
648
+ hist.historyStack.forEach((entry) => {
649
+ entry.state = null;
650
+ });
651
+ hist.historyStack.length = 0;
652
+ }
653
+ hist.state = null;
654
+ hist.window = null;
655
+ }
656
+ if (this._location) {
657
+ this._location.urlChangeCallback = null;
658
+ }
659
+ }
660
+ /**
661
+ * Recursively clear a node and its children to prevent memory leaks
662
+ */
663
+ clearNodeRecursively(node) {
664
+ if (!node) return;
665
+ while (node.firstChild) {
666
+ const child = node.firstChild;
667
+ node.removeChild(child);
668
+ this.clearNodeRecursively(child);
669
+ }
670
+ if (node._eventListeners) {
671
+ node._eventListeners.forEach((listener) => {
672
+ listener.listener = null;
673
+ });
674
+ node._eventListeners.length = 0;
675
+ }
676
+ try {
677
+ if (node.parentNode) {
678
+ node.parentNode = null;
679
+ }
680
+ } catch (e) {
681
+ }
682
+ try {
683
+ if (node.ownerDocument) {
684
+ node.ownerDocument = null;
685
+ }
686
+ } catch (e) {
687
+ }
688
+ if (node._childNodes) {
689
+ if (Array.isArray(node._childNodes)) {
690
+ node._childNodes = [];
691
+ } else if (node._childNodes instanceof Map) {
692
+ node._childNodes.clear();
693
+ }
694
+ }
695
+ if (node._attributes) {
696
+ if (Array.isArray(node._attributes)) {
697
+ node._attributes = [];
698
+ } else if (node._attributes instanceof Map) {
699
+ node._attributes.clear();
700
+ }
701
+ }
596
702
  }
597
703
  confirm(message) {
598
704
  return false;
@@ -641,23 +747,38 @@ class WindowBase {
641
747
  }
642
748
  // Timer methods
643
749
  setTimeout(callback, delay, ...args) {
644
- return setTimeout(callback, delay, ...args);
750
+ if (this._closed) return 0;
751
+ const id = setTimeout(() => {
752
+ this._timers.delete(id);
753
+ callback(...args);
754
+ }, delay);
755
+ this._timers.add(id);
756
+ return id;
645
757
  }
646
758
  clearTimeout(id) {
647
759
  clearTimeout(id);
760
+ this._timers.delete(id);
648
761
  }
649
762
  setInterval(callback, delay, ...args) {
650
- return setInterval(callback, delay, ...args);
763
+ if (this._closed) return 0;
764
+ const id = setInterval(callback, delay, ...args);
765
+ this._intervals.add(id);
766
+ return id;
651
767
  }
652
768
  clearInterval(id) {
653
769
  clearInterval(id);
770
+ this._intervals.delete(id);
654
771
  }
655
772
  // Animation methods
656
773
  requestAnimationFrame(callback) {
657
- return this.setTimeout(callback, 16);
774
+ if (this._closed) return 0;
775
+ const id = this.setTimeout(callback, 16);
776
+ this._animationFrames.add(id);
777
+ return id;
658
778
  }
659
779
  cancelAnimationFrame(id) {
660
780
  this.clearTimeout(id);
781
+ this._animationFrames.delete(id);
661
782
  }
662
783
  addEventListener(type, listener, options) {
663
784
  if (type === "popstate" || type === "load" || type === "unload" || type === "beforeunload") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/window/WindowBase.ts"],
4
- "sourcesContent": ["import { Window, Location, History, Navigator } from './Window';\nimport { Document } from '../node/Document';\nimport { DocumentBase } from '../node/DocumentBase';\nimport { NodeBase } from '../node/NodeBase';\nimport { ElementBase } from '../node/elements/ElementBase';\n\n// Import all element classes\nimport { HTMLAnchorElement } from '../node/elements/HTMLAnchorElement';\nimport { HTMLBodyElement } from '../node/elements/HTMLBodyElement';\nimport { HTMLButtonElement } from '../node/elements/HTMLButtonElement';\nimport { HTMLCanvasElement } from '../node/elements/HTMLCanvasElement';\nimport { HTMLDivElement } from '../node/elements/HTMLDivElement';\nimport { HTMLH1Element } from '../node/elements/HTMLH1Element';\nimport { HTMLHeadElement } from '../node/elements/HTMLHeadElement';\nimport { HTMLHtmlElement } from '../node/elements/HTMLHtmlElement';\nimport { HTMLImgElement } from '../node/elements/HTMLImgElement';\nimport { HTMLInputElement } from '../node/elements/HTMLInputElement';\nimport { HTMLPElement } from '../node/elements/HTMLPElement';\nimport { HTMLSpanElement } from '../node/elements/HTMLSpanElement';\nimport { HTMLTitleElement } from '../node/elements/HTMLTitleElement';\nimport { HTMLLinkElement } from '../node/elements/HTMLLinkElement';\nimport { HTMLScriptElement } from '../node/elements/HTMLScriptElement';\nimport { HTMLStyleElement } from '../node/elements/HTMLStyleElement';\nimport { HTMLFormElement } from '../node/elements/HTMLFormElement';\nimport { HTMLTableElement } from '../node/elements/HTMLTableElement';\nimport { HTMLUListElement } from '../node/elements/HTMLUListElement';\nimport { HTMLOListElement } from '../node/elements/HTMLOListElement';\nimport { HTMLLIElement } from '../node/elements/HTMLLIElement';\nimport { HTMLMetaElement } from '../node/elements/HTMLMetaElement';\nimport { HTMLTemplateElement } from '../node/elements/HTMLTemplateElement';\nimport { HTMLTheadElement } from '../node/elements/HTMLTheadElement';\nimport { HTMLTfootElement } from '../node/elements/HTMLTfootElement';\nimport { HTMLTrElement } from '../node/elements/HTMLTrElement';\nimport { HTMLTdElement } from '../node/elements/HTMLTdElement';\nimport { HTMLThElement } from '../node/elements/HTMLThElement';\nimport { HTMLCaptionElement } from '../node/elements/HTMLCaptionElement';\nimport { HTMLTbodyElement } from '../node/elements/HTMLTbodyElement';\n\nclass LocationBase implements Location {\n private _href: string = 'about:blank';\n private _protocol: string = 'about:';\n private _host: string = '';\n private _hostname: string = '';\n private _port: string = '';\n private _pathname: string = 'blank';\n private _search: string = '';\n private _hash: string = '';\n private _origin: string = 'null';\n private urlChangeCallback?: (url: string) => void;\n\n constructor(initialUrl: string = 'about:blank', urlChangeCallback?: (url: string) => void) {\n this.urlChangeCallback = urlChangeCallback;\n this.parseUrl(initialUrl);\n }\n\n get href(): string {\n return this._href;\n }\n\n set href(url: string) {\n const oldHref = this._href;\n this.parseUrl(url);\n\n // Call URL change callback if URL actually changed\n if (this._href !== oldHref && this.urlChangeCallback) {\n this.urlChangeCallback(this._href);\n }\n }\n\n get protocol(): string {\n return this._protocol;\n }\n\n set protocol(value: string) {\n if (!value.endsWith(':')) {\n value += ':';\n }\n this._protocol = value;\n this.reconstructUrl();\n }\n\n get host(): string {\n return this._host;\n }\n\n set host(value: string) {\n this._host = value;\n // Parse hostname and port from host\n const colonIndex = value.lastIndexOf(':');\n if (colonIndex !== -1 && colonIndex > value.lastIndexOf(']')) {\n // IPv6 addresses are enclosed in brackets, so check if colon is after the closing bracket\n this._hostname = value.substring(0, colonIndex);\n this._port = value.substring(colonIndex + 1);\n } else {\n this._hostname = value;\n this._port = '';\n }\n this.reconstructUrl();\n }\n\n get hostname(): string {\n return this._hostname;\n }\n\n set hostname(value: string) {\n this._hostname = value;\n this._host = this._port ? `${value}:${this._port}` : value;\n this.reconstructUrl();\n }\n\n get port(): string {\n return this._port;\n }\n\n set port(value: string) {\n this._port = value;\n this._host = value ? `${this._hostname}:${value}` : this._hostname;\n this.reconstructUrl();\n }\n\n get pathname(): string {\n return this._pathname;\n }\n\n set pathname(value: string) {\n if (!value.startsWith('/')) {\n value = '/' + value;\n }\n this._pathname = value;\n this.reconstructUrl();\n }\n\n get search(): string {\n return this._search;\n }\n\n set search(value: string) {\n if (value && !value.startsWith('?')) {\n value = '?' + value;\n }\n this._search = value;\n this.reconstructUrl();\n }\n\n get hash(): string {\n return this._hash;\n }\n\n set hash(value: string) {\n if (value && !value.startsWith('#')) {\n value = '#' + value;\n }\n this._hash = value;\n this.reconstructUrl();\n }\n\n get origin(): string {\n return this._origin;\n }\n\n assign(url: string): void {\n const oldHref = this._href;\n this.parseUrl(url);\n\n // Call URL change callback if URL actually changed\n if (this._href !== oldHref && this.urlChangeCallback) {\n this.urlChangeCallback(this._href);\n }\n }\n\n replace(url: string): void {\n const oldHref = this._href;\n this.parseUrl(url);\n\n // Call URL change callback if URL actually changed\n if (this._href !== oldHref && this.urlChangeCallback) {\n this.urlChangeCallback(this._href);\n }\n }\n\n reload(forcedReload?: boolean): void {\n // No-op in server-side environment\n // In a real browser, this would reload the page\n }\n\n toString(): string {\n return this._href;\n }\n\n private parseUrl(url: string): void {\n try {\n // Handle relative URLs by creating a base URL\n let parsedUrl: URL;\n\n if (url.startsWith('//')) {\n // Protocol-relative URL\n parsedUrl = new URL(this._protocol + url);\n } else if (url.startsWith('/')) {\n // Absolute path\n parsedUrl = new URL(url, `${this._protocol}//${this._host}`);\n } else if (url.includes('://')) {\n // Absolute URL\n parsedUrl = new URL(url);\n } else {\n // Relative URL\n const base = `${this._protocol}//${this._host}${this._pathname}`;\n parsedUrl = new URL(url, base);\n }\n\n this._href = parsedUrl.href;\n this._protocol = parsedUrl.protocol;\n this._host = parsedUrl.host;\n this._hostname = parsedUrl.hostname;\n this._port = parsedUrl.port;\n this._pathname = parsedUrl.pathname;\n this._search = parsedUrl.search;\n this._hash = parsedUrl.hash;\n this._origin = parsedUrl.origin;\n } catch (e) {\n // Invalid URL, handle special cases\n if (url === 'about:blank') {\n this._href = 'about:blank';\n this._protocol = 'about:';\n this._host = '';\n this._hostname = '';\n this._port = '';\n this._pathname = 'blank';\n this._search = '';\n this._hash = '';\n this._origin = 'null';\n }\n // For other invalid URLs, keep current values\n }\n }\n\n private reconstructUrl(): void {\n try {\n // Reconstruct the URL from components\n let url = this._protocol;\n\n if (this._protocol !== 'about:' && this._protocol !== 'data:') {\n url += '//';\n if (this._host) {\n url += this._host;\n }\n }\n\n url += this._pathname;\n url += this._search;\n url += this._hash;\n\n // Validate the reconstructed URL\n const testUrl = new URL(url);\n this._href = testUrl.href;\n this._origin = testUrl.origin;\n } catch (e) {\n // If reconstruction fails, keep the current href\n }\n }\n}\n\nclass HistoryBase implements History {\n length: number = 1;\n state: any = null;\n private window: WindowBase;\n private historyStack: Array<{ state: any; title: string; url?: string }> = [];\n private currentIndex: number = -1;\n\n constructor(window: WindowBase) {\n this.window = window;\n }\n\n back(): void {\n this.go(-1);\n }\n\n forward(): void {\n this.go(1);\n }\n\n go(delta?: number): void {\n if (!delta || this.historyStack.length === 0) return;\n\n const newIndex = this.currentIndex + delta;\n if (newIndex >= 0 && newIndex < this.historyStack.length) {\n this.currentIndex = newIndex;\n const entry = this.historyStack[this.currentIndex];\n this.state = entry.state;\n\n // Update location if URL is provided\n if (entry.url && this.window.location) {\n (this.window.location as any)._href = entry.url;\n (this.window.location as any).parseUrl(entry.url);\n }\n\n // Dispatch popstate event\n (this.window as any).dispatchPopStateEvent(entry.state, entry.url);\n }\n }\n\n pushState(data: any, title: string, url?: string): void {\n // Remove any forward history when pushing new state\n this.historyStack = this.historyStack.slice(0, this.currentIndex + 1);\n\n // Add new state\n this.historyStack.push({ state: data, title, url });\n this.currentIndex = this.historyStack.length - 1;\n this.state = data;\n this.length = this.historyStack.length;\n\n // Update location if URL is provided\n if (url && this.window.location) {\n const oldHref = (this.window.location as any)._href;\n (this.window.location as any)._href = url;\n (this.window.location as any).parseUrl(url);\n\n // Trigger URL change callback for dynamic HTML loading\n if (url !== oldHref && (this.window.location as any).urlChangeCallback) {\n (this.window.location as any).urlChangeCallback(url);\n }\n }\n\n // Note: pushState does NOT dispatch popstate event (per HTML spec)\n }\n\n replaceState(data: any, title: string, url?: string): void {\n if (this.currentIndex >= 0 && this.currentIndex < this.historyStack.length) {\n // Replace current state\n this.historyStack[this.currentIndex] = { state: data, title, url };\n } else {\n // No current state, create one\n this.historyStack = [{ state: data, title, url }];\n this.currentIndex = 0;\n this.length = 1;\n }\n\n this.state = data;\n\n // Update location if URL is provided\n if (url && this.window.location) {\n const oldHref = (this.window.location as any)._href;\n (this.window.location as any)._href = url;\n (this.window.location as any).parseUrl(url);\n\n // Trigger URL change callback for dynamic HTML loading\n if (url !== oldHref && (this.window.location as any).urlChangeCallback) {\n (this.window.location as any).urlChangeCallback(url);\n }\n }\n\n // Note: replaceState does NOT dispatch popstate event (per HTML spec)\n }\n}\n\nclass NavigatorBase implements Navigator {\n userAgent: string = 'Mozilla/5.0 (Server-Side Rendering)';\n language: string = 'en-US';\n languages: readonly string[] = ['en-US', 'en'];\n platform: string = 'Server';\n cookieEnabled: boolean = false;\n onLine: boolean = true;\n}\n\n// Simple event system for WindowBase\ninterface EventListener {\n type: string;\n listener: (event: any) => void;\n options?: boolean | AddEventListenerOptions;\n}\n\ninterface PopStateEvent {\n type: 'popstate';\n state: any;\n url?: string;\n}\n\nexport class WindowBase {\n // Suppress type errors for complex event handler types\n [key: string]: any;\n\n // Event system\n private _eventListeners: EventListener[] = [];\n // Properties\n readonly clientInformation: Navigator;\n readonly closed: boolean = false;\n readonly cookieStore: CookieStore = {} as CookieStore;\n readonly customElements: CustomElementRegistry = {} as CustomElementRegistry;\n readonly devicePixelRatio: number = 1;\n readonly document: Document;\n readonly event: Event | undefined = undefined;\n readonly external: External = {} as External;\n readonly frameElement: Element | null = null;\n readonly frames: WindowProxy = {} as WindowProxy;\n readonly history: History;\n readonly innerHeight: number = 768;\n readonly innerWidth: number = 1024;\n readonly length: number = 0;\n readonly locationbar: BarProp = {} as BarProp;\n readonly menubar: BarProp = {} as BarProp;\n name: string = '';\n readonly navigator: Navigator;\n ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null = null;\n ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;\n ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;\n onorientationchange: ((this: Window, ev: Event) => any) | null = null;\n opener: any = null;\n readonly orientation: number = 0;\n readonly originAgentCluster: boolean = false;\n readonly outerHeight: number = 768;\n readonly outerWidth: number = 1024;\n readonly pageXOffset: number = 0;\n readonly pageYOffset: number = 0;\n readonly parent: WindowProxy = {} as WindowProxy;\n readonly personalbar: BarProp = {} as BarProp;\n readonly screen: Screen = {} as Screen;\n readonly screenLeft: number = 0;\n readonly screenTop: number = 0;\n readonly screenX: number = 0;\n readonly screenY: number = 0;\n readonly scrollX: number = 0;\n readonly scrollY: number = 0;\n readonly scrollbars: BarProp = {} as BarProp;\n readonly self: Window & typeof globalThis = this as any;\n readonly speechSynthesis: SpeechSynthesis = {} as SpeechSynthesis;\n status: string = '';\n readonly statusbar: BarProp = {} as BarProp;\n readonly toolbar: BarProp = {} as BarProp;\n readonly top: WindowProxy | null = null;\n readonly visualViewport: VisualViewport | null = null;\n readonly window: Window & typeof globalThis = this as any;\n\n // Location property with getter/setter\n private _location: Location;\n get location(): Location {\n return this._location;\n }\n set location(href: string | Location) {\n if (typeof href === 'string') {\n this._location.href = href;\n } else {\n this._location.href = href.href;\n }\n }\n\n // Global constructors\n Node = NodeBase;\n Element = ElementBase;\n HTMLElement = ElementBase;\n Event = class Event { };\n PopStateEvent = class PopStateEvent extends this.Event { };\n IntersectionObserver = class IntersectionObserver { };\n NodeFilter = class NodeFilter { };\n DocumentFragment = class DocumentFragment { };\n HTMLMetaElement = HTMLMetaElement;\n HTMLCanvasElement = HTMLCanvasElement;\n CanvasRenderingContext2D = class CanvasRenderingContext2D { };\n CanvasPattern = class CanvasPattern { };\n CanvasGradient = class CanvasGradient { };\n Path2D = class Path2D { };\n ImageData = class ImageData { };\n\n // HTML element constructors\n HTMLAnchorElement = HTMLAnchorElement;\n HTMLBodyElement = HTMLBodyElement;\n HTMLButtonElement = HTMLButtonElement;\n HTMLDivElement = HTMLDivElement;\n HTMLH1Element = HTMLH1Element;\n HTMLHeadElement = HTMLHeadElement;\n HTMLHtmlElement = HTMLHtmlElement;\n HTMLImgElement = HTMLImgElement;\n HTMLInputElement = HTMLInputElement;\n HTMLPElement = HTMLPElement;\n HTMLSpanElement = HTMLSpanElement;\n HTMLTitleElement = HTMLTitleElement;\n HTMLLinkElement = HTMLLinkElement;\n HTMLScriptElement = HTMLScriptElement;\n HTMLStyleElement = HTMLStyleElement;\n HTMLFormElement = HTMLFormElement;\n HTMLTableElement = HTMLTableElement;\n HTMLUListElement = HTMLUListElement;\n HTMLOListElement = HTMLOListElement;\n HTMLLIElement = HTMLLIElement;\n HTMLTemplateElement = HTMLTemplateElement;\n HTMLTheadElement = HTMLTheadElement;\n HTMLTfootElement = HTMLTfootElement;\n HTMLTrElement = HTMLTrElement;\n HTMLTdElement = HTMLTdElement;\n HTMLThElement = HTMLThElement;\n HTMLCaptionElement = HTMLCaptionElement;\n HTMLTbodyElement = HTMLTbodyElement;\n\n constructor(document?: Document, initialUrl?: string) {\n this.document = document || new DocumentBase();\n \n // Set window reference in document for load event\n if (this.document && (this.document as any).setWindow) {\n (this.document as any).setWindow(this);\n }\n \n this._location = new LocationBase(initialUrl);\n this.history = new HistoryBase(this);\n this.navigator = new NavigatorBase();\n this.clientInformation = this.navigator;\n\n // Return a Proxy to handle the [index: number]: Window signature\n return new Proxy(this, {\n get(target: WindowBase, prop: string | symbol): any {\n // Handle numeric indices - return the window itself\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return target;\n }\n // Return the actual property\n return (target as any)[prop];\n },\n\n set(target: WindowBase, prop: string | symbol, value: any): boolean {\n // Handle numeric indices - ignore setting\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return true;\n }\n // Set the actual property\n (target as any)[prop] = value;\n return true;\n },\n\n has(target: WindowBase, prop: string | symbol): boolean {\n // Handle numeric indices\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return true;\n }\n // Check if property exists\n return prop in target;\n },\n\n ownKeys(target: WindowBase): ArrayLike<string | symbol> {\n // Get all own keys plus numeric indices for length\n const keys = Object.getOwnPropertyNames(target);\n // Add numeric indices based on length property\n for (let i = 0; i < target.length; i++) {\n keys.push(i.toString());\n }\n return keys;\n },\n\n getOwnPropertyDescriptor(target: WindowBase, prop: string | symbol): PropertyDescriptor | undefined {\n // Handle numeric indices\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return {\n enumerable: true,\n configurable: true,\n value: target\n };\n }\n // Return actual property descriptor\n return Object.getOwnPropertyDescriptor(target, prop);\n }\n });\n }\n\n // Window methods - all with empty implementations for server-side\n alert(message?: any): void { }\n\n blur(): void { }\n\n cancelIdleCallback(handle: number): void { }\n\n captureEvents(): void { }\n\n close(): void { }\n\n confirm(message?: string): boolean {\n return false;\n }\n\n focus(): void { }\n\n getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration {\n return {} as CSSStyleDeclaration;\n }\n\n getSelection(): Selection | null {\n return null;\n }\n\n matchMedia(query: string): MediaQueryList {\n return {} as MediaQueryList;\n }\n\n moveBy(x: number, y: number): void { }\n\n moveTo(x: number, y: number): void { }\n\n open(url?: string | URL, target?: string, features?: string): WindowProxy | null {\n return null;\n }\n\n postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;\n postMessage(message: any, options?: WindowPostMessageOptions): void;\n postMessage(message: any, targetOriginOrOptions?: string | WindowPostMessageOptions, transfer?: Transferable[]): void { }\n\n print(): void { }\n\n prompt(message?: string, _default?: string): string | null {\n return null;\n }\n\n releaseEvents(): void { }\n\n requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number {\n return 0;\n }\n\n resizeBy(x: number, y: number): void { }\n\n resizeTo(width: number, height: number): void { }\n\n scroll(options?: ScrollToOptions): void;\n scroll(x: number, y: number): void;\n scroll(optionsOrX?: ScrollToOptions | number, y?: number): void { }\n\n scrollBy(options?: ScrollToOptions): void;\n scrollBy(x: number, y: number): void;\n scrollBy(optionsOrX?: ScrollToOptions | number, y?: number): void { }\n\n scrollTo(options?: ScrollToOptions): void;\n scrollTo(x: number, y: number): void;\n scrollTo(optionsOrX?: ScrollToOptions | number, y?: number): void { }\n\n stop(): void { }\n\n // Timer methods\n setTimeout(callback: Function, delay?: number, ...args: any[]): number {\n return setTimeout(callback, delay, ...args) as any;\n }\n\n clearTimeout(id: number): void {\n clearTimeout(id);\n }\n\n setInterval(callback: Function, delay?: number, ...args: any[]): number {\n return setInterval(callback, delay, ...args) as any;\n }\n\n clearInterval(id: number): void {\n clearInterval(id);\n }\n\n // Animation methods\n requestAnimationFrame(callback: FrameRequestCallback): number {\n return this.setTimeout(callback, 16) as number;\n }\n\n cancelAnimationFrame(id: number): void {\n this.clearTimeout(id);\n }\n\n // Event methods\n addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;\n addEventListener(type: any, listener: any, options?: any): void {\n // Support popstate, load, unload, and beforeunload events\n if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {\n this._eventListeners.push({\n type,\n listener: typeof listener === 'function' ? listener : listener.handleEvent,\n options\n });\n }\n }\n\n removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;\n removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;\n removeEventListener(type: any, listener: any, options?: any): void {\n if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {\n const targetListener = typeof listener === 'function' ? listener : listener.handleEvent;\n this._eventListeners = this._eventListeners.filter(\n eventListener => !(eventListener.type === type && eventListener.listener === targetListener)\n );\n }\n }\n\n dispatchEvent(event: any): boolean {\n const eventListeners = this._eventListeners.filter(listener => listener.type === event.type);\n\n for (const eventListener of eventListeners) {\n try {\n eventListener.listener.call(this, event);\n\n // Handle 'once' option\n if (eventListener.options && typeof eventListener.options === 'object' && eventListener.options.once) {\n this.removeEventListener(event.type, eventListener.listener);\n }\n } catch (error) {\n console.error('Error in event listener:', error);\n }\n }\n\n return true;\n }\n\n /**\n * Dispatch a popstate event to registered listeners\n */\n private dispatchPopStateEvent(state: any, url?: string): void {\n const popStateEvent: PopStateEvent = {\n type: 'popstate',\n state,\n url\n };\n\n this.dispatchEvent(popStateEvent);\n }\n\n // EventTarget methods (inherited)\n // These are already covered by addEventListener/removeEventListener/dispatchEvent\n\n // GlobalEventHandlers - empty implementations\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;\n onanimationcancel: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onanimationend: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onanimationiteration: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onanimationstart: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onauxclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null = null;\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncontextmenu: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onerror: OnErrorEventHandler = null;\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null = null;\n ongotpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onlostpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onpointercancel: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerdown: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerenter: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerleave: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointermove: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerout: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerover: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent<EventTarget>) => any) | null = null;\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onsecuritypolicyviolation: ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any) | null = null;\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null = null;\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n ontoggle: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n ontouchcancel?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontouchend?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontouchmove?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontouchstart?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontransitioncancel: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n ontransitionend: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n ontransitionrun: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n ontransitionstart: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkitanimationend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkitanimationiteration: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkitanimationstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkittransitionend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null;\n\n // WindowEventHandlers - empty implementations\n onafterprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onbeforeprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onbeforeunload: ((this: WindowEventHandlers, ev: BeforeUnloadEvent) => any) | null = null;\n onhashchange: ((this: WindowEventHandlers, ev: HashChangeEvent) => any) | null = null;\n onlanguagechange: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onmessage: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;\n onmessageerror: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;\n onoffline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n ononline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onpagehide: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;\n onpageshow: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;\n onpopstate: ((this: WindowEventHandlers, ev: PopStateEvent) => any) | null = null;\n onrejectionhandled: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;\n onstorage: ((this: WindowEventHandlers, ev: StorageEvent) => any) | null = null;\n onunhandledrejection: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;\n onunload: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n\n // WindowLocalStorage\n readonly localStorage: Storage = {} as Storage;\n\n // WindowOrWorkerGlobalScope - empty implementations\n readonly caches: CacheStorage = {} as CacheStorage;\n readonly crossOriginIsolated: boolean = false;\n readonly crypto: Crypto = {} as Crypto;\n readonly indexedDB: IDBFactory = {} as IDBFactory;\n readonly isSecureContext: boolean = false;\n readonly origin: string = 'null';\n readonly performance: Performance = {} as Performance;\n\n atob(data: string): string { return ''; }\n btoa(data: string): string { return ''; }\n createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n createImageBitmap(...args: any[]): Promise<ImageBitmap> { return Promise.resolve({} as ImageBitmap); }\n\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> { return Promise.resolve({} as Response); }\n queueMicrotask(callback: VoidFunction): void { }\n reportError(e: any): void { }\n structuredClone(value: any, options?: StructuredSerializeOptions): any { return value; }\n\n // WindowSessionStorage\n readonly sessionStorage: Storage = {} as Storage;\n\n // AnimationFrameProvider - already implemented above\n\n // Index signature - getter implementation\n [index: number]: Window;\n\n\n\n /**\n * Recursive HTML parsing\n */\n private parseHTMLRecursive(html: string, parent: any): void {\n let position = 0;\n\n while (position < html.length) {\n const tagStart = html.indexOf('<', position);\n\n if (tagStart === -1) {\n const remainingText = html.substring(position).trim();\n if (remainingText) {\n const textNode = this.document.createTextNode(remainingText);\n parent.appendChild(textNode);\n }\n break;\n }\n\n if (tagStart > position) {\n const textContent = html.substring(position, tagStart).trim();\n if (textContent) {\n const textNode = this.document.createTextNode(textContent);\n parent.appendChild(textNode);\n }\n }\n\n const tagEnd = html.indexOf('>', tagStart);\n if (tagEnd === -1) break;\n\n const tagContent = html.substring(tagStart + 1, tagEnd);\n\n if (tagContent.startsWith('/')) {\n position = tagEnd + 1;\n break;\n }\n\n const isSelfClosing = tagContent.endsWith('/') || this.isSelfClosingTag(tagContent.split(/\\s+/)[0]);\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent.replace('/', '') : tagContent.substring(0, spaceIndex);\n const attributes = spaceIndex === -1 ? '' : tagContent.substring(spaceIndex + 1).replace('/', '');\n\n const element = this.document.createElement(tagName.toLowerCase());\n\n if (attributes.trim()) {\n this.parseAttributes(attributes, element);\n }\n\n // Handle special HTML structure tags\n if (tagName.toLowerCase() === 'html') {\n // Replace documentElement\n (this.document as any).documentElement = element;\n this.document.appendChild(element);\n } else if (tagName.toLowerCase() === 'head') {\n (this.document as any).head = element;\n if (this.document.documentElement) {\n this.document.documentElement.appendChild(element);\n } else {\n parent.appendChild(element);\n }\n } else if (tagName.toLowerCase() === 'body') {\n (this.document as any).body = element;\n if (this.document.documentElement) {\n this.document.documentElement.appendChild(element);\n } else {\n parent.appendChild(element);\n }\n } else {\n parent.appendChild(element);\n }\n\n if (isSelfClosing) {\n position = tagEnd + 1;\n } else {\n const closingTag = `</${tagName}>`;\n const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);\n\n if (closingTagIndex !== -1) {\n const innerContent = html.substring(tagEnd + 1, closingTagIndex);\n if (innerContent.trim()) {\n this.parseHTMLRecursive(innerContent, element);\n }\n position = closingTagIndex + closingTag.length;\n } else {\n position = tagEnd + 1;\n }\n }\n }\n }\n\n private findMatchingClosingTag(html: string, startPos: number, tagName: string): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < html.length && depth > 0) {\n const nextOpen = html.indexOf(openTag, pos);\n const nextClose = html.indexOf(closeTag, pos);\n\n if (nextClose === -1) return -1;\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n depth--;\n if (depth === 0) return nextClose;\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n }\n\n private parseAttributes(attributeString: string, element: any): void {\n // Updated regex to handle hyphenated attribute names like dr-for-of, data-bind, etc.\n const attrRegex = /([\\w:-]+)(?:\\s*=\\s*(['\"])(.*?)\\2)?/g;\n let match;\n\n while ((match = attrRegex.exec(attributeString)) !== null) {\n const name = match[1];\n let value = match[3] || ''; // match[3] is the content between quotes\n element.setAttribute(name, value);\n }\n }\n\n private isSelfClosingTag(tagName: string): boolean {\n const selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n return selfClosingTags.includes(tagName.toLowerCase());\n }\n\n /**\n * Clear current document content\n */\n private clearDocumentContent(): void {\n const doc = this.document as any;\n\n // Clear head content\n if (doc.head) {\n while (doc.head.firstChild) {\n doc.head.removeChild(doc.head.firstChild);\n }\n }\n\n // Clear body content\n if (doc.body) {\n while (doc.body.firstChild) {\n doc.body.removeChild(doc.body.firstChild);\n }\n }\n }\n\n\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {Window, Location, History, Navigator} from './Window';\nimport {Document} from '../node/Document';\nimport {DocumentBase} from '../node/DocumentBase';\nimport {NodeBase} from '../node/NodeBase';\nimport {ElementBase} from '../node/elements/ElementBase';\n\n// Import all element classes\nimport {HTMLAnchorElement} from '../node/elements/HTMLAnchorElement';\nimport {HTMLBodyElement} from '../node/elements/HTMLBodyElement';\nimport {HTMLButtonElement} from '../node/elements/HTMLButtonElement';\nimport {HTMLCanvasElement} from '../node/elements/HTMLCanvasElement';\nimport {HTMLDivElement} from '../node/elements/HTMLDivElement';\nimport {HTMLH1Element} from '../node/elements/HTMLH1Element';\nimport {HTMLHeadElement} from '../node/elements/HTMLHeadElement';\nimport {HTMLHtmlElement} from '../node/elements/HTMLHtmlElement';\nimport {HTMLImgElement} from '../node/elements/HTMLImgElement';\nimport {HTMLInputElement} from '../node/elements/HTMLInputElement';\nimport {HTMLPElement} from '../node/elements/HTMLPElement';\nimport {HTMLSpanElement} from '../node/elements/HTMLSpanElement';\nimport {HTMLTitleElement} from '../node/elements/HTMLTitleElement';\nimport {HTMLLinkElement} from '../node/elements/HTMLLinkElement';\nimport {HTMLScriptElement} from '../node/elements/HTMLScriptElement';\nimport {HTMLStyleElement} from '../node/elements/HTMLStyleElement';\nimport {HTMLFormElement} from '../node/elements/HTMLFormElement';\nimport {HTMLTableElement} from '../node/elements/HTMLTableElement';\nimport {HTMLUListElement} from '../node/elements/HTMLUListElement';\nimport {HTMLOListElement} from '../node/elements/HTMLOListElement';\nimport {HTMLLIElement} from '../node/elements/HTMLLIElement';\nimport {HTMLMetaElement} from '../node/elements/HTMLMetaElement';\nimport {HTMLTemplateElement} from '../node/elements/HTMLTemplateElement';\nimport {HTMLTheadElement} from '../node/elements/HTMLTheadElement';\nimport {HTMLTfootElement} from '../node/elements/HTMLTfootElement';\nimport {HTMLTrElement} from '../node/elements/HTMLTrElement';\nimport {HTMLTdElement} from '../node/elements/HTMLTdElement';\nimport {HTMLThElement} from '../node/elements/HTMLThElement';\nimport {HTMLCaptionElement} from '../node/elements/HTMLCaptionElement';\nimport {HTMLTbodyElement} from '../node/elements/HTMLTbodyElement';\n\nclass LocationBase implements Location {\n private _href: string = 'about:blank';\n private _protocol: string = 'about:';\n private _host: string = '';\n private _hostname: string = '';\n private _port: string = '';\n private _pathname: string = 'blank';\n private _search: string = '';\n private _hash: string = '';\n private _origin: string = 'null';\n private urlChangeCallback?: (url: string) => void;\n\n constructor(initialUrl: string = 'about:blank', urlChangeCallback?: (url: string) => void) {\n this.urlChangeCallback = urlChangeCallback;\n this.parseUrl(initialUrl);\n }\n\n get href(): string {\n return this._href;\n }\n\n set href(url: string) {\n const oldHref = this._href;\n this.parseUrl(url);\n\n // Call URL change callback if URL actually changed\n if (this._href !== oldHref && this.urlChangeCallback) {\n this.urlChangeCallback(this._href);\n }\n }\n\n get protocol(): string {\n return this._protocol;\n }\n\n set protocol(value: string) {\n if (!value.endsWith(':')) {\n value += ':';\n }\n this._protocol = value;\n this.reconstructUrl();\n }\n\n get host(): string {\n return this._host;\n }\n\n set host(value: string) {\n this._host = value;\n // Parse hostname and port from host\n const colonIndex = value.lastIndexOf(':');\n if (colonIndex !== -1 && colonIndex > value.lastIndexOf(']')) {\n // IPv6 addresses are enclosed in brackets, so check if colon is after the closing bracket\n this._hostname = value.substring(0, colonIndex);\n this._port = value.substring(colonIndex + 1);\n } else {\n this._hostname = value;\n this._port = '';\n }\n this.reconstructUrl();\n }\n\n get hostname(): string {\n return this._hostname;\n }\n\n set hostname(value: string) {\n this._hostname = value;\n this._host = this._port ? `${value}:${this._port}` : value;\n this.reconstructUrl();\n }\n\n get port(): string {\n return this._port;\n }\n\n set port(value: string) {\n this._port = value;\n this._host = value ? `${this._hostname}:${value}` : this._hostname;\n this.reconstructUrl();\n }\n\n get pathname(): string {\n return this._pathname;\n }\n\n set pathname(value: string) {\n if (!value.startsWith('/')) {\n value = '/' + value;\n }\n this._pathname = value;\n this.reconstructUrl();\n }\n\n get search(): string {\n return this._search;\n }\n\n set search(value: string) {\n if (value && !value.startsWith('?')) {\n value = '?' + value;\n }\n this._search = value;\n this.reconstructUrl();\n }\n\n get hash(): string {\n return this._hash;\n }\n\n set hash(value: string) {\n if (value && !value.startsWith('#')) {\n value = '#' + value;\n }\n this._hash = value;\n this.reconstructUrl();\n }\n\n get origin(): string {\n return this._origin;\n }\n\n assign(url: string): void {\n const oldHref = this._href;\n this.parseUrl(url);\n\n // Call URL change callback if URL actually changed\n if (this._href !== oldHref && this.urlChangeCallback) {\n this.urlChangeCallback(this._href);\n }\n }\n\n replace(url: string): void {\n const oldHref = this._href;\n this.parseUrl(url);\n\n // Call URL change callback if URL actually changed\n if (this._href !== oldHref && this.urlChangeCallback) {\n this.urlChangeCallback(this._href);\n }\n }\n\n reload(forcedReload?: boolean): void {\n // No-op in server-side environment\n // In a real browser, this would reload the page\n }\n\n toString(): string {\n return this._href;\n }\n\n private parseUrl(url: string): void {\n try {\n // Handle relative URLs by creating a base URL\n let parsedUrl: URL;\n\n if (url.startsWith('//')) {\n // Protocol-relative URL\n parsedUrl = new URL(this._protocol + url);\n } else if (url.startsWith('/')) {\n // Absolute path\n parsedUrl = new URL(url, `${this._protocol}//${this._host}`);\n } else if (url.includes('://')) {\n // Absolute URL\n parsedUrl = new URL(url);\n } else {\n // Relative URL\n const base = `${this._protocol}//${this._host}${this._pathname}`;\n parsedUrl = new URL(url, base);\n }\n\n this._href = parsedUrl.href;\n this._protocol = parsedUrl.protocol;\n this._host = parsedUrl.host;\n this._hostname = parsedUrl.hostname;\n this._port = parsedUrl.port;\n this._pathname = parsedUrl.pathname;\n this._search = parsedUrl.search;\n this._hash = parsedUrl.hash;\n this._origin = parsedUrl.origin;\n } catch (e) {\n // Invalid URL, handle special cases\n if (url === 'about:blank') {\n this._href = 'about:blank';\n this._protocol = 'about:';\n this._host = '';\n this._hostname = '';\n this._port = '';\n this._pathname = 'blank';\n this._search = '';\n this._hash = '';\n this._origin = 'null';\n }\n // For other invalid URLs, keep current values\n }\n }\n\n private reconstructUrl(): void {\n try {\n // Reconstruct the URL from components\n let url = this._protocol;\n\n if (this._protocol !== 'about:' && this._protocol !== 'data:') {\n url += '//';\n if (this._host) {\n url += this._host;\n }\n }\n\n url += this._pathname;\n url += this._search;\n url += this._hash;\n\n // Validate the reconstructed URL\n const testUrl = new URL(url);\n this._href = testUrl.href;\n this._origin = testUrl.origin;\n } catch (e) {\n // If reconstruction fails, keep the current href\n }\n }\n}\n\nclass HistoryBase implements History {\n length: number = 1;\n state: any = null;\n private window: WindowBase;\n private historyStack: Array<{ state: any; title: string; url?: string }> = [];\n private currentIndex: number = -1;\n\n constructor(window: WindowBase) {\n this.window = window;\n }\n\n back(): void {\n this.go(-1);\n }\n\n forward(): void {\n this.go(1);\n }\n\n go(delta?: number): void {\n if (!delta || this.historyStack.length === 0) return;\n\n const newIndex = this.currentIndex + delta;\n if (newIndex >= 0 && newIndex < this.historyStack.length) {\n this.currentIndex = newIndex;\n const entry = this.historyStack[this.currentIndex];\n this.state = entry.state;\n\n // Update location if URL is provided\n if (entry.url && this.window.location) {\n (this.window.location as any)._href = entry.url;\n (this.window.location as any).parseUrl(entry.url);\n }\n\n // Dispatch popstate event\n (this.window as any).dispatchPopStateEvent(entry.state, entry.url);\n }\n }\n\n pushState(data: any, title: string, url?: string): void {\n // Remove any forward history when pushing new state\n this.historyStack = this.historyStack.slice(0, this.currentIndex + 1);\n\n // Add new state\n this.historyStack.push({state: data, title, url});\n this.currentIndex = this.historyStack.length - 1;\n this.state = data;\n this.length = this.historyStack.length;\n\n // Update location if URL is provided\n if (url && this.window.location) {\n const oldHref = (this.window.location as any)._href;\n (this.window.location as any)._href = url;\n (this.window.location as any).parseUrl(url);\n\n // Trigger URL change callback for dynamic HTML loading\n if (url !== oldHref && (this.window.location as any).urlChangeCallback) {\n (this.window.location as any).urlChangeCallback(url);\n }\n }\n\n // Note: pushState does NOT dispatch popstate event (per HTML spec)\n }\n\n replaceState(data: any, title: string, url?: string): void {\n if (this.currentIndex >= 0 && this.currentIndex < this.historyStack.length) {\n // Replace current state\n this.historyStack[this.currentIndex] = {state: data, title, url};\n } else {\n // No current state, create one\n this.historyStack = [{state: data, title, url}];\n this.currentIndex = 0;\n this.length = 1;\n }\n\n this.state = data;\n\n // Update location if URL is provided\n if (url && this.window.location) {\n const oldHref = (this.window.location as any)._href;\n (this.window.location as any)._href = url;\n (this.window.location as any).parseUrl(url);\n\n // Trigger URL change callback for dynamic HTML loading\n if (url !== oldHref && (this.window.location as any).urlChangeCallback) {\n (this.window.location as any).urlChangeCallback(url);\n }\n }\n\n // Note: replaceState does NOT dispatch popstate event (per HTML spec)\n }\n}\n\nclass NavigatorBase implements Navigator {\n userAgent: string = 'Mozilla/5.0 (Server-Side Rendering)';\n language: string = 'en-US';\n languages: readonly string[] = ['en-US', 'en'];\n platform: string = 'Server';\n cookieEnabled: boolean = false;\n onLine: boolean = true;\n}\n\n// Simple event system for WindowBase\ninterface EventListener {\n type: string;\n listener: (event: any) => void;\n options?: boolean | AddEventListenerOptions;\n}\n\ninterface PopStateEvent {\n type: 'popstate';\n state: any;\n url?: string;\n}\n\nexport class WindowBase {\n // Suppress type errors for complex event handler types\n [key: string]: any;\n\n // Event system\n private _eventListeners: EventListener[] = [];\n // Timers and intervals tracking\n private _timers: Set<number> = new Set();\n private _intervals: Set<number> = new Set();\n private _animationFrames: Set<number> = new Set();\n // Properties\n readonly clientInformation: Navigator;\n private _closed: boolean = false;\n\n get closed(): boolean {\n return this._closed;\n }\n\n readonly cookieStore: CookieStore = {} as CookieStore;\n readonly customElements: CustomElementRegistry = {} as CustomElementRegistry;\n readonly devicePixelRatio: number = 1;\n readonly document: Document;\n readonly event: Event | undefined = undefined;\n readonly external: External = {} as External;\n readonly frameElement: Element | null = null;\n readonly frames: WindowProxy = {} as WindowProxy;\n readonly history: History;\n readonly innerHeight: number = 768;\n readonly innerWidth: number = 1024;\n readonly length: number = 0;\n readonly locationbar: BarProp = {} as BarProp;\n readonly menubar: BarProp = {} as BarProp;\n name: string = '';\n readonly navigator: Navigator;\n ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null = null;\n ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;\n ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;\n onorientationchange: ((this: Window, ev: Event) => any) | null = null;\n opener: any = null;\n readonly orientation: number = 0;\n readonly originAgentCluster: boolean = false;\n readonly outerHeight: number = 768;\n readonly outerWidth: number = 1024;\n readonly pageXOffset: number = 0;\n readonly pageYOffset: number = 0;\n readonly parent: WindowProxy = {} as WindowProxy;\n readonly personalbar: BarProp = {} as BarProp;\n readonly screen: Screen = {} as Screen;\n readonly screenLeft: number = 0;\n readonly screenTop: number = 0;\n readonly screenX: number = 0;\n readonly screenY: number = 0;\n readonly scrollX: number = 0;\n readonly scrollY: number = 0;\n readonly scrollbars: BarProp = {} as BarProp;\n readonly self: Window & typeof globalThis = this as any;\n readonly speechSynthesis: SpeechSynthesis = {} as SpeechSynthesis;\n status: string = '';\n readonly statusbar: BarProp = {} as BarProp;\n readonly toolbar: BarProp = {} as BarProp;\n readonly top: WindowProxy | null = null;\n readonly visualViewport: VisualViewport | null = null;\n readonly window: Window & typeof globalThis = this as any;\n\n // Location property with getter/setter\n private _location: Location;\n get location(): Location {\n return this._location;\n }\n\n set location(href: string | Location) {\n if (typeof href === 'string') {\n this._location.href = href;\n } else {\n this._location.href = href.href;\n }\n }\n\n // Global constructors\n Node = NodeBase;\n Element = ElementBase;\n HTMLElement = ElementBase;\n Event = class Event {\n };\n PopStateEvent = class PopStateEvent extends this.Event {\n };\n IntersectionObserver = class IntersectionObserver {\n };\n NodeFilter = class NodeFilter {\n };\n DocumentFragment = class DocumentFragment {\n };\n HTMLMetaElement = HTMLMetaElement;\n HTMLCanvasElement = HTMLCanvasElement;\n CanvasRenderingContext2D = class CanvasRenderingContext2D {\n };\n CanvasPattern = class CanvasPattern {\n };\n CanvasGradient = class CanvasGradient {\n };\n Path2D = class Path2D {\n };\n ImageData = class ImageData {\n };\n\n // HTML element constructors\n HTMLAnchorElement = HTMLAnchorElement;\n HTMLBodyElement = HTMLBodyElement;\n HTMLButtonElement = HTMLButtonElement;\n HTMLDivElement = HTMLDivElement;\n HTMLH1Element = HTMLH1Element;\n HTMLHeadElement = HTMLHeadElement;\n HTMLHtmlElement = HTMLHtmlElement;\n HTMLImgElement = HTMLImgElement;\n HTMLInputElement = HTMLInputElement;\n HTMLPElement = HTMLPElement;\n HTMLSpanElement = HTMLSpanElement;\n HTMLTitleElement = HTMLTitleElement;\n HTMLLinkElement = HTMLLinkElement;\n HTMLScriptElement = HTMLScriptElement;\n HTMLStyleElement = HTMLStyleElement;\n HTMLFormElement = HTMLFormElement;\n HTMLTableElement = HTMLTableElement;\n HTMLUListElement = HTMLUListElement;\n HTMLOListElement = HTMLOListElement;\n HTMLLIElement = HTMLLIElement;\n HTMLTemplateElement = HTMLTemplateElement;\n HTMLTheadElement = HTMLTheadElement;\n HTMLTfootElement = HTMLTfootElement;\n HTMLTrElement = HTMLTrElement;\n HTMLTdElement = HTMLTdElement;\n HTMLThElement = HTMLThElement;\n HTMLCaptionElement = HTMLCaptionElement;\n HTMLTbodyElement = HTMLTbodyElement;\n\n constructor(config?: { initialUrl?: string }) {\n const documentBase = new DocumentBase();\n\n // Set window reference in document for load event\n if (this.document && (this.document as any).setWindow) {\n (this.document as any).setWindow(this);\n }\n\n this._location = new LocationBase(config?.initialUrl);\n documentBase.setLocation(this._location);\n this.document = documentBase;\n this.history = new HistoryBase(this);\n this.navigator = new NavigatorBase();\n this.clientInformation = this.navigator;\n\n // Return a Proxy to handle the [index: number]: Window signature\n return new Proxy(this, {\n get(target: WindowBase, prop: string | symbol): any {\n // Handle numeric indices - return the window itself\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return target;\n }\n // Return the actual property\n return (target as any)[prop];\n },\n\n set(target: WindowBase, prop: string | symbol, value: any): boolean {\n // Handle numeric indices - ignore setting\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return true;\n }\n // Set the actual property\n (target as any)[prop] = value;\n return true;\n },\n\n has(target: WindowBase, prop: string | symbol): boolean {\n // Handle numeric indices\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return true;\n }\n // Check if property exists\n return prop in target;\n },\n\n ownKeys(target: WindowBase): ArrayLike<string | symbol> {\n // Get all own keys plus numeric indices for length\n const keys = Object.getOwnPropertyNames(target);\n // Add numeric indices based on length property\n for (let i = 0; i < target.length; i++) {\n keys.push(i.toString());\n }\n return keys;\n },\n\n getOwnPropertyDescriptor(target: WindowBase, prop: string | symbol): PropertyDescriptor | undefined {\n // Handle numeric indices\n if (typeof prop === 'string' && /^\\d+$/.test(prop)) {\n return {\n enumerable: true,\n configurable: true,\n value: target\n };\n }\n // Return actual property descriptor\n return Object.getOwnPropertyDescriptor(target, prop);\n }\n });\n }\n\n // Window methods - all with empty implementations for server-side\n alert(message?: any): void {\n }\n\n blur(): void {\n }\n\n cancelIdleCallback(handle: number): void {\n }\n\n captureEvents(): void {\n }\n\n close(): void {\n if (this._closed) return;\n\n this._closed = true;\n\n // Clear all timers\n this._timers.forEach(id => clearTimeout(id));\n this._timers.clear();\n\n // Clear all intervals\n this._intervals.forEach(id => clearInterval(id));\n this._intervals.clear();\n\n // Clear all animation frames\n this._animationFrames.forEach(id => clearTimeout(id));\n this._animationFrames.clear();\n\n // Remove all event listeners (clear references to prevent memory leaks)\n this._eventListeners.forEach(listener => {\n // Explicitly null out the listener function reference\n (listener as any).listener = null;\n });\n this._eventListeners.length = 0;\n\n // Clear all on* event handler properties\n this.onload = null;\n this.onunload = null;\n this.onbeforeunload = null;\n this.onpopstate = null;\n this.onerror = null;\n this.onmessage = null;\n this.onhashchange = null;\n\n // Clear document references\n if (this.document) {\n const doc = this.document as any;\n\n // Clear document content recursively\n if (doc.body) {\n this.clearNodeRecursively(doc.body);\n }\n\n if (doc.head) {\n this.clearNodeRecursively(doc.head);\n }\n\n if (doc.documentElement) {\n this.clearNodeRecursively(doc.documentElement);\n }\n\n // Break circular references\n if (doc.setWindow) {\n doc.setWindow(null);\n }\n\n // Clear document event listeners\n if (doc._eventListeners) {\n doc._eventListeners.forEach((listener: any) => {\n listener.listener = null;\n });\n doc._eventListeners.length = 0;\n }\n }\n\n // Clear history\n if (this.history) {\n const hist = this.history as any;\n if (hist.historyStack) {\n hist.historyStack.forEach((entry: any) => {\n entry.state = null;\n });\n hist.historyStack.length = 0;\n }\n hist.state = null;\n hist.window = null;\n }\n\n // Clear location callback\n if (this._location) {\n (this._location as any).urlChangeCallback = null;\n }\n }\n\n /**\n * Recursively clear a node and its children to prevent memory leaks\n */\n private clearNodeRecursively(node: any): void {\n if (!node) return;\n\n // Clear children first\n while (node.firstChild) {\n const child = node.firstChild;\n node.removeChild(child);\n this.clearNodeRecursively(child);\n }\n\n // Clear event listeners on the node\n if (node._eventListeners) {\n node._eventListeners.forEach((listener: any) => {\n listener.listener = null;\n });\n node._eventListeners.length = 0;\n }\n\n // Clear node properties that might hold references (safely)\n try {\n if (node.parentNode) {\n node.parentNode = null;\n }\n } catch (e) {\n // parentNode might be read-only\n }\n\n try {\n if (node.ownerDocument) {\n node.ownerDocument = null;\n }\n } catch (e) {\n // ownerDocument might be read-only (getter-only)\n }\n\n // Clear other potential circular references\n if (node._childNodes) {\n if (Array.isArray(node._childNodes)) {\n node._childNodes = [];\n } else if (node._childNodes instanceof Map) {\n node._childNodes.clear();\n }\n }\n if (node._attributes) {\n if (Array.isArray(node._attributes)) {\n node._attributes = [];\n } else if (node._attributes instanceof Map) {\n node._attributes.clear();\n }\n }\n }\n\n confirm(message?: string): boolean {\n return false;\n }\n\n focus(): void {\n }\n\n getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration {\n return {} as CSSStyleDeclaration;\n }\n\n getSelection(): Selection | null {\n return null;\n }\n\n matchMedia(query: string): MediaQueryList {\n return {} as MediaQueryList;\n }\n\n moveBy(x: number, y: number): void {\n }\n\n moveTo(x: number, y: number): void {\n }\n\n open(url?: string | URL, target?: string, features?: string): WindowProxy | null {\n return null;\n }\n\n postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;\n postMessage(message: any, options?: WindowPostMessageOptions): void;\n postMessage(message: any, targetOriginOrOptions?: string | WindowPostMessageOptions, transfer?: Transferable[]): void {\n }\n\n print(): void {\n }\n\n prompt(message?: string, _default?: string): string | null {\n return null;\n }\n\n releaseEvents(): void {\n }\n\n requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number {\n return 0;\n }\n\n resizeBy(x: number, y: number): void {\n }\n\n resizeTo(width: number, height: number): void {\n }\n\n scroll(options?: ScrollToOptions): void;\n scroll(x: number, y: number): void;\n scroll(optionsOrX?: ScrollToOptions | number, y?: number): void {\n }\n\n scrollBy(options?: ScrollToOptions): void;\n scrollBy(x: number, y: number): void;\n scrollBy(optionsOrX?: ScrollToOptions | number, y?: number): void {\n }\n\n scrollTo(options?: ScrollToOptions): void;\n scrollTo(x: number, y: number): void;\n scrollTo(optionsOrX?: ScrollToOptions | number, y?: number): void {\n }\n\n stop(): void {\n }\n\n // Timer methods\n setTimeout(callback: Function, delay?: number, ...args: any[]): number {\n if (this._closed) return 0;\n\n const id = setTimeout(() => {\n this._timers.delete(id);\n callback(...args);\n }, delay) as any;\n\n this._timers.add(id);\n return id;\n }\n\n clearTimeout(id: number): void {\n clearTimeout(id);\n this._timers.delete(id);\n }\n\n setInterval(callback: Function, delay?: number, ...args: any[]): number {\n if (this._closed) return 0;\n\n const id = setInterval(callback, delay, ...args) as any;\n this._intervals.add(id);\n return id;\n }\n\n clearInterval(id: number): void {\n clearInterval(id);\n this._intervals.delete(id);\n }\n\n // Animation methods\n requestAnimationFrame(callback: FrameRequestCallback): number {\n if (this._closed) return 0;\n\n const id = this.setTimeout(callback, 16) as number;\n this._animationFrames.add(id);\n return id;\n }\n\n cancelAnimationFrame(id: number): void {\n this.clearTimeout(id);\n this._animationFrames.delete(id);\n }\n\n // Event methods\n addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;\n addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;\n addEventListener(type: any, listener: any, options?: any): void {\n // Support popstate, load, unload, and beforeunload events\n if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {\n this._eventListeners.push({\n type,\n listener: typeof listener === 'function' ? listener : listener.handleEvent,\n options\n });\n }\n }\n\n removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;\n removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;\n removeEventListener(type: any, listener: any, options?: any): void {\n if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {\n const targetListener = typeof listener === 'function' ? listener : listener.handleEvent;\n this._eventListeners = this._eventListeners.filter(\n eventListener => !(eventListener.type === type && eventListener.listener === targetListener)\n );\n }\n }\n\n dispatchEvent(event: any): boolean {\n const eventListeners = this._eventListeners.filter(listener => listener.type === event.type);\n\n for (const eventListener of eventListeners) {\n try {\n eventListener.listener.call(this, event);\n\n // Handle 'once' option\n if (eventListener.options && typeof eventListener.options === 'object' && eventListener.options.once) {\n this.removeEventListener(event.type, eventListener.listener);\n }\n } catch (error) {\n console.error('Error in event listener:', error);\n }\n }\n\n return true;\n }\n\n /**\n * Dispatch a popstate event to registered listeners\n */\n private dispatchPopStateEvent(state: any, url?: string): void {\n const popStateEvent: PopStateEvent = {\n type: 'popstate',\n state,\n url\n };\n\n this.dispatchEvent(popStateEvent);\n }\n\n // EventTarget methods (inherited)\n // These are already covered by addEventListener/removeEventListener/dispatchEvent\n\n // GlobalEventHandlers - empty implementations\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;\n onanimationcancel: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onanimationend: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onanimationiteration: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onanimationstart: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;\n onauxclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null = null;\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncontextmenu: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onerror: OnErrorEventHandler = null;\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null = null;\n ongotpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onlostpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onpointercancel: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerdown: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerenter: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerleave: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointermove: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerout: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerover: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent<EventTarget>) => any) | null = null;\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onsecuritypolicyviolation: ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any) | null = null;\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null = null;\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n ontoggle: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n ontouchcancel?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontouchend?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontouchmove?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontouchstart?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;\n ontransitioncancel: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n ontransitionend: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n ontransitionrun: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n ontransitionstart: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkitanimationend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkitanimationiteration: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkitanimationstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwebkittransitionend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null;\n\n // WindowEventHandlers - empty implementations\n onafterprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onbeforeprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onbeforeunload: ((this: WindowEventHandlers, ev: BeforeUnloadEvent) => any) | null = null;\n onhashchange: ((this: WindowEventHandlers, ev: HashChangeEvent) => any) | null = null;\n onlanguagechange: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onmessage: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;\n onmessageerror: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;\n onoffline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n ononline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n onpagehide: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;\n onpageshow: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;\n onpopstate: ((this: WindowEventHandlers, ev: PopStateEvent) => any) | null = null;\n onrejectionhandled: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;\n onstorage: ((this: WindowEventHandlers, ev: StorageEvent) => any) | null = null;\n onunhandledrejection: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;\n onunload: ((this: WindowEventHandlers, ev: Event) => any) | null = null;\n\n // WindowLocalStorage\n readonly localStorage: Storage = {} as Storage;\n\n // WindowOrWorkerGlobalScope - empty implementations\n readonly caches: CacheStorage = {} as CacheStorage;\n readonly crossOriginIsolated: boolean = false;\n readonly crypto: Crypto = {} as Crypto;\n readonly indexedDB: IDBFactory = {} as IDBFactory;\n readonly isSecureContext: boolean = false;\n readonly origin: string = 'null';\n readonly performance: Performance = {} as Performance;\n\n atob(data: string): string {\n return '';\n }\n\n btoa(data: string): string {\n return '';\n }\n\n createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;\n createImageBitmap(...args: any[]): Promise<ImageBitmap> {\n return Promise.resolve({} as ImageBitmap);\n }\n\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n return Promise.resolve({} as Response);\n }\n\n queueMicrotask(callback: VoidFunction): void {\n }\n\n reportError(e: any): void {\n }\n\n structuredClone(value: any, options?: StructuredSerializeOptions): any {\n return value;\n }\n\n // WindowSessionStorage\n readonly sessionStorage: Storage = {} as Storage;\n\n // AnimationFrameProvider - already implemented above\n\n // Index signature - getter implementation\n [index: number]: Window;\n\n\n /**\n * Recursive HTML parsing\n */\n private parseHTMLRecursive(html: string, parent: any): void {\n let position = 0;\n\n while (position < html.length) {\n const tagStart = html.indexOf('<', position);\n\n if (tagStart === -1) {\n const remainingText = html.substring(position).trim();\n if (remainingText) {\n const textNode = this.document.createTextNode(remainingText);\n parent.appendChild(textNode);\n }\n break;\n }\n\n if (tagStart > position) {\n const textContent = html.substring(position, tagStart).trim();\n if (textContent) {\n const textNode = this.document.createTextNode(textContent);\n parent.appendChild(textNode);\n }\n }\n\n const tagEnd = html.indexOf('>', tagStart);\n if (tagEnd === -1) break;\n\n const tagContent = html.substring(tagStart + 1, tagEnd);\n\n if (tagContent.startsWith('/')) {\n position = tagEnd + 1;\n break;\n }\n\n const isSelfClosing = tagContent.endsWith('/') || this.isSelfClosingTag(tagContent.split(/\\s+/)[0]);\n const spaceIndex = tagContent.indexOf(' ');\n const tagName = spaceIndex === -1 ? tagContent.replace('/', '') : tagContent.substring(0, spaceIndex);\n const attributes = spaceIndex === -1 ? '' : tagContent.substring(spaceIndex + 1).replace('/', '');\n\n const element = this.document.createElement(tagName.toLowerCase());\n\n if (attributes.trim()) {\n this.parseAttributes(attributes, element);\n }\n\n // Handle special HTML structure tags\n if (tagName.toLowerCase() === 'html') {\n // Replace documentElement\n (this.document as any).documentElement = element;\n this.document.appendChild(element);\n } else if (tagName.toLowerCase() === 'head') {\n (this.document as any).head = element;\n if (this.document.documentElement) {\n this.document.documentElement.appendChild(element);\n } else {\n parent.appendChild(element);\n }\n } else if (tagName.toLowerCase() === 'body') {\n (this.document as any).body = element;\n if (this.document.documentElement) {\n this.document.documentElement.appendChild(element);\n } else {\n parent.appendChild(element);\n }\n } else {\n parent.appendChild(element);\n }\n\n if (isSelfClosing) {\n position = tagEnd + 1;\n } else {\n const closingTag = `</${tagName}>`;\n const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);\n\n if (closingTagIndex !== -1) {\n const innerContent = html.substring(tagEnd + 1, closingTagIndex);\n if (innerContent.trim()) {\n this.parseHTMLRecursive(innerContent, element);\n }\n position = closingTagIndex + closingTag.length;\n } else {\n position = tagEnd + 1;\n }\n }\n }\n }\n\n private findMatchingClosingTag(html: string, startPos: number, tagName: string): number {\n const openTag = `<${tagName}`;\n const closeTag = `</${tagName}>`;\n let depth = 1;\n let pos = startPos;\n\n while (pos < html.length && depth > 0) {\n const nextOpen = html.indexOf(openTag, pos);\n const nextClose = html.indexOf(closeTag, pos);\n\n if (nextClose === -1) return -1;\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n depth++;\n pos = nextOpen + openTag.length;\n } else {\n depth--;\n if (depth === 0) return nextClose;\n pos = nextClose + closeTag.length;\n }\n }\n\n return -1;\n }\n\n private parseAttributes(attributeString: string, element: any): void {\n // Updated regex to handle hyphenated attribute names like dr-for-of, data-bind, etc.\n const attrRegex = /([\\w:-]+)(?:\\s*=\\s*(['\"])(.*?)\\2)?/g;\n let match;\n\n while ((match = attrRegex.exec(attributeString)) !== null) {\n const name = match[1];\n let value = match[3] || ''; // match[3] is the content between quotes\n element.setAttribute(name, value);\n }\n }\n\n private isSelfClosingTag(tagName: string): boolean {\n const selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];\n return selfClosingTags.includes(tagName.toLowerCase());\n }\n\n /**\n * Clear current document content\n */\n private clearDocumentContent(): void {\n const doc = this.document as any;\n\n // Clear head content\n if (doc.head) {\n while (doc.head.firstChild) {\n doc.head.removeChild(doc.head.firstChild);\n }\n }\n\n // Clear body content\n if (doc.body) {\n while (doc.body.firstChild) {\n doc.body.removeChild(doc.body.firstChild);\n }\n }\n }\n\n\n}"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,46 +1,67 @@
1
- import { DocumentBase } from "./node/DocumentBase.js";
2
1
  import { TextBase } from "./node/TextBase.js";
3
2
  import { Comment } from "./node/Comment.js";
4
3
  import { WindowBase } from "./window/WindowBase.js";
5
4
  class DomParser {
6
5
  constructor(html, option) {
7
- const document = new DocumentBase();
8
- const windowBase = new WindowBase(document, option?.href);
6
+ const windowBase = new WindowBase({ initialUrl: option?.href });
9
7
  this._window = windowBase;
10
- this._document = document;
8
+ this._document = windowBase.document;
11
9
  this.parseHTML(html);
12
10
  this.setupDocumentReferences();
13
- if (document && document.simulateLoading) {
14
- document.simulateLoading();
11
+ if (this._document && this._document.simulateLoading) {
12
+ this._document.simulateLoading();
15
13
  }
16
14
  }
17
15
  get window() {
16
+ if (!this._window) {
17
+ throw new Error("DomParser has been destroyed");
18
+ }
18
19
  return this._window;
19
20
  }
20
21
  get document() {
22
+ if (!this._document) {
23
+ throw new Error("DomParser has been destroyed");
24
+ }
21
25
  return this._document;
22
26
  }
27
+ /**
28
+ * Destroy the DomParser instance and free memory
29
+ */
30
+ destroy() {
31
+ if (this._window) {
32
+ this._window.close();
33
+ this._window = null;
34
+ }
35
+ this._document = null;
36
+ }
23
37
  /**
24
38
  * Load new HTML content and replace the current document
25
39
  */
26
40
  loadHTML(html) {
41
+ if (!this._document) {
42
+ throw new Error("DomParser has been destroyed");
43
+ }
27
44
  this.clearDocument();
28
45
  this.parseHTML(html);
29
46
  this.setupDocumentReferences();
30
47
  }
31
48
  clearDocument() {
32
- if (this.document.head) {
33
- while (this.document.head.firstChild) {
34
- this.document.head.removeChild(this.document.head.firstChild);
49
+ if (!this._document) return;
50
+ if (this._document.head) {
51
+ while (this._document.head.firstChild) {
52
+ this._document.head.removeChild(this._document.head.firstChild);
35
53
  }
36
54
  }
37
- if (this.document.body) {
38
- while (this.document.body.firstChild) {
39
- this.document.body.removeChild(this.document.body.firstChild);
55
+ if (this._document.body) {
56
+ while (this._document.body.firstChild) {
57
+ this._document.body.removeChild(this._document.body.firstChild);
40
58
  }
41
59
  }
42
60
  }
43
61
  parseHTML(html) {
62
+ if (!this._document) {
63
+ throw new Error("DomParser has been destroyed");
64
+ }
44
65
  if (!html.trim()) {
45
66
  return;
46
67
  }