@dooboostore/dom-parser 1.0.1 → 1.0.3

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 (519) hide show
  1. package/dist/cjs/DomParser.js +43 -13
  2. package/dist/cjs/DomParser.js.map +2 -2
  3. package/dist/cjs/factory/ElementFactory.js +27 -6
  4. package/dist/cjs/factory/ElementFactory.js.map +2 -2
  5. package/dist/cjs/index.js +4 -0
  6. package/dist/cjs/index.js.map +2 -2
  7. package/dist/cjs/node/CharacterData.js.map +1 -1
  8. package/dist/cjs/node/ChildNode.js +0 -15
  9. package/dist/cjs/node/ChildNode.js.map +3 -3
  10. package/dist/cjs/node/ChildNodeBase.js +20 -0
  11. package/dist/cjs/node/ChildNodeBase.js.map +2 -2
  12. package/dist/cjs/node/Comment.js.map +2 -2
  13. package/dist/cjs/node/Document.js +0 -27
  14. package/dist/cjs/node/Document.js.map +4 -4
  15. package/dist/cjs/node/DocumentBase.js +169 -202
  16. package/dist/cjs/node/DocumentBase.js.map +2 -2
  17. package/dist/cjs/node/DocumentFragment.js +0 -15
  18. package/dist/cjs/node/DocumentFragment.js.map +3 -3
  19. package/dist/cjs/node/DocumentFragmentBase.js.map +2 -2
  20. package/dist/cjs/node/Node.js.map +1 -1
  21. package/dist/cjs/node/NodeBase.js +44 -2
  22. package/dist/cjs/node/NodeBase.js.map +2 -2
  23. package/dist/cjs/node/NodeFilter.js +43 -0
  24. package/dist/cjs/node/NodeFilter.js.map +7 -0
  25. package/dist/cjs/node/NodeIterator.js +1 -28
  26. package/dist/cjs/node/NodeIterator.js.map +2 -2
  27. package/dist/cjs/node/ParentNode.js +0 -15
  28. package/dist/cjs/node/ParentNode.js.map +3 -3
  29. package/dist/cjs/node/ParentNodeBase.js +10 -10
  30. package/dist/cjs/node/ParentNodeBase.js.map +3 -3
  31. package/dist/cjs/node/ShadowRootBase.js +79 -0
  32. package/dist/cjs/node/ShadowRootBase.js.map +7 -0
  33. package/dist/cjs/node/Text.js +0 -15
  34. package/dist/cjs/node/Text.js.map +3 -3
  35. package/dist/cjs/node/TextBase.js +0 -3
  36. package/dist/cjs/node/TextBase.js.map +2 -2
  37. package/dist/cjs/node/TreeWalker.js +272 -0
  38. package/dist/cjs/node/TreeWalker.js.map +7 -0
  39. package/dist/cjs/node/collection/{HTMLCollection.js → HTMLCollectionImp.js} +7 -6
  40. package/dist/cjs/node/collection/HTMLCollectionImp.js.map +7 -0
  41. package/dist/cjs/node/collection/HTMLCollectionOfImp.js +26 -0
  42. package/dist/cjs/node/collection/HTMLCollectionOfImp.js.map +7 -0
  43. package/dist/cjs/node/collection/NodeList.js.map +1 -1
  44. package/dist/cjs/node/collection/{NodeListOf.js → NodeListOfImp.js} +6 -6
  45. package/dist/cjs/node/collection/NodeListOfImp.js.map +7 -0
  46. package/dist/cjs/node/collection/StylePropertyMapImpl.js +65 -0
  47. package/dist/cjs/node/collection/StylePropertyMapImpl.js.map +7 -0
  48. package/dist/cjs/node/collection/index.js +6 -6
  49. package/dist/cjs/node/collection/index.js.map +2 -2
  50. package/dist/cjs/node/elements/Element.js +0 -15
  51. package/dist/cjs/node/elements/Element.js.map +3 -3
  52. package/dist/cjs/node/elements/ElementBase.js +164 -322
  53. package/dist/cjs/node/elements/ElementBase.js.map +3 -3
  54. package/dist/cjs/node/elements/HTMLAreaElement.js.map +2 -2
  55. package/dist/cjs/node/{collection/HTMLCollectionOf.js → elements/HTMLAudioElement.js} +9 -16
  56. package/dist/cjs/node/elements/HTMLAudioElement.js.map +7 -0
  57. package/dist/cjs/node/elements/HTMLButtonElement.js +1 -1
  58. package/dist/cjs/node/elements/HTMLButtonElement.js.map +2 -2
  59. package/dist/cjs/node/elements/HTMLDListElement.js +29 -0
  60. package/dist/cjs/node/elements/HTMLDListElement.js.map +7 -0
  61. package/dist/cjs/node/elements/HTMLDataElement.js +29 -0
  62. package/dist/cjs/node/elements/HTMLDataElement.js.map +7 -0
  63. package/dist/cjs/node/elements/HTMLDataListElement.js +29 -0
  64. package/dist/cjs/node/elements/HTMLDataListElement.js.map +7 -0
  65. package/dist/cjs/node/elements/HTMLDetailsElement.js +29 -0
  66. package/dist/cjs/node/elements/HTMLDetailsElement.js.map +7 -0
  67. package/dist/cjs/node/elements/HTMLDialogElement.js +29 -0
  68. package/dist/cjs/node/elements/HTMLDialogElement.js.map +7 -0
  69. package/dist/cjs/node/elements/HTMLElement.js +10 -0
  70. package/dist/cjs/node/elements/HTMLElement.js.map +2 -2
  71. package/dist/cjs/node/elements/HTMLElementBase.js +153 -3
  72. package/dist/cjs/node/elements/HTMLElementBase.js.map +2 -2
  73. package/dist/cjs/node/elements/HTMLEmbedElement.js.map +2 -2
  74. package/dist/cjs/node/elements/HTMLFieldSetElement.js +29 -0
  75. package/dist/cjs/node/elements/HTMLFieldSetElement.js.map +7 -0
  76. package/dist/cjs/node/elements/HTMLHRElement.js +29 -0
  77. package/dist/cjs/node/elements/HTMLHRElement.js.map +7 -0
  78. package/dist/cjs/node/elements/HTMLIFrameElement.js +29 -0
  79. package/dist/cjs/node/elements/HTMLIFrameElement.js.map +7 -0
  80. package/dist/cjs/node/elements/HTMLLabelElement.js +29 -0
  81. package/dist/cjs/node/elements/HTMLLabelElement.js.map +7 -0
  82. package/dist/cjs/node/elements/HTMLLegendElement.js +29 -0
  83. package/dist/cjs/node/elements/HTMLLegendElement.js.map +7 -0
  84. package/dist/cjs/node/elements/HTMLMapElement.js +29 -0
  85. package/dist/cjs/node/elements/HTMLMapElement.js.map +7 -0
  86. package/dist/cjs/node/elements/HTMLMeterElement.js +29 -0
  87. package/dist/cjs/node/elements/HTMLMeterElement.js.map +7 -0
  88. package/dist/cjs/node/elements/HTMLModElement.js +29 -0
  89. package/dist/cjs/node/elements/HTMLModElement.js.map +7 -0
  90. package/dist/cjs/node/elements/HTMLObjectElement.js +29 -0
  91. package/dist/cjs/node/elements/HTMLObjectElement.js.map +7 -0
  92. package/dist/cjs/node/elements/HTMLOptGroupElement.js +29 -0
  93. package/dist/cjs/node/elements/HTMLOptGroupElement.js.map +7 -0
  94. package/dist/cjs/node/elements/HTMLOptionElement.js +29 -0
  95. package/dist/cjs/node/elements/HTMLOptionElement.js.map +7 -0
  96. package/dist/cjs/node/elements/HTMLOutputElement.js +29 -0
  97. package/dist/cjs/node/elements/HTMLOutputElement.js.map +7 -0
  98. package/dist/cjs/node/elements/HTMLParamElement.js +29 -0
  99. package/dist/cjs/node/elements/HTMLParamElement.js.map +7 -0
  100. package/dist/cjs/node/elements/HTMLPictureElement.js +29 -0
  101. package/dist/cjs/node/elements/HTMLPictureElement.js.map +7 -0
  102. package/dist/cjs/node/elements/HTMLPreElement.js +29 -0
  103. package/dist/cjs/node/elements/HTMLPreElement.js.map +7 -0
  104. package/dist/cjs/node/elements/HTMLProgressElement.js +29 -0
  105. package/dist/cjs/node/elements/HTMLProgressElement.js.map +7 -0
  106. package/dist/cjs/node/elements/HTMLQuoteElement.js +29 -0
  107. package/dist/cjs/node/elements/HTMLQuoteElement.js.map +7 -0
  108. package/dist/cjs/node/elements/HTMLSelectElement.js +29 -0
  109. package/dist/cjs/node/elements/HTMLSelectElement.js.map +7 -0
  110. package/dist/cjs/node/elements/HTMLSlotElement.js +29 -0
  111. package/dist/cjs/node/elements/HTMLSlotElement.js.map +7 -0
  112. package/dist/cjs/node/elements/HTMLSourceElement.js +29 -0
  113. package/dist/cjs/node/elements/HTMLSourceElement.js.map +7 -0
  114. package/dist/cjs/node/elements/HTMLTableElement.js.map +2 -2
  115. package/dist/cjs/node/elements/HTMLTbodyElement.js.map +2 -2
  116. package/dist/cjs/node/elements/HTMLTdElement.js.map +2 -2
  117. package/dist/cjs/node/elements/HTMLTemplateElement.js.map +2 -2
  118. package/dist/cjs/node/elements/HTMLTextAreaElement.js +29 -0
  119. package/dist/cjs/node/elements/HTMLTextAreaElement.js.map +7 -0
  120. package/dist/cjs/node/elements/HTMLTfootElement.js.map +2 -2
  121. package/dist/cjs/node/elements/HTMLTheadElement.js.map +2 -2
  122. package/dist/cjs/node/elements/HTMLTimeElement.js +29 -0
  123. package/dist/cjs/node/elements/HTMLTimeElement.js.map +7 -0
  124. package/dist/cjs/node/elements/HTMLTrElement.js.map +2 -2
  125. package/dist/cjs/node/elements/HTMLTrackElement.js +29 -0
  126. package/dist/cjs/node/elements/HTMLTrackElement.js.map +7 -0
  127. package/dist/cjs/node/elements/HTMLVideoElement.js +29 -0
  128. package/dist/cjs/node/elements/HTMLVideoElement.js.map +7 -0
  129. package/dist/cjs/node/elements/index.js +181 -92
  130. package/dist/cjs/node/elements/index.js.map +2 -2
  131. package/dist/cjs/node/index.js +6 -16
  132. package/dist/cjs/node/index.js.map +2 -2
  133. package/dist/cjs/utils/CSSSelector.js.map +2 -2
  134. package/dist/cjs/window/CustomElementRegistryImp.js +105 -0
  135. package/dist/cjs/window/CustomElementRegistryImp.js.map +7 -0
  136. package/dist/cjs/window/Window.js +0 -15
  137. package/dist/cjs/window/Window.js.map +3 -3
  138. package/dist/cjs/window/WindowBase.js +233 -515
  139. package/dist/cjs/window/WindowBase.js.map +2 -2
  140. package/dist/cjs/window/index.js +0 -5
  141. package/dist/cjs/window/index.js.map +2 -2
  142. package/dist/esm/DomParser.js +43 -13
  143. package/dist/esm/DomParser.js.map +2 -2
  144. package/dist/esm/factory/ElementFactory.js +27 -6
  145. package/dist/esm/factory/ElementFactory.js.map +2 -2
  146. package/dist/esm/index.js +4 -0
  147. package/dist/esm/index.js.map +2 -2
  148. package/dist/esm/node/ChildNodeBase.js +20 -0
  149. package/dist/esm/node/ChildNodeBase.js.map +2 -2
  150. package/dist/esm/node/Comment.js.map +2 -2
  151. package/dist/esm/node/Document.js +0 -8
  152. package/dist/esm/node/Document.js.map +4 -4
  153. package/dist/esm/node/DocumentBase.js +166 -199
  154. package/dist/esm/node/DocumentBase.js.map +2 -2
  155. package/dist/esm/node/DocumentFragmentBase.js.map +2 -2
  156. package/dist/esm/node/Node.js.map +1 -1
  157. package/dist/esm/node/NodeBase.js +45 -22
  158. package/dist/esm/node/NodeBase.js.map +2 -2
  159. package/dist/esm/node/NodeFilter.js +24 -0
  160. package/dist/esm/node/NodeFilter.js.map +7 -0
  161. package/dist/esm/node/NodeIterator.js +1 -28
  162. package/dist/esm/node/NodeIterator.js.map +2 -2
  163. package/dist/esm/node/ParentNodeBase.js +4 -4
  164. package/dist/esm/node/ParentNodeBase.js.map +2 -2
  165. package/dist/esm/node/ShadowRootBase.js +60 -0
  166. package/dist/esm/node/ShadowRootBase.js.map +7 -0
  167. package/dist/esm/node/TextBase.js +0 -3
  168. package/dist/esm/node/TextBase.js.map +2 -2
  169. package/dist/esm/node/TreeWalker.js +253 -0
  170. package/dist/esm/node/TreeWalker.js.map +7 -0
  171. package/dist/esm/node/collection/{HTMLCollection.js → HTMLCollectionImp.js} +4 -3
  172. package/dist/esm/node/collection/HTMLCollectionImp.js.map +7 -0
  173. package/dist/esm/node/collection/HTMLCollectionOfImp.js +7 -0
  174. package/dist/esm/node/collection/HTMLCollectionOfImp.js.map +7 -0
  175. package/dist/esm/node/collection/NodeList.js.map +1 -1
  176. package/dist/esm/node/collection/{NodeListOf.js → NodeListOfImp.js} +3 -3
  177. package/dist/esm/node/collection/NodeListOfImp.js.map +7 -0
  178. package/dist/esm/node/collection/StylePropertyMapImpl.js +46 -0
  179. package/dist/esm/node/collection/StylePropertyMapImpl.js.map +7 -0
  180. package/dist/esm/node/collection/index.js +6 -6
  181. package/dist/esm/node/collection/index.js.map +2 -2
  182. package/dist/esm/node/elements/ElementBase.js +164 -322
  183. package/dist/esm/node/elements/ElementBase.js.map +3 -3
  184. package/dist/esm/node/elements/HTMLAreaElement.js.map +2 -2
  185. package/dist/esm/node/elements/HTMLAudioElement.js +10 -0
  186. package/dist/esm/node/elements/HTMLAudioElement.js.map +7 -0
  187. package/dist/esm/node/elements/HTMLButtonElement.js +1 -1
  188. package/dist/esm/node/elements/HTMLButtonElement.js.map +2 -2
  189. package/dist/esm/node/elements/HTMLDListElement.js +10 -0
  190. package/dist/esm/node/elements/HTMLDListElement.js.map +7 -0
  191. package/dist/esm/node/elements/HTMLDataElement.js +10 -0
  192. package/dist/esm/node/elements/HTMLDataElement.js.map +7 -0
  193. package/dist/esm/node/elements/HTMLDataListElement.js +10 -0
  194. package/dist/esm/node/elements/HTMLDataListElement.js.map +7 -0
  195. package/dist/esm/node/elements/HTMLDetailsElement.js +10 -0
  196. package/dist/esm/node/elements/HTMLDetailsElement.js.map +7 -0
  197. package/dist/esm/node/elements/HTMLDialogElement.js +10 -0
  198. package/dist/esm/node/elements/HTMLDialogElement.js.map +7 -0
  199. package/dist/esm/node/elements/HTMLElement.js +6 -0
  200. package/dist/esm/node/elements/HTMLElement.js.map +3 -3
  201. package/dist/esm/node/elements/HTMLElementBase.js +153 -3
  202. package/dist/esm/node/elements/HTMLElementBase.js.map +2 -2
  203. package/dist/esm/node/elements/HTMLEmbedElement.js.map +2 -2
  204. package/dist/esm/node/elements/HTMLFieldSetElement.js +10 -0
  205. package/dist/esm/node/elements/HTMLFieldSetElement.js.map +7 -0
  206. package/dist/esm/node/elements/HTMLHRElement.js +10 -0
  207. package/dist/esm/node/elements/HTMLHRElement.js.map +7 -0
  208. package/dist/esm/node/elements/HTMLIFrameElement.js +10 -0
  209. package/dist/esm/node/elements/HTMLIFrameElement.js.map +7 -0
  210. package/dist/esm/node/elements/HTMLLabelElement.js +10 -0
  211. package/dist/esm/node/elements/HTMLLabelElement.js.map +7 -0
  212. package/dist/esm/node/elements/HTMLLegendElement.js +10 -0
  213. package/dist/esm/node/elements/HTMLLegendElement.js.map +7 -0
  214. package/dist/esm/node/elements/HTMLMapElement.js +10 -0
  215. package/dist/esm/node/elements/HTMLMapElement.js.map +7 -0
  216. package/dist/esm/node/elements/HTMLMeterElement.js +10 -0
  217. package/dist/esm/node/elements/HTMLMeterElement.js.map +7 -0
  218. package/dist/esm/node/elements/HTMLModElement.js +10 -0
  219. package/dist/esm/node/elements/HTMLModElement.js.map +7 -0
  220. package/dist/esm/node/elements/HTMLObjectElement.js +10 -0
  221. package/dist/esm/node/elements/HTMLObjectElement.js.map +7 -0
  222. package/dist/esm/node/elements/HTMLOptGroupElement.js +10 -0
  223. package/dist/esm/node/elements/HTMLOptGroupElement.js.map +7 -0
  224. package/dist/esm/node/elements/HTMLOptionElement.js +10 -0
  225. package/dist/esm/node/elements/HTMLOptionElement.js.map +7 -0
  226. package/dist/esm/node/elements/HTMLOutputElement.js +10 -0
  227. package/dist/esm/node/elements/HTMLOutputElement.js.map +7 -0
  228. package/dist/esm/node/elements/HTMLParamElement.js +10 -0
  229. package/dist/esm/node/elements/HTMLParamElement.js.map +7 -0
  230. package/dist/esm/node/elements/HTMLPictureElement.js +10 -0
  231. package/dist/esm/node/elements/HTMLPictureElement.js.map +7 -0
  232. package/dist/esm/node/elements/HTMLPreElement.js +10 -0
  233. package/dist/esm/node/elements/HTMLPreElement.js.map +7 -0
  234. package/dist/esm/node/elements/HTMLProgressElement.js +10 -0
  235. package/dist/esm/node/elements/HTMLProgressElement.js.map +7 -0
  236. package/dist/esm/node/elements/HTMLQuoteElement.js +10 -0
  237. package/dist/esm/node/elements/HTMLQuoteElement.js.map +7 -0
  238. package/dist/esm/node/elements/HTMLSelectElement.js +10 -0
  239. package/dist/esm/node/elements/HTMLSelectElement.js.map +7 -0
  240. package/dist/esm/node/elements/HTMLSlotElement.js +10 -0
  241. package/dist/esm/node/elements/HTMLSlotElement.js.map +7 -0
  242. package/dist/esm/node/elements/HTMLSourceElement.js +10 -0
  243. package/dist/esm/node/elements/HTMLSourceElement.js.map +7 -0
  244. package/dist/esm/node/elements/HTMLTableElement.js.map +2 -2
  245. package/dist/esm/node/elements/HTMLTbodyElement.js.map +2 -2
  246. package/dist/esm/node/elements/HTMLTdElement.js.map +2 -2
  247. package/dist/esm/node/elements/HTMLTemplateElement.js.map +2 -2
  248. package/dist/esm/node/elements/HTMLTextAreaElement.js +10 -0
  249. package/dist/esm/node/elements/HTMLTextAreaElement.js.map +7 -0
  250. package/dist/esm/node/elements/HTMLTfootElement.js.map +2 -2
  251. package/dist/esm/node/elements/HTMLTheadElement.js.map +2 -2
  252. package/dist/esm/node/elements/HTMLTimeElement.js +10 -0
  253. package/dist/esm/node/elements/HTMLTimeElement.js.map +7 -0
  254. package/dist/esm/node/elements/HTMLTrElement.js.map +2 -2
  255. package/dist/esm/node/elements/HTMLTrackElement.js +10 -0
  256. package/dist/esm/node/elements/HTMLTrackElement.js.map +7 -0
  257. package/dist/esm/node/elements/HTMLVideoElement.js +10 -0
  258. package/dist/esm/node/elements/HTMLVideoElement.js.map +7 -0
  259. package/dist/esm/node/elements/index.js +182 -93
  260. package/dist/esm/node/elements/index.js.map +2 -2
  261. package/dist/esm/node/index.js +7 -17
  262. package/dist/esm/node/index.js.map +2 -2
  263. package/dist/esm/utils/CSSSelector.js.map +2 -2
  264. package/dist/esm/window/CustomElementRegistryImp.js +86 -0
  265. package/dist/esm/window/CustomElementRegistryImp.js.map +7 -0
  266. package/dist/esm/window/WindowBase.js +282 -499
  267. package/dist/esm/window/WindowBase.js.map +2 -2
  268. package/dist/esm/window/index.js +0 -5
  269. package/dist/esm/window/index.js.map +2 -2
  270. package/dist/esm-bundle/dooboostore-dom-parser.esm.js +3755 -3548
  271. package/dist/esm-bundle/dooboostore-dom-parser.esm.js.map +4 -4
  272. package/dist/types/DomParser.d.ts +4 -0
  273. package/dist/types/DomParser.d.ts.map +1 -1
  274. package/dist/types/factory/ElementFactory.d.ts +1 -1
  275. package/dist/types/factory/ElementFactory.d.ts.map +1 -1
  276. package/dist/types/index.d.ts +3 -1
  277. package/dist/types/index.d.ts.map +1 -1
  278. package/dist/types/node/CharacterData.d.ts +0 -2
  279. package/dist/types/node/CharacterData.d.ts.map +1 -1
  280. package/dist/types/node/ChildNode.d.ts +0 -38
  281. package/dist/types/node/ChildNode.d.ts.map +1 -1
  282. package/dist/types/node/ChildNodeBase.d.ts +6 -4
  283. package/dist/types/node/ChildNodeBase.d.ts.map +1 -1
  284. package/dist/types/node/Comment.d.ts +1 -1
  285. package/dist/types/node/Comment.d.ts.map +1 -1
  286. package/dist/types/node/Document.d.ts +0 -856
  287. package/dist/types/node/Document.d.ts.map +1 -1
  288. package/dist/types/node/DocumentBase.d.ts +68 -108
  289. package/dist/types/node/DocumentBase.d.ts.map +1 -1
  290. package/dist/types/node/DocumentFragment.d.ts +0 -38
  291. package/dist/types/node/DocumentFragment.d.ts.map +1 -1
  292. package/dist/types/node/DocumentFragmentBase.d.ts +1 -8
  293. package/dist/types/node/DocumentFragmentBase.d.ts.map +1 -1
  294. package/dist/types/node/Node.d.ts +0 -213
  295. package/dist/types/node/Node.d.ts.map +1 -1
  296. package/dist/types/node/NodeBase.d.ts +11 -8
  297. package/dist/types/node/NodeBase.d.ts.map +1 -1
  298. package/dist/types/node/NodeFilter.d.ts +25 -0
  299. package/dist/types/node/NodeFilter.d.ts.map +1 -0
  300. package/dist/types/node/NodeIterator.d.ts +0 -34
  301. package/dist/types/node/NodeIterator.d.ts.map +1 -1
  302. package/dist/types/node/ParentNode.d.ts +0 -84
  303. package/dist/types/node/ParentNode.d.ts.map +1 -1
  304. package/dist/types/node/ParentNodeBase.d.ts +0 -5
  305. package/dist/types/node/ParentNodeBase.d.ts.map +1 -1
  306. package/dist/types/node/ShadowRootBase.d.ts +36 -0
  307. package/dist/types/node/ShadowRootBase.d.ts.map +1 -0
  308. package/dist/types/node/Text.d.ts +0 -24
  309. package/dist/types/node/Text.d.ts.map +1 -1
  310. package/dist/types/node/TextBase.d.ts +2 -3
  311. package/dist/types/node/TextBase.d.ts.map +1 -1
  312. package/dist/types/node/TreeWalker.d.ts +48 -0
  313. package/dist/types/node/TreeWalker.d.ts.map +1 -0
  314. package/dist/types/node/collection/{HTMLCollection.d.ts → HTMLCollectionImp.d.ts} +2 -3
  315. package/dist/types/node/collection/HTMLCollectionImp.d.ts.map +1 -0
  316. package/dist/types/node/collection/HTMLCollectionOfImp.d.ts +9 -0
  317. package/dist/types/node/collection/HTMLCollectionOfImp.d.ts.map +1 -0
  318. package/dist/types/node/collection/NodeList.d.ts +0 -1
  319. package/dist/types/node/collection/NodeList.d.ts.map +1 -1
  320. package/dist/types/node/collection/{NodeListOf.d.ts → NodeListOfImp.d.ts} +3 -4
  321. package/dist/types/node/collection/NodeListOfImp.d.ts.map +1 -0
  322. package/dist/types/node/collection/StylePropertyMapImpl.d.ts +20 -0
  323. package/dist/types/node/collection/StylePropertyMapImpl.d.ts.map +1 -0
  324. package/dist/types/node/collection/index.d.ts +3 -3
  325. package/dist/types/node/collection/index.d.ts.map +1 -1
  326. package/dist/types/node/elements/Element.d.ts +0 -686
  327. package/dist/types/node/elements/Element.d.ts.map +1 -1
  328. package/dist/types/node/elements/ElementBase.d.ts +97 -73
  329. package/dist/types/node/elements/ElementBase.d.ts.map +1 -1
  330. package/dist/types/node/elements/HTMLAreaElement.d.ts +0 -1
  331. package/dist/types/node/elements/HTMLAreaElement.d.ts.map +1 -1
  332. package/dist/types/node/elements/HTMLAudioElement.d.ts +8 -0
  333. package/dist/types/node/elements/HTMLAudioElement.d.ts.map +1 -0
  334. package/dist/types/node/elements/HTMLButtonElement.d.ts +1 -1
  335. package/dist/types/node/elements/HTMLButtonElement.d.ts.map +1 -1
  336. package/dist/types/node/elements/HTMLDListElement.d.ts +5 -0
  337. package/dist/types/node/elements/HTMLDListElement.d.ts.map +1 -0
  338. package/dist/types/node/elements/HTMLDataElement.d.ts +5 -0
  339. package/dist/types/node/elements/HTMLDataElement.d.ts.map +1 -0
  340. package/dist/types/node/elements/HTMLDataListElement.d.ts +5 -0
  341. package/dist/types/node/elements/HTMLDataListElement.d.ts.map +1 -0
  342. package/dist/types/node/elements/HTMLDetailsElement.d.ts +5 -0
  343. package/dist/types/node/elements/HTMLDetailsElement.d.ts.map +1 -0
  344. package/dist/types/node/elements/HTMLDialogElement.d.ts +5 -0
  345. package/dist/types/node/elements/HTMLDialogElement.d.ts.map +1 -0
  346. package/dist/types/node/elements/HTMLElement.d.ts +2 -88
  347. package/dist/types/node/elements/HTMLElement.d.ts.map +1 -1
  348. package/dist/types/node/elements/HTMLElementBase.d.ts +133 -3
  349. package/dist/types/node/elements/HTMLElementBase.d.ts.map +1 -1
  350. package/dist/types/node/elements/HTMLEmbedElement.d.ts +0 -1
  351. package/dist/types/node/elements/HTMLEmbedElement.d.ts.map +1 -1
  352. package/dist/types/node/elements/HTMLFieldSetElement.d.ts +5 -0
  353. package/dist/types/node/elements/HTMLFieldSetElement.d.ts.map +1 -0
  354. package/dist/types/node/elements/HTMLHRElement.d.ts +5 -0
  355. package/dist/types/node/elements/HTMLHRElement.d.ts.map +1 -0
  356. package/dist/types/node/elements/HTMLIFrameElement.d.ts +5 -0
  357. package/dist/types/node/elements/HTMLIFrameElement.d.ts.map +1 -0
  358. package/dist/types/node/elements/HTMLLabelElement.d.ts +5 -0
  359. package/dist/types/node/elements/HTMLLabelElement.d.ts.map +1 -0
  360. package/dist/types/node/elements/HTMLLegendElement.d.ts +5 -0
  361. package/dist/types/node/elements/HTMLLegendElement.d.ts.map +1 -0
  362. package/dist/types/node/elements/HTMLMapElement.d.ts +5 -0
  363. package/dist/types/node/elements/HTMLMapElement.d.ts.map +1 -0
  364. package/dist/types/node/elements/HTMLMeterElement.d.ts +5 -0
  365. package/dist/types/node/elements/HTMLMeterElement.d.ts.map +1 -0
  366. package/dist/types/node/elements/HTMLModElement.d.ts +5 -0
  367. package/dist/types/node/elements/HTMLModElement.d.ts.map +1 -0
  368. package/dist/types/node/elements/HTMLObjectElement.d.ts +5 -0
  369. package/dist/types/node/elements/HTMLObjectElement.d.ts.map +1 -0
  370. package/dist/types/node/elements/HTMLOptGroupElement.d.ts +5 -0
  371. package/dist/types/node/elements/HTMLOptGroupElement.d.ts.map +1 -0
  372. package/dist/types/node/elements/HTMLOptionElement.d.ts +5 -0
  373. package/dist/types/node/elements/HTMLOptionElement.d.ts.map +1 -0
  374. package/dist/types/node/elements/HTMLOutputElement.d.ts +5 -0
  375. package/dist/types/node/elements/HTMLOutputElement.d.ts.map +1 -0
  376. package/dist/types/node/elements/HTMLParamElement.d.ts +5 -0
  377. package/dist/types/node/elements/HTMLParamElement.d.ts.map +1 -0
  378. package/dist/types/node/elements/HTMLPictureElement.d.ts +5 -0
  379. package/dist/types/node/elements/HTMLPictureElement.d.ts.map +1 -0
  380. package/dist/types/node/elements/HTMLPreElement.d.ts +5 -0
  381. package/dist/types/node/elements/HTMLPreElement.d.ts.map +1 -0
  382. package/dist/types/node/elements/HTMLProgressElement.d.ts +5 -0
  383. package/dist/types/node/elements/HTMLProgressElement.d.ts.map +1 -0
  384. package/dist/types/node/elements/HTMLQuoteElement.d.ts +5 -0
  385. package/dist/types/node/elements/HTMLQuoteElement.d.ts.map +1 -0
  386. package/dist/types/node/elements/HTMLSelectElement.d.ts +5 -0
  387. package/dist/types/node/elements/HTMLSelectElement.d.ts.map +1 -0
  388. package/dist/types/node/elements/HTMLSlotElement.d.ts +5 -0
  389. package/dist/types/node/elements/HTMLSlotElement.d.ts.map +1 -0
  390. package/dist/types/node/elements/HTMLSourceElement.d.ts +5 -0
  391. package/dist/types/node/elements/HTMLSourceElement.d.ts.map +1 -0
  392. package/dist/types/node/elements/HTMLTableElement.d.ts +3 -4
  393. package/dist/types/node/elements/HTMLTableElement.d.ts.map +1 -1
  394. package/dist/types/node/elements/HTMLTbodyElement.d.ts +2 -3
  395. package/dist/types/node/elements/HTMLTbodyElement.d.ts.map +1 -1
  396. package/dist/types/node/elements/HTMLTemplateElement.d.ts +0 -1
  397. package/dist/types/node/elements/HTMLTemplateElement.d.ts.map +1 -1
  398. package/dist/types/node/elements/HTMLTextAreaElement.d.ts +5 -0
  399. package/dist/types/node/elements/HTMLTextAreaElement.d.ts.map +1 -0
  400. package/dist/types/node/elements/HTMLTfootElement.d.ts +2 -3
  401. package/dist/types/node/elements/HTMLTfootElement.d.ts.map +1 -1
  402. package/dist/types/node/elements/HTMLTheadElement.d.ts +2 -3
  403. package/dist/types/node/elements/HTMLTheadElement.d.ts.map +1 -1
  404. package/dist/types/node/elements/HTMLTimeElement.d.ts +5 -0
  405. package/dist/types/node/elements/HTMLTimeElement.d.ts.map +1 -0
  406. package/dist/types/node/elements/HTMLTrElement.d.ts +2 -3
  407. package/dist/types/node/elements/HTMLTrElement.d.ts.map +1 -1
  408. package/dist/types/node/elements/HTMLTrackElement.d.ts +5 -0
  409. package/dist/types/node/elements/HTMLTrackElement.d.ts.map +1 -0
  410. package/dist/types/node/elements/HTMLVideoElement.d.ts +8 -0
  411. package/dist/types/node/elements/HTMLVideoElement.d.ts.map +1 -0
  412. package/dist/types/node/elements/index.d.ts +106 -52
  413. package/dist/types/node/elements/index.d.ts.map +1 -1
  414. package/dist/types/node/index.d.ts +4 -7
  415. package/dist/types/node/index.d.ts.map +1 -1
  416. package/dist/types/utils/CSSSelector.d.ts +0 -1
  417. package/dist/types/utils/CSSSelector.d.ts.map +1 -1
  418. package/dist/types/window/CustomElementRegistryImp.d.ts +18 -0
  419. package/dist/types/window/CustomElementRegistryImp.d.ts.map +1 -0
  420. package/dist/types/window/Window.d.ts +0 -619
  421. package/dist/types/window/Window.d.ts.map +1 -1
  422. package/dist/types/window/WindowBase.d.ts +261 -284
  423. package/dist/types/window/WindowBase.d.ts.map +1 -1
  424. package/dist/types/window/index.d.ts +0 -1
  425. package/dist/types/window/index.d.ts.map +1 -1
  426. package/dist/umd-bundle/dooboostore-dom-parser.umd.js +3765 -3558
  427. package/dist/umd-bundle/dooboostore-dom-parser.umd.js.map +4 -4
  428. package/package.json +1 -1
  429. package/src/DomParser.ts +458 -429
  430. package/src/factory/ElementFactory.ts +79 -53
  431. package/src/index.ts +11 -10
  432. package/src/node/CharacterData.ts +0 -2
  433. package/src/node/ChildNode.ts +42 -42
  434. package/src/node/ChildNodeBase.ts +60 -39
  435. package/src/node/Comment.ts +60 -60
  436. package/src/node/Document.ts +129 -882
  437. package/src/node/DocumentBase.ts +371 -462
  438. package/src/node/DocumentFragment.ts +38 -44
  439. package/src/node/DocumentFragmentBase.ts +4 -9
  440. package/src/node/Node.ts +231 -224
  441. package/src/node/NodeBase.ts +469 -443
  442. package/src/node/NodeFilter.ts +50 -0
  443. package/src/node/NodeIterator.ts +117 -172
  444. package/src/node/ParentNode.ts +93 -93
  445. package/src/node/ParentNodeBase.ts +7 -10
  446. package/src/node/ShadowRootBase.ts +87 -0
  447. package/src/node/Text.ts +30 -30
  448. package/src/node/TextBase.ts +92 -94
  449. package/src/node/TreeWalker.ts +280 -0
  450. package/src/node/collection/{HTMLCollection.ts → HTMLCollectionImp.ts} +3 -2
  451. package/src/node/collection/HTMLCollectionOfImp.ts +12 -0
  452. package/src/node/collection/NodeList.ts +1 -1
  453. package/src/node/collection/{NodeListOf.ts → NodeListOfImp.ts} +3 -3
  454. package/src/node/collection/StylePropertyMapImpl.ts +60 -0
  455. package/src/node/collection/index.ts +3 -3
  456. package/src/node/elements/Element.ts +212 -771
  457. package/src/node/elements/ElementBase.ts +840 -1195
  458. package/src/node/elements/HTMLAreaElement.ts +0 -1
  459. package/src/node/elements/HTMLAudioElement.ts +10 -0
  460. package/src/node/elements/HTMLButtonElement.ts +63 -63
  461. package/src/node/elements/HTMLDListElement.ts +2 -0
  462. package/src/node/elements/HTMLDataElement.ts +6 -0
  463. package/src/node/elements/HTMLDataListElement.ts +2 -0
  464. package/src/node/elements/HTMLDetailsElement.ts +2 -0
  465. package/src/node/elements/HTMLDialogElement.ts +2 -0
  466. package/src/node/elements/HTMLElement.ts +2 -102
  467. package/src/node/elements/HTMLElementBase.ts +453 -156
  468. package/src/node/elements/HTMLEmbedElement.ts +0 -1
  469. package/src/node/elements/HTMLFieldSetElement.ts +2 -0
  470. package/src/node/elements/HTMLHRElement.ts +2 -0
  471. package/src/node/elements/HTMLIFrameElement.ts +2 -0
  472. package/src/node/elements/HTMLLabelElement.ts +2 -0
  473. package/src/node/elements/HTMLLegendElement.ts +2 -0
  474. package/src/node/elements/HTMLMapElement.ts +2 -0
  475. package/src/node/elements/HTMLMeterElement.ts +2 -0
  476. package/src/node/elements/HTMLModElement.ts +2 -0
  477. package/src/node/elements/HTMLObjectElement.ts +2 -0
  478. package/src/node/elements/HTMLOptGroupElement.ts +2 -0
  479. package/src/node/elements/HTMLOptionElement.ts +2 -0
  480. package/src/node/elements/HTMLOutputElement.ts +2 -0
  481. package/src/node/elements/HTMLParamElement.ts +2 -0
  482. package/src/node/elements/HTMLPictureElement.ts +2 -0
  483. package/src/node/elements/HTMLPreElement.ts +2 -0
  484. package/src/node/elements/HTMLProgressElement.ts +2 -0
  485. package/src/node/elements/HTMLQuoteElement.ts +2 -0
  486. package/src/node/elements/HTMLSelectElement.ts +2 -0
  487. package/src/node/elements/HTMLSlotElement.ts +2 -0
  488. package/src/node/elements/HTMLSourceElement.ts +2 -0
  489. package/src/node/elements/HTMLTableElement.ts +3 -7
  490. package/src/node/elements/HTMLTbodyElement.ts +2 -3
  491. package/src/node/elements/HTMLTdElement.ts +1 -1
  492. package/src/node/elements/HTMLTemplateElement.ts +3 -6
  493. package/src/node/elements/HTMLTextAreaElement.ts +2 -0
  494. package/src/node/elements/HTMLTfootElement.ts +2 -3
  495. package/src/node/elements/HTMLTheadElement.ts +2 -3
  496. package/src/node/elements/HTMLTimeElement.ts +2 -0
  497. package/src/node/elements/HTMLTrElement.ts +3 -4
  498. package/src/node/elements/HTMLTrackElement.ts +2 -0
  499. package/src/node/elements/HTMLVideoElement.ts +10 -0
  500. package/src/node/elements/index.ts +226 -149
  501. package/src/node/index.ts +8 -8
  502. package/src/utils/CSSSelector.ts +0 -1
  503. package/src/window/CustomElementRegistryImp.ts +120 -0
  504. package/src/window/Window.ts +716 -715
  505. package/src/window/WindowBase.ts +842 -998
  506. package/src/window/index.ts +0 -1
  507. package/tsconfig.json +1 -0
  508. package/dist/cjs/node/collection/HTMLCollection.js.map +0 -7
  509. package/dist/cjs/node/collection/HTMLCollectionOf.js.map +0 -7
  510. package/dist/cjs/node/collection/NodeListOf.js.map +0 -7
  511. package/dist/esm/node/collection/HTMLCollection.js.map +0 -7
  512. package/dist/esm/node/collection/HTMLCollectionOf.js +0 -17
  513. package/dist/esm/node/collection/HTMLCollectionOf.js.map +0 -7
  514. package/dist/esm/node/collection/NodeListOf.js.map +0 -7
  515. package/dist/types/node/collection/HTMLCollection.d.ts.map +0 -1
  516. package/dist/types/node/collection/HTMLCollectionOf.d.ts +0 -14
  517. package/dist/types/node/collection/HTMLCollectionOf.d.ts.map +0 -1
  518. package/dist/types/node/collection/NodeListOf.d.ts.map +0 -1
  519. package/src/node/collection/HTMLCollectionOf.ts +0 -26
