happy-dom 10.5.2 → 10.6.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.

Potentially problematic release.


This version of happy-dom might be problematic. Click here for more details.

Files changed (297) hide show
  1. package/cjs/css/declaration/AbstractCSSStyleDeclaration.cjs +20 -18
  2. package/cjs/css/declaration/AbstractCSSStyleDeclaration.cjs.map +1 -1
  3. package/cjs/css/declaration/AbstractCSSStyleDeclaration.d.ts.map +1 -1
  4. package/cjs/css/declaration/element-style/CSSStyleDeclarationElementStyle.cjs +4 -3
  5. package/cjs/css/declaration/element-style/CSSStyleDeclarationElementStyle.cjs.map +1 -1
  6. package/cjs/css/declaration/element-style/CSSStyleDeclarationElementStyle.d.ts.map +1 -1
  7. package/cjs/named-node-map/INamedNodeMap.d.ts +26 -26
  8. package/cjs/named-node-map/INamedNodeMap.d.ts.map +1 -1
  9. package/cjs/named-node-map/NamedNodeMap.cjs +121 -81
  10. package/cjs/named-node-map/NamedNodeMap.cjs.map +1 -1
  11. package/cjs/named-node-map/NamedNodeMap.d.ts +57 -40
  12. package/cjs/named-node-map/NamedNodeMap.d.ts.map +1 -1
  13. package/cjs/nodes/element/Dataset.cjs +16 -17
  14. package/cjs/nodes/element/Dataset.cjs.map +1 -1
  15. package/cjs/nodes/element/Dataset.d.ts.map +1 -1
  16. package/cjs/nodes/element/Element.cjs +22 -133
  17. package/cjs/nodes/element/Element.cjs.map +1 -1
  18. package/cjs/nodes/element/Element.d.ts +9 -16
  19. package/cjs/nodes/element/Element.d.ts.map +1 -1
  20. package/cjs/nodes/element/ElementNamedNodeMap.cjs +152 -0
  21. package/cjs/nodes/element/ElementNamedNodeMap.cjs.map +1 -0
  22. package/cjs/nodes/element/ElementNamedNodeMap.d.ts +45 -0
  23. package/cjs/nodes/element/ElementNamedNodeMap.d.ts.map +1 -0
  24. package/cjs/nodes/element/ElementUtility.cjs +20 -15
  25. package/cjs/nodes/element/ElementUtility.cjs.map +1 -1
  26. package/cjs/nodes/element/ElementUtility.d.ts.map +1 -1
  27. package/cjs/nodes/element/IElement.d.ts +5 -5
  28. package/cjs/nodes/element/IElement.d.ts.map +1 -1
  29. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.cjs +2 -26
  30. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.cjs.map +1 -1
  31. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.d.ts +7 -11
  32. package/cjs/nodes/html-anchor-element/HTMLAnchorElement.d.ts.map +1 -1
  33. package/cjs/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.cjs +44 -0
  34. package/cjs/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.cjs.map +1 -0
  35. package/cjs/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.d.ts +20 -0
  36. package/cjs/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.d.ts.map +1 -0
  37. package/cjs/nodes/html-button-element/HTMLButtonElement.cjs +2 -26
  38. package/cjs/nodes/html-button-element/HTMLButtonElement.cjs.map +1 -1
  39. package/cjs/nodes/html-button-element/HTMLButtonElement.d.ts +2 -9
  40. package/cjs/nodes/html-button-element/HTMLButtonElement.d.ts.map +1 -1
  41. package/cjs/nodes/html-button-element/HTMLButtonElementNamedNodeMap.cjs +41 -0
  42. package/cjs/nodes/html-button-element/HTMLButtonElementNamedNodeMap.cjs.map +1 -0
  43. package/cjs/nodes/html-button-element/HTMLButtonElementNamedNodeMap.d.ts +20 -0
  44. package/cjs/nodes/html-button-element/HTMLButtonElementNamedNodeMap.d.ts.map +1 -0
  45. package/cjs/nodes/html-element/HTMLElement.cjs +2 -20
  46. package/cjs/nodes/html-element/HTMLElement.cjs.map +1 -1
  47. package/cjs/nodes/html-element/HTMLElement.d.ts +3 -10
  48. package/cjs/nodes/html-element/HTMLElement.d.ts.map +1 -1
  49. package/cjs/nodes/html-element/HTMLElementNamedNodeMap.cjs +35 -0
  50. package/cjs/nodes/html-element/HTMLElementNamedNodeMap.cjs.map +1 -0
  51. package/cjs/nodes/html-element/HTMLElementNamedNodeMap.d.ts +20 -0
  52. package/cjs/nodes/html-element/HTMLElementNamedNodeMap.d.ts.map +1 -0
  53. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs +2 -12
  54. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.cjs.map +1 -1
  55. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.d.ts +2 -5
  56. package/cjs/nodes/html-iframe-element/HTMLIFrameElement.d.ts.map +1 -1
  57. package/cjs/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.cjs +26 -0
  58. package/cjs/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.cjs.map +1 -0
  59. package/cjs/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.d.ts +16 -0
  60. package/cjs/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.d.ts.map +1 -0
  61. package/cjs/nodes/html-input-element/HTMLInputElement.cjs +2 -26
  62. package/cjs/nodes/html-input-element/HTMLInputElement.cjs.map +1 -1
  63. package/cjs/nodes/html-input-element/HTMLInputElement.d.ts +2 -9
  64. package/cjs/nodes/html-input-element/HTMLInputElement.d.ts.map +1 -1
  65. package/cjs/nodes/html-input-element/HTMLInputElementNamedNodeMap.cjs +42 -0
  66. package/cjs/nodes/html-input-element/HTMLInputElementNamedNodeMap.cjs.map +1 -0
  67. package/cjs/nodes/html-input-element/HTMLInputElementNamedNodeMap.d.ts +20 -0
  68. package/cjs/nodes/html-input-element/HTMLInputElementNamedNodeMap.d.ts.map +1 -0
  69. package/cjs/nodes/html-label-element/HTMLLabelElement.cjs +1 -6
  70. package/cjs/nodes/html-label-element/HTMLLabelElement.cjs.map +1 -1
  71. package/cjs/nodes/html-label-element/HTMLLabelElement.d.ts.map +1 -1
  72. package/cjs/nodes/html-link-element/HTMLLinkElement.cjs +2 -23
  73. package/cjs/nodes/html-link-element/HTMLLinkElement.cjs.map +1 -1
  74. package/cjs/nodes/html-link-element/HTMLLinkElement.d.ts +4 -10
  75. package/cjs/nodes/html-link-element/HTMLLinkElement.d.ts.map +1 -1
  76. package/cjs/nodes/html-link-element/HTMLLinkElementNamedNodeMap.cjs +39 -0
  77. package/cjs/nodes/html-link-element/HTMLLinkElementNamedNodeMap.cjs.map +1 -0
  78. package/cjs/nodes/html-link-element/HTMLLinkElementNamedNodeMap.d.ts +20 -0
  79. package/cjs/nodes/html-link-element/HTMLLinkElementNamedNodeMap.d.ts.map +1 -0
  80. package/cjs/nodes/html-option-element/HTMLOptionElement.cjs +2 -30
  81. package/cjs/nodes/html-option-element/HTMLOptionElement.cjs.map +1 -1
  82. package/cjs/nodes/html-option-element/HTMLOptionElement.d.ts +2 -9
  83. package/cjs/nodes/html-option-element/HTMLOptionElement.d.ts.map +1 -1
  84. package/cjs/nodes/html-option-element/HTMLOptionElementNamedNodeMap.cjs +45 -0
  85. package/cjs/nodes/html-option-element/HTMLOptionElementNamedNodeMap.cjs.map +1 -0
  86. package/cjs/nodes/html-option-element/HTMLOptionElementNamedNodeMap.d.ts +20 -0
  87. package/cjs/nodes/html-option-element/HTMLOptionElementNamedNodeMap.d.ts.map +1 -0
  88. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs +2 -14
  89. package/cjs/nodes/html-script-element/HTMLScriptElement.cjs.map +1 -1
  90. package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts +2 -9
  91. package/cjs/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  92. package/cjs/nodes/html-script-element/HTMLScriptElementNamedNodeMap.cjs +26 -0
  93. package/cjs/nodes/html-script-element/HTMLScriptElementNamedNodeMap.cjs.map +1 -0
  94. package/cjs/nodes/html-script-element/HTMLScriptElementNamedNodeMap.d.ts +16 -0
  95. package/cjs/nodes/html-script-element/HTMLScriptElementNamedNodeMap.d.ts.map +1 -0
  96. package/cjs/nodes/html-select-element/HTMLSelectElement.cjs +2 -26
  97. package/cjs/nodes/html-select-element/HTMLSelectElement.cjs.map +1 -1
  98. package/cjs/nodes/html-select-element/HTMLSelectElement.d.ts +2 -9
  99. package/cjs/nodes/html-select-element/HTMLSelectElement.d.ts.map +1 -1
  100. package/cjs/nodes/html-select-element/HTMLSelectElementNamedNodeMap.cjs +42 -0
  101. package/cjs/nodes/html-select-element/HTMLSelectElementNamedNodeMap.cjs.map +1 -0
  102. package/cjs/nodes/html-select-element/HTMLSelectElementNamedNodeMap.d.ts +20 -0
  103. package/cjs/nodes/html-select-element/HTMLSelectElementNamedNodeMap.d.ts.map +1 -0
  104. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.cjs +2 -26
  105. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.cjs.map +1 -1
  106. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +2 -9
  107. package/cjs/nodes/html-text-area-element/HTMLTextAreaElement.d.ts.map +1 -1
  108. package/cjs/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.cjs +42 -0
  109. package/cjs/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.cjs.map +1 -0
  110. package/cjs/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.d.ts +20 -0
  111. package/cjs/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.d.ts.map +1 -0
  112. package/cjs/nodes/html-unknown-element/HTMLUnknownElement.cjs +5 -2
  113. package/cjs/nodes/html-unknown-element/HTMLUnknownElement.cjs.map +1 -1
  114. package/cjs/nodes/html-unknown-element/HTMLUnknownElement.d.ts.map +1 -1
  115. package/cjs/nodes/node/NodeUtility.cjs +4 -15
  116. package/cjs/nodes/node/NodeUtility.cjs.map +1 -1
  117. package/cjs/nodes/node/NodeUtility.d.ts.map +1 -1
  118. package/cjs/nodes/svg-element/SVGElement.cjs +2 -20
  119. package/cjs/nodes/svg-element/SVGElement.cjs.map +1 -1
  120. package/cjs/nodes/svg-element/SVGElement.d.ts +3 -10
  121. package/cjs/nodes/svg-element/SVGElement.d.ts.map +1 -1
  122. package/cjs/nodes/svg-element/SVGElementNamedNodeMap.cjs +35 -0
  123. package/cjs/nodes/svg-element/SVGElementNamedNodeMap.cjs.map +1 -0
  124. package/cjs/nodes/svg-element/SVGElementNamedNodeMap.d.ts +20 -0
  125. package/cjs/nodes/svg-element/SVGElementNamedNodeMap.d.ts.map +1 -0
  126. package/cjs/query-selector/SelectorItem.cjs +1 -1
  127. package/cjs/query-selector/SelectorItem.cjs.map +1 -1
  128. package/cjs/xml-serializer/XMLSerializer.cjs +3 -2
  129. package/cjs/xml-serializer/XMLSerializer.cjs.map +1 -1
  130. package/cjs/xml-serializer/XMLSerializer.d.ts.map +1 -1
  131. package/lib/css/declaration/AbstractCSSStyleDeclaration.d.ts.map +1 -1
  132. package/lib/css/declaration/AbstractCSSStyleDeclaration.js +20 -18
  133. package/lib/css/declaration/AbstractCSSStyleDeclaration.js.map +1 -1
  134. package/lib/css/declaration/element-style/CSSStyleDeclarationElementStyle.d.ts.map +1 -1
  135. package/lib/css/declaration/element-style/CSSStyleDeclarationElementStyle.js +4 -3
  136. package/lib/css/declaration/element-style/CSSStyleDeclarationElementStyle.js.map +1 -1
  137. package/lib/named-node-map/INamedNodeMap.d.ts +26 -26
  138. package/lib/named-node-map/INamedNodeMap.d.ts.map +1 -1
  139. package/lib/named-node-map/NamedNodeMap.d.ts +57 -40
  140. package/lib/named-node-map/NamedNodeMap.d.ts.map +1 -1
  141. package/lib/named-node-map/NamedNodeMap.js +121 -81
  142. package/lib/named-node-map/NamedNodeMap.js.map +1 -1
  143. package/lib/nodes/element/Dataset.d.ts.map +1 -1
  144. package/lib/nodes/element/Dataset.js +16 -17
  145. package/lib/nodes/element/Dataset.js.map +1 -1
  146. package/lib/nodes/element/Element.d.ts +9 -16
  147. package/lib/nodes/element/Element.d.ts.map +1 -1
  148. package/lib/nodes/element/Element.js +22 -133
  149. package/lib/nodes/element/Element.js.map +1 -1
  150. package/lib/nodes/element/ElementNamedNodeMap.d.ts +45 -0
  151. package/lib/nodes/element/ElementNamedNodeMap.d.ts.map +1 -0
  152. package/lib/nodes/element/ElementNamedNodeMap.js +146 -0
  153. package/lib/nodes/element/ElementNamedNodeMap.js.map +1 -0
  154. package/lib/nodes/element/ElementUtility.d.ts.map +1 -1
  155. package/lib/nodes/element/ElementUtility.js +20 -15
  156. package/lib/nodes/element/ElementUtility.js.map +1 -1
  157. package/lib/nodes/element/IElement.d.ts +5 -5
  158. package/lib/nodes/element/IElement.d.ts.map +1 -1
  159. package/lib/nodes/html-anchor-element/HTMLAnchorElement.d.ts +7 -11
  160. package/lib/nodes/html-anchor-element/HTMLAnchorElement.d.ts.map +1 -1
  161. package/lib/nodes/html-anchor-element/HTMLAnchorElement.js +2 -26
  162. package/lib/nodes/html-anchor-element/HTMLAnchorElement.js.map +1 -1
  163. package/lib/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.d.ts +20 -0
  164. package/lib/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.d.ts.map +1 -0
  165. package/lib/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.js +38 -0
  166. package/lib/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.js.map +1 -0
  167. package/lib/nodes/html-button-element/HTMLButtonElement.d.ts +2 -9
  168. package/lib/nodes/html-button-element/HTMLButtonElement.d.ts.map +1 -1
  169. package/lib/nodes/html-button-element/HTMLButtonElement.js +2 -26
  170. package/lib/nodes/html-button-element/HTMLButtonElement.js.map +1 -1
  171. package/lib/nodes/html-button-element/HTMLButtonElementNamedNodeMap.d.ts +20 -0
  172. package/lib/nodes/html-button-element/HTMLButtonElementNamedNodeMap.d.ts.map +1 -0
  173. package/lib/nodes/html-button-element/HTMLButtonElementNamedNodeMap.js +35 -0
  174. package/lib/nodes/html-button-element/HTMLButtonElementNamedNodeMap.js.map +1 -0
  175. package/lib/nodes/html-element/HTMLElement.d.ts +3 -10
  176. package/lib/nodes/html-element/HTMLElement.d.ts.map +1 -1
  177. package/lib/nodes/html-element/HTMLElement.js +2 -20
  178. package/lib/nodes/html-element/HTMLElement.js.map +1 -1
  179. package/lib/nodes/html-element/HTMLElementNamedNodeMap.d.ts +20 -0
  180. package/lib/nodes/html-element/HTMLElementNamedNodeMap.d.ts.map +1 -0
  181. package/lib/nodes/html-element/HTMLElementNamedNodeMap.js +29 -0
  182. package/lib/nodes/html-element/HTMLElementNamedNodeMap.js.map +1 -0
  183. package/lib/nodes/html-iframe-element/HTMLIFrameElement.d.ts +2 -5
  184. package/lib/nodes/html-iframe-element/HTMLIFrameElement.d.ts.map +1 -1
  185. package/lib/nodes/html-iframe-element/HTMLIFrameElement.js +2 -12
  186. package/lib/nodes/html-iframe-element/HTMLIFrameElement.js.map +1 -1
  187. package/lib/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.d.ts +16 -0
  188. package/lib/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.d.ts.map +1 -0
  189. package/lib/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.js +20 -0
  190. package/lib/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.js.map +1 -0
  191. package/lib/nodes/html-input-element/HTMLInputElement.d.ts +2 -9
  192. package/lib/nodes/html-input-element/HTMLInputElement.d.ts.map +1 -1
  193. package/lib/nodes/html-input-element/HTMLInputElement.js +2 -26
  194. package/lib/nodes/html-input-element/HTMLInputElement.js.map +1 -1
  195. package/lib/nodes/html-input-element/HTMLInputElementNamedNodeMap.d.ts +20 -0
  196. package/lib/nodes/html-input-element/HTMLInputElementNamedNodeMap.d.ts.map +1 -0
  197. package/lib/nodes/html-input-element/HTMLInputElementNamedNodeMap.js +36 -0
  198. package/lib/nodes/html-input-element/HTMLInputElementNamedNodeMap.js.map +1 -0
  199. package/lib/nodes/html-label-element/HTMLLabelElement.d.ts.map +1 -1
  200. package/lib/nodes/html-label-element/HTMLLabelElement.js +1 -6
  201. package/lib/nodes/html-label-element/HTMLLabelElement.js.map +1 -1
  202. package/lib/nodes/html-link-element/HTMLLinkElement.d.ts +4 -10
  203. package/lib/nodes/html-link-element/HTMLLinkElement.d.ts.map +1 -1
  204. package/lib/nodes/html-link-element/HTMLLinkElement.js +2 -23
  205. package/lib/nodes/html-link-element/HTMLLinkElement.js.map +1 -1
  206. package/lib/nodes/html-link-element/HTMLLinkElementNamedNodeMap.d.ts +20 -0
  207. package/lib/nodes/html-link-element/HTMLLinkElementNamedNodeMap.d.ts.map +1 -0
  208. package/lib/nodes/html-link-element/HTMLLinkElementNamedNodeMap.js +33 -0
  209. package/lib/nodes/html-link-element/HTMLLinkElementNamedNodeMap.js.map +1 -0
  210. package/lib/nodes/html-option-element/HTMLOptionElement.d.ts +2 -9
  211. package/lib/nodes/html-option-element/HTMLOptionElement.d.ts.map +1 -1
  212. package/lib/nodes/html-option-element/HTMLOptionElement.js +2 -30
  213. package/lib/nodes/html-option-element/HTMLOptionElement.js.map +1 -1
  214. package/lib/nodes/html-option-element/HTMLOptionElementNamedNodeMap.d.ts +20 -0
  215. package/lib/nodes/html-option-element/HTMLOptionElementNamedNodeMap.d.ts.map +1 -0
  216. package/lib/nodes/html-option-element/HTMLOptionElementNamedNodeMap.js +39 -0
  217. package/lib/nodes/html-option-element/HTMLOptionElementNamedNodeMap.js.map +1 -0
  218. package/lib/nodes/html-script-element/HTMLScriptElement.d.ts +2 -9
  219. package/lib/nodes/html-script-element/HTMLScriptElement.d.ts.map +1 -1
  220. package/lib/nodes/html-script-element/HTMLScriptElement.js +2 -14
  221. package/lib/nodes/html-script-element/HTMLScriptElement.js.map +1 -1
  222. package/lib/nodes/html-script-element/HTMLScriptElementNamedNodeMap.d.ts +16 -0
  223. package/lib/nodes/html-script-element/HTMLScriptElementNamedNodeMap.d.ts.map +1 -0
  224. package/lib/nodes/html-script-element/HTMLScriptElementNamedNodeMap.js +20 -0
  225. package/lib/nodes/html-script-element/HTMLScriptElementNamedNodeMap.js.map +1 -0
  226. package/lib/nodes/html-select-element/HTMLSelectElement.d.ts +2 -9
  227. package/lib/nodes/html-select-element/HTMLSelectElement.d.ts.map +1 -1
  228. package/lib/nodes/html-select-element/HTMLSelectElement.js +2 -26
  229. package/lib/nodes/html-select-element/HTMLSelectElement.js.map +1 -1
  230. package/lib/nodes/html-select-element/HTMLSelectElementNamedNodeMap.d.ts +20 -0
  231. package/lib/nodes/html-select-element/HTMLSelectElementNamedNodeMap.d.ts.map +1 -0
  232. package/lib/nodes/html-select-element/HTMLSelectElementNamedNodeMap.js +36 -0
  233. package/lib/nodes/html-select-element/HTMLSelectElementNamedNodeMap.js.map +1 -0
  234. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.d.ts +2 -9
  235. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.d.ts.map +1 -1
  236. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js +2 -26
  237. package/lib/nodes/html-text-area-element/HTMLTextAreaElement.js.map +1 -1
  238. package/lib/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.d.ts +20 -0
  239. package/lib/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.d.ts.map +1 -0
  240. package/lib/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.js +36 -0
  241. package/lib/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.js.map +1 -0
  242. package/lib/nodes/html-unknown-element/HTMLUnknownElement.d.ts.map +1 -1
  243. package/lib/nodes/html-unknown-element/HTMLUnknownElement.js +5 -2
  244. package/lib/nodes/html-unknown-element/HTMLUnknownElement.js.map +1 -1
  245. package/lib/nodes/node/NodeUtility.d.ts.map +1 -1
  246. package/lib/nodes/node/NodeUtility.js +4 -15
  247. package/lib/nodes/node/NodeUtility.js.map +1 -1
  248. package/lib/nodes/svg-element/SVGElement.d.ts +3 -10
  249. package/lib/nodes/svg-element/SVGElement.d.ts.map +1 -1
  250. package/lib/nodes/svg-element/SVGElement.js +2 -20
  251. package/lib/nodes/svg-element/SVGElement.js.map +1 -1
  252. package/lib/nodes/svg-element/SVGElementNamedNodeMap.d.ts +20 -0
  253. package/lib/nodes/svg-element/SVGElementNamedNodeMap.d.ts.map +1 -0
  254. package/lib/nodes/svg-element/SVGElementNamedNodeMap.js +29 -0
  255. package/lib/nodes/svg-element/SVGElementNamedNodeMap.js.map +1 -0
  256. package/lib/query-selector/SelectorItem.js +1 -1
  257. package/lib/query-selector/SelectorItem.js.map +1 -1
  258. package/lib/xml-serializer/XMLSerializer.d.ts.map +1 -1
  259. package/lib/xml-serializer/XMLSerializer.js +3 -2
  260. package/lib/xml-serializer/XMLSerializer.js.map +1 -1
  261. package/package.json +1 -1
  262. package/src/css/declaration/AbstractCSSStyleDeclaration.ts +32 -20
  263. package/src/css/declaration/element-style/CSSStyleDeclarationElementStyle.ts +4 -3
  264. package/src/named-node-map/INamedNodeMap.ts +26 -26
  265. package/src/named-node-map/NamedNodeMap.ts +135 -73
  266. package/src/nodes/element/Dataset.ts +19 -17
  267. package/src/nodes/element/Element.ts +27 -176
  268. package/src/nodes/element/ElementNamedNodeMap.ts +194 -0
  269. package/src/nodes/element/ElementUtility.ts +20 -18
  270. package/src/nodes/element/IElement.ts +5 -5
  271. package/src/nodes/html-anchor-element/HTMLAnchorElement.ts +5 -33
  272. package/src/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.ts +48 -0
  273. package/src/nodes/html-button-element/HTMLButtonElement.ts +3 -33
  274. package/src/nodes/html-button-element/HTMLButtonElementNamedNodeMap.ts +56 -0
  275. package/src/nodes/html-element/HTMLElement.ts +4 -28
  276. package/src/nodes/html-element/HTMLElementNamedNodeMap.ts +38 -0
  277. package/src/nodes/html-iframe-element/HTMLIFrameElement.ts +4 -18
  278. package/src/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.ts +26 -0
  279. package/src/nodes/html-input-element/HTMLInputElement.ts +4 -33
  280. package/src/nodes/html-input-element/HTMLInputElementNamedNodeMap.ts +57 -0
  281. package/src/nodes/html-label-element/HTMLLabelElement.ts +3 -6
  282. package/src/nodes/html-link-element/HTMLLinkElement.ts +4 -32
  283. package/src/nodes/html-link-element/HTMLLinkElementNamedNodeMap.ts +43 -0
  284. package/src/nodes/html-option-element/HTMLOptionElement.ts +3 -43
  285. package/src/nodes/html-option-element/HTMLOptionElementNamedNodeMap.ts +55 -0
  286. package/src/nodes/html-script-element/HTMLScriptElement.ts +3 -18
  287. package/src/nodes/html-script-element/HTMLScriptElementNamedNodeMap.ts +26 -0
  288. package/src/nodes/html-select-element/HTMLSelectElement.ts +4 -33
  289. package/src/nodes/html-select-element/HTMLSelectElementNamedNodeMap.ts +57 -0
  290. package/src/nodes/html-text-area-element/HTMLTextAreaElement.ts +3 -33
  291. package/src/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.ts +57 -0
  292. package/src/nodes/html-unknown-element/HTMLUnknownElement.ts +6 -2
  293. package/src/nodes/node/NodeUtility.ts +7 -24
  294. package/src/nodes/svg-element/SVGElement.ts +5 -28
  295. package/src/nodes/svg-element/SVGElementNamedNodeMap.ts +38 -0
  296. package/src/query-selector/SelectorItem.ts +1 -1
  297. package/src/xml-serializer/XMLSerializer.ts +4 -2
