happy-dom 15.11.6 → 16.0.0

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 (489) hide show
  1. package/cjs/PropertySymbol.cjs +12 -9
  2. package/cjs/PropertySymbol.cjs.map +1 -1
  3. package/cjs/PropertySymbol.d.ts +4 -1
  4. package/cjs/PropertySymbol.d.ts.map +1 -1
  5. package/cjs/browser/utilities/BrowserFrameURL.cjs +1 -1
  6. package/cjs/browser/utilities/BrowserFrameURL.cjs.map +1 -1
  7. package/cjs/browser/utilities/BrowserFrameURL.d.ts +1 -1
  8. package/cjs/browser/utilities/BrowserFrameURL.d.ts.map +1 -1
  9. package/cjs/config/HTMLElementConfig.cjs +42 -16
  10. package/cjs/config/HTMLElementConfig.cjs.map +1 -1
  11. package/cjs/config/HTMLElementConfig.d.ts +7 -0
  12. package/cjs/config/HTMLElementConfig.d.ts.map +1 -1
  13. package/cjs/config/HTMLElementConfigContentModelEnum.cjs +3 -0
  14. package/cjs/config/HTMLElementConfigContentModelEnum.cjs.map +1 -1
  15. package/cjs/config/HTMLElementConfigContentModelEnum.d.ts +3 -0
  16. package/cjs/config/HTMLElementConfigContentModelEnum.d.ts.map +1 -1
  17. package/cjs/config/NamespaceURI.cjs +2 -0
  18. package/cjs/config/NamespaceURI.cjs.map +1 -1
  19. package/cjs/config/NamespaceURI.d.ts +2 -0
  20. package/cjs/config/NamespaceURI.d.ts.map +1 -1
  21. package/cjs/css/declaration/CSSStyleDeclaration.cjs +1 -1
  22. package/cjs/css/declaration/CSSStyleDeclaration.cjs.map +1 -1
  23. package/cjs/css/declaration/CSSStyleDeclaration.d.ts.map +1 -1
  24. package/cjs/css/declaration/computed-style/CSSStyleDeclarationComputedStyle.cjs +2 -2
  25. package/cjs/css/declaration/computed-style/CSSStyleDeclarationComputedStyle.cjs.map +1 -1
  26. package/cjs/css/declaration/computed-style/CSSStyleDeclarationComputedStyle.d.ts.map +1 -1
  27. package/cjs/custom-element/CustomElementReactionStack.cjs +100 -0
  28. package/cjs/custom-element/CustomElementReactionStack.cjs.map +1 -0
  29. package/cjs/custom-element/CustomElementReactionStack.d.ts +27 -0
  30. package/cjs/custom-element/CustomElementReactionStack.d.ts.map +1 -0
  31. package/cjs/custom-element/CustomElementRegistry.cjs +32 -45
  32. package/cjs/custom-element/CustomElementRegistry.cjs.map +1 -1
  33. package/cjs/custom-element/CustomElementRegistry.d.ts +2 -6
  34. package/cjs/custom-element/CustomElementRegistry.d.ts.map +1 -1
  35. package/cjs/custom-element/CustomElementUtility.cjs +35 -0
  36. package/cjs/custom-element/CustomElementUtility.cjs.map +1 -0
  37. package/cjs/custom-element/CustomElementUtility.d.ts +14 -0
  38. package/cjs/custom-element/CustomElementUtility.d.ts.map +1 -0
  39. package/cjs/custom-element/ICustomElementDefinition.cjs +3 -0
  40. package/cjs/custom-element/ICustomElementDefinition.cjs.map +1 -0
  41. package/cjs/custom-element/ICustomElementDefinition.d.ts +12 -0
  42. package/cjs/custom-element/ICustomElementDefinition.d.ts.map +1 -0
  43. package/cjs/dom/DOMStringMap.cjs +8 -8
  44. package/cjs/dom/DOMStringMap.cjs.map +1 -1
  45. package/cjs/dom/DOMStringMap.d.ts.map +1 -1
  46. package/cjs/dom/DOMTokenList.cjs +1 -1
  47. package/cjs/dom/DOMTokenList.cjs.map +1 -1
  48. package/cjs/dom-parser/DOMParser.cjs +5 -67
  49. package/cjs/dom-parser/DOMParser.cjs.map +1 -1
  50. package/cjs/dom-parser/DOMParser.d.ts +0 -1
  51. package/cjs/dom-parser/DOMParser.d.ts.map +1 -1
  52. package/cjs/exception/DOMExceptionNameEnum.cjs +1 -0
  53. package/cjs/exception/DOMExceptionNameEnum.cjs.map +1 -1
  54. package/cjs/exception/DOMExceptionNameEnum.d.ts +2 -1
  55. package/cjs/exception/DOMExceptionNameEnum.d.ts.map +1 -1
  56. package/cjs/history/History.cjs +8 -8
  57. package/cjs/history/History.cjs.map +1 -1
  58. package/cjs/history/History.d.ts +2 -2
  59. package/cjs/history/History.d.ts.map +1 -1
  60. package/cjs/html-parser/HTMLParser.cjs +726 -0
  61. package/cjs/html-parser/HTMLParser.cjs.map +1 -0
  62. package/cjs/html-parser/HTMLParser.d.ts +91 -0
  63. package/cjs/html-parser/HTMLParser.d.ts.map +1 -0
  64. package/cjs/html-serializer/HTMLSerializer.cjs +152 -0
  65. package/cjs/html-serializer/HTMLSerializer.cjs.map +1 -0
  66. package/cjs/html-serializer/HTMLSerializer.d.ts +36 -0
  67. package/cjs/html-serializer/HTMLSerializer.d.ts.map +1 -0
  68. package/cjs/nodes/document/Document.cjs +105 -121
  69. package/cjs/nodes/document/Document.cjs.map +1 -1
  70. package/cjs/nodes/document/Document.d.ts +8 -0
  71. package/cjs/nodes/document/Document.d.ts.map +1 -1
  72. package/cjs/nodes/element/Element.cjs +35 -53
  73. package/cjs/nodes/element/Element.cjs.map +1 -1
  74. package/cjs/nodes/element/Element.d.ts +2 -12
  75. package/cjs/nodes/element/Element.d.ts.map +1 -1
  76. package/cjs/nodes/element/HTMLCollection.cjs +5 -9
  77. package/cjs/nodes/element/HTMLCollection.cjs.map +1 -1
  78. package/cjs/nodes/element/HTMLCollection.d.ts.map +1 -1
  79. package/cjs/nodes/element/NamedNodeMap.cjs +39 -52
  80. package/cjs/nodes/element/NamedNodeMap.cjs.map +1 -1
  81. package/cjs/nodes/element/NamedNodeMap.d.ts +1 -16
  82. package/cjs/nodes/element/NamedNodeMap.d.ts.map +1 -1
  83. package/cjs/nodes/element/NamedNodeMapProxyFactory.cjs +12 -14
  84. package/cjs/nodes/element/NamedNodeMapProxyFactory.cjs.map +1 -1
  85. package/cjs/nodes/element/NamedNodeMapProxyFactory.d.ts.map +1 -1
  86. package/cjs/nodes/html-button-element/HTMLButtonElement.cjs +1 -1
  87. package/cjs/nodes/html-button-element/HTMLButtonElement.cjs.map +1 -1
  88. package/cjs/nodes/html-button-element/HTMLButtonElement.d.ts.map +1 -1
  89. package/cjs/nodes/html-document/HTMLDocument.cjs +33 -2
  90. package/cjs/nodes/html-document/HTMLDocument.cjs.map +1 -1
  91. package/cjs/nodes/html-document/HTMLDocument.d.ts +10 -0
  92. package/cjs/nodes/html-document/HTMLDocument.d.ts.map +1 -1
  93. package/cjs/nodes/html-element/HTMLElement.cjs +52 -22
  94. package/cjs/nodes/html-element/HTMLElement.cjs.map +1 -1
  95. package/cjs/nodes/html-element/HTMLElement.d.ts +34 -0
  96. package/cjs/nodes/html-element/HTMLElement.d.ts.map +1 -1
  97. package/cjs/nodes/html-field-set-element/HTMLFieldSetElement.cjs +1 -1
  98. package/cjs/nodes/html-field-set-element/HTMLFieldSetElement.cjs.map +1 -1
  99. package/cjs/nodes/html-field-set-element/HTMLFieldSetElement.d.ts.map +1 -1
  100. package/cjs/nodes/html-form-element/HTMLFormElement.cjs +5 -8
  101. package/cjs/nodes/html-form-element/HTMLFormElement.cjs.map +1 -1
  102. package/cjs/nodes/html-form-element/HTMLFormElement.d.ts.map +1 -1
  103. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs +1 -1
  104. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs.map +1 -1
  105. package/cjs/nodes/html-input-element/HTMLInputElement.cjs +1 -1
  106. package/cjs/nodes/html-input-element/HTMLInputElement.cjs.map +1 -1
  107. package/cjs/nodes/html-input-element/HTMLInputElement.d.ts.map +1 -1
  108. package/cjs/nodes/html-media-element/TextTrackList.cjs +1 -1
  109. package/cjs/nodes/html-media-element/TextTrackList.cjs.map +1 -1
  110. package/cjs/nodes/html-object-element/HTMLObjectElement.cjs +1 -1
  111. package/cjs/nodes/html-object-element/HTMLObjectElement.cjs.map +1 -1
  112. package/cjs/nodes/html-object-element/HTMLObjectElement.d.ts.map +1 -1
  113. package/cjs/nodes/html-output-element/HTMLOutputElement.cjs +1 -1
  114. package/cjs/nodes/html-output-element/HTMLOutputElement.cjs.map +1 -1
  115. package/cjs/nodes/html-output-element/HTMLOutputElement.d.ts.map +1 -1
  116. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs +3 -1
  117. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs.map +1 -1
  118. package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  119. package/cjs/nodes/html-select-element/HTMLSelectElement.cjs +2 -2
  120. package/cjs/nodes/html-select-element/HTMLSelectElement.cjs.map +1 -1
  121. package/cjs/nodes/html-select-element/HTMLSelectElement.d.ts.map +1 -1
  122. package/cjs/nodes/html-table-element/HTMLTableElement.cjs +9 -1
  123. package/cjs/nodes/html-table-element/HTMLTableElement.cjs.map +1 -1
  124. package/cjs/nodes/html-table-element/HTMLTableElement.d.ts.map +1 -1
  125. package/cjs/nodes/html-table-row-element/HTMLTableRowElement.cjs +1 -1
  126. package/cjs/nodes/html-template-element/HTMLTemplateElement.cjs +15 -17
  127. package/cjs/nodes/html-template-element/HTMLTemplateElement.cjs.map +1 -1
  128. package/cjs/nodes/html-template-element/HTMLTemplateElement.d.ts +2 -2
  129. package/cjs/nodes/html-template-element/HTMLTemplateElement.d.ts.map +1 -1
  130. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.cjs +1 -1
  131. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.cjs.map +1 -1
  132. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.d.ts.map +1 -1
  133. package/cjs/nodes/node/Node.cjs +44 -48
  134. package/cjs/nodes/node/Node.cjs.map +1 -1
  135. package/cjs/nodes/node/Node.d.ts +2 -10
  136. package/cjs/nodes/node/Node.d.ts.map +1 -1
  137. package/cjs/nodes/node/NodeList.cjs +1 -1
  138. package/cjs/nodes/node/NodeList.cjs.map +1 -1
  139. package/cjs/nodes/node/NodeUtility.cjs +4 -3
  140. package/cjs/nodes/node/NodeUtility.cjs.map +1 -1
  141. package/cjs/nodes/node/NodeUtility.d.ts.map +1 -1
  142. package/cjs/nodes/parent-node/ParentNodeUtility.cjs +5 -2
  143. package/cjs/nodes/parent-node/ParentNodeUtility.cjs.map +1 -1
  144. package/cjs/nodes/parent-node/ParentNodeUtility.d.ts.map +1 -1
  145. package/cjs/nodes/shadow-root/ShadowRoot.cjs +8 -8
  146. package/cjs/nodes/shadow-root/ShadowRoot.cjs.map +1 -1
  147. package/cjs/nodes/shadow-root/ShadowRoot.d.ts.map +1 -1
  148. package/cjs/nodes/xml-document/XMLDocument.cjs +26 -0
  149. package/cjs/nodes/xml-document/XMLDocument.cjs.map +1 -1
  150. package/cjs/nodes/xml-document/XMLDocument.d.ts +2 -0
  151. package/cjs/nodes/xml-document/XMLDocument.d.ts.map +1 -1
  152. package/cjs/query-selector/SelectorItem.cjs +1 -2
  153. package/cjs/query-selector/SelectorItem.cjs.map +1 -1
  154. package/cjs/query-selector/SelectorItem.d.ts.map +1 -1
  155. package/cjs/range/Range.cjs +3 -3
  156. package/cjs/range/Range.cjs.map +1 -1
  157. package/cjs/range/Range.d.ts.map +1 -1
  158. package/cjs/storage/Storage.cjs +1 -1
  159. package/cjs/storage/Storage.cjs.map +1 -1
  160. package/cjs/svg/SVGLengthList.cjs +1 -1
  161. package/cjs/svg/SVGLengthList.cjs.map +1 -1
  162. package/cjs/svg/SVGNumberList.cjs +1 -1
  163. package/cjs/svg/SVGNumberList.cjs.map +1 -1
  164. package/cjs/svg/SVGPointList.cjs +1 -1
  165. package/cjs/svg/SVGPointList.cjs.map +1 -1
  166. package/cjs/svg/SVGStringList.cjs +1 -1
  167. package/cjs/svg/SVGStringList.cjs.map +1 -1
  168. package/cjs/svg/SVGTransformList.cjs +1 -1
  169. package/cjs/svg/SVGTransformList.cjs.map +1 -1
  170. package/cjs/tree-walker/NodeIterator.cjs +63 -6
  171. package/cjs/tree-walker/NodeIterator.cjs.map +1 -1
  172. package/cjs/tree-walker/NodeIterator.d.ts +18 -3
  173. package/cjs/tree-walker/NodeIterator.d.ts.map +1 -1
  174. package/cjs/tree-walker/TreeWalker.cjs +6 -6
  175. package/cjs/tree-walker/TreeWalker.cjs.map +1 -1
  176. package/cjs/tree-walker/TreeWalker.d.ts +2 -1
  177. package/cjs/tree-walker/TreeWalker.d.ts.map +1 -1
  178. package/cjs/utilities/ClassMethodBinder.cjs.map +1 -0
  179. package/cjs/utilities/ClassMethodBinder.d.ts.map +1 -0
  180. package/cjs/utilities/StringUtility.cjs.map +1 -0
  181. package/cjs/utilities/StringUtility.d.ts.map +1 -0
  182. package/cjs/utilities/XMLEncodeUtility.cjs +119 -0
  183. package/cjs/utilities/XMLEncodeUtility.cjs.map +1 -0
  184. package/cjs/utilities/XMLEncodeUtility.d.ts +48 -0
  185. package/cjs/utilities/XMLEncodeUtility.d.ts.map +1 -0
  186. package/cjs/window/BrowserWindow.cjs +9 -3
  187. package/cjs/window/BrowserWindow.cjs.map +1 -1
  188. package/cjs/window/BrowserWindow.d.ts +2 -0
  189. package/cjs/window/BrowserWindow.d.ts.map +1 -1
  190. package/cjs/window/WindowErrorUtility.cjs +1 -1
  191. package/cjs/window/WindowErrorUtility.cjs.map +1 -1
  192. package/cjs/xml-http-request/XMLHttpRequest.cjs +2 -1
  193. package/cjs/xml-http-request/XMLHttpRequest.cjs.map +1 -1
  194. package/cjs/xml-http-request/XMLHttpRequest.d.ts.map +1 -1
  195. package/cjs/xml-http-request/XMLHttpRequestResponseDataParser.cjs +1 -1
  196. package/cjs/xml-http-request/XMLHttpRequestResponseDataParser.cjs.map +1 -1
  197. package/cjs/xml-parser/XMLParser.cjs +531 -242
  198. package/cjs/xml-parser/XMLParser.cjs.map +1 -1
  199. package/cjs/xml-parser/XMLParser.d.ts +89 -19
  200. package/cjs/xml-parser/XMLParser.d.ts.map +1 -1
  201. package/cjs/xml-serializer/XMLSerializer.cjs +136 -40
  202. package/cjs/xml-serializer/XMLSerializer.cjs.map +1 -1
  203. package/cjs/xml-serializer/XMLSerializer.d.ts +6 -17
  204. package/cjs/xml-serializer/XMLSerializer.d.ts.map +1 -1
  205. package/lib/PropertySymbol.d.ts +4 -1
  206. package/lib/PropertySymbol.d.ts.map +1 -1
  207. package/lib/PropertySymbol.js +4 -1
  208. package/lib/PropertySymbol.js.map +1 -1
  209. package/lib/browser/utilities/BrowserFrameURL.d.ts +1 -1
  210. package/lib/browser/utilities/BrowserFrameURL.d.ts.map +1 -1
  211. package/lib/browser/utilities/BrowserFrameURL.js +1 -1
  212. package/lib/browser/utilities/BrowserFrameURL.js.map +1 -1
  213. package/lib/config/HTMLElementConfig.d.ts +7 -0
  214. package/lib/config/HTMLElementConfig.d.ts.map +1 -1
  215. package/lib/config/HTMLElementConfig.js +42 -16
  216. package/lib/config/HTMLElementConfig.js.map +1 -1
  217. package/lib/config/HTMLElementConfigContentModelEnum.d.ts +3 -0
  218. package/lib/config/HTMLElementConfigContentModelEnum.d.ts.map +1 -1
  219. package/lib/config/HTMLElementConfigContentModelEnum.js +3 -0
  220. package/lib/config/HTMLElementConfigContentModelEnum.js.map +1 -1
  221. package/lib/config/NamespaceURI.d.ts +2 -0
  222. package/lib/config/NamespaceURI.d.ts.map +1 -1
  223. package/lib/config/NamespaceURI.js +2 -0
  224. package/lib/config/NamespaceURI.js.map +1 -1
  225. package/lib/css/declaration/CSSStyleDeclaration.d.ts.map +1 -1
  226. package/lib/css/declaration/CSSStyleDeclaration.js +1 -1
  227. package/lib/css/declaration/CSSStyleDeclaration.js.map +1 -1
  228. package/lib/css/declaration/computed-style/CSSStyleDeclarationComputedStyle.d.ts.map +1 -1
  229. package/lib/css/declaration/computed-style/CSSStyleDeclarationComputedStyle.js +2 -2
  230. package/lib/css/declaration/computed-style/CSSStyleDeclarationComputedStyle.js.map +1 -1
  231. package/lib/custom-element/CustomElementReactionStack.d.ts +27 -0
  232. package/lib/custom-element/CustomElementReactionStack.d.ts.map +1 -0
  233. package/lib/custom-element/CustomElementReactionStack.js +71 -0
  234. package/lib/custom-element/CustomElementReactionStack.js.map +1 -0
  235. package/lib/custom-element/CustomElementRegistry.d.ts +2 -6
  236. package/lib/custom-element/CustomElementRegistry.d.ts.map +1 -1
  237. package/lib/custom-element/CustomElementRegistry.js +32 -45
  238. package/lib/custom-element/CustomElementRegistry.js.map +1 -1
  239. package/lib/custom-element/CustomElementUtility.d.ts +14 -0
  240. package/lib/custom-element/CustomElementUtility.d.ts.map +1 -0
  241. package/lib/custom-element/CustomElementUtility.js +32 -0
  242. package/lib/custom-element/CustomElementUtility.js.map +1 -0
  243. package/lib/custom-element/ICustomElementDefinition.d.ts +12 -0
  244. package/lib/custom-element/ICustomElementDefinition.d.ts.map +1 -0
  245. package/lib/custom-element/ICustomElementDefinition.js +2 -0
  246. package/lib/custom-element/ICustomElementDefinition.js.map +1 -0
  247. package/lib/dom/DOMStringMap.d.ts.map +1 -1
  248. package/lib/dom/DOMStringMap.js +8 -8
  249. package/lib/dom/DOMStringMap.js.map +1 -1
  250. package/lib/dom/DOMTokenList.js +1 -1
  251. package/lib/dom/DOMTokenList.js.map +1 -1
  252. package/lib/dom-parser/DOMParser.d.ts +0 -1
  253. package/lib/dom-parser/DOMParser.d.ts.map +1 -1
  254. package/lib/dom-parser/DOMParser.js +5 -67
  255. package/lib/dom-parser/DOMParser.js.map +1 -1
  256. package/lib/exception/DOMExceptionNameEnum.d.ts +2 -1
  257. package/lib/exception/DOMExceptionNameEnum.d.ts.map +1 -1
  258. package/lib/exception/DOMExceptionNameEnum.js +1 -0
  259. package/lib/exception/DOMExceptionNameEnum.js.map +1 -1
  260. package/lib/history/History.d.ts +2 -2
  261. package/lib/history/History.d.ts.map +1 -1
  262. package/lib/history/History.js +8 -8
  263. package/lib/history/History.js.map +1 -1
  264. package/lib/html-parser/HTMLParser.d.ts +91 -0
  265. package/lib/html-parser/HTMLParser.d.ts.map +1 -0
  266. package/lib/html-parser/HTMLParser.js +697 -0
  267. package/lib/html-parser/HTMLParser.js.map +1 -0
  268. package/lib/html-serializer/HTMLSerializer.d.ts +36 -0
  269. package/lib/html-serializer/HTMLSerializer.d.ts.map +1 -0
  270. package/lib/html-serializer/HTMLSerializer.js +123 -0
  271. package/lib/html-serializer/HTMLSerializer.js.map +1 -0
  272. package/lib/nodes/document/Document.d.ts +8 -0
  273. package/lib/nodes/document/Document.d.ts.map +1 -1
  274. package/lib/nodes/document/Document.js +106 -122
  275. package/lib/nodes/document/Document.js.map +1 -1
  276. package/lib/nodes/element/Element.d.ts +2 -12
  277. package/lib/nodes/element/Element.d.ts.map +1 -1
  278. package/lib/nodes/element/Element.js +35 -53
  279. package/lib/nodes/element/Element.js.map +1 -1
  280. package/lib/nodes/element/HTMLCollection.d.ts.map +1 -1
  281. package/lib/nodes/element/HTMLCollection.js +5 -9
  282. package/lib/nodes/element/HTMLCollection.js.map +1 -1
  283. package/lib/nodes/element/NamedNodeMap.d.ts +1 -16
  284. package/lib/nodes/element/NamedNodeMap.d.ts.map +1 -1
  285. package/lib/nodes/element/NamedNodeMap.js +39 -52
  286. package/lib/nodes/element/NamedNodeMap.js.map +1 -1
  287. package/lib/nodes/element/NamedNodeMapProxyFactory.d.ts.map +1 -1
  288. package/lib/nodes/element/NamedNodeMapProxyFactory.js +12 -14
  289. package/lib/nodes/element/NamedNodeMapProxyFactory.js.map +1 -1
  290. package/lib/nodes/html-button-element/HTMLButtonElement.d.ts.map +1 -1
  291. package/lib/nodes/html-button-element/HTMLButtonElement.js +1 -1
  292. package/lib/nodes/html-button-element/HTMLButtonElement.js.map +1 -1
  293. package/lib/nodes/html-document/HTMLDocument.d.ts +10 -0
  294. package/lib/nodes/html-document/HTMLDocument.d.ts.map +1 -1
  295. package/lib/nodes/html-document/HTMLDocument.js +33 -2
  296. package/lib/nodes/html-document/HTMLDocument.js.map +1 -1
  297. package/lib/nodes/html-element/HTMLElement.d.ts +34 -0
  298. package/lib/nodes/html-element/HTMLElement.d.ts.map +1 -1
  299. package/lib/nodes/html-element/HTMLElement.js +52 -22
  300. package/lib/nodes/html-element/HTMLElement.js.map +1 -1
  301. package/lib/nodes/html-field-set-element/HTMLFieldSetElement.d.ts.map +1 -1
  302. package/lib/nodes/html-field-set-element/HTMLFieldSetElement.js +1 -1
  303. package/lib/nodes/html-field-set-element/HTMLFieldSetElement.js.map +1 -1
  304. package/lib/nodes/html-form-element/HTMLFormElement.d.ts.map +1 -1
  305. package/lib/nodes/html-form-element/HTMLFormElement.js +5 -8
  306. package/lib/nodes/html-form-element/HTMLFormElement.js.map +1 -1
  307. package/lib/nodes/html-iframe-element/HTMLIFrameElement.js +1 -1
  308. package/lib/nodes/html-iframe-element/HTMLIFrameElement.js.map +1 -1
  309. package/lib/nodes/html-input-element/HTMLInputElement.d.ts.map +1 -1
  310. package/lib/nodes/html-input-element/HTMLInputElement.js +1 -1
  311. package/lib/nodes/html-input-element/HTMLInputElement.js.map +1 -1
  312. package/lib/nodes/html-media-element/TextTrackList.js +1 -1
  313. package/lib/nodes/html-media-element/TextTrackList.js.map +1 -1
  314. package/lib/nodes/html-object-element/HTMLObjectElement.d.ts.map +1 -1
  315. package/lib/nodes/html-object-element/HTMLObjectElement.js +1 -1
  316. package/lib/nodes/html-object-element/HTMLObjectElement.js.map +1 -1
  317. package/lib/nodes/html-output-element/HTMLOutputElement.d.ts.map +1 -1
  318. package/lib/nodes/html-output-element/HTMLOutputElement.js +1 -1
  319. package/lib/nodes/html-output-element/HTMLOutputElement.js.map +1 -1
  320. package/lib/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  321. package/lib/nodes/html-script-element/HTMLScriptElement.js +3 -1
  322. package/lib/nodes/html-script-element/HTMLScriptElement.js.map +1 -1
  323. package/lib/nodes/html-select-element/HTMLSelectElement.d.ts.map +1 -1
  324. package/lib/nodes/html-select-element/HTMLSelectElement.js +2 -2
  325. package/lib/nodes/html-select-element/HTMLSelectElement.js.map +1 -1
  326. package/lib/nodes/html-table-element/HTMLTableElement.d.ts.map +1 -1
  327. package/lib/nodes/html-table-element/HTMLTableElement.js +9 -1
  328. package/lib/nodes/html-table-element/HTMLTableElement.js.map +1 -1
  329. package/lib/nodes/html-table-row-element/HTMLTableRowElement.js +1 -1
  330. package/lib/nodes/html-template-element/HTMLTemplateElement.d.ts +2 -2
  331. package/lib/nodes/html-template-element/HTMLTemplateElement.d.ts.map +1 -1
  332. package/lib/nodes/html-template-element/HTMLTemplateElement.js +15 -17
  333. package/lib/nodes/html-template-element/HTMLTemplateElement.js.map +1 -1
  334. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.d.ts.map +1 -1
  335. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js +1 -1
  336. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js.map +1 -1
  337. package/lib/nodes/node/Node.d.ts +2 -10
  338. package/lib/nodes/node/Node.d.ts.map +1 -1
  339. package/lib/nodes/node/Node.js +44 -48
  340. package/lib/nodes/node/Node.js.map +1 -1
  341. package/lib/nodes/node/NodeList.js +1 -1
  342. package/lib/nodes/node/NodeList.js.map +1 -1
  343. package/lib/nodes/node/NodeUtility.d.ts.map +1 -1
  344. package/lib/nodes/node/NodeUtility.js +4 -3
  345. package/lib/nodes/node/NodeUtility.js.map +1 -1
  346. package/lib/nodes/parent-node/ParentNodeUtility.d.ts.map +1 -1
  347. package/lib/nodes/parent-node/ParentNodeUtility.js +5 -2
  348. package/lib/nodes/parent-node/ParentNodeUtility.js.map +1 -1
  349. package/lib/nodes/shadow-root/ShadowRoot.d.ts.map +1 -1
  350. package/lib/nodes/shadow-root/ShadowRoot.js +8 -8
  351. package/lib/nodes/shadow-root/ShadowRoot.js.map +1 -1
  352. package/lib/nodes/xml-document/XMLDocument.d.ts +2 -0
  353. package/lib/nodes/xml-document/XMLDocument.d.ts.map +1 -1
  354. package/lib/nodes/xml-document/XMLDocument.js +3 -0
  355. package/lib/nodes/xml-document/XMLDocument.js.map +1 -1
  356. package/lib/query-selector/SelectorItem.d.ts.map +1 -1
  357. package/lib/query-selector/SelectorItem.js +1 -2
  358. package/lib/query-selector/SelectorItem.js.map +1 -1
  359. package/lib/range/Range.d.ts.map +1 -1
  360. package/lib/range/Range.js +3 -3
  361. package/lib/range/Range.js.map +1 -1
  362. package/lib/storage/Storage.js +1 -1
  363. package/lib/storage/Storage.js.map +1 -1
  364. package/lib/svg/SVGLengthList.js +1 -1
  365. package/lib/svg/SVGLengthList.js.map +1 -1
  366. package/lib/svg/SVGNumberList.js +1 -1
  367. package/lib/svg/SVGNumberList.js.map +1 -1
  368. package/lib/svg/SVGPointList.js +1 -1
  369. package/lib/svg/SVGPointList.js.map +1 -1
  370. package/lib/svg/SVGStringList.js +1 -1
  371. package/lib/svg/SVGStringList.js.map +1 -1
  372. package/lib/svg/SVGTransformList.js +1 -1
  373. package/lib/svg/SVGTransformList.js.map +1 -1
  374. package/lib/tree-walker/NodeIterator.d.ts +18 -3
  375. package/lib/tree-walker/NodeIterator.d.ts.map +1 -1
  376. package/lib/tree-walker/NodeIterator.js +40 -6
  377. package/lib/tree-walker/NodeIterator.js.map +1 -1
  378. package/lib/tree-walker/TreeWalker.d.ts +2 -1
  379. package/lib/tree-walker/TreeWalker.d.ts.map +1 -1
  380. package/lib/tree-walker/TreeWalker.js +6 -6
  381. package/lib/tree-walker/TreeWalker.js.map +1 -1
  382. package/lib/utilities/ClassMethodBinder.d.ts.map +1 -0
  383. package/lib/utilities/ClassMethodBinder.js.map +1 -0
  384. package/lib/utilities/StringUtility.d.ts.map +1 -0
  385. package/lib/utilities/StringUtility.js.map +1 -0
  386. package/lib/utilities/XMLEncodeUtility.d.ts +48 -0
  387. package/lib/utilities/XMLEncodeUtility.d.ts.map +1 -0
  388. package/lib/utilities/XMLEncodeUtility.js +116 -0
  389. package/lib/utilities/XMLEncodeUtility.js.map +1 -0
  390. package/lib/window/BrowserWindow.d.ts +2 -0
  391. package/lib/window/BrowserWindow.d.ts.map +1 -1
  392. package/lib/window/BrowserWindow.js +9 -3
  393. package/lib/window/BrowserWindow.js.map +1 -1
  394. package/lib/window/WindowErrorUtility.js +1 -1
  395. package/lib/window/WindowErrorUtility.js.map +1 -1
  396. package/lib/xml-http-request/XMLHttpRequest.d.ts.map +1 -1
  397. package/lib/xml-http-request/XMLHttpRequest.js +2 -1
  398. package/lib/xml-http-request/XMLHttpRequest.js.map +1 -1
  399. package/lib/xml-http-request/XMLHttpRequestResponseDataParser.js +1 -1
  400. package/lib/xml-http-request/XMLHttpRequestResponseDataParser.js.map +1 -1
  401. package/lib/xml-parser/XMLParser.d.ts +89 -19
  402. package/lib/xml-parser/XMLParser.d.ts.map +1 -1
  403. package/lib/xml-parser/XMLParser.js +531 -242
  404. package/lib/xml-parser/XMLParser.js.map +1 -1
  405. package/lib/xml-serializer/XMLSerializer.d.ts +6 -17
  406. package/lib/xml-serializer/XMLSerializer.d.ts.map +1 -1
  407. package/lib/xml-serializer/XMLSerializer.js +136 -40
  408. package/lib/xml-serializer/XMLSerializer.js.map +1 -1
  409. package/package.json +1 -2
  410. package/src/PropertySymbol.ts +4 -1
  411. package/src/browser/utilities/BrowserFrameURL.ts +2 -2
  412. package/src/config/HTMLElementConfig.ts +53 -17
  413. package/src/config/HTMLElementConfigContentModelEnum.ts +3 -0
  414. package/src/config/NamespaceURI.ts +2 -0
  415. package/src/css/declaration/CSSStyleDeclaration.ts +1 -4
  416. package/src/css/declaration/computed-style/CSSStyleDeclarationComputedStyle.ts +2 -4
  417. package/src/custom-element/CustomElementReactionStack.ts +81 -0
  418. package/src/custom-element/CustomElementRegistry.ts +35 -54
  419. package/src/custom-element/CustomElementUtility.ts +34 -0
  420. package/src/custom-element/ICustomElementDefinition.ts +16 -0
  421. package/src/dom/DOMStringMap.ts +12 -10
  422. package/src/dom/DOMTokenList.ts +1 -1
  423. package/src/dom-parser/DOMParser.ts +5 -75
  424. package/src/exception/DOMExceptionNameEnum.ts +2 -1
  425. package/src/history/History.ts +10 -10
  426. package/src/html-parser/HTMLParser.ts +864 -0
  427. package/src/html-serializer/HTMLSerializer.ts +162 -0
  428. package/src/nodes/document/Document.ts +118 -137
  429. package/src/nodes/element/Element.ts +48 -95
  430. package/src/nodes/element/HTMLCollection.ts +5 -30
  431. package/src/nodes/element/NamedNodeMap.ts +58 -72
  432. package/src/nodes/element/NamedNodeMapProxyFactory.ts +12 -15
  433. package/src/nodes/html-button-element/HTMLButtonElement.ts +1 -4
  434. package/src/nodes/html-document/HTMLDocument.ts +58 -2
  435. package/src/nodes/html-element/HTMLElement.ts +107 -25
  436. package/src/nodes/html-field-set-element/HTMLFieldSetElement.ts +1 -4
  437. package/src/nodes/html-form-element/HTMLFormElement.ts +5 -27
  438. package/src/nodes/html-iframe-element/HTMLIFrameElement.ts +1 -1
  439. package/src/nodes/html-input-element/HTMLInputElement.ts +1 -4
  440. package/src/nodes/html-media-element/TextTrackList.ts +1 -1
  441. package/src/nodes/html-object-element/HTMLObjectElement.ts +1 -4
  442. package/src/nodes/html-output-element/HTMLOutputElement.ts +1 -4
  443. package/src/nodes/html-script-element/HTMLScriptElement.ts +4 -1
  444. package/src/nodes/html-select-element/HTMLSelectElement.ts +2 -5
  445. package/src/nodes/html-table-element/HTMLTableElement.ts +8 -1
  446. package/src/nodes/html-table-row-element/HTMLTableRowElement.ts +1 -1
  447. package/src/nodes/html-template-element/HTMLTemplateElement.ts +23 -17
  448. package/src/nodes/html-text-area-element/HTMLTextAreaElement.ts +1 -4
  449. package/src/nodes/node/Node.ts +57 -70
  450. package/src/nodes/node/NodeList.ts +1 -1
  451. package/src/nodes/node/NodeUtility.ts +4 -3
  452. package/src/nodes/parent-node/ParentNodeUtility.ts +6 -6
  453. package/src/nodes/shadow-root/ShadowRoot.ts +8 -8
  454. package/src/nodes/xml-document/XMLDocument.ts +5 -1
  455. package/src/query-selector/SelectorItem.ts +1 -2
  456. package/src/range/Range.ts +3 -3
  457. package/src/storage/Storage.ts +1 -1
  458. package/src/svg/SVGLengthList.ts +1 -1
  459. package/src/svg/SVGNumberList.ts +1 -1
  460. package/src/svg/SVGPointList.ts +1 -1
  461. package/src/svg/SVGStringList.ts +1 -1
  462. package/src/svg/SVGTransformList.ts +1 -1
  463. package/src/tree-walker/NodeIterator.ts +44 -8
  464. package/src/tree-walker/TreeWalker.ts +6 -6
  465. package/src/utilities/XMLEncodeUtility.ts +127 -0
  466. package/src/window/BrowserWindow.ts +18 -5
  467. package/src/window/WindowErrorUtility.ts +1 -1
  468. package/src/xml-http-request/XMLHttpRequest.ts +3 -1
  469. package/src/xml-http-request/XMLHttpRequestResponseDataParser.ts +1 -1
  470. package/src/xml-parser/XMLParser.ts +627 -313
  471. package/src/xml-serializer/XMLSerializer.ts +204 -58
  472. package/cjs/ClassMethodBinder.cjs.map +0 -1
  473. package/cjs/ClassMethodBinder.d.ts.map +0 -1
  474. package/cjs/StringUtility.cjs.map +0 -1
  475. package/cjs/StringUtility.d.ts.map +0 -1
  476. package/lib/ClassMethodBinder.d.ts.map +0 -1
  477. package/lib/ClassMethodBinder.js.map +0 -1
  478. package/lib/StringUtility.d.ts.map +0 -1
  479. package/lib/StringUtility.js.map +0 -1
  480. /package/cjs/{ClassMethodBinder.cjs → utilities/ClassMethodBinder.cjs} +0 -0
  481. /package/cjs/{ClassMethodBinder.d.ts → utilities/ClassMethodBinder.d.ts} +0 -0
  482. /package/cjs/{StringUtility.cjs → utilities/StringUtility.cjs} +0 -0
  483. /package/cjs/{StringUtility.d.ts → utilities/StringUtility.d.ts} +0 -0
  484. /package/lib/{ClassMethodBinder.d.ts → utilities/ClassMethodBinder.d.ts} +0 -0
  485. /package/lib/{ClassMethodBinder.js → utilities/ClassMethodBinder.js} +0 -0
  486. /package/lib/{StringUtility.d.ts → utilities/StringUtility.d.ts} +0 -0
  487. /package/lib/{StringUtility.js → utilities/StringUtility.js} +0 -0
  488. /package/src/{ClassMethodBinder.ts → utilities/ClassMethodBinder.ts} +0 -0
  489. /package/src/{StringUtility.ts → utilities/StringUtility.ts} +0 -0