@@ -1,1018 +1,862 @@
1
- import { Window, Location, History, Navigator } from './Window';
2
- import { Document } from '../node/Document';
1
+ // import { Window, Location, History, Navigator } from './Window';
2
+ // import { CustomElementRegistry } from './CustomElementRegistry';
3
+ // import { Document } from '../node/Document';
3
4
  import { DocumentBase } from '../node/DocumentBase';
4
5
  import { NodeBase } from '../node/NodeBase';
5
6
  import { ElementBase } from '../node/elements/ElementBase';
6
7
 
7
8
  // Import all element classes
8
- import { HTMLAnchorElement } from '../node/elements/HTMLAnchorElement';
9
- import { HTMLBodyElement } from '../node/elements/HTMLBodyElement';
10
- import { HTMLButtonElement } from '../node/elements/HTMLButtonElement';
11
- import { HTMLCanvasElement } from '../node/elements/HTMLCanvasElement';
12
- import { HTMLDivElement } from '../node/elements/HTMLDivElement';
13
- import { HTMLH1Element } from '../node/elements/HTMLH1Element';
14
- import { HTMLHeadElement } from '../node/elements/HTMLHeadElement';
15
- import { HTMLHtmlElement } from '../node/elements/HTMLHtmlElement';
16
- import { HTMLImgElement } from '../node/elements/HTMLImgElement';
17
- import { HTMLInputElement } from '../node/elements/HTMLInputElement';
18
- import { HTMLPElement } from '../node/elements/HTMLPElement';
19
- import { HTMLSpanElement } from '../node/elements/HTMLSpanElement';
20
- import { HTMLTitleElement } from '../node/elements/HTMLTitleElement';
21
- import { HTMLLinkElement } from '../node/elements/HTMLLinkElement';
22
- import { HTMLScriptElement } from '../node/elements/HTMLScriptElement';
23
- import { HTMLStyleElement } from '../node/elements/HTMLStyleElement';
24
- import { HTMLFormElement } from '../node/elements/HTMLFormElement';
25
- import { HTMLTableElement } from '../node/elements/HTMLTableElement';
26
- import { HTMLUListElement } from '../node/elements/HTMLUListElement';
27
- import { HTMLOListElement } from '../node/elements/HTMLOListElement';
28
- import { HTMLLIElement } from '../node/elements/HTMLLIElement';
29
- import { HTMLMetaElement } from '../node/elements/HTMLMetaElement';
30
- import { HTMLTemplateElement } from '../node/elements/HTMLTemplateElement';
31
- import { HTMLTheadElement } from '../node/elements/HTMLTheadElement';
32
- import { HTMLTfootElement } from '../node/elements/HTMLTfootElement';
33
- import { HTMLTrElement } from '../node/elements/HTMLTrElement';
34
- import { HTMLTdElement } from '../node/elements/HTMLTdElement';
35
- import { HTMLThElement } from '../node/elements/HTMLThElement';
36
- import { HTMLCaptionElement } from '../node/elements/HTMLCaptionElement';
37
- import { HTMLTbodyElement } from '../node/elements/HTMLTbodyElement';
9
+ import {
10
+ HTMLElement,
11
+ HTMLElementBase,
12
+ HTMLAnchorElement,
13
+ HTMLAreaElement,
14
+ HTMLAudioElement,
15
+ HTMLBaseElement,
16
+ HTMLBodyElement,
17
+ HTMLButtonElement,
18
+ HTMLCanvasElement,
19
+ HTMLCaptionElement,
20
+ HTMLDataElement,
21
+ HTMLDataListElement,
22
+ HTMLDetailsElement,
23
+ HTMLDialogElement,
24
+ HTMLDivElement,
25
+ HTMLDListElement,
26
+ HTMLEmbedElement,
27
+ HTMLFieldSetElement,
28
+ HTMLFormElement,
29
+ HTMLH1Element,
30
+ HTMLHeadElement,
31
+ HTMLHRElement,
32
+ HTMLHtmlElement,
33
+ HTMLIFrameElement,
34
+ HTMLImgElement,
35
+ HTMLInputElement,
36
+ HTMLLabelElement,
37
+ HTMLLegendElement,
38
+ HTMLLIElement,
39
+ HTMLLinkElement,
40
+ HTMLMapElement,
41
+ HTMLMetaElement,
42
+ HTMLMeterElement,
43
+ HTMLModElement,
44
+ HTMLObjectElement,
45
+ HTMLOListElement,
46
+ HTMLOptGroupElement,
47
+ HTMLOptionElement,
48
+ HTMLOutputElement,
49
+ HTMLPElement,
50
+ HTMLParamElement,
51
+ HTMLPictureElement,
52
+ HTMLPreElement,
53
+ HTMLProgressElement,
54
+ HTMLQuoteElement,
55
+ HTMLScriptElement,
56
+ HTMLSelectElement,
57
+ HTMLSlotElement,
58
+ HTMLSourceElement,
59
+ HTMLSpanElement,
60
+ HTMLStyleElement,
61
+ HTMLTableElement,
62
+ HTMLTbodyElement,
63
+ HTMLTdElement,
64
+ HTMLTemplateElement,
65
+ HTMLTextAreaElement,
66
+ HTMLTfootElement,
67
+ HTMLTheadElement,
68
+ HTMLThElement,
69
+ HTMLTimeElement,
70
+ HTMLTitleElement,
71
+ HTMLTrackElement,
72
+ HTMLTrElement,
73
+ HTMLUListElement,
74
+ HTMLVideoElement
75
+ } from '../node/elements';
76
+ import { CustomElementRegistryImp } from './CustomElementRegistryImp';
38
77
 