@@ -1,145 +1,207 @@
1
- import type Element from '../nodes/element/Element.js';
2
- import IAttr from '../nodes/attr/IAttr.js';
3
1
  import INamedNodeMap from './INamedNodeMap.js';
2
+ import IAttr from '../nodes/attr/IAttr.js';
4
3
 
5
4
  /**
6
- * NamedNodeMap.
5
+ * Named Node Map.
7
6
  *
8
- * Reference:
9
- * https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap.
7
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap
10
8
  */
11
9
  export default class NamedNodeMap implements INamedNodeMap {
12
10
  [index: number]: IAttr;
11
+ public length = 0;
12
+ protected _namedItems: { [k: string]: IAttr } = {};
13
13
 
14
14
  /**
15
- * Reference to the element.
15
+ * Returns string.
16
+ *
17
+ * @returns string.
16
18
  */
17
- #ownerElement: Element;
19
+ public get [Symbol.toStringTag](): string {
20
+ return 'NamedNodeMap';
21
+ }
18
22
 
19
23
  /**
20
- * Constructor.
24
+ * Iterator.
21
25
  *
22
- * @param element Associated element.
26
+ * @returns Iterator.
23
27
  */
24
- constructor(element: Element) {
25
- this.#ownerElement = element;
28
+ public *[Symbol.iterator](): IterableIterator<IAttr> {
29
+ for (let i = 0, max = this.length; i < max; i++) {
30
+ yield this[i];
31
+ }
26
32
  }
27
33
 
28
34
  /**
29
- * Returns string.
35
+ * Returns item by index.
30
36
  *
31
- * @returns string.
37
+ * @param index Index.
32
38
  */
33
- public get [Symbol.toStringTag](): string {
34
- return this.constructor.name;
39
+ public item(index: number): IAttr | null {
40
+ return index >= 0 && this[index] ? this[index] : null;
35
41
  }
36
42
 
37
43
  /**
38
- * Length.
44
+ * Returns named item.
39
45
  *
40
- * @returns Length.
46
+ * @param name Name.
47
+ * @returns Itme.
41
48
  */
42
- public get length(): number {
43
- return Object.keys(this.#ownerElement._attributes).length;
49
+ public getNamedItem(name: string): IAttr | null {
50
+ return this._namedItems[name] || null;
44
51
  }
45
52
 
46
53
  /**
47
- * Returns attribute by index.
54
+ * Returns item by name and namespace.
48
55
  *
49
- * @param index Index.
56
+ * @param namespace Namespace.
57
+ * @param localName Local name of the attribute.
58
+ * @returns Item.
50
59
  */
51
- public item(index: number): IAttr | null {
52
- if (index < 0) {
53
- return null;
60
+ public getNamedItemNS(namespace: string, localName: string): IAttr | null {
61
+ const attribute = this.getNamedItem(localName);
62
+
63
+ if (attribute && attribute.namespaceURI === namespace && attribute.localName === localName) {
64
+ return attribute;
65
+ }
66
+
67
+ for (let i = 0, max = this.length; i < max; i++) {
68
+ if (this[i].namespaceURI === namespace && this[i].localName === localName) {
69
+ return this[i];
70
+ }
54
71
  }
55
- const attr = Object.values(this.#ownerElement._attributes)[index];
56
- return attr ? attr : null;
72
+
73
+ return null;
57
74
  }
58
75
 
59
76
  /**
60
- * Returns attribute by name.
77
+ * Sets named item.
61
78
  *
62
- * @param qualifiedName Name.
63
- * @returns Attribute.
79
+ * @param item Item.
80
+ * @returns Replaced item.
64
81
  */
65
- public getNamedItem(qualifiedName: string): IAttr | null {
66
- return this.#ownerElement.getAttributeNode(qualifiedName);
82
+ public setNamedItem(item: IAttr): IAttr | null {
83
+ return this._setNamedItemWithoutConsequences(item);
67
84
  }
68
85
 
69
86
  /**
70
- * Returns attribute by name and namespace.
87
+ * Adds a new namespaced item.
71
88
  *
72
- * @param namespace Namespace.
73
- * @param localName Local name of the attribute.
74
- * @returns Attribute.
89
+ * @alias setNamedItem()
90
+ * @param item Item.
91
+ * @returns Replaced item.
75
92
  */
76
- public getNamedItemNS(namespace: string, localName: string): IAttr | null {
77
- return this.#ownerElement.getAttributeNodeNS(namespace, localName);
93
+ public setNamedItemNS(item: IAttr): IAttr | null {
94
+ return this.setNamedItem(item);
78
95
  }
79
96
 
80
97
  /**
81
- * Adds a new attribute node.
98
+ * Removes an item.
82
99
  *
83
- * @param attr Attribute.
84
- * @returns Replaced attribute.
100
+ * @param name Name of item.
101
+ * @returns Removed item.
85
102
  */
86
- public setNamedItem(attr: IAttr): IAttr {
87
- return this.#ownerElement.setAttributeNode(attr);
103
+ public removeNamedItem(name: string): IAttr | null {
104
+ return this._removeNamedItemWithoutConsequences(name);
88
105
  }
89
106
 
90
107
  /**
91
- * Adds a new namespaced attribute node.
108
+ * Removes a namespaced item.
92
109
  *
93
- * @param attr Attribute.
94
- * @returns Replaced attribute.
110
+ * @param namespace Namespace.
111
+ * @param localName Local name of the item.
112
+ * @returns Removed item.
95
113
  */
96
- public setNamedItemNS(attr: IAttr): IAttr {
97
- return this.#ownerElement.setAttributeNodeNS(attr);
114
+ public removeNamedItemNS(namespace: string, localName: string): IAttr | null {
115
+ const attribute = this.getNamedItemNS(namespace, localName);
116
+ if (attribute) {
117
+ return this.removeNamedItem(attribute.name);
118
+ }
119
+ return null;
98
120
  }
99
121
 
100
122
  /**
101
- * Removes an attribute.
123
+ * Sets named item without calling listeners for certain attributes.
102
124
  *
103
- * @param qualifiedName Name of the attribute.
104
- * @returns Removed attribute.
125
+ * @param item Item.
126
+ * @returns Replaced item.
105
127
  */
106
- public removeNamedItem(qualifiedName: string): IAttr | null {
107
- const attr = this.getNamedItem(qualifiedName);
128
+ public _setNamedItemWithoutConsequences(item: IAttr): IAttr | null {
129
+ if (item.name) {
130
+ const replacedItem = this._namedItems[item.name] || null;
131
+
132
+ this._namedItems[item.name] = item;
133
+
134
+ if (replacedItem) {
135
+ this._removeNamedItemIndex(replacedItem);
136
+ }
108
137
 
109
- if (attr) {
110
- this.#ownerElement.removeAttributeNode(attr);
138
+ this[this.length] = item;
139
+ this.length++;
140
+
141
+ if (this._isValidPropertyName(item.name)) {
142
+ this[item.name] = item;
143
+ }
144
+
145
+ return replacedItem;
111
146
  }
112
- return attr;
147
+ return null;
113
148
  }
114
149
 
115
150
  /**
116
- * Removes a namespaced attribute.
151
+ * Removes an item without calling listeners for certain attributes.
117
152
  *
118
- * @param namespace Namespace.
119
- * @param localName Local name of the attribute.
120
- * @returns Removed attribute.
153
+ * @param name Name of item.
154
+ * @returns Removed item.
121
155
  */
122
- public removeNamedItemNS(namespace: string, localName: string): IAttr | null {
123
- const attr = this.getNamedItemNS(namespace, localName);
156
+ public _removeNamedItemWithoutConsequences(name: string): IAttr | null {
157
+ const removedItem = this._namedItems[name] || null;
124
158
 
125
- if (attr) {
126
- this.#ownerElement.removeAttributeNode(attr);
159
+ if (!removedItem) {
160
+ return null;
127
161
  }
128
- return attr;
162
+
163
+ this._removeNamedItemIndex(removedItem);
164
+
165
+ if (this[name] === removedItem) {
166
+ delete this[name];
167
+ }
168
+
169
+ delete this._namedItems[name];
170
+
171
+ return removedItem;
129
172
  }
130
173
 
131
174
  /**
132
- * Iterator.
175
+ * Removes an item from index.
133
176
  *
134
- * @returns Iterator.
177
+ * @param item Item.
135
178
  */
136
- public [Symbol.iterator](): Iterator<IAttr> {
137
- let index = -1;
138
- return {
139
- next: () => {
140
- index++;
141
- return { value: this.item(index), done: index >= this.length };
179
+ protected _removeNamedItemIndex(item: IAttr): void {
180
+ for (let i = 0; i < this.length; i++) {
181
+ if (this[i] === item) {
182
+ for (let b = i; b < this.length; b++) {
183
+ if (b < this.length - 1) {
184
+ this[b] = this[b + 1];
185
+ } else {
186
+ delete this[b];
187
+ }
188
+ }
189
+ this.length--;
190
+ break;
142
191
  }
143
- };
192
+ }
193
+ }
194
+
195
+ /**
196
+ * Returns "true" if the property name is valid.
197
+ *
198
+ * @param name Name.
199
+ * @returns True if the property name is valid.
200
+ */
201
+ protected _isValidPropertyName(name: string): boolean {
202
+ return (
203
+ !this.constructor.prototype.hasOwnProperty(name) &&
204
+ (isNaN(Number(name)) || name.includes('.'))
205
+ );
144
206
  }
145
207
  }
@@ -20,11 +20,12 @@ export default class Dataset {
20
20
  constructor(element: Element) {
21
21
  // Build the initial dataset record from all data attributes.
22
22
  const dataset: DatasetRecord = {};
23
- const attributes = element._attributes;
24
- for (const name of Object.keys(attributes)) {
25
- if (name.startsWith('data-')) {
26
- const key = Dataset.kebabToCamelCase(name.replace('data-', ''));
27
- dataset[key] = attributes[name].value;
23
+
24
+ for (let i = 0, max = element.attributes.length; i < max; i++) {
25
+ const attribute = element.attributes[i];
26
+ if (attribute.name.startsWith('data-')) {
27
+ const key = Dataset.kebabToCamelCase(attribute.name.replace('data-', ''));
28
+ dataset[key] = attribute.value;
28
29
  }
29
30
  }
30
31
 
@@ -32,9 +33,9 @@ export default class Dataset {
32
33
  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
33
34
  this.proxy = new Proxy(dataset, {
34
35
  get(dataset: DatasetRecord, key: string): string {
35
- const name = 'data-' + Dataset.camelCaseToKebab(key);
36
- if (name in attributes) {
37
- return (dataset[key] = attributes[name].value);
36
+ const attribute = element.attributes.getNamedItem('data-' + Dataset.camelCaseToKebab(key));
37
+ if (attribute) {
38
+ return (dataset[key] = attribute.value);
38
39
  }
39
40
  delete dataset[key];
40
41
  return undefined;
@@ -45,10 +46,10 @@ export default class Dataset {
45
46
  return true;
46
47
  },
47
48
  deleteProperty(dataset: DatasetRecord, key: string): boolean {
48
- const name = 'data-' + Dataset.camelCaseToKebab(key);
49
- const result1 = delete attributes[name];
50
- const result2 = delete dataset[key];
51
- return result1 && result2;
49
+ return (
50
+ !!element.attributes.removeNamedItem('data-' + Dataset.camelCaseToKebab(key)) &&
51
+ delete dataset[key]
52
+ );
52
53
  },
53
54
  ownKeys(dataset: DatasetRecord): string[] {
54
55
  // According to Mozilla we have to update the dataset object (target) to contain the same keys as what we return:
@@ -56,11 +57,12 @@ export default class Dataset {
56
57
  // "The result List must contain the keys of all non-configurable own properties of the target object."
57
58
  const keys = [];
58
59
  const deleteKeys = [];
59
- for (const name of Object.keys(attributes)) {
60
- if (name.startsWith('data-')) {
61
- const key = Dataset.kebabToCamelCase(name.replace('data-', ''));
60
+ for (let i = 0, max = element.attributes.length; i < max; i++) {
61
+ const attribute = element.attributes[i];
62
+ if (attribute.name.startsWith('data-')) {
63
+ const key = Dataset.kebabToCamelCase(attribute.name.replace('data-', ''));
62
64
  keys.push(key);
63
- dataset[key] = attributes[name].value;
65
+ dataset[key] = attribute.value;
64
66
  if (!dataset[key]) {
65
67
  deleteKeys.push(key);
66
68
  }
@@ -72,7 +74,7 @@ export default class Dataset {
72
74
  return keys;
73
75
  },
74
76
  has(_dataset: DatasetRecord, key: string): boolean {
75
- return !!attributes['data-' + Dataset.camelCaseToKebab(key)];
77
+ return !!element.attributes.getNamedItem('data-' + Dataset.camelCaseToKebab(key));
76
78
  }
77
79
  });
78
80
  }
@@ -1,13 +1,10 @@
1
1
  import Node from '../node/Node.js';
2
2
  import ShadowRoot from '../shadow-root/ShadowRoot.js';
3
3
  import Attr from '../attr/Attr.js';
4
- import NamedNodeMap from '../../named-node-map/NamedNodeMap.js';
5
4
  import DOMRect from './DOMRect.js';
6
5
  import DOMTokenList from '../../dom-token-list/DOMTokenList.js';
7
6
  import IDOMTokenList from '../../dom-token-list/IDOMTokenList.js';
8
7
  import QuerySelector from '../../query-selector/QuerySelector.js';
9
- import MutationRecord from '../../mutation-observer/MutationRecord.js';
10
- import MutationTypeEnum from '../../mutation-observer/MutationTypeEnum.js';
11
8
  import NamespaceURI from '../../config/NamespaceURI.js';
12
9
  import XMLParser from '../../xml-parser/XMLParser.js';
13
10
  import XMLSerializer from '../../xml-serializer/XMLSerializer.js';
@@ -32,6 +29,7 @@ import ElementUtility from './ElementUtility.js';
32
29
  import HTMLCollection from './HTMLCollection.js';
33
30
  import EventPhaseEnum from '../../event/EventPhaseEnum.js';
34
31
  import CSSStyleDeclaration from '../../css/declaration/CSSStyleDeclaration.js';
32
+ import ElementNamedNodeMap from './ElementNamedNodeMap.js';
35
33
 
36
34
  /**
37
35
  * Element.
@@ -89,9 +87,9 @@ export default class Element extends Node implements IElement {
89
87
 
90
88
  // Used for being able to access closed shadow roots
91
89
  public _shadowRoot: IShadowRoot = null;
92
- public _attributes: { [k: string]: IAttr } = {};
90
+ public readonly attributes: INamedNodeMap = new ElementNamedNodeMap(this);
93
91
 
94
- private _classList: DOMTokenList = null;
92
+ public _classList: DOMTokenList = null;
95
93
  public _isValue?: string | null = null;
96
94
  public _computedStyle: CSSStyleDeclaration | null = null;
97
95
 
@@ -266,15 +264,6 @@ export default class Element extends Node implements IElement {
266
264
  this.replaceWith(html);
267
265
  }
268
266
 
269
- /**
270
- * Returns attributes.
271
- *
272
- * @returns Attributes.
273
- */
274
- public get attributes(): INamedNodeMap {
275
- return Object.assign(new NamedNodeMap(this), Object.values(this._attributes), this._attributes);
276
- }
277
-
278
267
  /**
279
268
  * First element child.
280
269
  *
@@ -364,10 +353,9 @@ export default class Element extends Node implements IElement {
364
353
 
365
354
  Attr._ownerDocument = this.ownerDocument;
366
355
 
367
- for (const key of Object.keys(this._attributes)) {
368
- const attr = Object.assign(new Attr(), this._attributes[key]);
369
- (<IElement>attr.ownerElement) = clone;
370
- (<Element>clone)._attributes[key] = attr;
356
+ for (let i = 0, max = this.attributes.length; i < max; i++) {
357
+ const attribute = this.attributes[i];
358
+ clone.attributes.setNamedItem(Object.assign(new Attr(), attribute));
371
359
  }
372
360
 
373
361
  if (deep) {
@@ -563,7 +551,11 @@ export default class Element extends Node implements IElement {
563
551
  * @returns Attribute names.
564
552
  */
565
553
  public getAttributeNames(): string[] {
566
- return Object.keys(this._attributes);
554
+ const attributeNames = [];
555
+ for (let i = 0, max = this.attributes.length; i < max; i++) {
556
+ attributeNames.push(this.attributes[i].name);
557
+ }
558
+ return attributeNames;
567
559
  }
568
560
 
569
561
  /**
@@ -635,13 +627,7 @@ export default class Element extends Node implements IElement {
635
627
  * @returns True if attribute exists, false otherwise.
636
628
  */
637
629
  public hasAttributeNS(namespace: string | null, localName: string): boolean {
638
- for (const name of Object.keys(this._attributes)) {
639
- const attribute = this._attributes[name];
640
- if (attribute.namespaceURI === namespace && attribute.localName === localName) {
641
- return true;
642
- }
643
- }
644
- return false;
630
+ return this.attributes.getNamedItemNS(namespace, localName) !== null;
645
631
  }
646
632
 
647
633
  /**
@@ -650,7 +636,7 @@ export default class Element extends Node implements IElement {
650
636
  * @returns "true" if the element has attributes.
651
637
  */
652
638
  public hasAttributes(): boolean {
653
- return Object.keys(this._attributes).length > 0;
639
+ return this.attributes.length > 0;
654
640
  }
655
641
 
656
642
  /**
@@ -659,10 +645,7 @@ export default class Element extends Node implements IElement {
659
645
  * @param name Name.
660
646
  */
661
647
  public removeAttribute(name: string): void {
662
- const attribute = this._attributes[this._getAttributeName(name)];
663
- if (attribute) {
664
- this.removeAttributeNode(attribute);
665
- }
648
+ this.attributes.removeNamedItem(name);
666
649
  }
667
650
 
668
651
  /**
@@ -672,12 +655,7 @@ export default class Element extends Node implements IElement {
672
655
  * @param localName Local name.
673
656
  */
674
657
  public removeAttributeNS(namespace: string | null, localName: string): void {
675
- for (const name of Object.keys(this._attributes)) {
676
- const attribute = this._attributes[name];
677
- if (attribute.namespaceURI === namespace && attribute.localName === localName) {
678
- this.removeAttribute(attribute.name);
679
- }
680
- }
658
+ this.attributes.removeNamedItemNS(namespace, localName);
681
659
  }
682
660
 
683
661
  /**
@@ -824,67 +802,7 @@ export default class Element extends Node implements IElement {
824
802
  * @returns Replaced attribute.
825
803
  */
826
804
  public setAttributeNode(attribute: IAttr): IAttr | null {
827
- const name = this._getAttributeName(attribute.name);
828
- const replacedAttribute = this._attributes[name];
829
- const oldValue = replacedAttribute ? replacedAttribute.value : null;
830
-
831
- attribute.name = name;
832
- (<IElement>attribute.ownerElement) = <IElement>this;
833
- (<IDocument>attribute.ownerDocument) = this.ownerDocument;
834
-
835
- if (this.isConnected) {
836
- this.ownerDocument['_cacheID']++;
837
- }
838
-
839
- this._attributes[name] = attribute;
840
-
841
- if (attribute.name === 'class' && this._classList) {
842
- this._classList._updateIndices();
843
- }
844
-
845
- if (attribute.name === 'id' || attribute.name === 'name') {
846
- if (this.parentNode && (<IElement>this.parentNode).children && attribute.value !== oldValue) {
847
- if (oldValue) {
848
- (<HTMLCollection<IElement>>(<IElement>this.parentNode).children)._removeNamedItem(
849
- this,
850
- oldValue
851
- );
852
- }
853
- if (attribute.value) {
854
- (<HTMLCollection<IElement>>(<IElement>this.parentNode).children)._appendNamedItem(
855
- this,
856
- attribute.value
857
- );
858
- }
859
- }
860
- }
861
-
862
- if (
863
- this.attributeChangedCallback &&
864
- (<typeof Element>this.constructor)._observedAttributes &&
865
- (<typeof Element>this.constructor)._observedAttributes.includes(name)
866
- ) {
867
- this.attributeChangedCallback(name, oldValue, attribute.value);
868
- }
869
-
870
- // MutationObserver
871
- if (this._observers.length > 0) {
872
- for (const observer of this._observers) {
873
- if (
874
- observer.options.attributes &&
875
- (!observer.options.attributeFilter || observer.options.attributeFilter.includes(name))
876
- ) {
877
- const record = new MutationRecord();
878
- record.target = this;
879
- record.type = MutationTypeEnum.attributes;
880
- record.attributeName = name;
881
- record.oldValue = observer.options.attributeOldValue ? oldValue : null;
882
- observer.callback([record]);
883
- }
884
- }
885
- }
886
-
887
- return replacedAttribute || null;
805
+ return this.attributes.setNamedItem(attribute);
888
806
  }
889
807
 
890
808
  /**
@@ -893,8 +811,8 @@ export default class Element extends Node implements IElement {
893
811
  * @param attribute Attribute.
894
812
  * @returns Replaced attribute.
895
813
  */
896
- public setAttributeNodeNS(attribute: IAttr): IAttr {
897
- return this.setAttributeNode(attribute);
814
+ public setAttributeNodeNS(attribute: IAttr): IAttr | null {
815
+ return this.attributes.setNamedItemNS(attribute);
898
816
  }
899
817
 
900
818
  /**
@@ -903,33 +821,19 @@ export default class Element extends Node implements IElement {
903
821
  * @param name Name.
904
822
  * @returns Replaced attribute.
905
823
  */
906
- public getAttributeNode(name: string): IAttr {
907
- return this._attributes[this._getAttributeName(name)] || null;
824
+ public getAttributeNode(name: string): IAttr | null {
825
+ return this.attributes.getNamedItem(name);
908
826
  }
909
827
 
910
828
  /**
911
829
  * Returns a namespaced Attr node.
912
830
  *
913
831
  * @param namespace Namespace.
914
- * @param name Name.
832
+ * @param localName Name.
915
833
  * @returns Replaced attribute.
916
834
  */
917
- public getAttributeNodeNS(namespace: string | null, name: string): IAttr {
918
- const attributeName = this._getAttributeName(name);
919
- if (
920
- this._attributes[attributeName] &&
921
- this._attributes[attributeName].namespaceURI === namespace &&
922
- this._attributes[attributeName].localName === attributeName
923
- ) {
924
- return this._attributes[attributeName];
925
- }
926
- for (const name of Object.keys(this._attributes)) {
927
- const attribute = this._attributes[name];
928
- if (attribute.namespaceURI === namespace && attribute.localName === attributeName) {
929
- return attribute;
930
- }
931
- }
932
- return null;
835
+ public getAttributeNodeNS(namespace: string | null, localName: string): IAttr | null {
836
+ return this.attributes.getNamedItemNS(namespace, localName);
933
837
  }
934
838
 
935
839
  /**
@@ -938,61 +842,8 @@ export default class Element extends Node implements IElement {
938
842
  * @param attribute Attribute.
939
843
  * @returns Removed attribute.
940
844
  */
941
- public removeAttributeNode(attribute: IAttr): IAttr {
942
- const removedAttribute = this._attributes[attribute.name];
943
-
944
- if (removedAttribute !== attribute) {
945
- throw new DOMException(
946
- `Failed to execute 'removeAttributeNode' on 'Element': The node provided is owned by another element.`
947
- );
948
- }
949
-
950
- delete this._attributes[attribute.name];
951
-
952
- if (this.isConnected) {
953
- this.ownerDocument['_cacheID']++;
954
- }
955
-
956
- if (attribute.name === 'class' && this._classList) {
957
- this._classList._updateIndices();
958
- }
959
-
960
- if (attribute.name === 'id' || attribute.name === 'name') {
961
- if (this.parentNode && (<IElement>this.parentNode).children && attribute.value) {
962
- (<HTMLCollection<IElement>>(<IElement>this.parentNode).children)._removeNamedItem(
963
- this,
964
- attribute.value
965
- );
966
- }
967
- }
968
-
969
- if (
970
- this.attributeChangedCallback &&
971
- (<typeof Element>this.constructor)._observedAttributes &&
972
- (<typeof Element>this.constructor)._observedAttributes.includes(attribute.name)
973
- ) {
974
- this.attributeChangedCallback(attribute.name, attribute.value, null);
975
- }
976
-
977
- // MutationObserver
978
- if (this._observers.length > 0) {
979
- for (const observer of this._observers) {
980
- if (
981
- observer.options.attributes &&
982
- (!observer.options.attributeFilter ||
983
- observer.options.attributeFilter.includes(attribute.name))
984
- ) {
985
- const record = new MutationRecord();
986
- record.target = this;
987
- record.type = MutationTypeEnum.attributes;
988
- record.attributeName = attribute.name;
989
- record.oldValue = observer.options.attributeOldValue ? attribute.value : null;
990
- observer.callback([record]);
991
- }
992
- }
993
- }
994
-
995
- return attribute;
845
+ public removeAttributeNode(attribute: IAttr): IAttr | null {
846
+ return this.attributes.removeNamedItem(attribute.name);
996
847
  }
997
848
 
998
849
  /**
@@ -1001,8 +852,8 @@ export default class Element extends Node implements IElement {
1001
852
  * @param attribute Attribute.
1002
853
  * @returns Removed attribute.
1003
854
  */
1004
- public removeAttributeNodeNS(attribute: IAttr): IAttr {
1005
- return this.removeAttributeNode(attribute);
855
+ public removeAttributeNodeNS(attribute: IAttr): IAttr | null {
856
+ return this.attributes.removeNamedItemNS(attribute.namespaceURI, attribute.localName);
1006
857
  }
1007
858
 
1008
859
  /**