@@ -0,0 +1,162 @@
1
+ import Element from '../nodes/element/Element.js';
2
+ import * as PropertySymbol from '../PropertySymbol.js';
3
+ import Node from '../nodes/node/Node.js';
4
+ import DocumentType from '../nodes/document-type/DocumentType.js';
5
+ import HTMLTemplateElement from '../nodes/html-template-element/HTMLTemplateElement.js';
6
+ import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js';
7
+ import ProcessingInstruction from '../nodes/processing-instruction/ProcessingInstruction.js';
8
+ import DocumentFragment from '../nodes/document-fragment/DocumentFragment.js';
9
+ import ShadowRoot from '../nodes/shadow-root/ShadowRoot.js';
10
+ import HTMLElementConfig from '../config/HTMLElementConfig.js';
11
+ import HTMLElementConfigContentModelEnum from '../config/HTMLElementConfigContentModelEnum.js';
12
+ import XMLEncodeUtility from '../utilities/XMLEncodeUtility.js';
13
+
14
+ /**
15
+ * Serializes a node into HTML.
16
+ */
17
+ export default class HTMLSerializer {
18
+ private options: {
19
+ serializableShadowRoots: boolean;
20
+ shadowRoots: ShadowRoot[] | null;
21
+ allShadowRoots: boolean;
22
+ } = {
23
+ serializableShadowRoots: false,
24
+ shadowRoots: null,
25
+ allShadowRoots: false
26
+ };
27
+
28
+ /**
29
+ * Constructor.
30
+ *
31
+ * @param [options] Options.
32
+ * @param [options.serializableShadowRoots] If shadow roots should be serialized.
33
+ * @param [options.shadowRoots] Shadow roots to serialize.
34
+ * @param [options.allShadowRoots] If all shadow roots should be serialized.
35
+ */
36
+ constructor(options?: {
37
+ serializableShadowRoots?: boolean;
38
+ shadowRoots?: ShadowRoot[] | null;
39
+ allShadowRoots?: boolean;
40
+ }) {
41
+ if (options) {
42
+ if (options.serializableShadowRoots) {
43
+ this.options.serializableShadowRoots = options.serializableShadowRoots;
44
+ }
45
+
46
+ if (options.shadowRoots) {
47
+ this.options.shadowRoots = options.shadowRoots;
48
+ }
49
+
50
+ if (options.allShadowRoots) {
51
+ this.options.allShadowRoots = options.allShadowRoots;
52
+ }
53
+ }
54
+ }
55
+
56
+ /**
57
+ * Renders an element as HTML.
58
+ *
59
+ * @param root Root element.
60
+ * @returns Result.
61
+ */
62
+ public serializeToString(root: Node): string {
63
+ switch (root[PropertySymbol.nodeType]) {
64
+ case NodeTypeEnum.elementNode:
65
+ const element = <Element>root;
66
+ const prefix = element[PropertySymbol.prefix];
67
+ const localName = element[PropertySymbol.localName];
68
+ const config = HTMLElementConfig[element[PropertySymbol.localName]];
69
+ const tagName = prefix ? `${prefix}:${localName}` : localName;
70
+
71
+ if (config?.contentModel === HTMLElementConfigContentModelEnum.noDescendants) {
72
+ return `<${tagName}${this.getAttributes(element)}>`;
73
+ }
74
+
75
+ let innerHTML = '';
76
+
77
+ // TODO: Should we include closed shadow roots? We are currently only including open shadow roots.
78
+ if (
79
+ element.shadowRoot &&
80
+ (this.options.allShadowRoots ||
81
+ (this.options.serializableShadowRoots &&
82
+ element.shadowRoot[PropertySymbol.serializable]) ||
83
+ this.options.shadowRoots?.includes(element.shadowRoot))
84
+ ) {
85
+ innerHTML += `<template shadowrootmode="${element.shadowRoot[PropertySymbol.mode]}"${
86
+ element.shadowRoot[PropertySymbol.serializable] ? ' shadowrootserializable=""' : ''
87
+ }>`;
88
+
89
+ for (const node of (<ShadowRoot>element.shadowRoot)[PropertySymbol.nodeArray]) {
90
+ innerHTML += this.serializeToString(node);
91
+ }
92
+
93
+ innerHTML += '</template>';
94
+ }
95
+
96
+ const childNodes =
97
+ tagName === 'template'
98
+ ? (<DocumentFragment>(<HTMLTemplateElement>root).content)[PropertySymbol.nodeArray]
99
+ : (<DocumentFragment>root)[PropertySymbol.nodeArray];
100
+
101
+ for (const node of childNodes) {
102
+ innerHTML += this.serializeToString(node);
103
+ }
104
+
105
+ return `<${tagName}${this.getAttributes(element)}>${innerHTML}</${tagName}>`;
106
+ case Node.DOCUMENT_FRAGMENT_NODE:
107
+ case Node.DOCUMENT_NODE:
108
+ let html = '';
109
+ for (const node of (<Node>root)[PropertySymbol.nodeArray]) {
110
+ html += this.serializeToString(node);
111
+ }
112
+ return html;
113
+ case NodeTypeEnum.commentNode:
114
+ return `<!--${root.textContent}-->`;
115
+ case NodeTypeEnum.processingInstructionNode:
116
+ return `<!--?${(<ProcessingInstruction>root).target} ${root.textContent}?-->`;
117
+ case NodeTypeEnum.textNode:
118
+ const parentElement = root.parentElement;
119
+ if (parentElement) {
120
+ const parentConfig = HTMLElementConfig[parentElement[PropertySymbol.localName]];
121
+ if (parentConfig?.contentModel === HTMLElementConfigContentModelEnum.rawText) {
122
+ return root.textContent;
123
+ }
124
+ }
125
+ return XMLEncodeUtility.encodeTextContent(root.textContent);
126
+ case NodeTypeEnum.documentTypeNode:
127
+ const doctype = <DocumentType>root;
128
+ const identifier = doctype.publicId ? ' PUBLIC' : doctype.systemId ? ' SYSTEM' : '';
129
+ const publicId = doctype.publicId ? ` "${doctype.publicId}"` : '';
130
+ const systemId = doctype.systemId ? ` "${doctype.systemId}"` : '';
131
+ return `<!DOCTYPE ${doctype.name}${identifier}${publicId}${systemId}>`;
132
+ }
133
+
134
+ return '';
135
+ }
136
+
137
+ /**
138
+ * Returns attributes as a string.
139
+ *
140
+ * @param element Element.
141
+ * @returns Attributes.
142
+ */
143
+ private getAttributes(element: Element): string {
144
+ let attributeString = '';
145
+
146
+ const namedItems = (<Element>element)[PropertySymbol.attributes][PropertySymbol.namedItems];
147
+
148
+ if (!namedItems.has('is') && element[PropertySymbol.isValue]) {
149
+ attributeString +=
150
+ ' is="' + XMLEncodeUtility.encodeAttributeValue(element[PropertySymbol.isValue]) + '"';
151
+ }
152
+
153
+ for (const attributes of namedItems.values()) {
154
+ const escapedValue = XMLEncodeUtility.encodeAttributeValue(
155
+ attributes[0][PropertySymbol.value]
156
+ );
157
+ attributeString += ' ' + attributes[0][PropertySymbol.name] + '="' + escapedValue + '"';
158
+ }
159
+
160
+ return attributeString;
161
+ }
162
+ }
@@ -5,7 +5,6 @@ import Node from '../node/Node.js';
5
5
  import NodeIterator from '../../tree-walker/NodeIterator.js';