39
78
  class LocationBase implements Location {
40
- private _href: string = 'about:blank';
41
- private _protocol: string = 'about:';
42
- private _host: string = '';
43
- private _hostname: string = '';
44
- private _port: string = '';
45
- private _pathname: string = 'blank';
46
- private _search: string = '';
47
- private _hash: string = '';
48
- private _origin: string = 'null';
49
- private urlChangeCallback?: (url: string) => void;
50
-
51
- constructor(initialUrl: string = 'about:blank', urlChangeCallback?: (url: string) => void) {
52
- this.urlChangeCallback = urlChangeCallback;
53
- this.parseUrl(initialUrl);
54
- }
55
-
56
- get href(): string {
57
- return this._href;
58
- }
59
-
60
- set href(url: string) {
61
- const oldHref = this._href;
62
- this.parseUrl(url);
63
-
64
- // Call URL change callback if URL actually changed
65
- if (this._href !== oldHref && this.urlChangeCallback) {
66
- this.urlChangeCallback(this._href);
67
- }
68
- }
69
-
70
- get protocol(): string {
71
- return this._protocol;
72
- }
73
-
74
- set protocol(value: string) {
75
- if (!value.endsWith(':')) {
76
- value += ':';
77
- }
78
- this._protocol = value;
79
- this.reconstructUrl();
80
- }
81
-
82
- get host(): string {
83
- return this._host;
84
- }
85
-
86
- set host(value: string) {
87
- this._host = value;
88
- // Parse hostname and port from host
89
- const colonIndex = value.lastIndexOf(':');
90
- if (colonIndex !== -1 && colonIndex > value.lastIndexOf(']')) {
91
- // IPv6 addresses are enclosed in brackets, so check if colon is after the closing bracket
92
- this._hostname = value.substring(0, colonIndex);
93
- this._port = value.substring(colonIndex + 1);
94
- } else {
95
- this._hostname = value;
96
- this._port = '';
97
- }
98
- this.reconstructUrl();
99
- }
100
-
101
- get hostname(): string {
102
- return this._hostname;
103
- }
104
-
105
- set hostname(value: string) {
106
- this._hostname = value;
107
- this._host = this._port ? `${value}:${this._port}` : value;
108
- this.reconstructUrl();
109
- }
110
-
111
- get port(): string {
112
- return this._port;
113
- }
114
-
115
- set port(value: string) {
116
- this._port = value;
117
- this._host = value ? `${this._hostname}:${value}` : this._hostname;
118
- this.reconstructUrl();
119
- }
120
-
121
- get pathname(): string {
122
- return this._pathname;
123
- }
124
-
125
- set pathname(value: string) {
126
- if (!value.startsWith('/')) {
127
- value = '/' + value;
128
- }
129
- this._pathname = value;
130
- this.reconstructUrl();
131
- }
132
-
133
- get search(): string {
134
- return this._search;
135
- }
136
-
137
- set search(value: string) {
138
- if (value && !value.startsWith('?')) {
139
- value = '?' + value;
140
- }
141
- this._search = value;
142
- this.reconstructUrl();
143
- }
144
-
145
- get hash(): string {
146
- return this._hash;
147
- }
148
-
149
- set hash(value: string) {
150
- if (value && !value.startsWith('#')) {
151
- value = '#' + value;
152
- }
153
- this._hash = value;
154
- this.reconstructUrl();
155
- }
156
-
157
- get origin(): string {
158
- return this._origin;
159
- }
160
-
161
- assign(url: string): void {
162
- const oldHref = this._href;
163
- this.parseUrl(url);
164
-
165
- // Call URL change callback if URL actually changed
166
- if (this._href !== oldHref && this.urlChangeCallback) {
167
- this.urlChangeCallback(this._href);
168
- }
169
- }
170
-
171
- replace(url: string): void {
172
- const oldHref = this._href;
173
- this.parseUrl(url);
174
-
175
- // Call URL change callback if URL actually changed
176
- if (this._href !== oldHref && this.urlChangeCallback) {
177
- this.urlChangeCallback(this._href);
178
- }
179
- }
180
-
181
- reload(forcedReload?: boolean): void {
182
- // No-op in server-side environment
183
- // In a real browser, this would reload the page
184
- }
185
-
186
- toString(): string {
187
- return this._href;
188
- }
189
-
190
- private parseUrl(url: string): void {
191
- try {
192
- // Handle relative URLs by creating a base URL
193
- let parsedUrl: URL;
194
-
195
- if (url.startsWith('//')) {
196
- // Protocol-relative URL
197
- parsedUrl = new URL(this._protocol + url);
198
- } else if (url.startsWith('/')) {
199
- // Absolute path
200
- parsedUrl = new URL(url, `${this._protocol}//${this._host}`);
201
- } else if (url.includes('://')) {
202
- // Absolute URL
203
- parsedUrl = new URL(url);
204
- } else {
205
- // Relative URL
206
- const base = `${this._protocol}//${this._host}${this._pathname}`;
207
- parsedUrl = new URL(url, base);
208
- }
209
-
210
- this._href = parsedUrl.href;
211
- this._protocol = parsedUrl.protocol;
212
- this._host = parsedUrl.host;
213
- this._hostname = parsedUrl.hostname;
214
- this._port = parsedUrl.port;
215
- this._pathname = parsedUrl.pathname;
216
- this._search = parsedUrl.search;
217
- this._hash = parsedUrl.hash;
218
- this._origin = parsedUrl.origin;
219
- } catch (e) {
220
- // Invalid URL, handle special cases
221
- if (url === 'about:blank') {
222
- this._href = 'about:blank';
223
- this._protocol = 'about:';
224
- this._host = '';
225
- this._hostname = '';
226
- this._port = '';
227
- this._pathname = 'blank';
228
- this._search = '';
229
- this._hash = '';
230
- this._origin = 'null';
231
- }
232
- // For other invalid URLs, keep current values
233
- }
234
- }
235
-
236
- private reconstructUrl(): void {
237
- try {
238
- // Reconstruct the URL from components
239
- let url = this._protocol;
240
-
241
- if (this._protocol !== 'about:' && this._protocol !== 'data:') {
242
- url += '//';
243
- if (this._host) {
244
- url += this._host;
245
- }
246
- }
247
-
248
- url += this._pathname;
249
- url += this._search;
250
- url += this._hash;
251
-
252
- // Validate the reconstructed URL
253
- const testUrl = new URL(url);
254
- this._href = testUrl.href;
255
- this._origin = testUrl.origin;
256
- } catch (e) {
257
- // If reconstruction fails, keep the current href
258
- }
259
- }
79
+ private _href: string = 'about:blank';
80
+ private _protocol: string = 'about:';
81
+ private _host: string = '';
82
+ private _hostname: string = '';
83
+ private _port: string = '';
84
+ private _pathname: string = 'blank';
85
+ private _search: string = '';
86
+ private _hash: string = '';
87
+ private _origin: string = 'null';
88
+ private urlChangeCallback?: (url: string) => void;
89
+
90
+ constructor(initialUrl: string = 'about:blank', urlChangeCallback?: (url: string) => void) {
91
+ this.urlChangeCallback = urlChangeCallback;
92
+ this.parseUrl(initialUrl);
93
+ }
94
+
95
+ ancestorOrigins: DOMStringList;
96
+
97
+ get href(): string {
98
+ return this._href;
99
+ }
100
+
101
+ set href(url: string) {
102
+ const oldHref = this._href;
103
+ this.parseUrl(url);
104
+
105
+ if (this._href !== oldHref && this.urlChangeCallback) {
106
+ this.urlChangeCallback(this._href);
107
+ }
108
+ }
109
+
110
+ get protocol(): string {
111
+ return this._protocol;
112
+ }
113
+ set protocol(value: string) {
114
+ if (!value.endsWith(':')) value += ':';
115
+ this._protocol = value;
116
+ this.reconstructUrl();
117
+ }
118
+
119
+ get host(): string {
120
+ return this._host;
121
+ }
122
+ set host(value: string) {
123
+ this._host = value;
124
+ const colonIndex = value.lastIndexOf(':');
125
+ if (colonIndex !== -1 && colonIndex > value.lastIndexOf(']')) {
126
+ this._hostname = value.substring(0, colonIndex);
127
+ this._port = value.substring(colonIndex + 1);
128
+ } else {
129
+ this._hostname = value;
130
+ this._port = '';
131
+ }
132
+ this.reconstructUrl();
133
+ }
134
+
135
+ get hostname(): string {
136
+ return this._hostname;
137
+ }
138
+ set hostname(value: string) {
139
+ this._hostname = value;
140
+ this._host = this._port ? `${value}:${this._port}` : value;
141
+ this.reconstructUrl();
142
+ }
143
+
144
+ get port(): string {
145
+ return this._port;
146
+ }
147
+ set port(value: string) {
148
+ this._port = value;
149
+ this._host = value ? `${this._hostname}:${value}` : this._hostname;
150
+ this.reconstructUrl();
151
+ }
152
+
153
+ get pathname(): string {
154
+ return this._pathname;
155
+ }
156
+ set pathname(value: string) {
157
+ if (!value.startsWith('/')) value = '/' + value;
158
+ this._pathname = value;
159
+ this.reconstructUrl();
160
+ }
161
+
162
+ get search(): string {
163
+ return this._search;
164
+ }
165
+ set search(value: string) {
166
+ if (value && !value.startsWith('?')) value = '?' + value;
167
+ this._search = value;
168
+ this.reconstructUrl();
169
+ }
170
+
171
+ get hash(): string {
172
+ return this._hash;
173
+ }
174
+ set hash(value: string) {
175
+ if (value && !value.startsWith('#')) value = '#' + value;
176
+ this._hash = value;
177
+ this.reconstructUrl();
178
+ }
179
+
180
+ get origin(): string {
181
+ return this._origin;
182
+ }
183
+
184
+ assign(url: string): void {
185
+ const oldHref = this._href;
186
+ this.parseUrl(url);
187
+ if (this._href !== oldHref && this.urlChangeCallback) {
188
+ this.urlChangeCallback(this._href);
189
+ }
190
+ }
191
+
192
+ replace(url: string): void {
193
+ this.assign(url);
194
+ }
195
+
196
+ reload(_forcedReload?: boolean): void {}
197
+
198
+ toString(): string {
199
+ return this._href;
200
+ }
201
+
202
+ private parseUrl(url: string): void {
203
+ try {
204
+ let parsedUrl: URL;
205
+ if (url.startsWith('//')) {
206
+ parsedUrl = new URL(this._protocol + url);
207
+ } else if (url.startsWith('/')) {
208
+ parsedUrl = new URL(url, `${this._protocol}//${this._host}`);
209
+ } else if (url.includes('://')) {
210
+ parsedUrl = new URL(url);
211
+ } else {
212
+ const base = `${this._protocol}//${this._host}${this._pathname}`;
213
+ parsedUrl = new URL(url, base);
214
+ }
215
+ this._href = parsedUrl.href;
216
+ this._protocol = parsedUrl.protocol;
217
+ this._host = parsedUrl.host;
218
+ this._hostname = parsedUrl.hostname;
219
+ this._port = parsedUrl.port;
220
+ this._pathname = parsedUrl.pathname;
221
+ this._search = parsedUrl.search;
222
+ this._hash = parsedUrl.hash;
223
+ this._origin = parsedUrl.origin;
224
+ } catch (e) {
225
+ if (url === 'about:blank') {
226
+ this._href = 'about:blank';
227
+ this._protocol = 'about:';
228
+ this._host = '';
229
+ this._hostname = '';
230
+ this._port = '';
231
+ this._pathname = 'blank';
232
+ this._search = '';
233
+ this._hash = '';
234
+ this._origin = 'null';
235
+ }
236
+ }
237
+ }
238
+
239
+ private reconstructUrl(): void {
240
+ try {
241
+ let url = this._protocol;
242
+ if (this._protocol !== 'about:' && this._protocol !== 'data:') {
243
+ url += '//';
244
+ if (this._host) url += this._host;
245
+ }
246
+ url += this._pathname;
247
+ url += this._search;
248
+ url += this._hash;
249
+ const testUrl = new URL(url);
250
+ this._href = testUrl.href;
251
+ this._origin = testUrl.origin;
252
+ } catch (e) {}
253
+ }
260
254
  }
