@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.
- package/LICENSE.txt +22 -0
- package/README.md +38 -0
- package/changes.json +38 -0
- package/lib/api.js +373 -0
- package/lib/generated/event-sets.js +115 -0
- package/lib/generated/idl/AbortController.js +143 -0
- package/lib/generated/idl/AbortSignal.js +249 -0
- package/lib/generated/idl/AbstractRange.js +171 -0
- package/lib/generated/idl/AddEventListenerOptions.js +53 -0
- package/lib/generated/idl/AssignedNodesOptions.js +28 -0
- package/lib/generated/idl/Attr.js +219 -0
- package/lib/generated/idl/BarProp.js +117 -0
- package/lib/generated/idl/BeforeUnloadEvent.js +139 -0
- package/lib/generated/idl/BinaryType.js +12 -0
- package/lib/generated/idl/Blob.js +253 -0
- package/lib/generated/idl/BlobCallback.js +30 -0
- package/lib/generated/idl/BlobEvent.js +157 -0
- package/lib/generated/idl/BlobEventInit.js +43 -0
- package/lib/generated/idl/BlobPropertyBag.js +42 -0
- package/lib/generated/idl/CDATASection.js +109 -0
- package/lib/generated/idl/CanPlayTypeResult.js +12 -0
- package/lib/generated/idl/CharacterData.js +455 -0
- package/lib/generated/idl/CloseEvent.js +168 -0
- package/lib/generated/idl/CloseEventInit.js +65 -0
- package/lib/generated/idl/Comment.js +120 -0
- package/lib/generated/idl/CompositionEvent.js +219 -0
- package/lib/generated/idl/CompositionEventInit.js +32 -0
- package/lib/generated/idl/Crypto.js +148 -0
- package/lib/generated/idl/CustomElementConstructor.js +34 -0
- package/lib/generated/idl/CustomElementRegistry.js +269 -0
- package/lib/generated/idl/CustomEvent.js +206 -0
- package/lib/generated/idl/CustomEventInit.js +32 -0
- package/lib/generated/idl/DOMException.js +222 -0
- package/lib/generated/idl/DOMImplementation.js +237 -0
- package/lib/generated/idl/DOMParser.js +140 -0
- package/lib/generated/idl/DOMRect.js +276 -0
- package/lib/generated/idl/DOMRectInit.js +76 -0
- package/lib/generated/idl/DOMRectReadOnly.js +285 -0
- package/lib/generated/idl/DOMStringMap.js +299 -0
- package/lib/generated/idl/DOMTokenList.js +539 -0
- package/lib/generated/idl/DeviceMotionEvent.js +183 -0
- package/lib/generated/idl/DeviceMotionEventAcceleration.js +145 -0
- package/lib/generated/idl/DeviceMotionEventAccelerationInit.js +61 -0
- package/lib/generated/idl/DeviceMotionEventInit.js +70 -0
- package/lib/generated/idl/DeviceMotionEventRotationRate.js +145 -0
- package/lib/generated/idl/DeviceMotionEventRotationRateInit.js +61 -0
- package/lib/generated/idl/DeviceOrientationEvent.js +183 -0
- package/lib/generated/idl/DeviceOrientationEventInit.js +80 -0
- package/lib/generated/idl/Document.js +4511 -0
- package/lib/generated/idl/DocumentFragment.js +336 -0
- package/lib/generated/idl/DocumentReadyState.js +12 -0
- package/lib/generated/idl/DocumentType.js +254 -0
- package/lib/generated/idl/Element.js +3720 -0
- package/lib/generated/idl/ElementCreationOptions.js +26 -0
- package/lib/generated/idl/ElementDefinitionOptions.js +29 -0
- package/lib/generated/idl/ElementInternals.js +2152 -0
- package/lib/generated/idl/EndingType.js +12 -0
- package/lib/generated/idl/ErrorEvent.js +192 -0
- package/lib/generated/idl/ErrorEventInit.js +92 -0
- package/lib/generated/idl/Event.js +430 -0
- package/lib/generated/idl/EventHandlerNonNull.js +36 -0
- package/lib/generated/idl/EventInit.js +58 -0
- package/lib/generated/idl/EventListener.js +35 -0
- package/lib/generated/idl/EventListenerOptions.js +28 -0
- package/lib/generated/idl/EventModifierInit.js +221 -0
- package/lib/generated/idl/EventTarget.js +259 -0
- package/lib/generated/idl/External.js +130 -0
- package/lib/generated/idl/File.js +185 -0
- package/lib/generated/idl/FileList.js +298 -0
- package/lib/generated/idl/FilePropertyBag.js +33 -0
- package/lib/generated/idl/FileReader.js +468 -0
- package/lib/generated/idl/FocusEvent.js +144 -0
- package/lib/generated/idl/FocusEventInit.js +36 -0
- package/lib/generated/idl/FormData.js +468 -0
- package/lib/generated/idl/Function.js +42 -0
- package/lib/generated/idl/GetRootNodeOptions.js +31 -0
- package/lib/generated/idl/HTMLAnchorElement.js +1026 -0
- package/lib/generated/idl/HTMLAreaElement.js +825 -0
- package/lib/generated/idl/HTMLAudioElement.js +111 -0
- package/lib/generated/idl/HTMLBRElement.js +156 -0
- package/lib/generated/idl/HTMLBaseElement.js +196 -0
- package/lib/generated/idl/HTMLBodyElement.js +880 -0
- package/lib/generated/idl/HTMLButtonElement.js +525 -0
- package/lib/generated/idl/HTMLCanvasElement.js +307 -0
- package/lib/generated/idl/HTMLCollection.js +352 -0
- package/lib/generated/idl/HTMLDListElement.js +159 -0
- package/lib/generated/idl/HTMLDataElement.js +156 -0
- package/lib/generated/idl/HTMLDataListElement.js +126 -0
- package/lib/generated/idl/HTMLDetailsElement.js +159 -0
- package/lib/generated/idl/HTMLDialogElement.js +159 -0
- package/lib/generated/idl/HTMLDirectoryElement.js +159 -0
- package/lib/generated/idl/HTMLDivElement.js +156 -0
- package/lib/generated/idl/HTMLElement.js +3492 -0
- package/lib/generated/idl/HTMLEmbedElement.js +381 -0
- package/lib/generated/idl/HTMLFieldSetElement.js +332 -0
- package/lib/generated/idl/HTMLFontElement.js +239 -0
- package/lib/generated/idl/HTMLFormControlsCollection.js +318 -0
- package/lib/generated/idl/HTMLFormElement.js +661 -0
- package/lib/generated/idl/HTMLFrameElement.js +513 -0
- package/lib/generated/idl/HTMLFrameSetElement.js +711 -0
- package/lib/generated/idl/HTMLHRElement.js +323 -0
- package/lib/generated/idl/HTMLHeadElement.js +111 -0
- package/lib/generated/idl/HTMLHeadingElement.js +156 -0
- package/lib/generated/idl/HTMLHtmlElement.js +156 -0
- package/lib/generated/idl/HTMLIFrameElement.js +689 -0
- package/lib/generated/idl/HTMLImageElement.js +906 -0
- package/lib/generated/idl/HTMLInputElement.js +1931 -0
- package/lib/generated/idl/HTMLLIElement.js +204 -0
- package/lib/generated/idl/HTMLLabelElement.js +182 -0
- package/lib/generated/idl/HTMLLegendElement.js +169 -0
- package/lib/generated/idl/HTMLLinkElement.js +555 -0
- package/lib/generated/idl/HTMLMapElement.js +171 -0
- package/lib/generated/idl/HTMLMarqueeElement.js +558 -0
- package/lib/generated/idl/HTMLMediaElement.js +900 -0
- package/lib/generated/idl/HTMLMenuElement.js +159 -0
- package/lib/generated/idl/HTMLMetaElement.js +279 -0
- package/lib/generated/idl/HTMLMeterElement.js +368 -0
- package/lib/generated/idl/HTMLModElement.js +217 -0
- package/lib/generated/idl/HTMLOListElement.js +284 -0
- package/lib/generated/idl/HTMLObjectElement.js +945 -0
- package/lib/generated/idl/HTMLOptGroupElement.js +200 -0
- package/lib/generated/idl/HTMLOptionElement.js +379 -0
- package/lib/generated/idl/HTMLOptionsCollection.js +513 -0
- package/lib/generated/idl/HTMLOutputElement.js +395 -0
- package/lib/generated/idl/HTMLParagraphElement.js +156 -0
- package/lib/generated/idl/HTMLParamElement.js +279 -0
- package/lib/generated/idl/HTMLPictureElement.js +111 -0
- package/lib/generated/idl/HTMLPreElement.js +163 -0
- package/lib/generated/idl/HTMLProgressElement.js +232 -0
- package/lib/generated/idl/HTMLQuoteElement.js +176 -0
- package/lib/generated/idl/HTMLScriptElement.js +472 -0
- package/lib/generated/idl/HTMLSelectElement.js +993 -0
- package/lib/generated/idl/HTMLSlotElement.js +195 -0
- package/lib/generated/idl/HTMLSourceElement.js +340 -0
- package/lib/generated/idl/HTMLSpanElement.js +111 -0
- package/lib/generated/idl/HTMLStyleElement.js +210 -0
- package/lib/generated/idl/HTMLTableCaptionElement.js +156 -0
- package/lib/generated/idl/HTMLTableCellElement.js +733 -0
- package/lib/generated/idl/HTMLTableColElement.js +376 -0
- package/lib/generated/idl/HTMLTableElement.js +802 -0
- package/lib/generated/idl/HTMLTableRowElement.js +417 -0
- package/lib/generated/idl/HTMLTableSectionElement.js +349 -0
- package/lib/generated/idl/HTMLTemplateElement.js +124 -0
- package/lib/generated/idl/HTMLTextAreaElement.js +1210 -0
- package/lib/generated/idl/HTMLTimeElement.js +156 -0
- package/lib/generated/idl/HTMLTitleElement.js +155 -0
- package/lib/generated/idl/HTMLTrackElement.js +366 -0
- package/lib/generated/idl/HTMLUListElement.js +200 -0
- package/lib/generated/idl/HTMLUnknownElement.js +109 -0
- package/lib/generated/idl/HTMLVideoElement.js +344 -0
- package/lib/generated/idl/HashChangeEvent.js +157 -0
- package/lib/generated/idl/HashChangeEventInit.js +50 -0
- package/lib/generated/idl/Headers.js +418 -0
- package/lib/generated/idl/History.js +266 -0
- package/lib/generated/idl/InputEvent.js +168 -0
- package/lib/generated/idl/InputEventInit.js +68 -0
- package/lib/generated/idl/KeyboardEvent.js +445 -0
- package/lib/generated/idl/KeyboardEventInit.js +116 -0
- package/lib/generated/idl/Location.js +404 -0
- package/lib/generated/idl/MessageEvent.js +317 -0
- package/lib/generated/idl/MessageEventInit.js +100 -0
- package/lib/generated/idl/MimeType.js +156 -0
- package/lib/generated/idl/MimeTypeArray.js +326 -0
- package/lib/generated/idl/MouseEvent.js +595 -0
- package/lib/generated/idl/MouseEventInit.js +189 -0
- package/lib/generated/idl/MutationCallback.js +34 -0
- package/lib/generated/idl/MutationObserver.js +178 -0
- package/lib/generated/idl/MutationObserverInit.js +121 -0
- package/lib/generated/idl/MutationRecord.js +229 -0
- package/lib/generated/idl/NamedNodeMap.js +529 -0
- package/lib/generated/idl/Navigator.js +326 -0
- package/lib/generated/idl/Node.js +765 -0
- package/lib/generated/idl/NodeFilter.js +75 -0
- package/lib/generated/idl/NodeIterator.js +207 -0
- package/lib/generated/idl/NodeList.js +302 -0
- package/lib/generated/idl/OnBeforeUnloadEventHandlerNonNull.js +42 -0
- package/lib/generated/idl/OnErrorEventHandlerNonNull.js +56 -0
- package/lib/generated/idl/PageTransitionEvent.js +144 -0
- package/lib/generated/idl/PageTransitionEventInit.js +35 -0
- package/lib/generated/idl/Performance.js +142 -0
- package/lib/generated/idl/Plugin.js +359 -0
- package/lib/generated/idl/PluginArray.js +336 -0
- package/lib/generated/idl/PointerEvent.js +324 -0
- package/lib/generated/idl/PointerEventInit.js +241 -0
- package/lib/generated/idl/PopStateEvent.js +144 -0
- package/lib/generated/idl/PopStateEventInit.js +32 -0
- package/lib/generated/idl/ProcessingInstruction.js +122 -0
- package/lib/generated/idl/ProgressEvent.js +170 -0
- package/lib/generated/idl/ProgressEventInit.js +65 -0
- package/lib/generated/idl/PromiseRejectionEvent.js +157 -0
- package/lib/generated/idl/PromiseRejectionEventInit.js +42 -0
- package/lib/generated/idl/RadioNodeList.js +296 -0
- package/lib/generated/idl/Range.js +643 -0
- package/lib/generated/idl/SVGAnimatedPreserveAspectRatio.js +136 -0
- package/lib/generated/idl/SVGAnimatedRect.js +136 -0
- package/lib/generated/idl/SVGAnimatedString.js +149 -0
- package/lib/generated/idl/SVGBoundingBoxOptions.js +64 -0
- package/lib/generated/idl/SVGDefsElement.js +109 -0
- package/lib/generated/idl/SVGDescElement.js +109 -0
- package/lib/generated/idl/SVGElement.js +3157 -0
- package/lib/generated/idl/SVGGElement.js +109 -0
- package/lib/generated/idl/SVGGraphicsElement.js +139 -0
- package/lib/generated/idl/SVGMetadataElement.js +109 -0
- package/lib/generated/idl/SVGNumber.js +132 -0
- package/lib/generated/idl/SVGPreserveAspectRatio.js +196 -0
- package/lib/generated/idl/SVGRect.js +210 -0
- package/lib/generated/idl/SVGSVGElement.js +786 -0
- package/lib/generated/idl/SVGStringList.js +511 -0
- package/lib/generated/idl/SVGSwitchElement.js +109 -0
- package/lib/generated/idl/SVGSymbolElement.js +146 -0
- package/lib/generated/idl/SVGTitleElement.js +109 -0
- package/lib/generated/idl/Screen.js +180 -0
- package/lib/generated/idl/ScrollBehavior.js +12 -0
- package/lib/generated/idl/ScrollIntoViewOptions.js +45 -0
- package/lib/generated/idl/ScrollLogicalPosition.js +14 -0
- package/lib/generated/idl/ScrollOptions.js +30 -0
- package/lib/generated/idl/ScrollRestoration.js +12 -0
- package/lib/generated/idl/Selection.js +571 -0
- package/lib/generated/idl/SelectionMode.js +12 -0
- package/lib/generated/idl/ShadowRoot.js +189 -0
- package/lib/generated/idl/ShadowRootInit.js +30 -0
- package/lib/generated/idl/ShadowRootMode.js +12 -0
- package/lib/generated/idl/StaticRange.js +123 -0
- package/lib/generated/idl/StaticRangeInit.js +72 -0
- package/lib/generated/idl/Storage.js +397 -0
- package/lib/generated/idl/StorageEvent.js +318 -0
- package/lib/generated/idl/StorageEventInit.js +99 -0
- package/lib/generated/idl/StyleSheetList.js +300 -0
- package/lib/generated/idl/SubmitEvent.js +144 -0
- package/lib/generated/idl/SubmitEventInit.js +36 -0
- package/lib/generated/idl/SupportedType.js +18 -0
- package/lib/generated/idl/Text.js +170 -0
- package/lib/generated/idl/TextDecodeOptions.js +28 -0
- package/lib/generated/idl/TextDecoder.js +211 -0
- package/lib/generated/idl/TextDecoderOptions.js +43 -0
- package/lib/generated/idl/TextEncoder.js +176 -0
- package/lib/generated/idl/TextEncoderEncodeIntoResult.js +42 -0
- package/lib/generated/idl/TextTrackKind.js +12 -0
- package/lib/generated/idl/TouchEvent.js +222 -0
- package/lib/generated/idl/TouchEventInit.js +89 -0
- package/lib/generated/idl/TransitionEvent.js +170 -0
- package/lib/generated/idl/TransitionEventInit.js +65 -0
- package/lib/generated/idl/TreeWalker.js +255 -0
- package/lib/generated/idl/UIEvent.js +235 -0
- package/lib/generated/idl/UIEventInit.js +62 -0
- package/lib/generated/idl/ValidityState.js +249 -0
- package/lib/generated/idl/VisibilityState.js +12 -0
- package/lib/generated/idl/VoidFunction.js +26 -0
- package/lib/generated/idl/WebSocket.js +480 -0
- package/lib/generated/idl/WheelEvent.js +191 -0
- package/lib/generated/idl/WheelEventInit.js +71 -0
- package/lib/generated/idl/XMLDocument.js +109 -0
- package/lib/generated/idl/XMLHttpRequest.js +663 -0
- package/lib/generated/idl/XMLHttpRequestEventTarget.js +334 -0
- package/lib/generated/idl/XMLHttpRequestResponseType.js +14 -0
- package/lib/generated/idl/XMLHttpRequestUpload.js +109 -0
- package/lib/generated/idl/XMLSerializer.js +132 -0
- package/lib/generated/idl/utils.js +252 -0
- package/lib/generated/js-globals.json +332 -0
- package/lib/jsdom/browser/Window.js +952 -0
- package/lib/jsdom/browser/default-stylesheet.css +415 -0
- package/lib/jsdom/browser/not-implemented.js +20 -0
- package/lib/jsdom/browser/parser/html.js +208 -0
- package/lib/jsdom/browser/parser/index.js +37 -0
- package/lib/jsdom/browser/parser/xml.js +202 -0
- package/lib/jsdom/browser/resources/async-resource-queue.js +114 -0
- package/lib/jsdom/browser/resources/decompress-interceptor.js +184 -0
- package/lib/jsdom/browser/resources/jsdom-dispatcher.js +756 -0
- package/lib/jsdom/browser/resources/per-document-resource-loader.js +116 -0
- package/lib/jsdom/browser/resources/request-interceptor.js +171 -0
- package/lib/jsdom/browser/resources/request-manager.js +33 -0
- package/lib/jsdom/browser/resources/resource-queue.js +142 -0
- package/lib/jsdom/browser/resources/stream-handler.js +89 -0
- package/lib/jsdom/level2/style.js +65 -0
- package/lib/jsdom/level3/xpath.js +1875 -0
- package/lib/jsdom/living/aborting/AbortController-impl.js +17 -0
- package/lib/jsdom/living/aborting/AbortSignal-impl.js +131 -0
- package/lib/jsdom/living/attributes/Attr-impl.js +60 -0
- package/lib/jsdom/living/attributes/NamedNodeMap-impl.js +78 -0
- package/lib/jsdom/living/attributes.js +312 -0
- package/lib/jsdom/living/constraint-validation/DefaultConstraintValidation-impl.js +75 -0
- package/lib/jsdom/living/constraint-validation/ValidityState-impl.js +66 -0
- package/lib/jsdom/living/crypto/Crypto-impl.js +68 -0
- package/lib/jsdom/living/cssom/StyleSheetList-impl.js +38 -0
- package/lib/jsdom/living/custom-elements/CustomElementRegistry-impl.js +279 -0
- package/lib/jsdom/living/custom-elements/ElementInternals-impl.js +56 -0
- package/lib/jsdom/living/deviceorientation/DeviceMotionEventAcceleration-impl.js +7 -0
- package/lib/jsdom/living/deviceorientation/DeviceMotionEventRotationRate-impl.js +7 -0
- package/lib/jsdom/living/documents.js +15 -0
- package/lib/jsdom/living/domparsing/DOMParser-impl.js +59 -0
- package/lib/jsdom/living/domparsing/InnerHTML-impl.js +30 -0
- package/lib/jsdom/living/domparsing/XMLSerializer-impl.js +18 -0
- package/lib/jsdom/living/domparsing/parse5-adapter-serialization.js +63 -0
- package/lib/jsdom/living/domparsing/serialization.js +36 -0
- package/lib/jsdom/living/encoding/TextDecoder-impl.js +25 -0
- package/lib/jsdom/living/encoding/TextEncoder-impl.js +26 -0
- package/lib/jsdom/living/events/BeforeUnloadEvent-impl.js +12 -0
- package/lib/jsdom/living/events/BlobEvent-impl.js +14 -0
- package/lib/jsdom/living/events/CloseEvent-impl.js +10 -0
- package/lib/jsdom/living/events/CompositionEvent-impl.js +20 -0
- package/lib/jsdom/living/events/CustomEvent-impl.js +21 -0
- package/lib/jsdom/living/events/DeviceMotionEvent-impl.js +49 -0
- package/lib/jsdom/living/events/DeviceOrientationEvent-impl.js +10 -0
- package/lib/jsdom/living/events/ErrorEvent-impl.js +14 -0
- package/lib/jsdom/living/events/Event-impl.js +195 -0
- package/lib/jsdom/living/events/EventModifierMixin-impl.js +24 -0
- package/lib/jsdom/living/events/EventTarget-impl.js +438 -0
- package/lib/jsdom/living/events/FocusEvent-impl.js +9 -0
- package/lib/jsdom/living/events/HashChangeEvent-impl.js +14 -0
- package/lib/jsdom/living/events/InputEvent-impl.js +11 -0
- package/lib/jsdom/living/events/KeyboardEvent-impl.js +29 -0
- package/lib/jsdom/living/events/MessageEvent-impl.js +25 -0
- package/lib/jsdom/living/events/MouseEvent-impl.js +72 -0
- package/lib/jsdom/living/events/PageTransitionEvent-impl.js +20 -0
- package/lib/jsdom/living/events/PointerEvent-impl.js +21 -0
- package/lib/jsdom/living/events/PopStateEvent-impl.js +9 -0
- package/lib/jsdom/living/events/ProgressEvent-impl.js +14 -0
- package/lib/jsdom/living/events/PromiseRejectionEvent-impl.js +14 -0
- package/lib/jsdom/living/events/StorageEvent-impl.js +26 -0
- package/lib/jsdom/living/events/SubmitEvent-impl.js +13 -0
- package/lib/jsdom/living/events/TouchEvent-impl.js +14 -0
- package/lib/jsdom/living/events/TransitionEvent-impl.js +10 -0
- package/lib/jsdom/living/events/UIEvent-impl.js +43 -0
- package/lib/jsdom/living/events/WheelEvent-impl.js +12 -0
- package/lib/jsdom/living/fetch/Headers-impl.js +173 -0
- package/lib/jsdom/living/fetch/header-list.js +158 -0
- package/lib/jsdom/living/fetch/header-types.js +205 -0
- package/lib/jsdom/living/fetch/header-utils.js +26 -0
- package/lib/jsdom/living/file-api/Blob-impl.js +125 -0
- package/lib/jsdom/living/file-api/File-impl.js +12 -0
- package/lib/jsdom/living/file-api/FileList-impl.js +15 -0
- package/lib/jsdom/living/file-api/FileReader-impl.js +148 -0
- package/lib/jsdom/living/geometry/DOMRect-impl.js +39 -0
- package/lib/jsdom/living/geometry/DOMRectReadOnly-impl.js +72 -0
- package/lib/jsdom/living/helpers/binary-data.js +63 -0
- package/lib/jsdom/living/helpers/by-id-cache.js +67 -0
- package/lib/jsdom/living/helpers/colors.js +245 -0
- package/lib/jsdom/living/helpers/create-element.js +329 -0
- package/lib/jsdom/living/helpers/create-event-accessor.js +209 -0
- package/lib/jsdom/living/helpers/custom-elements.js +272 -0
- package/lib/jsdom/living/helpers/dates-and-times.js +270 -0
- package/lib/jsdom/living/helpers/details.js +15 -0
- package/lib/jsdom/living/helpers/encoding.js +60 -0
- package/lib/jsdom/living/helpers/events.js +24 -0
- package/lib/jsdom/living/helpers/focusing.js +104 -0
- package/lib/jsdom/living/helpers/form-controls.js +309 -0
- package/lib/jsdom/living/helpers/html-constructor.js +78 -0
- package/lib/jsdom/living/helpers/internal-constants.js +12 -0
- package/lib/jsdom/living/helpers/is-window.js +18 -0
- package/lib/jsdom/living/helpers/iterable-weak-set.js +48 -0
- package/lib/jsdom/living/helpers/json.js +7 -0
- package/lib/jsdom/living/helpers/mutation-observers.js +198 -0
- package/lib/jsdom/living/helpers/namespaces.js +16 -0
- package/lib/jsdom/living/helpers/node.js +108 -0
- package/lib/jsdom/living/helpers/number-and-date-inputs.js +195 -0
- package/lib/jsdom/living/helpers/ordered-set.js +104 -0
- package/lib/jsdom/living/helpers/page-transition-event.js +9 -0
- package/lib/jsdom/living/helpers/runtime-script-errors.js +75 -0
- package/lib/jsdom/living/helpers/shadow-dom.js +285 -0
- package/lib/jsdom/living/helpers/strings.js +168 -0
- package/lib/jsdom/living/helpers/style-rules.js +404 -0
- package/lib/jsdom/living/helpers/stylesheets.js +148 -0
- package/lib/jsdom/living/helpers/svg/basic-types.js +41 -0
- package/lib/jsdom/living/helpers/svg/render.js +46 -0
- package/lib/jsdom/living/helpers/system-colors.js +147 -0
- package/lib/jsdom/living/helpers/text.js +19 -0
- package/lib/jsdom/living/helpers/traversal.js +72 -0
- package/lib/jsdom/living/helpers/validate-names.js +65 -0
- package/lib/jsdom/living/hr-time/Performance-impl.js +22 -0
- package/lib/jsdom/living/interfaces.js +252 -0
- package/lib/jsdom/living/mutation-observer/MutationObserver-impl.js +95 -0
- package/lib/jsdom/living/mutation-observer/MutationRecord-impl.js +37 -0
- package/lib/jsdom/living/navigator/MimeType-impl.js +3 -0
- package/lib/jsdom/living/navigator/MimeTypeArray-impl.js +21 -0
- package/lib/jsdom/living/navigator/Navigator-impl.js +29 -0
- package/lib/jsdom/living/navigator/NavigatorConcurrentHardware-impl.js +8 -0
- package/lib/jsdom/living/navigator/NavigatorCookies-impl.js +7 -0
- package/lib/jsdom/living/navigator/NavigatorID-impl.js +37 -0
- package/lib/jsdom/living/navigator/NavigatorLanguage-impl.js +9 -0
- package/lib/jsdom/living/navigator/NavigatorOnLine-impl.js +7 -0
- package/lib/jsdom/living/navigator/NavigatorPlugins-impl.js +8 -0
- package/lib/jsdom/living/navigator/Plugin-impl.js +3 -0
- package/lib/jsdom/living/navigator/PluginArray-impl.js +23 -0
- package/lib/jsdom/living/node-document-position.js +10 -0
- package/lib/jsdom/living/node-type.js +16 -0
- package/lib/jsdom/living/node.js +331 -0
- package/lib/jsdom/living/nodes/CDATASection-impl.js +16 -0
- package/lib/jsdom/living/nodes/CharacterData-impl.js +118 -0
- package/lib/jsdom/living/nodes/ChildNode-impl.js +80 -0
- package/lib/jsdom/living/nodes/Comment-impl.js +20 -0
- package/lib/jsdom/living/nodes/DOMImplementation-impl.js +120 -0
- package/lib/jsdom/living/nodes/DOMStringMap-impl.js +64 -0
- package/lib/jsdom/living/nodes/DOMTokenList-impl.js +171 -0
- package/lib/jsdom/living/nodes/Document-impl.js +1000 -0
- package/lib/jsdom/living/nodes/DocumentFragment-impl.js +44 -0
- package/lib/jsdom/living/nodes/DocumentOrShadowRoot-impl.js +28 -0
- package/lib/jsdom/living/nodes/DocumentType-impl.js +24 -0
- package/lib/jsdom/living/nodes/Element-impl.js +584 -0
- package/lib/jsdom/living/nodes/ElementCSSInlineStyle-impl.js +22 -0
- package/lib/jsdom/living/nodes/ElementContentEditable-impl.js +7 -0
- package/lib/jsdom/living/nodes/GlobalEventHandlers-impl.js +81 -0
- package/lib/jsdom/living/nodes/HTMLAnchorElement-impl.js +50 -0
- package/lib/jsdom/living/nodes/HTMLAreaElement-impl.js +43 -0
- package/lib/jsdom/living/nodes/HTMLAudioElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLBRElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLBaseElement-impl.js +44 -0
- package/lib/jsdom/living/nodes/HTMLBodyElement-impl.js +12 -0
- package/lib/jsdom/living/nodes/HTMLButtonElement-impl.js +79 -0
- package/lib/jsdom/living/nodes/HTMLCanvasElement-impl.js +136 -0
- package/lib/jsdom/living/nodes/HTMLCollection-impl.js +96 -0
- package/lib/jsdom/living/nodes/HTMLDListElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLDataElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLDataListElement-impl.js +20 -0
- package/lib/jsdom/living/nodes/HTMLDetailsElement-impl.js +35 -0
- package/lib/jsdom/living/nodes/HTMLDialogElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLDirectoryElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLDivElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLElement-impl.js +211 -0
- package/lib/jsdom/living/nodes/HTMLEmbedElement-impl.js +8 -0
- package/lib/jsdom/living/nodes/HTMLFieldSetElement-impl.js +43 -0
- package/lib/jsdom/living/nodes/HTMLFontElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLFormControlsCollection-impl.js +33 -0
- package/lib/jsdom/living/nodes/HTMLFormElement-impl.js +248 -0
- package/lib/jsdom/living/nodes/HTMLFrameElement-impl.js +266 -0
- package/lib/jsdom/living/nodes/HTMLFrameSetElement-impl.js +12 -0
- package/lib/jsdom/living/nodes/HTMLHRElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLHeadElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLHeadingElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLHtmlElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLHyperlinkElementUtils-impl.js +368 -0
- package/lib/jsdom/living/nodes/HTMLIFrameElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLImageElement-impl.js +127 -0
- package/lib/jsdom/living/nodes/HTMLInputElement-impl.js +1097 -0
- package/lib/jsdom/living/nodes/HTMLLIElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLLabelElement-impl.js +94 -0
- package/lib/jsdom/living/nodes/HTMLLegendElement-impl.js +18 -0
- package/lib/jsdom/living/nodes/HTMLLinkElement-impl.js +107 -0
- package/lib/jsdom/living/nodes/HTMLMapElement-impl.js +13 -0
- package/lib/jsdom/living/nodes/HTMLMarqueeElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLMediaElement-impl.js +138 -0
- package/lib/jsdom/living/nodes/HTMLMenuElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLMetaElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLMeterElement-impl.js +180 -0
- package/lib/jsdom/living/nodes/HTMLModElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLOListElement-impl.js +22 -0
- package/lib/jsdom/living/nodes/HTMLObjectElement-impl.js +26 -0
- package/lib/jsdom/living/nodes/HTMLOptGroupElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLOptionElement-impl.js +146 -0
- package/lib/jsdom/living/nodes/HTMLOptionsCollection-impl.js +110 -0
- package/lib/jsdom/living/nodes/HTMLOrSVGElement-impl.js +88 -0
- package/lib/jsdom/living/nodes/HTMLOutputElement-impl.js +88 -0
- package/lib/jsdom/living/nodes/HTMLParagraphElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLParamElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLPictureElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLPreElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLProgressElement-impl.js +72 -0
- package/lib/jsdom/living/nodes/HTMLQuoteElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLScriptElement-impl.js +255 -0
- package/lib/jsdom/living/nodes/HTMLSelectElement-impl.js +283 -0
- package/lib/jsdom/living/nodes/HTMLSlotElement-impl.js +59 -0
- package/lib/jsdom/living/nodes/HTMLSourceElement-impl.js +8 -0
- package/lib/jsdom/living/nodes/HTMLSpanElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLStyleElement-impl.js +76 -0
- package/lib/jsdom/living/nodes/HTMLTableCaptionElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLTableCellElement-impl.js +73 -0
- package/lib/jsdom/living/nodes/HTMLTableColElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLTableElement-impl.js +236 -0
- package/lib/jsdom/living/nodes/HTMLTableRowElement-impl.js +88 -0
- package/lib/jsdom/living/nodes/HTMLTableSectionElement-impl.js +61 -0
- package/lib/jsdom/living/nodes/HTMLTemplateElement-impl.js +67 -0
- package/lib/jsdom/living/nodes/HTMLTextAreaElement-impl.js +244 -0
- package/lib/jsdom/living/nodes/HTMLTimeElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLTitleElement-impl.js +18 -0
- package/lib/jsdom/living/nodes/HTMLTrackElement-impl.js +13 -0
- package/lib/jsdom/living/nodes/HTMLUListElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLUnknownElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/HTMLVideoElement-impl.js +17 -0
- package/lib/jsdom/living/nodes/LinkStyle-impl.js +2 -0
- package/lib/jsdom/living/nodes/Node-impl.js +1179 -0
- package/lib/jsdom/living/nodes/NodeList-impl.js +43 -0
- package/lib/jsdom/living/nodes/NonDocumentTypeChildNode-impl.js +28 -0
- package/lib/jsdom/living/nodes/NonElementParentNode-impl.js +11 -0
- package/lib/jsdom/living/nodes/ParentNode-impl.js +90 -0
- package/lib/jsdom/living/nodes/ProcessingInstruction-impl.js +22 -0
- package/lib/jsdom/living/nodes/RadioNodeList-impl.js +49 -0
- package/lib/jsdom/living/nodes/SVGDefsElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/SVGDescElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/SVGElement-impl.js +64 -0
- package/lib/jsdom/living/nodes/SVGGElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/SVGGraphicsElement-impl.js +16 -0
- package/lib/jsdom/living/nodes/SVGMetadataElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/SVGSVGElement-impl.js +40 -0
- package/lib/jsdom/living/nodes/SVGSwitchElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/SVGSymbolElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/SVGTests-impl.js +42 -0
- package/lib/jsdom/living/nodes/SVGTitleElement-impl.js +9 -0
- package/lib/jsdom/living/nodes/ShadowRoot-impl.js +41 -0
- package/lib/jsdom/living/nodes/Slotable-impl.js +48 -0
- package/lib/jsdom/living/nodes/Text-impl.js +96 -0
- package/lib/jsdom/living/nodes/WindowEventHandlers-impl.js +14 -0
- package/lib/jsdom/living/nodes/XMLDocument-impl.js +4 -0
- package/lib/jsdom/living/range/AbstractRange-impl.js +43 -0
- package/lib/jsdom/living/range/Range-impl.js +902 -0
- package/lib/jsdom/living/range/StaticRange-impl.js +39 -0
- package/lib/jsdom/living/range/boundary-point.js +47 -0
- package/lib/jsdom/living/selection/Selection-impl.js +358 -0
- package/lib/jsdom/living/svg/SVGAnimatedPreserveAspectRatio-impl.js +24 -0
- package/lib/jsdom/living/svg/SVGAnimatedRect-impl.js +122 -0
- package/lib/jsdom/living/svg/SVGAnimatedString-impl.js +42 -0
- package/lib/jsdom/living/svg/SVGListBase.js +195 -0
- package/lib/jsdom/living/svg/SVGNumber-impl.js +48 -0
- package/lib/jsdom/living/svg/SVGPreserveAspectRatio-impl.js +100 -0
- package/lib/jsdom/living/svg/SVGRect-impl.js +143 -0
- package/lib/jsdom/living/svg/SVGStringList-impl.js +16 -0
- package/lib/jsdom/living/traversal/NodeIterator-impl.js +107 -0
- package/lib/jsdom/living/traversal/TreeWalker-impl.js +217 -0
- package/lib/jsdom/living/traversal/helpers.js +44 -0
- package/lib/jsdom/living/webidl/DOMException-impl.js +46 -0
- package/lib/jsdom/living/websockets/WebSocket-impl.js +211 -0
- package/lib/jsdom/living/webstorage/Storage-impl.js +102 -0
- package/lib/jsdom/living/window/BarProp-impl.js +10 -0
- package/lib/jsdom/living/window/External-impl.js +9 -0
- package/lib/jsdom/living/window/History-impl.js +148 -0
- package/lib/jsdom/living/window/Location-impl.js +227 -0
- package/lib/jsdom/living/window/Screen-impl.js +13 -0
- package/lib/jsdom/living/window/SessionHistory.js +163 -0
- package/lib/jsdom/living/window/navigation.js +87 -0
- package/lib/jsdom/living/window-properties.js +241 -0
- package/lib/jsdom/living/xhr/FormData-impl.js +191 -0
- package/lib/jsdom/living/xhr/XMLHttpRequest-impl.js +1057 -0
- package/lib/jsdom/living/xhr/XMLHttpRequestEventTarget-impl.js +17 -0
- package/lib/jsdom/living/xhr/XMLHttpRequestUpload-impl.js +4 -0
- package/lib/jsdom/living/xhr/multipart-form-data.js +99 -0
- package/lib/jsdom/living/xhr/xhr-sync-worker.js +51 -0
- package/lib/jsdom/living/xhr/xhr-utils.js +206 -0
- package/lib/jsdom/utils.js +105 -0
- package/lib/jsdom/virtual-console.js +46 -0
- 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
|
+
};
|