6
6
  import TreeWalker from '../../tree-walker/TreeWalker.js';
7
7
  import DocumentFragment from '../document-fragment/DocumentFragment.js';
8
- import XMLParser from '../../xml-parser/XMLParser.js';
9
8
  import Event from '../../event/Event.js';
10
9
  import DOMImplementation from '../../dom-implementation/DOMImplementation.js';
11
10
  import INodeFilter from '../../tree-walker/INodeFilter.js';
@@ -48,7 +47,8 @@ import HTMLTitleElement from '../html-title-element/HTMLTitleElement.js';
48
47
  import WindowBrowserContext from '../../window/WindowBrowserContext.js';
49
48
  import NodeFactory from '../NodeFactory.js';
50
49
  import SVGElementConfig from '../../config/SVGElementConfig.js';
51
- import StringUtility from '../../StringUtility.js';
50
+ import StringUtility from '../../utilities/StringUtility.js';
51
+ import HTMLParser from '../../html-parser/HTMLParser.js';
52
52
 
53
53
  const PROCESSING_INSTRUCTION_TARGET_REGEXP = /^[a-z][a-z0-9-]+$/;
54
54
 
@@ -65,7 +65,7 @@ export default class Document extends Node {
65
65
  public [PropertySymbol.isFirstWrite] = true;
66
66
  public [PropertySymbol.isFirstWriteAfterOpen] = false;
67
67
  public [PropertySymbol.nodeType] = NodeTypeEnum.documentNode;
68
- public [PropertySymbol.isConnected] = true;
68
+ public [PropertySymbol.isConnected] = false;
69
69
  public [PropertySymbol.adoptedStyleSheets]: CSSStyleSheet[] = [];
70
70
  public [PropertySymbol.implementation] = new DOMImplementation(this);
71
71
  public [PropertySymbol.readyState] = DocumentReadyStateEnum.interactive;
@@ -78,6 +78,8 @@ export default class Document extends Node {
78
78
  string,
79
79
  { htmlCollection: HTMLCollection<Element> | null; elements: Element[] }
80
80
  > = new Map();
81
+ public [PropertySymbol.contentType]: string = 'text/html';
82
+ public [PropertySymbol.xmlProcessingInstruction]: ProcessingInstruction | null = null;
81
83
  public declare cloneNode: (deep?: boolean) => Document;
82
84
 
83
85
  // Private properties
@@ -408,7 +410,7 @@ export default class Document extends Node {
408
410
  * @returns Element.
409
411
  */
410
412
  public get documentElement(): HTMLHtmlElement {
411
- return <HTMLHtmlElement>ParentNodeUtility.getElementByTagName(this, 'html');
413
+ return <HTMLHtmlElement>this[PropertySymbol.elementArray][0] ?? null;
412
414
  }
413
415
 
414
416
  /**
@@ -431,7 +433,10 @@ export default class Document extends Node {
431
433
  * @returns Element.
432
434
  */
433
435
  public get body(): HTMLBodyElement {
434
- return <HTMLBodyElement>ParentNodeUtility.getElementByTagName(this, 'body');
436
+ const documentElement = this.documentElement;
437
+ return documentElement
438
+ ? <HTMLBodyElement>ParentNodeUtility.getElementByTagName(documentElement, 'body')
439
+ : null;
435
440
  }
436
441
 
437
442
  /**
@@ -440,7 +445,10 @@ export default class Document extends Node {
440
445
  * @returns Element.
441
446
  */
442
447
  public get head(): HTMLHeadElement {
443
- return <HTMLHeadElement>ParentNodeUtility.getElementByTagName(this, 'head');
448
+ const documentElement = this.documentElement;
449
+ return documentElement
450
+ ? <HTMLHeadElement>ParentNodeUtility.getElementByTagName(documentElement, 'head')
451
+ : null;
444
452
  }
445
453
 
446
454
  /**
@@ -595,6 +603,15 @@ export default class Document extends Node {
595
603
  return this[PropertySymbol.currentScript];
596
604
  }
597
605
 
606
+ /**
607
+ * Returns content type.
608
+ *
609
+ * @returns Content type.
610
+ */
611
+ public get contentType(): string {
612
+ return this[PropertySymbol.contentType];
613
+ }
614
+
598
615
  /**
599
616
  * Inserts a set of Node objects or DOMString objects after the last child of the ParentNode. DOMString objects are inserted as equivalent Text nodes.
600
617
  *
@@ -830,8 +847,6 @@ export default class Document extends Node {
830
847
  * @param html HTML.
831
848
  */
832
849
  public write(html: string): void {
833
- const root = <DocumentFragment>XMLParser.parse(this, html, { evaluateScripts: true });
834
-
835
850
  if (this[PropertySymbol.isFirstWrite] || this[PropertySymbol.isFirstWriteAfterOpen]) {
836
851
  if (this[PropertySymbol.isFirstWrite]) {
837
852
  if (!this[PropertySymbol.isFirstWriteAfterOpen]) {
@@ -841,88 +856,22 @@ export default class Document extends Node {
841
856
  this[PropertySymbol.isFirstWrite] = false;
842
857
  }
843
858
 
844
- this[PropertySymbol.isFirstWriteAfterOpen] = false;
845
- let documentElement = null;
846
- let documentTypeNode = null;
847
-
848
- for (const node of root[PropertySymbol.nodeArray]) {
849
- if (node['tagName'] === 'HTML') {
850
- documentElement = node;
851
- } else if (node[PropertySymbol.nodeType] === NodeTypeEnum.documentTypeNode) {
852
- documentTypeNode = node;
853
- }
859
+ const { documentElement, head, body } = this;
854
860
 
855
- if (documentElement && documentTypeNode) {
856
- break;
857
- }
861
+ if (!documentElement || !head || !body) {
862
+ this.open();
858
863
  }
859
864
 
860
- if (documentElement) {
861
- if (!this.documentElement) {
862
- if (documentTypeNode) {
863
- this.appendChild(documentTypeNode);
864
- }
865
-
866
- this.appendChild(documentElement);
867
-
868
- const head = ParentNodeUtility.getElementByTagName(this, 'head');
869
- let body = ParentNodeUtility.getElementByTagName(this, 'body');
870
-
871
- if (!body) {
872
- body = this.createElement('body');
873
- documentElement.appendChild(this.createElement('body'));
874
- }
875
-
876
- if (!head) {
877
- documentElement.insertBefore(this.createElement('head'), body);
878
- }
879
- } else {
880
- const rootBody = ParentNodeUtility.getElementByTagName(root, 'body');
881
- const body = ParentNodeUtility.getElementByTagName(this, 'body');
882
- if (rootBody && body) {
883
- const childNodes = rootBody[PropertySymbol.nodeArray];
884
- while (childNodes.length) {
885
- body.appendChild(childNodes[0]);
886
- }
887
- }
888
- }
889
-
890
- // Remaining nodes outside the <html> element are added to the <body> element.
891
- const body = ParentNodeUtility.getElementByTagName(this, 'body');
892
- if (body) {
893
- const childNodes = root[PropertySymbol.nodeArray];
894
- while (childNodes.length) {
895
- const child = childNodes[0];
896
- if (
897
- child['tagName'] !== 'HTML' &&
898
- child[PropertySymbol.nodeType] !== NodeTypeEnum.documentTypeNode
899
- ) {
900
- body.appendChild(child);
901
- }
902
- }
903
- }
904
- } else {
905
- const documentElement = this.createElement('html');
906
- const bodyElement = this.createElement('body');
907
- const headElement = this.createElement('head');
908
- const childNodes = root[PropertySymbol.nodeArray];
909
-
910
- while (childNodes.length) {
911
- bodyElement.appendChild(childNodes[0]);
912
- }
913
-
914
- documentElement.appendChild(headElement);
915
- documentElement.appendChild(bodyElement);
865
+ this[PropertySymbol.isFirstWrite] = false;
866
+ this[PropertySymbol.isFirstWriteAfterOpen] = false;
916
867
 
917
- this.appendChild(documentElement);
918
- }
868
+ new HTMLParser(this[PropertySymbol.window], {
869
+ evaluateScripts: true
870
+ }).parse(html, this);
919
871
  } else {
920
- const bodyNode = ParentNodeUtility.getElementByTagName(root, 'body');
921
- const body = ParentNodeUtility.getElementByTagName(this, 'body');
922
- const childNodes = (<Element>(bodyNode || root))[PropertySymbol.nodeArray];
923
- while (childNodes.length) {
924
- body.appendChild(childNodes[0]);
925
- }
872
+ new HTMLParser(this[PropertySymbol.window], {
873
+ evaluateScripts: true
874
+ }).parse(html, this.body);
926
875
  }
927
876
  }
928
877
 
@@ -957,6 +906,18 @@ export default class Document extends Node {
957
906
  this.removeChild(childNodes[0]);
958
907
  }
959
908
 
909
+ // Default document elements
910
+ const doctype = this[PropertySymbol.implementation].createDocumentType('html', '', '');
911
+ const documentElement = this.createElement('html');
912
+ const bodyElement = this.createElement('body');
913
+ const headElement = this.createElement('head');
914
+
915
+ this.appendChild(doctype);
916
+ this.appendChild(documentElement);
917
+
918
+ documentElement.appendChild(headElement);
919
+ documentElement.appendChild(bodyElement);
920
+
960
921
  return this;
961
922
  }
962
923
 
@@ -1090,66 +1051,86 @@ export default class Document extends Node {
1090
1051
  );
1091
1052
  }
1092
1053
 
1093
- // SVG element
1094
- if (namespaceURI === NamespaceURI.svg) {
1095
- const config = SVGElementConfig[qualifiedName.toLowerCase()];
1096
- const elementClass =
1097
- config && config.localName === qualifiedName ? window[config.className] : window.SVGElement;
1098
-
1099
- const element = NodeFactory.createNode<SVGElement>(this, elementClass);
1100
-
1101
- element[PropertySymbol.tagName] = qualifiedName;
1102
- element[PropertySymbol.localName] = qualifiedName;
1103
- element[PropertySymbol.namespaceURI] = namespaceURI;
1104
- element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1054
+ const parts = qualifiedName.split(':');
1055
+ const localName = parts[1] ?? parts[0];
1056
+ const prefix = parts[1] ? parts[0] : null;
1057
+
1058
+ switch (namespaceURI) {
1059
+ case NamespaceURI.svg:
1060
+ const config = SVGElementConfig[qualifiedName.toLowerCase()];
1061
+ const svgElementClass =
1062
+ config && config.localName === qualifiedName
1063
+ ? window[config.className]
1064
+ : window.SVGElement;
1065
+
1066
+ const svgElement = NodeFactory.createNode<SVGElement>(this, svgElementClass);
1067
+
1068
+ svgElement[PropertySymbol.tagName] = qualifiedName;
1069
+ svgElement[PropertySymbol.localName] = localName;
1070
+ svgElement[PropertySymbol.prefix] = prefix;
1071
+ svgElement[PropertySymbol.namespaceURI] = namespaceURI;
1072
+ svgElement[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1073
+
1074
+ return svgElement;
1075
+ case NamespaceURI.html:
1076
+ // Custom HTML element
1077
+ // If a polyfill is used, [PropertySymbol.registry] may be undefined
1078
+ const customElementDefinition = window.customElements[PropertySymbol.registry]?.get(
1079
+ options && options.is ? String(options.is) : qualifiedName
1080
+ );
1081
+
1082
+ if (customElementDefinition) {
1083
+ const element = new customElementDefinition.elementClass();
1084
+ element[PropertySymbol.tagName] = StringUtility.asciiUpperCase(qualifiedName);
1085
+ element[PropertySymbol.localName] = localName;
1086
+ element[PropertySymbol.prefix] = prefix;
1087
+ element[PropertySymbol.namespaceURI] = namespaceURI;
1088
+ element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1089
+ return element;
1090
+ }
1105
1091
 
1106
- return element;
1107
- }
1092
+ const elementClass = HTMLElementConfig[qualifiedName]
1093
+ ? window[HTMLElementConfig[qualifiedName].className]
1094
+ : null;
1108
1095
 
1109
- // Custom HTML element
1110
- const customElement =
1111
- window.customElements[PropertySymbol.registry]?.[
1112
- options && options.is ? String(options.is) : qualifiedName
1113
- ];
1114
-
1115
- if (customElement) {
1116
- const element = new customElement.elementClass();
1117
- element[PropertySymbol.tagName] = qualifiedName.toUpperCase();
1118
- element[PropertySymbol.localName] = qualifiedName;
1119
- element[PropertySymbol.namespaceURI] = namespaceURI;
1120
- element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1121
- return element;
1122
- }
1096
+ // Known HTML element
1097
+ if (elementClass) {
1098
+ const element = NodeFactory.createNode<Element>(this, elementClass);
1123
1099
 
1124
- const elementClass = HTMLElementConfig[qualifiedName]
1125
- ? window[HTMLElementConfig[qualifiedName].className]
1126
- : null;
1100
+ element[PropertySymbol.tagName] = StringUtility.asciiUpperCase(qualifiedName);
1101
+ element[PropertySymbol.localName] = localName;
1102
+ element[PropertySymbol.prefix] = prefix;
1103
+ element[PropertySymbol.namespaceURI] = namespaceURI;
1104
+ element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1127
1105
 
1128
- // Known HTML element
1129
- if (elementClass) {
1130
- const element = NodeFactory.createNode<Element>(this, elementClass);
1106
+ return element;
1107
+ }
1131
1108
 
1132
- element[PropertySymbol.tagName] = qualifiedName.toUpperCase();
1133
- element[PropertySymbol.localName] = qualifiedName;
1134
- element[PropertySymbol.namespaceURI] = namespaceURI;
1135
- element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1109
+ // Unknown HTML element (if it has an hyphen in the name, it is a custom element that hasn't been defined yet)
1110
+ const unknownElementClass = qualifiedName.includes('-')
1111
+ ? window.HTMLElement
1112
+ : window.HTMLUnknownElement;
1136
1113
 
1137
- return element;
1138
- }
1114
+ const unknownElement = NodeFactory.createNode<Element>(this, unknownElementClass);
1139
1115
 
1140
- // Unknown HTML element (if it has an hyphen in the name, it is a custom element that hasn't been defined yet)
1141
- const unknownElementClass = qualifiedName.includes('-')
1142
- ? window.HTMLElement
1143
- : window.HTMLUnknownElement;
1116
+ unknownElement[PropertySymbol.tagName] = StringUtility.asciiUpperCase(qualifiedName);
1117
+ unknownElement[PropertySymbol.localName] = localName;
1118
+ unknownElement[PropertySymbol.prefix] = prefix;
1119
+ unknownElement[PropertySymbol.namespaceURI] = namespaceURI;
1120
+ unknownElement[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1144
1121
 
1145
- const element = NodeFactory.createNode<Element>(this, unknownElementClass);
1122
+ return unknownElement;
1123
+ default:
1124
+ const element = NodeFactory.createNode<Element>(this, Element);
1146
1125
 
1147
- element[PropertySymbol.tagName] = qualifiedName.toUpperCase();
1148
- element[PropertySymbol.localName] = qualifiedName;
1149
- element[PropertySymbol.namespaceURI] = namespaceURI;
1150
- element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1126
+ element[PropertySymbol.tagName] = qualifiedName;
1127
+ element[PropertySymbol.localName] = localName;
1128
+ element[PropertySymbol.prefix] = prefix;
1129
+ element[PropertySymbol.namespaceURI] = namespaceURI;
1130
+ element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null;
1151
1131
 
1152
- return element;
1132
+ return element;
1133
+ }
1153
1134
  }
1154
1135
 
1155
1136
  /* eslint-enable jsdoc/valid-types */
@@ -1239,7 +1220,7 @@ export default class Document extends Node {
1239
1220
  * @returns Attribute.
1240
1221
  */
1241
1222
  public createAttribute(qualifiedName: string): Attr {
1242
- return this.createAttributeNS(null, qualifiedName.toLowerCase());
1223
+ return this.createAttributeNS(null, StringUtility.asciiLowerCase(qualifiedName));
1243
1224
  }
1244
1225
 
1245
1226
  /**
@@ -1257,7 +1238,7 @@ export default class Document extends Node {
1257
1238
  attribute[PropertySymbol.namespaceURI] = namespaceURI;
1258
1239
  attribute[PropertySymbol.name] = qualifiedName;
1259
1240
  attribute[PropertySymbol.localName] = parts[1] ?? qualifiedName;
1260
- attribute[PropertySymbol.prefix] = parts[0] ?? null;
1241
+ attribute[PropertySymbol.prefix] = parts[1] ? parts[0] : null;
1261
1242
 
1262
1243
  return attribute;
1263
1244
  }