261
255
 
262
256
  class HistoryBase implements History {
263
- length: number = 1;
264
- state: any = null;
265
- private window: WindowBase;
266
- private historyStack: Array<{ state: any; title: string; url?: string }> = [];
267
- private currentIndex: number = -1;
268
-
269
- constructor(window: WindowBase) {
270
- this.window = window;
271
- }
272
-
273
- back(): void {
274
- this.go(-1);
275
- }
276
-
277
- forward(): void {
278
- this.go(1);
279
- }
280
-
281
- go(delta?: number): void {
282
- if (!delta || this.historyStack.length === 0) return;
283
-
284
- const newIndex = this.currentIndex + delta;
285
- if (newIndex >= 0 && newIndex < this.historyStack.length) {
286
- this.currentIndex = newIndex;
287
- const entry = this.historyStack[this.currentIndex];
288
- this.state = entry.state;
289
-
290
- // Update location if URL is provided
291
- if (entry.url && this.window.location) {
292
- (this.window.location as any)._href = entry.url;
293
- (this.window.location as any).parseUrl(entry.url);
294
- }
295
-
296
- // Dispatch popstate event
297
- (this.window as any).dispatchPopStateEvent(entry.state, entry.url);
298
- }
299
- }
300
-
301
- pushState(data: any, title: string, url?: string): void {
302
- // Remove any forward history when pushing new state
303
- this.historyStack = this.historyStack.slice(0, this.currentIndex + 1);
304
-
305
- // Add new state
306
- this.historyStack.push({ state: data, title, url });
307
- this.currentIndex = this.historyStack.length - 1;
308
- this.state = data;
309
- this.length = this.historyStack.length;
310
-
311
- // Update location if URL is provided
312
- if (url && this.window.location) {
313
- const oldHref = (this.window.location as any)._href;
314
- (this.window.location as any)._href = url;
315
- (this.window.location as any).parseUrl(url);
316
-
317
- // Trigger URL change callback for dynamic HTML loading
318
- if (url !== oldHref && (this.window.location as any).urlChangeCallback) {
319
- (this.window.location as any).urlChangeCallback(url);
320
- }
321
- }
322
-
323
- // Note: pushState does NOT dispatch popstate event (per HTML spec)
324
- }
325
-
326
- replaceState(data: any, title: string, url?: string): void {
327
- if (this.currentIndex >= 0 && this.currentIndex < this.historyStack.length) {
328
- // Replace current state
329
- this.historyStack[this.currentIndex] = { state: data, title, url };
330
- } else {
331
- // No current state, create one
332
- this.historyStack = [{ state: data, title, url }];
333
- this.currentIndex = 0;
334
- this.length = 1;
335
- }
336
-
337
- this.state = data;
338
-
339
- // Update location if URL is provided
340
- if (url && this.window.location) {
341
- const oldHref = (this.window.location as any)._href;
342
- (this.window.location as any)._href = url;
343
- (this.window.location as any).parseUrl(url);
344
-
345
- // Trigger URL change callback for dynamic HTML loading
346
- if (url !== oldHref && (this.window.location as any).urlChangeCallback) {
347
- (this.window.location as any).urlChangeCallback(url);
348
- }
349
- }
350
-
351
- // Note: replaceState does NOT dispatch popstate event (per HTML spec)
352
- }
257
+ length: number = 1;
258
+ state: any = null;
259
+ private window: WindowBase;
260
+ private historyStack: Array<{ state: any; title: string; url?: string }> = [];
261
+ private currentIndex: number = -1;
262
+
263
+ constructor(window: WindowBase) {
264
+ this.window = window;
265
+ }
266
+
267
+ scrollRestoration: ScrollRestoration;
268
+
269
+ back(): void {
270
+ this.go(-1);
271
+ }
272
+ forward(): void {
273
+ this.go(1);
274
+ }
275
+ go(delta?: number): void {
276
+ if (!delta || this.historyStack.length === 0) return;
277
+ const newIndex = this.currentIndex + delta;
278
+ if (newIndex >= 0 && newIndex < this.historyStack.length) {
279
+ this.currentIndex = newIndex;
280
+ const entry = this.historyStack[this.currentIndex];
281
+ this.state = entry.state;
282
+ if (entry.url && this.window.location) {
283
+ (this.window.location as any)._href = entry.url;
284
+ (this.window.location as any).parseUrl(entry.url);
285
+ }
286
+ (this.window as any).dispatchPopStateEvent(entry.state, entry.url);
287
+ }
288
+ }
289
+
290
+ pushState(data: any, title: string, url?: string): void {
291
+ this.historyStack = this.historyStack.slice(0, this.currentIndex + 1);
292
+ this.historyStack.push({ state: data, title, url });
293
+ this.currentIndex = this.historyStack.length - 1;
294
+ this.state = data;
295
+ this.length = this.historyStack.length;
296
+ if (url && this.window.location) {
297
+ const oldHref = (this.window.location as any)._href;
298
+ (this.window.location as any)._href = url;
299
+ (this.window.location as any).parseUrl(url);
300
+ if (url !== oldHref && (this.window.location as any).urlChangeCallback) {
301
+ (this.window.location as any).urlChangeCallback(url);
302
+ }
303
+ }
304
+ }
305
+
306
+ replaceState(data: any, title: string, url?: string): void {
307
+ if (this.currentIndex >= 0 && this.currentIndex < this.historyStack.length) {
308
+ this.historyStack[this.currentIndex] = { state: data, title, url };
309
+ } else {
310
+ this.historyStack = [{ state: data, title, url }];
311
+ this.currentIndex = 0;
312
+ this.length = 1;
313
+ }
314
+ this.state = data;
315
+ if (url && this.window.location) {
316
+ const oldHref = (this.window.location as any)._href;
317
+ (this.window.location as any)._href = url;
318
+ (this.window.location as any).parseUrl(url);
319
+ if (url !== oldHref && (this.window.location as any).urlChangeCallback) {
320
+ (this.window.location as any).urlChangeCallback(url);
321
+ }
322
+ }
323
+ }
353
324
  }
