@depup/jsdom 28.1.0-depup.1

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 (538) hide show
  1. package/LICENSE.txt +22 -0
  2. package/README.md +38 -0
  3. package/changes.json +38 -0
  4. package/lib/api.js +373 -0
  5. package/lib/generated/event-sets.js +115 -0
  6. package/lib/generated/idl/AbortController.js +143 -0
  7. package/lib/generated/idl/AbortSignal.js +249 -0
  8. package/lib/generated/idl/AbstractRange.js +171 -0
  9. package/lib/generated/idl/AddEventListenerOptions.js +53 -0
  10. package/lib/generated/idl/AssignedNodesOptions.js +28 -0
  11. package/lib/generated/idl/Attr.js +219 -0
  12. package/lib/generated/idl/BarProp.js +117 -0
  13. package/lib/generated/idl/BeforeUnloadEvent.js +139 -0
  14. package/lib/generated/idl/BinaryType.js +12 -0
  15. package/lib/generated/idl/Blob.js +253 -0
  16. package/lib/generated/idl/BlobCallback.js +30 -0
  17. package/lib/generated/idl/BlobEvent.js +157 -0
  18. package/lib/generated/idl/BlobEventInit.js +43 -0
  19. package/lib/generated/idl/BlobPropertyBag.js +42 -0
  20. package/lib/generated/idl/CDATASection.js +109 -0
  21. package/lib/generated/idl/CanPlayTypeResult.js +12 -0
  22. package/lib/generated/idl/CharacterData.js +455 -0
  23. package/lib/generated/idl/CloseEvent.js +168 -0
  24. package/lib/generated/idl/CloseEventInit.js +65 -0
  25. package/lib/generated/idl/Comment.js +120 -0
  26. package/lib/generated/idl/CompositionEvent.js +219 -0
  27. package/lib/generated/idl/CompositionEventInit.js +32 -0
  28. package/lib/generated/idl/Crypto.js +148 -0
  29. package/lib/generated/idl/CustomElementConstructor.js +34 -0
  30. package/lib/generated/idl/CustomElementRegistry.js +269 -0
  31. package/lib/generated/idl/CustomEvent.js +206 -0
  32. package/lib/generated/idl/CustomEventInit.js +32 -0
  33. package/lib/generated/idl/DOMException.js +222 -0
  34. package/lib/generated/idl/DOMImplementation.js +237 -0
  35. package/lib/generated/idl/DOMParser.js +140 -0
  36. package/lib/generated/idl/DOMRect.js +276 -0
  37. package/lib/generated/idl/DOMRectInit.js +76 -0
  38. package/lib/generated/idl/DOMRectReadOnly.js +285 -0
  39. package/lib/generated/idl/DOMStringMap.js +299 -0
  40. package/lib/generated/idl/DOMTokenList.js +539 -0
  41. package/lib/generated/idl/DeviceMotionEvent.js +183 -0
  42. package/lib/generated/idl/DeviceMotionEventAcceleration.js +145 -0
  43. package/lib/generated/idl/DeviceMotionEventAccelerationInit.js +61 -0
  44. package/lib/generated/idl/DeviceMotionEventInit.js +70 -0
  45. package/lib/generated/idl/DeviceMotionEventRotationRate.js +145 -0
  46. package/lib/generated/idl/DeviceMotionEventRotationRateInit.js +61 -0
  47. package/lib/generated/idl/DeviceOrientationEvent.js +183 -0
  48. package/lib/generated/idl/DeviceOrientationEventInit.js +80 -0
  49. package/lib/generated/idl/Document.js +4511 -0
  50. package/lib/generated/idl/DocumentFragment.js +336 -0
  51. package/lib/generated/idl/DocumentReadyState.js +12 -0
  52. package/lib/generated/idl/DocumentType.js +254 -0
  53. package/lib/generated/idl/Element.js +3720 -0
  54. package/lib/generated/idl/ElementCreationOptions.js +26 -0
  55. package/lib/generated/idl/ElementDefinitionOptions.js +29 -0
  56. package/lib/generated/idl/ElementInternals.js +2152 -0
  57. package/lib/generated/idl/EndingType.js +12 -0
  58. package/lib/generated/idl/ErrorEvent.js +192 -0
  59. package/lib/generated/idl/ErrorEventInit.js +92 -0
  60. package/lib/generated/idl/Event.js +430 -0
  61. package/lib/generated/idl/EventHandlerNonNull.js +36 -0
  62. package/lib/generated/idl/EventInit.js +58 -0
  63. package/lib/generated/idl/EventListener.js +35 -0
  64. package/lib/generated/idl/EventListenerOptions.js +28 -0
  65. package/lib/generated/idl/EventModifierInit.js +221 -0
  66. package/lib/generated/idl/EventTarget.js +259 -0
  67. package/lib/generated/idl/External.js +130 -0
  68. package/lib/generated/idl/File.js +185 -0
  69. package/lib/generated/idl/FileList.js +298 -0
  70. package/lib/generated/idl/FilePropertyBag.js +33 -0
  71. package/lib/generated/idl/FileReader.js +468 -0
  72. package/lib/generated/idl/FocusEvent.js +144 -0
  73. package/lib/generated/idl/FocusEventInit.js +36 -0
  74. package/lib/generated/idl/FormData.js +468 -0
  75. package/lib/generated/idl/Function.js +42 -0
  76. package/lib/generated/idl/GetRootNodeOptions.js +31 -0
  77. package/lib/generated/idl/HTMLAnchorElement.js +1026 -0
  78. package/lib/generated/idl/HTMLAreaElement.js +825 -0
  79. package/lib/generated/idl/HTMLAudioElement.js +111 -0
  80. package/lib/generated/idl/HTMLBRElement.js +156 -0
  81. package/lib/generated/idl/HTMLBaseElement.js +196 -0
  82. package/lib/generated/idl/HTMLBodyElement.js +880 -0
  83. package/lib/generated/idl/HTMLButtonElement.js +525 -0
  84. package/lib/generated/idl/HTMLCanvasElement.js +307 -0
  85. package/lib/generated/idl/HTMLCollection.js +352 -0
  86. package/lib/generated/idl/HTMLDListElement.js +159 -0
  87. package/lib/generated/idl/HTMLDataElement.js +156 -0
  88. package/lib/generated/idl/HTMLDataListElement.js +126 -0
  89. package/lib/generated/idl/HTMLDetailsElement.js +159 -0
  90. package/lib/generated/idl/HTMLDialogElement.js +159 -0
  91. package/lib/generated/idl/HTMLDirectoryElement.js +159 -0
  92. package/lib/generated/idl/HTMLDivElement.js +156 -0
  93. package/lib/generated/idl/HTMLElement.js +3492 -0
  94. package/lib/generated/idl/HTMLEmbedElement.js +381 -0
  95. package/lib/generated/idl/HTMLFieldSetElement.js +332 -0
  96. package/lib/generated/idl/HTMLFontElement.js +239 -0
  97. package/lib/generated/idl/HTMLFormControlsCollection.js +318 -0
  98. package/lib/generated/idl/HTMLFormElement.js +661 -0
  99. package/lib/generated/idl/HTMLFrameElement.js +513 -0
  100. package/lib/generated/idl/HTMLFrameSetElement.js +711 -0
  101. package/lib/generated/idl/HTMLHRElement.js +323 -0
  102. package/lib/generated/idl/HTMLHeadElement.js +111 -0
  103. package/lib/generated/idl/HTMLHeadingElement.js +156 -0
  104. package/lib/generated/idl/HTMLHtmlElement.js +156 -0
  105. package/lib/generated/idl/HTMLIFrameElement.js +689 -0
  106. package/lib/generated/idl/HTMLImageElement.js +906 -0
  107. package/lib/generated/idl/HTMLInputElement.js +1931 -0
  108. package/lib/generated/idl/HTMLLIElement.js +204 -0
  109. package/lib/generated/idl/HTMLLabelElement.js +182 -0
  110. package/lib/generated/idl/HTMLLegendElement.js +169 -0
  111. package/lib/generated/idl/HTMLLinkElement.js +555 -0
  112. package/lib/generated/idl/HTMLMapElement.js +171 -0
  113. package/lib/generated/idl/HTMLMarqueeElement.js +558 -0
  114. package/lib/generated/idl/HTMLMediaElement.js +900 -0
  115. package/lib/generated/idl/HTMLMenuElement.js +159 -0
  116. package/lib/generated/idl/HTMLMetaElement.js +279 -0
  117. package/lib/generated/idl/HTMLMeterElement.js +368 -0
  118. package/lib/generated/idl/HTMLModElement.js +217 -0
  119. package/lib/generated/idl/HTMLOListElement.js +284 -0
  120. package/lib/generated/idl/HTMLObjectElement.js +945 -0
  121. package/lib/generated/idl/HTMLOptGroupElement.js +200 -0
  122. package/lib/generated/idl/HTMLOptionElement.js +379 -0
  123. package/lib/generated/idl/HTMLOptionsCollection.js +513 -0
  124. package/lib/generated/idl/HTMLOutputElement.js +395 -0
  125. package/lib/generated/idl/HTMLParagraphElement.js +156 -0
  126. package/lib/generated/idl/HTMLParamElement.js +279 -0
  127. package/lib/generated/idl/HTMLPictureElement.js +111 -0
  128. package/lib/generated/idl/HTMLPreElement.js +163 -0
  129. package/lib/generated/idl/HTMLProgressElement.js +232 -0
  130. package/lib/generated/idl/HTMLQuoteElement.js +176 -0
  131. package/lib/generated/idl/HTMLScriptElement.js +472 -0
  132. package/lib/generated/idl/HTMLSelectElement.js +993 -0
  133. package/lib/generated/idl/HTMLSlotElement.js +195 -0
  134. package/lib/generated/idl/HTMLSourceElement.js +340 -0
  135. package/lib/generated/idl/HTMLSpanElement.js +111 -0
  136. package/lib/generated/idl/HTMLStyleElement.js +210 -0
  137. package/lib/generated/idl/HTMLTableCaptionElement.js +156 -0
  138. package/lib/generated/idl/HTMLTableCellElement.js +733 -0
  139. package/lib/generated/idl/HTMLTableColElement.js +376 -0
  140. package/lib/generated/idl/HTMLTableElement.js +802 -0
  141. package/lib/generated/idl/HTMLTableRowElement.js +417 -0
  142. package/lib/generated/idl/HTMLTableSectionElement.js +349 -0
  143. package/lib/generated/idl/HTMLTemplateElement.js +124 -0
  144. package/lib/generated/idl/HTMLTextAreaElement.js +1210 -0
  145. package/lib/generated/idl/HTMLTimeElement.js +156 -0
  146. package/lib/generated/idl/HTMLTitleElement.js +155 -0
  147. package/lib/generated/idl/HTMLTrackElement.js +366 -0
  148. package/lib/generated/idl/HTMLUListElement.js +200 -0
  149. package/lib/generated/idl/HTMLUnknownElement.js +109 -0
  150. package/lib/generated/idl/HTMLVideoElement.js +344 -0
  151. package/lib/generated/idl/HashChangeEvent.js +157 -0
  152. package/lib/generated/idl/HashChangeEventInit.js +50 -0
  153. package/lib/generated/idl/Headers.js +418 -0
  154. package/lib/generated/idl/History.js +266 -0
  155. package/lib/generated/idl/InputEvent.js +168 -0
  156. package/lib/generated/idl/InputEventInit.js +68 -0
  157. package/lib/generated/idl/KeyboardEvent.js +445 -0
  158. package/lib/generated/idl/KeyboardEventInit.js +116 -0
  159. package/lib/generated/idl/Location.js +404 -0
  160. package/lib/generated/idl/MessageEvent.js +317 -0
  161. package/lib/generated/idl/MessageEventInit.js +100 -0
  162. package/lib/generated/idl/MimeType.js +156 -0
  163. package/lib/generated/idl/MimeTypeArray.js +326 -0
  164. package/lib/generated/idl/MouseEvent.js +595 -0
  165. package/lib/generated/idl/MouseEventInit.js +189 -0
  166. package/lib/generated/idl/MutationCallback.js +34 -0
  167. package/lib/generated/idl/MutationObserver.js +178 -0
  168. package/lib/generated/idl/MutationObserverInit.js +121 -0
  169. package/lib/generated/idl/MutationRecord.js +229 -0
  170. package/lib/generated/idl/NamedNodeMap.js +529 -0
  171. package/lib/generated/idl/Navigator.js +326 -0
  172. package/lib/generated/idl/Node.js +765 -0
  173. package/lib/generated/idl/NodeFilter.js +75 -0
  174. package/lib/generated/idl/NodeIterator.js +207 -0
  175. package/lib/generated/idl/NodeList.js +302 -0
  176. package/lib/generated/idl/OnBeforeUnloadEventHandlerNonNull.js +42 -0
  177. package/lib/generated/idl/OnErrorEventHandlerNonNull.js +56 -0
  178. package/lib/generated/idl/PageTransitionEvent.js +144 -0
  179. package/lib/generated/idl/PageTransitionEventInit.js +35 -0
  180. package/lib/generated/idl/Performance.js +142 -0
  181. package/lib/generated/idl/Plugin.js +359 -0
  182. package/lib/generated/idl/PluginArray.js +336 -0
  183. package/lib/generated/idl/PointerEvent.js +324 -0
  184. package/lib/generated/idl/PointerEventInit.js +241 -0
  185. package/lib/generated/idl/PopStateEvent.js +144 -0
  186. package/lib/generated/idl/PopStateEventInit.js +32 -0
  187. package/lib/generated/idl/ProcessingInstruction.js +122 -0
  188. package/lib/generated/idl/ProgressEvent.js +170 -0
  189. package/lib/generated/idl/ProgressEventInit.js +65 -0
  190. package/lib/generated/idl/PromiseRejectionEvent.js +157 -0
  191. package/lib/generated/idl/PromiseRejectionEventInit.js +42 -0
  192. package/lib/generated/idl/RadioNodeList.js +296 -0
  193. package/lib/generated/idl/Range.js +643 -0
  194. package/lib/generated/idl/SVGAnimatedPreserveAspectRatio.js +136 -0
  195. package/lib/generated/idl/SVGAnimatedRect.js +136 -0
  196. package/lib/generated/idl/SVGAnimatedString.js +149 -0
  197. package/lib/generated/idl/SVGBoundingBoxOptions.js +64 -0
  198. package/lib/generated/idl/SVGDefsElement.js +109 -0
  199. package/lib/generated/idl/SVGDescElement.js +109 -0
  200. package/lib/generated/idl/SVGElement.js +3157 -0
  201. package/lib/generated/idl/SVGGElement.js +109 -0
  202. package/lib/generated/idl/SVGGraphicsElement.js +139 -0
  203. package/lib/generated/idl/SVGMetadataElement.js +109 -0
  204. package/lib/generated/idl/SVGNumber.js +132 -0
  205. package/lib/generated/idl/SVGPreserveAspectRatio.js +196 -0
  206. package/lib/generated/idl/SVGRect.js +210 -0
  207. package/lib/generated/idl/SVGSVGElement.js +786 -0
  208. package/lib/generated/idl/SVGStringList.js +511 -0
  209. package/lib/generated/idl/SVGSwitchElement.js +109 -0
  210. package/lib/generated/idl/SVGSymbolElement.js +146 -0
  211. package/lib/generated/idl/SVGTitleElement.js +109 -0
  212. package/lib/generated/idl/Screen.js +180 -0
  213. package/lib/generated/idl/ScrollBehavior.js +12 -0
  214. package/lib/generated/idl/ScrollIntoViewOptions.js +45 -0
  215. package/lib/generated/idl/ScrollLogicalPosition.js +14 -0
  216. package/lib/generated/idl/ScrollOptions.js +30 -0
  217. package/lib/generated/idl/ScrollRestoration.js +12 -0
  218. package/lib/generated/idl/Selection.js +571 -0
  219. package/lib/generated/idl/SelectionMode.js +12 -0
  220. package/lib/generated/idl/ShadowRoot.js +189 -0
  221. package/lib/generated/idl/ShadowRootInit.js +30 -0
  222. package/lib/generated/idl/ShadowRootMode.js +12 -0
  223. package/lib/generated/idl/StaticRange.js +123 -0
  224. package/lib/generated/idl/StaticRangeInit.js +72 -0
  225. package/lib/generated/idl/Storage.js +397 -0
  226. package/lib/generated/idl/StorageEvent.js +318 -0
  227. package/lib/generated/idl/StorageEventInit.js +99 -0
  228. package/lib/generated/idl/StyleSheetList.js +300 -0
  229. package/lib/generated/idl/SubmitEvent.js +144 -0
  230. package/lib/generated/idl/SubmitEventInit.js +36 -0
  231. package/lib/generated/idl/SupportedType.js +18 -0
  232. package/lib/generated/idl/Text.js +170 -0
  233. package/lib/generated/idl/TextDecodeOptions.js +28 -0
  234. package/lib/generated/idl/TextDecoder.js +211 -0
  235. package/lib/generated/idl/TextDecoderOptions.js +43 -0
  236. package/lib/generated/idl/TextEncoder.js +176 -0
  237. package/lib/generated/idl/TextEncoderEncodeIntoResult.js +42 -0
  238. package/lib/generated/idl/TextTrackKind.js +12 -0
  239. package/lib/generated/idl/TouchEvent.js +222 -0
  240. package/lib/generated/idl/TouchEventInit.js +89 -0
  241. package/lib/generated/idl/TransitionEvent.js +170 -0
  242. package/lib/generated/idl/TransitionEventInit.js +65 -0
  243. package/lib/generated/idl/TreeWalker.js +255 -0
  244. package/lib/generated/idl/UIEvent.js +235 -0
  245. package/lib/generated/idl/UIEventInit.js +62 -0
  246. package/lib/generated/idl/ValidityState.js +249 -0
  247. package/lib/generated/idl/VisibilityState.js +12 -0
  248. package/lib/generated/idl/VoidFunction.js +26 -0
  249. package/lib/generated/idl/WebSocket.js +480 -0
  250. package/lib/generated/idl/WheelEvent.js +191 -0
  251. package/lib/generated/idl/WheelEventInit.js +71 -0
  252. package/lib/generated/idl/XMLDocument.js +109 -0
  253. package/lib/generated/idl/XMLHttpRequest.js +663 -0
  254. package/lib/generated/idl/XMLHttpRequestEventTarget.js +334 -0
  255. package/lib/generated/idl/XMLHttpRequestResponseType.js +14 -0
  256. package/lib/generated/idl/XMLHttpRequestUpload.js +109 -0
  257. package/lib/generated/idl/XMLSerializer.js +132 -0
  258. package/lib/generated/idl/utils.js +252 -0
  259. package/lib/generated/js-globals.json +332 -0
  260. package/lib/jsdom/browser/Window.js +952 -0
  261. package/lib/jsdom/browser/default-stylesheet.css +415 -0
  262. package/lib/jsdom/browser/not-implemented.js +20 -0
  263. package/lib/jsdom/browser/parser/html.js +208 -0
  264. package/lib/jsdom/browser/parser/index.js +37 -0
  265. package/lib/jsdom/browser/parser/xml.js +202 -0
  266. package/lib/jsdom/browser/resources/async-resource-queue.js +114 -0
  267. package/lib/jsdom/browser/resources/decompress-interceptor.js +184 -0
  268. package/lib/jsdom/browser/resources/jsdom-dispatcher.js +756 -0
  269. package/lib/jsdom/browser/resources/per-document-resource-loader.js +116 -0
  270. package/lib/jsdom/browser/resources/request-interceptor.js +171 -0
  271. package/lib/jsdom/browser/resources/request-manager.js +33 -0
  272. package/lib/jsdom/browser/resources/resource-queue.js +142 -0
  273. package/lib/jsdom/browser/resources/stream-handler.js +89 -0
  274. package/lib/jsdom/level2/style.js +65 -0
  275. package/lib/jsdom/level3/xpath.js +1875 -0
  276. package/lib/jsdom/living/aborting/AbortController-impl.js +17 -0
  277. package/lib/jsdom/living/aborting/AbortSignal-impl.js +131 -0
  278. package/lib/jsdom/living/attributes/Attr-impl.js +60 -0
  279. package/lib/jsdom/living/attributes/NamedNodeMap-impl.js +78 -0
  280. package/lib/jsdom/living/attributes.js +312 -0
  281. package/lib/jsdom/living/constraint-validation/DefaultConstraintValidation-impl.js +75 -0
  282. package/lib/jsdom/living/constraint-validation/ValidityState-impl.js +66 -0
  283. package/lib/jsdom/living/crypto/Crypto-impl.js +68 -0
  284. package/lib/jsdom/living/cssom/StyleSheetList-impl.js +38 -0
  285. package/lib/jsdom/living/custom-elements/CustomElementRegistry-impl.js +279 -0
  286. package/lib/jsdom/living/custom-elements/ElementInternals-impl.js +56 -0
  287. package/lib/jsdom/living/deviceorientation/DeviceMotionEventAcceleration-impl.js +7 -0
  288. package/lib/jsdom/living/deviceorientation/DeviceMotionEventRotationRate-impl.js +7 -0
  289. package/lib/jsdom/living/documents.js +15 -0
  290. package/lib/jsdom/living/domparsing/DOMParser-impl.js +59 -0
  291. package/lib/jsdom/living/domparsing/InnerHTML-impl.js +30 -0
  292. package/lib/jsdom/living/domparsing/XMLSerializer-impl.js +18 -0
  293. package/lib/jsdom/living/domparsing/parse5-adapter-serialization.js +63 -0
  294. package/lib/jsdom/living/domparsing/serialization.js +36 -0
  295. package/lib/jsdom/living/encoding/TextDecoder-impl.js +25 -0
  296. package/lib/jsdom/living/encoding/TextEncoder-impl.js +26 -0
  297. package/lib/jsdom/living/events/BeforeUnloadEvent-impl.js +12 -0
  298. package/lib/jsdom/living/events/BlobEvent-impl.js +14 -0
  299. package/lib/jsdom/living/events/CloseEvent-impl.js +10 -0
  300. package/lib/jsdom/living/events/CompositionEvent-impl.js +20 -0
  301. package/lib/jsdom/living/events/CustomEvent-impl.js +21 -0
  302. package/lib/jsdom/living/events/DeviceMotionEvent-impl.js +49 -0
  303. package/lib/jsdom/living/events/DeviceOrientationEvent-impl.js +10 -0
  304. package/lib/jsdom/living/events/ErrorEvent-impl.js +14 -0
  305. package/lib/jsdom/living/events/Event-impl.js +195 -0
  306. package/lib/jsdom/living/events/EventModifierMixin-impl.js +24 -0
  307. package/lib/jsdom/living/events/EventTarget-impl.js +438 -0
  308. package/lib/jsdom/living/events/FocusEvent-impl.js +9 -0
  309. package/lib/jsdom/living/events/HashChangeEvent-impl.js +14 -0
  310. package/lib/jsdom/living/events/InputEvent-impl.js +11 -0
  311. package/lib/jsdom/living/events/KeyboardEvent-impl.js +29 -0
  312. package/lib/jsdom/living/events/MessageEvent-impl.js +25 -0
  313. package/lib/jsdom/living/events/MouseEvent-impl.js +72 -0
  314. package/lib/jsdom/living/events/PageTransitionEvent-impl.js +20 -0
  315. package/lib/jsdom/living/events/PointerEvent-impl.js +21 -0
  316. package/lib/jsdom/living/events/PopStateEvent-impl.js +9 -0
  317. package/lib/jsdom/living/events/ProgressEvent-impl.js +14 -0
  318. package/lib/jsdom/living/events/PromiseRejectionEvent-impl.js +14 -0
  319. package/lib/jsdom/living/events/StorageEvent-impl.js +26 -0
  320. package/lib/jsdom/living/events/SubmitEvent-impl.js +13 -0
  321. package/lib/jsdom/living/events/TouchEvent-impl.js +14 -0
  322. package/lib/jsdom/living/events/TransitionEvent-impl.js +10 -0
  323. package/lib/jsdom/living/events/UIEvent-impl.js +43 -0
  324. package/lib/jsdom/living/events/WheelEvent-impl.js +12 -0
  325. package/lib/jsdom/living/fetch/Headers-impl.js +173 -0
  326. package/lib/jsdom/living/fetch/header-list.js +158 -0
  327. package/lib/jsdom/living/fetch/header-types.js +205 -0
  328. package/lib/jsdom/living/fetch/header-utils.js +26 -0
  329. package/lib/jsdom/living/file-api/Blob-impl.js +125 -0
  330. package/lib/jsdom/living/file-api/File-impl.js +12 -0
  331. package/lib/jsdom/living/file-api/FileList-impl.js +15 -0
  332. package/lib/jsdom/living/file-api/FileReader-impl.js +148 -0
  333. package/lib/jsdom/living/geometry/DOMRect-impl.js +39 -0
  334. package/lib/jsdom/living/geometry/DOMRectReadOnly-impl.js +72 -0
  335. package/lib/jsdom/living/helpers/binary-data.js +63 -0
  336. package/lib/jsdom/living/helpers/by-id-cache.js +67 -0
  337. package/lib/jsdom/living/helpers/colors.js +245 -0
  338. package/lib/jsdom/living/helpers/create-element.js +329 -0
  339. package/lib/jsdom/living/helpers/create-event-accessor.js +209 -0
  340. package/lib/jsdom/living/helpers/custom-elements.js +272 -0
  341. package/lib/jsdom/living/helpers/dates-and-times.js +270 -0
  342. package/lib/jsdom/living/helpers/details.js +15 -0
  343. package/lib/jsdom/living/helpers/encoding.js +60 -0
  344. package/lib/jsdom/living/helpers/events.js +24 -0
  345. package/lib/jsdom/living/helpers/focusing.js +104 -0
  346. package/lib/jsdom/living/helpers/form-controls.js +309 -0
  347. package/lib/jsdom/living/helpers/html-constructor.js +78 -0
  348. package/lib/jsdom/living/helpers/internal-constants.js +12 -0
  349. package/lib/jsdom/living/helpers/is-window.js +18 -0
  350. package/lib/jsdom/living/helpers/iterable-weak-set.js +48 -0
  351. package/lib/jsdom/living/helpers/json.js +7 -0
  352. package/lib/jsdom/living/helpers/mutation-observers.js +198 -0
  353. package/lib/jsdom/living/helpers/namespaces.js +16 -0
  354. package/lib/jsdom/living/helpers/node.js +108 -0
  355. package/lib/jsdom/living/helpers/number-and-date-inputs.js +195 -0
  356. package/lib/jsdom/living/helpers/ordered-set.js +104 -0
  357. package/lib/jsdom/living/helpers/page-transition-event.js +9 -0
  358. package/lib/jsdom/living/helpers/runtime-script-errors.js +75 -0
  359. package/lib/jsdom/living/helpers/shadow-dom.js +285 -0
  360. package/lib/jsdom/living/helpers/strings.js +168 -0
  361. package/lib/jsdom/living/helpers/style-rules.js +404 -0
  362. package/lib/jsdom/living/helpers/stylesheets.js +148 -0
  363. package/lib/jsdom/living/helpers/svg/basic-types.js +41 -0
  364. package/lib/jsdom/living/helpers/svg/render.js +46 -0
  365. package/lib/jsdom/living/helpers/system-colors.js +147 -0
  366. package/lib/jsdom/living/helpers/text.js +19 -0
  367. package/lib/jsdom/living/helpers/traversal.js +72 -0
  368. package/lib/jsdom/living/helpers/validate-names.js +65 -0
  369. package/lib/jsdom/living/hr-time/Performance-impl.js +22 -0
  370. package/lib/jsdom/living/interfaces.js +252 -0
  371. package/lib/jsdom/living/mutation-observer/MutationObserver-impl.js +95 -0
  372. package/lib/jsdom/living/mutation-observer/MutationRecord-impl.js +37 -0
  373. package/lib/jsdom/living/navigator/MimeType-impl.js +3 -0
  374. package/lib/jsdom/living/navigator/MimeTypeArray-impl.js +21 -0
  375. package/lib/jsdom/living/navigator/Navigator-impl.js +29 -0
  376. package/lib/jsdom/living/navigator/NavigatorConcurrentHardware-impl.js +8 -0
  377. package/lib/jsdom/living/navigator/NavigatorCookies-impl.js +7 -0
  378. package/lib/jsdom/living/navigator/NavigatorID-impl.js +37 -0
  379. package/lib/jsdom/living/navigator/NavigatorLanguage-impl.js +9 -0
  380. package/lib/jsdom/living/navigator/NavigatorOnLine-impl.js +7 -0
  381. package/lib/jsdom/living/navigator/NavigatorPlugins-impl.js +8 -0
  382. package/lib/jsdom/living/navigator/Plugin-impl.js +3 -0
  383. package/lib/jsdom/living/navigator/PluginArray-impl.js +23 -0
  384. package/lib/jsdom/living/node-document-position.js +10 -0
  385. package/lib/jsdom/living/node-type.js +16 -0
  386. package/lib/jsdom/living/node.js +331 -0
  387. package/lib/jsdom/living/nodes/CDATASection-impl.js +16 -0
  388. package/lib/jsdom/living/nodes/CharacterData-impl.js +118 -0
  389. package/lib/jsdom/living/nodes/ChildNode-impl.js +80 -0
  390. package/lib/jsdom/living/nodes/Comment-impl.js +20 -0
  391. package/lib/jsdom/living/nodes/DOMImplementation-impl.js +120 -0
  392. package/lib/jsdom/living/nodes/DOMStringMap-impl.js +64 -0
  393. package/lib/jsdom/living/nodes/DOMTokenList-impl.js +171 -0
  394. package/lib/jsdom/living/nodes/Document-impl.js +1000 -0
  395. package/lib/jsdom/living/nodes/DocumentFragment-impl.js +44 -0
  396. package/lib/jsdom/living/nodes/DocumentOrShadowRoot-impl.js +28 -0
  397. package/lib/jsdom/living/nodes/DocumentType-impl.js +24 -0
  398. package/lib/jsdom/living/nodes/Element-impl.js +584 -0
  399. package/lib/jsdom/living/nodes/ElementCSSInlineStyle-impl.js +22 -0
  400. package/lib/jsdom/living/nodes/ElementContentEditable-impl.js +7 -0
  401. package/lib/jsdom/living/nodes/GlobalEventHandlers-impl.js +81 -0
  402. package/lib/jsdom/living/nodes/HTMLAnchorElement-impl.js +50 -0
  403. package/lib/jsdom/living/nodes/HTMLAreaElement-impl.js +43 -0
  404. package/lib/jsdom/living/nodes/HTMLAudioElement-impl.js +9 -0
  405. package/lib/jsdom/living/nodes/HTMLBRElement-impl.js +9 -0
  406. package/lib/jsdom/living/nodes/HTMLBaseElement-impl.js +44 -0
  407. package/lib/jsdom/living/nodes/HTMLBodyElement-impl.js +12 -0
  408. package/lib/jsdom/living/nodes/HTMLButtonElement-impl.js +79 -0
  409. package/lib/jsdom/living/nodes/HTMLCanvasElement-impl.js +136 -0
  410. package/lib/jsdom/living/nodes/HTMLCollection-impl.js +96 -0
  411. package/lib/jsdom/living/nodes/HTMLDListElement-impl.js +9 -0
  412. package/lib/jsdom/living/nodes/HTMLDataElement-impl.js +9 -0
  413. package/lib/jsdom/living/nodes/HTMLDataListElement-impl.js +20 -0
  414. package/lib/jsdom/living/nodes/HTMLDetailsElement-impl.js +35 -0
  415. package/lib/jsdom/living/nodes/HTMLDialogElement-impl.js +9 -0
  416. package/lib/jsdom/living/nodes/HTMLDirectoryElement-impl.js +9 -0
  417. package/lib/jsdom/living/nodes/HTMLDivElement-impl.js +9 -0
  418. package/lib/jsdom/living/nodes/HTMLElement-impl.js +211 -0
  419. package/lib/jsdom/living/nodes/HTMLEmbedElement-impl.js +8 -0
  420. package/lib/jsdom/living/nodes/HTMLFieldSetElement-impl.js +43 -0
  421. package/lib/jsdom/living/nodes/HTMLFontElement-impl.js +9 -0
  422. package/lib/jsdom/living/nodes/HTMLFormControlsCollection-impl.js +33 -0
  423. package/lib/jsdom/living/nodes/HTMLFormElement-impl.js +248 -0
  424. package/lib/jsdom/living/nodes/HTMLFrameElement-impl.js +266 -0
  425. package/lib/jsdom/living/nodes/HTMLFrameSetElement-impl.js +12 -0
  426. package/lib/jsdom/living/nodes/HTMLHRElement-impl.js +9 -0
  427. package/lib/jsdom/living/nodes/HTMLHeadElement-impl.js +9 -0
  428. package/lib/jsdom/living/nodes/HTMLHeadingElement-impl.js +9 -0
  429. package/lib/jsdom/living/nodes/HTMLHtmlElement-impl.js +9 -0
  430. package/lib/jsdom/living/nodes/HTMLHyperlinkElementUtils-impl.js +368 -0
  431. package/lib/jsdom/living/nodes/HTMLIFrameElement-impl.js +9 -0
  432. package/lib/jsdom/living/nodes/HTMLImageElement-impl.js +127 -0
  433. package/lib/jsdom/living/nodes/HTMLInputElement-impl.js +1097 -0
  434. package/lib/jsdom/living/nodes/HTMLLIElement-impl.js +9 -0
  435. package/lib/jsdom/living/nodes/HTMLLabelElement-impl.js +94 -0
  436. package/lib/jsdom/living/nodes/HTMLLegendElement-impl.js +18 -0
  437. package/lib/jsdom/living/nodes/HTMLLinkElement-impl.js +107 -0
  438. package/lib/jsdom/living/nodes/HTMLMapElement-impl.js +13 -0
  439. package/lib/jsdom/living/nodes/HTMLMarqueeElement-impl.js +9 -0
  440. package/lib/jsdom/living/nodes/HTMLMediaElement-impl.js +138 -0
  441. package/lib/jsdom/living/nodes/HTMLMenuElement-impl.js +9 -0
  442. package/lib/jsdom/living/nodes/HTMLMetaElement-impl.js +9 -0
  443. package/lib/jsdom/living/nodes/HTMLMeterElement-impl.js +180 -0
  444. package/lib/jsdom/living/nodes/HTMLModElement-impl.js +9 -0
  445. package/lib/jsdom/living/nodes/HTMLOListElement-impl.js +22 -0
  446. package/lib/jsdom/living/nodes/HTMLObjectElement-impl.js +26 -0
  447. package/lib/jsdom/living/nodes/HTMLOptGroupElement-impl.js +9 -0
  448. package/lib/jsdom/living/nodes/HTMLOptionElement-impl.js +146 -0
  449. package/lib/jsdom/living/nodes/HTMLOptionsCollection-impl.js +110 -0
  450. package/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js +88 -0
  451. package/lib/jsdom/living/nodes/HTMLOutputElement-impl.js +88 -0
  452. package/lib/jsdom/living/nodes/HTMLParagraphElement-impl.js +9 -0
  453. package/lib/jsdom/living/nodes/HTMLParamElement-impl.js +9 -0
  454. package/lib/jsdom/living/nodes/HTMLPictureElement-impl.js +9 -0
  455. package/lib/jsdom/living/nodes/HTMLPreElement-impl.js +9 -0
  456. package/lib/jsdom/living/nodes/HTMLProgressElement-impl.js +72 -0
  457. package/lib/jsdom/living/nodes/HTMLQuoteElement-impl.js +9 -0
  458. package/lib/jsdom/living/nodes/HTMLScriptElement-impl.js +255 -0
  459. package/lib/jsdom/living/nodes/HTMLSelectElement-impl.js +283 -0
  460. package/lib/jsdom/living/nodes/HTMLSlotElement-impl.js +59 -0
  461. package/lib/jsdom/living/nodes/HTMLSourceElement-impl.js +8 -0
  462. package/lib/jsdom/living/nodes/HTMLSpanElement-impl.js +9 -0
  463. package/lib/jsdom/living/nodes/HTMLStyleElement-impl.js +76 -0
  464. package/lib/jsdom/living/nodes/HTMLTableCaptionElement-impl.js +9 -0
  465. package/lib/jsdom/living/nodes/HTMLTableCellElement-impl.js +73 -0
  466. package/lib/jsdom/living/nodes/HTMLTableColElement-impl.js +9 -0
  467. package/lib/jsdom/living/nodes/HTMLTableElement-impl.js +236 -0
  468. package/lib/jsdom/living/nodes/HTMLTableRowElement-impl.js +88 -0
  469. package/lib/jsdom/living/nodes/HTMLTableSectionElement-impl.js +61 -0
  470. package/lib/jsdom/living/nodes/HTMLTemplateElement-impl.js +67 -0
  471. package/lib/jsdom/living/nodes/HTMLTextAreaElement-impl.js +244 -0
  472. package/lib/jsdom/living/nodes/HTMLTimeElement-impl.js +9 -0
  473. package/lib/jsdom/living/nodes/HTMLTitleElement-impl.js +18 -0
  474. package/lib/jsdom/living/nodes/HTMLTrackElement-impl.js +13 -0
  475. package/lib/jsdom/living/nodes/HTMLUListElement-impl.js +9 -0
  476. package/lib/jsdom/living/nodes/HTMLUnknownElement-impl.js +9 -0
  477. package/lib/jsdom/living/nodes/HTMLVideoElement-impl.js +17 -0
  478. package/lib/jsdom/living/nodes/LinkStyle-impl.js +2 -0
  479. package/lib/jsdom/living/nodes/Node-impl.js +1179 -0
  480. package/lib/jsdom/living/nodes/NodeList-impl.js +43 -0
  481. package/lib/jsdom/living/nodes/NonDocumentTypeChildNode-impl.js +28 -0
  482. package/lib/jsdom/living/nodes/NonElementParentNode-impl.js +11 -0
  483. package/lib/jsdom/living/nodes/ParentNode-impl.js +90 -0
  484. package/lib/jsdom/living/nodes/ProcessingInstruction-impl.js +22 -0
  485. package/lib/jsdom/living/nodes/RadioNodeList-impl.js +49 -0
  486. package/lib/jsdom/living/nodes/SVGDefsElement-impl.js +9 -0
  487. package/lib/jsdom/living/nodes/SVGDescElement-impl.js +9 -0
  488. package/lib/jsdom/living/nodes/SVGElement-impl.js +64 -0
  489. package/lib/jsdom/living/nodes/SVGGElement-impl.js +9 -0
  490. package/lib/jsdom/living/nodes/SVGGraphicsElement-impl.js +16 -0
  491. package/lib/jsdom/living/nodes/SVGMetadataElement-impl.js +9 -0
  492. package/lib/jsdom/living/nodes/SVGSVGElement-impl.js +40 -0
  493. package/lib/jsdom/living/nodes/SVGSwitchElement-impl.js +9 -0
  494. package/lib/jsdom/living/nodes/SVGSymbolElement-impl.js +9 -0
  495. package/lib/jsdom/living/nodes/SVGTests-impl.js +42 -0
  496. package/lib/jsdom/living/nodes/SVGTitleElement-impl.js +9 -0
  497. package/lib/jsdom/living/nodes/ShadowRoot-impl.js +41 -0
  498. package/lib/jsdom/living/nodes/Slotable-impl.js +48 -0
  499. package/lib/jsdom/living/nodes/Text-impl.js +96 -0
  500. package/lib/jsdom/living/nodes/WindowEventHandlers-impl.js +14 -0
  501. package/lib/jsdom/living/nodes/XMLDocument-impl.js +4 -0
  502. package/lib/jsdom/living/range/AbstractRange-impl.js +43 -0
  503. package/lib/jsdom/living/range/Range-impl.js +902 -0
  504. package/lib/jsdom/living/range/StaticRange-impl.js +39 -0
  505. package/lib/jsdom/living/range/boundary-point.js +47 -0
  506. package/lib/jsdom/living/selection/Selection-impl.js +358 -0
  507. package/lib/jsdom/living/svg/SVGAnimatedPreserveAspectRatio-impl.js +24 -0
  508. package/lib/jsdom/living/svg/SVGAnimatedRect-impl.js +122 -0
  509. package/lib/jsdom/living/svg/SVGAnimatedString-impl.js +42 -0
  510. package/lib/jsdom/living/svg/SVGListBase.js +195 -0
  511. package/lib/jsdom/living/svg/SVGNumber-impl.js +48 -0
  512. package/lib/jsdom/living/svg/SVGPreserveAspectRatio-impl.js +100 -0
  513. package/lib/jsdom/living/svg/SVGRect-impl.js +143 -0
  514. package/lib/jsdom/living/svg/SVGStringList-impl.js +16 -0
  515. package/lib/jsdom/living/traversal/NodeIterator-impl.js +107 -0
  516. package/lib/jsdom/living/traversal/TreeWalker-impl.js +217 -0
  517. package/lib/jsdom/living/traversal/helpers.js +44 -0
  518. package/lib/jsdom/living/webidl/DOMException-impl.js +46 -0
  519. package/lib/jsdom/living/websockets/WebSocket-impl.js +211 -0
  520. package/lib/jsdom/living/webstorage/Storage-impl.js +102 -0
  521. package/lib/jsdom/living/window/BarProp-impl.js +10 -0
  522. package/lib/jsdom/living/window/External-impl.js +9 -0
  523. package/lib/jsdom/living/window/History-impl.js +148 -0
  524. package/lib/jsdom/living/window/Location-impl.js +227 -0
  525. package/lib/jsdom/living/window/Screen-impl.js +13 -0
  526. package/lib/jsdom/living/window/SessionHistory.js +163 -0
  527. package/lib/jsdom/living/window/navigation.js +87 -0
  528. package/lib/jsdom/living/window-properties.js +241 -0
  529. package/lib/jsdom/living/xhr/FormData-impl.js +191 -0
  530. package/lib/jsdom/living/xhr/XMLHttpRequest-impl.js +1057 -0
  531. package/lib/jsdom/living/xhr/XMLHttpRequestEventTarget-impl.js +17 -0
  532. package/lib/jsdom/living/xhr/XMLHttpRequestUpload-impl.js +4 -0
  533. package/lib/jsdom/living/xhr/multipart-form-data.js +99 -0
  534. package/lib/jsdom/living/xhr/xhr-sync-worker.js +51 -0
  535. package/lib/jsdom/living/xhr/xhr-utils.js +206 -0
  536. package/lib/jsdom/utils.js +105 -0
  537. package/lib/jsdom/virtual-console.js +46 -0
  538. package/package.json +143 -0
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ const idlUtils = require("../../../generated/idl/utils");
3
+ const { fireAnEvent } = require("../../living/helpers/events");
4
+ const { fetchCollected } = require("./jsdom-dispatcher");
5
+
6
+ module.exports = class PerDocumentResourceLoader {
7
+ constructor(document) {
8
+ this._document = document;
9
+ this._defaultEncoding = document._encoding;
10
+ const defaultView = document._defaultView;
11
+ this._dispatcher = defaultView ? defaultView._dispatcher : null;
12
+ this._loadSubresources = defaultView ? defaultView._loadSubresources : false;
13
+ this._requestManager = document._requestManager;
14
+ this._queue = document._queue;
15
+ this._deferQueue = document._deferQueue;
16
+ this._asyncQueue = document._asyncQueue;
17
+ }
18
+
19
+ fetch(url, { element, onLoad, onError }) {
20
+ if (!this._loadSubresources) {
21
+ return null;
22
+ }
23
+
24
+ const abortController = new AbortController();
25
+
26
+ // Add it to the request manager. The request manager is very old code, but it works with the contract of "has an
27
+ // `abort()` method". One day this whole subsystem will be refactored to use `AbortController`s natively, but for
28
+ // now this just happens to work.
29
+ //
30
+ // Note that we add the controller now, before calling `fetchCollected()`, so that if any interceptors or other code
31
+ // calls `window.close()`, the abort controller is already registered and will see the abort.
32
+ this._requestManager.add(abortController);
33
+
34
+ const fetchPromise = fetchCollected(this._dispatcher, {
35
+ url,
36
+ headers: { Referer: this._document.URL },
37
+ signal: abortController.signal,
38
+ element: idlUtils.wrapperForImpl(element)
39
+ });
40
+
41
+ const onErrorWrapped = cause => {
42
+ this._requestManager.remove(abortController);
43
+
44
+ // If the request was aborted, don't fire error events
45
+ if (cause && cause.name === "AbortError") {
46
+ return Promise.resolve();
47
+ }
48
+
49
+ if (onError) {
50
+ onError(cause);
51
+ }
52
+
53
+ fireAnEvent("error", element);
54
+
55
+ const jsomError = new Error(`Could not load ${element.localName}: "${url}"`, { cause });
56
+ jsomError.type = "resource-loading";
57
+ jsomError.url = url;
58
+
59
+ this._document._defaultView._virtualConsole.emit("jsdomError", jsomError);
60
+
61
+ return Promise.resolve();
62
+ };
63
+
64
+ const onLoadWrapped = response => {
65
+ this._requestManager.remove(abortController);
66
+
67
+ // Extract data and create a response-like object for compatibility
68
+ const { body: data, status, headers, url: responseURL } = response;
69
+ const responseObj = {
70
+ ok: status >= 200 && status < 300,
71
+ status,
72
+ headers: {
73
+ get(name) {
74
+ return headers[name.toLowerCase()] ?? null;
75
+ }
76
+ },
77
+ url: responseURL
78
+ };
79
+
80
+ try {
81
+ const result = onLoad ? onLoad(data, responseObj) : undefined;
82
+
83
+ return Promise.resolve(result)
84
+ .then(() => {
85
+ fireAnEvent("load", element);
86
+
87
+ return Promise.resolve();
88
+ })
89
+ .catch(err => {
90
+ return onErrorWrapped(err);
91
+ });
92
+ } catch (err) {
93
+ return onErrorWrapped(err);
94
+ }
95
+ };
96
+
97
+ // Create a wrapper object that can be used by the queue system
98
+ const request = {
99
+ then: (onFulfilled, onRejected) => fetchPromise.then(onFulfilled, onRejected),
100
+ catch: onRejected => fetchPromise.catch(onRejected)
101
+ };
102
+
103
+ if (element.localName === "script" && element.hasAttributeNS(null, "async")) {
104
+ this._asyncQueue.push(request, onLoadWrapped, onErrorWrapped, this._queue.getLastScript());
105
+ } else if (
106
+ element.localName === "script" &&
107
+ element.hasAttributeNS(null, "defer") &&
108
+ this._document.readyState !== "interactive") {
109
+ this._deferQueue.push(request, onLoadWrapped, onErrorWrapped, false, element);
110
+ } else {
111
+ this._queue.push(request, onLoadWrapped, onErrorWrapped, false, element);
112
+ }
113
+
114
+ return request;
115
+ }
116
+ };
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ const { Readable } = require("stream");
3
+ const { sendStreamResponse } = require("./stream-handler");
4
+
5
+ /**
6
+ * Creates a user-friendly `undici` interceptor for jsdom.
7
+ *
8
+ * This helper allows users to intercept requests using a callback that receives a `Request` object and can return a
9
+ * promise for a `Response` to provide a synthetic response, or a promise for `undefined` to pass through.
10
+ *
11
+ * @param {function} fn - Async callback function that receives (request, context) and can return a Response
12
+ * @returns {function} An undici interceptor
13
+ *
14
+ * @example
15
+ * const dom = new JSDOM(html, {
16
+ * interceptors: [
17
+ * requestInterceptor(async (request, { element }) => {
18
+ * console.log(`${element?.localName || 'XHR'} requested ${request.url}`);
19
+ * if (request.url.endsWith('/test.js')) {
20
+ * return new Response('window.mocked = true;', {
21
+ * headers: { 'Content-Type': 'application/javascript' }
22
+ * });
23
+ * }
24
+ * // Return undefined to let the request pass through
25
+ * })
26
+ * ]
27
+ * });
28
+ *
29
+ * ## Why this doesn't use undici's DecoratorHandler pattern
30
+ *
31
+ * The standard undici interceptor pattern (see e.g. undici/lib/interceptor/dump.js) uses DecoratorHandler
32
+ * to wrap handler callbacks. That pattern calls `dispatch()` synchronously, then observes/modifies the
33
+ * request and response as they flow through the handler callbacks.
34
+ *
35
+ * This interceptor needs to support async user functions that can BLOCK the request and potentially
36
+ * REPLACE it with a synthetic response. This requires:
37
+ *
38
+ * 1. Waiting for the async user function BEFORE deciding whether to dispatch
39
+ * 2. For synthetic responses, NEVER calling dispatch() at all
40
+ *
41
+ * Since synthetic responses bypass the normal undici dispatch flow entirely, there's no underlying
42
+ * dispatcher (Agent/Pool) to create a real controller for us. We provide our own controller object
43
+ * that delegates to a Node.js Readable stream for pause/resume/abort support, following the pattern
44
+ * from undici/lib/interceptor/cache.js.
45
+ */
46
+ module.exports = function requestInterceptor(fn) {
47
+ return dispatch => (options, handler) => {
48
+ const { element = null, url } = options.opaque || {};
49
+ const abortController = new AbortController();
50
+
51
+ // Create undici controller and wrapped handler using the signal handler helper.
52
+ // The undici controller reflects abortController.signal's state and forwards to inner undici controller.
53
+ const { undiciController, wrappedHandler } = createSignalHandler(handler, abortController);
54
+
55
+ // Call onRequestStart immediately to wire into the abort chain.
56
+ handler.onRequestStart?.(undiciController, {});
57
+
58
+ // Build Request object with our signal
59
+ const requestInit = {
60
+ method: options.method || "GET",
61
+ headers: options.headers,
62
+ signal: abortController.signal
63
+ };
64
+ if (options.body !== undefined && options.body !== null) {
65
+ requestInit.body = options.body;
66
+ requestInit.duplex = "half";
67
+ }
68
+ if (options.referrer) {
69
+ requestInit.referrer = options.referrer;
70
+ }
71
+ const request = new Request(url, requestInit);
72
+
73
+ new Promise(resolve => {
74
+ resolve(fn(request, { element }));
75
+ })
76
+ .then(response => {
77
+ if (response instanceof Response) {
78
+ // Send synthetic response without ever starting real request
79
+ // response.body can be null for responses with no body
80
+ const stream = response.body ? Readable.fromWeb(response.body) : Readable.from([]);
81
+ sendStreamResponse(wrappedHandler, stream, {
82
+ status: response.status,
83
+ statusText: response.statusText,
84
+ headers: headersToUndici(response.headers)
85
+ });
86
+ } else if (response !== undefined) {
87
+ throw new TypeError("requestInterceptor callback must return undefined or a Response");
88
+ } else if (!abortController.signal.aborted) {
89
+ // Pass through to real request
90
+ dispatch(options, wrappedHandler);
91
+ }
92
+ })
93
+ .catch(error => {
94
+ handler.onResponseError?.(undiciController, error);
95
+ });
96
+
97
+ // Return true to indicate request is being handled
98
+ return true;
99
+ };
100
+ };
101
+
102
+ /**
103
+ * Creates an undici controller and wrapped handler that bridge an AbortController to undici's dispatch protocol.
104
+ *
105
+ * The undici controller reflects the AbortController's signal state and captures an inner undici controller
106
+ * (from pass-through dispatch or synthetic stream) for forwarding pause/resume/abort.
107
+ */
108
+ function createSignalHandler(handler, abortController) {
109
+ let innerUndiciController = null;
110
+
111
+ const undiciController = {
112
+ abort(reason) {
113
+ abortController.abort(reason);
114
+ innerUndiciController?.abort(reason);
115
+ },
116
+ pause() {
117
+ innerUndiciController?.pause();
118
+ },
119
+ resume() {
120
+ innerUndiciController?.resume();
121
+ },
122
+ get paused() {
123
+ return innerUndiciController?.paused ?? false;
124
+ },
125
+ get aborted() {
126
+ return abortController.signal.aborted;
127
+ },
128
+ get reason() {
129
+ return abortController.signal.reason;
130
+ }
131
+ };
132
+
133
+ const wrappedHandler = {
134
+ onRequestStart(controller) {
135
+ innerUndiciController = controller;
136
+ },
137
+ onRequestUpgrade(...args) {
138
+ handler.onRequestUpgrade?.(...args);
139
+ },
140
+ onResponseStart(...args) {
141
+ handler.onResponseStart?.(...args);
142
+ },
143
+ onResponseData(...args) {
144
+ handler.onResponseData?.(...args);
145
+ },
146
+ onResponseEnd(...args) {
147
+ handler.onResponseEnd?.(...args);
148
+ },
149
+ onResponseError(...args) {
150
+ handler.onResponseError?.(...args);
151
+ }
152
+ };
153
+
154
+ return { undiciController, wrappedHandler };
155
+ }
156
+
157
+ /**
158
+ * Converts a Headers object to the format undici expects.
159
+ * Handles multiple Set-Cookie headers via getSetCookie().
160
+ */
161
+ function headersToUndici(headers) {
162
+ const result = {};
163
+ for (const [key, value] of headers) {
164
+ result[key] = value;
165
+ }
166
+ const cookies = headers.getSetCookie();
167
+ if (cookies.length > 0) {
168
+ result["set-cookie"] = cookies;
169
+ }
170
+ return result;
171
+ }
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Manage all the request and it is able to abort
5
+ * all pending request.
6
+ */
7
+ module.exports = class RequestManager {
8
+ constructor() {
9
+ this.openedRequests = [];
10
+ }
11
+
12
+ add(req) {
13
+ this.openedRequests.push(req);
14
+ }
15
+
16
+ remove(req) {
17
+ const idx = this.openedRequests.indexOf(req);
18
+ if (idx !== -1) {
19
+ this.openedRequests.splice(idx, 1);
20
+ }
21
+ }
22
+
23
+ close() {
24
+ for (const openedRequest of this.openedRequests) {
25
+ openedRequest.abort();
26
+ }
27
+ this.openedRequests = [];
28
+ }
29
+
30
+ size() {
31
+ return this.openedRequests.length;
32
+ }
33
+ };
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Queue for all the resources to be download except async scripts.
5
+ * Async scripts have their own queue AsyncResourceQueue.
6
+ */
7
+ module.exports = class ResourceQueue {
8
+ constructor({ paused, asyncQueue } = {}) {
9
+ this.paused = Boolean(paused);
10
+ this._asyncQueue = asyncQueue;
11
+ }
12
+
13
+ getLastScript() {
14
+ let head = this.tail;
15
+
16
+ while (head) {
17
+ if (head.isScript) {
18
+ return head;
19
+ }
20
+ head = head.prev;
21
+ }
22
+
23
+ return null;
24
+ }
25
+
26
+ _moreScripts() {
27
+ let found = false;
28
+
29
+ let head = this.tail;
30
+ while (head && !found) {
31
+ found = head.isScript;
32
+ head = head.prev;
33
+ }
34
+
35
+ return found;
36
+ }
37
+
38
+ _notify() {
39
+ if (this._listener) {
40
+ this._listener();
41
+ }
42
+ }
43
+
44
+ setListener(listener) {
45
+ this._listener = listener;
46
+ }
47
+
48
+ push(request, onLoad, onError, keepLast, element) {
49
+ const isScript = element ? element.localName === "script" : false;
50
+
51
+ if (!request) {
52
+ if (isScript && !this._moreScripts()) {
53
+ return onLoad();
54
+ }
55
+
56
+ request = Promise.resolve();
57
+ }
58
+ const q = this;
59
+ const item = {
60
+ isScript,
61
+ err: null,
62
+ element,
63
+ fired: false,
64
+ data: null,
65
+ keepLast,
66
+ prev: q.tail,
67
+ check() {
68
+ if (!q.paused && !this.prev && this.fired) {
69
+ let promise;
70
+
71
+ if (this.err && onError) {
72
+ promise = onError(this.err);
73
+ }
74
+
75
+ if (!this.err && onLoad) {
76
+ promise = onLoad(this.data);
77
+ }
78
+
79
+ Promise.resolve(promise)
80
+ .then(() => {
81
+ if (this.next) {
82
+ this.next.prev = null;
83
+ this.next.check();
84
+ } else { // q.tail===this
85
+ q.tail = null;
86
+ q._notify();
87
+ }
88
+
89
+ this.finished = true;
90
+
91
+ if (q._asyncQueue) {
92
+ q._asyncQueue.notifyItem(this);
93
+ }
94
+ });
95
+ }
96
+ }
97
+ };
98
+ if (q.tail) {
99
+ if (q.tail.keepLast) {
100
+ // if the tail is the load event in document and we receive a new element to load
101
+ // we should add this new request before the load event.
102
+ if (q.tail.prev) {
103
+ q.tail.prev.next = item;
104
+ }
105
+ item.prev = q.tail.prev;
106
+ q.tail.prev = item;
107
+ item.next = q.tail;
108
+ } else {
109
+ q.tail.next = item;
110
+ q.tail = item;
111
+ }
112
+ } else {
113
+ q.tail = item;
114
+ }
115
+ return request
116
+ .then(data => {
117
+ item.fired = 1;
118
+ item.data = data;
119
+ item.check();
120
+ })
121
+ .catch(err => {
122
+ item.fired = true;
123
+ item.err = err;
124
+ item.check();
125
+ });
126
+ }
127
+
128
+ resume() {
129
+ if (!this.paused) {
130
+ return;
131
+ }
132
+ this.paused = false;
133
+
134
+ let head = this.tail;
135
+ while (head && head.prev) {
136
+ head = head.prev;
137
+ }
138
+ if (head) {
139
+ head.check();
140
+ }
141
+ }
142
+ };
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Sends a response to an undici handler by streaming data from a Node.js Readable stream.
5
+ *
6
+ * ## Why this exists
7
+ *
8
+ * undici's new handler API (onRequestStart, onResponseStart, onResponseData, onResponseEnd, onResponseError)
9
+ * requires a "controller" object with pause/resume/abort methods. When responses flow through undici's
10
+ * normal network stack, undici provides this controller. But when we generate responses ourselves
11
+ * (e.g., for file: URLs, data: URLs, or synthetic responses from interceptors), we need to provide
12
+ * our own controller.
13
+ *
14
+ * This helper creates a controller backed by a Node.js Readable stream, giving callers proper
15
+ * pause/resume and abort support. It follows the pattern from undici/lib/interceptor/cache.js.
16
+ *
17
+ * ## Usage
18
+ *
19
+ * ```javascript
20
+ * const stream = fs.createReadStream(filePath);
21
+ * // or: const stream = Readable.from(buffer);
22
+ * // or: const stream = Readable.fromWeb(response.body);
23
+ *
24
+ * sendStreamResponse(handler, stream, {
25
+ * status: 200,
26
+ * statusText: "OK",
27
+ * headers: { "content-type": "text/plain" },
28
+ * context: { history: ["file:///path/to/file"] }
29
+ * });
30
+ * ```
31
+ *
32
+ * The function handles all stream events and translates them to handler callbacks.
33
+ * If the stream is destroyed (e.g., via controller.abort()), pending operations are cancelled.
34
+ *
35
+ * @param {object} handler - undici handler with new API methods (onRequestStart, onResponseStart, etc.)
36
+ * @param {Readable} stream - Node.js Readable stream containing the response body
37
+ * @param {object} options - Response metadata
38
+ * @param {number} options.status - HTTP status code
39
+ * @param {string} [options.statusText] - HTTP status text (default: "")
40
+ * @param {object} [options.headers] - Response headers as {name: value} object (default: {})
41
+ * @param {object} [options.context] - Context object passed to onRequestStart (default: {})
42
+ */
43
+ function sendStreamResponse(handler, stream, { status, statusText = "", headers = {}, context = {} }) {
44
+ const controller = {
45
+ resume() {
46
+ stream.resume();
47
+ },
48
+ pause() {
49
+ stream.pause();
50
+ },
51
+ get paused() {
52
+ return stream.isPaused();
53
+ },
54
+ get aborted() {
55
+ return stream.errored !== null;
56
+ },
57
+ get reason() {
58
+ return stream.errored;
59
+ },
60
+ abort(reason) {
61
+ stream.destroy(reason);
62
+ }
63
+ };
64
+
65
+ stream
66
+ .on("error", err => {
67
+ if (!stream.readableEnded) {
68
+ handler.onResponseError?.(controller, err);
69
+ }
70
+ })
71
+ .on("close", () => {
72
+ if (!stream.errored) {
73
+ handler.onResponseEnd?.(controller, {});
74
+ }
75
+ })
76
+ .on("data", chunk => {
77
+ handler.onResponseData?.(controller, chunk);
78
+ });
79
+
80
+ handler.onRequestStart?.(controller, context);
81
+
82
+ if (stream.destroyed) {
83
+ return;
84
+ }
85
+
86
+ handler.onResponseStart?.(controller, status, headers, statusText);
87
+ }
88
+
89
+ module.exports = { sendStreamResponse };
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ const cssstyle = require("cssstyle");
3
+
4
+ exports.addToCore = core => {
5
+ // What works now:
6
+ // - Accessing the rules defined in individual stylesheets
7
+ // - Modifications to style content attribute are reflected in style property
8
+ // - Modifications to style property are reflected in style content attribute
9
+ // TODO
10
+ // - Modifications to style element's textContent are reflected in sheet property.
11
+ // - Modifications to style element's sheet property are reflected in textContent.
12
+ // - Modifications to link.href property are reflected in sheet property.
13
+ // - Less-used features of link: disabled
14
+ // - Less-used features of style: disabled, scoped, title
15
+ // - CSSOM-View
16
+ // - getComputedStyle(): requires default stylesheet, cascading, inheritance,
17
+ // filtering by @media (screen? print?), layout for widths/heights
18
+ // - Load events are not in the specs, but apparently some browsers
19
+ // implement something. Should onload only fire after all @imports have been
20
+ // loaded, or only the primary sheet?
21
+ const cssom = require("@acemir/cssom").setup({ globalObject: core._globalObject });
22
+
23
+ core.StyleSheet = cssom.StyleSheet;
24
+ core.MediaList = cssom.MediaList;
25
+ core.CSSStyleSheet = cssom.CSSStyleSheet;
26
+ core.CSSRule = cssom.CSSRule;
27
+ core.CSSGroupingRule = cssom.CSSGroupingRule;
28
+ core.CSSNestedDeclarations = cssom.CSSNestedDeclarations;
29
+ core.CSSStyleRule = cssom.CSSStyleRule;
30
+ core.CSSMediaRule = cssom.CSSMediaRule;
31
+ core.CSSImportRule = cssom.CSSImportRule;
32
+ core.CSSConditionRule = cssom.CSSConditionRule;
33
+ core.CSSContainerRule = cssom.CSSContainerRule;
34
+ core.CSSScopeRule = cssom.CSSScopeRule;
35
+ core.CSSSupportsRule = cssom.CSSSupportsRule;
36
+ core.CSSLayerBlockRule = cssom.CSSLayerBlockRule;
37
+ core.CSSLayerStatementRule = cssom.CSSLayerStatementRule;
38
+ core.CSSStyleDeclaration = cssstyle.CSSStyleDeclaration;
39
+
40
+ // Relevant specs
41
+ // http://www.w3.org/TR/DOM-Level-2-Style (2000)
42
+ // http://www.w3.org/TR/cssom-view/ (2008)
43
+ // http://dev.w3.org/csswg/cssom/ (2010) Meant to replace DOM Level 2 Style
44
+ // http://www.whatwg.org/specs/web-apps/current-work/multipage/ HTML5, of course
45
+ // http://dev.w3.org/csswg/css-style-attr/ not sure what's new here
46
+
47
+ // Objects that aren't in cssom library but should be:
48
+ // CSSRuleList (cssom just uses array)
49
+ // CSSFontFaceRule
50
+ // CSSPageRule
51
+
52
+ // These rules don't really make sense to implement, so CSSOM draft makes them
53
+ // obsolete.
54
+ // CSSCharsetRule
55
+ // CSSUnknownRule
56
+
57
+ // These objects are considered obsolete by CSSOM draft, although modern
58
+ // browsers implement them.
59
+ // CSSValue
60
+ // CSSPrimitiveValue
61
+ // CSSValueList
62
+ // RGBColor
63
+ // Rect
64
+ // Counter
65
+ };