354
325
 
355
326
  class NavigatorBase implements Navigator {
356
- userAgent: string = 'Mozilla/5.0 (Server-Side Rendering)';
357
- language: string = 'en-US';
358
- languages: readonly string[] = ['en-US', 'en'];
359
- platform: string = 'Server';
360
- cookieEnabled: boolean = false;
361
- onLine: boolean = true;
327
+ clipboard: Clipboard;
328
+ credentials: CredentialsContainer;
329
+ doNotTrack: string;
330
+ geolocation: Geolocation;
331
+ login: NavigatorLogin;
332
+ maxTouchPoints: number;
333
+ mediaCapabilities: MediaCapabilities;
334
+ mediaDevices: MediaDevices;
335
+ mediaSession: MediaSession;
336
+ permissions: Permissions;
337
+ serviceWorker: ServiceWorkerContainer;
338
+ userActivation: UserActivation;
339
+ wakeLock: WakeLock;
340
+ canShare(data?: ShareData): boolean {
341
+ throw new Error('Method not implemented.');
342
+ }
343
+ getGamepads(): (Gamepad | null)[] {
344
+ throw new Error('Method not implemented.');
345
+ }
346
+ requestMIDIAccess(options?: MIDIOptions): Promise<MIDIAccess> {
347
+ throw new Error('Method not implemented.');
348
+ }
349
+ requestMediaKeySystemAccess(keySystem: unknown, supportedConfigurations: unknown): Promise<MediaKeySystemAccess> {
350
+ throw new Error('Method not implemented.');
351
+ }
352
+ sendBeacon(url: string | URL, data?: BodyInit | null): boolean {
353
+ throw new Error('Method not implemented.');
354
+ }
355
+ share(data?: ShareData): Promise<void> {
356
+ throw new Error('Method not implemented.');
357
+ }
358
+ vibrate(pattern: unknown): boolean {
359
+ throw new Error('Method not implemented.');
360
+ }
361
+ webdriver: boolean;
362
+ clearAppBadge(): Promise<void> {
363
+ throw new Error('Method not implemented.');
364
+ }
365
+ setAppBadge(contents?: number): Promise<void> {
366
+ throw new Error('Method not implemented.');
367
+ }
368
+ hardwareConcurrency: number;
369
+ registerProtocolHandler(scheme: string, url: string | URL): void {
370
+ throw new Error('Method not implemented.');
371
+ }
372
+ appCodeName: string;
373
+ appName: string;
374
+ appVersion: string;
375
+ product: string;
376
+ productSub: string;
377
+ vendor: string;
378
+ vendorSub: string;
379
+ locks: LockManager;
380
+ mimeTypes: MimeTypeArray;
381
+ pdfViewerEnabled: boolean;
382
+ plugins: PluginArray;
383
+ javaEnabled(): boolean {
384
+ throw new Error('Method not implemented.');
385
+ }
386
+ storage: StorageManager;
387
+ userAgent: string = 'Mozilla/5.0 (Server-Side Rendering)';
388
+ language: string = 'en-US';
389
+ languages: readonly string[] = ['en-US', 'en'];
390
+ platform: string = 'Server';
391
+ cookieEnabled: boolean = false;
392
+ onLine: boolean = true;
362
393
  }
363
394
 
364
- // Simple event system for WindowBase
365
- interface EventListener {
366
- type: string;
367
- listener: (event: any) => void;
368
- options?: boolean | AddEventListenerOptions;
395
+ interface WindowEventListener {
396
+ type: string;
397
+ listener: (event: any) => void;
398
+ options?: any;
369
399
  }
370
400
 
371
- interface PopStateEvent {
372
- type: 'popstate';
373
- state: any;
374
- url?: string;
375
- }
376
-
377
- export class WindowBase {
378
- // Suppress type errors for complex event handler types
379
- [key: string]: any;
380
-
381
- // Event system
382
- private _eventListeners: EventListener[] = [];
383
- // Properties
384
- readonly clientInformation: Navigator;
385
- readonly closed: boolean = false;
386
- readonly cookieStore: CookieStore = {} as CookieStore;
387
- readonly customElements: CustomElementRegistry = {} as CustomElementRegistry;
388
- readonly devicePixelRatio: number = 1;
389
- readonly document: Document;
390
- readonly event: Event | undefined = undefined;
391
- readonly external: External = {} as External;
392
- readonly frameElement: Element | null = null;
393
- readonly frames: WindowProxy = {} as WindowProxy;
394
- readonly history: History;
395
- readonly innerHeight: number = 768;
396
- readonly innerWidth: number = 1024;
397
- readonly length: number = 0;
398
- readonly locationbar: BarProp = {} as BarProp;
399
- readonly menubar: BarProp = {} as BarProp;
400
- name: string = '';
401
- readonly navigator: Navigator;
402
- ondevicemotion: ((this: Window, ev: DeviceMotionEvent) => any) | null = null;
403
- ondeviceorientation: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;
404
- ondeviceorientationabsolute: ((this: Window, ev: DeviceOrientationEvent) => any) | null = null;
405
- onorientationchange: ((this: Window, ev: Event) => any) | null = null;
406
- opener: any = null;
407
- readonly orientation: number = 0;
408
- readonly originAgentCluster: boolean = false;
409
- readonly outerHeight: number = 768;
410
- readonly outerWidth: number = 1024;
411
- readonly pageXOffset: number = 0;
412
- readonly pageYOffset: number = 0;
413
- readonly parent: WindowProxy = {} as WindowProxy;
414
- readonly personalbar: BarProp = {} as BarProp;
415
- readonly screen: Screen = {} as Screen;
416
- readonly screenLeft: number = 0;
417
- readonly screenTop: number = 0;
418
- readonly screenX: number = 0;
419
- readonly screenY: number = 0;
420
- readonly scrollX: number = 0;
421
- readonly scrollY: number = 0;
422
- readonly scrollbars: BarProp = {} as BarProp;
423
- readonly self: Window & typeof globalThis = this as any;
424
- readonly speechSynthesis: SpeechSynthesis = {} as SpeechSynthesis;
425
- status: string = '';
426
- readonly statusbar: BarProp = {} as BarProp;
427
- readonly toolbar: BarProp = {} as BarProp;
428
- readonly top: WindowProxy | null = null;
429
- readonly visualViewport: VisualViewport | null = null;
430
- readonly window: Window & typeof globalThis = this as any;
431
-
432
- // Location property with getter/setter
433
- private _location: Location;
434
- get location(): Location {
435
- return this._location;
436
- }
437
- set location(href: string | Location) {
438
- if (typeof href === 'string') {
439
- this._location.href = href;
440
- } else {
441
- this._location.href = href.href;
442
- }
443
- }
444
-
445
- // Global constructors
446
- Node = NodeBase;
447
- Element = ElementBase;
448
- HTMLElement = ElementBase;
449
- Event = class Event { };
450
- PopStateEvent = class PopStateEvent extends this.Event { };
451
- IntersectionObserver = class IntersectionObserver { };
452
- NodeFilter = class NodeFilter { };
453
- DocumentFragment = class DocumentFragment { };
454
- HTMLMetaElement = HTMLMetaElement;
455
- HTMLCanvasElement = HTMLCanvasElement;
456
- CanvasRenderingContext2D = class CanvasRenderingContext2D { };
457
- CanvasPattern = class CanvasPattern { };
458
- CanvasGradient = class CanvasGradient { };
459
- Path2D = class Path2D { };
460
- ImageData = class ImageData { };
461
-
462
- // HTML element constructors
463
- HTMLAnchorElement = HTMLAnchorElement;
464
- HTMLBodyElement = HTMLBodyElement;
465
- HTMLButtonElement = HTMLButtonElement;
466
- HTMLDivElement = HTMLDivElement;
467
- HTMLH1Element = HTMLH1Element;
468
- HTMLHeadElement = HTMLHeadElement;
469
- HTMLHtmlElement = HTMLHtmlElement;
470
- HTMLImgElement = HTMLImgElement;
471
- HTMLInputElement = HTMLInputElement;
472
- HTMLPElement = HTMLPElement;
473
- HTMLSpanElement = HTMLSpanElement;
474
- HTMLTitleElement = HTMLTitleElement;
475
- HTMLLinkElement = HTMLLinkElement;
476
- HTMLScriptElement = HTMLScriptElement;
477
- HTMLStyleElement = HTMLStyleElement;
478
- HTMLFormElement = HTMLFormElement;
479
- HTMLTableElement = HTMLTableElement;
480
- HTMLUListElement = HTMLUListElement;
481
- HTMLOListElement = HTMLOListElement;
482
- HTMLLIElement = HTMLLIElement;
483
- HTMLTemplateElement = HTMLTemplateElement;
484
- HTMLTheadElement = HTMLTheadElement;
485
- HTMLTfootElement = HTMLTfootElement;
486
- HTMLTrElement = HTMLTrElement;
487
- HTMLTdElement = HTMLTdElement;
488
- HTMLThElement = HTMLThElement;
489
- HTMLCaptionElement = HTMLCaptionElement;
490
- HTMLTbodyElement = HTMLTbodyElement;
491
-
492
- constructor(document?: Document, initialUrl?: string) {
493
- this.document = document || new DocumentBase();
494
-
495
- // Set window reference in document for load event
496
- if (this.document && (this.document as any).setWindow) {
497
- (this.document as any).setWindow(this);
401
+ export class WindowBase implements Window {
402
+ [key: string]: any;
403
+ private _eventListeners: WindowEventListener[] = [];
404
+ private _timers: Set<number> = new Set();
405
+ private _intervals: Set<number> = new Set();
406
+ private _animationFrames: Set<number> = new Set();
407
+ readonly clientInformation: Navigator;
408
+ private _closed: boolean = false;
409
+
410
+ get closed(): boolean {
411
+ return this._closed;
412
+ }
413
+
414
+ readonly cookieStore: any = {};
415
+ readonly customElements: CustomElementRegistry;
416
+ readonly devicePixelRatio: number = 1;
417
+ readonly document: Document;
418
+ readonly history: History;
419
+ readonly navigator: Navigator;
420
+ readonly self: any = this;
421
+ readonly window: any = this;
422
+
423
+ private _location: Location;
424
+ get location(): Location {
425
+ return this._location;
426
+ }
427
+ set location(href: string | Location) {
428
+ if (typeof href === 'string') this._location.href = href;
429
+ else this._location.href = href.href;
430
+ }
431
+
432
+ // Global constructors
433
+ Event = class Event {
434
+ constructor(public type: string) {}
435
+ };
436
+ CustomEvent = class CustomEvent extends this.Event {
437
+ constructor(
438
+ type: string,
439
+ public detail: any
440
+ ) {
441
+ super(type);
442
+ }
443
+ };
444
+
445
+ // All HTML element constructors
446
+ Node = NodeBase;
447
+ Element = ElementBase;
448
+ HTMLElement = HTMLElement;
449
+ HTMLAnchorElement = HTMLAnchorElement;
450
+ HTMLAreaElement = HTMLAreaElement;
451
+ HTMLAudioElement = HTMLAudioElement;
452
+ HTMLBaseElement = HTMLBaseElement;
453
+ HTMLBodyElement = HTMLBodyElement;
454
+ HTMLButtonElement = HTMLButtonElement;
455
+ HTMLCanvasElement = HTMLCanvasElement;
456
+ HTMLCaptionElement = HTMLCaptionElement;
457
+ HTMLDataElement = HTMLDataElement;
458
+ HTMLDataListElement = HTMLDataListElement;
459
+ HTMLDetailsElement = HTMLDetailsElement;
460
+ HTMLDialogElement = HTMLDialogElement;
461
+ HTMLDivElement = HTMLDivElement;
462
+ HTMLDListElement = HTMLDListElement;
463
+ HTMLEmbedElement = HTMLEmbedElement;
464
+ HTMLFieldSetElement = HTMLFieldSetElement;
465
+ HTMLFormElement = HTMLFormElement;
466
+ HTMLH1Element = HTMLH1Element;
467
+ HTMLHeadElement = HTMLHeadElement;
468
+ HTMLHRElement = HTMLHRElement;
469
+ HTMLHtmlElement = HTMLHtmlElement;
470
+ HTMLIFrameElement = HTMLIFrameElement;
471
+ HTMLImgElement = HTMLImgElement;
472
+ HTMLInputElement = HTMLInputElement;
473
+ HTMLLabelElement = HTMLLabelElement;
474
+ HTMLLegendElement = HTMLLegendElement;
475
+ HTMLLIElement = HTMLLIElement;
476
+ HTMLLinkElement = HTMLLinkElement;
477
+ HTMLMapElement = HTMLMapElement;
478
+ HTMLMetaElement = HTMLMetaElement;
479
+ HTMLMeterElement = HTMLMeterElement;
480
+ HTMLModElement = HTMLModElement;
481
+ HTMLObjectElement = HTMLObjectElement;
482
+ HTMLOListElement = HTMLOListElement;
483
+ HTMLOptGroupElement = HTMLOptGroupElement;
484
+ HTMLOptionElement = HTMLOptionElement;
485
+ HTMLOutputElement = HTMLOutputElement;
486
+ HTMLPElement = HTMLPElement;
487
+ HTMLParamElement = HTMLParamElement;
488
+ HTMLPictureElement = HTMLPictureElement;
489
+ HTMLPreElement = HTMLPreElement;
490
+ HTMLProgressElement = HTMLProgressElement;
491
+ HTMLQuoteElement = HTMLQuoteElement;
492
+ HTMLScriptElement = HTMLScriptElement;
493
+ HTMLSelectElement = HTMLSelectElement;
494
+ HTMLSlotElement = HTMLSlotElement;
495
+ HTMLSourceElement = HTMLSourceElement;
496
+ HTMLSpanElement = HTMLSpanElement;
497
+ HTMLStyleElement = HTMLStyleElement;
498
+ HTMLTableElement = HTMLTableElement;
499
+ HTMLTbodyElement = HTMLTbodyElement;
500
+ HTMLTdElement = HTMLTdElement;
501
+ HTMLTemplateElement = HTMLTemplateElement;
502
+ HTMLTextAreaElement = HTMLTextAreaElement;
503
+ HTMLTfootElement = HTMLTfootElement;
504
+ HTMLTheadElement = HTMLTheadElement;
505
+ HTMLThElement = HTMLThElement;
506
+ HTMLTimeElement = HTMLTimeElement;
507
+ HTMLTitleElement = HTMLTitleElement;
508
+ HTMLTrackElement = HTMLTrackElement;
509
+ HTMLTrElement = HTMLTrElement;
510
+ HTMLUListElement = HTMLUListElement;
511
+ HTMLVideoElement = HTMLVideoElement;
512
+
513
+ // Type Aliases
514
+ HTMLImageElement = HTMLImgElement;
515
+ HTMLParagraphElement = HTMLPElement;
516
+ HTMLHeadingElement = HTMLH1Element;
517
+ HTMLTableSectionElement = HTMLTbodyElement;
518
+ HTMLTableCellElement = HTMLTdElement;
519
+ HTMLTableRowElement = HTMLTrElement;
520
+
521
+ constructor(config?: { initialUrl?: string }) {
522
+ const documentBase = new DocumentBase();
523
+ if (documentBase && (documentBase as any).setWindow) {
524
+ (documentBase as any).setWindow(this);
525
+ }
526
+ this._location = new LocationBase(config?.initialUrl);
527
+ documentBase.setLocation(this._location);
528
+ this.document = documentBase as unknown as Document;
529
+ const customElementRegistryImp = new CustomElementRegistryImp();
530
+ customElementRegistryImp.setWindow(this);
531
+ this.customElements = customElementRegistryImp as unknown as CustomElementRegistry;
532
+ this.history = new HistoryBase(this);
533
+ this.navigator = new NavigatorBase();
534
+ this.clientInformation = this.navigator;
535
+ }
536
+
537
+ [index: number]: Window;
538
+ event: Event;
539
+ external: External;
540
+ frameElement: Element;
541
+ frames: Window;
542
+ innerHeight: number;
543
+ innerWidth: number;
544
+ length: number;
545
+ locationbar: BarProp;
546
+ menubar: BarProp;
547
+ name: string;
548
+ ondevicemotion: (this: Window, ev: DeviceMotionEvent) => any;
549
+ ondeviceorientation: (this: Window, ev: DeviceOrientationEvent) => any;
550
+ ondeviceorientationabsolute: (this: Window, ev: DeviceOrientationEvent) => any;
551
+ onorientationchange: (this: Window, ev: Event) => any;
552
+ opener: any;
553
+ orientation: number;
554
+ originAgentCluster: boolean;
555
+ outerHeight: number;
556
+ outerWidth: number;
557
+ pageXOffset: number;
558
+ pageYOffset: number;
559
+ parent: Window;
560
+ personalbar: BarProp;
561
+ screen: Screen;
562
+ screenLeft: number;
563
+ screenTop: number;
564
+ screenX: number;
565
+ screenY: number;
566
+ scrollX: number;
567
+ scrollY: number;
568
+ scrollbars: BarProp;
569
+ speechSynthesis: SpeechSynthesis;
570
+ status: string;
571
+ statusbar: BarProp;
572
+ toolbar: BarProp;
573
+ top: Window;
574
+ visualViewport: VisualViewport;
575
+ blur(): void {
576
+ throw new Error('Method not implemented.');
577
+ }
578
+ cancelIdleCallback(handle: number): void {
579
+ throw new Error('Method not implemented.');
580
+ }
581
+ captureEvents(): void {
582
+ throw new Error('Method not implemented.');
583
+ }
584
+ confirm(message?: string): boolean {
585
+ throw new Error('Method not implemented.');
586
+ }
587
+ focus(): void {
588
+ throw new Error('Method not implemented.');
589
+ }
590
+ getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration {
591
+ throw new Error('Method not implemented.');
592
+ }
593
+ getSelection(): Selection | null {
594
+ throw new Error('Method not implemented.');
595
+ }
596
+ matchMedia(query: string): MediaQueryList {
597
+ throw new Error('Method not implemented.');
598
+ }
599
+ moveBy(x: number, y: number): void {
600
+ throw new Error('Method not implemented.');
601
+ }
602
+ moveTo(x: number, y: number): void {
603
+ throw new Error('Method not implemented.');
604
+ }
605
+ open(url?: string | URL, target?: string, features?: string): WindowProxy | null {
606
+ throw new Error('Method not implemented.');
607
+ }
608
+ postMessage(message: unknown, targetOrigin?: unknown, transfer?: unknown): void {
609
+ throw new Error('Method not implemented.');
610
+ }
611
+ print(): void {
612
+ throw new Error('Method not implemented.');
613
+ }
614
+ prompt(message?: string, _default?: string): string | null {
615
+ throw new Error('Method not implemented.');
616
+ }
617
+ releaseEvents(): void {
618
+ throw new Error('Method not implemented.');
619
+ }
620
+ requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number {
621
+ throw new Error('Method not implemented.');
622
+ }
623
+ resizeBy(x: number, y: number): void {
624
+ throw new Error('Method not implemented.');
625
+ }
626
+ resizeTo(width: number, height: number): void {
627
+ throw new Error('Method not implemented.');
628
+ }
629
+ scroll(x?: unknown, y?: unknown): void {
630
+ throw new Error('Method not implemented.');
631
+ }
632
+ scrollBy(x?: unknown, y?: unknown): void {
633
+ throw new Error('Method not implemented.');
634
+ }
635
+ scrollTo(x?: unknown, y?: unknown): void {
636
+ throw new Error('Method not implemented.');
637
+ }
638
+ stop(): void {
639
+ throw new Error('Method not implemented.');
640
+ }
641
+ cancelAnimationFrame(handle: number): void {
642
+ throw new Error('Method not implemented.');
643
+ }
644
+ requestAnimationFrame(callback: FrameRequestCallback): number {
645
+ throw new Error('Method not implemented.');
646
+ }
647
+ onabort: (this: GlobalEventHandlers, ev: UIEvent) => any;
648
+ onanimationcancel: (this: GlobalEventHandlers, ev: AnimationEvent) => any;
649
+ onanimationend: (this: GlobalEventHandlers, ev: AnimationEvent) => any;
650
+ onanimationiteration: (this: GlobalEventHandlers, ev: AnimationEvent) => any;
651
+ onanimationstart: (this: GlobalEventHandlers, ev: AnimationEvent) => any;
652
+ onauxclick: (this: GlobalEventHandlers, ev: PointerEvent) => any;
653
+ onbeforeinput: (this: GlobalEventHandlers, ev: InputEvent) => any;
654
+ onbeforematch: (this: GlobalEventHandlers, ev: Event) => any;
655
+ onbeforetoggle: (this: GlobalEventHandlers, ev: ToggleEvent) => any;
656
+ onblur: (this: GlobalEventHandlers, ev: FocusEvent) => any;
657
+ oncancel: (this: GlobalEventHandlers, ev: Event) => any;
658
+ oncanplay: (this: GlobalEventHandlers, ev: Event) => any;
659
+ oncanplaythrough: (this: GlobalEventHandlers, ev: Event) => any;
660
+ onchange: (this: GlobalEventHandlers, ev: Event) => any;
661
+ onclick: (this: GlobalEventHandlers, ev: PointerEvent) => any;
662
+ onclose: (this: GlobalEventHandlers, ev: Event) => any;
663
+ oncontextlost: (this: GlobalEventHandlers, ev: Event) => any;
664
+ oncontextmenu: (this: GlobalEventHandlers, ev: PointerEvent) => any;
665
+ oncontextrestored: (this: GlobalEventHandlers, ev: Event) => any;
666
+ oncopy: (this: GlobalEventHandlers, ev: ClipboardEvent) => any;
667
+ oncuechange: (this: GlobalEventHandlers, ev: Event) => any;
668
+ oncut: (this: GlobalEventHandlers, ev: ClipboardEvent) => any;
669
+ ondblclick: (this: GlobalEventHandlers, ev: MouseEvent) => any;
670
+ ondrag: (this: GlobalEventHandlers, ev: DragEvent) => any;
671
+ ondragend: (this: GlobalEventHandlers, ev: DragEvent) => any;
672
+ ondragenter: (this: GlobalEventHandlers, ev: DragEvent) => any;
673
+ ondragleave: (this: GlobalEventHandlers, ev: DragEvent) => any;
674
+ ondragover: (this: GlobalEventHandlers, ev: DragEvent) => any;
675
+ ondragstart: (this: GlobalEventHandlers, ev: DragEvent) => any;
676
+ ondrop: (this: GlobalEventHandlers, ev: DragEvent) => any;
677
+ ondurationchange: (this: GlobalEventHandlers, ev: Event) => any;
678
+ onemptied: (this: GlobalEventHandlers, ev: Event) => any;
679
+ onended: (this: GlobalEventHandlers, ev: Event) => any;
680
+ onerror: OnErrorEventHandlerNonNull;
681
+ onfocus: (this: GlobalEventHandlers, ev: FocusEvent) => any;
682
+ onformdata: (this: GlobalEventHandlers, ev: FormDataEvent) => any;
683
+ ongotpointercapture: (this: GlobalEventHandlers, ev: PointerEvent) => any;
684
+ oninput: (this: GlobalEventHandlers, ev: Event) => any;
685
+ oninvalid: (this: GlobalEventHandlers, ev: Event) => any;
686
+ onkeydown: (this: GlobalEventHandlers, ev: KeyboardEvent) => any;
687
+ onkeypress: (this: GlobalEventHandlers, ev: KeyboardEvent) => any;
688
+ onkeyup: (this: GlobalEventHandlers, ev: KeyboardEvent) => any;
689
+ onload: (this: GlobalEventHandlers, ev: Event) => any;
690
+ onloadeddata: (this: GlobalEventHandlers, ev: Event) => any;
691
+ onloadedmetadata: (this: GlobalEventHandlers, ev: Event) => any;
692
+ onloadstart: (this: GlobalEventHandlers, ev: Event) => any;
693
+ onlostpointercapture: (this: GlobalEventHandlers, ev: PointerEvent) => any;
694
+ onmousedown: (this: GlobalEventHandlers, ev: MouseEvent) => any;
695
+ onmouseenter: (this: GlobalEventHandlers, ev: MouseEvent) => any;
696
+ onmouseleave: (this: GlobalEventHandlers, ev: MouseEvent) => any;
697
+ onmousemove: (this: GlobalEventHandlers, ev: MouseEvent) => any;
698
+ onmouseout: (this: GlobalEventHandlers, ev: MouseEvent) => any;
699
+ onmouseover: (this: GlobalEventHandlers, ev: MouseEvent) => any;
700
+ onmouseup: (this: GlobalEventHandlers, ev: MouseEvent) => any;
701
+ onpaste: (this: GlobalEventHandlers, ev: ClipboardEvent) => any;
702
+ onpause: (this: GlobalEventHandlers, ev: Event) => any;
703
+ onplay: (this: GlobalEventHandlers, ev: Event) => any;
704
+ onplaying: (this: GlobalEventHandlers, ev: Event) => any;
705
+ onpointercancel: (this: GlobalEventHandlers, ev: PointerEvent) => any;
706
+ onpointerdown: (this: GlobalEventHandlers, ev: PointerEvent) => any;
707
+ onpointerenter: (this: GlobalEventHandlers, ev: PointerEvent) => any;
708
+ onpointerleave: (this: GlobalEventHandlers, ev: PointerEvent) => any;
709
+ onpointermove: (this: GlobalEventHandlers, ev: PointerEvent) => any;
710
+ onpointerout: (this: GlobalEventHandlers, ev: PointerEvent) => any;
711
+ onpointerover: (this: GlobalEventHandlers, ev: PointerEvent) => any;
712
+ onpointerrawupdate: (this: GlobalEventHandlers, ev: Event) => any;
713
+ onpointerup: (this: GlobalEventHandlers, ev: PointerEvent) => any;
714
+ onprogress: (this: GlobalEventHandlers, ev: ProgressEvent) => any;
715
+ onratechange: (this: GlobalEventHandlers, ev: Event) => any;
716
+ onreset: (this: GlobalEventHandlers, ev: Event) => any;
717
+ onresize: (this: GlobalEventHandlers, ev: UIEvent) => any;
718
+ onscroll: (this: GlobalEventHandlers, ev: Event) => any;
719
+ onscrollend: (this: GlobalEventHandlers, ev: Event) => any;
720
+ onsecuritypolicyviolation: (this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any;
721
+ onseeked: (this: GlobalEventHandlers, ev: Event) => any;
722
+ onseeking: (this: GlobalEventHandlers, ev: Event) => any;
723
+ onselect: (this: GlobalEventHandlers, ev: Event) => any;
724
+ onselectionchange: (this: GlobalEventHandlers, ev: Event) => any;
725
+ onselectstart: (this: GlobalEventHandlers, ev: Event) => any;
726
+ onslotchange: (this: GlobalEventHandlers, ev: Event) => any;
727
+ onstalled: (this: GlobalEventHandlers, ev: Event) => any;
728
+ onsubmit: (this: GlobalEventHandlers, ev: SubmitEvent) => any;
729
+ onsuspend: (this: GlobalEventHandlers, ev: Event) => any;
730
+ ontimeupdate: (this: GlobalEventHandlers, ev: Event) => any;
731
+ ontoggle: (this: GlobalEventHandlers, ev: ToggleEvent) => any;
732
+ ontouchcancel?: (this: GlobalEventHandlers, ev: TouchEvent) => any;
733
+ ontouchend?: (this: GlobalEventHandlers, ev: TouchEvent) => any;
734
+ ontouchmove?: (this: GlobalEventHandlers, ev: TouchEvent) => any;
735
+ ontouchstart?: (this: GlobalEventHandlers, ev: TouchEvent) => any;
736
+ ontransitioncancel: (this: GlobalEventHandlers, ev: TransitionEvent) => any;
737
+ ontransitionend: (this: GlobalEventHandlers, ev: TransitionEvent) => any;
738
+ ontransitionrun: (this: GlobalEventHandlers, ev: TransitionEvent) => any;
739
+ ontransitionstart: (this: GlobalEventHandlers, ev: TransitionEvent) => any;
740
+ onvolumechange: (this: GlobalEventHandlers, ev: Event) => any;
741
+ onwaiting: (this: GlobalEventHandlers, ev: Event) => any;
742
+ onwebkitanimationend: (this: GlobalEventHandlers, ev: Event) => any;
743
+ onwebkitanimationiteration: (this: GlobalEventHandlers, ev: Event) => any;
744
+ onwebkitanimationstart: (this: GlobalEventHandlers, ev: Event) => any;
745
+ onwebkittransitionend: (this: GlobalEventHandlers, ev: Event) => any;
746
+ onwheel: (this: GlobalEventHandlers, ev: WheelEvent) => any;
747
+ onafterprint: (this: WindowEventHandlers, ev: Event) => any;
748
+ onbeforeprint: (this: WindowEventHandlers, ev: Event) => any;
749
+ onbeforeunload: (this: WindowEventHandlers, ev: BeforeUnloadEvent) => any;
750
+ ongamepadconnected: (this: WindowEventHandlers, ev: GamepadEvent) => any;
751
+ ongamepaddisconnected: (this: WindowEventHandlers, ev: GamepadEvent) => any;
752
+ onhashchange: (this: WindowEventHandlers, ev: HashChangeEvent) => any;
753
+ onlanguagechange: (this: WindowEventHandlers, ev: Event) => any;
754
+ onmessage: (this: WindowEventHandlers, ev: MessageEvent) => any;
755
+ onmessageerror: (this: WindowEventHandlers, ev: MessageEvent) => any;
756
+ onoffline: (this: WindowEventHandlers, ev: Event) => any;
757
+ ononline: (this: WindowEventHandlers, ev: Event) => any;
758
+ onpagehide: (this: WindowEventHandlers, ev: PageTransitionEvent) => any;
759
+ onpagereveal: (this: WindowEventHandlers, ev: PageRevealEvent) => any;
760
+ onpageshow: (this: WindowEventHandlers, ev: PageTransitionEvent) => any;
761
+ onpageswap: (this: WindowEventHandlers, ev: PageSwapEvent) => any;
762
+ onpopstate: (this: WindowEventHandlers, ev: PopStateEvent) => any;
763
+ onrejectionhandled: (this: WindowEventHandlers, ev: PromiseRejectionEvent) => any;
764
+ onstorage: (this: WindowEventHandlers, ev: StorageEvent) => any;
765
+ onunhandledrejection: (this: WindowEventHandlers, ev: PromiseRejectionEvent) => any;
766
+ onunload: (this: WindowEventHandlers, ev: Event) => any;
767
+ localStorage: Storage;
768
+ caches: CacheStorage;
769
+ crossOriginIsolated: boolean;
770
+ crypto: Crypto;
771
+ indexedDB: IDBFactory;
772
+ isSecureContext: boolean;
773
+ origin: string;
774
+ performance: Performance;
775
+ atob(data: string): string {
776
+ throw new Error('Method not implemented.');
777
+ }
778
+ btoa(data: string): string {
779
+ throw new Error('Method not implemented.');
780
+ }
781
+ createImageBitmap(image: unknown, sx?: unknown, sy?: unknown, sw?: unknown, sh?: unknown, options?: unknown): Promise<ImageBitmap> {
782
+ throw new Error('Method not implemented.');
783
+ }
784
+ fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> {
785
+ throw new Error('Method not implemented.');
786
+ }
787
+ queueMicrotask(callback: VoidFunction): void {
788
+ throw new Error('Method not implemented.');
789
+ }
790
+ reportError(e: any): void {
791
+ throw new Error('Method not implemented.');
792
+ }
793
+ structuredClone<T = any>(value: T, options?: StructuredSerializeOptions): T {
794
+ throw new Error('Method not implemented.');
795
+ }
796
+ sessionStorage: Storage;
797
+
798
+ alert(_message?: any): void {}
799
+ close(): void {
800
+ if (this._closed) return;
801
+ this._closed = true;
802
+ this._timers.forEach(id => clearTimeout(id));
803
+ this._intervals.forEach(id => clearInterval(id));
804
+ this._eventListeners.length = 0;
805
+ }
806
+
807
+ setTimeout(callback: Function, delay?: number, ...args: any[]): number {
808
+ const id = setTimeout(() => {
809
+ this._timers.delete(id as any);
810
+ callback(...args);
811
+ }, delay) as any;
812
+ this._timers.add(id);
813
+ return id;
814
+ }
815
+ clearTimeout(id: number): void {
816
+ clearTimeout(id);
817
+ this._timers.delete(id);
818
+ }
819
+ setInterval(callback: Function, delay?: number, ...args: any[]): number {
820
+ const id = setInterval(callback, delay, ...args) as any;
821
+ this._intervals.add(id);
822
+ return id;
823
+ }
824
+ clearInterval(id: number): void {
825
+ clearInterval(id);
826
+ this._intervals.delete(id);
827
+ }
828
+
829
+ addEventListener(type: string, listener: any, options?: any): void {
830
+ // Basic support for major window events
831
+ this._eventListeners.push({
832
+ type,
833
+ listener: typeof listener === 'function' ? listener : listener?.handleEvent,
834
+ options
835
+ });
836
+ }
837
+
838
+ removeEventListener(type: string, listener: any): void {
839
+ const targetListener = typeof listener === 'function' ? listener : listener?.handleEvent;
840
+ this._eventListeners = this._eventListeners.filter(l => !(l.type === type && l.listener === targetListener));
841
+ }
842
+ dispatchEvent(event: any): boolean {
843
+ const type = typeof event === 'string' ? event : event.type;
844
+ const listeners = [...this._eventListeners.filter(l => l.type === type)];
845
+
846
+ for (const l of listeners) {
847
+ try {
848
+ l.listener.call(this, event);
849
+ if (l.options?.once) {
850
+ this.removeEventListener(type, l.listener);
498
851
  }
499
-
500
- this._location = new LocationBase(initialUrl);
501
- this.history = new HistoryBase(this);
502
- this.navigator = new NavigatorBase();
503
- this.clientInformation = this.navigator;
504
-
505
- // Return a Proxy to handle the [index: number]: Window signature
506
- return new Proxy(this, {
507
- get(target: WindowBase, prop: string | symbol): any {
508
- // Handle numeric indices - return the window itself
509
- if (typeof prop === 'string' && /^\d+$/.test(prop)) {
510
- return target;
511
- }
512
- // Return the actual property
513
- return (target as any)[prop];
514
- },
515
-
516
- set(target: WindowBase, prop: string | symbol, value: any): boolean {
517
- // Handle numeric indices - ignore setting
518
- if (typeof prop === 'string' && /^\d+$/.test(prop)) {
519
- return true;
520
- }
521
- // Set the actual property
522
- (target as any)[prop] = value;
523
- return true;
524
- },
525
-
526
- has(target: WindowBase, prop: string | symbol): boolean {
527
- // Handle numeric indices
528
- if (typeof prop === 'string' && /^\d+$/.test(prop)) {
529
- return true;
530
- }
531
- // Check if property exists
532
- return prop in target;
533
- },
534
-
535
- ownKeys(target: WindowBase): ArrayLike<string | symbol> {
536
- // Get all own keys plus numeric indices for length
537
- const keys = Object.getOwnPropertyNames(target);
538
- // Add numeric indices based on length property
539
- for (let i = 0; i < target.length; i++) {
540
- keys.push(i.toString());
541
- }
542
- return keys;
543
- },
544
-
545
- getOwnPropertyDescriptor(target: WindowBase, prop: string | symbol): PropertyDescriptor | undefined {
546
- // Handle numeric indices
547
- if (typeof prop === 'string' && /^\d+$/.test(prop)) {
548
- return {
549
- enumerable: true,
550
- configurable: true,
551
- value: target
552
- };
553
- }
554
- // Return actual property descriptor
555
- return Object.getOwnPropertyDescriptor(target, prop);
556
- }
557
- });
558
- }
559
-
560
- // Window methods - all with empty implementations for server-side
561
- alert(message?: any): void { }
562
-
563
- blur(): void { }
564
-
565
- cancelIdleCallback(handle: number): void { }
566
-
567
- captureEvents(): void { }
568
-
569
- close(): void { }
570
-
571
- confirm(message?: string): boolean {
572
- return false;
573
- }
574
-
575
- focus(): void { }
576
-
577
- getComputedStyle(elt: Element, pseudoElt?: string | null): CSSStyleDeclaration {
578
- return {} as CSSStyleDeclaration;
579
- }
580
-
581
- getSelection(): Selection | null {
582
- return null;
583
- }
584
-
585
- matchMedia(query: string): MediaQueryList {
586
- return {} as MediaQueryList;
587
- }
588
-
589
- moveBy(x: number, y: number): void { }
590
-
591
- moveTo(x: number, y: number): void { }
592
-
593
- open(url?: string | URL, target?: string, features?: string): WindowProxy | null {
594
- return null;
852
+ } catch (e) {
853
+ console.error(`Error in Window event listener for ${type}:`, e);
854
+ }
595
855
  }
856
+ return true;
857
+ }
596
858
 
597
- postMessage(message: any, targetOrigin: string, transfer?: Transferable[]): void;
598
- postMessage(message: any, options?: WindowPostMessageOptions): void;
599
- postMessage(message: any, targetOriginOrOptions?: string | WindowPostMessageOptions, transfer?: Transferable[]): void { }
600
-
601
- print(): void { }
602
-
603
- prompt(message?: string, _default?: string): string | null {
604
- return null;
605
- }
606
-
607
- releaseEvents(): void { }
608
-
609
- requestIdleCallback(callback: IdleRequestCallback, options?: IdleRequestOptions): number {
610
- return 0;
611
- }
612
-
613
- resizeBy(x: number, y: number): void { }
614
-
615
- resizeTo(width: number, height: number): void { }
616
-
617
- scroll(options?: ScrollToOptions): void;
618
- scroll(x: number, y: number): void;
619
- scroll(optionsOrX?: ScrollToOptions | number, y?: number): void { }
620
-
621
- scrollBy(options?: ScrollToOptions): void;
622
- scrollBy(x: number, y: number): void;
623
- scrollBy(optionsOrX?: ScrollToOptions | number, y?: number): void { }
624
-
625
- scrollTo(options?: ScrollToOptions): void;
626
- scrollTo(x: number, y: number): void;
627
- scrollTo(optionsOrX?: ScrollToOptions | number, y?: number): void { }
628
-
629
- stop(): void { }
630
-
631
- // Timer methods
632
- setTimeout(callback: Function, delay?: number, ...args: any[]): number {
633
- return setTimeout(callback, delay, ...args) as any;
634
- }
635
-
636
- clearTimeout(id: number): void {
637
- clearTimeout(id);
638
- }
639
-
640
- setInterval(callback: Function, delay?: number, ...args: any[]): number {
641
- return setInterval(callback, delay, ...args) as any;
642
- }
643
-
644
- clearInterval(id: number): void {
645
- clearInterval(id);
646
- }
647
-
648
- // Animation methods
649
- requestAnimationFrame(callback: FrameRequestCallback): number {
650
- return this.setTimeout(callback, 16) as number;
651
- }
652
-
653
- cancelAnimationFrame(id: number): void {
654
- this.clearTimeout(id);
655
- }
656
-
657
- // Event methods
658
- addEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | AddEventListenerOptions): void;
659
- addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
660
- addEventListener(type: any, listener: any, options?: any): void {
661
- // Support popstate, load, unload, and beforeunload events
662
- if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {
663
- this._eventListeners.push({
664
- type,
665
- listener: typeof listener === 'function' ? listener : listener.handleEvent,
666
- options
667
- });
668
- }
669
- }
670
-
671
- removeEventListener<K extends keyof WindowEventMap>(type: K, listener: (this: Window, ev: WindowEventMap[K]) => any, options?: boolean | EventListenerOptions): void;
672
- removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
673
- removeEventListener(type: any, listener: any, options?: any): void {
674
- if (type === 'popstate' || type === 'load' || type === 'unload' || type === 'beforeunload') {
675
- const targetListener = typeof listener === 'function' ? listener : listener.handleEvent;
676
- this._eventListeners = this._eventListeners.filter(
677
- eventListener => !(eventListener.type === type && eventListener.listener === targetListener)
678
- );
679
- }
680
- }
681
-
682
- dispatchEvent(event: any): boolean {
683
- const eventListeners = this._eventListeners.filter(listener => listener.type === event.type);
684
-
685
- for (const eventListener of eventListeners) {
686
- try {
687
- eventListener.listener.call(this, event);
688
-
689
- // Handle 'once' option
690
- if (eventListener.options && typeof eventListener.options === 'object' && eventListener.options.once) {
691
- this.removeEventListener(event.type, eventListener.listener);
692
- }
693
- } catch (error) {
694
- console.error('Error in event listener:', error);
695
- }
696
- }
697
-
698
- return true;
699
- }
700
-
701
- /**
702
- * Dispatch a popstate event to registered listeners
703
- */
704
- private dispatchPopStateEvent(state: any, url?: string): void {
705
- const popStateEvent: PopStateEvent = {
706
- type: 'popstate',
707
- state,
708
- url
709
- };
710
-
711
- this.dispatchEvent(popStateEvent);
712
- }
713
-
714
- // EventTarget methods (inherited)
715
- // These are already covered by addEventListener/removeEventListener/dispatchEvent
716
-
717
- // GlobalEventHandlers - empty implementations
718
- onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;
719
- onanimationcancel: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
720
- onanimationend: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
721
- onanimationiteration: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
722
- onanimationstart: ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null;
723
- onauxclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
724
- onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null = null;
725
- onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;
726
- oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
727
- oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
728
- oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
729
- onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
730
- onclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
731
- onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
732
- oncontextmenu: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
733
- oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;
734
- oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
735
- oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;
736
- ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
737
- ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
738
- ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
739
- ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
740
- ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
741
- ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
742
- ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
743
- ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null;
744
- ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
745
- onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
746
- onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
747
- onerror: OnErrorEventHandler = null;
748
- onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null;
749
- onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null = null;
750
- ongotpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
751
- oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
752
- oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
753
- onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;
754
- onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;
755
- onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null = null;
756
- onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
757
- onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
758
- onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
759
- onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
760
- onlostpointercapture: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
761
- onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
762
- onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
763
- onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
764
- onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
765
- onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
766
- onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
767
- onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null = null;
768
- onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null = null;
769
- onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
770
- onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
771
- onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
772
- onpointercancel: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
773
- onpointerdown: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
774
- onpointerenter: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
775
- onpointerleave: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
776
- onpointermove: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
777
- onpointerout: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
778
- onpointerover: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
779
- onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null;
780
- onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent<EventTarget>) => any) | null = null;
781
- onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
782
- onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
783
- onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null;
784
- onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
785
- onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
786
- onsecuritypolicyviolation: ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any) | null = null;
787
- onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
788
- onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
789
- onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
790
- onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
791
- onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
792
- onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
793
- onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
794
- onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null = null;
795
- onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
796
- ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
797
- ontoggle: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
798
- ontouchcancel?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
799
- ontouchend?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
800
- ontouchmove?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
801
- ontouchstart?: ((this: GlobalEventHandlers, ev: TouchEvent) => any) | null = null;
802
- ontransitioncancel: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
803
- ontransitionend: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
804
- ontransitionrun: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
805
- ontransitionstart: ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null;
806
- onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
807
- onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
808
- onwebkitanimationend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
809
- onwebkitanimationiteration: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
810
- onwebkitanimationstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
811
- onwebkittransitionend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null;
812
- onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null;
813
-
814
- // WindowEventHandlers - empty implementations
815
- onafterprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
816
- onbeforeprint: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
817
- onbeforeunload: ((this: WindowEventHandlers, ev: BeforeUnloadEvent) => any) | null = null;
818
- onhashchange: ((this: WindowEventHandlers, ev: HashChangeEvent) => any) | null = null;
819
- onlanguagechange: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
820
- onmessage: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;
821
- onmessageerror: ((this: WindowEventHandlers, ev: MessageEvent) => any) | null = null;
822
- onoffline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
823
- ononline: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
824
- onpagehide: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;
825
- onpageshow: ((this: WindowEventHandlers, ev: PageTransitionEvent) => any) | null = null;
826
- onpopstate: ((this: WindowEventHandlers, ev: PopStateEvent) => any) | null = null;
827
- onrejectionhandled: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;
828
- onstorage: ((this: WindowEventHandlers, ev: StorageEvent) => any) | null = null;
829
- onunhandledrejection: ((this: WindowEventHandlers, ev: PromiseRejectionEvent) => any) | null = null;
830
- onunload: ((this: WindowEventHandlers, ev: Event) => any) | null = null;
831
-
832
- // WindowLocalStorage
833
- readonly localStorage: Storage = {} as Storage;
834
-
835
- // WindowOrWorkerGlobalScope - empty implementations
836
- readonly caches: CacheStorage = {} as CacheStorage;
837
- readonly crossOriginIsolated: boolean = false;
838
- readonly crypto: Crypto = {} as Crypto;
839
- readonly indexedDB: IDBFactory = {} as IDBFactory;
840
- readonly isSecureContext: boolean = false;
841
- readonly origin: string = 'null';
842
- readonly performance: Performance = {} as Performance;
843
-
844
- atob(data: string): string { return ''; }
845
- btoa(data: string): string { return ''; }
846
- createImageBitmap(image: ImageBitmapSource, options?: ImageBitmapOptions): Promise<ImageBitmap>;
847
- createImageBitmap(image: ImageBitmapSource, sx: number, sy: number, sw: number, sh: number, options?: ImageBitmapOptions): Promise<ImageBitmap>;
848
- createImageBitmap(...args: any[]): Promise<ImageBitmap> { return Promise.resolve({} as ImageBitmap); }
849
-
850
- fetch(input: RequestInfo | URL, init?: RequestInit): Promise<Response> { return Promise.resolve({} as Response); }
851
- queueMicrotask(callback: VoidFunction): void { }
852
- reportError(e: any): void { }
853
- structuredClone(value: any, options?: StructuredSerializeOptions): any { return value; }
854
-
855
- // WindowSessionStorage
856
- readonly sessionStorage: Storage = {} as Storage;
857
-
858
- // AnimationFrameProvider - already implemented above
859
-
860
- // Index signature - getter implementation
861
- [index: number]: Window;
862
-
863
-
864
-
865
- /**
866
- * Recursive HTML parsing
867
- */
868
- private parseHTMLRecursive(html: string, parent: any): void {
869
- let position = 0;
870
-
871
- while (position < html.length) {
872
- const tagStart = html.indexOf('<', position);
873
-
874
- if (tagStart === -1) {
875
- const remainingText = html.substring(position).trim();
876
- if (remainingText) {
877
- const textNode = this.document.createTextNode(remainingText);
878
- parent.appendChild(textNode);
879
- }
880
- break;
881
- }
882
-
883
- if (tagStart > position) {
884
- const textContent = html.substring(position, tagStart).trim();
885
- if (textContent) {
886
- const textNode = this.document.createTextNode(textContent);
887
- parent.appendChild(textNode);
888
- }
889
- }
890
-
891
- const tagEnd = html.indexOf('>', tagStart);
892
- if (tagEnd === -1) break;
893
-
894
- const tagContent = html.substring(tagStart + 1, tagEnd);
895
-
896
- if (tagContent.startsWith('/')) {
897
- position = tagEnd + 1;
898
- break;
899
- }
900
-
901
- const isSelfClosing = tagContent.endsWith('/') || this.isSelfClosingTag(tagContent.split(/\s+/)[0]);
902
- const spaceIndex = tagContent.indexOf(' ');
903
- const tagName = spaceIndex === -1 ? tagContent.replace('/', '') : tagContent.substring(0, spaceIndex);
904
- const attributes = spaceIndex === -1 ? '' : tagContent.substring(spaceIndex + 1).replace('/', '');
905
-
906
- const element = this.document.createElement(tagName.toLowerCase());
907
-
908
- if (attributes.trim()) {
909
- this.parseAttributes(attributes, element);
910
- }
911
-
912
- // Handle special HTML structure tags
913
- if (tagName.toLowerCase() === 'html') {
914
- // Replace documentElement
915
- (this.document as any).documentElement = element;
916
- this.document.appendChild(element);
917
- } else if (tagName.toLowerCase() === 'head') {
918
- (this.document as any).head = element;
919
- if (this.document.documentElement) {
920
- this.document.documentElement.appendChild(element);
921
- } else {
922
- parent.appendChild(element);
923
- }
924
- } else if (tagName.toLowerCase() === 'body') {
925
- (this.document as any).body = element;
926
- if (this.document.documentElement) {
927
- this.document.documentElement.appendChild(element);
928
- } else {
929
- parent.appendChild(element);
930
- }
931
- } else {
932
- parent.appendChild(element);
933
- }
934
-
935
- if (isSelfClosing) {
936
- position = tagEnd + 1;
937
- } else {
938
- const closingTag = `</${tagName}>`;
939
- const closingTagIndex = this.findMatchingClosingTag(html, tagEnd + 1, tagName);
940
-
941
- if (closingTagIndex !== -1) {
942
- const innerContent = html.substring(tagEnd + 1, closingTagIndex);
943
- if (innerContent.trim()) {
944
- this.parseHTMLRecursive(innerContent, element);
945
- }
946
- position = closingTagIndex + closingTag.length;
947
- } else {
948
- position = tagEnd + 1;
949
- }
950
- }
951
- }
952
- }
953
-
954
- private findMatchingClosingTag(html: string, startPos: number, tagName: string): number {
955
- const openTag = `<${tagName}`;
956
- const closeTag = `</${tagName}>`;
957
- let depth = 1;
958
- let pos = startPos;
959
-
960
- while (pos < html.length && depth > 0) {
961
- const nextOpen = html.indexOf(openTag, pos);
962
- const nextClose = html.indexOf(closeTag, pos);
963
-
964
- if (nextClose === -1) return -1;
965
-
966
- if (nextOpen !== -1 && nextOpen < nextClose) {
967
- depth++;
968
- pos = nextOpen + openTag.length;
969
- } else {
970
- depth--;
971
- if (depth === 0) return nextClose;
972
- pos = nextClose + closeTag.length;
973
- }
974
- }
975
-
976
- return -1;
977
- }
978
-
979
- private parseAttributes(attributeString: string, element: any): void {
980
- // Updated regex to handle hyphenated attribute names like dr-for-of, data-bind, etc.
981
- const attrRegex = /([\w:-]+)(?:\s*=\s*(['"])(.*?)\2)?/g;
982
- let match;
983
-
984
- while ((match = attrRegex.exec(attributeString)) !== null) {
985
- const name = match[1];
986
- let value = match[3] || ''; // match[3] is the content between quotes
987
- element.setAttribute(name, value);
988
- }
989
- }
990
-
991
- private isSelfClosingTag(tagName: string): boolean {
992
- const selfClosingTags = ['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr'];
993
- return selfClosingTags.includes(tagName.toLowerCase());
994
- }
995
-
996
- /**
997
- * Clear current document content
998
- */
999
- private clearDocumentContent(): void {
1000
- const doc = this.document as any;
1001
-
1002
- // Clear head content
1003
- if (doc.head) {
1004
- while (doc.head.firstChild) {
1005
- doc.head.removeChild(doc.head.firstChild);
1006
- }
1007
- }
1008
-
1009
- // Clear body content
1010
- if (doc.body) {
1011
- while (doc.body.firstChild) {
1012
- doc.body.removeChild(doc.body.firstChild);
1013
- }
1014
- }
1015
- }
1016
-
1017
-
1018
- }
859
+ private dispatchPopStateEvent(state: any, url?: string): void {
860
+ this.dispatchEvent({ type: 'popstate', state, url });
861
+ }
862
+ }