From d7c7d45b9190663ca545aa6184a28eb812ab46ca Mon Sep 17 00:00:00 2001 From: David Ortner Date: Tue, 19 Mar 2024 01:12:41 +0100 Subject: [PATCH 1/5] BREAKING CHANGE: [#1330] Removes interfaces for Node's, as they are no longer needed as newer versions of Typescript can handle circular dependencies --- packages/happy-dom/package.json | 4 +- .../happy-dom/src/browser/BrowserContext.ts | 4 +- .../happy-dom/src/browser/BrowserFrame.ts | 15 +- packages/happy-dom/src/browser/BrowserPage.ts | 6 +- .../detached-browser/DetachedBrowser.ts | 8 +- .../DetachedBrowserContext.ts | 2 +- .../detached-browser/DetachedBrowserFrame.ts | 18 +- .../detached-browser/DetachedBrowserPage.ts | 6 +- .../src/browser/types/IBrowserContext.ts | 2 +- .../src/browser/types/IBrowserFrame.ts | 18 +- .../src/browser/types/IBrowserPage.ts | 6 +- .../browser/utilities/BrowserFrameFactory.ts | 6 +- .../utilities/BrowserFrameNavigator.ts | 12 +- .../browser/utilities/BrowserPageUtility.ts | 2 +- packages/happy-dom/src/clipboard/Clipboard.ts | 6 +- .../src/config/IHTMLElementTagNameMap.ts | 278 ++++---- .../src/config/ISVGElementTagNameMap.ts | 128 ++-- .../{types => }/IVirtualConsoleLogEntry.ts | 4 +- .../{types => }/IVirtualConsoleLogGroup.ts | 0 .../{types => }/IVirtualConsolePrinter.ts | 4 +- .../happy-dom/src/console/VirtualConsole.ts | 4 +- .../src/console/VirtualConsolePrinter.ts | 4 +- .../VirtualConsoleLogEntryStringifier.ts | 2 +- .../happy-dom/src/cookie/CookieContainer.ts | 4 +- .../src/cookie/{types => }/ICookie.ts | 2 +- .../cookie/{types => }/ICookieContainer.ts | 4 +- .../cookie/urilities/CookieExpireUtility.ts | 2 +- .../cookie/urilities/CookieStringUtility.ts | 2 +- .../src/cookie/urilities/CookieURLUtility.ts | 2 +- .../AbstractCSSStyleDeclaration.ts | 14 +- .../CSSStyleDeclarationElementStyle.ts | 48 +- .../CSSMeasurementConverter.ts | 4 +- .../custom-element/CustomElementRegistry.ts | 6 +- .../dom-implementation/DOMImplementation.ts | 10 +- .../happy-dom/src/dom-parser/DOMParser.ts | 16 +- .../src/dom-token-list/DOMTokenList.ts | 3 +- .../src/dom-token-list/IDOMTokenList.ts | 20 - packages/happy-dom/src/event/Event.ts | 36 +- packages/happy-dom/src/event/EventTarget.ts | 27 +- packages/happy-dom/src/event/IEventTarget.ts | 63 -- packages/happy-dom/src/event/IMessagePort.ts | 4 +- packages/happy-dom/src/event/ITouchInit.ts | 4 +- packages/happy-dom/src/event/IUIEventInit.ts | 4 +- packages/happy-dom/src/event/Touch.ts | 4 +- packages/happy-dom/src/event/UIEvent.ts | 4 +- .../src/event/events/IMessageEventInit.ts | 4 +- .../src/event/events/ISubmitEventInit.ts | 4 +- .../src/event/events/MessageEvent.ts | 4 +- .../happy-dom/src/event/events/SubmitEvent.ts | 4 +- packages/happy-dom/src/fetch/Fetch.ts | 19 +- packages/happy-dom/src/fetch/Headers.ts | 5 +- packages/happy-dom/src/fetch/Request.ts | 16 +- packages/happy-dom/src/fetch/ResourceFetch.ts | 6 +- packages/happy-dom/src/fetch/Response.ts | 19 +- packages/happy-dom/src/fetch/SyncFetch.ts | 12 +- .../preflight/ICachablePreflightRequest.ts | 4 +- .../preflight/ICachablePreflightResponse.ts | 4 +- .../fetch/cache/response/ICachableRequest.ts | 4 +- .../fetch/cache/response/ICachableResponse.ts | 4 +- .../fetch/cache/response/ICachedResponse.ts | 6 +- .../happy-dom/src/fetch/types/IHeaders.ts | 87 --- .../happy-dom/src/fetch/types/IHeadersInit.ts | 4 +- .../happy-dom/src/fetch/types/IRequest.ts | 73 --- .../happy-dom/src/fetch/types/IRequestInfo.ts | 4 +- .../happy-dom/src/fetch/types/IResponse.ts | 28 - .../src/fetch/types/ISyncResponse.ts | 4 +- .../utilities/FetchRequestHeaderUtility.ts | 7 +- .../utilities/FetchRequestReferrerUtility.ts | 4 +- packages/happy-dom/src/file/Blob.ts | 3 +- packages/happy-dom/src/file/FileReader.ts | 6 +- packages/happy-dom/src/file/IBlob.ts | 10 - packages/happy-dom/src/form-data/FormData.ts | 12 +- packages/happy-dom/src/index.ts | 94 +-- .../src/match-media/MediaQueryItem.ts | 6 +- .../src/match-media/MediaQueryList.ts | 6 +- .../src/match-media/MediaQueryParser.ts | 4 +- .../src/mutation-observer/MutationListener.ts | 12 +- .../src/mutation-observer/MutationObserver.ts | 7 +- .../src/mutation-observer/MutationRecord.ts | 12 +- .../src/named-node-map/INamedNodeMap.ts | 70 --- .../src/named-node-map/NamedNodeMap.ts | 33 +- packages/happy-dom/src/navigator/Navigator.ts | 6 +- packages/happy-dom/src/nodes/NodeFactory.ts | 8 +- packages/happy-dom/src/nodes/attr/Attr.ts | 9 +- packages/happy-dom/src/nodes/attr/IAttr.ts | 15 - .../src/nodes/character-data/CharacterData.ts | 16 +- .../character-data/CharacterDataUtility.ts | 16 +- .../nodes/character-data/ICharacterData.ts | 57 -- .../src/nodes/child-node/ChildNodeUtility.ts | 8 +- .../src/nodes/child-node/IChildNode.ts | 10 +- .../child-node/INonDocumentTypeChildNode.ts | 10 +- .../child-node/NonDocumentChildNodeUtility.ts | 10 +- .../happy-dom/src/nodes/comment/Comment.ts | 5 +- .../happy-dom/src/nodes/comment/IComment.ts | 12 - .../document-fragment/DocumentFragment.ts | 53 +- .../document-fragment/IDocumentFragment.ts | 78 --- .../src/nodes/document-type/IDocumentType.ts | 19 - .../happy-dom/src/nodes/document/Document.ts | 223 ++++--- .../document/DocumentReadyStateManager.ts | 6 +- .../happy-dom/src/nodes/document/IDocument.ts | 365 ----------- .../src/nodes/element/DOMRectList.ts | 15 + .../src/nodes/element/DOMRectListFactory.ts | 33 - .../happy-dom/src/nodes/element/Element.ts | 141 +++-- .../src/nodes/element/ElementNamedNodeMap.ts | 25 +- .../src/nodes/element/ElementUtility.ts | 66 +- .../src/nodes/element/HTMLCollection.ts | 3 +- .../src/nodes/element/IDOMRectList.ts | 11 - .../happy-dom/src/nodes/element/IElement.ts | 334 ---------- .../src/nodes/element/IHTMLCollection.ts | 19 - .../html-anchor-element/HTMLAnchorElement.ts | 13 +- .../HTMLAnchorElementNamedNodeMap.ts | 6 +- .../html-anchor-element/IHTMLAnchorElement.ts | 21 - .../html-audio-element/HTMLAudioElement.ts | 3 +- .../html-audio-element/IHTMLAudioElement.ts | 11 - .../html-base-element/HTMLBaseElement.ts | 7 +- .../html-base-element/IHTMLBaseElement.ts | 21 - .../html-button-element/HTMLButtonElement.ts | 24 +- .../HTMLButtonElementNamedNodeMap.ts | 6 +- .../html-button-element/IHTMLButtonElement.ts | 48 -- .../html-dialog-element/HTMLDialogElement.ts | 3 +- .../html-dialog-element/IHTMLDialogElement.ts | 34 - .../src/nodes/html-document/HTMLDocument.ts | 4 +- .../src/nodes/html-element/HTMLElement.ts | 26 +- .../html-element/HTMLElementNamedNodeMap.ts | 6 +- .../nodes/html-element/HTMLElementUtility.ts | 8 +- .../src/nodes/html-element/IHTMLElement.ts | 81 --- .../HTMLFormControlsCollection.ts | 27 +- .../html-form-element/HTMLFormElement.ts | 48 +- .../IHTMLFormControlsCollection.ts | 39 -- .../html-form-element/IHTMLFormElement.ts | 70 --- .../nodes/html-form-element/IRadioNodeList.ts | 16 - .../nodes/html-form-element/RadioNodeList.ts | 14 +- .../html-iframe-element/HTMLIFrameElement.ts | 29 +- .../HTMLIFrameElementNamedNodeMap.ts | 4 +- .../HTMLIFrameElementPageLoader.ts | 17 +- .../html-iframe-element/IHTMLIFrameElement.ts | 28 - .../html-image-element/HTMLImageElement.ts | 7 +- .../html-image-element/IHTMLImageElement.ts | 44 -- .../src/nodes/html-input-element/FileList.ts | 3 +- .../html-input-element/HTMLInputElement.ts | 41 +- .../HTMLInputElementNamedNodeMap.ts | 6 +- .../src/nodes/html-input-element/IFileList.ts | 11 - .../html-input-element/IHTMLInputElement.ts | 139 ---- .../html-label-element/HTMLLabelElement.ts | 18 +- .../HTMLLabelElementUtility.ts | 21 +- .../html-label-element/IHTMLLabelElement.ts | 14 - .../html-link-element/HTMLLinkElement.ts | 18 +- .../HTMLLinkElementNamedNodeMap.ts | 6 +- .../HTMLLinkElementStyleSheetLoader.ts | 6 +- .../html-link-element/IHTMLLinkElement.ts | 22 - .../html-media-element/HTMLMediaElement.ts | 34 +- .../html-media-element/IHTMLMediaElement.ts | 110 ---- .../src/nodes/html-media-element/TimeRange.ts | 26 + .../html-meta-element/HTMLMetaElement.ts | 3 +- .../html-meta-element/IHTMLMetaElement.ts | 14 - .../HTMLOptGroupElement.ts | 3 +- .../IHTMLOptGroupElement.ts | 12 - .../html-option-element/HTMLOptionElement.ts | 20 +- .../HTMLOptionElementNamedNodeMap.ts | 6 +- .../html-option-element/IHTMLOptionElement.ts | 17 - .../html-script-element/HTMLScriptElement.ts | 15 +- .../HTMLScriptElementNamedNodeMap.ts | 4 +- .../HTMLScriptElementScriptLoader.ts | 6 +- .../html-script-element/IHTMLScriptElement.ts | 26 - .../HTMLOptionsCollection.ts | 20 +- .../html-select-element/HTMLSelectElement.ts | 41 +- .../HTMLSelectElementNamedNodeMap.ts | 6 +- .../IHTMLOptionsCollection.ts | 35 -- .../html-select-element/IHTMLSelectElement.ts | 83 --- .../html-slot-element/HTMLSlotElement.ts | 23 +- .../html-slot-element/IHTMLSlotElement.ts | 51 -- .../html-style-element/HTMLStyleElement.ts | 3 +- .../html-style-element/IHTMLStyleElement.ts | 15 - .../HTMLTemplateElement.ts | 28 +- .../IHTMLTemplateElement.ts | 21 - .../HTMLTextAreaElement.ts | 24 +- .../HTMLTextAreaElementNamedNodeMap.ts | 6 +- .../IHTMLTextAreaElement.ts | 102 --- .../HTMLUnknownElement.ts | 3 +- .../html-video-element/HTMLVideoElement.ts | 3 +- .../html-video-element/IHTMLVideoElement.ts | 11 - packages/happy-dom/src/nodes/node/INode.ts | 68 -- .../happy-dom/src/nodes/node/INodeList.ts | 11 - packages/happy-dom/src/nodes/node/Node.ts | 94 ++- packages/happy-dom/src/nodes/node/NodeList.ts | 4 +- .../happy-dom/src/nodes/node/NodeUtility.ts | 81 ++- .../src/nodes/parent-node/IParentNode.ts | 46 +- .../nodes/parent-node/ParentNodeUtility.ts | 72 ++- .../IProcessingInstruction.ts | 5 - .../ProcessingInstruction.ts | 3 +- .../src/nodes/shadow-root/IShadowRoot.ts | 27 - .../src/nodes/shadow-root/ShadowRoot.ts | 18 +- .../src/nodes/svg-element/ISVGElement.ts | 35 -- .../nodes/svg-element/ISVGGraphicsElement.ts | 33 - .../src/nodes/svg-element/ISVGSVGElement.ts | 161 ----- .../src/nodes/svg-element/SVGElement.ts | 15 +- .../svg-element/SVGElementNamedNodeMap.ts | 6 +- .../nodes/svg-element/SVGGraphicsElement.ts | 3 +- .../src/nodes/svg-element/SVGSVGElement.ts | 13 +- packages/happy-dom/src/nodes/text/IText.ts | 22 - packages/happy-dom/src/nodes/text/Text.ts | 13 +- .../src/query-selector/QuerySelector.ts | 72 ++- .../src/query-selector/SelectorItem.ts | 19 +- .../src/range/IRangeBoundaryPoint.ts | 4 +- packages/happy-dom/src/range/Range.ts | 104 ++- packages/happy-dom/src/range/RangeUtility.ts | 5 +- packages/happy-dom/src/selection/Selection.ts | 30 +- .../happy-dom/src/tree-walker/INodeFilter.ts | 4 +- .../happy-dom/src/tree-walker/NodeIterator.ts | 10 +- .../happy-dom/src/tree-walker/TreeWalker.ts | 25 +- .../src/validity-state/ValidityState.ts | 24 +- .../happy-dom/src/window/BrowserWindow.ts | 32 +- .../src/window/CrossOriginBrowserWindow.ts | 15 +- packages/happy-dom/src/window/GlobalWindow.ts | 3 +- .../happy-dom/src/window/IBrowserWindow.ts | 595 ------------------ .../src/window/ICrossOriginBrowserWindow.ts | 40 -- packages/happy-dom/src/window/IWindow.ts | 10 - packages/happy-dom/src/window/Window.ts | 3 +- .../src/window/WindowBrowserSettingsReader.ts | 8 +- .../src/window/WindowErrorUtility.ts | 16 +- .../src/window/WindowPageOpenUtility.ts | 5 +- .../src/xml-http-request/XMLHttpRequest.ts | 26 +- .../XMLHttpRequestResponseDataParser.ts | 8 +- .../happy-dom/src/xml-parser/XMLParser.ts | 38 +- .../src/xml-serializer/XMLSerializer.ts | 14 +- .../test/AdoptedStyleSheetCustomElement.ts | 4 +- packages/happy-dom/test/CustomElement.ts | 4 +- .../test/browser/BrowserFrame.test.ts | 82 +-- .../test/browser/BrowserPage.test.ts | 6 +- .../DetachedBrowserFrame.test.ts | 86 +-- .../DetachedBrowserPage.test.ts | 6 +- .../test/clipboard/Clipboard.test.ts | 4 +- .../declaration/CSSStyleDeclaration.test.ts | 12 +- .../CSSStyleDeclarationElementStyle.test.ts | 12 +- .../CustomElementRegistry.test.ts | 8 +- .../DOMImplementation.test.ts | 4 +- .../test/dom-token-list/DOMTokenList.test.ts | 16 +- packages/happy-dom/test/event/Event.test.ts | 72 +-- .../test/event/events/SubmitEvent.test.ts | 2 +- packages/happy-dom/test/fetch/Fetch.test.ts | 2 +- packages/happy-dom/test/fetch/Request.test.ts | 8 +- .../test/fetch/ResourceFetch.test.ts | 10 +- .../happy-dom/test/fetch/Response.test.ts | 8 +- .../happy-dom/test/fetch/SyncFetch.test.ts | 4 +- .../happy-dom/test/form-data/FormData.test.ts | 8 +- .../happy-dom/test/location/Location.test.ts | 18 +- .../test/match-media/MediaQueryList.test.ts | 4 +- .../test/named-node-map/NamedNodeMap.test.ts | 20 +- .../test/navigator/Navigator.test.ts | 20 +- .../DocumentFragment.test.ts | 10 +- .../test/nodes/document/Document.test.ts | 60 +- .../test/nodes/element/Element.test.ts | 160 ++--- .../HTMLAnchorElement.test.ts | 136 ++-- .../html-base-element/HTMLBaseElement.test.ts | 20 +- .../HTMLButtonElement.test.ts | 34 +- .../HTMLDialogElement.test.ts | 14 +- .../nodes/html-element/HTMLElement.test.ts | 36 +- .../html-element/HTMLElementUtility.test.ts | 58 +- .../html-form-element/HTMLFormElement.test.ts | 169 +++-- .../HTMLIFrameElement.test.ts | 40 +- .../nodes/html-input-element/FileList.test.ts | 12 +- .../HTMLInputElement.test.ts | 52 +- .../HTMLInputElementValueSanitizer.test.ts | 14 +- .../HTMLLabelElement.test.ts | 10 +- .../html-link-element/HTMLLinkElement.test.ts | 20 +- .../HTMLMediaElement.test.ts | 14 +- .../html-meta-element/HTMLMetaElement.test.ts | 6 +- .../HTMLOptionElement.test.ts | 20 +- .../HTMLOptionsCollection.test.ts | 8 +- .../HTMLScriptElement.test.ts | 46 +- .../HTMLSelectElement.test.ts | 100 +-- .../html-slot-element/HTMLSlotElement.test.ts | 18 +- .../HTMLStyleElement.test.ts | 14 +- .../HTMLTemplateElement.test.ts | 14 +- .../HTMLTextAreaElement.test.ts | 18 +- .../happy-dom/test/nodes/node/Node.test.ts | 16 +- .../test/nodes/node/NodeUtility.test.ts | 8 +- .../test/nodes/shadow-root/ShadowRoot.test.ts | 12 +- .../test/nodes/svg-element/SVGElement.test.ts | 26 +- .../test/permissions/Permissions.test.ts | 4 +- .../test/query-selector/QuerySelector.test.ts | 20 +- packages/happy-dom/test/range/Range.test.ts | 14 +- .../test/selection/Selection.test.ts | 8 +- .../test/tree-walker/NodeIterator.test.ts | 16 +- .../test/tree-walker/TreeWalker.test.ts | 16 +- .../test/validity-state/ValidityState.test.ts | 56 +- .../test/window/BrowserWindow.test.ts | 140 ++--- .../test/window/DetachedWindowAPI.test.ts | 4 +- .../test/window/GlobalWindow.test.ts | 4 +- packages/happy-dom/test/window/Window.test.ts | 56 +- .../xml-http-request/XMLHttpRequest.test.ts | 122 ++-- .../test/xml-parser/XMLParser.test.ts | 126 ++-- .../test/xml-serializer/XMLSerializer.test.ts | 8 +- packages/jest-environment/src/index.ts | 8 +- 294 files changed, 2596 insertions(+), 6168 deletions(-) rename packages/happy-dom/src/console/{types => }/IVirtualConsoleLogEntry.ts (62%) rename packages/happy-dom/src/console/{types => }/IVirtualConsoleLogGroup.ts (100%) rename packages/happy-dom/src/console/{types => }/IVirtualConsolePrinter.ts (90%) rename packages/happy-dom/src/cookie/{types => }/ICookie.ts (78%) rename packages/happy-dom/src/cookie/{types => }/ICookieContainer.ts (87%) delete mode 100644 packages/happy-dom/src/dom-token-list/IDOMTokenList.ts delete mode 100644 packages/happy-dom/src/event/IEventTarget.ts delete mode 100644 packages/happy-dom/src/fetch/types/IHeaders.ts delete mode 100644 packages/happy-dom/src/fetch/types/IRequest.ts delete mode 100644 packages/happy-dom/src/fetch/types/IResponse.ts delete mode 100644 packages/happy-dom/src/file/IBlob.ts delete mode 100644 packages/happy-dom/src/named-node-map/INamedNodeMap.ts delete mode 100644 packages/happy-dom/src/nodes/attr/IAttr.ts delete mode 100644 packages/happy-dom/src/nodes/character-data/ICharacterData.ts delete mode 100644 packages/happy-dom/src/nodes/comment/IComment.ts delete mode 100644 packages/happy-dom/src/nodes/document-fragment/IDocumentFragment.ts delete mode 100644 packages/happy-dom/src/nodes/document-type/IDocumentType.ts delete mode 100644 packages/happy-dom/src/nodes/document/IDocument.ts create mode 100644 packages/happy-dom/src/nodes/element/DOMRectList.ts delete mode 100644 packages/happy-dom/src/nodes/element/DOMRectListFactory.ts delete mode 100644 packages/happy-dom/src/nodes/element/IDOMRectList.ts delete mode 100644 packages/happy-dom/src/nodes/element/IElement.ts delete mode 100644 packages/happy-dom/src/nodes/element/IHTMLCollection.ts delete mode 100644 packages/happy-dom/src/nodes/html-anchor-element/IHTMLAnchorElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-audio-element/IHTMLAudioElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-base-element/IHTMLBaseElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-button-element/IHTMLButtonElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-dialog-element/IHTMLDialogElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-element/IHTMLElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-form-element/IHTMLFormControlsCollection.ts delete mode 100644 packages/happy-dom/src/nodes/html-form-element/IHTMLFormElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-form-element/IRadioNodeList.ts delete mode 100644 packages/happy-dom/src/nodes/html-iframe-element/IHTMLIFrameElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-image-element/IHTMLImageElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-input-element/IFileList.ts delete mode 100644 packages/happy-dom/src/nodes/html-input-element/IHTMLInputElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-label-element/IHTMLLabelElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-link-element/IHTMLLinkElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts create mode 100644 packages/happy-dom/src/nodes/html-media-element/TimeRange.ts delete mode 100644 packages/happy-dom/src/nodes/html-meta-element/IHTMLMetaElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-opt-group-element/IHTMLOptGroupElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-option-element/IHTMLOptionElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-script-element/IHTMLScriptElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-select-element/IHTMLOptionsCollection.ts delete mode 100644 packages/happy-dom/src/nodes/html-select-element/IHTMLSelectElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-slot-element/IHTMLSlotElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-style-element/IHTMLStyleElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-template-element/IHTMLTemplateElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-text-area-element/IHTMLTextAreaElement.ts delete mode 100644 packages/happy-dom/src/nodes/html-video-element/IHTMLVideoElement.ts delete mode 100644 packages/happy-dom/src/nodes/node/INode.ts delete mode 100644 packages/happy-dom/src/nodes/node/INodeList.ts delete mode 100644 packages/happy-dom/src/nodes/processing-instruction/IProcessingInstruction.ts delete mode 100644 packages/happy-dom/src/nodes/shadow-root/IShadowRoot.ts delete mode 100644 packages/happy-dom/src/nodes/svg-element/ISVGElement.ts delete mode 100644 packages/happy-dom/src/nodes/svg-element/ISVGGraphicsElement.ts delete mode 100644 packages/happy-dom/src/nodes/svg-element/ISVGSVGElement.ts delete mode 100644 packages/happy-dom/src/nodes/text/IText.ts delete mode 100644 packages/happy-dom/src/window/IBrowserWindow.ts delete mode 100644 packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts delete mode 100644 packages/happy-dom/src/window/IWindow.ts diff --git a/packages/happy-dom/package.json b/packages/happy-dom/package.json index 9af83a3c3..b1d76bf24 100644 --- a/packages/happy-dom/package.json +++ b/packages/happy-dom/package.json @@ -65,7 +65,9 @@ "access": "public" }, "scripts": { - "compile": "tsc && rm -rf ./cjs && tsc --moduleResolution Node --module CommonJS --outDir cjs && npm run change-cjs-file-extension && npm run build-version-file", + "compile": "npm run compile:esm && npm run compile:cjs npm run build-version-file", + "compile:esm": "tsc", + "compile:cjs": "rm -rf ./cjs && tsc --moduleResolution Node --module CommonJS --outDir cjs && npm run change-cjs-file-extension", "change-cjs-file-extension": "node ./bin/change-file-extension.cjs --dir=./cjs --fromExt=.js --toExt=.cjs", "build-version-file": "node ./bin/build-version-file.cjs", "watch": "tsc -w --preserveWatchOutput", diff --git a/packages/happy-dom/src/browser/BrowserContext.ts b/packages/happy-dom/src/browser/BrowserContext.ts index f0123eb1e..f9d74240b 100644 --- a/packages/happy-dom/src/browser/BrowserContext.ts +++ b/packages/happy-dom/src/browser/BrowserContext.ts @@ -1,7 +1,7 @@ import CookieContainer from '../cookie/CookieContainer.js'; -import ICookieContainer from '../cookie/types/ICookieContainer.js'; -import ResponseCache from '../fetch/cache/response/ResponseCache.js'; +import ICookieContainer from '../cookie/ICookieContainer.js'; import IResponseCache from '../fetch/cache/response/IResponseCache.js'; +import ResponseCache from '../fetch/cache/response/ResponseCache.js'; import Browser from './Browser.js'; import BrowserPage from './BrowserPage.js'; import IBrowserContext from './types/IBrowserContext.js'; diff --git a/packages/happy-dom/src/browser/BrowserFrame.ts b/packages/happy-dom/src/browser/BrowserFrame.ts index 33f4cdca2..5c6bd3123 100644 --- a/packages/happy-dom/src/browser/BrowserFrame.ts +++ b/packages/happy-dom/src/browser/BrowserFrame.ts @@ -3,9 +3,8 @@ import * as PropertySymbol from '../PropertySymbol.js'; import AsyncTaskManager from '../async-task-manager/AsyncTaskManager.js'; import IBrowserFrame from './types/IBrowserFrame.js'; import BrowserWindow from '../window/BrowserWindow.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; -import ICrossOriginBrowserWindow from '../window/ICrossOriginBrowserWindow.js'; -import IResponse from '../fetch/types/IResponse.js'; +import CrossOriginBrowserWindow from '../window/CrossOriginBrowserWindow.js'; +import Response from '../fetch/Response.js'; import IGoToOptions from './types/IGoToOptions.js'; import { Script } from 'vm'; import BrowserFrameURL from './utilities/BrowserFrameURL.js'; @@ -14,7 +13,7 @@ import BrowserFrameNavigator from './utilities/BrowserFrameNavigator.js'; import IReloadOptions from './types/IReloadOptions.js'; import BrowserFrameExceptionObserver from './utilities/BrowserFrameExceptionObserver.js'; import BrowserErrorCaptureEnum from './enums/BrowserErrorCaptureEnum.js'; -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; /** * Browser frame. @@ -28,7 +27,7 @@ export default class BrowserFrame implements IBrowserFrame { public [PropertySymbol.exceptionObserver]: BrowserFrameExceptionObserver | null = null; public [PropertySymbol.listeners]: { navigation: Array<() => void> } = { navigation: [] }; public [PropertySymbol.openerFrame]: IBrowserFrame | null = null; - public [PropertySymbol.openerWindow]: IBrowserWindow | ICrossOriginBrowserWindow | null = null; + public [PropertySymbol.openerWindow]: BrowserWindow | CrossOriginBrowserWindow | null = null; public [PropertySymbol.popup] = false; /** @@ -94,7 +93,7 @@ export default class BrowserFrame implements IBrowserFrame { * * @returns Document. */ - public get document(): IDocument { + public get document(): Document { return this.window?.document ?? null; } @@ -151,7 +150,7 @@ export default class BrowserFrame implements IBrowserFrame { * @param [options] Options. * @returns Response. */ - public goto(url: string, options?: IGoToOptions): Promise { + public goto(url: string, options?: IGoToOptions): Promise { return BrowserFrameNavigator.navigate({ windowClass: BrowserWindow, frame: this, @@ -166,7 +165,7 @@ export default class BrowserFrame implements IBrowserFrame { * @param [options] Options. * @returns Response. */ - public reload(options: IReloadOptions): Promise { + public reload(options: IReloadOptions): Promise { return BrowserFrameNavigator.navigate({ windowClass: BrowserWindow, frame: this, diff --git a/packages/happy-dom/src/browser/BrowserPage.ts b/packages/happy-dom/src/browser/BrowserPage.ts index 77c665105..519d20f88 100644 --- a/packages/happy-dom/src/browser/BrowserPage.ts +++ b/packages/happy-dom/src/browser/BrowserPage.ts @@ -6,7 +6,7 @@ import IBrowserPage from './types/IBrowserPage.js'; import BrowserPageUtility from './utilities/BrowserPageUtility.js'; import { Script } from 'vm'; import IGoToOptions from './types/IGoToOptions.js'; -import IResponse from '../fetch/types/IResponse.js'; +import Response from '../fetch/Response.js'; import IReloadOptions from './types/IReloadOptions.js'; import IBrowserPageViewport from './types/IBrowserPageViewport.js'; import IOptionalBrowserPageViewport from './types/IOptionalBrowserPageViewport.js'; @@ -137,7 +137,7 @@ export default class BrowserPage implements IBrowserPage { * @param [options] Options. * @returns Response. */ - public goto(url: string, options?: IGoToOptions): Promise { + public goto(url: string, options?: IGoToOptions): Promise { return this.mainFrame.goto(url, options); } @@ -147,7 +147,7 @@ export default class BrowserPage implements IBrowserPage { * @param [options] Options. * @returns Response. */ - public reload(options: IReloadOptions): Promise { + public reload(options: IReloadOptions): Promise { return this.mainFrame.reload(options); } } diff --git a/packages/happy-dom/src/browser/detached-browser/DetachedBrowser.ts b/packages/happy-dom/src/browser/detached-browser/DetachedBrowser.ts index 4959d35fb..ce28ebced 100644 --- a/packages/happy-dom/src/browser/detached-browser/DetachedBrowser.ts +++ b/packages/happy-dom/src/browser/detached-browser/DetachedBrowser.ts @@ -5,7 +5,7 @@ import BrowserSettingsFactory from '../BrowserSettingsFactory.js'; import DetachedBrowserPage from './DetachedBrowserPage.js'; import IBrowser from '../types/IBrowser.js'; import IBrowserFrame from '../types/IBrowserFrame.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; /** * Detached browser used when constructing a Window instance without a browser. @@ -19,7 +19,7 @@ export default class DetachedBrowser implements IBrowser { public readonly windowClass: new ( browserFrame: IBrowserFrame, options?: { url?: string; width?: number; height?: number } - ) => IBrowserWindow | null; + ) => BrowserWindow | null; /** * Constructor. @@ -33,7 +33,7 @@ export default class DetachedBrowser implements IBrowser { windowClass: new ( browserFrame: IBrowserFrame, options?: { url?: string; width?: number; height?: number } - ) => IBrowserWindow, + ) => BrowserWindow, options?: { settings?: IOptionalBrowserSettings; console?: Console } ) { this.windowClass = windowClass; @@ -62,7 +62,7 @@ export default class DetachedBrowser implements IBrowser { await Promise.all(this.contexts.slice().map((context) => context.close())); (this.contexts) = []; (this.console) = null; - ( IBrowserWindow | null>this.windowClass) = null; + ( BrowserWindow | null>this.windowClass) = null; } /** diff --git a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserContext.ts b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserContext.ts index c1e73419a..a8c8d21f6 100644 --- a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserContext.ts +++ b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserContext.ts @@ -1,7 +1,7 @@ import DetachedBrowser from './DetachedBrowser.js'; import DetachedBrowserPage from './DetachedBrowserPage.js'; import IBrowserContext from '../types/IBrowserContext.js'; -import ICookieContainer from '../../cookie/types/ICookieContainer.js'; +import ICookieContainer from '../../cookie/ICookieContainer.js'; import CookieContainer from '../../cookie/CookieContainer.js'; import ResponseCache from '../../fetch/cache/response/ResponseCache.js'; import IResponseCache from '../../fetch/cache/response/IResponseCache.js'; diff --git a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts index ea2e0c29a..e906b115a 100644 --- a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts +++ b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserFrame.ts @@ -2,18 +2,18 @@ import DetachedBrowserPage from './DetachedBrowserPage.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import AsyncTaskManager from '../../async-task-manager/AsyncTaskManager.js'; import IBrowserFrame from '../types/IBrowserFrame.js'; -import IResponse from '../../fetch/types/IResponse.js'; +import Response from '../../fetch/Response.js'; import IGoToOptions from '../types/IGoToOptions.js'; import { Script } from 'vm'; import BrowserFrameURL from '../utilities/BrowserFrameURL.js'; import BrowserFrameScriptEvaluator from '../utilities/BrowserFrameScriptEvaluator.js'; import BrowserFrameNavigator from '../utilities/BrowserFrameNavigator.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import IReloadOptions from '../types/IReloadOptions.js'; import BrowserErrorCaptureEnum from '../enums/BrowserErrorCaptureEnum.js'; import BrowserFrameExceptionObserver from '../utilities/BrowserFrameExceptionObserver.js'; -import IDocument from '../../nodes/document/IDocument.js'; -import ICrossOriginBrowserWindow from '../../window/ICrossOriginBrowserWindow.js'; +import Document from '../../nodes/document/Document.js'; +import CrossOriginBrowserWindow from '../../window/CrossOriginBrowserWindow.js'; /** * Browser frame used when constructing a Window instance without a browser. @@ -23,12 +23,12 @@ export default class DetachedBrowserFrame implements IBrowserFrame { public readonly parentFrame: DetachedBrowserFrame | null = null; public readonly page: DetachedBrowserPage; // Needs to be injected from the outside when the browser frame is constructed. - public window: IBrowserWindow; + public window: BrowserWindow; public [PropertySymbol.asyncTaskManager] = new AsyncTaskManager(); public [PropertySymbol.exceptionObserver]: BrowserFrameExceptionObserver | null = null; public [PropertySymbol.listeners]: { navigation: Array<() => void> } = { navigation: [] }; public [PropertySymbol.openerFrame]: IBrowserFrame | null = null; - public [PropertySymbol.openerWindow]: IBrowserWindow | ICrossOriginBrowserWindow | null = null; + public [PropertySymbol.openerWindow]: BrowserWindow | CrossOriginBrowserWindow | null = null; public [PropertySymbol.popup] = false; /** @@ -109,7 +109,7 @@ export default class DetachedBrowserFrame implements IBrowserFrame { * * @returns Document. */ - public get document(): IDocument { + public get document(): Document { return this.window?.document ?? null; } @@ -166,7 +166,7 @@ export default class DetachedBrowserFrame implements IBrowserFrame { * @param [options] Options. * @returns Response. */ - public goto(url: string, options?: IGoToOptions): Promise { + public goto(url: string, options?: IGoToOptions): Promise { return BrowserFrameNavigator.navigate({ windowClass: this.page.context.browser.windowClass, frame: this, @@ -181,7 +181,7 @@ export default class DetachedBrowserFrame implements IBrowserFrame { * @param [options] Options. * @returns Response. */ - public reload(options: IReloadOptions): Promise { + public reload(options: IReloadOptions): Promise { return BrowserFrameNavigator.navigate({ windowClass: this.page.context.browser.windowClass, frame: this, diff --git a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserPage.ts b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserPage.ts index 5ff8b32a9..a28033d80 100644 --- a/packages/happy-dom/src/browser/detached-browser/DetachedBrowserPage.ts +++ b/packages/happy-dom/src/browser/detached-browser/DetachedBrowserPage.ts @@ -5,7 +5,7 @@ import VirtualConsole from '../../console/VirtualConsole.js'; import IBrowserPage from '../types/IBrowserPage.js'; import { Script } from 'vm'; import IGoToOptions from '../types/IGoToOptions.js'; -import IResponse from '../../fetch/types/IResponse.js'; +import Response from '../../fetch/Response.js'; import BrowserPageUtility from '../utilities/BrowserPageUtility.js'; import IReloadOptions from '../types/IReloadOptions.js'; import DefaultBrowserPageViewport from '../DefaultBrowserPageViewport.js'; @@ -150,7 +150,7 @@ export default class DetachedBrowserPage implements IBrowserPage { * @param [options] Options. * @returns Response. */ - public goto(url: string, options?: IGoToOptions): Promise { + public goto(url: string, options?: IGoToOptions): Promise { return this.mainFrame.goto(url, options); } @@ -160,7 +160,7 @@ export default class DetachedBrowserPage implements IBrowserPage { * @param [options] Options. * @returns Response. */ - public reload(options: IReloadOptions): Promise { + public reload(options: IReloadOptions): Promise { return this.mainFrame.reload(options); } } diff --git a/packages/happy-dom/src/browser/types/IBrowserContext.ts b/packages/happy-dom/src/browser/types/IBrowserContext.ts index c4b4b01bc..9c13067e6 100644 --- a/packages/happy-dom/src/browser/types/IBrowserContext.ts +++ b/packages/happy-dom/src/browser/types/IBrowserContext.ts @@ -1,4 +1,4 @@ -import ICookieContainer from '../../cookie/types/ICookieContainer.js'; +import ICookieContainer from '../../cookie/ICookieContainer.js'; import IResponseCache from '../../fetch/cache/response/IResponseCache.js'; import IBrowser from './IBrowser.js'; import IBrowserPage from './IBrowserPage.js'; diff --git a/packages/happy-dom/src/browser/types/IBrowserFrame.ts b/packages/happy-dom/src/browser/types/IBrowserFrame.ts index f3dc8d5a1..dd97136ea 100644 --- a/packages/happy-dom/src/browser/types/IBrowserFrame.ts +++ b/packages/happy-dom/src/browser/types/IBrowserFrame.ts @@ -1,14 +1,14 @@ import AsyncTaskManager from '../../async-task-manager/AsyncTaskManager.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; -import IDocument from '../../nodes/document/IDocument.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; +import Document from '../../nodes/document/Document.js'; import IBrowserPage from './IBrowserPage.js'; -import IResponse from '../../fetch/types/IResponse.js'; +import Response from '../../fetch/Response.js'; import IGoToOptions from './IGoToOptions.js'; import { Script } from 'vm'; import IReloadOptions from './IReloadOptions.js'; import BrowserFrameExceptionObserver from '../utilities/BrowserFrameExceptionObserver.js'; -import ICrossOriginBrowserWindow from '../../window/ICrossOriginBrowserWindow.js'; +import CrossOriginBrowserWindow from '../../window/CrossOriginBrowserWindow.js'; /** * Browser frame. @@ -17,15 +17,15 @@ export default interface IBrowserFrame { readonly childFrames: IBrowserFrame[]; readonly parentFrame: IBrowserFrame | null; readonly page: IBrowserPage; - readonly window: IBrowserWindow; - readonly document: IDocument; + readonly window: BrowserWindow; + readonly document: Document; content: string; url: string; [PropertySymbol.asyncTaskManager]: AsyncTaskManager; [PropertySymbol.exceptionObserver]: BrowserFrameExceptionObserver | null; [PropertySymbol.listeners]: { navigation: Array<() => void> }; [PropertySymbol.openerFrame]: IBrowserFrame | null; - [PropertySymbol.openerWindow]: IBrowserWindow | ICrossOriginBrowserWindow | null; + [PropertySymbol.openerWindow]: BrowserWindow | CrossOriginBrowserWindow | null; [PropertySymbol.popup]: boolean; /** @@ -57,12 +57,12 @@ export default interface IBrowserFrame { * @param url URL. * @param [options] Options. */ - goto(url: string, options?: IGoToOptions): Promise; + goto(url: string, options?: IGoToOptions): Promise; /** * Reloads the current frame. * * @param [options] Options. */ - reload(options: IReloadOptions): Promise; + reload(options: IReloadOptions): Promise; } diff --git a/packages/happy-dom/src/browser/types/IBrowserPage.ts b/packages/happy-dom/src/browser/types/IBrowserPage.ts index 3e16ddee9..6a8b844b0 100644 --- a/packages/happy-dom/src/browser/types/IBrowserPage.ts +++ b/packages/happy-dom/src/browser/types/IBrowserPage.ts @@ -4,7 +4,7 @@ import IBrowserFrame from './IBrowserFrame.js'; import IBrowserContext from './IBrowserContext.js'; import { Script } from 'vm'; import IGoToOptions from './IGoToOptions.js'; -import IResponse from '../../fetch/types/IResponse.js'; +import Response from '../../fetch/Response.js'; import IReloadOptions from './IReloadOptions.js'; import IOptionalBrowserPageViewport from './IOptionalBrowserPageViewport.js'; @@ -59,7 +59,7 @@ export default interface IBrowserPage { * @param url URL. * @param [options] Options. */ - goto(url: string, options?: IGoToOptions): Promise; + goto(url: string, options?: IGoToOptions): Promise; /** * Reloads the current page. @@ -67,5 +67,5 @@ export default interface IBrowserPage { * @param [options] Options. * @returns Response. */ - reload(options: IReloadOptions): Promise; + reload(options: IReloadOptions): Promise; } diff --git a/packages/happy-dom/src/browser/utilities/BrowserFrameFactory.ts b/packages/happy-dom/src/browser/utilities/BrowserFrameFactory.ts index 2b7dc2449..b273febab 100644 --- a/packages/happy-dom/src/browser/utilities/BrowserFrameFactory.ts +++ b/packages/happy-dom/src/browser/utilities/BrowserFrameFactory.ts @@ -1,6 +1,6 @@ import IBrowserFrame from '../types/IBrowserFrame.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import IBrowserPage from '../types/IBrowserPage.js'; /** * Browser frame factory. @@ -49,7 +49,7 @@ export default class BrowserFrameFactory { if (frame.window) { frame.window[PropertySymbol.destroy](); (frame.page) = null; - (frame.window) = null; + (frame.window) = null; frame[PropertySymbol.openerFrame] = null; frame[PropertySymbol.openerWindow] = null; } @@ -67,7 +67,7 @@ export default class BrowserFrameFactory { frame.window[PropertySymbol.destroy](); (frame.page) = null; - (frame.window) = null; + (frame.window) = null; frame[PropertySymbol.listeners] = null; frame[PropertySymbol.openerFrame] = null; frame[PropertySymbol.openerWindow] = null; diff --git a/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts b/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts index a966b0cb2..5f6b010ae 100644 --- a/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts +++ b/packages/happy-dom/src/browser/utilities/BrowserFrameNavigator.ts @@ -1,9 +1,9 @@ import IBrowserFrame from '../types/IBrowserFrame.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import IGoToOptions from '../types/IGoToOptions.js'; -import IResponse from '../../fetch/types/IResponse.js'; +import Response from '../../fetch/Response.js'; import DocumentReadyStateManager from '../../nodes/document/DocumentReadyStateManager.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import WindowErrorUtility from '../../window/WindowErrorUtility.js'; import AbortController from '../../fetch/AbortController.js'; import BrowserFrameFactory from './BrowserFrameFactory.js'; @@ -34,13 +34,13 @@ export default class BrowserFrameNavigator { windowClass: new ( browserFrame: IBrowserFrame, options?: { url?: string; width?: number; height?: number } - ) => IBrowserWindow; + ) => BrowserWindow; frame: IBrowserFrame; url: string; goToOptions?: IGoToOptions; method?: string; formData?: FormData; - }): Promise { + }): Promise { const { windowClass, frame, url, formData, method, goToOptions } = options; const referrer = goToOptions?.referrer || frame.window.location.origin; const targetURL = BrowserFrameURL.getRelativeURL(frame, url); @@ -103,7 +103,7 @@ export default class BrowserFrameNavigator { frame[PropertySymbol.asyncTaskManager].destroy(); frame[PropertySymbol.asyncTaskManager] = new AsyncTaskManager(); - (frame.window) = new windowClass(frame, { url: targetURL.href, width, height }); + (frame.window) = new windowClass(frame, { url: targetURL.href, width, height }); (frame.window.devicePixelRatio) = devicePixelRatio; if (referrer) { @@ -121,7 +121,7 @@ export default class BrowserFrameNavigator { readyStateManager.startTask(); const abortController = new AbortController(); - let response: IResponse; + let response: Response; let responseText: string; const timeout = frame.window.setTimeout( diff --git a/packages/happy-dom/src/browser/utilities/BrowserPageUtility.ts b/packages/happy-dom/src/browser/utilities/BrowserPageUtility.ts index d4e2f41ca..d90f25018 100644 --- a/packages/happy-dom/src/browser/utilities/BrowserPageUtility.ts +++ b/packages/happy-dom/src/browser/utilities/BrowserPageUtility.ts @@ -1,6 +1,6 @@ import IBrowserFrame from '../types/IBrowserFrame.js'; import IBrowserPage from '../types/IBrowserPage.js'; -import IVirtualConsolePrinter from '../../console/types/IVirtualConsolePrinter.js'; +import IVirtualConsolePrinter from '../../console/IVirtualConsolePrinter.js'; import IBrowserContext from '../types/IBrowserContext.js'; import BrowserFrameFactory from './BrowserFrameFactory.js'; diff --git a/packages/happy-dom/src/clipboard/Clipboard.ts b/packages/happy-dom/src/clipboard/Clipboard.ts index 9a8b742ca..c69455372 100644 --- a/packages/happy-dom/src/clipboard/Clipboard.ts +++ b/packages/happy-dom/src/clipboard/Clipboard.ts @@ -1,5 +1,5 @@ import DOMException from '../exception/DOMException.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import ClipboardItem from './ClipboardItem.js'; import Blob from '../file/Blob.js'; @@ -10,7 +10,7 @@ import Blob from '../file/Blob.js'; * https://developer.mozilla.org/en-US/docs/Web/API/Clipboard. */ export default class Clipboard { - #ownerWindow: IBrowserWindow; + #ownerWindow: BrowserWindow; #data: ClipboardItem[] = []; /** @@ -18,7 +18,7 @@ export default class Clipboard { * * @param ownerWindow Owner window. */ - constructor(ownerWindow: IBrowserWindow) { + constructor(ownerWindow: BrowserWindow) { this.#ownerWindow = ownerWindow; } diff --git a/packages/happy-dom/src/config/IHTMLElementTagNameMap.ts b/packages/happy-dom/src/config/IHTMLElementTagNameMap.ts index 66cadb725..6c3ab496a 100644 --- a/packages/happy-dom/src/config/IHTMLElementTagNameMap.ts +++ b/packages/happy-dom/src/config/IHTMLElementTagNameMap.ts @@ -1,25 +1,25 @@ -import IHTMLAnchorElement from '../nodes/html-anchor-element/IHTMLAnchorElement.js'; -import IHTMLElement from '../nodes/html-element/IHTMLElement.js'; -import IHTMLAudioElement from '../nodes/html-audio-element/IHTMLAudioElement.js'; -import IHTMLBaseElement from '../nodes/html-base-element/IHTMLBaseElement.js'; -import IHTMLTemplateElement from '../nodes/html-template-element/IHTMLTemplateElement.js'; -import IHTMLFormElement from '../nodes/html-form-element/IHTMLFormElement.js'; -import IHTMLInputElement from '../nodes/html-input-element/IHTMLInputElement.js'; -import IHTMLTextAreaElement from '../nodes/html-text-area-element/IHTMLTextAreaElement.js'; -import IHTMLScriptElement from '../nodes/html-script-element/IHTMLScriptElement.js'; -import IHTMLImageElement from '../nodes/html-image-element/IHTMLImageElement.js'; -import IHTMLLinkElement from '../nodes/html-link-element/IHTMLLinkElement.js'; -import IHTMLStyleElement from '../nodes/html-style-element/IHTMLStyleElement.js'; -import IHTMLLabelElement from '../nodes/html-label-element/IHTMLLabelElement.js'; -import IHTMLSlotElement from '../nodes/html-slot-element/IHTMLSlotElement.js'; -import IHTMLMetaElement from '../nodes/html-meta-element/IHTMLMetaElement.js'; -import IHTMLButtonElement from '../nodes/html-button-element/IHTMLButtonElement.js'; -import IHTMLDialogElement from '../nodes/html-dialog-element/IHTMLDialogElement.js'; -import IHTMLIFrameElement from '../nodes/html-iframe-element/IHTMLIFrameElement.js'; -import IHTMLOptGroupElement from '../nodes/html-opt-group-element/IHTMLOptGroupElement.js'; -import IHTMLOptionElement from '../nodes/html-option-element/IHTMLOptionElement.js'; -import IHTMLSelectElement from '../nodes/html-select-element/IHTMLSelectElement.js'; -import IHTMLVideoElement from '../nodes/html-video-element/IHTMLVideoElement.js'; +import HTMLAnchorElement from '../nodes/html-anchor-element/HTMLAnchorElement.js'; +import HTMLElement from '../nodes/html-element/HTMLElement.js'; +import HTMLAudioElement from '../nodes/html-audio-element/HTMLAudioElement.js'; +import HTMLBaseElement from '../nodes/html-base-element/HTMLBaseElement.js'; +import HTMLTemplateElement from '../nodes/html-template-element/HTMLTemplateElement.js'; +import HTMLFormElement from '../nodes/html-form-element/HTMLFormElement.js'; +import HTMLInputElement from '../nodes/html-input-element/HTMLInputElement.js'; +import HTMLTextAreaElement from '../nodes/html-text-area-element/HTMLTextAreaElement.js'; +import HTMLScriptElement from '../nodes/html-script-element/HTMLScriptElement.js'; +import HTMLImageElement from '../nodes/html-image-element/HTMLImageElement.js'; +import HTMLLinkElement from '../nodes/html-link-element/HTMLLinkElement.js'; +import HTMLStyleElement from '../nodes/html-style-element/HTMLStyleElement.js'; +import HTMLLabelElement from '../nodes/html-label-element/HTMLLabelElement.js'; +import HTMLSlotElement from '../nodes/html-slot-element/HTMLSlotElement.js'; +import HTMLMetaElement from '../nodes/html-meta-element/HTMLMetaElement.js'; +import HTMLButtonElement from '../nodes/html-button-element/HTMLButtonElement.js'; +import HTMLDialogElement from '../nodes/html-dialog-element/HTMLDialogElement.js'; +import HTMLIFrameElement from '../nodes/html-iframe-element/HTMLIFrameElement.js'; +import HTMLOptGroupElement from '../nodes/html-opt-group-element/HTMLOptGroupElement.js'; +import HTMLOptionElement from '../nodes/html-option-element/HTMLOptionElement.js'; +import HTMLSelectElement from '../nodes/html-select-element/HTMLSelectElement.js'; +import HTMLVideoElement from '../nodes/html-video-element/HTMLVideoElement.js'; // Makes it work with custom elements when they declare their own interface. declare global { @@ -31,121 +31,121 @@ declare global { } export default interface IHTMLElementTagNameMap extends HTMLElementTagNameMap { - a: IHTMLAnchorElement; - abbr: IHTMLElement; - address: IHTMLElement; - area: IHTMLElement; - article: IHTMLElement; - aside: IHTMLElement; - audio: IHTMLAudioElement; - b: IHTMLElement; - base: IHTMLBaseElement; - bdi: IHTMLElement; - bdo: IHTMLElement; - blockquaote: IHTMLElement; - body: IHTMLElement; - template: IHTMLTemplateElement; - form: IHTMLFormElement; - input: IHTMLInputElement; - textarea: IHTMLTextAreaElement; - script: IHTMLScriptElement; - img: IHTMLImageElement; - link: IHTMLLinkElement; - style: IHTMLStyleElement; - label: IHTMLLabelElement; - slot: IHTMLSlotElement; - meta: IHTMLMetaElement; - blockquote: IHTMLElement; - br: IHTMLElement; - button: IHTMLButtonElement; - canvas: IHTMLElement; - caption: IHTMLElement; - cite: IHTMLElement; - code: IHTMLElement; - col: IHTMLElement; - colgroup: IHTMLElement; - data: IHTMLElement; - datalist: IHTMLElement; - dd: IHTMLElement; - del: IHTMLElement; - details: IHTMLElement; - dfn: IHTMLElement; - dialog: IHTMLDialogElement; - div: IHTMLElement; - dl: IHTMLElement; - dt: IHTMLElement; - em: IHTMLElement; - embed: IHTMLElement; - fieldset: IHTMLElement; - figcaption: IHTMLElement; - figure: IHTMLElement; - footer: IHTMLElement; - h1: IHTMLElement; - h2: IHTMLElement; - h3: IHTMLElement; - h4: IHTMLElement; - h5: IHTMLElement; - h6: IHTMLElement; - head: IHTMLElement; - header: IHTMLElement; - hgroup: IHTMLElement; - hr: IHTMLElement; - html: IHTMLElement; - i: IHTMLElement; - iframe: IHTMLIFrameElement; - ins: IHTMLElement; - kbd: IHTMLElement; - legend: IHTMLElement; - li: IHTMLElement; - main: IHTMLElement; - map: IHTMLElement; - mark: IHTMLElement; - math: IHTMLElement; - menu: IHTMLElement; - menuitem: IHTMLElement; - meter: IHTMLElement; - nav: IHTMLElement; - noscript: IHTMLElement; - object: IHTMLElement; - ol: IHTMLElement; - optgroup: IHTMLOptGroupElement; - option: IHTMLOptionElement; - output: IHTMLElement; - p: IHTMLElement; - param: IHTMLElement; - picture: IHTMLElement; - pre: IHTMLElement; - progress: IHTMLElement; - q: IHTMLElement; - rb: IHTMLElement; - rp: IHTMLElement; - rt: IHTMLElement; - rtc: IHTMLElement; - ruby: IHTMLElement; - s: IHTMLElement; - samp: IHTMLElement; - section: IHTMLElement; - select: IHTMLSelectElement; - small: IHTMLElement; - source: IHTMLElement; - span: IHTMLElement; - strong: IHTMLElement; - sub: IHTMLElement; - summary: IHTMLElement; - sup: IHTMLElement; - table: IHTMLElement; - tbody: IHTMLElement; - td: IHTMLElement; - tfoot: IHTMLElement; - th: IHTMLElement; - thead: IHTMLElement; - time: IHTMLElement; - title: IHTMLElement; - tr: IHTMLElement; - track: IHTMLElement; - u: IHTMLElement; - ul: IHTMLElement; - var: IHTMLElement; - video: IHTMLVideoElement; - wbr: IHTMLElement; + a: HTMLAnchorElement; + abbr: HTMLElement; + address: HTMLElement; + area: HTMLElement; + article: HTMLElement; + aside: HTMLElement; + audio: HTMLAudioElement; + b: HTMLElement; + base: HTMLBaseElement; + bdi: HTMLElement; + bdo: HTMLElement; + blockquaote: HTMLElement; + body: HTMLElement; + template: HTMLTemplateElement; + form: HTMLFormElement; + input: HTMLInputElement; + textarea: HTMLTextAreaElement; + script: HTMLScriptElement; + img: HTMLImageElement; + link: HTMLLinkElement; + style: HTMLStyleElement; + label: HTMLLabelElement; + slot: HTMLSlotElement; + meta: HTMLMetaElement; + blockquote: HTMLElement; + br: HTMLElement; + button: HTMLButtonElement; + canvas: HTMLElement; + caption: HTMLElement; + cite: HTMLElement; + code: HTMLElement; + col: HTMLElement; + colgroup: HTMLElement; + data: HTMLElement; + datalist: HTMLElement; + dd: HTMLElement; + del: HTMLElement; + details: HTMLElement; + dfn: HTMLElement; + dialog: HTMLDialogElement; + div: HTMLElement; + dl: HTMLElement; + dt: HTMLElement; + em: HTMLElement; + embed: HTMLElement; + fieldset: HTMLElement; + figcaption: HTMLElement; + figure: HTMLElement; + footer: HTMLElement; + h1: HTMLElement; + h2: HTMLElement; + h3: HTMLElement; + h4: HTMLElement; + h5: HTMLElement; + h6: HTMLElement; + head: HTMLElement; + header: HTMLElement; + hgroup: HTMLElement; + hr: HTMLElement; + html: HTMLElement; + i: HTMLElement; + iframe: HTMLIFrameElement; + ins: HTMLElement; + kbd: HTMLElement; + legend: HTMLElement; + li: HTMLElement; + main: HTMLElement; + map: HTMLElement; + mark: HTMLElement; + math: HTMLElement; + menu: HTMLElement; + menuitem: HTMLElement; + meter: HTMLElement; + nav: HTMLElement; + noscript: HTMLElement; + object: HTMLElement; + ol: HTMLElement; + optgroup: HTMLOptGroupElement; + option: HTMLOptionElement; + output: HTMLElement; + p: HTMLElement; + param: HTMLElement; + picture: HTMLElement; + pre: HTMLElement; + progress: HTMLElement; + q: HTMLElement; + rb: HTMLElement; + rp: HTMLElement; + rt: HTMLElement; + rtc: HTMLElement; + ruby: HTMLElement; + s: HTMLElement; + samp: HTMLElement; + section: HTMLElement; + select: HTMLSelectElement; + small: HTMLElement; + source: HTMLElement; + span: HTMLElement; + strong: HTMLElement; + sub: HTMLElement; + summary: HTMLElement; + sup: HTMLElement; + table: HTMLElement; + tbody: HTMLElement; + td: HTMLElement; + tfoot: HTMLElement; + th: HTMLElement; + thead: HTMLElement; + time: HTMLElement; + title: HTMLElement; + tr: HTMLElement; + track: HTMLElement; + u: HTMLElement; + ul: HTMLElement; + var: HTMLElement; + video: HTMLVideoElement; + wbr: HTMLElement; } diff --git a/packages/happy-dom/src/config/ISVGElementTagNameMap.ts b/packages/happy-dom/src/config/ISVGElementTagNameMap.ts index f2f155a00..50fd091f1 100644 --- a/packages/happy-dom/src/config/ISVGElementTagNameMap.ts +++ b/packages/happy-dom/src/config/ISVGElementTagNameMap.ts @@ -1,67 +1,67 @@ -import ISVGSVGElement from '../nodes/svg-element/ISVGSVGElement.js'; -import ISVGElement from '../nodes/svg-element/ISVGElement.js'; +import SVGSVGElement from '../nodes/svg-element/SVGSVGElement.js'; +import SVGElement from '../nodes/svg-element/SVGElement.js'; export default interface ISVGElementTagNameMap { - svg: ISVGSVGElement; - animate: ISVGElement; - animateMotion: ISVGElement; - animateTransform: ISVGElement; - circle: ISVGElement; - clipPath: ISVGElement; - defs: ISVGElement; - desc: ISVGElement; - ellipse: ISVGElement; - feBlend: ISVGElement; - feColorMatrix: ISVGElement; - feComponentTransfer: ISVGElement; - feComposite: ISVGElement; - feConvolveMatrix: ISVGElement; - feDiffuseLighting: ISVGElement; - feDisplacementMap: ISVGElement; - feDistantLight: ISVGElement; - feDropShadow: ISVGElement; - feFlood: ISVGElement; - feFuncA: ISVGElement; - feFuncB: ISVGElement; - feFuncG: ISVGElement; - feFuncR: ISVGElement; - feGaussianBlur: ISVGElement; - feImage: ISVGElement; - feMerge: ISVGElement; - feMergeNode: ISVGElement; - feMorphology: ISVGElement; - feOffset: ISVGElement; - fePointLight: ISVGElement; - feSpecularLighting: ISVGElement; - feSpotLight: ISVGElement; - feTile: ISVGElement; - feTurbulence: ISVGElement; - filter: ISVGElement; - foreignObject: ISVGElement; - g: ISVGElement; - image: ISVGElement; - line: ISVGElement; - linearGradient: ISVGElement; - marker: ISVGElement; - mask: ISVGElement; - metadata: ISVGElement; - mpath: ISVGElement; - path: ISVGElement; - pattern: ISVGElement; - polygon: ISVGElement; - polyline: ISVGElement; - radialGradient: ISVGElement; - rect: ISVGElement; - script: ISVGElement; - set: ISVGElement; - stop: ISVGElement; - style: ISVGElement; - switch: ISVGElement; - symbol: ISVGElement; - text: ISVGElement; - textPath: ISVGElement; - title: ISVGElement; - tspan: ISVGElement; - use: ISVGElement; - view: ISVGElement; + svg: SVGSVGElement; + animate: SVGElement; + animateMotion: SVGElement; + animateTransform: SVGElement; + circle: SVGElement; + clipPath: SVGElement; + defs: SVGElement; + desc: SVGElement; + ellipse: SVGElement; + feBlend: SVGElement; + feColorMatrix: SVGElement; + feComponentTransfer: SVGElement; + feComposite: SVGElement; + feConvolveMatrix: SVGElement; + feDiffuseLighting: SVGElement; + feDisplacementMap: SVGElement; + feDistantLight: SVGElement; + feDropShadow: SVGElement; + feFlood: SVGElement; + feFuncA: SVGElement; + feFuncB: SVGElement; + feFuncG: SVGElement; + feFuncR: SVGElement; + feGaussianBlur: SVGElement; + feImage: SVGElement; + feMerge: SVGElement; + feMergeNode: SVGElement; + feMorphology: SVGElement; + feOffset: SVGElement; + fePointLight: SVGElement; + feSpecularLighting: SVGElement; + feSpotLight: SVGElement; + feTile: SVGElement; + feTurbulence: SVGElement; + filter: SVGElement; + foreignObject: SVGElement; + g: SVGElement; + image: SVGElement; + line: SVGElement; + linearGradient: SVGElement; + marker: SVGElement; + mask: SVGElement; + metadata: SVGElement; + mpath: SVGElement; + path: SVGElement; + pattern: SVGElement; + polygon: SVGElement; + polyline: SVGElement; + radialGradient: SVGElement; + rect: SVGElement; + script: SVGElement; + set: SVGElement; + stop: SVGElement; + style: SVGElement; + switch: SVGElement; + symbol: SVGElement; + text: SVGElement; + textPath: SVGElement; + title: SVGElement; + tspan: SVGElement; + use: SVGElement; + view: SVGElement; } diff --git a/packages/happy-dom/src/console/types/IVirtualConsoleLogEntry.ts b/packages/happy-dom/src/console/IVirtualConsoleLogEntry.ts similarity index 62% rename from packages/happy-dom/src/console/types/IVirtualConsoleLogEntry.ts rename to packages/happy-dom/src/console/IVirtualConsoleLogEntry.ts index 11b4ab699..39233e378 100644 --- a/packages/happy-dom/src/console/types/IVirtualConsoleLogEntry.ts +++ b/packages/happy-dom/src/console/IVirtualConsoleLogEntry.ts @@ -1,6 +1,6 @@ import IVirtualConsoleLogGroup from './IVirtualConsoleLogGroup.js'; -import VirtualConsoleLogLevelEnum from '../enums/VirtualConsoleLogLevelEnum.js'; -import VirtualConsoleLogTypeEnum from '../enums/VirtualConsoleLogTypeEnum.js'; +import VirtualConsoleLogLevelEnum from './enums/VirtualConsoleLogLevelEnum.js'; +import VirtualConsoleLogTypeEnum from './enums/VirtualConsoleLogTypeEnum.js'; export default interface IVirtualConsoleLogEntry { type: VirtualConsoleLogTypeEnum; diff --git a/packages/happy-dom/src/console/types/IVirtualConsoleLogGroup.ts b/packages/happy-dom/src/console/IVirtualConsoleLogGroup.ts similarity index 100% rename from packages/happy-dom/src/console/types/IVirtualConsoleLogGroup.ts rename to packages/happy-dom/src/console/IVirtualConsoleLogGroup.ts diff --git a/packages/happy-dom/src/console/types/IVirtualConsolePrinter.ts b/packages/happy-dom/src/console/IVirtualConsolePrinter.ts similarity index 90% rename from packages/happy-dom/src/console/types/IVirtualConsolePrinter.ts rename to packages/happy-dom/src/console/IVirtualConsolePrinter.ts index cdb002892..f31f7c2a2 100644 --- a/packages/happy-dom/src/console/types/IVirtualConsolePrinter.ts +++ b/packages/happy-dom/src/console/IVirtualConsolePrinter.ts @@ -1,6 +1,6 @@ import IVirtualConsoleLogEntry from './IVirtualConsoleLogEntry.js'; -import VirtualConsoleLogLevelEnum from '../enums/VirtualConsoleLogLevelEnum.js'; -import Event from '../../event/Event.js'; +import VirtualConsoleLogLevelEnum from './enums/VirtualConsoleLogLevelEnum.js'; +import Event from '../event/Event.js'; /** * Virtual console printer. diff --git a/packages/happy-dom/src/console/VirtualConsole.ts b/packages/happy-dom/src/console/VirtualConsole.ts index d227124d7..e5d031cbd 100644 --- a/packages/happy-dom/src/console/VirtualConsole.ts +++ b/packages/happy-dom/src/console/VirtualConsole.ts @@ -1,7 +1,7 @@ -import IVirtualConsolePrinter from './types/IVirtualConsolePrinter.js'; +import IVirtualConsolePrinter from './IVirtualConsolePrinter.js'; import VirtualConsoleLogLevelEnum from './enums/VirtualConsoleLogLevelEnum.js'; import VirtualConsoleLogTypeEnum from './enums/VirtualConsoleLogTypeEnum.js'; -import IVirtualConsoleLogGroup from './types/IVirtualConsoleLogGroup.js'; +import IVirtualConsoleLogGroup from './IVirtualConsoleLogGroup.js'; import { ConsoleConstructor } from 'console'; /** diff --git a/packages/happy-dom/src/console/VirtualConsolePrinter.ts b/packages/happy-dom/src/console/VirtualConsolePrinter.ts index 6b477b806..9c4b5bb5d 100644 --- a/packages/happy-dom/src/console/VirtualConsolePrinter.ts +++ b/packages/happy-dom/src/console/VirtualConsolePrinter.ts @@ -1,8 +1,8 @@ -import IVirtualConsoleLogEntry from './types/IVirtualConsoleLogEntry.js'; +import IVirtualConsoleLogEntry from './IVirtualConsoleLogEntry.js'; import VirtualConsoleLogLevelEnum from './enums/VirtualConsoleLogLevelEnum.js'; import Event from '../event/Event.js'; import VirtualConsoleLogEntryStringifier from './utilities/VirtualConsoleLogEntryStringifier.js'; -import IVirtualConsolePrinter from './types/IVirtualConsolePrinter.js'; +import IVirtualConsolePrinter from './IVirtualConsolePrinter.js'; /** * Virtual console printer. diff --git a/packages/happy-dom/src/console/utilities/VirtualConsoleLogEntryStringifier.ts b/packages/happy-dom/src/console/utilities/VirtualConsoleLogEntryStringifier.ts index e04f00f7a..ea31468cf 100644 --- a/packages/happy-dom/src/console/utilities/VirtualConsoleLogEntryStringifier.ts +++ b/packages/happy-dom/src/console/utilities/VirtualConsoleLogEntryStringifier.ts @@ -1,4 +1,4 @@ -import IVirtualConsoleLogEntry from '../types/IVirtualConsoleLogEntry.js'; +import IVirtualConsoleLogEntry from '../IVirtualConsoleLogEntry.js'; import VirtualConsoleLogTypeEnum from '../enums/VirtualConsoleLogTypeEnum.js'; /** diff --git a/packages/happy-dom/src/cookie/CookieContainer.ts b/packages/happy-dom/src/cookie/CookieContainer.ts index 3f880303c..4d36b864f 100644 --- a/packages/happy-dom/src/cookie/CookieContainer.ts +++ b/packages/happy-dom/src/cookie/CookieContainer.ts @@ -1,6 +1,6 @@ import URL from '../url/URL.js'; -import ICookie from './types/ICookie.js'; -import ICookieContainer from './types/ICookieContainer.js'; +import ICookie from './ICookie.js'; +import ICookieContainer from './ICookieContainer.js'; import CookieExpireUtility from './urilities/CookieExpireUtility.js'; import CookieURLUtility from './urilities/CookieURLUtility.js'; diff --git a/packages/happy-dom/src/cookie/types/ICookie.ts b/packages/happy-dom/src/cookie/ICookie.ts similarity index 78% rename from packages/happy-dom/src/cookie/types/ICookie.ts rename to packages/happy-dom/src/cookie/ICookie.ts index 35bbea971..1818b2c74 100644 --- a/packages/happy-dom/src/cookie/types/ICookie.ts +++ b/packages/happy-dom/src/cookie/ICookie.ts @@ -1,4 +1,4 @@ -import CookieSameSiteEnum from '../enums/CookieSameSiteEnum.js'; +import CookieSameSiteEnum from './enums/CookieSameSiteEnum.js'; export default interface ICookie { // Required diff --git a/packages/happy-dom/src/cookie/types/ICookieContainer.ts b/packages/happy-dom/src/cookie/ICookieContainer.ts similarity index 87% rename from packages/happy-dom/src/cookie/types/ICookieContainer.ts rename to packages/happy-dom/src/cookie/ICookieContainer.ts index 3fb79eefa..438e8e236 100644 --- a/packages/happy-dom/src/cookie/types/ICookieContainer.ts +++ b/packages/happy-dom/src/cookie/ICookieContainer.ts @@ -1,5 +1,5 @@ -import URL from '../../url/URL.js'; -import ICookie from '../types/ICookie.js'; +import URL from '../url/URL.js'; +import ICookie from './ICookie.js'; /** * Cookie Container. diff --git a/packages/happy-dom/src/cookie/urilities/CookieExpireUtility.ts b/packages/happy-dom/src/cookie/urilities/CookieExpireUtility.ts index 835d5f48d..818f81abf 100644 --- a/packages/happy-dom/src/cookie/urilities/CookieExpireUtility.ts +++ b/packages/happy-dom/src/cookie/urilities/CookieExpireUtility.ts @@ -1,4 +1,4 @@ -import ICookie from '../types/ICookie.js'; +import ICookie from '../ICookie.js'; /** * Cookie expire utility. diff --git a/packages/happy-dom/src/cookie/urilities/CookieStringUtility.ts b/packages/happy-dom/src/cookie/urilities/CookieStringUtility.ts index f3370904f..c7f66e859 100644 --- a/packages/happy-dom/src/cookie/urilities/CookieStringUtility.ts +++ b/packages/happy-dom/src/cookie/urilities/CookieStringUtility.ts @@ -1,6 +1,6 @@ import CookieSameSiteEnum from '../enums/CookieSameSiteEnum.js'; import URL from '../../url/URL.js'; -import ICookie from '../types/ICookie.js'; +import ICookie from '../ICookie.js'; /** * Cookie string. diff --git a/packages/happy-dom/src/cookie/urilities/CookieURLUtility.ts b/packages/happy-dom/src/cookie/urilities/CookieURLUtility.ts index efc4dda8f..823f74b94 100644 --- a/packages/happy-dom/src/cookie/urilities/CookieURLUtility.ts +++ b/packages/happy-dom/src/cookie/urilities/CookieURLUtility.ts @@ -1,6 +1,6 @@ import CookieSameSiteEnum from '../enums/CookieSameSiteEnum.js'; import URL from '../../url/URL.js'; -import ICookie from '../types/ICookie.js'; +import ICookie from '../ICookie.js'; /** * Cookie string. diff --git a/packages/happy-dom/src/css/declaration/AbstractCSSStyleDeclaration.ts b/packages/happy-dom/src/css/declaration/AbstractCSSStyleDeclaration.ts index 073116e70..96ec4e38b 100644 --- a/packages/happy-dom/src/css/declaration/AbstractCSSStyleDeclaration.ts +++ b/packages/happy-dom/src/css/declaration/AbstractCSSStyleDeclaration.ts @@ -1,6 +1,6 @@ -import IElement from '../../nodes/element/IElement.js'; +import Element from '../../nodes/element/Element.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IAttr from '../../nodes/attr/IAttr.js'; +import Attr from '../../nodes/attr/Attr.js'; import CSSRule from '../CSSRule.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; import DOMException from '../../exception/DOMException.js'; @@ -14,7 +14,7 @@ import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; export default abstract class AbstractCSSStyleDeclaration { public readonly parentRule: CSSRule = null; #style: CSSStyleDeclarationPropertyManager = null; - #ownerElement: IElement; + #ownerElement: Element; #computed: boolean; #elementStyle: CSSStyleDeclarationElementStyle = null; @@ -24,7 +24,7 @@ export default abstract class AbstractCSSStyleDeclaration { * @param [ownerElement] Computed style element. * @param [computed] Computed. */ - constructor(ownerElement: IElement = null, computed = false) { + constructor(ownerElement: Element = null, computed = false) { this.#style = !ownerElement ? new CSSStyleDeclarationPropertyManager() : null; this.#ownerElement = ownerElement; this.#computed = ownerElement ? computed : false; @@ -79,7 +79,7 @@ export default abstract class AbstractCSSStyleDeclaration { if (this.#ownerElement) { const style = new CSSStyleDeclarationPropertyManager({ cssText }); - let styleAttribute = this.#ownerElement[PropertySymbol.attributes]['style']; + let styleAttribute = this.#ownerElement[PropertySymbol.attributes]['style']; if (!styleAttribute) { styleAttribute = this.#ownerElement[PropertySymbol.ownerDocument].createAttribute('style'); @@ -136,7 +136,7 @@ export default abstract class AbstractCSSStyleDeclaration { if (!stringValue) { this.removeProperty(name); } else if (this.#ownerElement) { - let styleAttribute = this.#ownerElement[PropertySymbol.attributes]['style']; + let styleAttribute = this.#ownerElement[PropertySymbol.attributes]['style']; if (!styleAttribute) { styleAttribute = this.#ownerElement[PropertySymbol.ownerDocument].createAttribute('style'); @@ -185,7 +185,7 @@ export default abstract class AbstractCSSStyleDeclaration { } if (newCSSText) { - (this.#ownerElement[PropertySymbol.attributes]['style'])[PropertySymbol.value] = + (this.#ownerElement[PropertySymbol.attributes]['style'])[PropertySymbol.value] = newCSSText; } else { // We use "[PropertySymbol.removeNamedItemWithoutConsequences]" here to avoid triggering setting "Element.style.cssText" when setting the "style" attribute. diff --git a/packages/happy-dom/src/css/declaration/element-style/CSSStyleDeclarationElementStyle.ts b/packages/happy-dom/src/css/declaration/element-style/CSSStyleDeclarationElementStyle.ts index b3152020a..e01d394b0 100644 --- a/packages/happy-dom/src/css/declaration/element-style/CSSStyleDeclarationElementStyle.ts +++ b/packages/happy-dom/src/css/declaration/element-style/CSSStyleDeclarationElementStyle.ts @@ -1,9 +1,9 @@ -import IShadowRoot from '../../../nodes/shadow-root/IShadowRoot.js'; +import ShadowRoot from '../../../nodes/shadow-root/ShadowRoot.js'; import * as PropertySymbol from '../../../PropertySymbol.js'; -import IElement from '../../../nodes/element/IElement.js'; -import IDocument from '../../../nodes/document/IDocument.js'; -import IHTMLStyleElement from '../../../nodes/html-style-element/IHTMLStyleElement.js'; -import INodeList from '../../../nodes/node/INodeList.js'; +import Element from '../../../nodes/element/Element.js'; +import Document from '../../../nodes/document/Document.js'; +import HTMLStyleElement from '../../../nodes/html-style-element/HTMLStyleElement.js'; +import NodeList from '../../../nodes/node/NodeList.js'; import CSSStyleDeclarationPropertyManager from '../property-manager/CSSStyleDeclarationPropertyManager.js'; import NodeTypeEnum from '../../../nodes/node/NodeTypeEnum.js'; import CSSRuleTypeEnum from '../../CSSRuleTypeEnum.js'; @@ -23,7 +23,7 @@ const CSS_VARIABLE_REGEXP = /var\( *(--[^), ]+)\)|var\( *(--[^), ]+), *([^), ]+) const CSS_MEASUREMENT_REGEXP = /[0-9.]+(px|rem|em|vw|vh|%|vmin|vmax|cm|mm|in|pt|pc|Q)/g; type IStyleAndElement = { - element: IElement | IShadowRoot | IDocument; + element: Element | ShadowRoot | Document; cssTexts: Array<{ cssText: string; priorityWeight: number }>; }; @@ -41,7 +41,7 @@ export default class CSSStyleDeclarationElementStyle { documentCacheID: null }; - private element: IElement; + private element: Element; private computed: boolean; /** @@ -50,7 +50,7 @@ export default class CSSStyleDeclarationElementStyle { * @param element Element. * @param [computed] Computed. */ - constructor(element: IElement, computed = false) { + constructor(element: Element, computed = false) { this.element = element; this.computed = computed; } @@ -89,7 +89,7 @@ export default class CSSStyleDeclarationElementStyle { const documentElements: Array = []; const parentElements: Array = []; let styleAndElement: IStyleAndElement = { - element: this.element, + element: this.element, cssTexts: [] }; let shadowRootElements: Array = []; @@ -121,7 +121,7 @@ export default class CSSStyleDeclarationElementStyle { } if (styleAndElement.element === this.element[PropertySymbol.ownerDocument]) { - const styleSheets = >( + const styleSheets = >( this.element[PropertySymbol.ownerDocument].querySelectorAll( 'style,link[rel="stylesheet"]' ) @@ -147,15 +147,15 @@ export default class CSSStyleDeclarationElementStyle { styleAndElement = { element: null, cssTexts: [] }; } else if ( styleAndElement.element[PropertySymbol.nodeType] === NodeTypeEnum.documentFragmentNode && - (styleAndElement.element).host + (styleAndElement.element).host ) { - const shadowRoot = styleAndElement.element; - const styleSheets = >( + const shadowRoot = styleAndElement.element; + const styleSheets = >( shadowRoot.querySelectorAll('style,link[rel="stylesheet"]') ); styleAndElement = { - element: shadowRoot.host, + element: shadowRoot.host, cssTexts: [] }; @@ -181,7 +181,7 @@ export default class CSSStyleDeclarationElementStyle { shadowRootElements = []; } else { styleAndElement = { - element: styleAndElement.element[PropertySymbol.parentNode], + element: styleAndElement.element[PropertySymbol.parentNode], cssTexts: [] }; } @@ -200,35 +200,35 @@ export default class CSSStyleDeclarationElementStyle { let elementCSSText = ''; if ( CSSStyleDeclarationElementDefaultCSS[ - (parentElement.element)[PropertySymbol.tagName] + (parentElement.element)[PropertySymbol.tagName] ] ) { if ( typeof CSSStyleDeclarationElementDefaultCSS[ - (parentElement.element)[PropertySymbol.tagName] + (parentElement.element)[PropertySymbol.tagName] ] === 'string' ) { elementCSSText += CSSStyleDeclarationElementDefaultCSS[ - (parentElement.element)[PropertySymbol.tagName] + (parentElement.element)[PropertySymbol.tagName] ]; } else { for (const key of Object.keys( CSSStyleDeclarationElementDefaultCSS[ - (parentElement.element)[PropertySymbol.tagName] + (parentElement.element)[PropertySymbol.tagName] ] )) { if (key === 'default' || !!parentElement.element[key]) { elementCSSText += CSSStyleDeclarationElementDefaultCSS[ - (parentElement.element)[PropertySymbol.tagName] + (parentElement.element)[PropertySymbol.tagName] ][key]; } } } elementCSSText += CSSStyleDeclarationElementDefaultCSS[ - (parentElement.element)[PropertySymbol.tagName] + (parentElement.element)[PropertySymbol.tagName] ]; } @@ -236,7 +236,7 @@ export default class CSSStyleDeclarationElementStyle { elementCSSText += cssText.cssText; } - const elementStyleAttribute = (parentElement.element)[PropertySymbol.attributes][ + const elementStyleAttribute = (parentElement.element)[PropertySymbol.attributes][ 'style' ]; if (elementStyleAttribute) { @@ -265,7 +265,7 @@ export default class CSSStyleDeclarationElementStyle { parentFontSize, parentSize: parentFontSize }); - if ((parentElement.element)[PropertySymbol.tagName] === 'HTML') { + if ((parentElement.element)[PropertySymbol.tagName] === 'HTML') { rootFontSize = parsedValue; } else if (parentElement !== targetElement) { parentFontSize = parsedValue; @@ -328,7 +328,7 @@ export default class CSSStyleDeclarationElementStyle { } } else { for (const element of options.elements) { - const matchResult = QuerySelector.match(element.element, selectorText); + const matchResult = QuerySelector.match(element.element, selectorText); if (matchResult) { element.cssTexts.push({ cssText: (rule)[PropertySymbol.cssText], diff --git a/packages/happy-dom/src/css/declaration/measurement-converter/CSSMeasurementConverter.ts b/packages/happy-dom/src/css/declaration/measurement-converter/CSSMeasurementConverter.ts index 30566ac65..d3fd2b28e 100644 --- a/packages/happy-dom/src/css/declaration/measurement-converter/CSSMeasurementConverter.ts +++ b/packages/happy-dom/src/css/declaration/measurement-converter/CSSMeasurementConverter.ts @@ -1,4 +1,4 @@ -import IBrowserWindow from '../../../window/IBrowserWindow.js'; +import BrowserWindow from '../../../window/BrowserWindow.js'; /** * CSS Measurement Converter. @@ -16,7 +16,7 @@ export default class CSSMeasurementConverter { * @returns Measurement in pixels. */ public static toPixels(options: { - ownerWindow: IBrowserWindow; + ownerWindow: BrowserWindow; value: string; rootFontSize: string | number; parentFontSize: string | number; diff --git a/packages/happy-dom/src/custom-element/CustomElementRegistry.ts b/packages/happy-dom/src/custom-element/CustomElementRegistry.ts index 053034306..041f4df03 100644 --- a/packages/happy-dom/src/custom-element/CustomElementRegistry.ts +++ b/packages/happy-dom/src/custom-element/CustomElementRegistry.ts @@ -2,7 +2,7 @@ import DOMException from '../exception/DOMException.js'; import * as PropertySymbol from '../PropertySymbol.js'; import HTMLElement from '../nodes/html-element/HTMLElement.js'; import Node from '../nodes/node/Node.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import NamespaceURI from '../config/NamespaceURI.js'; /** @@ -14,14 +14,14 @@ export default class CustomElementRegistry { } = {}; public [PropertySymbol.registedClass]: Map = new Map(); public [PropertySymbol.callbacks]: { [k: string]: (() => void)[] } = {}; - #window: IBrowserWindow; + #window: BrowserWindow; /** * Constructor. * * @param window Window. */ - constructor(window: IBrowserWindow) { + constructor(window: BrowserWindow) { this.#window = window; } diff --git a/packages/happy-dom/src/dom-implementation/DOMImplementation.ts b/packages/happy-dom/src/dom-implementation/DOMImplementation.ts index c7d59e650..2055b3412 100644 --- a/packages/happy-dom/src/dom-implementation/DOMImplementation.ts +++ b/packages/happy-dom/src/dom-implementation/DOMImplementation.ts @@ -1,20 +1,20 @@ import DocumentType from '../nodes/document-type/DocumentType.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; import NodeFactory from '../nodes/NodeFactory.js'; /** * The DOMImplementation interface represents an object providing methods which are not dependent on any particular document. Such an object is returned by the. */ export default class DOMImplementation { - #document: IDocument; + #document: Document; /** * Constructor. * * @param window Window. */ - constructor(window: IDocument) { + constructor(window: Document) { this.#document = window; } @@ -23,14 +23,14 @@ export default class DOMImplementation { * * TODO: Not fully implemented. */ - public createDocument(): IDocument { + public createDocument(): Document { return new this.#document[PropertySymbol.ownerWindow].HTMLDocument(); } /** * Creates and returns an HTML Document. */ - public createHTMLDocument(): IDocument { + public createHTMLDocument(): Document { return new this.#document[PropertySymbol.ownerWindow].HTMLDocument(); } diff --git a/packages/happy-dom/src/dom-parser/DOMParser.ts b/packages/happy-dom/src/dom-parser/DOMParser.ts index ebb25baa0..3ee3e29d5 100644 --- a/packages/happy-dom/src/dom-parser/DOMParser.ts +++ b/packages/happy-dom/src/dom-parser/DOMParser.ts @@ -1,9 +1,9 @@ -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; import * as PropertySymbol from '../PropertySymbol.js'; import XMLParser from '../xml-parser/XMLParser.js'; import DOMException from '../exception/DOMException.js'; import DocumentFragment from '../nodes/document-fragment/DocumentFragment.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; /** @@ -13,14 +13,14 @@ import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; * https://developer.mozilla.org/en-US/docs/Web/API/DOMParser. */ export default class DOMParser { - readonly #window: IBrowserWindow; + readonly #window: BrowserWindow; /** * Constructor. * * @param window Window. */ - constructor(window: IBrowserWindow) { + constructor(window: BrowserWindow) { this.#window = window; } @@ -31,12 +31,12 @@ export default class DOMParser { * @param mimeType Mime type. * @returns Root element. */ - public parseFromString(string: string, mimeType: string): IDocument { + public parseFromString(string: string, mimeType: string): Document { if (!mimeType) { throw new DOMException('Second parameter "mimeType" is mandatory.'); } - const newDocument = this.#createDocument(mimeType); + const newDocument = this.#createDocument(mimeType); newDocument[PropertySymbol.childNodes].length = 0; newDocument[PropertySymbol.children].length = 0; @@ -102,9 +102,9 @@ export default class DOMParser { /** * * @param mimeType Mime type. - * @returns IDocument. + * @returns Document. */ - #createDocument(mimeType: string): IDocument { + #createDocument(mimeType: string): Document { switch (mimeType) { case 'text/html': return new this.#window.HTMLDocument(); diff --git a/packages/happy-dom/src/dom-token-list/DOMTokenList.ts b/packages/happy-dom/src/dom-token-list/DOMTokenList.ts index a36a24102..df482b55a 100644 --- a/packages/happy-dom/src/dom-token-list/DOMTokenList.ts +++ b/packages/happy-dom/src/dom-token-list/DOMTokenList.ts @@ -1,6 +1,5 @@ import Element from '../nodes/element/Element.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IDOMTokenList from './IDOMTokenList.js'; const ATTRIBUTE_SPLIT_REGEXP = /[\t\f\n\r ]+/; @@ -10,7 +9,7 @@ const ATTRIBUTE_SPLIT_REGEXP = /[\t\f\n\r ]+/; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/DOMTokenList. */ -export default class DOMTokenList implements IDOMTokenList { +export default class DOMTokenList { #length = 0; #ownerElement: Element; #attributeName: string; diff --git a/packages/happy-dom/src/dom-token-list/IDOMTokenList.ts b/packages/happy-dom/src/dom-token-list/IDOMTokenList.ts deleted file mode 100644 index d677cc577..000000000 --- a/packages/happy-dom/src/dom-token-list/IDOMTokenList.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * IDOMTokenList. - */ -export default interface IDOMTokenList { - value: string; - readonly length: number; - item(index: number | string): string; - contains(token: string): boolean; - add(...tokens: string[]): void; - remove(...tokens: string[]): void; - toggle(token: string, force?: boolean): boolean; - replace(token: string, newToken: string): boolean; - supports(token: string): boolean; - - values(): IterableIterator; - entries(): IterableIterator<[number, string]>; - forEach(callback: (currentValue, currentIndex, listObj) => void, thisArg?: this): void; - keys(): IterableIterator; - toString(): string; -} diff --git a/packages/happy-dom/src/event/Event.ts b/packages/happy-dom/src/event/Event.ts index e76d6cfa9..a5f75b19d 100644 --- a/packages/happy-dom/src/event/Event.ts +++ b/packages/happy-dom/src/event/Event.ts @@ -1,12 +1,12 @@ import IEventInit from './IEventInit.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import INode from '../nodes/node/INode.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; -import IShadowRoot from '../nodes/shadow-root/IShadowRoot.js'; -import IEventTarget from './IEventTarget.js'; +import Node from '../nodes/node/Node.js'; +import BrowserWindow from '../window/BrowserWindow.js'; +import ShadowRoot from '../nodes/shadow-root/ShadowRoot.js'; +import EventTarget from './EventTarget.js'; import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; import EventPhaseEnum from './EventPhaseEnum.js'; -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; /** * Event. @@ -26,8 +26,8 @@ export default class Event { public [PropertySymbol.immediatePropagationStopped] = false; public [PropertySymbol.propagationStopped] = false; - public [PropertySymbol.target]: IEventTarget = null; - public [PropertySymbol.currentTarget]: IEventTarget = null; + public [PropertySymbol.target]: EventTarget = null; + public [PropertySymbol.currentTarget]: EventTarget = null; public [PropertySymbol.isInPassiveEventListener] = false; /** @@ -49,7 +49,7 @@ export default class Event { * * @returns Target. */ - public get target(): IEventTarget { + public get target(): EventTarget { return this[PropertySymbol.target]; } @@ -58,7 +58,7 @@ export default class Event { * * @returns Target. */ - public get currentTarget(): IEventTarget { + public get currentTarget(): EventTarget { return this[PropertySymbol.currentTarget]; } @@ -76,29 +76,29 @@ export default class Event { * * @returns Composed path. */ - public composedPath(): IEventTarget[] { + public composedPath(): EventTarget[] { if (!this[PropertySymbol.target]) { return []; } const composedPath = []; - let eventTarget: INode | IShadowRoot | IBrowserWindow = ( + let eventTarget: Node | ShadowRoot | BrowserWindow = ( (this[PropertySymbol.target]) ); while (eventTarget) { composedPath.push(eventTarget); - if (((eventTarget)).parentNode) { - eventTarget = ((eventTarget)).parentNode; + if (((eventTarget)).parentNode) { + eventTarget = ((eventTarget)).parentNode; } else if ( this.composed && - (eventTarget)[PropertySymbol.nodeType] === NodeTypeEnum.documentFragmentNode && - (eventTarget).host + (eventTarget)[PropertySymbol.nodeType] === NodeTypeEnum.documentFragmentNode && + (eventTarget).host ) { - eventTarget = (eventTarget).host; - } else if ((eventTarget)[PropertySymbol.nodeType] === NodeTypeEnum.documentNode) { - eventTarget = ((eventTarget))[PropertySymbol.ownerWindow]; + eventTarget = (eventTarget).host; + } else if ((eventTarget)[PropertySymbol.nodeType] === NodeTypeEnum.documentNode) { + eventTarget = ((eventTarget))[PropertySymbol.ownerWindow]; } else { break; } diff --git a/packages/happy-dom/src/event/EventTarget.ts b/packages/happy-dom/src/event/EventTarget.ts index 9b1e0275e..ea9a43a6d 100644 --- a/packages/happy-dom/src/event/EventTarget.ts +++ b/packages/happy-dom/src/event/EventTarget.ts @@ -1,12 +1,11 @@ import IEventListener from './IEventListener.js'; import * as PropertySymbol from '../PropertySymbol.js'; import Event from './Event.js'; -import IEventTarget from './IEventTarget.js'; import IEventListenerOptions from './IEventListenerOptions.js'; import EventPhaseEnum from './EventPhaseEnum.js'; -import INode from '../nodes/node/INode.js'; -import IDocument from '../nodes/document/IDocument.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import Node from '../nodes/node/Node.js'; +import Document from '../nodes/document/Document.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import WindowErrorUtility from '../window/WindowErrorUtility.js'; import WindowBrowserSettingsReader from '../window/WindowBrowserSettingsReader.js'; import BrowserErrorCaptureEnum from '../browser/enums/BrowserErrorCaptureEnum.js'; @@ -14,7 +13,7 @@ import BrowserErrorCaptureEnum from '../browser/enums/BrowserErrorCaptureEnum.js /** * Handles events. */ -export default abstract class EventTarget implements IEventTarget { +export default abstract class EventTarget { public readonly [PropertySymbol.listeners]: { [k: string]: (((event: Event) => void) | IEventListener)[]; } = {}; @@ -167,7 +166,7 @@ export default abstract class EventTarget implements IEventTarget { // We can end up in a never ending loop if the listener for the error event on Window also throws an error. if ( window && - (this !== window || event.type !== 'error') && + (this !== window || event.type !== 'error') && !browserSettings?.disableErrorCapturing && browserSettings?.errorCapture === BrowserErrorCaptureEnum.tryAndCatch ) { @@ -201,7 +200,7 @@ export default abstract class EventTarget implements IEventTarget { // We can end up in a never ending loop if the listener for the error event on Window also throws an error. if ( window && - (this !== window || event.type !== 'error') && + (this !== window || event.type !== 'error') && !browserSettings?.disableErrorCapturing && browserSettings?.errorCapture === BrowserErrorCaptureEnum.tryAndCatch ) { @@ -278,15 +277,15 @@ export default abstract class EventTarget implements IEventTarget { * * @returns Window. */ - #getWindow(): IBrowserWindow | null { - if (((this))[PropertySymbol.ownerDocument]) { - return ((this))[PropertySymbol.ownerDocument][PropertySymbol.ownerWindow]; + #getWindow(): BrowserWindow | null { + if (((this))[PropertySymbol.ownerDocument]) { + return ((this))[PropertySymbol.ownerDocument][PropertySymbol.ownerWindow]; } - if (((this))[PropertySymbol.ownerWindow]) { - return ((this))[PropertySymbol.ownerWindow]; + if (((this))[PropertySymbol.ownerWindow]) { + return ((this))[PropertySymbol.ownerWindow]; } - if (((this)).document) { - return (this); + if (((this)).document) { + return (this); } return null; } diff --git a/packages/happy-dom/src/event/IEventTarget.ts b/packages/happy-dom/src/event/IEventTarget.ts deleted file mode 100644 index 121c751d7..000000000 --- a/packages/happy-dom/src/event/IEventTarget.ts +++ /dev/null @@ -1,63 +0,0 @@ -import IEventListener from './IEventListener.js'; -import Event from './Event.js'; -import IEventListenerOptions from './IEventListenerOptions.js'; - -/** - * Handles events. - */ -export default interface IEventTarget { - /** - * Return a default description for the EventTarget class. - */ - [Symbol.toStringTag]: string; - - /** - * Adds an event listener. - * - * @param type Event type. - * @param listener Listener. - */ - addEventListener( - type: string, - listener: ((event: Event) => void) | IEventListener, - options?: boolean | IEventListenerOptions - ): void; - - /** - * Adds an event listener. - * - * @param type Event type. - * @param listener Listener. - */ - removeEventListener(type: string, listener: ((event: Event) => void) | IEventListener): void; - - /** - * Dispatches an event. - * - * @param event Event. - * @returns The return value is false if event is cancelable and at least one of the event handlers which handled this event called Event.preventDefault(). - */ - dispatchEvent(event: Event): boolean; - - /** - * Adds an event listener. - * - * This is only supported by IE8- and Opera, but for some reason React uses it and calls it, so therefore we will keep support for it until they stop using it. - * - * @deprecated - * @param type Event type. - * @param listener Listener. - */ - attachEvent(type: string, listener: ((event: Event) => void) | IEventListener): void; - - /** - * Removes an event listener. - * - * This is only supported by IE8- and Opera, but for some reason React uses it and calls it, so therefore we will keep support for it until they stop using it. - * - * @deprecated - * @param type Event type. - * @param listener Listener. - */ - detachEvent(type: string, listener: ((event: Event) => void) | IEventListener): void; -} diff --git a/packages/happy-dom/src/event/IMessagePort.ts b/packages/happy-dom/src/event/IMessagePort.ts index b5d79f470..af9f9a85a 100644 --- a/packages/happy-dom/src/event/IMessagePort.ts +++ b/packages/happy-dom/src/event/IMessagePort.ts @@ -1,11 +1,11 @@ -import IEventTarget from './IEventTarget.js'; +import EventTarget from './EventTarget.js'; /** * Message port. * * @see https://developer.mozilla.org/en-US/docs/Web/API/MessagePort */ -export default interface IMessagePort extends IEventTarget { +export default interface IMessagePort extends EventTarget { /** * Sends a message from the port, and optionally, transfers ownership of objects to other browsing contexts. * diff --git a/packages/happy-dom/src/event/ITouchInit.ts b/packages/happy-dom/src/event/ITouchInit.ts index 4f70165de..1b45c6c30 100644 --- a/packages/happy-dom/src/event/ITouchInit.ts +++ b/packages/happy-dom/src/event/ITouchInit.ts @@ -1,8 +1,8 @@ -import IEventTarget from './IEventTarget.js'; +import EventTarget from './EventTarget.js'; export default interface ITouchInit { identifier: number; - target: IEventTarget; + target: EventTarget; clientX?: number; clientY?: number; screenX?: number; diff --git a/packages/happy-dom/src/event/IUIEventInit.ts b/packages/happy-dom/src/event/IUIEventInit.ts index d6047c74d..558607fa7 100644 --- a/packages/happy-dom/src/event/IUIEventInit.ts +++ b/packages/happy-dom/src/event/IUIEventInit.ts @@ -1,7 +1,7 @@ -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import IEventInit from './IEventInit.js'; export default interface IUIEventInit extends IEventInit { detail?: number; - view?: IBrowserWindow; + view?: BrowserWindow; } diff --git a/packages/happy-dom/src/event/Touch.ts b/packages/happy-dom/src/event/Touch.ts index c5f031952..02ec3c4af 100644 --- a/packages/happy-dom/src/event/Touch.ts +++ b/packages/happy-dom/src/event/Touch.ts @@ -1,4 +1,4 @@ -import IEventTarget from './IEventTarget.js'; +import EventTarget from './EventTarget.js'; import ITouchInit from './ITouchInit.js'; /** @@ -6,7 +6,7 @@ import ITouchInit from './ITouchInit.js'; */ export default class Touch { public readonly identifier: number; - public readonly target: IEventTarget; + public readonly target: EventTarget; public readonly clientX: number; public readonly clientY: number; public readonly screenX: number; diff --git a/packages/happy-dom/src/event/UIEvent.ts b/packages/happy-dom/src/event/UIEvent.ts index 42cc4e1ba..c77edc254 100644 --- a/packages/happy-dom/src/event/UIEvent.ts +++ b/packages/happy-dom/src/event/UIEvent.ts @@ -1,4 +1,4 @@ -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import Event from './Event.js'; import IUIEventInit from './IUIEventInit.js'; @@ -15,7 +15,7 @@ export default class UIEvent extends Event { public readonly layerY: number = 0; public readonly pageX: number = 0; public readonly pageY: number = 0; - public readonly view: IBrowserWindow | null; + public readonly view: BrowserWindow | null; /** * Constructor. diff --git a/packages/happy-dom/src/event/events/IMessageEventInit.ts b/packages/happy-dom/src/event/events/IMessageEventInit.ts index 99852dcde..b0028037b 100644 --- a/packages/happy-dom/src/event/events/IMessageEventInit.ts +++ b/packages/happy-dom/src/event/events/IMessageEventInit.ts @@ -1,11 +1,11 @@ import IEventInit from '../IEventInit.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import IMessagePort from '../IMessagePort.js'; export default interface IMessageEventInit extends IEventInit { data?: unknown | null; origin?: string; lastEventId?: string; - source?: IBrowserWindow | null; + source?: BrowserWindow | null; ports?: IMessagePort[]; } diff --git a/packages/happy-dom/src/event/events/ISubmitEventInit.ts b/packages/happy-dom/src/event/events/ISubmitEventInit.ts index e7a2ba98d..a489bbf1a 100644 --- a/packages/happy-dom/src/event/events/ISubmitEventInit.ts +++ b/packages/happy-dom/src/event/events/ISubmitEventInit.ts @@ -1,6 +1,6 @@ -import IHTMLElement from '../../nodes/html-element/IHTMLElement.js'; +import HTMLElement from '../../nodes/html-element/HTMLElement.js'; import IEventInit from '../IEventInit.js'; export default interface ISubmitEventInit extends IEventInit { - submitter?: IHTMLElement; + submitter?: HTMLElement; } diff --git a/packages/happy-dom/src/event/events/MessageEvent.ts b/packages/happy-dom/src/event/events/MessageEvent.ts index 25e001497..d23edb0e8 100644 --- a/packages/happy-dom/src/event/events/MessageEvent.ts +++ b/packages/happy-dom/src/event/events/MessageEvent.ts @@ -1,4 +1,4 @@ -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import Event from '../Event.js'; import IMessagePort from '../IMessagePort.js'; import IMessageEventInit from './IMessageEventInit.js'; @@ -12,7 +12,7 @@ export default class MessageEvent extends Event { public readonly data: unknown | null; public readonly origin: string; public readonly lastEventId: string; - public readonly source: IBrowserWindow | null; + public readonly source: BrowserWindow | null; public readonly ports: IMessagePort[]; /** diff --git a/packages/happy-dom/src/event/events/SubmitEvent.ts b/packages/happy-dom/src/event/events/SubmitEvent.ts index 864173cf1..2217d618c 100644 --- a/packages/happy-dom/src/event/events/SubmitEvent.ts +++ b/packages/happy-dom/src/event/events/SubmitEvent.ts @@ -1,12 +1,12 @@ import Event from '../Event.js'; import ISubmitEventInit from './ISubmitEventInit.js'; -import IHTMLElement from '../../nodes/html-element/IHTMLElement.js'; +import HTMLElement from '../../nodes/html-element/HTMLElement.js'; /** * An event triggered by form submit buttons. */ export default class SubmitEvent extends Event { - public readonly submitter: IHTMLElement | null; + public readonly submitter: HTMLElement | null; /** * Constructor. diff --git a/packages/happy-dom/src/fetch/Fetch.ts b/packages/happy-dom/src/fetch/Fetch.ts index 1410d587a..16856d0a2 100644 --- a/packages/happy-dom/src/fetch/Fetch.ts +++ b/packages/happy-dom/src/fetch/Fetch.ts @@ -1,6 +1,5 @@ import IRequestInit from './types/IRequestInit.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IResponse from './types/IResponse.js'; import IRequestInfo from './types/IRequestInfo.js'; import Headers from './Headers.js'; import FetchRequestReferrerUtility from './utilities/FetchRequestReferrerUtility.js'; @@ -19,7 +18,7 @@ import Response from './Response.js'; import Event from '../event/Event.js'; import AbortSignal from './AbortSignal.js'; import IBrowserFrame from '../browser/types/IBrowserFrame.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import CachedResponseStateEnum from './cache/response/CachedResponseStateEnum.js'; import FetchRequestHeaderUtility from './utilities/FetchRequestHeaderUtility.js'; import FetchRequestValidationUtility from './utilities/FetchRequestValidationUtility.js'; @@ -41,7 +40,7 @@ const LAST_CHUNK = Buffer.from('0\r\n\r\n'); */ export default class Fetch { private reject: (reason: Error) => void | null = null; - private resolve: (value: IResponse | Promise) => void | null = null; + private resolve: (value: Response | Promise) => void | null = null; private listeners = { onSignalAbort: this.onSignalAbort.bind(this) }; @@ -57,7 +56,7 @@ export default class Fetch { private disableCache: boolean; private disableCrossOriginPolicy: boolean; #browserFrame: IBrowserFrame; - #window: IBrowserWindow; + #window: BrowserWindow; /** * Constructor. @@ -74,7 +73,7 @@ export default class Fetch { */ constructor(options: { browserFrame: IBrowserFrame; - window: IBrowserWindow; + window: BrowserWindow; url: IRequestInfo; init?: IRequestInit; redirectCount?: number; @@ -101,7 +100,7 @@ export default class Fetch { * * @returns Response. */ - public async send(): Promise { + public async send(): Promise { FetchRequestReferrerUtility.prepareRequest(new URL(this.#window.location.href), this.request); FetchRequestValidationUtility.validateSchema(this.request); @@ -158,7 +157,7 @@ export default class Fetch { * * @returns Response. */ - private async getCachedResponse(): Promise { + private async getCachedResponse(): Promise { if (this.disableCache) { return null; } @@ -336,7 +335,7 @@ export default class Fetch { * * @returns Response. */ - private sendRequest(): Promise { + private sendRequest(): Promise { return new Promise((resolve, reject) => { const taskID = this.#browserFrame[PropertySymbol.asyncTaskManager].startTask(() => this.onAsyncTaskManagerAbort() @@ -346,7 +345,7 @@ export default class Fetch { throw new Error('Fetch already sent.'); } - this.resolve = (response: IResponse | Promise): void => { + this.resolve = (response: Response | Promise): void => { // We can end up here when closing down the browser frame and there is an ongoing request. // Therefore we need to check if browserFrame.page.context is still available. if ( @@ -779,7 +778,7 @@ export default class Fetch { this.finalizeRequest(); this.reject( new DOMException( - `Redirect option '${this.request.redirect}' is not a valid value of RequestRedirect` + `Redirect option '${this.request.redirect}' is not a valid value of IRequestRedirect` ) ); return true; diff --git a/packages/happy-dom/src/fetch/Headers.ts b/packages/happy-dom/src/fetch/Headers.ts index 041c66767..83fe089b1 100644 --- a/packages/happy-dom/src/fetch/Headers.ts +++ b/packages/happy-dom/src/fetch/Headers.ts @@ -1,7 +1,6 @@ import DOMException from '../exception/DOMException.js'; import * as PropertySymbol from '../PropertySymbol.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; -import IHeaders from './types/IHeaders.js'; import IHeadersInit from './types/IHeadersInit.js'; /** @@ -9,7 +8,7 @@ import IHeadersInit from './types/IHeadersInit.js'; * * @see https://developer.mozilla.org/en-US/docs/Web/API/Headers */ -export default class Headers implements IHeaders { +export default class Headers { public [PropertySymbol.entries]: { [k: string]: { name: string; value: string[] } } = {}; /** @@ -117,7 +116,7 @@ export default class Headers implements IHeaders { * * @param callback Callback. */ - public forEach(callback: (name: string, value: string, thisArg: IHeaders) => void): void { + public forEach(callback: (name: string, value: string, thisArg: Headers) => void): void { for (const header of Object.values(this[PropertySymbol.entries])) { callback(header.value.join(', '), header.name, this); } diff --git a/packages/happy-dom/src/fetch/Request.ts b/packages/happy-dom/src/fetch/Request.ts index c37a22606..b5ab746d9 100644 --- a/packages/happy-dom/src/fetch/Request.ts +++ b/packages/happy-dom/src/fetch/Request.ts @@ -1,12 +1,10 @@ -import IBlob from '../file/IBlob.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; import IRequestInit from './types/IRequestInit.js'; import URL from '../url/URL.js'; import DOMException from '../exception/DOMException.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; import IRequestInfo from './types/IRequestInfo.js'; -import IRequest from './types/IRequest.js'; import Headers from './Headers.js'; import FetchBodyUtility from './utilities/FetchBodyUtility.js'; import AbortSignal from './AbortSignal.js'; @@ -21,7 +19,7 @@ import IRequestCredentials from './types/IRequestCredentials.js'; import FormData from '../form-data/FormData.js'; import MultipartFormDataParser from './multipart/MultipartFormDataParser.js'; import AsyncTaskManager from '../async-task-manager/AsyncTaskManager.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; /** * Fetch request. @@ -31,7 +29,7 @@ import IBrowserWindow from '../window/IBrowserWindow.js'; * * @see https://fetch.spec.whatwg.org/#request-class */ -export default class Request implements IRequest { +export default class Request implements Request { // Public properties public readonly method: string; public readonly body: ReadableStream | null; @@ -50,7 +48,7 @@ export default class Request implements IRequest { public [PropertySymbol.bodyBuffer]: Buffer | null; // Private properties - readonly #window: IBrowserWindow; + readonly #window: BrowserWindow; readonly #asyncTaskManager: AsyncTaskManager; /** @@ -63,7 +61,7 @@ export default class Request implements IRequest { * @param [init] Init. */ constructor( - injected: { window: IBrowserWindow; asyncTaskManager: AsyncTaskManager }, + injected: { window: BrowserWindow; asyncTaskManager: AsyncTaskManager }, input: IRequestInfo, init?: IRequestInit ) { @@ -149,7 +147,7 @@ export default class Request implements IRequest { /** * Returns owner document. */ - protected get [PropertySymbol.ownerDocument](): IDocument { + protected get [PropertySymbol.ownerDocument](): Document { throw new Error('[PropertySymbol.ownerDocument] getter needs to be implemented by sub-class.'); } @@ -223,7 +221,7 @@ export default class Request implements IRequest { * * @returns Blob. */ - public async blob(): Promise { + public async blob(): Promise { const type = this.headers.get('Content-Type') || ''; const buffer = await this.arrayBuffer(); diff --git a/packages/happy-dom/src/fetch/ResourceFetch.ts b/packages/happy-dom/src/fetch/ResourceFetch.ts index f296eb416..eff703049 100644 --- a/packages/happy-dom/src/fetch/ResourceFetch.ts +++ b/packages/happy-dom/src/fetch/ResourceFetch.ts @@ -1,5 +1,5 @@ import DOMException from '../exception/DOMException.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import URL from '../url/URL.js'; import IBrowserFrame from '../browser/types/IBrowserFrame.js'; import Fetch from './Fetch.js'; @@ -9,7 +9,7 @@ import SyncFetch from './SyncFetch.js'; * Helper class for performing fetch of resources. */ export default class ResourceFetch { - private window: IBrowserWindow; + private window: BrowserWindow; #browserFrame: IBrowserFrame; /** @@ -19,7 +19,7 @@ export default class ResourceFetch { * @param options.browserFrame Browser frame. * @param options.window Window. */ - constructor(options: { browserFrame: IBrowserFrame; window: IBrowserWindow }) { + constructor(options: { browserFrame: IBrowserFrame; window: BrowserWindow }) { this.#browserFrame = options.browserFrame; this.window = options.window; } diff --git a/packages/happy-dom/src/fetch/Response.ts b/packages/happy-dom/src/fetch/Response.ts index 3f5a47f21..cfdc99748 100644 --- a/packages/happy-dom/src/fetch/Response.ts +++ b/packages/happy-dom/src/fetch/Response.ts @@ -1,20 +1,17 @@ -import IResponse from './types/IResponse.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IBlob from '../file/IBlob.js'; +import Blob from '../file/Blob.js'; import IResponseInit from './types/IResponseInit.js'; import IResponseBody from './types/IResponseBody.js'; import Headers from './Headers.js'; -import IHeaders from './types/IHeaders.js'; import { URLSearchParams } from 'url'; import URL from '../url/URL.js'; -import Blob from '../file/Blob.js'; import { ReadableStream } from 'stream/web'; import FormData from '../form-data/FormData.js'; import FetchBodyUtility from './utilities/FetchBodyUtility.js'; import DOMException from '../exception/DOMException.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; import MultipartFormDataParser from './multipart/MultipartFormDataParser.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import IBrowserFrame from '../browser/types/IBrowserFrame.js'; import ICachedResponse from './cache/response/ICachedResponse.js'; import { Buffer } from 'buffer'; @@ -29,9 +26,9 @@ const REDIRECT_STATUS_CODES = [301, 302, 303, 307, 308]; * * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/Response */ -export default class Response implements IResponse { +export default class Response implements Response { // Needs to be injected by sub-class. - protected static [PropertySymbol.window]: IBrowserWindow; + protected static [PropertySymbol.window]: BrowserWindow; // Public properties public readonly body: ReadableStream | null = null; @@ -43,10 +40,10 @@ export default class Response implements IResponse { public readonly status: number; public readonly statusText: string; public readonly ok: boolean; - public readonly headers: IHeaders; + public readonly headers: Headers; public [PropertySymbol.cachedResponse]: ICachedResponse | null = null; public [PropertySymbol.buffer]: Buffer | null = null; - readonly #window: IBrowserWindow; + readonly #window: BrowserWindow; readonly #browserFrame: IBrowserFrame; /** @@ -60,7 +57,7 @@ export default class Response implements IResponse { * @param [init] Init. */ constructor( - injected: { window: IBrowserWindow; browserFrame: IBrowserFrame }, + injected: { window: BrowserWindow; browserFrame: IBrowserFrame }, body?: IResponseBody, init?: IResponseInit ) { @@ -138,7 +135,7 @@ export default class Response implements IResponse { * * @returns Blob. */ - public async blob(): Promise { + public async blob(): Promise { const type = this.headers.get('Content-Type') || ''; const buffer = await this.arrayBuffer(); diff --git a/packages/happy-dom/src/fetch/SyncFetch.ts b/packages/happy-dom/src/fetch/SyncFetch.ts index b29fb3c8f..1991d14e8 100644 --- a/packages/happy-dom/src/fetch/SyncFetch.ts +++ b/packages/happy-dom/src/fetch/SyncFetch.ts @@ -6,7 +6,7 @@ import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; import URL from '../url/URL.js'; import Request from './Request.js'; import IBrowserFrame from '../browser/types/IBrowserFrame.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import ChildProcess from 'child_process'; import ISyncResponse from './types/ISyncResponse.js'; import Headers from './Headers.js'; @@ -41,7 +41,7 @@ export default class SyncFetch { private disableCache: boolean; private disableCrossOriginPolicy: boolean; #browserFrame: IBrowserFrame; - #window: IBrowserWindow; + #window: BrowserWindow; /** * Constructor. @@ -58,7 +58,7 @@ export default class SyncFetch { */ constructor(options: { browserFrame: IBrowserFrame; - window: IBrowserWindow; + window: BrowserWindow; url: IRequestInfo; init?: IRequestInit; redirectCount?: number; @@ -375,7 +375,7 @@ export default class SyncFetch { url: this.request.url, redirected: this.redirectCount > 0, headers, - body: this.parseResponseBody({ + body: this.parseIResponseBody({ headers, status: incomingMessage.statusCode, body: Buffer.from(incomingMessage.data, 'base64') @@ -407,7 +407,7 @@ export default class SyncFetch { * @param options.body Body. * @returns Parsed body. */ - private parseResponseBody(options: { headers: Headers; status: number; body: Buffer }): Buffer { + private parseIResponseBody(options: { headers: Headers; status: number; body: Buffer }): Buffer { const contentEncodingHeader = options.headers.get('Content-Encoding'); if ( @@ -547,7 +547,7 @@ export default class SyncFetch { return fetch.send(); default: throw new DOMException( - `Redirect option '${this.request.redirect}' is not a valid value of RequestRedirect` + `Redirect option '${this.request.redirect}' is not a valid value of IRequestRedirect` ); } } diff --git a/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightRequest.ts b/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightRequest.ts index 30b308805..ebc5bb41b 100644 --- a/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightRequest.ts +++ b/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightRequest.ts @@ -1,7 +1,7 @@ -import IHeaders from '../../types/IHeaders.js'; +import Headers from '../../Headers.js'; export default interface ICachablePreflightRequest { url: string; method: string; - headers: IHeaders; + headers: Headers; } diff --git a/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightResponse.ts b/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightResponse.ts index b978a32d1..0aa002124 100644 --- a/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightResponse.ts +++ b/packages/happy-dom/src/fetch/cache/preflight/ICachablePreflightResponse.ts @@ -1,7 +1,7 @@ -import IHeaders from '../../types/IHeaders.js'; +import Headers from '../../Headers.js'; export default interface ICachablePreflightResponse { status: number; url: string; - headers: IHeaders; + headers: Headers; } diff --git a/packages/happy-dom/src/fetch/cache/response/ICachableRequest.ts b/packages/happy-dom/src/fetch/cache/response/ICachableRequest.ts index c83202c58..a436dbe54 100644 --- a/packages/happy-dom/src/fetch/cache/response/ICachableRequest.ts +++ b/packages/happy-dom/src/fetch/cache/response/ICachableRequest.ts @@ -1,7 +1,7 @@ -import IHeaders from '../../types/IHeaders.js'; +import Headers from '../../Headers.js'; export default interface ICachableRequest { url: string; method: string; - headers: IHeaders; + headers: Headers; } diff --git a/packages/happy-dom/src/fetch/cache/response/ICachableResponse.ts b/packages/happy-dom/src/fetch/cache/response/ICachableResponse.ts index 9737f928b..4b844ef86 100644 --- a/packages/happy-dom/src/fetch/cache/response/ICachableResponse.ts +++ b/packages/happy-dom/src/fetch/cache/response/ICachableResponse.ts @@ -1,10 +1,10 @@ -import IHeaders from '../../types/IHeaders.js'; +import Headers from '../../Headers.js'; export default interface ICachableResponse { status: number; statusText: string; url: string; - headers: IHeaders; + headers: Headers; body: Buffer | null; waitingForBody: boolean; } diff --git a/packages/happy-dom/src/fetch/cache/response/ICachedResponse.ts b/packages/happy-dom/src/fetch/cache/response/ICachedResponse.ts index e2de6f669..420708d11 100644 --- a/packages/happy-dom/src/fetch/cache/response/ICachedResponse.ts +++ b/packages/happy-dom/src/fetch/cache/response/ICachedResponse.ts @@ -1,5 +1,5 @@ import CachedResponseStateEnum from './CachedResponseStateEnum.js'; -import IHeaders from '../../types/IHeaders.js'; +import Headers from '../../Headers.js'; export default interface ICachedResponse { /** Response. */ @@ -7,14 +7,14 @@ export default interface ICachedResponse { status: number; statusText: string; url: string; - headers: IHeaders; + headers: Headers; // We need to wait for the body to be populated if set to "true". waitingForBody: boolean; body: Buffer | null; }; /** Request. */ request: { - headers: IHeaders; + headers: Headers; method: string; }; /** Cache update time in milliseconds. */ diff --git a/packages/happy-dom/src/fetch/types/IHeaders.ts b/packages/happy-dom/src/fetch/types/IHeaders.ts deleted file mode 100644 index 9f9a704c3..000000000 --- a/packages/happy-dom/src/fetch/types/IHeaders.ts +++ /dev/null @@ -1,87 +0,0 @@ -/** - * Fetch headers. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Headers - */ -export default interface IHeaders extends Iterable<[string, string]> { - /** - * Appends a new value onto an existing header inside a Headers object, or adds the header if it does not already exist. - * - * @param name Name. - * @param value Value. - */ - append(name: string, value: string): void; - - /** - * Removes an header. - * - * @param name Name. - */ - delete(name: string): void; - - /** - * Returns header value. - * - * @param name Name. - * @returns Value. - */ - get(name: string): string | null; - - /** - * Sets a new value for an existing header inside a Headers object, or adds the header if it does not already exist. - * - * @param name Name. - * @param value Value. - */ - set(name: string, value: string): void; - - /** - * Returns an array containing the values of all Set-Cookie headers associated with a response. - * - * @returns An array of strings representing the values of all the different Set-Cookie headers. - */ - getSetCookie(): string[]; - - /** - * Returns whether an Headers object contains a certain key. - * - * @param name Name. - * @returns "true" if the Headers object contains the key. - */ - has(name: string): boolean; - - /** - * Executes a callback function once per each key/value pair in the Headers object. - * - * @param callback Callback. - */ - forEach(callback: (name: string, value: string, object: IHeaders) => void): void; - - /** - * Returns an iterator, allowing you to go through all keys of the key/value pairs contained in this object. - * - * @returns Iterator. - */ - keys(): IterableIterator; - - /** - * Returns an iterator, allowing you to go through all values of the key/value pairs contained in this object. - * - * @returns Iterator. - */ - values(): IterableIterator; - - /** - * Returns an iterator, allowing you to go through all key/value pairs contained in this object. - * - * @returns Iterator. - */ - entries(): IterableIterator<[string, string]>; - - /** - * Iterator. - * - * @returns Iterator. - */ - [Symbol.iterator](): IterableIterator<[string, string]>; -} diff --git a/packages/happy-dom/src/fetch/types/IHeadersInit.ts b/packages/happy-dom/src/fetch/types/IHeadersInit.ts index 2f695460f..47349daac 100644 --- a/packages/happy-dom/src/fetch/types/IHeadersInit.ts +++ b/packages/happy-dom/src/fetch/types/IHeadersInit.ts @@ -1,5 +1,5 @@ -import IHeaders from './IHeaders.js'; +import Headers from '../Headers.js'; -type IHeadersInit = string[][] | { [key: string]: string } | IHeaders; +type IHeadersInit = string[][] | { [key: string]: string } | Headers; export default IHeadersInit; diff --git a/packages/happy-dom/src/fetch/types/IRequest.ts b/packages/happy-dom/src/fetch/types/IRequest.ts deleted file mode 100644 index cca07ca47..000000000 --- a/packages/happy-dom/src/fetch/types/IRequest.ts +++ /dev/null @@ -1,73 +0,0 @@ -import IHeaders from './IHeaders.js'; -import IBlob from '../../file/IBlob.js'; -import AbortSignal from '../AbortSignal.js'; -import { ReadableStream } from 'stream/web'; -import IRequestReferrerPolicy from './IRequestReferrerPolicy.js'; -import IRequestRedirect from './IRequestRedirect.js'; -import IRequestCredentials from './IRequestCredentials.js'; -import FormData from '../../form-data/FormData.js'; - -/** - * Fetch request. - */ -export default interface IRequest { - readonly headers: IHeaders; - readonly method: string; - readonly redirect: IRequestRedirect; - readonly referrer: string; - readonly url: string; - readonly body: ReadableStream | null; - readonly bodyUsed: boolean; - readonly referrerPolicy: IRequestReferrerPolicy; - readonly signal: AbortSignal | null; - readonly credentials: IRequestCredentials; - - /** - * Returns array buffer. - * - * @returns Array buffer. - */ - arrayBuffer(): Promise; - - /** - * Returns blob. - * - * @returns Blob. - */ - blob(): Promise; - - /** - * Returns buffer. - * - * @returns Buffer. - */ - buffer(): Promise; - - /** - * Returns text. - * - * @returns Text. - */ - text(): Promise; - - /** - * Returns json. - * - * @returns JSON. - */ - json(): Promise; - - /** - * Returns FormData. - * - * @returns FormData. - */ - formData(): Promise; - - /** - * Clones request. - * - * @returns Clone. - */ - clone(): IRequest; -} diff --git a/packages/happy-dom/src/fetch/types/IRequestInfo.ts b/packages/happy-dom/src/fetch/types/IRequestInfo.ts index 6b2bb16eb..8e445c122 100644 --- a/packages/happy-dom/src/fetch/types/IRequestInfo.ts +++ b/packages/happy-dom/src/fetch/types/IRequestInfo.ts @@ -1,6 +1,6 @@ import URL from '../../url/URL.js'; -import IRequest from './IRequest.js'; +import Request from '../Request.js'; -type IRequestInfo = IRequest | string | URL; +type IRequestInfo = Request | string | URL; export default IRequestInfo; diff --git a/packages/happy-dom/src/fetch/types/IResponse.ts b/packages/happy-dom/src/fetch/types/IResponse.ts deleted file mode 100644 index 009ba2e1a..000000000 --- a/packages/happy-dom/src/fetch/types/IResponse.ts +++ /dev/null @@ -1,28 +0,0 @@ -import IHeaders from './IHeaders.js'; -import IBlob from '../../file/IBlob.js'; -import { ReadableStream } from 'stream/web'; -import { Buffer } from 'buffer'; - -/** - * Fetch response. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Response/Response - */ -export default interface IResponse { - readonly headers: IHeaders; - readonly ok: boolean; - readonly redirected: boolean; - readonly status: number; - readonly statusText: string; - readonly type: 'basic' | 'cors' | 'default' | 'error' | 'opaque' | 'opaqueredirect'; - readonly url: string; - readonly body: ReadableStream | null; - readonly bodyUsed: boolean; - - arrayBuffer(): Promise; - blob(): Promise; - buffer(): Promise; - json(): Promise; - text(): Promise; - clone(): IResponse; -} diff --git a/packages/happy-dom/src/fetch/types/ISyncResponse.ts b/packages/happy-dom/src/fetch/types/ISyncResponse.ts index 53566ccb1..4a8e8df50 100644 --- a/packages/happy-dom/src/fetch/types/ISyncResponse.ts +++ b/packages/happy-dom/src/fetch/types/ISyncResponse.ts @@ -1,4 +1,4 @@ -import IHeaders from './IHeaders.js'; +import Headers from '../Headers.js'; /** * Fetch response. @@ -11,6 +11,6 @@ export default interface ISyncResponse { ok: boolean; url: string; redirected: boolean; - headers: IHeaders; + headers: Headers; body: Buffer; } diff --git a/packages/happy-dom/src/fetch/utilities/FetchRequestHeaderUtility.ts b/packages/happy-dom/src/fetch/utilities/FetchRequestHeaderUtility.ts index e1ff19c63..fa6922d9c 100644 --- a/packages/happy-dom/src/fetch/utilities/FetchRequestHeaderUtility.ts +++ b/packages/happy-dom/src/fetch/utilities/FetchRequestHeaderUtility.ts @@ -1,10 +1,9 @@ import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import CookieStringUtility from '../../cookie/urilities/CookieStringUtility.js'; import Headers from '../Headers.js'; import Request from '../Request.js'; -import IHeaders from '../types/IHeaders.js'; import FetchCORSUtility from './FetchCORSUtility.js'; import { URL } from 'url'; @@ -41,7 +40,7 @@ export default class FetchRequestHeaderUtility { * * @param headers Headers. */ - public static removeForbiddenHeaders(headers: IHeaders): void { + public static removeForbiddenHeaders(headers: Headers): void { for (const key of Object.keys((headers)[PropertySymbol.entries])) { if ( FORBIDDEN_HEADER_NAMES.includes(key) || @@ -74,7 +73,7 @@ export default class FetchRequestHeaderUtility { */ public static getRequestHeaders(options: { browserFrame: IBrowserFrame; - window: IBrowserWindow; + window: BrowserWindow; request: Request; }): { [key: string]: string } { const headers = new Headers(options.request.headers); diff --git a/packages/happy-dom/src/fetch/utilities/FetchRequestReferrerUtility.ts b/packages/happy-dom/src/fetch/utilities/FetchRequestReferrerUtility.ts index c8c93f682..f4ecc2cbb 100644 --- a/packages/happy-dom/src/fetch/utilities/FetchRequestReferrerUtility.ts +++ b/packages/happy-dom/src/fetch/utilities/FetchRequestReferrerUtility.ts @@ -1,6 +1,6 @@ import URL from '../../url/URL.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import { isIP } from 'net'; import Headers from '../Headers.js'; import IRequestReferrerPolicy from '../types/IRequestReferrerPolicy.js'; @@ -49,7 +49,7 @@ export default class FetchRequestReferrerUtility { * @returns Initial referrer. */ public static getInitialReferrer( - window: IBrowserWindow, + window: BrowserWindow, referrer: '' | 'no-referrer' | 'client' | string | URL ): '' | 'no-referrer' | 'client' | URL { if (referrer === '' || referrer === 'no-referrer' || referrer === 'client') { diff --git a/packages/happy-dom/src/file/Blob.ts b/packages/happy-dom/src/file/Blob.ts index 28e7b4c4f..2c85da1df 100644 --- a/packages/happy-dom/src/file/Blob.ts +++ b/packages/happy-dom/src/file/Blob.ts @@ -1,4 +1,3 @@ -import IBlob from './IBlob.js'; import { Buffer } from 'buffer'; import * as PropertySymbol from '../PropertySymbol.js'; @@ -9,7 +8,7 @@ import * as PropertySymbol from '../PropertySymbol.js'; * Based on: * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/file-api/Blob-impl.js (MIT licensed). */ -export default class Blob implements IBlob { +export default class Blob { public readonly type: string = ''; public [PropertySymbol.buffer]: Buffer = null; diff --git a/packages/happy-dom/src/file/FileReader.ts b/packages/happy-dom/src/file/FileReader.ts index b49637958..9eb372783 100644 --- a/packages/happy-dom/src/file/FileReader.ts +++ b/packages/happy-dom/src/file/FileReader.ts @@ -1,6 +1,6 @@ import WhatwgMIMEType from 'whatwg-mimetype'; import * as PropertySymbol from '../PropertySymbol.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import ProgressEvent from '../event/events/ProgressEvent.js'; import DOMException from '../exception/DOMException.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; @@ -31,14 +31,14 @@ export default class FileReader extends EventTarget { #isTerminated = false; #loadTimeout: NodeJS.Timeout | null = null; #parseTimeout: NodeJS.Timeout | null = null; - readonly #window: IBrowserWindow; + readonly #window: BrowserWindow; /** * Constructor. * * @param window Window. */ - constructor(window: IBrowserWindow) { + constructor(window: BrowserWindow) { super(); this.#window = window; } diff --git a/packages/happy-dom/src/file/IBlob.ts b/packages/happy-dom/src/file/IBlob.ts deleted file mode 100644 index 574cbfb72..000000000 --- a/packages/happy-dom/src/file/IBlob.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/Blob. - */ -export default interface IBlob { - readonly type: string; - readonly size: number; - slice(start?: number, end?: number): IBlob; - text(): Promise; -} diff --git a/packages/happy-dom/src/form-data/FormData.ts b/packages/happy-dom/src/form-data/FormData.ts index 9bd600a39..0fd240e86 100644 --- a/packages/happy-dom/src/form-data/FormData.ts +++ b/packages/happy-dom/src/form-data/FormData.ts @@ -1,8 +1,8 @@ import Blob from '../file/Blob.js'; import * as PropertySymbol from '../PropertySymbol.js'; import File from '../file/File.js'; -import IHTMLInputElement from '../nodes/html-input-element/IHTMLInputElement.js'; -import IHTMLFormElement from '../nodes/html-form-element/IHTMLFormElement.js'; +import HTMLInputElement from '../nodes/html-input-element/HTMLInputElement.js'; +import HTMLFormElement from '../nodes/html-form-element/HTMLFormElement.js'; import HTMLFormControlsCollection from '../nodes/html-form-element/HTMLFormControlsCollection.js'; import RadioNodeList from '../nodes/html-form-element/RadioNodeList.js'; @@ -26,7 +26,7 @@ export default class FormData implements Iterable<[string, string | File]> { * * @param [form] Form. */ - constructor(form?: IHTMLFormElement) { + constructor(form?: HTMLFormElement) { if (form) { for (const name of Object.keys( (form[PropertySymbol.elements])[PropertySymbol.namedItems] @@ -41,7 +41,7 @@ export default class FormData implements Iterable<[string, string | File]> { ) { const newRadioNodeList = new RadioNodeList(); for (const node of radioNodeList) { - if (node.checked) { + if ((node).checked) { newRadioNodeList.push(node); break; } @@ -52,10 +52,10 @@ export default class FormData implements Iterable<[string, string | File]> { for (const node of radioNodeList) { if (node.name && SUBMITTABLE_ELEMENTS.includes(node[PropertySymbol.tagName])) { if (node[PropertySymbol.tagName] === 'INPUT' && node.type === 'file') { - if ((node)[PropertySymbol.files].length === 0) { + if ((node)[PropertySymbol.files].length === 0) { this.append(node.name, new File([], '', { type: 'application/octet-stream' })); } else { - for (const file of (node)[PropertySymbol.files]) { + for (const file of (node)[PropertySymbol.files]) { this.append(node.name, file); } } diff --git a/packages/happy-dom/src/index.ts b/packages/happy-dom/src/index.ts index 5ba1da263..491a9a761 100644 --- a/packages/happy-dom/src/index.ts +++ b/packages/happy-dom/src/index.ts @@ -149,122 +149,32 @@ import type IProgressEventInit from './event/events/IProgressEventInit.js'; import type ISubmitEventInit from './event/events/ISubmitEventInit.js'; import type ITouchEventInit from './event/events/ITouchEventInit.js'; import type IWheelEventInit from './event/events/IWheelEventInit.js'; -import type IHeaders from './fetch/types/IHeaders.js'; -import type IRequest from './fetch/types/IRequest.js'; -import type IResponse from './fetch/types/IResponse.js'; -import type IAttr from './nodes/attr/IAttr.js'; -import type IComment from './nodes/comment/IComment.js'; -import type IDocumentFragment from './nodes/document-fragment/IDocumentFragment.js'; -import type IDocumentType from './nodes/document-type/IDocumentType.js'; -import type IDocument from './nodes/document/IDocument.js'; -import type IElement from './nodes/element/IElement.js'; -import type IHTMLCollection from './nodes/element/IHTMLCollection.js'; -import type IHTMLAnchorElement from './nodes/html-anchor-element/IHTMLAnchorElement.js'; -import type IHTMLAudioElement from './nodes/html-audio-element/IHTMLAudioElement.js'; -import type IHTMLBaseElement from './nodes/html-base-element/IHTMLBaseElement.js'; -import type IHTMLButtonElement from './nodes/html-button-element/IHTMLButtonElement.js'; -import type IHTMLDialogElement from './nodes/html-dialog-element/IHTMLDialogElement.js'; -import type IHTMLElement from './nodes/html-element/IHTMLElement.js'; -import type IHTMLFormControlsCollection from './nodes/html-form-element/IHTMLFormControlsCollection.js'; -import type IHTMLFormElement from './nodes/html-form-element/IHTMLFormElement.js'; -import type IHTMLIFrameElement from './nodes/html-iframe-element/IHTMLIFrameElement.js'; -import type IHTMLImageElement from './nodes/html-image-element/IHTMLImageElement.js'; -import type IFileList from './nodes/html-input-element/IFileList.js'; -import type IHTMLInputElement from './nodes/html-input-element/IHTMLInputElement.js'; -import type IHTMLLabelElement from './nodes/html-label-element/IHTMLLabelElement.js'; -import type IHTMLLinkElement from './nodes/html-link-element/IHTMLLinkElement.js'; -import type IHTMLMediaElement from './nodes/html-media-element/IHTMLMediaElement.js'; -import type IHTMLMetaElement from './nodes/html-meta-element/IHTMLMetaElement.js'; -import type IHTMLOptGroupElement from './nodes/html-opt-group-element/IHTMLOptGroupElement.js'; -import type IHTMLOptionElement from './nodes/html-option-element/IHTMLOptionElement.js'; -import type IHTMLSelectElement from './nodes/html-select-element/IHTMLSelectElement.js'; -import type IHTMLSlotElement from './nodes/html-slot-element/IHTMLSlotElement.js'; -import type IHTMLStyleElement from './nodes/html-style-element/IHTMLStyleElement.js'; -import type IHTMLTemplateElement from './nodes/html-template-element/IHTMLTemplateElement.js'; -import type IHTMLTextAreaElement from './nodes/html-text-area-element/IHTMLTextAreaElement.js'; -import type IHTMLVideoElement from './nodes/html-video-element/IHTMLVideoElement.js'; -import type INode from './nodes/node/INode.js'; -import type INodeList from './nodes/node/INodeList.js'; -import type IProcessingInstruction from './nodes/processing-instruction/IProcessingInstruction.js'; -import type IShadowRoot from './nodes/shadow-root/IShadowRoot.js'; -import type ISVGElement from './nodes/svg-element/ISVGElement.js'; -import type ISVGGraphicsElement from './nodes/svg-element/ISVGGraphicsElement.js'; -import type ISVGSVGElement from './nodes/svg-element/ISVGSVGElement.js'; -import type IText from './nodes/text/IText.js'; -import type IBrowserWindow from './window/IBrowserWindow.js'; -import type ICrossOriginBrowserWindow from './window/ICrossOriginBrowserWindow.js'; -import type IWindow from './window/IWindow.js'; export type { IAnimationEventInit, - IAttr, IBrowser, IBrowserContext, IBrowserFrame, IBrowserPage, IBrowserSettings, - IBrowserWindow, IClipboardEventInit, - IComment, - ICrossOriginBrowserWindow, ICustomEventInit, - IDocument, - IDocumentFragment, - IDocumentType, - IElement, IErrorEventInit, IEventInit, IEventListener, - IFileList, IFocusEventInit, - IHTMLAnchorElement, - IHTMLAudioElement, - IHTMLBaseElement, - IHTMLButtonElement, - IHTMLCollection, - IHTMLDialogElement, - IHTMLElement, - IHTMLFormControlsCollection, - IHTMLFormElement, - IHTMLIFrameElement, - IHTMLImageElement, - IHTMLInputElement, - IHTMLLabelElement, - IHTMLLinkElement, - IHTMLMediaElement, - IHTMLMetaElement, - IHTMLOptGroupElement, - IHTMLOptionElement, - IHTMLSelectElement, - IHTMLSlotElement, - IHTMLStyleElement, - IHTMLTemplateElement, - IHTMLTextAreaElement, - IHTMLVideoElement, IHashChangeEventInit, - IHeaders, IInputEventInit, IKeyboardEventInit, IMediaQueryListInit, IMouseEventInit, - INode, - INodeList, IOptionalBrowserSettings, - IProcessingInstruction, IProgressEventInit, - IRequest, - IResponse, - ISVGElement, - ISVGGraphicsElement, - ISVGSVGElement, - IShadowRoot, ISubmitEventInit, - IText, ITouchEventInit, ITouchInit, IUIEventInit, - IWheelEventInit, - IWindow + IWheelEventInit }; export { @@ -352,7 +262,7 @@ export { HTMLIFrameElement, HTMLImageElement, HTMLInputElement, - HTMLElement as HTMLLIElement, + HTMLElement as HTMLLElement, HTMLLabelElement, HTMLElement as HTMLLegendElement, HTMLLinkElement, diff --git a/packages/happy-dom/src/match-media/MediaQueryItem.ts b/packages/happy-dom/src/match-media/MediaQueryItem.ts index 421e271a3..afdffa23b 100644 --- a/packages/happy-dom/src/match-media/MediaQueryItem.ts +++ b/packages/happy-dom/src/match-media/MediaQueryItem.ts @@ -1,5 +1,5 @@ import CSSMeasurementConverter from '../css/declaration/measurement-converter/CSSMeasurementConverter.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import WindowBrowserSettingsReader from '../window/WindowBrowserSettingsReader.js'; import IMediaQueryRange from './IMediaQueryRange.js'; import IMediaQueryRule from './IMediaQueryRule.js'; @@ -14,7 +14,7 @@ export default class MediaQueryItem { public rules: IMediaQueryRule[]; public ranges: IMediaQueryRange[]; private rootFontSize: string | number | null = null; - private ownerWindow: IBrowserWindow; + private ownerWindow: BrowserWindow; /** * Constructor. @@ -28,7 +28,7 @@ export default class MediaQueryItem { * @param [options.ranges] Ranges. */ constructor(options: { - ownerWindow: IBrowserWindow; + ownerWindow: BrowserWindow; rootFontSize?: string | number | null; mediaTypes?: MediaQueryTypeEnum[]; not?: boolean; diff --git a/packages/happy-dom/src/match-media/MediaQueryList.ts b/packages/happy-dom/src/match-media/MediaQueryList.ts index 642f1c7fe..6ba648595 100644 --- a/packages/happy-dom/src/match-media/MediaQueryList.ts +++ b/packages/happy-dom/src/match-media/MediaQueryList.ts @@ -1,7 +1,7 @@ import EventTarget from '../event/EventTarget.js'; import * as PropertySymbol from '../PropertySymbol.js'; import Event from '../event/Event.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import IEventListener from '../event/IEventListener.js'; import MediaQueryListEvent from '../event/events/MediaQueryListEvent.js'; import IMediaQueryItem from './MediaQueryItem.js'; @@ -15,7 +15,7 @@ import MediaQueryParser from './MediaQueryParser.js'; */ export default class MediaQueryList extends EventTarget { public onchange: (event: Event) => void = null; - #ownerWindow: IBrowserWindow; + #ownerWindow: BrowserWindow; #items: IMediaQueryItem[] | null = null; #media: string; #rootFontSize: string | number | null = null; @@ -29,7 +29,7 @@ export default class MediaQueryList extends EventTarget { * @param [options.rootFontSize] Root font size. */ constructor(options: { - ownerWindow: IBrowserWindow; + ownerWindow: BrowserWindow; media: string; rootFontSize?: string | number; }) { diff --git a/packages/happy-dom/src/match-media/MediaQueryParser.ts b/packages/happy-dom/src/match-media/MediaQueryParser.ts index b6fac0319..69e600adb 100644 --- a/packages/happy-dom/src/match-media/MediaQueryParser.ts +++ b/packages/happy-dom/src/match-media/MediaQueryParser.ts @@ -1,6 +1,6 @@ import MediaQueryItem from './MediaQueryItem.js'; import MediaQueryTypeEnum from './MediaQueryTypeEnum.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; /** * Media query RegExp. @@ -44,7 +44,7 @@ export default class MediaQueryParser { * @returns Media query items. */ public static parse(options: { - ownerWindow: IBrowserWindow; + ownerWindow: BrowserWindow; mediaQuery: string; rootFontSize?: string | number | null; }): MediaQueryItem[] { diff --git a/packages/happy-dom/src/mutation-observer/MutationListener.ts b/packages/happy-dom/src/mutation-observer/MutationListener.ts index 2de8d46fd..789300c5d 100644 --- a/packages/happy-dom/src/mutation-observer/MutationListener.ts +++ b/packages/happy-dom/src/mutation-observer/MutationListener.ts @@ -1,16 +1,16 @@ import IMutationObserverInit from './IMutationObserverInit.js'; import MutationObserver from './MutationObserver.js'; import MutationRecord from './MutationRecord.js'; -import INode from '../nodes/node/INode.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import Node from '../nodes/node/Node.js'; +import BrowserWindow from '../window/BrowserWindow.js'; /** * Mutation Observer Listener. */ export default class MutationListener { - public readonly target: INode; + public readonly target: Node; public options: IMutationObserverInit; - #window: IBrowserWindow; + #window: BrowserWindow; #observer: MutationObserver; #callback: (record: MutationRecord[], observer: MutationObserver) => void; #records: MutationRecord[] = []; @@ -27,9 +27,9 @@ export default class MutationListener { * @param init.callback Callback. */ constructor(init: { - window: IBrowserWindow; + window: BrowserWindow; options: IMutationObserverInit; - target: INode; + target: Node; observer: MutationObserver; callback: (record: MutationRecord[], observer: MutationObserver) => void; }) { diff --git a/packages/happy-dom/src/mutation-observer/MutationObserver.ts b/packages/happy-dom/src/mutation-observer/MutationObserver.ts index ab56ac10c..e104908f4 100644 --- a/packages/happy-dom/src/mutation-observer/MutationObserver.ts +++ b/packages/happy-dom/src/mutation-observer/MutationObserver.ts @@ -1,10 +1,9 @@ import * as PropertySymbol from '../PropertySymbol.js'; -import INode from '../nodes/node/INode.js'; import Node from '../nodes/node/Node.js'; import IMutationObserverInit from './IMutationObserverInit.js'; import MutationListener from './MutationListener.js'; import MutationRecord from './MutationRecord.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; /** * The MutationObserver interface provides the ability to watch for changes being made to the DOM tree. @@ -14,7 +13,7 @@ import IBrowserWindow from '../window/IBrowserWindow.js'; export default class MutationObserver { #callback: (records: MutationRecord[], observer: MutationObserver) => void; #listeners: MutationListener[] = []; - #window: IBrowserWindow | null = null; + #window: BrowserWindow | null = null; /** * Constructor. @@ -31,7 +30,7 @@ export default class MutationObserver { * @param target Target. * @param options Options. */ - public observe(target: INode, options: IMutationObserverInit): void { + public observe(target: Node, options: IMutationObserverInit): void { if (!target) { throw new TypeError( `Failed to execute 'observe' on 'MutationObserver': The first parameter "target" should be of type "Node".` diff --git a/packages/happy-dom/src/mutation-observer/MutationRecord.ts b/packages/happy-dom/src/mutation-observer/MutationRecord.ts index b5eb97983..f990bef72 100644 --- a/packages/happy-dom/src/mutation-observer/MutationRecord.ts +++ b/packages/happy-dom/src/mutation-observer/MutationRecord.ts @@ -1,4 +1,4 @@ -import INode from '../nodes/node/INode.js'; +import Node from '../nodes/node/Node.js'; /** * MutationRecord is a model for a mutation. @@ -7,11 +7,11 @@ import INode from '../nodes/node/INode.js'; */ export default class MutationRecord { public type: string = null; - public target: INode = null; - public addedNodes: INode[] = []; - public removedNodes: INode[] = []; - public previousSibling: INode = null; - public nextSibling: INode = null; + public target: Node = null; + public addedNodes: Node[] = []; + public removedNodes: Node[] = []; + public previousSibling: Node = null; + public nextSibling: Node = null; public attributeName: string = null; public attributeNamespace: string = null; public oldValue: string = null; diff --git a/packages/happy-dom/src/named-node-map/INamedNodeMap.ts b/packages/happy-dom/src/named-node-map/INamedNodeMap.ts deleted file mode 100644 index 395288894..000000000 --- a/packages/happy-dom/src/named-node-map/INamedNodeMap.ts +++ /dev/null @@ -1,70 +0,0 @@ -import IAttr from '../nodes/attr/IAttr.js'; - -/** - * NamedNodeMap. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap. - */ -export default interface INamedNodeMap { - [index: number]: IAttr; - [Symbol.toStringTag]: string; - readonly length: number; - - /** - * Returns item by index. - * - * @param index Index. - */ - item: (index: number) => IAttr | null; - - /** - * Returns named item. - * - * @param name Name. - * @returns Item. - */ - getNamedItem(name: string): IAttr | null; - - /** - * Returns item by name and namespace. - * - * @param namespace Namespace. - * @param localName Local name of the attribute. - * @returns Item. - */ - getNamedItemNS(namespace: string, localName: string): IAttr | null; - - /** - * Sets named item. - * - * @param item Item. - * @returns Replaced item. - */ - setNamedItem(item: IAttr): IAttr | null; - - /** - * Adds a new namespaced item. - * - * @param item Item. - * @returns Replaced item. - */ - setNamedItemNS(item: IAttr): IAttr | null; - - /** - * Removes an item. - * - * @param name Name of item. - * @returns Removed item. - */ - removeNamedItem(name: string): IAttr | null; - - /** - * Removes a namespaced item. - * - * @param namespace Namespace. - * @param localName Local name of the item. - * @returns Removed item. - */ - removeNamedItemNS(namespace: string, localName: string): IAttr | null; -} diff --git a/packages/happy-dom/src/named-node-map/NamedNodeMap.ts b/packages/happy-dom/src/named-node-map/NamedNodeMap.ts index 531ce37d9..d1c76a54b 100644 --- a/packages/happy-dom/src/named-node-map/NamedNodeMap.ts +++ b/packages/happy-dom/src/named-node-map/NamedNodeMap.ts @@ -1,6 +1,5 @@ -import INamedNodeMap from './INamedNodeMap.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IAttr from '../nodes/attr/IAttr.js'; +import Attr from '../nodes/attr/Attr.js'; import DOMException from '../exception/DOMException.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; @@ -9,10 +8,10 @@ import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; * * @see https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap */ -export default class NamedNodeMap implements INamedNodeMap { - [index: number]: IAttr; +export default class NamedNodeMap { + [index: number]: Attr; public length = 0; - protected [PropertySymbol.namedItems]: { [k: string]: IAttr } = {}; + protected [PropertySymbol.namedItems]: { [k: string]: Attr } = {}; /** * Returns string. @@ -28,7 +27,7 @@ export default class NamedNodeMap implements INamedNodeMap { * * @returns Iterator. */ - public *[Symbol.iterator](): IterableIterator { + public *[Symbol.iterator](): IterableIterator { for (let i = 0, max = this.length; i < max; i++) { yield this[i]; } @@ -39,7 +38,7 @@ export default class NamedNodeMap implements INamedNodeMap { * * @param index Index. */ - public item(index: number): IAttr | null { + public item(index: number): Attr | null { return index >= 0 && this[index] ? this[index] : null; } @@ -49,7 +48,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param name Name. * @returns Item. */ - public getNamedItem(name: string): IAttr | null { + public getNamedItem(name: string): Attr | null { return this[PropertySymbol.namedItems][name] || null; } @@ -60,7 +59,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param localName Local name of the attribute. * @returns Item. */ - public getNamedItemNS(namespace: string, localName: string): IAttr | null { + public getNamedItemNS(namespace: string, localName: string): Attr | null { const attribute = this.getNamedItem(localName); if ( @@ -86,7 +85,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param item Item. * @returns Replaced item. */ - public setNamedItem(item: IAttr): IAttr | null { + public setNamedItem(item: Attr): Attr | null { return this[PropertySymbol.setNamedItemWithoutConsequences](item); } @@ -97,7 +96,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param item Item. * @returns Replaced item. */ - public setNamedItemNS(item: IAttr): IAttr | null { + public setNamedItemNS(item: Attr): Attr | null { return this.setNamedItem(item); } @@ -108,7 +107,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param name Name of item. * @returns Removed item. */ - public removeNamedItem(name: string): IAttr { + public removeNamedItem(name: string): Attr { const item = this[PropertySymbol.removeNamedItem](name); if (!item) { throw new DOMException( @@ -126,7 +125,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param localName Local name of the item. * @returns Removed item. */ - public removeNamedItemNS(namespace: string, localName: string): IAttr | null { + public removeNamedItemNS(namespace: string, localName: string): Attr | null { const attribute = this.getNamedItemNS(namespace, localName); if (attribute) { return this.removeNamedItem(attribute[PropertySymbol.name]); @@ -140,7 +139,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param item Item. * @returns Replaced item. */ - public [PropertySymbol.setNamedItemWithoutConsequences](item: IAttr): IAttr | null { + public [PropertySymbol.setNamedItemWithoutConsequences](item: Attr): Attr | null { if (item[PropertySymbol.name]) { const replacedItem = this[PropertySymbol.namedItems][item[PropertySymbol.name]] || null; @@ -168,7 +167,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param name Name of item. * @returns Removed item, or null if it didn't exist. */ - public [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public [PropertySymbol.removeNamedItem](name: string): Attr | null { return this[PropertySymbol.removeNamedItemWithoutConsequences](name); } @@ -178,7 +177,7 @@ export default class NamedNodeMap implements INamedNodeMap { * @param name Name of item. * @returns Removed item, or null if it didn't exist. */ - public [PropertySymbol.removeNamedItemWithoutConsequences](name: string): IAttr | null { + public [PropertySymbol.removeNamedItemWithoutConsequences](name: string): Attr | null { const removedItem = this[PropertySymbol.namedItems][name] || null; if (!removedItem) { @@ -201,7 +200,7 @@ export default class NamedNodeMap implements INamedNodeMap { * * @param item Item. */ - protected [PropertySymbol.removeNamedItemIndex](item: IAttr): void { + protected [PropertySymbol.removeNamedItemIndex](item: Attr): void { for (let i = 0; i < this.length; i++) { if (this[i] === item) { for (let b = i; b < this.length; b++) { diff --git a/packages/happy-dom/src/navigator/Navigator.ts b/packages/happy-dom/src/navigator/Navigator.ts index 94c1cf774..ebf93067a 100644 --- a/packages/happy-dom/src/navigator/Navigator.ts +++ b/packages/happy-dom/src/navigator/Navigator.ts @@ -1,6 +1,6 @@ import MimeTypeArray from './MimeTypeArray.js'; import PluginArray from './PluginArray.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import Permissions from '../permissions/Permissions.js'; import Clipboard from '../clipboard/Clipboard.js'; import WindowBrowserSettingsReader from '../window/WindowBrowserSettingsReader.js'; @@ -16,7 +16,7 @@ import FormData from '../form-data/FormData.js'; * https://html.spec.whatwg.org/multipage/system-state.html#dom-navigator. */ export default class Navigator { - #ownerWindow: IBrowserWindow; + #ownerWindow: BrowserWindow; #clipboard: Clipboard; #permissions: Permissions; @@ -25,7 +25,7 @@ export default class Navigator { * * @param ownerWindow Owner window. */ - constructor(ownerWindow: IBrowserWindow) { + constructor(ownerWindow: BrowserWindow) { this.#ownerWindow = ownerWindow; this.#clipboard = new Clipboard(ownerWindow); this.#permissions = new Permissions(); diff --git a/packages/happy-dom/src/nodes/NodeFactory.ts b/packages/happy-dom/src/nodes/NodeFactory.ts index 80a8dde76..960f84870 100644 --- a/packages/happy-dom/src/nodes/NodeFactory.ts +++ b/packages/happy-dom/src/nodes/NodeFactory.ts @@ -1,10 +1,10 @@ -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; /** * Node factory used for setting the owner document to nodes. */ export default class NodeFactory { - public static ownerDocuments: IDocument[] = []; + public static ownerDocuments: Document[] = []; /** * Creates a node instance with the given owner document. @@ -15,7 +15,7 @@ export default class NodeFactory { * @returns Node instance. */ public static createNode( - ownerDocument: IDocument, + ownerDocument: Document, nodeClass: new (...args) => T, ...args: any[] ): T { @@ -28,7 +28,7 @@ export default class NodeFactory { * * @returns Document. */ - public static pullOwnerDocument(): IDocument { + public static pullOwnerDocument(): Document { return this.ownerDocuments.pop(); } } diff --git a/packages/happy-dom/src/nodes/attr/Attr.ts b/packages/happy-dom/src/nodes/attr/Attr.ts index 08da10517..cb40b3b66 100644 --- a/packages/happy-dom/src/nodes/attr/Attr.ts +++ b/packages/happy-dom/src/nodes/attr/Attr.ts @@ -1,6 +1,5 @@ -import IElement from '../element/IElement.js'; +import Element from '../element/Element.js'; import Node from '../node/Node.js'; -import IAttr from './IAttr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; @@ -9,13 +8,13 @@ import NodeTypeEnum from '../node/NodeTypeEnum.js'; * * Reference: https://developer.mozilla.org/en-US/docs/Web/API/Attr. */ -export default class Attr extends Node implements IAttr { +export default class Attr extends Node implements Attr { public [PropertySymbol.nodeType] = NodeTypeEnum.attributeNode; public [PropertySymbol.namespaceURI]: string | null = null; public [PropertySymbol.name]: string | null = null; public [PropertySymbol.value]: string | null = null; public [PropertySymbol.specified] = true; - public [PropertySymbol.ownerElement]: IElement | null = null; + public [PropertySymbol.ownerElement]: Element | null = null; /** * Returns specified. @@ -31,7 +30,7 @@ export default class Attr extends Node implements IAttr { * * @returns Owner element. */ - public get ownerElement(): IElement | null { + public get ownerElement(): Element | null { return this[PropertySymbol.ownerElement]; } diff --git a/packages/happy-dom/src/nodes/attr/IAttr.ts b/packages/happy-dom/src/nodes/attr/IAttr.ts deleted file mode 100644 index 1b6061846..000000000 --- a/packages/happy-dom/src/nodes/attr/IAttr.ts +++ /dev/null @@ -1,15 +0,0 @@ -import IElement from '../element/IElement.js'; -import INode from './../node/INode.js'; - -/** - * Attr. - */ -export default interface IAttr extends INode { - value: string; - name: string; - namespaceURI: string; - readonly ownerElement: IElement; - readonly specified: boolean; - readonly localName: string; - readonly prefix: string; -} diff --git a/packages/happy-dom/src/nodes/character-data/CharacterData.ts b/packages/happy-dom/src/nodes/character-data/CharacterData.ts index 8845eb830..c21f4de5d 100644 --- a/packages/happy-dom/src/nodes/character-data/CharacterData.ts +++ b/packages/happy-dom/src/nodes/character-data/CharacterData.ts @@ -1,12 +1,13 @@ import Node from '../node/Node.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import CharacterDataUtility from './CharacterDataUtility.js'; -import ICharacterData from './ICharacterData.js'; -import IElement from '../element/IElement.js'; +import Element from '../element/Element.js'; import NonDocumentChildNodeUtility from '../child-node/NonDocumentChildNodeUtility.js'; import ChildNodeUtility from '../child-node/ChildNodeUtility.js'; import MutationRecord from '../../mutation-observer/MutationRecord.js'; import MutationTypeEnum from '../../mutation-observer/MutationTypeEnum.js'; +import IChildNode from '../child-node/IChildNode.js'; +import INonDocumentTypeChildNode from '../child-node/INonDocumentTypeChildNode.js'; /** * Character data base class. @@ -14,7 +15,10 @@ import MutationTypeEnum from '../../mutation-observer/MutationTypeEnum.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/CharacterData. */ -export default abstract class CharacterData extends Node implements ICharacterData { +export default abstract class CharacterData + extends Node + implements IChildNode, INonDocumentTypeChildNode +{ public [PropertySymbol.data] = ''; /** @@ -118,7 +122,7 @@ export default abstract class CharacterData extends Node implements ICharacterDa * * @returns Element. */ - public get previousElementSibling(): IElement { + public get previousElementSibling(): Element { return NonDocumentChildNodeUtility.previousElementSibling(this); } @@ -127,7 +131,7 @@ export default abstract class CharacterData extends Node implements ICharacterDa * * @returns Element. */ - public get nextElementSibling(): IElement { + public get nextElementSibling(): Element { return NonDocumentChildNodeUtility.nextElementSibling(this); } @@ -222,7 +226,7 @@ export default abstract class CharacterData extends Node implements ICharacterDa * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): ICharacterData { + public cloneNode(deep = false): CharacterData { const clone = super.cloneNode(deep); clone[PropertySymbol.data] = this[PropertySymbol.data]; return clone; diff --git a/packages/happy-dom/src/nodes/character-data/CharacterDataUtility.ts b/packages/happy-dom/src/nodes/character-data/CharacterDataUtility.ts index 46fb719f3..726318054 100644 --- a/packages/happy-dom/src/nodes/character-data/CharacterDataUtility.ts +++ b/packages/happy-dom/src/nodes/character-data/CharacterDataUtility.ts @@ -1,4 +1,4 @@ -import ICharacterData from './ICharacterData.js'; +import CharacterData from './CharacterData.js'; /** * Child node utility. @@ -10,7 +10,7 @@ export default class CharacterDataUtility { * @param characterData Character data. * @param data Data. */ - public static appendData(characterData: ICharacterData, data: string): void { + public static appendData(characterData: CharacterData, data: string): void { characterData.data += data; } @@ -21,7 +21,7 @@ export default class CharacterDataUtility { * @param offset Offset. * @param count Count. */ - public static deleteData(characterData: ICharacterData, offset: number, count: number): void { + public static deleteData(characterData: CharacterData, offset: number, count: number): void { characterData.data = characterData.data.substring(0, offset) + characterData.data.substring(offset + count); } @@ -33,7 +33,7 @@ export default class CharacterDataUtility { * @param offset Offset. * @param data Data. */ - public static insertData(characterData: ICharacterData, offset: number, data: string): void { + public static insertData(characterData: CharacterData, offset: number, data: string): void { characterData.data = characterData.data.substring(0, offset) + data + characterData.data.substring(offset); } @@ -46,7 +46,7 @@ export default class CharacterDataUtility { * @param data Data. */ public static replaceData( - characterData: ICharacterData, + characterData: CharacterData, offset: number, count: number, data: string @@ -62,11 +62,7 @@ export default class CharacterDataUtility { * @param offset Offset. * @param count Count. */ - public static substringData( - characterData: ICharacterData, - offset: number, - count: number - ): string { + public static substringData(characterData: CharacterData, offset: number, count: number): string { return characterData.data.substring(offset, offset + count); } } diff --git a/packages/happy-dom/src/nodes/character-data/ICharacterData.ts b/packages/happy-dom/src/nodes/character-data/ICharacterData.ts deleted file mode 100644 index 5ad32049d..000000000 --- a/packages/happy-dom/src/nodes/character-data/ICharacterData.ts +++ /dev/null @@ -1,57 +0,0 @@ -import INode from '../node/INode.js'; -import IChildNode from '../child-node/IChildNode.js'; -import INonDocumentTypeChildNode from '../child-node/INonDocumentTypeChildNode.js'; - -export default interface ICharacterData extends INode, IChildNode, INonDocumentTypeChildNode { - data: string; - readonly length: number; - - /** - * Appends the given DOMString to the CharacterData.data string; when this method returns, data contains the concatenated DOMString. - * - * @param data Data. - */ - appendData(data: string): void; - - /** - * Removes the specified amount of characters, starting at the specified offset, from the CharacterData.data string; when this method returns, data contains the shortened DOMString. - * - * @param offset Offset. - * @param count Count. - */ - deleteData(offset: number, count: number): void; - - /** - * Inserts the specified characters, at the specified offset, in the CharacterData.data string; when this method returns, data contains the modified DOMString. - * - * @param offset Offset. - * @param data Data. - */ - insertData(offset: number, data: string): void; - - /** - * Replaces the specified amount of characters, starting at the specified offset, with the specified DOMString; when this method returns, data contains the modified DOMString. - * - * @param offset Offset. - * @param count Count. - * @param data Data. - */ - replaceData(offset: number, count: number, data: string): void; - - /** - * Returns a DOMString containing the part of CharacterData.data of the specified length and starting at the specified offset. - * - * @param offset Offset. - * @param count Count. - */ - substringData(offset: number, count: number): string; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): ICharacterData; -} diff --git a/packages/happy-dom/src/nodes/child-node/ChildNodeUtility.ts b/packages/happy-dom/src/nodes/child-node/ChildNodeUtility.ts index 8c174856f..2a39e386b 100644 --- a/packages/happy-dom/src/nodes/child-node/ChildNodeUtility.ts +++ b/packages/happy-dom/src/nodes/child-node/ChildNodeUtility.ts @@ -3,7 +3,7 @@ import * as PropertySymbol from '../../PropertySymbol.js'; import XMLParser from '../../xml-parser/XMLParser.js'; import DocumentFragment from '../document-fragment/DocumentFragment.js'; import Document from '../document/Document.js'; -import INode from '../node/INode.js'; +import Node from '../node/Node.js'; import IParentNode from '../parent-node/IParentNode.js'; import IChildNode from './IChildNode.js'; @@ -28,7 +28,7 @@ export default class ChildNodeUtility { * @param childNode Child node. * @param nodes List of Node or DOMString. */ - public static replaceWith(childNode: IChildNode, ...nodes: (INode | string)[]): void { + public static replaceWith(childNode: IChildNode, ...nodes: (Node | string)[]): void { const parent = childNode[PropertySymbol.parentNode]; if (!parent) { @@ -57,7 +57,7 @@ export default class ChildNodeUtility { * @param childNode Child node. * @param nodes List of Node or DOMString. */ - public static before(childNode: IChildNode, ...nodes: (string | INode)[]): void { + public static before(childNode: IChildNode, ...nodes: (string | Node)[]): void { const parent = childNode[PropertySymbol.parentNode]; if (!parent) { @@ -84,7 +84,7 @@ export default class ChildNodeUtility { * @param childNode Child node. * @param nodes List of Node or DOMString. */ - public static after(childNode: IChildNode, ...nodes: (string | INode)[]): void { + public static after(childNode: IChildNode, ...nodes: (string | Node)[]): void { const parent = childNode[PropertySymbol.parentNode]; if (!parent) { diff --git a/packages/happy-dom/src/nodes/child-node/IChildNode.ts b/packages/happy-dom/src/nodes/child-node/IChildNode.ts index e5dc542a5..e212c0d57 100644 --- a/packages/happy-dom/src/nodes/child-node/IChildNode.ts +++ b/packages/happy-dom/src/nodes/child-node/IChildNode.ts @@ -1,6 +1,6 @@ -import INode from '../node/INode.js'; +import Node from '../node/Node.js'; -export default interface IChildNode extends INode { +export default interface IChildNode extends Node { /** * Removes the node from its parent. */ @@ -11,19 +11,19 @@ export default interface IChildNode extends INode { * * @param nodes List of Node or DOMString. */ - before(...nodes: (INode | string)[]): void; + before(...nodes: (Node | string)[]): void; /** * Inserts a set of Node or DOMString objects in the children list of this ChildNode's parent, just after this ChildNode. DOMString objects are inserted as equivalent Text nodes. * * @param nodes List of Node or DOMString. */ - after(...nodes: (INode | string)[]): void; + after(...nodes: (Node | string)[]): void; /** * The Node.replaceWith() method replaces this Node in the children list of its parent with a set of Node or DOMString objects. * * @param nodes List of Node or DOMString. */ - replaceWith(...nodes: (INode | string)[]): void; + replaceWith(...nodes: (Node | string)[]): void; } diff --git a/packages/happy-dom/src/nodes/child-node/INonDocumentTypeChildNode.ts b/packages/happy-dom/src/nodes/child-node/INonDocumentTypeChildNode.ts index f632c9cee..3c0ef1a30 100644 --- a/packages/happy-dom/src/nodes/child-node/INonDocumentTypeChildNode.ts +++ b/packages/happy-dom/src/nodes/child-node/INonDocumentTypeChildNode.ts @@ -1,7 +1,7 @@ -import IElement from '../element/IElement.js'; -import INode from '../node/INode.js'; +import Element from '../element/Element.js'; +import Node from '../node/Node.js'; -export default interface INonDocumentTypeChildNode extends INode { - readonly previousElementSibling: IElement; - readonly nextElementSibling: IElement; +export default interface INonDocumentTypeChildNode extends Node { + readonly previousElementSibling: Element; + readonly nextElementSibling: Element; } diff --git a/packages/happy-dom/src/nodes/child-node/NonDocumentChildNodeUtility.ts b/packages/happy-dom/src/nodes/child-node/NonDocumentChildNodeUtility.ts index 64b510f69..1de8529c3 100644 --- a/packages/happy-dom/src/nodes/child-node/NonDocumentChildNodeUtility.ts +++ b/packages/happy-dom/src/nodes/child-node/NonDocumentChildNodeUtility.ts @@ -1,4 +1,4 @@ -import IElement from '../element/IElement.js'; +import Element from '../element/Element.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; import INonDocumentTypeChildNode from './INonDocumentTypeChildNode.js'; import * as PropertySymbol from '../../PropertySymbol.js'; @@ -13,12 +13,12 @@ export default class NonDocumentChildNodeUtility { * @param childNode Child node. * @returns Element. */ - public static previousElementSibling(childNode: INonDocumentTypeChildNode): IElement { + public static previousElementSibling(childNode: INonDocumentTypeChildNode): Element { let sibling = childNode.previousSibling; while (sibling && sibling[PropertySymbol.nodeType] !== NodeTypeEnum.elementNode) { sibling = sibling.previousSibling; } - return sibling; + return sibling; } /** @@ -27,11 +27,11 @@ export default class NonDocumentChildNodeUtility { * @param childNode Child node. * @returns Element. */ - public static nextElementSibling(childNode: INonDocumentTypeChildNode): IElement { + public static nextElementSibling(childNode: INonDocumentTypeChildNode): Element { let sibling = childNode.nextSibling; while (sibling && sibling[PropertySymbol.nodeType] !== NodeTypeEnum.elementNode) { sibling = sibling.nextSibling; } - return sibling; + return sibling; } } diff --git a/packages/happy-dom/src/nodes/comment/Comment.ts b/packages/happy-dom/src/nodes/comment/Comment.ts index 07d96b5c7..2c46703b2 100644 --- a/packages/happy-dom/src/nodes/comment/Comment.ts +++ b/packages/happy-dom/src/nodes/comment/Comment.ts @@ -1,12 +1,11 @@ import CharacterData from '../character-data/CharacterData.js'; -import IComment from './IComment.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; /** * Comment node. */ -export default class Comment extends CharacterData implements IComment { +export default class Comment extends CharacterData { public [PropertySymbol.nodeType] = NodeTypeEnum.commentNode; /** @@ -34,7 +33,7 @@ export default class Comment extends CharacterData implements IComment { * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IComment { + public cloneNode(deep = false): Comment { return super.cloneNode(deep); } } diff --git a/packages/happy-dom/src/nodes/comment/IComment.ts b/packages/happy-dom/src/nodes/comment/IComment.ts deleted file mode 100644 index 08a7e8d2f..000000000 --- a/packages/happy-dom/src/nodes/comment/IComment.ts +++ /dev/null @@ -1,12 +0,0 @@ -import ICharacterData from '../character-data/ICharacterData.js'; - -export default interface IComment extends ICharacterData { - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IComment; -} diff --git a/packages/happy-dom/src/nodes/document-fragment/DocumentFragment.ts b/packages/happy-dom/src/nodes/document-fragment/DocumentFragment.ts index 0e7a068e7..33f7056ab 100644 --- a/packages/happy-dom/src/nodes/document-fragment/DocumentFragment.ts +++ b/packages/happy-dom/src/nodes/document-fragment/DocumentFragment.ts @@ -1,14 +1,11 @@ import Node from '../node/Node.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IElement from '../element/IElement.js'; +import Element from '../element/Element.js'; import QuerySelector from '../../query-selector/QuerySelector.js'; import ParentNodeUtility from '../parent-node/ParentNodeUtility.js'; -import IDocumentFragment from './IDocumentFragment.js'; -import INode from '../node/INode.js'; -import IHTMLCollection from '../element/IHTMLCollection.js'; -import ElementUtility from '../element/ElementUtility.js'; import HTMLCollection from '../element/HTMLCollection.js'; -import INodeList from '../node/INodeList.js'; +import ElementUtility from '../element/ElementUtility.js'; +import NodeList from '../node/NodeList.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; import IHTMLElementTagNameMap from '../../config/IHTMLElementTagNameMap.js'; import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.js'; @@ -16,15 +13,15 @@ import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.js'; /** * DocumentFragment. */ -export default class DocumentFragment extends Node implements IDocumentFragment { - public readonly [PropertySymbol.children]: IHTMLCollection = new HTMLCollection(); - public [PropertySymbol.rootNode]: INode = this; +export default class DocumentFragment extends Node { + public readonly [PropertySymbol.children]: HTMLCollection = new HTMLCollection(); + public [PropertySymbol.rootNode]: Node = this; public [PropertySymbol.nodeType] = NodeTypeEnum.documentFragmentNode; /** * Returns the document fragment children. */ - public get children(): IHTMLCollection { + public get children(): HTMLCollection { return this[PropertySymbol.children]; } @@ -42,7 +39,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * * @returns Element. */ - public get firstElementChild(): IElement { + public get firstElementChild(): Element { return this[PropertySymbol.children][0] ?? null; } @@ -51,7 +48,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * * @returns Element. */ - public get lastElementChild(): IElement { + public get lastElementChild(): Element { return this[PropertySymbol.children][this[PropertySymbol.children].length - 1] ?? null; } @@ -92,7 +89,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * * @param nodes List of Node or DOMString. */ - public append(...nodes: (INode | string)[]): void { + public append(...nodes: (Node | string)[]): void { ParentNodeUtility.append(this, ...nodes); } @@ -101,7 +98,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * * @param nodes List of Node or DOMString. */ - public prepend(...nodes: (INode | string)[]): void { + public prepend(...nodes: (Node | string)[]): void { ParentNodeUtility.prepend(this, ...nodes); } @@ -110,7 +107,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * * @param nodes List of Node or DOMString. */ - public replaceChildren(...nodes: (INode | string)[]): void { + public replaceChildren(...nodes: (Node | string)[]): void { ParentNodeUtility.replaceChildren(this, ...nodes); } @@ -122,7 +119,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment */ public querySelectorAll( selector: K - ): INodeList; + ): NodeList; /** * Query CSS selector to find matching elments. @@ -132,7 +129,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment */ public querySelectorAll( selector: K - ): INodeList; + ): NodeList; /** * Query CSS selector to find matching elments. @@ -140,7 +137,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * @param selector CSS selector. * @returns Matching elements. */ - public querySelectorAll(selector: string): INodeList; + public querySelectorAll(selector: string): NodeList; /** * Query CSS selector to find matching elments. @@ -148,7 +145,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * @param selector CSS selector. * @returns Matching elements. */ - public querySelectorAll(selector: string): INodeList { + public querySelectorAll(selector: string): NodeList { return QuerySelector.querySelectorAll(this, selector); } @@ -178,7 +175,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * @param selector CSS selector. * @returns Matching element. */ - public querySelector(selector: string): IElement | null; + public querySelector(selector: string): Element | null; /** * Query CSS Selector to find a matching element. @@ -186,7 +183,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * @param selector CSS selector. * @returns Matching element. */ - public querySelector(selector: string): IElement | null { + public querySelector(selector: string): Element | null { return QuerySelector.querySelector(this, selector); } @@ -196,7 +193,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment * @param id ID. * @returns Matching element. */ - public getElementById(id: string): IElement { + public getElementById(id: string): Element { return ParentNodeUtility.getElementById(this, id); } @@ -207,24 +204,24 @@ export default class DocumentFragment extends Node implements IDocumentFragment * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IDocumentFragment { + public cloneNode(deep = false): DocumentFragment { const clone = super.cloneNode(deep); if (deep) { for (const node of clone[PropertySymbol.childNodes]) { if (node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode) { - clone[PropertySymbol.children].push(node); + clone[PropertySymbol.children].push(node); } } } - return clone; + return clone; } /** * @override */ - public override appendChild(node: INode): INode { + public override appendChild(node: Node): Node { // We do not call super here as this will be handled by ElementUtility to improve performance by avoiding validation and other checks. return ElementUtility.appendChild(this, node); } @@ -232,7 +229,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment /** * @override */ - public override removeChild(node: INode): INode { + public override removeChild(node: Node): Node { // We do not call super here as this will be handled by ElementUtility to improve performance by avoiding validation and other checks. return ElementUtility.removeChild(this, node); } @@ -240,7 +237,7 @@ export default class DocumentFragment extends Node implements IDocumentFragment /** * @override */ - public override insertBefore(newNode: INode, referenceNode: INode | null): INode { + public override insertBefore(newNode: Node, referenceNode: Node | null): Node { if (arguments.length < 2) { throw new TypeError( `Failed to execute 'insertBefore' on 'Node': 2 arguments required, but only ${arguments.length} present.` diff --git a/packages/happy-dom/src/nodes/document-fragment/IDocumentFragment.ts b/packages/happy-dom/src/nodes/document-fragment/IDocumentFragment.ts deleted file mode 100644 index 73bb97553..000000000 --- a/packages/happy-dom/src/nodes/document-fragment/IDocumentFragment.ts +++ /dev/null @@ -1,78 +0,0 @@ -import IHTMLElementTagNameMap from '../../config/IHTMLElementTagNameMap.js'; -import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.js'; -import IElement from '../element/IElement.js'; -import INode from '../node/INode.js'; -import INodeList from '../node/INodeList.js'; - -export default interface IDocumentFragment extends INode { - readonly childElementCount: number; - readonly firstElementChild: IElement; - readonly lastElementChild: IElement; - readonly children: IElement[]; - - /** - * Inserts a set of Node objects or DOMString objects after the last child of the ParentNode. DOMString objects are inserted as equivalent Text nodes. - * - * @param nodes List of Node or DOMString. - */ - append(...nodes: (INode | string)[]): void; - - /** - * Inserts a set of Node objects or DOMString objects before the first child of the ParentNode. DOMString objects are inserted as equivalent Text nodes. - * - * @param nodes List of Node or DOMString. - */ - prepend(...nodes: (INode | string)[]): void; - - /** - * Query CSS Selector to find matching node. - * - * @param selector CSS selector. - * @returns Matching element. - */ - querySelector( - selector: K - ): IHTMLElementTagNameMap[K] | null; - querySelector( - selector: K - ): ISVGElementTagNameMap[K] | null; - querySelector(selector: string): IElement | null; - - /** - * Query CSS selector to find matching nodes. - * - * @param selector CSS selector. - * @returns Matching elements. - */ - querySelectorAll( - selector: K - ): INodeList; - querySelectorAll( - selector: K - ): INodeList; - querySelectorAll(selector: string): INodeList; - - /** - * Replaces the existing children of a node with a specified new set of children. - * - * @param nodes List of Node or DOMString. - */ - replaceChildren(...nodes: (INode | string)[]): void; - - /** - * Returns an element by ID. - * - * @param id ID. - * @returns Matching element. - */ - getElementById(id: string): IElement; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IDocumentFragment; -} diff --git a/packages/happy-dom/src/nodes/document-type/IDocumentType.ts b/packages/happy-dom/src/nodes/document-type/IDocumentType.ts deleted file mode 100644 index 77a8d47b8..000000000 --- a/packages/happy-dom/src/nodes/document-type/IDocumentType.ts +++ /dev/null @@ -1,19 +0,0 @@ -import INode from '../node/INode.js'; - -/** - * DocumentType. - */ -export default interface IDocumentType extends INode { - name: string; - publicId: string; - systemId: string; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IDocumentType; -} diff --git a/packages/happy-dom/src/nodes/document/Document.ts b/packages/happy-dom/src/nodes/document/Document.ts index e9ff1634a..75922cf9b 100644 --- a/packages/happy-dom/src/nodes/document/Document.ts +++ b/packages/happy-dom/src/nodes/document/Document.ts @@ -1,6 +1,6 @@ import Element from '../element/Element.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import Node from '../node/Node.js'; import NodeIterator from '../../tree-walker/NodeIterator.js'; import TreeWalker from '../../tree-walker/TreeWalker.js'; @@ -13,32 +13,25 @@ import NamespaceURI from '../../config/NamespaceURI.js'; import DocumentType from '../document-type/DocumentType.js'; import ParentNodeUtility from '../parent-node/ParentNodeUtility.js'; import QuerySelector from '../../query-selector/QuerySelector.js'; -import IDocument from './IDocument.js'; import CSSStyleSheet from '../../css/CSSStyleSheet.js'; import DOMException from '../../exception/DOMException.js'; -import IElement from '../element/IElement.js'; -import IHTMLScriptElement from '../html-script-element/IHTMLScriptElement.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IDocumentType from '../document-type/IDocumentType.js'; -import INode from '../node/INode.js'; -import IComment from '../comment/IComment.js'; -import IText from '../text/IText.js'; -import IDocumentFragment from '../document-fragment/IDocumentFragment.js'; -import INodeList from '../node/INodeList.js'; +import HTMLScriptElement from '../html-script-element/HTMLScriptElement.js'; +import HTMLElement from '../html-element/HTMLElement.js'; +import Comment from '../comment/Comment.js'; +import Text from '../text/Text.js'; import NodeList from '../node/NodeList.js'; -import IHTMLCollection from '../element/IHTMLCollection.js'; -import IHTMLLinkElement from '../html-link-element/IHTMLLinkElement.js'; -import IHTMLStyleElement from '../html-style-element/IHTMLStyleElement.js'; +import HTMLCollection from '../element/HTMLCollection.js'; +import HTMLLinkElement from '../html-link-element/HTMLLinkElement.js'; +import HTMLStyleElement from '../html-style-element/HTMLStyleElement.js'; import DocumentReadyStateEnum from './DocumentReadyStateEnum.js'; import Location from '../../location/Location.js'; import Selection from '../../selection/Selection.js'; -import IShadowRoot from '../shadow-root/IShadowRoot.js'; +import ShadowRoot from '../shadow-root/ShadowRoot.js'; import Range from '../../range/Range.js'; -import IHTMLBaseElement from '../html-base-element/IHTMLBaseElement.js'; -import IAttr from '../attr/IAttr.js'; -import IProcessingInstruction from '../processing-instruction/IProcessingInstruction.js'; +import HTMLBaseElement from '../html-base-element/HTMLBaseElement.js'; +import Attr from '../attr/Attr.js'; +import ProcessingInstruction from '../processing-instruction/ProcessingInstruction.js'; import ElementUtility from '../element/ElementUtility.js'; -import HTMLCollection from '../element/HTMLCollection.js'; import VisibilityStateEnum from './VisibilityStateEnum.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; import CookieStringUtility from '../../cookie/urilities/CookieStringUtility.js'; @@ -47,9 +40,9 @@ import NodeFactory from '../NodeFactory.js'; import { URL } from 'url'; import IHTMLElementTagNameMap from '../../config/IHTMLElementTagNameMap.js'; import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.js'; -import ISVGElement from '../svg-element/ISVGElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; -import IHTMLAnchorElement from '../html-anchor-element/IHTMLAnchorElement.js'; +import SVGElement from '../svg-element/SVGElement.js'; +import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; +import HTMLAnchorElement from '../html-anchor-element/HTMLAnchorElement.js'; import HTMLElementConfig from '../../config/HTMLElementConfig.js'; const PROCESSING_INSTRUCTION_TARGET_REGEXP = /^[a-z][a-z0-9-]+$/; @@ -57,12 +50,12 @@ const PROCESSING_INSTRUCTION_TARGET_REGEXP = /^[a-z][a-z0-9-]+$/; /** * Document. */ -export default class Document extends Node implements IDocument { +export default class Document extends Node { // Internal properties - public [PropertySymbol.children]: IHTMLCollection = new HTMLCollection(); - public [PropertySymbol.activeElement]: IHTMLElement = null; - public [PropertySymbol.nextActiveElement]: IHTMLElement = null; - public [PropertySymbol.currentScript]: IHTMLScriptElement = null; + public [PropertySymbol.children]: HTMLCollection = new HTMLCollection(); + public [PropertySymbol.activeElement]: HTMLElement | SVGElement = null; + public [PropertySymbol.nextActiveElement]: HTMLElement | SVGElement = null; + public [PropertySymbol.currentScript]: HTMLScriptElement = null; public [PropertySymbol.rootNode] = this; // Used as an unique identifier which is updated whenever the DOM gets modified. public [PropertySymbol.cacheID] = 0; @@ -74,8 +67,8 @@ export default class Document extends Node implements IDocument { public [PropertySymbol.implementation] = new DOMImplementation(this); public [PropertySymbol.readyState] = DocumentReadyStateEnum.interactive; public [PropertySymbol.referrer] = ''; - public [PropertySymbol.defaultView]: IBrowserWindow | null = null; - public [PropertySymbol.ownerWindow]: IBrowserWindow; + public [PropertySymbol.defaultView]: BrowserWindow | null = null; + public [PropertySymbol.ownerWindow]: BrowserWindow; // Private properties #selection: Selection = null; @@ -199,7 +192,7 @@ export default class Document extends Node implements IDocument { * @param injected.browserFrame Browser frame. * @param injected.window Window. */ - constructor(injected: { browserFrame: IBrowserFrame; window: IBrowserWindow }) { + constructor(injected: { browserFrame: IBrowserFrame; window: BrowserWindow }) { super(); this.#browserFrame = injected.browserFrame; this[PropertySymbol.ownerWindow] = injected.window; @@ -255,14 +248,14 @@ export default class Document extends Node implements IDocument { * * @returns Default view. */ - public get defaultView(): IBrowserWindow | null { + public get defaultView(): BrowserWindow | null { return this[PropertySymbol.defaultView]; } /** * Returns document children. */ - public get children(): IHTMLCollection { + public get children(): HTMLCollection { return this[PropertySymbol.children]; } @@ -317,14 +310,14 @@ export default class Document extends Node implements IDocument { /** * Returns a collection of all area elements and a elements in a document with a value for the href attribute. */ - public get links(): INodeList { - return >this.querySelectorAll('a[href],area[href]'); + public get links(): NodeList { + return >this.querySelectorAll('a[href],area[href]'); } /** * Returns a collection of all form elements in a document. */ - public get forms(): INodeList { + public get forms(): NodeList { return this.querySelectorAll('form'); } @@ -342,7 +335,7 @@ export default class Document extends Node implements IDocument { * * @returns Element. */ - public get firstElementChild(): IElement { + public get firstElementChild(): Element { return this[PropertySymbol.children][0] ?? null; } @@ -351,7 +344,7 @@ export default class Document extends Node implements IDocument { * * @returns Element. */ - public get lastElementChild(): IElement { + public get lastElementChild(): Element { return this[PropertySymbol.children][this[PropertySymbol.children].length - 1] ?? null; } @@ -397,8 +390,8 @@ export default class Document extends Node implements IDocument { * * @returns Element. */ - public get documentElement(): IHTMLElement { - return ParentNodeUtility.getElementByTagName(this, 'html'); + public get documentElement(): HTMLElement { + return ParentNodeUtility.getElementByTagName(this, 'html'); } /** @@ -406,7 +399,7 @@ export default class Document extends Node implements IDocument { * * @returns Document type. */ - public get doctype(): IDocumentType { + public get doctype(): DocumentType { for (const node of this[PropertySymbol.childNodes]) { if (node instanceof DocumentType) { return node; @@ -420,8 +413,8 @@ export default class Document extends Node implements IDocument { * * @returns Element. */ - public get body(): IHTMLElement { - return ParentNodeUtility.getElementByTagName(this, 'body'); + public get body(): HTMLElement { + return ParentNodeUtility.getElementByTagName(this, 'body'); } /** @@ -429,8 +422,8 @@ export default class Document extends Node implements IDocument { * * @returns Element. */ - public get head(): IHTMLElement { - return ParentNodeUtility.getElementByTagName(this, 'head'); + public get head(): HTMLElement { + return ParentNodeUtility.getElementByTagName(this, 'head'); } /** @@ -439,7 +432,7 @@ export default class Document extends Node implements IDocument { * @returns CSS style sheets. */ public get styleSheets(): CSSStyleSheet[] { - const styles = >( + const styles = >( this.querySelectorAll('link[rel="stylesheet"][href],style') ); const styleSheets = []; @@ -457,7 +450,7 @@ export default class Document extends Node implements IDocument { * * @returns Active element. */ - public get activeElement(): IHTMLElement { + public get activeElement(): HTMLElement | SVGElement { if ( this[PropertySymbol.activeElement] && !this[PropertySymbol.activeElement][PropertySymbol.isConnected] @@ -469,13 +462,13 @@ export default class Document extends Node implements IDocument { this[PropertySymbol.activeElement] && this[PropertySymbol.activeElement] instanceof Element ) { - let rootNode: IShadowRoot | IDocument = ( + let rootNode: ShadowRoot | Document = ( this[PropertySymbol.activeElement].getRootNode() ); - let activeElement: IHTMLElement = this[PropertySymbol.activeElement]; + let activeElement = this[PropertySymbol.activeElement]; while (rootNode !== this) { - activeElement = (rootNode).host; - rootNode = activeElement ? activeElement.getRootNode() : this; + activeElement = (rootNode).host; + rootNode = activeElement ? activeElement.getRootNode() : this; } return activeElement; } @@ -487,7 +480,7 @@ export default class Document extends Node implements IDocument { * * @returns Scrolling element. */ - public get scrollingElement(): IHTMLElement { + public get scrollingElement(): HTMLElement { return this.documentElement; } @@ -505,7 +498,7 @@ export default class Document extends Node implements IDocument { * * @returns Scripts. */ - public get scripts(): IHTMLCollection { + public get scripts(): HTMLCollection { return this.getElementsByTagName('script'); } @@ -516,7 +509,7 @@ export default class Document extends Node implements IDocument { * @returns Base URI. */ public get baseURI(): string { - const element = ParentNodeUtility.getElementByTagName(this, 'base'); + const element = ParentNodeUtility.getElementByTagName(this, 'base'); if (element) { return element.href; } @@ -572,7 +565,7 @@ export default class Document extends Node implements IDocument { * * @returns the currently executing script element. */ - public get currentScript(): IHTMLScriptElement { + public get currentScript(): HTMLScriptElement { return this[PropertySymbol.currentScript]; } @@ -581,7 +574,7 @@ export default class Document extends Node implements IDocument { * * @param nodes List of Node or DOMString. */ - public append(...nodes: (INode | string)[]): void { + public append(...nodes: (Node | string)[]): void { ParentNodeUtility.append(this, ...nodes); } @@ -590,7 +583,7 @@ export default class Document extends Node implements IDocument { * * @param nodes List of Node or DOMString. */ - public prepend(...nodes: (INode | string)[]): void { + public prepend(...nodes: (Node | string)[]): void { ParentNodeUtility.prepend(this, ...nodes); } @@ -599,7 +592,7 @@ export default class Document extends Node implements IDocument { * * @param nodes List of Node or DOMString. */ - public replaceChildren(...nodes: (INode | string)[]): void { + public replaceChildren(...nodes: (Node | string)[]): void { ParentNodeUtility.replaceChildren(this, ...nodes); } @@ -611,7 +604,7 @@ export default class Document extends Node implements IDocument { */ public querySelectorAll( selector: K - ): INodeList; + ): NodeList; /** * Query CSS selector to find matching elments. @@ -621,7 +614,7 @@ export default class Document extends Node implements IDocument { */ public querySelectorAll( selector: K - ): INodeList; + ): NodeList; /** * Query CSS selector to find matching elments. @@ -629,7 +622,7 @@ export default class Document extends Node implements IDocument { * @param selector CSS selector. * @returns Matching elements. */ - public querySelectorAll(selector: string): INodeList; + public querySelectorAll(selector: string): NodeList; /** * Query CSS selector to find matching elments. @@ -637,7 +630,7 @@ export default class Document extends Node implements IDocument { * @param selector CSS selector. * @returns Matching elements. */ - public querySelectorAll(selector: string): INodeList { + public querySelectorAll(selector: string): NodeList { return QuerySelector.querySelectorAll(this, selector); } @@ -667,7 +660,7 @@ export default class Document extends Node implements IDocument { * @param selector CSS selector. * @returns Matching element. */ - public querySelector(selector: string): IElement | null; + public querySelector(selector: string): Element | null; /** * Query CSS Selector to find matching node. @@ -675,7 +668,7 @@ export default class Document extends Node implements IDocument { * @param selector CSS selector. * @returns Matching element. */ - public querySelector(selector: string): IElement | null { + public querySelector(selector: string): Element | null { return QuerySelector.querySelector(this, selector); } @@ -685,7 +678,7 @@ export default class Document extends Node implements IDocument { * @param className Tag name. * @returns Matching element. */ - public getElementsByClassName(className: string): IHTMLCollection { + public getElementsByClassName(className: string): HTMLCollection { return ParentNodeUtility.getElementsByClassName(this, className); } @@ -697,7 +690,7 @@ export default class Document extends Node implements IDocument { */ public getElementsByTagName( tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name. @@ -707,7 +700,7 @@ export default class Document extends Node implements IDocument { */ public getElementsByTagName( tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name. @@ -715,7 +708,7 @@ export default class Document extends Node implements IDocument { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagName(tagName: string): IHTMLCollection; + public getElementsByTagName(tagName: string): HTMLCollection; /** * Returns an elements by tag name. @@ -723,7 +716,7 @@ export default class Document extends Node implements IDocument { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagName(tagName: string): IHTMLCollection { + public getElementsByTagName(tagName: string): HTMLCollection { return ParentNodeUtility.getElementsByTagName(this, tagName); } @@ -737,7 +730,7 @@ export default class Document extends Node implements IDocument { public getElementsByTagNameNS( namespaceURI: 'http://www.w3.org/1999/xhtml', tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name and namespace. @@ -749,7 +742,7 @@ export default class Document extends Node implements IDocument { public getElementsByTagNameNS( namespaceURI: 'http://www.w3.org/2000/svg', tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name and namespace. @@ -758,7 +751,7 @@ export default class Document extends Node implements IDocument { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagNameNS(namespaceURI: string, tagName: string): IHTMLCollection; + public getElementsByTagNameNS(namespaceURI: string, tagName: string): HTMLCollection; /** * Returns an elements by tag name and namespace. @@ -767,7 +760,7 @@ export default class Document extends Node implements IDocument { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagNameNS(namespaceURI: string, tagName: string): IHTMLCollection { + public getElementsByTagNameNS(namespaceURI: string, tagName: string): HTMLCollection { return ParentNodeUtility.getElementsByTagNameNS(this, namespaceURI, tagName); } @@ -777,7 +770,7 @@ export default class Document extends Node implements IDocument { * @param id ID. * @returns Matching element. */ - public getElementById(id: string): IElement { + public getElementById(id: string): Element { return ParentNodeUtility.getElementById(this, id); } @@ -787,17 +780,17 @@ export default class Document extends Node implements IDocument { * @returns Matching element. * @param name */ - public getElementsByName(name: string): INodeList { + public getElementsByName(name: string): NodeList { const getElementsByName = ( - parentNode: IElement | IDocumentFragment | IDocument, + parentNode: Element | DocumentFragment | Document, name: string - ): INodeList => { - const matches = new NodeList(); + ): NodeList => { + const matches = new NodeList(); for (const child of (parentNode)[PropertySymbol.children]) { if (child.getAttributeNS(null, 'name') === name) { matches.push(child); } - for (const match of getElementsByName(child, name)) { + for (const match of getElementsByName(child, name)) { matches.push(match); } } @@ -813,13 +806,13 @@ export default class Document extends Node implements IDocument { * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IDocument { + public cloneNode(deep = false): Document { const clone = super.cloneNode(deep); if (deep) { for (const node of clone[PropertySymbol.childNodes]) { if (node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode) { - clone[PropertySymbol.children].push(node); + clone[PropertySymbol.children].push(node); } } } @@ -830,7 +823,7 @@ export default class Document extends Node implements IDocument { /** * @override */ - public override appendChild(node: INode): INode { + public override appendChild(node: Node): Node { // We do not call super here as this will be handled by ElementUtility to improve performance by avoiding validation and other checks. return ElementUtility.appendChild(this, node); } @@ -838,7 +831,7 @@ export default class Document extends Node implements IDocument { /** * @override */ - public override removeChild(node: INode): INode { + public override removeChild(node: Node): Node { // We do not call super here as this will be handled by ElementUtility to improve performance by avoiding validation and other checks. return ElementUtility.removeChild(this, node); } @@ -846,7 +839,7 @@ export default class Document extends Node implements IDocument { /** * @override */ - public override insertBefore(newNode: INode, referenceNode: INode | null): INode { + public override insertBefore(newNode: Node, referenceNode: Node | null): Node { if (arguments.length < 2) { throw new TypeError( `Failed to execute 'insertBefore' on 'Node': 2 arguments required, but only ${arguments.length} present.` @@ -898,8 +891,8 @@ export default class Document extends Node implements IDocument { this.appendChild(documentElement); - const head = ParentNodeUtility.getElementByTagName(this, 'head'); - let body = ParentNodeUtility.getElementByTagName(this, 'body'); + const head = ParentNodeUtility.getElementByTagName(this, 'head'); + let body = ParentNodeUtility.getElementByTagName(this, 'body'); if (!body) { body = this.createElement('body'); @@ -959,7 +952,7 @@ export default class Document extends Node implements IDocument { * * @returns Document. */ - public open(): IDocument { + public open(): Document { this[PropertySymbol.isFirstWriteAfterOpen] = true; for (const eventType of Object.keys(this[PropertySymbol.listeners])) { @@ -1019,7 +1012,7 @@ export default class Document extends Node implements IDocument { * @param [options.is] Tag name of a custom element previously defined via customElements.define(). * @returns Element. */ - public createElement(qualifiedName: string, options?: { is?: string }): IHTMLElement; + public createElement(qualifiedName: string, options?: { is?: string }): HTMLElement; /** * Creates an element. @@ -1029,8 +1022,8 @@ export default class Document extends Node implements IDocument { * @param [options.is] Tag name of a custom element previously defined via customElements.define(). * @returns Element. */ - public createElement(qualifiedName: string, options?: { is?: string }): IHTMLElement { - return this.createElementNS(NamespaceURI.html, qualifiedName, options); + public createElement(qualifiedName: string, options?: { is?: string }): HTMLElement { + return this.createElementNS(NamespaceURI.html, qualifiedName, options); } /** @@ -1076,7 +1069,7 @@ export default class Document extends Node implements IDocument { namespaceURI: string, qualifiedName: string, options?: { is?: string } - ): IElement; + ): Element; /** * Creates an element with the specified namespace URI and qualified name. @@ -1091,7 +1084,7 @@ export default class Document extends Node implements IDocument { namespaceURI: string, qualifiedName: string, options?: { is?: string } - ): IElement { + ): Element { qualifiedName = String(qualifiedName); if (!qualifiedName) { @@ -1102,7 +1095,7 @@ export default class Document extends Node implements IDocument { // SVG element if (namespaceURI === NamespaceURI.svg) { - const element = NodeFactory.createNode( + const element = NodeFactory.createNode( this, qualifiedName === 'svg' ? this[PropertySymbol.ownerWindow].SVGSVGElement @@ -1112,7 +1105,7 @@ export default class Document extends Node implements IDocument { element[PropertySymbol.localName] = qualifiedName; element[PropertySymbol.namespaceURI] = namespaceURI; element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null; - return (element); + return (element); } // Custom HTML element @@ -1137,7 +1130,7 @@ export default class Document extends Node implements IDocument { // Known HTML element if (elementClass) { - const element = NodeFactory.createNode(this, elementClass); + const element = NodeFactory.createNode(this, elementClass); element[PropertySymbol.tagName] = qualifiedName.toUpperCase(); element[PropertySymbol.localName] = localName; @@ -1148,7 +1141,7 @@ export default class Document extends Node implements IDocument { } // Unknown HTML element - const element = NodeFactory.createNode( + const element = NodeFactory.createNode( this, // If the tag name contains a hyphen, it is an unknown custom element and we should use HTMLElement. localName.includes('-') @@ -1161,7 +1154,7 @@ export default class Document extends Node implements IDocument { element[PropertySymbol.namespaceURI] = namespaceURI; element[PropertySymbol.isValue] = options && options.is ? String(options.is) : null; - return element; + return element; } /* eslint-enable jsdoc/valid-types */ @@ -1172,8 +1165,8 @@ export default class Document extends Node implements IDocument { * @param [data] Text data. * @returns Text node. */ - public createTextNode(data?: string): IText { - return NodeFactory.createNode(this, this[PropertySymbol.ownerWindow].Text, data); + public createTextNode(data?: string): Text { + return NodeFactory.createNode(this, this[PropertySymbol.ownerWindow].Text, data); } /** @@ -1182,8 +1175,8 @@ export default class Document extends Node implements IDocument { * @param [data] Text data. * @returns Text node. */ - public createComment(data?: string): IComment { - return NodeFactory.createNode(this, this[PropertySymbol.ownerWindow].Comment, data); + public createComment(data?: string): Comment { + return NodeFactory.createNode(this, this[PropertySymbol.ownerWindow].Comment, data); } /** @@ -1191,7 +1184,7 @@ export default class Document extends Node implements IDocument { * * @returns Document fragment. */ - public createDocumentFragment(): IDocumentFragment { + public createDocumentFragment(): DocumentFragment { return new this[PropertySymbol.ownerWindow].DocumentFragment(); } @@ -1202,11 +1195,7 @@ export default class Document extends Node implements IDocument { * @param [whatToShow] What to show. * @param [filter] Filter. */ - public createNodeIterator( - root: INode, - whatToShow = -1, - filter: INodeFilter = null - ): NodeIterator { + public createNodeIterator(root: Node, whatToShow = -1, filter: INodeFilter = null): NodeIterator { return new NodeIterator(root, whatToShow, filter); } @@ -1217,7 +1206,7 @@ export default class Document extends Node implements IDocument { * @param [whatToShow] What to show. * @param [filter] Filter. */ - public createTreeWalker(root: INode, whatToShow = -1, filter: INodeFilter = null): TreeWalker { + public createTreeWalker(root: Node, whatToShow = -1, filter: INodeFilter = null): TreeWalker { return new TreeWalker(root, whatToShow, filter); } @@ -1241,7 +1230,7 @@ export default class Document extends Node implements IDocument { * @param qualifiedName Name. * @returns Attribute. */ - public createAttribute(qualifiedName: string): IAttr { + public createAttribute(qualifiedName: string): Attr { return this.createAttributeNS(null, qualifiedName.toLowerCase()); } @@ -1252,11 +1241,11 @@ export default class Document extends Node implements IDocument { * @param qualifiedName Qualified name. * @returns Element. */ - public createAttributeNS(namespaceURI: string, qualifiedName: string): IAttr { - const attribute = NodeFactory.createNode(this, this[PropertySymbol.ownerWindow].Attr); + public createAttributeNS(namespaceURI: string, qualifiedName: string): Attr { + const attribute = NodeFactory.createNode(this, this[PropertySymbol.ownerWindow].Attr); attribute[PropertySymbol.namespaceURI] = namespaceURI; attribute[PropertySymbol.name] = qualifiedName; - return attribute; + return attribute; } /** @@ -1265,7 +1254,7 @@ export default class Document extends Node implements IDocument { * @param node Node to import. * @param [deep=false] Set to "true" if the clone should be deep. */ - public importNode(node: INode, deep = false): INode { + public importNode(node: Node, deep = false): Node { if (!(node instanceof Node)) { throw new DOMException('Parameter 1 was not of type Node.'); } @@ -1289,7 +1278,7 @@ export default class Document extends Node implements IDocument { * @param node Node to adopt. * @returns Adopted node. */ - public adoptNode(node: INode): INode { + public adoptNode(node: Node): Node { if (!(node instanceof Node)) { throw new DOMException('Parameter 1 was not of type Node.'); } @@ -1328,9 +1317,9 @@ export default class Document extends Node implements IDocument { * * @param target Target. * @param data Data. - * @returns IProcessingInstruction. + * @returns ProcessingInstruction. */ - public createProcessingInstruction(target: string, data: string): IProcessingInstruction { + public createProcessingInstruction(target: string, data: string): ProcessingInstruction { if (!target || !PROCESSING_INSTRUCTION_TARGET_REGEXP.test(target)) { throw new DOMException( `Failed to execute 'createProcessingInstruction' on 'Document': The target provided ('${target}') is not a valid name.` @@ -1341,7 +1330,7 @@ export default class Document extends Node implements IDocument { `Failed to execute 'createProcessingInstruction' on 'Document': The data provided ('?>') contains '?>'` ); } - const processingInstruction = NodeFactory.createNode( + const processingInstruction = NodeFactory.createNode( this, this[PropertySymbol.ownerWindow].ProcessingInstruction, data @@ -1355,7 +1344,7 @@ export default class Document extends Node implements IDocument { * * @param node Node. */ - #importNode(node: INode): void { + #importNode(node: Node): void { node[PropertySymbol.ownerDocument] = this; for (const child of node[PropertySymbol.childNodes]) { diff --git a/packages/happy-dom/src/nodes/document/DocumentReadyStateManager.ts b/packages/happy-dom/src/nodes/document/DocumentReadyStateManager.ts index 61121a3a1..a4d3de2fc 100644 --- a/packages/happy-dom/src/nodes/document/DocumentReadyStateManager.ts +++ b/packages/happy-dom/src/nodes/document/DocumentReadyStateManager.ts @@ -1,4 +1,4 @@ -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; /** * Document ready state manager. @@ -6,7 +6,7 @@ import IBrowserWindow from '../../window/IBrowserWindow.js'; export default class DocumentReadyStateManager { private totalTasks = 0; private readyStateCallbacks: (() => void)[] = []; - private window: IBrowserWindow = null; + private window: BrowserWindow = null; private immediate: NodeJS.Immediate | null = null; private isComplete = false; @@ -15,7 +15,7 @@ export default class DocumentReadyStateManager { * * @param window */ - constructor(window: IBrowserWindow) { + constructor(window: BrowserWindow) { this.window = window; } diff --git a/packages/happy-dom/src/nodes/document/IDocument.ts b/packages/happy-dom/src/nodes/document/IDocument.ts deleted file mode 100644 index e22aa0f5d..000000000 --- a/packages/happy-dom/src/nodes/document/IDocument.ts +++ /dev/null @@ -1,365 +0,0 @@ -import IElement from '../element/IElement.js'; -import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; -import NodeIterator from '../../tree-walker/NodeIterator.js'; -import TreeWalker from '../../tree-walker/TreeWalker.js'; -import Event from '../../event/Event.js'; -import DOMImplementation from '../../dom-implementation/DOMImplementation.js'; -import INodeFilter from '../../tree-walker/INodeFilter.js'; -import IAttr from '../attr/IAttr.js'; -import IDocumentType from '../document-type/IDocumentType.js'; -import IParentNode from '../parent-node/IParentNode.js'; -import INode from '../node/INode.js'; -import IDocumentFragment from '../document-fragment/IDocumentFragment.js'; -import Selection from '../../selection/Selection.js'; -import IHTMLScriptElement from '../html-script-element/IHTMLScriptElement.js'; -import CSSStyleSheet from '../../css/CSSStyleSheet.js'; -import Location from '../../location/Location.js'; -import DocumentReadyStateEnum from './DocumentReadyStateEnum.js'; -import INodeList from '../node/INodeList.js'; -import Range from '../../range/Range.js'; -import IProcessingInstruction from '../processing-instruction/IProcessingInstruction.js'; -import VisibilityStateEnum from './VisibilityStateEnum.js'; -import IHTMLElementTagNameMap from '../../config/IHTMLElementTagNameMap.js'; -import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.js'; -import IText from '../text/IText.js'; -import IComment from '../comment/IComment.js'; -import IHTMLCollection from '../element/IHTMLCollection.js'; -import IHTMLAnchorElement from '../html-anchor-element/IHTMLAnchorElement.js'; - -/** - * Document. - */ -export default interface IDocument extends IParentNode { - readonly defaultView: IBrowserWindow | null; - readonly [PropertySymbol.ownerWindow]: IBrowserWindow; - readonly implementation: DOMImplementation; - readonly documentElement: IHTMLElement; - readonly doctype: IDocumentType; - readonly body: IHTMLElement; - readonly head: IHTMLElement; - readonly scripts: IHTMLCollection; - readonly activeElement: IHTMLElement; - readonly styleSheets: CSSStyleSheet[]; - readonly scrollingElement: IHTMLElement; - readonly location: Location; - readonly readyState: DocumentReadyStateEnum; - readonly charset: string; - readonly characterSet: string; - readonly URL: string; - readonly documentURI: string; - readonly visibilityState: VisibilityStateEnum; - readonly hidden: boolean; - readonly links: INodeList; - readonly forms: INodeList; - readonly referrer: string; - readonly currentScript: IHTMLScriptElement; - adoptedStyleSheets: CSSStyleSheet[]; - cookie: string; - title: string; - - // Events - onreadystatechange: (event: Event) => void; - onpointerlockchange: (event: Event) => void; - onpointerlockerror: (event: Event) => void; - onbeforecopy: (event: Event) => void; - onbeforecut: (event: Event) => void; - onbeforepaste: (event: Event) => void; - onfreeze: (event: Event) => void; - onresume: (event: Event) => void; - onsearch: (event: Event) => void; - onvisibilitychange: (event: Event) => void; - onfullscreenchange: (event: Event) => void; - onfullscreenerror: (event: Event) => void; - onwebkitfullscreenchange: (event: Event) => void; - onwebkitfullscreenerror: (event: Event) => void; - onbeforexrselect: (event: Event) => void; - onabort: (event: Event) => void; - onbeforeinput: (event: Event) => void; - onblur: (event: Event) => void; - oncancel: (event: Event) => void; - oncanplay: (event: Event) => void; - oncanplaythrough: (event: Event) => void; - onchange: (event: Event) => void; - onclick: (event: Event) => void; - onclose: (event: Event) => void; - oncontextlost: (event: Event) => void; - oncontextmenu: (event: Event) => void; - oncontextrestored: (event: Event) => void; - oncuechange: (event: Event) => void; - ondblclick: (event: Event) => void; - ondrag: (event: Event) => void; - ondragend: (event: Event) => void; - ondragenter: (event: Event) => void; - ondragleave: (event: Event) => void; - ondragover: (event: Event) => void; - ondragstart: (event: Event) => void; - ondrop: (event: Event) => void; - ondurationchange: (event: Event) => void; - onemptied: (event: Event) => void; - onended: (event: Event) => void; - onerror: (event: Event) => void; - onfocus: (event: Event) => void; - onformdata: (event: Event) => void; - oninput: (event: Event) => void; - oninvalid: (event: Event) => void; - onkeydown: (event: Event) => void; - onkeypress: (event: Event) => void; - onkeyup: (event: Event) => void; - onload: (event: Event) => void; - onloadeddata: (event: Event) => void; - onloadedmetadata: (event: Event) => void; - onloadstart: (event: Event) => void; - onmousedown: (event: Event) => void; - onmouseenter: (event: Event) => void; - onmouseleave: (event: Event) => void; - onmousemove: (event: Event) => void; - onmouseout: (event: Event) => void; - onmouseover: (event: Event) => void; - onmouseup: (event: Event) => void; - onmousewheel: (event: Event) => void; - onpause: (event: Event) => void; - onplay: (event: Event) => void; - onplaying: (event: Event) => void; - onprogress: (event: Event) => void; - onratechange: (event: Event) => void; - onreset: (event: Event) => void; - onresize: (event: Event) => void; - onscroll: (event: Event) => void; - onsecuritypolicyviolation: (event: Event) => void; - onseeked: (event: Event) => void; - onseeking: (event: Event) => void; - onselect: (event: Event) => void; - onslotchange: (event: Event) => void; - onstalled: (event: Event) => void; - onsubmit: (event: Event) => void; - onsuspend: (event: Event) => void; - ontimeupdate: (event: Event) => void; - ontoggle: (event: Event) => void; - onvolumechange: (event: Event) => void; - onwaiting: (event: Event) => void; - onwebkitanimationend: (event: Event) => void; - onwebkitanimationiteration: (event: Event) => void; - onwebkitanimationstart: (event: Event) => void; - onwebkittransitionend: (event: Event) => void; - onwheel: (event: Event) => void; - onauxclick: (event: Event) => void; - ongotpointercapture: (event: Event) => void; - onlostpointercapture: (event: Event) => void; - onpointerdown: (event: Event) => void; - onpointermove: (event: Event) => void; - onpointerrawupdate: (event: Event) => void; - onpointerup: (event: Event) => void; - onpointercancel: (event: Event) => void; - onpointerover: (event: Event) => void; - onpointerout: (event: Event) => void; - onpointerenter: (event: Event) => void; - onpointerleave: (event: Event) => void; - onselectstart: (event: Event) => void; - onselectionchange: (event: Event) => void; - onanimationend: (event: Event) => void; - onanimationiteration: (event: Event) => void; - onanimationstart: (event: Event) => void; - ontransitionrun: (event: Event) => void; - ontransitionstart: (event: Event) => void; - ontransitionend: (event: Event) => void; - ontransitioncancel: (event: Event) => void; - oncopy: (event: Event) => void; - oncut: (event: Event) => void; - onpaste: (event: Event) => void; - onbeforematch: (event: Event) => void; - - /** - * Replaces the document HTML with new HTML. - * - * @param html HTML. - */ - write(html: string): void; - - /** - * Opens the document. - * - * @returns Document. - */ - open(): IDocument; - - /** - * Closes the document. - */ - close(): void; - - /** - * Creates an element. - * - * @param qualifiedName Tag name. - * @param [options] Options. - * @returns Element. - */ - createElement( - qualifiedName: K, - options?: { is?: string } - ): IHTMLElementTagNameMap[K]; - createElement( - qualifiedName: K, - options?: { is?: string } - ): ISVGElementTagNameMap[K]; - createElement(tagName: string, options?: { is?: string }): IHTMLElement; - - /** - * Creates an element with the specified namespace URI and qualified name. - * - * @param qualifiedName Tag name. - * @param [options] Options. - * @returns Element. - */ - createElementNS( - namespaceURI: 'http://www.w3.org/1999/xhtml', - qualifiedName: K, - options?: { is?: string } - ): IHTMLElementTagNameMap[K]; - createElementNS( - namespaceURI: 'http://www.w3.org/2000/svg', - qualifiedName: K, - options?: { is?: string } - ): ISVGElementTagNameMap[K]; - createElementNS(namespaceURI: string, qualifiedName: string, options?: { is?: string }): IElement; - - /** - * Creates a text node. - * - * @param data Text data. - * @returns Text node. - */ - createTextNode(data?: string): IText; - - /** - * Creates a comment node. - * - * @param data Text data. - * @returns Text node. - */ - createComment(data?: string): IComment; - - /** - * Creates a document fragment. - * - * @returns Document fragment. - */ - createDocumentFragment(): IDocumentFragment; - - /** - * Creates a node iterator. - * - * @param root Root. - * @param [whatToShow] What to show. - * @param [filter] Filter. - */ - createNodeIterator(root: INode, whatToShow?: number, filter?: INodeFilter): NodeIterator; - - /** - * Creates a Tree Walker. - * - * @param root Root. - * @param [whatToShow] What to show. - * @param [filter] Filter. - */ - createTreeWalker(root: INode, whatToShow?: number, filter?: INodeFilter): TreeWalker; - - /** - * Creates an event. - * - * @deprecated - * @param _type Type. - * @returns Event. - */ - createEvent(_type: string): Event; - - /** - * Creates an Attr node. - * - * @param name Name. - * @returns Attribute. - */ - createAttribute(name: string): IAttr; - - /** - * Creates a namespaced Attr node. - * - * @param namespaceURI Namespace URI. - * @param qualifiedName Qualified name. - * @returns Element. - */ - createAttributeNS(namespaceURI: string, qualifiedName: string): IAttr; - - /** - * Imports a node. - * - * @param node Node to import. - * @param Imported Node. - */ - importNode(node: INode): INode; - - /** - * Creates a range. - * - * @returns Range. - */ - createRange(): Range; - - /** - * Returns an element by ID. - * - * @param id ID. - * @returns Matching element. - */ - getElementById(id: string): IElement; - - /** - * Returns an elements by name. - * - * @param name Name. - * @returns Matching element. - */ - getElementsByName(name: string): INodeList; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IDocument; - - /** - * Adopts a node. - * - * @param node Node to adopt. - * @returns Adopted node. - */ - adoptNode(node: INode): INode; - - /** - * Returns selection. - * - * @returns Selection. - */ - getSelection(): Selection; - - /** - * Returns a boolean value indicating whether the document or any element inside the document has focus. - * - * @returns "true" if the document has focus. - */ - hasFocus(): boolean; - - /** - * Creates a Processing Instruction node. - * - * @param target Target. - * @param data Data. - * @returns IProcessingInstruction. - */ - createProcessingInstruction(target: string, data: string): IProcessingInstruction; -} diff --git a/packages/happy-dom/src/nodes/element/DOMRectList.ts b/packages/happy-dom/src/nodes/element/DOMRectList.ts new file mode 100644 index 000000000..4b7ef0382 --- /dev/null +++ b/packages/happy-dom/src/nodes/element/DOMRectList.ts @@ -0,0 +1,15 @@ +import DOMRect from './DOMRect.js'; + +/** + * DOMRectList. + */ +export default class DOMRectList extends Array { + /** + * Returns item by index. + * + * @param index Index. + */ + public item(index: number): DOMRect { + return this[index] ?? null; + } +} diff --git a/packages/happy-dom/src/nodes/element/DOMRectListFactory.ts b/packages/happy-dom/src/nodes/element/DOMRectListFactory.ts deleted file mode 100644 index cc7fccb20..000000000 --- a/packages/happy-dom/src/nodes/element/DOMRectListFactory.ts +++ /dev/null @@ -1,33 +0,0 @@ -import DOMRect from './DOMRect.js'; -import IDOMRectList from './IDOMRectList.js'; - -/** - * DOM rect list factory. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects - */ -export default class DOMRectListFactory { - /** - * Creates an HTMLCollection. - * - * @param list Nodes. - * @returns HTMLCollection. - */ - public static create(list?: DOMRect[]): IDOMRectList { - list = list ? list.slice() : []; - Object.defineProperty(list, 'item', { - value: this.getItem.bind(null, list) - }); - return >list; - } - - /** - * Returns node by index. - * - * @param list - * @param index Index. - */ - private static getItem(list: DOMRect[], index: number): DOMRect { - return list[index] || null; - } -} diff --git a/packages/happy-dom/src/nodes/element/Element.ts b/packages/happy-dom/src/nodes/element/Element.ts index 9f7c775b0..852bf4cea 100644 --- a/packages/happy-dom/src/nodes/element/Element.ts +++ b/packages/happy-dom/src/nodes/element/Element.ts @@ -3,28 +3,21 @@ import * as PropertySymbol from '../../PropertySymbol.js'; import ShadowRoot from '../shadow-root/ShadowRoot.js'; import DOMRect from './DOMRect.js'; import DOMTokenList from '../../dom-token-list/DOMTokenList.js'; -import IDOMTokenList from '../../dom-token-list/IDOMTokenList.js'; import QuerySelector from '../../query-selector/QuerySelector.js'; import XMLParser from '../../xml-parser/XMLParser.js'; import XMLSerializer from '../../xml-serializer/XMLSerializer.js'; import ChildNodeUtility from '../child-node/ChildNodeUtility.js'; import ParentNodeUtility from '../parent-node/ParentNodeUtility.js'; import NonDocumentChildNodeUtility from '../child-node/NonDocumentChildNodeUtility.js'; -import IElement from './IElement.js'; import DOMException from '../../exception/DOMException.js'; -import IShadowRoot from '../shadow-root/IShadowRoot.js'; -import INode from '../node/INode.js'; -import IHTMLCollection from './IHTMLCollection.js'; -import INodeList from '../node/INodeList.js'; -import { TInsertAdjacentPositions } from './IElement.js'; -import IText from '../text/IText.js'; -import IDOMRectList from './IDOMRectList.js'; -import DOMRectListFactory from './DOMRectListFactory.js'; -import IAttr from '../attr/IAttr.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import HTMLCollection from './HTMLCollection.js'; +import NodeList from '../node/NodeList.js'; +import Text from '../text/Text.js'; +import DOMRectList from './DOMRectList.js'; +import Attr from '../attr/Attr.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import Event from '../../event/Event.js'; import ElementUtility from './ElementUtility.js'; -import HTMLCollection from './HTMLCollection.js'; import EventPhaseEnum from '../../event/EventPhaseEnum.js'; import CSSStyleDeclaration from '../../css/declaration/CSSStyleDeclaration.js'; import DocumentFragment from '../document-fragment/DocumentFragment.js'; @@ -36,11 +29,19 @@ import NodeFactory from '../NodeFactory.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; import IHTMLElementTagNameMap from '../../config/IHTMLElementTagNameMap.js'; import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.js'; +import IChildNode from '../child-node/IChildNode.js'; +import INonDocumentTypeChildNode from '../child-node/INonDocumentTypeChildNode.js'; +import IParentNode from '../parent-node/IParentNode.js'; + +type InsertAdjacentPosition = 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend'; /** * Element. */ -export default class Element extends Node implements IElement { +export default class Element + extends Node + implements IChildNode, INonDocumentTypeChildNode, IParentNode +{ // ObservedAttributes should only be called once by CustomElementRegistry (see #117) // CustomElementRegistry will therefore populate "[PropertySymbol.observedAttributes]" when CustomElementRegistry.define() is called public static [PropertySymbol.observedAttributes]: string[]; @@ -83,7 +84,7 @@ export default class Element extends Node implements IElement { public ontouchstart: (event: Event) => void | null = null; // Internal properties - public [PropertySymbol.children]: IHTMLCollection = new HTMLCollection(); + public [PropertySymbol.children]: HTMLCollection = new HTMLCollection(); public [PropertySymbol.classList]: DOMTokenList = null; public [PropertySymbol.isValue]: string | null = null; public [PropertySymbol.computedStyle]: CSSStyleDeclaration | null = null; @@ -91,12 +92,12 @@ export default class Element extends Node implements IElement { public [PropertySymbol.tagName]: string | null = null; public [PropertySymbol.localName]: string | null = null; public [PropertySymbol.prefix]: string | null = null; - public [PropertySymbol.shadowRoot]: IShadowRoot | null = null; + public [PropertySymbol.shadowRoot]: ShadowRoot | null = null; public [PropertySymbol.scrollHeight] = 0; public [PropertySymbol.scrollWidth] = 0; public [PropertySymbol.scrollTop] = 0; public [PropertySymbol.scrollLeft] = 0; - public [PropertySymbol.attributes]: INamedNodeMap = new ElementNamedNodeMap(this); + public [PropertySymbol.attributes]: NamedNodeMap = new ElementNamedNodeMap(this); public [PropertySymbol.namespaceURI]: string | null = null; /** @@ -122,7 +123,7 @@ export default class Element extends Node implements IElement { * * @returns Shadow root. */ - public get shadowRoot(): IShadowRoot | null { + public get shadowRoot(): ShadowRoot | null { const shadowRoot = this[PropertySymbol.shadowRoot]; return shadowRoot && shadowRoot[PropertySymbol.mode] === 'open' ? shadowRoot : null; } @@ -186,7 +187,7 @@ export default class Element extends Node implements IElement { * * @returns Attributes. */ - public get attributes(): INamedNodeMap { + public get attributes(): NamedNodeMap { return this[PropertySymbol.attributes]; } @@ -202,7 +203,7 @@ export default class Element extends Node implements IElement { /** * Returns element children. */ - public get children(): IHTMLCollection { + public get children(): HTMLCollection { return this[PropertySymbol.children]; } @@ -211,11 +212,11 @@ export default class Element extends Node implements IElement { * * @returns Class list. */ - public get classList(): IDOMTokenList { + public get classList(): DOMTokenList { if (!this[PropertySymbol.classList]) { this[PropertySymbol.classList] = new DOMTokenList(this, 'class'); } - return this[PropertySymbol.classList]; + return this[PropertySymbol.classList]; } /** @@ -295,7 +296,7 @@ export default class Element extends Node implements IElement { * * @returns Element. */ - public get previousElementSibling(): IElement { + public get previousElementSibling(): Element { return NonDocumentChildNodeUtility.previousElementSibling(this); } @@ -304,7 +305,7 @@ export default class Element extends Node implements IElement { * * @returns Element. */ - public get nextElementSibling(): IElement { + public get nextElementSibling(): Element { return NonDocumentChildNodeUtility.nextElementSibling(this); } @@ -385,7 +386,7 @@ export default class Element extends Node implements IElement { * * @returns Element. */ - public get firstElementChild(): IElement { + public get firstElementChild(): Element { return this[PropertySymbol.children][0] ?? null; } @@ -394,7 +395,7 @@ export default class Element extends Node implements IElement { * * @returns Element. */ - public get lastElementChild(): IElement { + public get lastElementChild(): Element { return this[PropertySymbol.children][this[PropertySymbol.children].length - 1] ?? null; } @@ -464,7 +465,7 @@ export default class Element extends Node implements IElement { * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IElement { + public cloneNode(deep = false): Element { const clone = super.cloneNode(deep); clone[PropertySymbol.tagName] = this[PropertySymbol.tagName]; @@ -487,18 +488,18 @@ export default class Element extends Node implements IElement { if (deep) { for (const node of clone[PropertySymbol.childNodes]) { if (node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode) { - clone[PropertySymbol.children].push(node); + clone[PropertySymbol.children].push(node); } } } - return clone; + return clone; } /** * @override */ - public override appendChild(node: INode): INode { + public override appendChild(node: Node): Node { // We do not call super here as this will be handled by ElementUtility to improve performance by avoiding validation and other checks. return ElementUtility.appendChild(this, node); } @@ -506,7 +507,7 @@ export default class Element extends Node implements IElement { /** * @override */ - public override removeChild(node: INode): INode { + public override removeChild(node: Node): Node { // We do not call super here as this will be handled by ElementUtility to improve performance by avoiding validation and other checks. return ElementUtility.removeChild(this, node); } @@ -514,7 +515,7 @@ export default class Element extends Node implements IElement { /** * @override */ - public override insertBefore(newNode: INode, referenceNode: INode | null): INode { + public override insertBefore(newNode: Node, referenceNode: Node | null): Node { if (arguments.length < 2) { throw new TypeError( `Failed to execute 'insertBefore' on 'Node': 2 arguments required, but only ${arguments.length} present.` @@ -537,7 +538,7 @@ export default class Element extends Node implements IElement { * * @param nodes List of Node or DOMString. */ - public replaceWith(...nodes: (INode | string)[]): void { + public replaceWith(...nodes: (Node | string)[]): void { ChildNodeUtility.replaceWith(this, ...nodes); } @@ -546,7 +547,7 @@ export default class Element extends Node implements IElement { * * @param nodes List of Node or DOMString. */ - public before(...nodes: (string | INode)[]): void { + public before(...nodes: (string | Node)[]): void { ChildNodeUtility.before(this, ...nodes); } @@ -555,7 +556,7 @@ export default class Element extends Node implements IElement { * * @param nodes List of Node or DOMString. */ - public after(...nodes: (string | INode)[]): void { + public after(...nodes: (string | Node)[]): void { ChildNodeUtility.after(this, ...nodes); } @@ -564,7 +565,7 @@ export default class Element extends Node implements IElement { * * @param nodes List of Node or DOMString. */ - public append(...nodes: (string | INode)[]): void { + public append(...nodes: (string | Node)[]): void { ParentNodeUtility.append(this, ...nodes); } @@ -573,7 +574,7 @@ export default class Element extends Node implements IElement { * * @param nodes List of Node or DOMString. */ - public prepend(...nodes: (string | INode)[]): void { + public prepend(...nodes: (string | Node)[]): void { ParentNodeUtility.prepend(this, ...nodes); } @@ -582,7 +583,7 @@ export default class Element extends Node implements IElement { * * @param nodes List of Node or DOMString. */ - public replaceChildren(...nodes: (string | INode)[]): void { + public replaceChildren(...nodes: (string | Node)[]): void { ParentNodeUtility.replaceChildren(this, ...nodes); } @@ -593,7 +594,7 @@ export default class Element extends Node implements IElement { * @param element Node to insert. * @returns Inserted node or null if couldn't insert. */ - public insertAdjacentElement(position: TInsertAdjacentPositions, element: INode): INode | null { + public insertAdjacentElement(position: InsertAdjacentPosition, element: Node): Node | null { if (position === 'beforebegin') { if (!this.parentElement) { return null; @@ -621,7 +622,7 @@ export default class Element extends Node implements IElement { * @param position Position to insert text. * @param text HTML string to insert. */ - public insertAdjacentHTML(position: TInsertAdjacentPositions, text: string): void { + public insertAdjacentHTML(position: InsertAdjacentPosition, text: string): void { for (const node of (( XMLParser.parse(this[PropertySymbol.ownerDocument], text) ))[PropertySymbol.childNodes].slice()) { @@ -635,11 +636,11 @@ export default class Element extends Node implements IElement { * @param position Position to insert text. * @param text String to insert. */ - public insertAdjacentText(position: TInsertAdjacentPositions, text: string): void { + public insertAdjacentText(position: InsertAdjacentPosition, text: string): void { if (!text) { return; } - const textNode = this[PropertySymbol.ownerDocument].createTextNode(text); + const textNode = this[PropertySymbol.ownerDocument].createTextNode(text); this.insertAdjacentElement(position, textNode); } @@ -792,12 +793,12 @@ export default class Element extends Node implements IElement { * @param init.mode Shadow root mode. * @returns Shadow root. */ - public attachShadow(init: { mode: string }): IShadowRoot { + public attachShadow(init: { mode: string }): ShadowRoot { if (this[PropertySymbol.shadowRoot]) { throw new DOMException('Shadow root has already been attached.'); } - const shadowRoot = NodeFactory.createNode( + const shadowRoot = NodeFactory.createNode( this[PropertySymbol.ownerDocument], this[PropertySymbol.ownerDocument][PropertySymbol.ownerWindow].ShadowRoot ); @@ -836,9 +837,11 @@ export default class Element extends Node implements IElement { * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects * @returns DOM rect list. */ - public getClientRects(): IDOMRectList { + public getClientRects(): DOMRectList { // TODO: Not full implementation - return DOMRectListFactory.create([this.getBoundingClientRect()]); + const domRectList = new DOMRectList(); + domRectList.push(this.getBoundingClientRect()); + return domRectList; } /** @@ -857,9 +860,9 @@ export default class Element extends Node implements IElement { * @param selector Selector. * @returns Closest matching element. */ - public closest(selector: string): IElement { + public closest(selector: string): Element { // eslint-disable-next-line - let parent: IElement = this; + let parent: Element = this; while (parent) { if (QuerySelector.match(parent, selector)) { @@ -879,7 +882,7 @@ export default class Element extends Node implements IElement { */ public querySelectorAll( selector: K - ): INodeList; + ): NodeList; /** * Query CSS selector to find matching elments. @@ -889,7 +892,7 @@ export default class Element extends Node implements IElement { */ public querySelectorAll( selector: K - ): INodeList; + ): NodeList; /** * Query CSS selector to find matching elments. @@ -897,7 +900,7 @@ export default class Element extends Node implements IElement { * @param selector CSS selector. * @returns Matching elements. */ - public querySelectorAll(selector: string): INodeList; + public querySelectorAll(selector: string): NodeList; /** * Query CSS selector to find matching elments. @@ -905,7 +908,7 @@ export default class Element extends Node implements IElement { * @param selector CSS selector. * @returns Matching elements. */ - public querySelectorAll(selector: string): INodeList { + public querySelectorAll(selector: string): NodeList { return QuerySelector.querySelectorAll(this, selector); } @@ -935,7 +938,7 @@ export default class Element extends Node implements IElement { * @param selector CSS selector. * @returns Matching element. */ - public querySelector(selector: string): IElement | null; + public querySelector(selector: string): Element | null; /** * Query CSS Selector to find matching node. @@ -943,7 +946,7 @@ export default class Element extends Node implements IElement { * @param selector CSS selector. * @returns Matching element. */ - public querySelector(selector: string): IElement | null { + public querySelector(selector: string): Element | null { return QuerySelector.querySelector(this, selector); } @@ -953,7 +956,7 @@ export default class Element extends Node implements IElement { * @param className Tag name. * @returns Matching element. */ - public getElementsByClassName(className: string): IHTMLCollection { + public getElementsByClassName(className: string): HTMLCollection { return ParentNodeUtility.getElementsByClassName(this, className); } @@ -965,7 +968,7 @@ export default class Element extends Node implements IElement { */ public getElementsByTagName( tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name. @@ -975,7 +978,7 @@ export default class Element extends Node implements IElement { */ public getElementsByTagName( tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name. @@ -983,7 +986,7 @@ export default class Element extends Node implements IElement { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagName(tagName: string): IHTMLCollection; + public getElementsByTagName(tagName: string): HTMLCollection; /** * Returns an elements by tag name. @@ -991,7 +994,7 @@ export default class Element extends Node implements IElement { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagName(tagName: string): IHTMLCollection { + public getElementsByTagName(tagName: string): HTMLCollection { return ParentNodeUtility.getElementsByTagName(this, tagName); } @@ -1005,7 +1008,7 @@ export default class Element extends Node implements IElement { public getElementsByTagNameNS( namespaceURI: 'http://www.w3.org/1999/xhtml', tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name and namespace. @@ -1017,7 +1020,7 @@ export default class Element extends Node implements IElement { public getElementsByTagNameNS( namespaceURI: 'http://www.w3.org/2000/svg', tagName: K - ): IHTMLCollection; + ): HTMLCollection; /** * Returns an elements by tag name and namespace. @@ -1026,7 +1029,7 @@ export default class Element extends Node implements IElement { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagNameNS(namespaceURI: string, tagName: string): IHTMLCollection; + public getElementsByTagNameNS(namespaceURI: string, tagName: string): HTMLCollection; /** * Returns an elements by tag name and namespace. @@ -1035,7 +1038,7 @@ export default class Element extends Node implements IElement { * @param tagName Tag name. * @returns Matching element. */ - public getElementsByTagNameNS(namespaceURI: string, tagName: string): IHTMLCollection { + public getElementsByTagNameNS(namespaceURI: string, tagName: string): HTMLCollection { return ParentNodeUtility.getElementsByTagNameNS(this, namespaceURI, tagName); } @@ -1045,7 +1048,7 @@ export default class Element extends Node implements IElement { * @param attribute Attribute. * @returns Replaced attribute. */ - public setAttributeNode(attribute: IAttr): IAttr | null { + public setAttributeNode(attribute: Attr): Attr | null { return this[PropertySymbol.attributes].setNamedItem(attribute); } @@ -1055,7 +1058,7 @@ export default class Element extends Node implements IElement { * @param attribute Attribute. * @returns Replaced attribute. */ - public setAttributeNodeNS(attribute: IAttr): IAttr | null { + public setAttributeNodeNS(attribute: Attr): Attr | null { return this[PropertySymbol.attributes].setNamedItemNS(attribute); } @@ -1065,7 +1068,7 @@ export default class Element extends Node implements IElement { * @param name Name. * @returns Replaced attribute. */ - public getAttributeNode(name: string): IAttr | null { + public getAttributeNode(name: string): Attr | null { return this[PropertySymbol.attributes].getNamedItem(name); } @@ -1076,7 +1079,7 @@ export default class Element extends Node implements IElement { * @param localName Name. * @returns Replaced attribute. */ - public getAttributeNodeNS(namespace: string | null, localName: string): IAttr | null { + public getAttributeNodeNS(namespace: string | null, localName: string): Attr | null { return this[PropertySymbol.attributes].getNamedItemNS(namespace, localName); } @@ -1086,7 +1089,7 @@ export default class Element extends Node implements IElement { * @param attribute Attribute. * @returns Removed attribute. */ - public removeAttributeNode(attribute: IAttr): IAttr | null { + public removeAttributeNode(attribute: Attr): Attr | null { return this[PropertySymbol.attributes].removeNamedItem(attribute[PropertySymbol.name]); } @@ -1096,7 +1099,7 @@ export default class Element extends Node implements IElement { * @param attribute Attribute. * @returns Removed attribute. */ - public removeAttributeNodeNS(attribute: IAttr): IAttr | null { + public removeAttributeNodeNS(attribute: Attr): Attr | null { return this[PropertySymbol.attributes].removeNamedItemNS( attribute[PropertySymbol.namespaceURI], attribute.localName diff --git a/packages/happy-dom/src/nodes/element/ElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/element/ElementNamedNodeMap.ts index 415f24560..34384b253 100644 --- a/packages/happy-dom/src/nodes/element/ElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/element/ElementNamedNodeMap.ts @@ -3,10 +3,9 @@ import * as PropertySymbol from '../../PropertySymbol.js'; import MutationRecord from '../../mutation-observer/MutationRecord.js'; import MutationTypeEnum from '../../mutation-observer/MutationTypeEnum.js'; import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import Element from './Element.js'; import HTMLCollection from './HTMLCollection.js'; -import IElement from './IElement.js'; import MutationListener from '../../mutation-observer/MutationListener.js'; /** @@ -15,14 +14,14 @@ import MutationListener from '../../mutation-observer/MutationListener.js'; * @see https://developer.mozilla.org/en-US/docs/Web/API/NamedNodeMap */ export default class ElementNamedNodeMap extends NamedNodeMap { - protected [PropertySymbol.ownerElement]: IElement; + protected [PropertySymbol.ownerElement]: Element; /** * Constructor. * * @param ownerElement Owner element. */ - constructor(ownerElement: IElement) { + constructor(ownerElement: Element) { super(); this[PropertySymbol.ownerElement] = ownerElement; } @@ -30,27 +29,27 @@ export default class ElementNamedNodeMap extends NamedNodeMap { /** * @override */ - public override getNamedItem(name: string): IAttr | null { + public override getNamedItem(name: string): Attr | null { return this[PropertySymbol.namedItems][this[PropertySymbol.getAttributeName](name)] || null; } /** * @override */ - public override getNamedItemNS(namespace: string, localName: string): IAttr | null { + public override getNamedItemNS(namespace: string, localName: string): Attr | null { return super.getNamedItemNS(namespace, this[PropertySymbol.getAttributeName](localName)); } /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { if (!item[PropertySymbol.name]) { return null; } item[PropertySymbol.name] = this[PropertySymbol.getAttributeName](item[PropertySymbol.name]); - (item[PropertySymbol.ownerElement]) = this[PropertySymbol.ownerElement]; + (item[PropertySymbol.ownerElement]) = this[PropertySymbol.ownerElement]; const replacedItem = super.setNamedItem(item); const oldValue = replacedItem ? replacedItem[PropertySymbol.value] : null; @@ -75,14 +74,14 @@ export default class ElementNamedNodeMap extends NamedNodeMap { item[PropertySymbol.value] !== oldValue ) { if (oldValue) { - (>( + (>( (this[PropertySymbol.ownerElement][PropertySymbol.parentNode])[ PropertySymbol.children ] ))[PropertySymbol.removeNamedItem](this[PropertySymbol.ownerElement], oldValue); } if (item[PropertySymbol.value]) { - (>( + (>( (this[PropertySymbol.ownerElement][PropertySymbol.parentNode])[ PropertySymbol.children ] @@ -138,7 +137,7 @@ export default class ElementNamedNodeMap extends NamedNodeMap { /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem]( this[PropertySymbol.getAttributeName](name) ); @@ -166,7 +165,7 @@ export default class ElementNamedNodeMap extends NamedNodeMap { ] && removedItem[PropertySymbol.value] ) { - (>( + (>( (this[PropertySymbol.ownerElement][PropertySymbol.parentNode])[ PropertySymbol.children ] @@ -223,7 +222,7 @@ export default class ElementNamedNodeMap extends NamedNodeMap { /** * @override */ - public override removeNamedItemNS(namespace: string, localName: string): IAttr | null { + public override removeNamedItemNS(namespace: string, localName: string): Attr | null { return super.removeNamedItemNS(namespace, this[PropertySymbol.getAttributeName](localName)); } diff --git a/packages/happy-dom/src/nodes/element/ElementUtility.ts b/packages/happy-dom/src/nodes/element/ElementUtility.ts index 08c3e21e1..cc5d861e2 100644 --- a/packages/happy-dom/src/nodes/element/ElementUtility.ts +++ b/packages/happy-dom/src/nodes/element/ElementUtility.ts @@ -1,12 +1,11 @@ import NodeTypeEnum from '../node/NodeTypeEnum.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IElement from './IElement.js'; -import INode from '../node/INode.js'; -import HTMLCollection from './HTMLCollection.js'; -import IDocument from '../document/IDocument.js'; -import IDocumentFragment from '../document-fragment/IDocumentFragment.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; import Element from './Element.js'; +import Node from '../node/Node.js'; +import HTMLCollection from './HTMLCollection.js'; +import Document from '../document/Document.js'; +import DocumentFragment from '../document-fragment/DocumentFragment.js'; +import HTMLElement from '../html-element/HTMLElement.js'; import NodeUtility from '../node/NodeUtility.js'; import DOMException from '../../exception/DOMException.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; @@ -27,10 +26,10 @@ export default class ElementUtility { * @returns Appended node. */ public static appendChild( - ancestorNode: IElement | IDocument | IDocumentFragment, - node: INode, + ancestorNode: Element | Document | DocumentFragment, + node: Node, options?: { disableAncestorValidation?: boolean } - ): INode { + ): Node { if (node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode && node !== ancestorNode) { if ( !options?.disableAncestorValidation && @@ -42,12 +41,12 @@ export default class ElementUtility { ); } if (node[PropertySymbol.parentNode]) { - const parentNodeChildren = >( + const parentNodeChildren = >( (node[PropertySymbol.parentNode])[PropertySymbol.children] ); if (parentNodeChildren) { - const index = parentNodeChildren.indexOf(node); + const index = parentNodeChildren.indexOf(node); if (index !== -1) { for (const attributeName of NAMED_ITEM_ATTRIBUTES) { const attribute = (node)[PropertySymbol.attributes].getNamedItem( @@ -55,7 +54,7 @@ export default class ElementUtility { ); if (attribute) { parentNodeChildren[PropertySymbol.removeNamedItem]( - node, + node, attribute[PropertySymbol.value] ); } @@ -65,7 +64,7 @@ export default class ElementUtility { } } } - const ancestorNodeChildren = >( + const ancestorNodeChildren = >( (ancestorNode)[PropertySymbol.children] ); @@ -73,13 +72,13 @@ export default class ElementUtility { const attribute = (node)[PropertySymbol.attributes].getNamedItem(attributeName); if (attribute) { ancestorNodeChildren[PropertySymbol.appendNamedItem]( - node, + node, attribute[PropertySymbol.value] ); } } - ancestorNodeChildren.push(node); + ancestorNodeChildren.push(node); NodeUtility.appendChild(ancestorNode, node, { disableAncestorValidation: true }); } else { @@ -96,21 +95,18 @@ export default class ElementUtility { * @param node Node. * @returns Removed node. */ - public static removeChild( - ancestorNode: IElement | IDocument | IDocumentFragment, - node: INode - ): INode { + public static removeChild(ancestorNode: Element | Document | DocumentFragment, node: Node): Node { if (node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode) { - const ancestorNodeChildren = >( + const ancestorNodeChildren = >( (ancestorNode)[PropertySymbol.children] ); - const index = ancestorNodeChildren.indexOf(node); + const index = ancestorNodeChildren.indexOf(node); if (index !== -1) { for (const attributeName of NAMED_ITEM_ATTRIBUTES) { const attribute = (node)[PropertySymbol.attributes].getNamedItem(attributeName); if (attribute) { ancestorNodeChildren[PropertySymbol.removeNamedItem]( - node, + node, attribute[PropertySymbol.value] ); } @@ -136,11 +132,11 @@ export default class ElementUtility { * @returns Inserted node. */ public static insertBefore( - ancestorNode: IElement | IDocument | IDocumentFragment, - newNode: INode, - referenceNode: INode | null, + ancestorNode: Element | Document | DocumentFragment, + newNode: Node, + referenceNode: Node | null, options?: { disableAncestorValidation?: boolean } - ): INode { + ): Node { // NodeUtility.insertBefore() will call appendChild() for the scenario where "referenceNode" is "null" or "undefined" if (newNode[PropertySymbol.nodeType] === NodeTypeEnum.elementNode && referenceNode) { if ( @@ -153,12 +149,12 @@ export default class ElementUtility { ); } if (newNode[PropertySymbol.parentNode]) { - const parentNodeChildren = >( + const parentNodeChildren = >( (newNode[PropertySymbol.parentNode])[PropertySymbol.children] ); if (parentNodeChildren) { - const index = parentNodeChildren.indexOf(newNode); + const index = parentNodeChildren.indexOf(newNode); if (index !== -1) { for (const attributeName of NAMED_ITEM_ATTRIBUTES) { const attribute = (newNode)[PropertySymbol.attributes].getNamedItem( @@ -166,7 +162,7 @@ export default class ElementUtility { ); if (attribute) { parentNodeChildren[PropertySymbol.removeNamedItem]( - newNode, + newNode, attribute[PropertySymbol.value] ); } @@ -177,24 +173,24 @@ export default class ElementUtility { } } - const ancestorNodeChildren = >( + const ancestorNodeChildren = >( (ancestorNode)[PropertySymbol.children] ); if (referenceNode[PropertySymbol.nodeType] === NodeTypeEnum.elementNode) { - const index = ancestorNodeChildren.indexOf(referenceNode); + const index = ancestorNodeChildren.indexOf(referenceNode); if (index !== -1) { - ancestorNodeChildren.splice(index, 0, newNode); + ancestorNodeChildren.splice(index, 0, newNode); } } else { ancestorNodeChildren.length = 0; for (const node of (ancestorNode)[PropertySymbol.childNodes]) { if (node === referenceNode) { - ancestorNodeChildren.push(newNode); + ancestorNodeChildren.push(newNode); } if (node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode) { - ancestorNodeChildren.push(node); + ancestorNodeChildren.push(node); } } } @@ -203,7 +199,7 @@ export default class ElementUtility { const attribute = (newNode)[PropertySymbol.attributes].getNamedItem(attributeName); if (attribute) { ancestorNodeChildren[PropertySymbol.appendNamedItem]( - newNode, + newNode, attribute[PropertySymbol.value] ); } diff --git a/packages/happy-dom/src/nodes/element/HTMLCollection.ts b/packages/happy-dom/src/nodes/element/HTMLCollection.ts index 845b1b62a..7c3643761 100644 --- a/packages/happy-dom/src/nodes/element/HTMLCollection.ts +++ b/packages/happy-dom/src/nodes/element/HTMLCollection.ts @@ -1,10 +1,9 @@ -import IHTMLCollection from './IHTMLCollection.js'; import * as PropertySymbol from '../../PropertySymbol.js'; /** * HTML collection. */ -export default class HTMLCollection extends Array implements IHTMLCollection { +export default class HTMLCollection extends Array implements HTMLCollection { protected [PropertySymbol.namedItems]: { [k: string]: T[] } = {}; /** diff --git a/packages/happy-dom/src/nodes/element/IDOMRectList.ts b/packages/happy-dom/src/nodes/element/IDOMRectList.ts deleted file mode 100644 index e0996e964..000000000 --- a/packages/happy-dom/src/nodes/element/IDOMRectList.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * HTMLCollection. - */ -export default interface IDOMRectList extends Array { - /** - * Returns item by index. - * - * @param index Index. - */ - item(index: number): T; -} diff --git a/packages/happy-dom/src/nodes/element/IElement.ts b/packages/happy-dom/src/nodes/element/IElement.ts deleted file mode 100644 index d6de37d0f..000000000 --- a/packages/happy-dom/src/nodes/element/IElement.ts +++ /dev/null @@ -1,334 +0,0 @@ -import IShadowRoot from '../shadow-root/IShadowRoot.js'; -import IAttr from '../attr/IAttr.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; -import DOMRect from './DOMRect.js'; -import IDOMTokenList from '../../dom-token-list/IDOMTokenList.js'; -import INode from './../node/INode.js'; -import IChildNode from '../child-node/IChildNode.js'; -import IParentNode from '../parent-node/IParentNode.js'; -import INonDocumentTypeChildNode from '../child-node/INonDocumentTypeChildNode.js'; -import IDOMRectList from './IDOMRectList.js'; -import Event from '../../event/Event.js'; - -export type TInsertAdjacentPositions = 'beforebegin' | 'afterbegin' | 'beforeend' | 'afterend'; - -/** - * Element. - */ -export default interface IElement extends IChildNode, INonDocumentTypeChildNode, IParentNode { - readonly tagName: string; - readonly shadowRoot: IShadowRoot; - readonly classList: IDOMTokenList; - readonly namespaceURI: string; - readonly prefix: string | null; - scrollTop: number; - scrollLeft: number; - readonly scrollWidth: number; - readonly scrollHeight: number; - id: string; - className: string; - role: string; - innerHTML: string; - outerHTML: string; - slot: string; - readonly nodeName: string; - readonly localName: string; - readonly attributes: INamedNodeMap; - - // Events - oncancel: (event: Event) => void | null; - onerror: (event: Event) => void | null; - onscroll: (event: Event) => void | null; - onselect: (event: Event) => void | null; - onwheel: (event: Event) => void | null; - oncopy: (event: Event) => void | null; - oncut: (event: Event) => void | null; - onpaste: (event: Event) => void | null; - oncompositionend: (event: Event) => void | null; - oncompositionstart: (event: Event) => void | null; - oncompositionupdate: (event: Event) => void | null; - onblur: (event: Event) => void | null; - onfocus: (event: Event) => void | null; - onfocusin: (event: Event) => void | null; - onfocusout: (event: Event) => void | null; - onfullscreenchange: (event: Event) => void | null; - onfullscreenerror: (event: Event) => void | null; - onkeydown: (event: Event) => void | null; - onkeyup: (event: Event) => void | null; - onauxclick: (event: Event) => void | null; - onclick: (event: Event) => void | null; - oncontextmenu: (event: Event) => void | null; - ondblclick: (event: Event) => void | null; - onmousedown: (event: Event) => void | null; - onmouseenter: (event: Event) => void | null; - onmouseleave: (event: Event) => void | null; - onmousemove: (event: Event) => void | null; - onmouseout: (event: Event) => void | null; - onmouseover: (event: Event) => void | null; - onmouseup: (event: Event) => void | null; - ontouchcancel: (event: Event) => void | null; - ontouchend: (event: Event) => void | null; - ontouchmove: (event: Event) => void | null; - ontouchstart: (event: Event) => void | null; - - /** - * Attribute changed callback. - * - * @param name Name. - * @param oldValue Old value. - * @param newValue New value. - */ - attributeChangedCallback?(name: string, oldValue: string, newValue: string): void; - - /** - * Returns inner HTML and optionally the content of shadow roots. - * - * This is a feature implemented in Chromium, but not supported by Mozilla yet. - * - * @see https://web.dev/declarative-shadow-dom/ - * @see https://chromestatus.com/feature/5191745052606464 - * @param [options] Options. - * @param [options.includeShadowRoots] Set to "true" to include shadow roots. - * @returns HTML. - */ - getInnerHTML(options?: { includeShadowRoots?: boolean }): string; - - /** - * Sets an attribute. - * - * @param name Name. - * @param value Value. - */ - setAttribute(name: string, value: string): void; - - /** - * Sets a namespace attribute. - * - * @param namespaceURI Namespace URI. - * @param name Name. - * @param value Value. - */ - setAttributeNS(namespaceURI: string | null, name: string, value: string): void; - - /** - * Returns attribute names. - * - * @returns Attribute names. - */ - getAttributeNames(): string[]; - - /** - * Returns attribute value. - * - * @param name Name. - */ - getAttribute(name: string): string; - - /** - * Returns namespace attribute value. - * - * @param namespace Namespace URI. - * @param localName Local name. - */ - getAttributeNS(namespace: string | null, localName: string): string; - - /** - * Returns a boolean value indicating whether the specified element has the attribute or not. - * - * @param name Attribute name. - * @returns True if attribute exists, false otherwise. - */ - hasAttribute(name: string): boolean; - - /** - * Returns a boolean value indicating whether the specified element has the namespace attribute or not. - * - * @param namespace Namespace URI. - * @param localName Local name. - * @returns True if attribute exists, false otherwise. - */ - hasAttributeNS(namespace: string | null, localName: string): boolean; - - /** - * Returns "true" if the element has attributes. - * - * @returns "true" if the element has attributes. - */ - hasAttributes(): boolean; - - /** - * Removes an attribute. - * - * @param name Name. - */ - removeAttribute(name: string): void; - - /** - * Removes a namespace attribute. - * - * @param namespace Namespace URI. - * @param localName Local name. - */ - removeAttributeNS(namespace: string | null, localName: string): void; - - /** - * Toggle an attribute. - * - * @param name A DOMString specifying the name of the attribute to be toggled. - * @param force A boolean value to determine whether the attribute should be added or removed, no matter whether the attribute is present or not at the moment. - */ - toggleAttribute(name: string, force?: boolean): boolean; - - /** - * Attaches a shadow root. - * - * @param init Shadow root init. - * @returns Shadow root. - */ - attachShadow(init: { mode: string }): IShadowRoot; - - /** - * Scrolls to a particular set of coordinates. - * - * @param x X position or options object. - * @param y Y position. - */ - scroll(x: { top?: number; left?: number; behavior?: string } | number, y: number): void; - - /** - * Scrolls to a particular set of coordinates. - * - * @param x X position or options object. - * @param y Y position. - */ - scrollTo(x: { top?: number; left?: number; behavior?: string } | number, y: number): void; - - /** - * Scrolls the element's ancestor containers such that the element on which scrollIntoView() is called is visible to the user. - * - * @param [options] Options. - */ - scrollIntoView( - options?: - | boolean - | { - behavior?: 'smooth' | 'instant' | 'auto'; - block?: 'start' | 'center' | 'end' | 'nearest'; - inline?: 'start' | 'center' | 'end' | 'nearest'; - } - ): void; - - /** - * Returns the size of an element and its position relative to the viewport. - * - * @returns DOM rect. - */ - getBoundingClientRect(): DOMRect; - - /** - * Returns a collection of DOMRect objects that indicate the bounding rectangles for each CSS border box in a client. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/getClientRects - * @returns DOM rect list. - */ - getClientRects(): IDOMRectList; - - /** - * The matches() method checks to see if the Element would be selected by the provided selectorString. - * - * @param selector Selector. - * @returns "true" if matching. - */ - matches(selector: string): boolean; - - /** - * Traverses the Element and its parents (heading toward the document root) until it finds a node that matches the provided selector string. - * - * @param selector Selector. - * @returns Closest matching element. - */ - closest(selector: string): IElement; - - /** - * The setAttributeNode() method adds a new Attr node to the specified element. - * - * @param attribute Attribute. - * @returns Replaced attribute. - */ - setAttributeNode(attribute: IAttr): IAttr | null; - - /** - * The setAttributeNodeNS() method adds a new Attr node to the specified element. - * - * @param attribute Attribute. - * @returns Replaced attribute. - */ - setAttributeNodeNS(attribute: IAttr): IAttr | null; - - /** - * Returns an Attr node. - * - * @param name Name. - * @returns Replaced attribute. - */ - getAttributeNode(name: string): IAttr | null; - - /** - * Returns a namespaced Attr node. - * - * @param namespace Namespace. - * @param nodeName Node name. - * @returns Replaced attribute. - */ - getAttributeNodeNS(namespace: string | null, nodeName: string): IAttr | null; - - /** - * Removes an Attr node. - * - * @param attribute Attribute. - * @returns Removed attribute. - */ - removeAttributeNode(attribute: IAttr): IAttr; - - /** - * Removes an Attr node. - * - * @param attribute Attribute. - * @returns Removed attribute. - */ - removeAttributeNodeNS(attribute: IAttr): IAttr | null; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IElement; - - /** - * Inserts a node to the given position. - * - * @param position Position to insert element. - * @param element Node to insert. - * @returns Inserted node or null if couldn't insert. - */ - insertAdjacentElement(position: TInsertAdjacentPositions, node: INode): INode | null; - - /** - * Inserts an HTML string to the given position. - * - * @param position Position to insert text. - * @param text HTML string to insert. - */ - insertAdjacentHTML(position: TInsertAdjacentPositions, text: string): void; - - /** - * Inserts text to the given position. - * - * @param position Position to insert text. - * @param text String to insert. - */ - insertAdjacentText(position: TInsertAdjacentPositions, text: string): void; -} diff --git a/packages/happy-dom/src/nodes/element/IHTMLCollection.ts b/packages/happy-dom/src/nodes/element/IHTMLCollection.ts deleted file mode 100644 index fe8ab1e71..000000000 --- a/packages/happy-dom/src/nodes/element/IHTMLCollection.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * HTMLCollection. - */ -export default interface IHTMLCollection extends Array { - /** - * Returns item by index. - * - * @param index Index. - */ - item(index: number): T | null; - - /** - * Returns named item. - * - * @param name Name. - * @returns Node. - */ - namedItem(name: string): T | null; -} diff --git a/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElement.ts b/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElement.ts index 28354ac09..aed0a7c18 100644 --- a/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElement.ts +++ b/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElement.ts @@ -1,10 +1,9 @@ import HTMLElement from '../html-element/HTMLElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import DOMTokenList from '../../dom-token-list/DOMTokenList.js'; -import IDOMTokenList from '../../dom-token-list/IDOMTokenList.js'; -import IHTMLAnchorElement from './IHTMLAnchorElement.js'; +import IHTMLHyperlinkElementUtils from './IHTMLHyperlinkElementUtils.js'; import URL from '../../url/URL.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLAnchorElementNamedNodeMap from './HTMLAnchorElementNamedNodeMap.js'; import Event from '../../event/Event.js'; import EventPhaseEnum from '../../event/EventPhaseEnum.js'; @@ -16,8 +15,8 @@ import PointerEvent from '../../event/events/PointerEvent.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement. */ -export default class HTMLAnchorElement extends HTMLElement implements IHTMLAnchorElement { - public override [PropertySymbol.attributes]: INamedNodeMap = new HTMLAnchorElementNamedNodeMap( +export default class HTMLAnchorElement extends HTMLElement implements IHTMLHyperlinkElementUtils { + public override [PropertySymbol.attributes]: NamedNodeMap = new HTMLAnchorElementNamedNodeMap( this ); public [PropertySymbol.relList]: DOMTokenList = null; @@ -395,11 +394,11 @@ export default class HTMLAnchorElement extends HTMLElement implements IHTMLAncho * * @returns Rel list. */ - public get relList(): IDOMTokenList { + public get relList(): DOMTokenList { if (!this[PropertySymbol.relList]) { this[PropertySymbol.relList] = new DOMTokenList(this, 'rel'); } - return this[PropertySymbol.relList]; + return this[PropertySymbol.relList]; } /** diff --git a/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.ts index 1456e44c1..4295a3337 100644 --- a/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-anchor-element/HTMLAnchorElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLAnchorElement from './HTMLAnchorElement.js'; @@ -14,7 +14,7 @@ export default class HTMLAnchorElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -30,7 +30,7 @@ export default class HTMLAnchorElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-anchor-element/IHTMLAnchorElement.ts b/packages/happy-dom/src/nodes/html-anchor-element/IHTMLAnchorElement.ts deleted file mode 100644 index 2eb92a874..000000000 --- a/packages/happy-dom/src/nodes/html-anchor-element/IHTMLAnchorElement.ts +++ /dev/null @@ -1,21 +0,0 @@ -import IDOMTokenList from '../../dom-token-list/IDOMTokenList.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLHyperlinkElementUtils from './IHTMLHyperlinkElementUtils.js'; - -/** - * HTML Anchor Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement. - */ -export default interface IHTMLAnchorElement extends IHTMLElement, IHTMLHyperlinkElementUtils { - readonly relList: IDOMTokenList; - download: string; - ping: string; - hreflang: string; - referrerPolicy: string; - rel: string; - target: string; - text: string; - type: string; -} diff --git a/packages/happy-dom/src/nodes/html-audio-element/HTMLAudioElement.ts b/packages/happy-dom/src/nodes/html-audio-element/HTMLAudioElement.ts index f71b4c007..0b1d179d2 100644 --- a/packages/happy-dom/src/nodes/html-audio-element/HTMLAudioElement.ts +++ b/packages/happy-dom/src/nodes/html-audio-element/HTMLAudioElement.ts @@ -1,5 +1,4 @@ import HTMLMediaElement from '../html-media-element/HTMLMediaElement.js'; -import IHTMLAudioElement from './IHTMLAudioElement.js'; /** * HTML Audio Element. @@ -8,4 +7,4 @@ import IHTMLAudioElement from './IHTMLAudioElement.js'; * https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement. * */ -export default class HTMLAudioElement extends HTMLMediaElement implements IHTMLAudioElement {} +export default class HTMLAudioElement extends HTMLMediaElement {} diff --git a/packages/happy-dom/src/nodes/html-audio-element/IHTMLAudioElement.ts b/packages/happy-dom/src/nodes/html-audio-element/IHTMLAudioElement.ts deleted file mode 100644 index 22f6e1d3f..000000000 --- a/packages/happy-dom/src/nodes/html-audio-element/IHTMLAudioElement.ts +++ /dev/null @@ -1,11 +0,0 @@ -import IHTMLMediaElement from '../html-media-element/IHTMLMediaElement.js'; - -/** - * HTML Audio Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLAudioElement. - */ - -type IHTMLAudioElement = IHTMLMediaElement; -export default IHTMLAudioElement; diff --git a/packages/happy-dom/src/nodes/html-base-element/HTMLBaseElement.ts b/packages/happy-dom/src/nodes/html-base-element/HTMLBaseElement.ts index f4d217a7b..39cc88747 100644 --- a/packages/happy-dom/src/nodes/html-base-element/HTMLBaseElement.ts +++ b/packages/happy-dom/src/nodes/html-base-element/HTMLBaseElement.ts @@ -1,5 +1,4 @@ import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLBaseElement from './IHTMLBaseElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; /** @@ -8,7 +7,7 @@ import * as PropertySymbol from '../../PropertySymbol.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base. */ -export default class HTMLBaseElement extends HTMLElement implements IHTMLBaseElement { +export default class HTMLBaseElement extends HTMLElement { /** * Returns href. * @@ -56,7 +55,7 @@ export default class HTMLBaseElement extends HTMLElement implements IHTMLBaseEle * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLBaseElement { - return super.cloneNode(deep); + public cloneNode(deep = false): HTMLBaseElement { + return super.cloneNode(deep); } } diff --git a/packages/happy-dom/src/nodes/html-base-element/IHTMLBaseElement.ts b/packages/happy-dom/src/nodes/html-base-element/IHTMLBaseElement.ts deleted file mode 100644 index 17e4a34bb..000000000 --- a/packages/happy-dom/src/nodes/html-base-element/IHTMLBaseElement.ts +++ /dev/null @@ -1,21 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Base Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/HTML/Element/base. - */ -export default interface IHTMLBaseElement extends IHTMLElement { - href: string; - target: string; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLBaseElement; -} diff --git a/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElement.ts b/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElement.ts index 98e089540..216daffd5 100644 --- a/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElement.ts +++ b/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElement.ts @@ -1,17 +1,15 @@ import Event from '../../event/Event.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import EventPhaseEnum from '../../event/EventPhaseEnum.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import ValidityState from '../../validity-state/ValidityState.js'; import HTMLElement from '../html-element/HTMLElement.js'; import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; import HTMLLabelElementUtility from '../html-label-element/HTMLLabelElementUtility.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; -import INode from '../node/INode.js'; -import INodeList from '../node/INodeList.js'; +import HTMLLabelElement from '../html-label-element/HTMLLabelElement.js'; +import Node from '../node/Node.js'; +import NodeList from '../node/NodeList.js'; import HTMLButtonElementNamedNodeMap from './HTMLButtonElementNamedNodeMap.js'; -import IHTMLButtonElement from './IHTMLButtonElement.js'; import PointerEvent from '../../event/events/PointerEvent.js'; import { URL } from 'url'; @@ -23,8 +21,8 @@ const BUTTON_TYPES = ['submit', 'reset', 'button', 'menu']; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLButtonElement. */ -export default class HTMLButtonElement extends HTMLElement implements IHTMLButtonElement { - public override [PropertySymbol.attributes]: INamedNodeMap = new HTMLButtonElementNamedNodeMap( +export default class HTMLButtonElement extends HTMLElement { + public override [PropertySymbol.attributes]: NamedNodeMap = new HTMLButtonElementNamedNodeMap( this ); public [PropertySymbol.validationMessage] = ''; @@ -234,16 +232,16 @@ export default class HTMLButtonElement extends HTMLElement implements IHTMLButto * * @returns Form. */ - public get form(): IHTMLFormElement | null { + public get form(): HTMLFormElement | null { if (this[PropertySymbol.formNode]) { - return this[PropertySymbol.formNode]; + return this[PropertySymbol.formNode]; } if (!this.isConnected) { return null; } const formID = this.getAttribute('form'); return formID - ? this[PropertySymbol.ownerDocument].getElementById(formID) + ? this[PropertySymbol.ownerDocument].getElementById(formID) : null; } @@ -252,7 +250,7 @@ export default class HTMLButtonElement extends HTMLElement implements IHTMLButto * * @returns Label elements. */ - public get labels(): INodeList { + public get labels(): NodeList { return HTMLLabelElementUtility.getAssociatedLabelElements(this); } @@ -333,7 +331,7 @@ export default class HTMLButtonElement extends HTMLElement implements IHTMLButto /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const oldFormNode = this[PropertySymbol.formNode]; super[PropertySymbol.connectToNode](parentNode); diff --git a/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElementNamedNodeMap.ts index f58ec815c..bb188ffbb 100644 --- a/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-button-element/HTMLButtonElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; @@ -15,7 +15,7 @@ export default class HTMLButtonElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -40,7 +40,7 @@ export default class HTMLButtonElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-button-element/IHTMLButtonElement.ts b/packages/happy-dom/src/nodes/html-button-element/IHTMLButtonElement.ts deleted file mode 100644 index 830f18697..000000000 --- a/packages/happy-dom/src/nodes/html-button-element/IHTMLButtonElement.ts +++ /dev/null @@ -1,48 +0,0 @@ -import ValidityState from '../../validity-state/ValidityState.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; -import INodeList from '../node/INodeList.js'; - -/** - * HTML Button Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLButtonElement. - */ -export default interface IHTMLButtonElement extends IHTMLElement { - name: string; - value: string; - disabled: boolean; - type: string; - formAction: string; - formEnctype: string; - formMethod: string; - formNoValidate: boolean; - formTarget: string; - readonly validity: ValidityState; - readonly form: IHTMLFormElement | null; - readonly validationMessage: string; - readonly labels: INodeList; - - /** - * Checks validity. - * - * @returns Validity. - */ - checkValidity(): boolean; - - /** - * Reports validity. - * - * @returns Validity. - */ - reportValidity(): boolean; - - /** - * Sets validation message. - * - * @param message Message. - */ - setCustomValidity(message: string): void; -} diff --git a/packages/happy-dom/src/nodes/html-dialog-element/HTMLDialogElement.ts b/packages/happy-dom/src/nodes/html-dialog-element/HTMLDialogElement.ts index dcbe08af3..33f8f244c 100644 --- a/packages/happy-dom/src/nodes/html-dialog-element/HTMLDialogElement.ts +++ b/packages/happy-dom/src/nodes/html-dialog-element/HTMLDialogElement.ts @@ -1,6 +1,5 @@ import Event from '../../event/Event.js'; import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLDialogElement from './IHTMLDialogElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; /** @@ -9,7 +8,7 @@ import * as PropertySymbol from '../../PropertySymbol.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement. */ -export default class HTMLDialogElement extends HTMLElement implements IHTMLDialogElement { +export default class HTMLDialogElement extends HTMLElement { // Internal properties public [PropertySymbol.returnValue] = ''; diff --git a/packages/happy-dom/src/nodes/html-dialog-element/IHTMLDialogElement.ts b/packages/happy-dom/src/nodes/html-dialog-element/IHTMLDialogElement.ts deleted file mode 100644 index 4106b4613..000000000 --- a/packages/happy-dom/src/nodes/html-dialog-element/IHTMLDialogElement.ts +++ /dev/null @@ -1,34 +0,0 @@ -import Event from '../../event/Event.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Dialog Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement. - */ -export default interface IHTMLDialogElement extends IHTMLElement { - open: boolean; - returnValue: string; - - // Events - oncancel: (event: Event) => void | null; - onclose: (event: Event) => void | null; - - /** - * Closes the dialog. - * - * @param [returnValue] ReturnValue. - */ - close(returnValue?: string): void; - - /** - * Shows the modal. - */ - showModal(): void; - - /** - * Shows the dialog. - */ - show(): void; -} diff --git a/packages/happy-dom/src/nodes/html-document/HTMLDocument.ts b/packages/happy-dom/src/nodes/html-document/HTMLDocument.ts index 620e0f85b..d142243cc 100644 --- a/packages/happy-dom/src/nodes/html-document/HTMLDocument.ts +++ b/packages/happy-dom/src/nodes/html-document/HTMLDocument.ts @@ -1,5 +1,5 @@ import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import Document from '../document/Document.js'; import * as PropertySymbol from '../../PropertySymbol.js'; @@ -14,7 +14,7 @@ export default class HTMLDocument extends Document { * @param injected.browserFrame Browser frame. * @param injected.window Window. */ - constructor(injected: { browserFrame: IBrowserFrame; window: IBrowserWindow }) { + constructor(injected: { browserFrame: IBrowserFrame; window: BrowserWindow }) { super(injected); // Default document elements diff --git a/packages/happy-dom/src/nodes/html-element/HTMLElement.ts b/packages/happy-dom/src/nodes/html-element/HTMLElement.ts index c21646380..0095083dd 100644 --- a/packages/happy-dom/src/nodes/html-element/HTMLElement.ts +++ b/packages/happy-dom/src/nodes/html-element/HTMLElement.ts @@ -1,6 +1,5 @@ import Element from '../element/Element.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLElement from './IHTMLElement.js'; import CSSStyleDeclaration from '../../css/declaration/CSSStyleDeclaration.js'; import PointerEvent from '../../event/events/PointerEvent.js'; import Dataset from '../element/Dataset.js'; @@ -8,13 +7,10 @@ import NodeTypeEnum from '../node/NodeTypeEnum.js'; import DOMException from '../../exception/DOMException.js'; import Event from '../../event/Event.js'; import HTMLElementUtility from './HTMLElementUtility.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLElementNamedNodeMap from './HTMLElementNamedNodeMap.js'; -import INodeList from '../node/INodeList.js'; -import INode from '../node/INode.js'; -import IHTMLCollection from '../element/IHTMLCollection.js'; -import IElement from '../element/IElement.js'; import NodeList from '../node/NodeList.js'; +import Node from '../node/Node.js'; import HTMLCollection from '../element/HTMLCollection.js'; /** @@ -23,7 +19,7 @@ import HTMLCollection from '../element/HTMLCollection.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement. */ -export default class HTMLElement extends Element implements IHTMLElement { +export default class HTMLElement extends Element { // Events public oncopy: (event: Event) => void | null = null; public oncut: (event: Event) => void | null = null; @@ -52,7 +48,7 @@ export default class HTMLElement extends Element implements IHTMLElement { public ontransitionstart: (event: Event) => void | null = null; // Internal properties - public override [PropertySymbol.attributes]: INamedNodeMap = new HTMLElementNamedNodeMap(this); + public override [PropertySymbol.attributes]: NamedNodeMap = new HTMLElementNamedNodeMap(this); public [PropertySymbol.accessKey] = ''; public [PropertySymbol.contentEditable] = 'inherit'; public [PropertySymbol.isContentEditable] = false; @@ -225,7 +221,7 @@ export default class HTMLElement extends Element implements IHTMLElement { for (const childNode of this[PropertySymbol.childNodes]) { if (childNode[PropertySymbol.nodeType] === NodeTypeEnum.elementNode) { - const childElement = childNode; + const childElement = childNode; const computedStyle = this[PropertySymbol.ownerDocument][PropertySymbol.ownerWindow].getComputedStyle( childElement @@ -467,7 +463,7 @@ export default class HTMLElement extends Element implements IHTMLElement { /** * @override */ - public cloneNode(deep = false): IHTMLElement { + public cloneNode(deep = false): HTMLElement { const clone = super.cloneNode(deep); clone[PropertySymbol.accessKey] = this[PropertySymbol.accessKey]; @@ -487,7 +483,7 @@ export default class HTMLElement extends Element implements IHTMLElement { * @see https://html.spec.whatwg.org/multipage/dom.html#htmlelement * @param parentNode Parent node. */ - public [PropertySymbol.connectToNode](parentNode: INode = null): void { + public [PropertySymbol.connectToNode](parentNode: Node = null): void { const localName = this[PropertySymbol.localName]; // This element can potentially be a custom element that has not been defined yet @@ -510,9 +506,9 @@ export default class HTMLElement extends Element implements IHTMLElement { const newElement = ( this[PropertySymbol.ownerDocument].createElement(localName) ); - (>newElement[PropertySymbol.childNodes]) = + (>newElement[PropertySymbol.childNodes]) = this[PropertySymbol.childNodes]; - (>newElement[PropertySymbol.children]) = + (>newElement[PropertySymbol.children]) = this[PropertySymbol.children]; (newElement[PropertySymbol.isConnected]) = this[PropertySymbol.isConnected]; @@ -529,8 +525,8 @@ export default class HTMLElement extends Element implements IHTMLElement { ); } - (>this[PropertySymbol.childNodes]) = new NodeList(); - (>this[PropertySymbol.children]) = new HTMLCollection(); + (>this[PropertySymbol.childNodes]) = new NodeList(); + (>this[PropertySymbol.children]) = new HTMLCollection(); this[PropertySymbol.rootNode] = null; this[PropertySymbol.formNode] = null; this[PropertySymbol.selectNode] = null; diff --git a/packages/happy-dom/src/nodes/html-element/HTMLElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-element/HTMLElementNamedNodeMap.ts index b19070914..7349e1481 100644 --- a/packages/happy-dom/src/nodes/html-element/HTMLElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-element/HTMLElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import ElementNamedNodeMap from '../element/ElementNamedNodeMap.js'; import HTMLElement from './HTMLElement.js'; @@ -14,7 +14,7 @@ export default class HTMLElementNamedNodeMap extends ElementNamedNodeMap { /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -30,7 +30,7 @@ export default class HTMLElementNamedNodeMap extends ElementNamedNodeMap { /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-element/HTMLElementUtility.ts b/packages/happy-dom/src/nodes/html-element/HTMLElementUtility.ts index ceda0a8d6..bff2cabf5 100644 --- a/packages/happy-dom/src/nodes/html-element/HTMLElementUtility.ts +++ b/packages/happy-dom/src/nodes/html-element/HTMLElementUtility.ts @@ -1,7 +1,7 @@ import FocusEvent from '../../event/events/FocusEvent.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import ISVGElement from '../svg-element/ISVGElement.js'; +import HTMLElement from '../html-element/HTMLElement.js'; +import SVGElement from '../svg-element/SVGElement.js'; /** * HTMLElement utility. @@ -12,7 +12,7 @@ export default class HTMLElementUtility { * * @param element Element. */ - public static blur(element: IHTMLElement | ISVGElement): void { + public static blur(element: HTMLElement | SVGElement): void { if ( element[PropertySymbol.ownerDocument][PropertySymbol.activeElement] !== element || !element[PropertySymbol.isConnected] @@ -46,7 +46,7 @@ export default class HTMLElementUtility { * * @param element Element. */ - public static focus(element: IHTMLElement | ISVGElement): void { + public static focus(element: HTMLElement | SVGElement): void { if ( element[PropertySymbol.ownerDocument][PropertySymbol.activeElement] === element || !element[PropertySymbol.isConnected] diff --git a/packages/happy-dom/src/nodes/html-element/IHTMLElement.ts b/packages/happy-dom/src/nodes/html-element/IHTMLElement.ts deleted file mode 100644 index 93259bc04..000000000 --- a/packages/happy-dom/src/nodes/html-element/IHTMLElement.ts +++ /dev/null @@ -1,81 +0,0 @@ -import Event from '../../event/Event.js'; -import CSSStyleDeclaration from '../../css/declaration/CSSStyleDeclaration.js'; -import IElement from '../element/IElement.js'; - -/** - * HTML Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement. - */ -export default interface IHTMLElement extends IElement { - accessKey: string; - contentEditable: string; - isContentEditable: boolean; - dataset: { [key: string]: string }; - tabIndex: number; - offsetHeight: number; - offsetWidth: number; - offsetLeft: number; - offsetTop: number; - clientHeight: number; - clientWidth: number; - clientLeft: number; - clientTop: number; - innerText: string; - outerText: string; - - // Events - oncopy: (event: Event) => void | null; - oncut: (event: Event) => void | null; - onpaste: (event: Event) => void | null; - oninvalid: (event: Event) => void | null; - onanimationcancel: (event: Event) => void | null; - onanimationend: (event: Event) => void | null; - onanimationiteration: (event: Event) => void | null; - onanimationstart: (event: Event) => void | null; - onbeforeinput: (event: Event) => void | null; - oninput: (event: Event) => void | null; - onchange: (event: Event) => void | null; - ongotpointercapture: (event: Event) => void | null; - onlostpointercapture: (event: Event) => void | null; - onpointercancel: (event: Event) => void | null; - onpointerdown: (event: Event) => void | null; - onpointerenter: (event: Event) => void | null; - onpointerleave: (event: Event) => void | null; - onpointermove: (event: Event) => void | null; - onpointerout: (event: Event) => void | null; - onpointerover: (event: Event) => void | null; - onpointerup: (event: Event) => void | null; - ontransitioncancel: (event: Event) => void | null; - ontransitionend: (event: Event) => void | null; - ontransitionrun: (event: Event) => void | null; - ontransitionstart: (event: Event) => void | null; - - get style(): CSSStyleDeclaration; - set style(cssText: string | CSSStyleDeclaration | null); - - /** - * Triggers a click event. - */ - click(): void; - - /** - * Triggers a blur event. - */ - blur(): void; - - /** - * Triggers a focus event. - */ - focus(): void; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLElement; -} diff --git a/packages/happy-dom/src/nodes/html-form-element/HTMLFormControlsCollection.ts b/packages/happy-dom/src/nodes/html-form-element/HTMLFormControlsCollection.ts index 074a210dd..d35da7bb8 100644 --- a/packages/happy-dom/src/nodes/html-form-element/HTMLFormControlsCollection.ts +++ b/packages/happy-dom/src/nodes/html-form-element/HTMLFormControlsCollection.ts @@ -1,10 +1,9 @@ -import IHTMLFormControlsCollection from './IHTMLFormControlsCollection.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLInputElement from '../html-input-element/IHTMLInputElement.js'; -import IHTMLTextAreaElement from '../html-text-area-element/IHTMLTextAreaElement.js'; -import IHTMLSelectElement from '../html-select-element/IHTMLSelectElement.js'; +import HTMLInputElement from '../html-input-element/HTMLInputElement.js'; +import HTMLTextAreaElement from '../html-text-area-element/HTMLTextAreaElement.js'; +import HTMLSelectElement from '../html-select-element/HTMLSelectElement.js'; import RadioNodeList from './RadioNodeList.js'; -import IHTMLButtonElement from '../html-button-element/IHTMLButtonElement.js'; +import HTMLButtonElement from '../html-button-element/HTMLButtonElement.js'; /** * HTMLFormControlsCollection. @@ -12,8 +11,8 @@ import IHTMLButtonElement from '../html-button-element/IHTMLButtonElement.js'; * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormControlsCollection */ export default class HTMLFormControlsCollection - extends Array - implements IHTMLFormControlsCollection + extends Array + implements HTMLFormControlsCollection { public [PropertySymbol.namedItems]: { [k: string]: RadioNodeList } = {}; @@ -24,7 +23,7 @@ export default class HTMLFormControlsCollection */ public item( index: number - ): IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement | null { + ): HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement | null { return index >= 0 && this[index] ? this[index] : null; } @@ -37,10 +36,10 @@ export default class HTMLFormControlsCollection public namedItem( name: string ): - | IHTMLInputElement - | IHTMLTextAreaElement - | IHTMLSelectElement - | IHTMLButtonElement + | HTMLInputElement + | HTMLTextAreaElement + | HTMLSelectElement + | HTMLButtonElement | RadioNodeList | null { if (this[PropertySymbol.namedItems][name] && this[PropertySymbol.namedItems][name].length) { @@ -59,7 +58,7 @@ export default class HTMLFormControlsCollection * @param name Name. */ public [PropertySymbol.appendNamedItem]( - node: IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement, + node: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement, name: string ): void { if (name) { @@ -86,7 +85,7 @@ export default class HTMLFormControlsCollection * @param name Name. */ public [PropertySymbol.removeNamedItem]( - node: IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement, + node: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement, name: string ): void { if (name && this[PropertySymbol.namedItems][name]) { diff --git a/packages/happy-dom/src/nodes/html-form-element/HTMLFormElement.ts b/packages/happy-dom/src/nodes/html-form-element/HTMLFormElement.ts index c01d68f44..576fe72e0 100644 --- a/packages/happy-dom/src/nodes/html-form-element/HTMLFormElement.ts +++ b/packages/happy-dom/src/nodes/html-form-element/HTMLFormElement.ts @@ -1,20 +1,18 @@ import HTMLElement from '../html-element/HTMLElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLFormElement from './IHTMLFormElement.js'; import Event from '../../event/Event.js'; import SubmitEvent from '../../event/events/SubmitEvent.js'; import HTMLFormControlsCollection from './HTMLFormControlsCollection.js'; -import IHTMLFormControlsCollection from './IHTMLFormControlsCollection.js'; -import INode from '../node/INode.js'; -import IHTMLInputElement from '../html-input-element/IHTMLInputElement.js'; -import IHTMLTextAreaElement from '../html-text-area-element/IHTMLTextAreaElement.js'; -import IHTMLSelectElement from '../html-select-element/IHTMLSelectElement.js'; -import IHTMLButtonElement from '../html-button-element/IHTMLButtonElement.js'; +import Node from '../node/Node.js'; +import HTMLInputElement from '../html-input-element/HTMLInputElement.js'; +import HTMLTextAreaElement from '../html-text-area-element/HTMLTextAreaElement.js'; +import HTMLSelectElement from '../html-select-element/HTMLSelectElement.js'; +import HTMLButtonElement from '../html-button-element/HTMLButtonElement.js'; import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; import BrowserFrameNavigator from '../../browser/utilities/BrowserFrameNavigator.js'; import FormData from '../../form-data/FormData.js'; import Element from '../element/Element.js'; -import Node from '../node/Node.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; /** * HTML Form Element. @@ -22,11 +20,11 @@ import Node from '../node/Node.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement. */ -export default class HTMLFormElement extends HTMLElement implements IHTMLFormElement { +export default class HTMLFormElement extends HTMLElement { // Internal properties. - public [PropertySymbol.elements]: IHTMLFormControlsCollection = new HTMLFormControlsCollection(); + public [PropertySymbol.elements]: HTMLFormControlsCollection = new HTMLFormControlsCollection(); public [PropertySymbol.length] = 0; - public [PropertySymbol.formNode]: INode = this; + public [PropertySymbol.formNode]: Node = this; // Events public onformdata: (event: Event) => void | null = null; @@ -51,7 +49,7 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle * * @returns Elements. */ - public get elements(): IHTMLFormControlsCollection { + public get elements(): HTMLFormControlsCollection { return this[PropertySymbol.elements]; } @@ -251,7 +249,7 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle * * @param [submitter] Submitter. */ - public requestSubmit(submitter?: IHTMLInputElement | IHTMLButtonElement): void { + public requestSubmit(submitter?: HTMLInputElement | HTMLButtonElement): void { const noValidate = submitter?.formNoValidate || this.noValidate; if (noValidate || this.checkValidity()) { this.dispatchEvent( @@ -276,15 +274,15 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle element[PropertySymbol.value] = null; } else if (element[PropertySymbol.tagName] === 'SELECT') { let hasSelectedAttribute = false; - for (const option of (element).options) { + for (const option of (element).options) { if (option.hasAttribute('selected')) { hasSelectedAttribute = true; option.selected = true; break; } } - if (!hasSelectedAttribute && (element).options.length > 0) { - (element).options[0].selected = true; + if (!hasSelectedAttribute && (element).options.length > 0) { + (element).options[0].selected = true; } } } @@ -333,8 +331,8 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLFormElement { - return super.cloneNode(deep); + public cloneNode(deep = false): HTMLFormElement { + return super.cloneNode(deep); } /** @@ -344,7 +342,7 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle * @param name Name */ public [PropertySymbol.appendFormControlItem]( - node: IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement, + node: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement, name: string ): void { const elements = this[PropertySymbol.elements]; @@ -369,7 +367,7 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle * @param name Name. */ public [PropertySymbol.removeFormControlItem]( - node: IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement, + node: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement, name: string ): void { const elements = this[PropertySymbol.elements]; @@ -417,7 +415,7 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle * * @param [submitter] Submitter. */ - #submit(submitter?: IHTMLInputElement | IHTMLButtonElement): void { + #submit(submitter?: HTMLInputElement | HTMLButtonElement): void { const action = submitter?.hasAttribute('formaction') ? submitter?.formAction || this.action : this.action; @@ -461,7 +459,9 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle } BrowserFrameNavigator.navigate({ - windowClass: this[PropertySymbol.ownerDocument][PropertySymbol.defaultView].constructor, + windowClass: ( + this[PropertySymbol.ownerDocument][PropertySymbol.defaultView].constructor + ), frame: targetFrame, url: url.href, goToOptions: { @@ -473,7 +473,9 @@ export default class HTMLFormElement extends HTMLElement implements IHTMLFormEle } BrowserFrameNavigator.navigate({ - windowClass: this[PropertySymbol.ownerDocument][PropertySymbol.defaultView].constructor, + windowClass: ( + this[PropertySymbol.ownerDocument][PropertySymbol.defaultView].constructor + ), frame: targetFrame, method: method, url: action, diff --git a/packages/happy-dom/src/nodes/html-form-element/IHTMLFormControlsCollection.ts b/packages/happy-dom/src/nodes/html-form-element/IHTMLFormControlsCollection.ts deleted file mode 100644 index 1bf589c27..000000000 --- a/packages/happy-dom/src/nodes/html-form-element/IHTMLFormControlsCollection.ts +++ /dev/null @@ -1,39 +0,0 @@ -import IHTMLButtonElement from '../html-button-element/IHTMLButtonElement.js'; -import IHTMLInputElement from '../html-input-element/IHTMLInputElement.js'; -import IHTMLSelectElement from '../html-select-element/IHTMLSelectElement.js'; -import IHTMLTextAreaElement from '../html-text-area-element/IHTMLTextAreaElement.js'; -import IRadioNodeList from './IRadioNodeList.js'; - -/** - * HTMLFormControlsCollection. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormControlsCollection - */ -export default interface IHTMLFormControlsCollection - extends Array< - IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement - > { - /** - * Returns item by index. - * - * @param index Index. - */ - item( - index: number - ): IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement | null; - - /** - * Returns named item. - * - * @param name Name. - */ - namedItem( - name: string - ): - | IHTMLInputElement - | IHTMLTextAreaElement - | IHTMLSelectElement - | IHTMLButtonElement - | IRadioNodeList - | null; -} diff --git a/packages/happy-dom/src/nodes/html-form-element/IHTMLFormElement.ts b/packages/happy-dom/src/nodes/html-form-element/IHTMLFormElement.ts deleted file mode 100644 index f6b664a8d..000000000 --- a/packages/happy-dom/src/nodes/html-form-element/IHTMLFormElement.ts +++ /dev/null @@ -1,70 +0,0 @@ -import Event from '../../event/Event.js'; -import IHTMLButtonElement from '../html-button-element/IHTMLButtonElement.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLInputElement from '../html-input-element/IHTMLInputElement.js'; -import IHTMLFormControlsCollection from './IHTMLFormControlsCollection.js'; - -/** - * HTML Form Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLFormElement. - */ -export default interface IHTMLFormElement extends IHTMLElement { - name: string; - method: string; - target: string; - action: string; - encoding: string; - enctype: string; - autocomplete: string; - acceptCharset: string; - noValidate: boolean; - readonly elements: IHTMLFormControlsCollection; - readonly length: number; - - // Events - onformdata: (event: Event) => void | null; - onreset: (event: Event) => void | null; - onsubmit: (event: Event) => void | null; - - /** - * Submits form. No submit event is raised. In particular, the form's "submit" event handler is not run. - * - * In Happy DOM this means that nothing happens. - */ - submit(): void; - - /** - * Submits form, reports validity and raises submit event. - * - * @param [submitter] Submitter. - */ - requestSubmit(submitter?: IHTMLInputElement | IHTMLButtonElement): void; - - /** - * Resets form. - */ - reset(): void; - - /** - * Reports validity. - */ - reportValidity(): boolean; - - /** - * Checks validity. - * - * @returns "true" if validation does'nt fail. - */ - checkValidity(): boolean; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLFormElement; -} diff --git a/packages/happy-dom/src/nodes/html-form-element/IRadioNodeList.ts b/packages/happy-dom/src/nodes/html-form-element/IRadioNodeList.ts deleted file mode 100644 index 8e0c5dda8..000000000 --- a/packages/happy-dom/src/nodes/html-form-element/IRadioNodeList.ts +++ /dev/null @@ -1,16 +0,0 @@ -import IElement from '../element/IElement.js'; -import INodeList from '../node/INodeList.js'; - -/** - * RadioNodeList. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/RadioNodeList - */ -export default interface IRadioNodeList extends INodeList { - /** - * Returns value. - * - * @returns Value. - */ - readonly value: string; -} diff --git a/packages/happy-dom/src/nodes/html-form-element/RadioNodeList.ts b/packages/happy-dom/src/nodes/html-form-element/RadioNodeList.ts index dfb0bc9c1..6f36a0111 100644 --- a/packages/happy-dom/src/nodes/html-form-element/RadioNodeList.ts +++ b/packages/happy-dom/src/nodes/html-form-element/RadioNodeList.ts @@ -1,13 +1,17 @@ -import IElement from '../element/IElement.js'; +import HTMLButtonElement from '../html-button-element/HTMLButtonElement.js'; +import HTMLInputElement from '../html-input-element/HTMLInputElement.js'; +import HTMLSelectElement from '../html-select-element/HTMLSelectElement.js'; +import HTMLTextAreaElement from '../html-text-area-element/HTMLTextAreaElement.js'; import NodeList from '../node/NodeList.js'; -import IRadioNodeList from './IRadioNodeList.js'; /** * RadioNodeList * * @see https://developer.mozilla.org/en-US/docs/Web/API/RadioNodeList */ -export default class RadioNodeList extends NodeList implements IRadioNodeList { +export default class RadioNodeList extends NodeList< + HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement +> { /** * Returns value. * @@ -15,8 +19,8 @@ export default class RadioNodeList extends NodeList implements IRadioN */ public get value(): string { for (const node of this) { - if (node.checked) { - return node.value; + if ((node).checked) { + return (node).value; } } return null; diff --git a/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElement.ts b/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElement.ts index 8c8fdc85e..1cffbdb18 100644 --- a/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElement.ts +++ b/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElement.ts @@ -1,13 +1,12 @@ import Event from '../../event/Event.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; -import IDocument from '../document/IDocument.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; +import Document from '../document/Document.js'; import HTMLElement from '../html-element/HTMLElement.js'; -import INode from '../node/INode.js'; -import IHTMLIFrameElement from './IHTMLIFrameElement.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import Node from '../node/Node.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLIFrameElementNamedNodeMap from './HTMLIFrameElementNamedNodeMap.js'; -import ICrossOriginBrowserWindow from '../../window/ICrossOriginBrowserWindow.js'; +import CrossOriginBrowserWindow from '../../window/CrossOriginBrowserWindow.js'; import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; import HTMLIFrameElementPageLoader from './HTMLIFrameElementPageLoader.js'; @@ -17,16 +16,16 @@ import HTMLIFrameElementPageLoader from './HTMLIFrameElementPageLoader.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement. */ -export default class HTMLIFrameElement extends HTMLElement implements IHTMLIFrameElement { +export default class HTMLIFrameElement extends HTMLElement { // Events public onload: (event: Event) => void | null = null; public onerror: (event: Event) => void | null = null; // Internal properties - public override [PropertySymbol.attributes]: INamedNodeMap; + public override [PropertySymbol.attributes]: NamedNodeMap; // Private properties - #contentWindowContainer: { window: IBrowserWindow | ICrossOriginBrowserWindow | null } = { + #contentWindowContainer: { window: BrowserWindow | CrossOriginBrowserWindow | null } = { window: null }; #pageLoader: HTMLIFrameElementPageLoader; @@ -193,8 +192,8 @@ export default class HTMLIFrameElement extends HTMLElement implements IHTMLIFram * * @returns Content document. */ - public get contentDocument(): IDocument | null { - return (this.#contentWindowContainer.window)?.document ?? null; + public get contentDocument(): Document | null { + return (this.#contentWindowContainer.window)?.document ?? null; } /** @@ -202,14 +201,14 @@ export default class HTMLIFrameElement extends HTMLElement implements IHTMLIFram * * @returns Content window. */ - public get contentWindow(): IBrowserWindow | ICrossOriginBrowserWindow | null { + public get contentWindow(): BrowserWindow | CrossOriginBrowserWindow | null { return this.#contentWindowContainer.window; } /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const isConnected = this[PropertySymbol.isConnected]; const isParentConnected = parentNode ? parentNode[PropertySymbol.isConnected] : false; @@ -231,7 +230,7 @@ export default class HTMLIFrameElement extends HTMLElement implements IHTMLIFram * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLIFrameElement { - return super.cloneNode(deep); + public cloneNode(deep = false): HTMLIFrameElement { + return super.cloneNode(deep); } } diff --git a/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.ts index 798740a25..3a6329e41 100644 --- a/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import Element from '../element/Element.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLIFrameElementPageLoader from './HTMLIFrameElementPageLoader.js'; @@ -26,7 +26,7 @@ export default class HTMLIFrameElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedAttribute = super.setNamedItem(item); if ( diff --git a/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementPageLoader.ts b/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementPageLoader.ts index cb538d2a5..4a940421c 100644 --- a/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementPageLoader.ts +++ b/packages/happy-dom/src/nodes/html-iframe-element/HTMLIFrameElementPageLoader.ts @@ -1,11 +1,10 @@ import Event from '../../event/Event.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; +import BrowserWindow from '../../window/BrowserWindow.js'; import CrossOriginBrowserWindow from '../../window/CrossOriginBrowserWindow.js'; import WindowErrorUtility from '../../window/WindowErrorUtility.js'; import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; -import ICrossOriginBrowserWindow from '../../window/ICrossOriginBrowserWindow.js'; -import IHTMLIFrameElement from './IHTMLIFrameElement.js'; +import HTMLIFrameElement from './HTMLIFrameElement.js'; import DOMException from '../../exception/DOMException.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; import BrowserFrameURL from '../../browser/utilities/BrowserFrameURL.js'; @@ -16,8 +15,8 @@ import IRequestReferrerPolicy from '../../fetch/types/IRequestReferrerPolicy.js' * HTML Iframe page loader. */ export default class HTMLIFrameElementPageLoader { - #element: IHTMLIFrameElement; - #contentWindowContainer: { window: IBrowserWindow | ICrossOriginBrowserWindow | null }; + #element: HTMLIFrameElement; + #contentWindowContainer: { window: BrowserWindow | CrossOriginBrowserWindow | null }; #browserParentFrame: IBrowserFrame; #browserIFrame: IBrowserFrame; @@ -31,9 +30,9 @@ export default class HTMLIFrameElementPageLoader { * @param options.contentWindowContainer.window Content window. */ constructor(options: { - element: IHTMLIFrameElement; + element: HTMLIFrameElement; browserParentFrame: IBrowserFrame; - contentWindowContainer: { window: IBrowserWindow | ICrossOriginBrowserWindow | null }; + contentWindowContainer: { window: BrowserWindow | CrossOriginBrowserWindow | null }; }) { this.#element = options.element; this.#contentWindowContainer = options.contentWindowContainer; @@ -79,9 +78,9 @@ export default class HTMLIFrameElementPageLoader { this.#browserIFrame = this.#browserIFrame ?? BrowserFrameFactory.newChildFrame(this.#browserParentFrame); - ((this.#browserIFrame.window.top)) = + ((this.#browserIFrame.window.top)) = parentWindow; - ((this.#browserIFrame.window.parent)) = + ((this.#browserIFrame.window.parent)) = parentWindow; this.#browserIFrame diff --git a/packages/happy-dom/src/nodes/html-iframe-element/IHTMLIFrameElement.ts b/packages/happy-dom/src/nodes/html-iframe-element/IHTMLIFrameElement.ts deleted file mode 100644 index e58061981..000000000 --- a/packages/happy-dom/src/nodes/html-iframe-element/IHTMLIFrameElement.ts +++ /dev/null @@ -1,28 +0,0 @@ -import Event from '../../event/Event.js'; -import IBrowserWindow from '../../window/IBrowserWindow.js'; -import IDocument from '../document/IDocument.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import ICrossOriginBrowserWindow from '../../window/ICrossOriginBrowserWindow.js'; - -/** - * HTML Iframe Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement. - */ -export default interface IHTMLIFrameElement extends IHTMLElement { - src: string | null; - allow: string | null; - height: string | null; - width: string | null; - name: string | null; - sandbox: string | null; - srcdoc: string | null; - referrerPolicy: string | null; - readonly contentDocument: IDocument | null; - readonly contentWindow: IBrowserWindow | ICrossOriginBrowserWindow | null; - - // Events - onload: (event: Event) => void | null; - onerror: (event: Event) => void | null; -} diff --git a/packages/happy-dom/src/nodes/html-image-element/HTMLImageElement.ts b/packages/happy-dom/src/nodes/html-image-element/HTMLImageElement.ts index f965c6445..d09b5a609 100644 --- a/packages/happy-dom/src/nodes/html-image-element/HTMLImageElement.ts +++ b/packages/happy-dom/src/nodes/html-image-element/HTMLImageElement.ts @@ -1,5 +1,4 @@ import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLImageElement from './IHTMLImageElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; /** @@ -8,7 +7,7 @@ import * as PropertySymbol from '../../PropertySymbol.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement. */ -export default class HTMLImageElement extends HTMLElement implements IHTMLImageElement { +export default class HTMLImageElement extends HTMLElement { public [PropertySymbol.tagName] = 'IMG'; public [PropertySymbol.complete] = false; public [PropertySymbol.naturalHeight] = 0; @@ -317,7 +316,7 @@ export default class HTMLImageElement extends HTMLElement implements IHTMLImageE * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLImageElement { - return super.cloneNode(deep); + public cloneNode(deep = false): HTMLImageElement { + return super.cloneNode(deep); } } diff --git a/packages/happy-dom/src/nodes/html-image-element/IHTMLImageElement.ts b/packages/happy-dom/src/nodes/html-image-element/IHTMLImageElement.ts deleted file mode 100644 index ad78e126b..000000000 --- a/packages/happy-dom/src/nodes/html-image-element/IHTMLImageElement.ts +++ /dev/null @@ -1,44 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Image Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement. - */ -export default interface IHTMLImageElement extends IHTMLElement { - alt: string; - readonly complete: boolean; - crossOrigin: string; - readonly currentSrc: string; - decoding: string; - height: number; - isMap: boolean; - loading: string; - readonly naturalHeight: number; - readonly naturalWidth: number; - referrerPolicy: string; - sizes: string; - src: string; - srcset: string; - useMap: string; - width: number; - readonly x: number; - readonly y: number; - - /** - * The decode() method of the HTMLImageElement interface returns a Promise that resolves when the image is decoded and it is safe to append the image to the DOM. - * - * @returns Promise. - */ - decode(): Promise; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLImageElement; -} diff --git a/packages/happy-dom/src/nodes/html-input-element/FileList.ts b/packages/happy-dom/src/nodes/html-input-element/FileList.ts index 008e95be5..102eabf28 100644 --- a/packages/happy-dom/src/nodes/html-input-element/FileList.ts +++ b/packages/happy-dom/src/nodes/html-input-element/FileList.ts @@ -1,12 +1,11 @@ import File from '../../file/File.js'; -import IFileList from './IFileList.js'; /** * FileList. * * @see https://developer.mozilla.org/en-US/docs/Web/API/FileList */ -export default class FileList extends Array implements IFileList { +export default class FileList extends Array { /** * Constructor. */ diff --git a/packages/happy-dom/src/nodes/html-input-element/HTMLInputElement.ts b/packages/happy-dom/src/nodes/html-input-element/HTMLInputElement.ts index 437da8715..c9dceb345 100644 --- a/packages/happy-dom/src/nodes/html-input-element/HTMLInputElement.ts +++ b/packages/happy-dom/src/nodes/html-input-element/HTMLInputElement.ts @@ -7,21 +7,16 @@ import Event from '../../event/Event.js'; import HTMLInputElementValueSanitizer from './HTMLInputElementValueSanitizer.js'; import HTMLInputElementSelectionModeEnum from './HTMLInputElementSelectionModeEnum.js'; import HTMLInputElementSelectionDirectionEnum from './HTMLInputElementSelectionDirectionEnum.js'; -import IHTMLInputElement from './IHTMLInputElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; +import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; import HTMLInputElementValueStepping from './HTMLInputElementValueStepping.js'; import FileList from './FileList.js'; -import File from '../../file/File.js'; -import IFileList from './IFileList.js'; -import INode from '../node/INode.js'; -import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; -import INodeList from '../node/INodeList.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; +import Node from '../node/Node.js'; +import NodeList from '../node/NodeList.js'; +import HTMLLabelElement from '../html-label-element/HTMLLabelElement.js'; import EventPhaseEnum from '../../event/EventPhaseEnum.js'; import HTMLInputElementDateUtility from './HTMLInputElementDateUtility.js'; import HTMLLabelElementUtility from '../html-label-element/HTMLLabelElementUtility.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLInputElementNamedNodeMap from './HTMLInputElementNamedNodeMap.js'; import PointerEvent from '../../event/events/PointerEvent.js'; import { URL } from 'url'; @@ -35,14 +30,14 @@ import { URL } from 'url'; * Used as reference for some of the logic (like selection range): * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/nodes/HTMLInputElement-impl.js (MIT licensed). */ -export default class HTMLInputElement extends HTMLElement implements IHTMLInputElement { +export default class HTMLInputElement extends HTMLElement { // Events public oninput: (event: Event) => void | null = null; public oninvalid: (event: Event) => void | null = null; public onselectionchange: (event: Event) => void | null = null; // Internal properties - public override [PropertySymbol.attributes]: INamedNodeMap = new HTMLInputElementNamedNodeMap( + public override [PropertySymbol.attributes]: NamedNodeMap = new HTMLInputElementNamedNodeMap( this ); public [PropertySymbol.value] = null; @@ -52,7 +47,7 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE public [PropertySymbol.checked]: boolean | null = null; public [PropertySymbol.validationMessage] = ''; public [PropertySymbol.validity] = new ValidityState(this); - public [PropertySymbol.files]: IFileList = new FileList(); + public [PropertySymbol.files]: FileList = new FileList(); // Private properties #selectionStart: number = null; @@ -83,7 +78,7 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE * * @returns Files. */ - public get files(): IFileList { + public get files(): FileList { return this[PropertySymbol.files]; } @@ -92,7 +87,7 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE * * @param files Files. */ - public set files(files: IFileList) { + public set files(files: FileList) { this[PropertySymbol.files] = files; } @@ -206,16 +201,16 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE * * @returns Form. */ - public get form(): IHTMLFormElement | null { + public get form(): HTMLFormElement | null { if (this[PropertySymbol.formNode]) { - return this[PropertySymbol.formNode]; + return this[PropertySymbol.formNode]; } if (!this.isConnected) { return null; } const formID = this.getAttribute('form'); return formID - ? this[PropertySymbol.ownerDocument].getElementById(formID) + ? this[PropertySymbol.ownerDocument].getElementById(formID) : null; } @@ -1100,7 +1095,7 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE * * @returns Label elements. */ - public get labels(): INodeList { + public get labels(): NodeList { return HTMLLabelElementUtility.getAssociatedLabelElements(this); } @@ -1289,7 +1284,7 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLInputElement { + public cloneNode(deep = false): HTMLInputElement { const clone = super.cloneNode(deep); clone.formAction = this.formAction; clone.formMethod = this.formMethod; @@ -1385,7 +1380,7 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const oldFormNode = this[PropertySymbol.formNode]; super[PropertySymbol.connectToNode](parentNode); @@ -1433,8 +1428,8 @@ export default class HTMLInputElement extends HTMLElement implements IHTMLInputE this[PropertySymbol.checked] = checked; if (checked && this.type === 'radio' && this.name) { - const root = ( - (this[PropertySymbol.formNode] || this.getRootNode()) + const root = ( + (this[PropertySymbol.formNode] || this.getRootNode()) ); const radioButtons = root.querySelectorAll(`input[type="radio"][name="${this.name}"]`); diff --git a/packages/happy-dom/src/nodes/html-input-element/HTMLInputElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-input-element/HTMLInputElementNamedNodeMap.ts index 22507fe0d..324c95357 100644 --- a/packages/happy-dom/src/nodes/html-input-element/HTMLInputElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-input-element/HTMLInputElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; @@ -15,7 +15,7 @@ export default class HTMLInputElementNamedNodeMap extends HTMLElementNamedNodeMa /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -40,7 +40,7 @@ export default class HTMLInputElementNamedNodeMap extends HTMLElementNamedNodeMa /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-input-element/IFileList.ts b/packages/happy-dom/src/nodes/html-input-element/IFileList.ts deleted file mode 100644 index 78b86f780..000000000 --- a/packages/happy-dom/src/nodes/html-input-element/IFileList.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * NodeList. - */ -export default interface IFileList extends Array { - /** - * Returns item by index. - * - * @param index Index. - */ - item(index: number): T; -} diff --git a/packages/happy-dom/src/nodes/html-input-element/IHTMLInputElement.ts b/packages/happy-dom/src/nodes/html-input-element/IHTMLInputElement.ts deleted file mode 100644 index 01d356e09..000000000 --- a/packages/happy-dom/src/nodes/html-input-element/IHTMLInputElement.ts +++ /dev/null @@ -1,139 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; -import HTMLInputElementSelectionModeEnum from './HTMLInputElementSelectionModeEnum.js'; -import ValidityState from '../../validity-state/ValidityState.js'; -import Event from '../../event/Event.js'; -import File from '../../file/File.js'; -import IFileList from './IFileList.js'; -import INodeList from '../node/INodeList.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; - -/** - * HTML Input Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement. - */ -export default interface IHTMLInputElement extends IHTMLElement { - readonly form: IHTMLFormElement; - readonly labels: INodeList; - readonly validity: ValidityState; - formAction: string; - formEnctype: string; - formMethod: string; - formNoValidate: boolean; - formTarget: string; - defaultChecked: boolean; - files: IFileList; - defaultValue: string; - height: number; - width: number; - size: number; - minLength: number; - maxLength: number; - type: string; - name: string; - alt: string; - min: string; - max: string; - pattern: string; - placeholder: string; - step: string; - inputmode: string; - accept: string; - allowdirs: string; - autocomplete: string; - src: string; - readOnly: boolean; - disabled: boolean; - autofocus: boolean; - required: boolean; - indeterminate: boolean; - multiple: boolean; - checked: boolean; - value: string; - selectionStart: number; - selectionEnd: number; - selectionDirection: string; - willValidate: boolean; - valueAsDate: Date | null; - valueAsNumber: number; - validationMessage: string; - - // Events - oninput: (event: Event) => void | null; - oninvalid: (event: Event) => void | null; - onselectionchange: (event: Event) => void | null; - - /** - * Sets validation message. - * - * @param message Message. - */ - setCustomValidity(message: string): void; - - /** - * Reports validity by dispatching an "invalid" event. - */ - reportValidity(): void; - - /** - * Selects the text. - */ - select(): void; - - /** - * Set selection range. - * - * @param start Start. - * @param end End. - * @param [direction="none"] Direction. - */ - setSelectionRange(start: number, end: number, direction: string): void; - - /** - * Set range text. - * - * @param replacement Replacement. - * @param [start] Start. - * @param [end] End. - * @param [direction] Direction. - * @param selectionMode - */ - setRangeText( - replacement: string, - start?: number, - end?: number, - selectionMode?: HTMLInputElementSelectionModeEnum - ): void; - - /** - * Checks validity. - * - * @returns "true" if the field is valid. - */ - checkValidity(): boolean; - - /** - * Steps up. - * - * @param [increment] Increment. - */ - stepUp(increment?: number): void; - - /** - * Steps up. - * - * @param [increment] Increment. - */ - stepDown(increment?: number): void; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLInputElement; -} diff --git a/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElement.ts b/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElement.ts index 76095e0e1..be83da6e7 100644 --- a/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElement.ts +++ b/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElement.ts @@ -1,8 +1,6 @@ import HTMLElement from '../html-element/HTMLElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; -import IHTMLLabelElement from './IHTMLLabelElement.js'; +import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; import Event from '../../event/Event.js'; import EventPhaseEnum from '../../event/EventPhaseEnum.js'; import PointerEvent from '../../event/events/PointerEvent.js'; @@ -13,7 +11,7 @@ import PointerEvent from '../../event/events/PointerEvent.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement. */ -export default class HTMLLabelElement extends HTMLElement implements IHTMLLabelElement { +export default class HTMLLabelElement extends HTMLElement { /** * Returns a string containing the ID of the labeled control. This reflects the "for" attribute. * @@ -41,13 +39,13 @@ export default class HTMLLabelElement extends HTMLElement implements IHTMLLabelE * * @returns Control element. */ - public get control(): IHTMLElement { + public get control(): HTMLElement { const htmlFor = this.htmlFor; if (htmlFor) { - const control = this[PropertySymbol.ownerDocument].getElementById(htmlFor); + const control = this[PropertySymbol.ownerDocument].getElementById(htmlFor); return control !== this ? control : null; } - return ( + return ( this.querySelector('button,input:not([type="hidden"]),meter,output,progress,select,textarea') ); } @@ -57,8 +55,8 @@ export default class HTMLLabelElement extends HTMLElement implements IHTMLLabelE * * @returns Form. */ - public get form(): IHTMLFormElement { - return this[PropertySymbol.formNode]; + public get form(): HTMLFormElement { + return this[PropertySymbol.formNode]; } /** @@ -68,7 +66,7 @@ export default class HTMLLabelElement extends HTMLElement implements IHTMLLabelE * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLLabelElement { + public cloneNode(deep = false): HTMLLabelElement { return super.cloneNode(deep); } diff --git a/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElementUtility.ts b/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElementUtility.ts index 336b0442a..5ef11305a 100644 --- a/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElementUtility.ts +++ b/packages/happy-dom/src/nodes/html-label-element/HTMLLabelElementUtility.ts @@ -1,9 +1,8 @@ -import IDocument from '../document/IDocument.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLLabelElement from './IHTMLLabelElement.js'; -import INodeList from '../node/INodeList.js'; +import Document from '../document/Document.js'; +import HTMLElement from '../html-element/HTMLElement.js'; +import HTMLLabelElement from './HTMLLabelElement.js'; import NodeList from '../node/NodeList.js'; -import IShadowRoot from '../shadow-root/IShadowRoot.js'; +import ShadowRoot from '../shadow-root/ShadowRoot.js'; import * as PropertySymbol from '../../PropertySymbol.js'; /** @@ -16,20 +15,20 @@ export default class HTMLLabelElementUtility { * @param element Element to get labels for. * @returns Label elements. */ - public static getAssociatedLabelElements(element: IHTMLElement): INodeList { + public static getAssociatedLabelElements(element: HTMLElement): NodeList { const id = element.id; - let labels: INodeList; + let labels: NodeList; if (id) { - const rootNode = element.getRootNode(); - labels = >rootNode.querySelectorAll(`label[for="${id}"]`); + const rootNode = element.getRootNode(); + labels = >rootNode.querySelectorAll(`label[for="${id}"]`); } else { - labels = new NodeList(); + labels = new NodeList(); } let parent = element[PropertySymbol.parentNode]; while (parent) { if (parent['tagName'] === 'LABEL') { - labels.push(parent); + labels.push(parent); break; } parent = parent[PropertySymbol.parentNode]; diff --git a/packages/happy-dom/src/nodes/html-label-element/IHTMLLabelElement.ts b/packages/happy-dom/src/nodes/html-label-element/IHTMLLabelElement.ts deleted file mode 100644 index 341eec2cc..000000000 --- a/packages/happy-dom/src/nodes/html-label-element/IHTMLLabelElement.ts +++ /dev/null @@ -1,14 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; - -/** - * HTML Label Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLLabelElement. - */ -export default interface IHTMLLabelElement extends IHTMLElement { - readonly control: IHTMLElement; - readonly form: IHTMLFormElement; - htmlFor: string; -} diff --git a/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElement.ts b/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElement.ts index 261110847..8d0bc3576 100644 --- a/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElement.ts +++ b/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElement.ts @@ -1,13 +1,11 @@ import CSSStyleSheet from '../../css/CSSStyleSheet.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLLinkElement from './IHTMLLinkElement.js'; import Event from '../../event/Event.js'; import ErrorEvent from '../../event/events/ErrorEvent.js'; -import INode from '../../nodes/node/INode.js'; +import Node from '../../nodes/node/Node.js'; import DOMTokenList from '../../dom-token-list/DOMTokenList.js'; -import IDOMTokenList from '../../dom-token-list/IDOMTokenList.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLLinkElementNamedNodeMap from './HTMLLinkElementNamedNodeMap.js'; import HTMLLinkElementStyleSheetLoader from './HTMLLinkElementStyleSheetLoader.js'; import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; @@ -18,14 +16,14 @@ import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLLinkElement. */ -export default class HTMLLinkElement extends HTMLElement implements IHTMLLinkElement { +export default class HTMLLinkElement extends HTMLElement { // Events public onerror: (event: ErrorEvent) => void = null; public onload: (event: Event) => void = null; // Internal properties - public override [PropertySymbol.attributes]: INamedNodeMap; - public readonly [PropertySymbol.sheet]: CSSStyleSheet = null; + public override [PropertySymbol.attributes]: NamedNodeMap; + public [PropertySymbol.sheet]: CSSStyleSheet = null; public [PropertySymbol.evaluateCSS] = true; public [PropertySymbol.relList]: DOMTokenList = null; #styleSheetLoader: HTMLLinkElementStyleSheetLoader; @@ -58,11 +56,11 @@ export default class HTMLLinkElement extends HTMLElement implements IHTMLLinkEle * * @returns Rel list. */ - public get relList(): IDOMTokenList { + public get relList(): DOMTokenList { if (!this[PropertySymbol.relList]) { this[PropertySymbol.relList] = new DOMTokenList(this, 'rel'); } - return this[PropertySymbol.relList]; + return this[PropertySymbol.relList]; } /** @@ -221,7 +219,7 @@ export default class HTMLLinkElement extends HTMLElement implements IHTMLLinkEle /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const isConnected = this[PropertySymbol.isConnected]; const isParentConnected = parentNode ? parentNode[PropertySymbol.isConnected] : false; diff --git a/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementNamedNodeMap.ts index 5a368fb1c..7e8fbd653 100644 --- a/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLLinkElement from './HTMLLinkElement.js'; @@ -28,7 +28,7 @@ export default class HTMLLinkElementNamedNodeMap extends HTMLElementNamedNodeMap /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -56,7 +56,7 @@ export default class HTMLLinkElementNamedNodeMap extends HTMLElementNamedNodeMap /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementStyleSheetLoader.ts b/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementStyleSheetLoader.ts index 4667d22fe..bae857b91 100644 --- a/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementStyleSheetLoader.ts +++ b/packages/happy-dom/src/nodes/html-link-element/HTMLLinkElementStyleSheetLoader.ts @@ -6,14 +6,14 @@ import DOMException from '../../exception/DOMException.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; import WindowErrorUtility from '../../window/WindowErrorUtility.js'; import DocumentReadyStateManager from '../document/DocumentReadyStateManager.js'; -import IHTMLLinkElement from './IHTMLLinkElement.js'; +import HTMLLinkElement from './HTMLLinkElement.js'; import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; /** * Helper class for getting the URL relative to a Location object. */ export default class HTMLLinkElementStyleSheetLoader { - #element: IHTMLLinkElement; + #element: HTMLLinkElement; #browserFrame: IBrowserFrame; #loadedStyleSheetURL: string | null = null; @@ -24,7 +24,7 @@ export default class HTMLLinkElementStyleSheetLoader { * @param options.element Element. * @param options.browserFrame Browser frame. */ - constructor(options: { element: IHTMLLinkElement; browserFrame: IBrowserFrame }) { + constructor(options: { element: HTMLLinkElement; browserFrame: IBrowserFrame }) { this.#element = options.element; this.#browserFrame = options.browserFrame; } diff --git a/packages/happy-dom/src/nodes/html-link-element/IHTMLLinkElement.ts b/packages/happy-dom/src/nodes/html-link-element/IHTMLLinkElement.ts deleted file mode 100644 index 8866419ce..000000000 --- a/packages/happy-dom/src/nodes/html-link-element/IHTMLLinkElement.ts +++ /dev/null @@ -1,22 +0,0 @@ -import CSSStyleSheet from '../../css/CSSStyleSheet.js'; -import IDOMTokenList from '../../dom-token-list/IDOMTokenList.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Link Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLLinkElement. - */ -export default interface IHTMLLinkElement extends IHTMLElement { - readonly sheet: CSSStyleSheet; - readonly relList: IDOMTokenList; - as: string; - crossOrigin: string; - href: string; - hreflang: string; - media: string; - referrerPolicy: string; - rel: string; - type: string; -} diff --git a/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts b/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts index 2775abe06..45467cb63 100644 --- a/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts +++ b/packages/happy-dom/src/nodes/html-media-element/HTMLMediaElement.ts @@ -3,26 +3,14 @@ import Event from '../../event/Event.js'; import DOMException from '../../exception/DOMException.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLMediaElement, { IMediaError } from './IHTMLMediaElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; +import TimeRange from './TimeRange.js'; -/** - * - * This implementation coming from jsdom - * https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/HTMLMediaElement-impl.js#L7 - * - */ -function getTimeRangeDummy(): object { - return { - length: 0, - start() { - return 0; - }, - end() { - return 0; - } - }; +interface IMediaError { + code: number; + message: string; } + /** * HTML Media Element. * @@ -30,7 +18,7 @@ function getTimeRangeDummy(): object { * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement. * */ -export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaElement { +export default class HTMLMediaElement extends HTMLElement { // Events public onabort: (event: Event) => void | null = null; public oncanplay: (event: Event) => void | null = null; @@ -65,7 +53,7 @@ export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaE public [PropertySymbol.muted] = false; public [PropertySymbol.defaultMuted] = false; public [PropertySymbol.preservesPitch] = true; - public [PropertySymbol.buffered]: object = getTimeRangeDummy(); + public [PropertySymbol.buffered] = new TimeRange(); public [PropertySymbol.duration] = NaN; public [PropertySymbol.error]: IMediaError = null; public [PropertySymbol.ended] = false; @@ -74,8 +62,8 @@ export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaE public [PropertySymbol.textTracks]: object[] = []; public [PropertySymbol.videoTracks]: object[] = []; public [PropertySymbol.seeking] = false; - public [PropertySymbol.seekable] = getTimeRangeDummy(); - public [PropertySymbol.played] = getTimeRangeDummy(); + public [PropertySymbol.seekable] = new TimeRange(); + public [PropertySymbol.played] = new TimeRange(); /** * Returns buffered. @@ -550,7 +538,7 @@ export default class HTMLMediaElement extends HTMLElement implements IHTMLMediaE * * @param deep */ - public cloneNode(deep = false): IHTMLMediaElement { - return super.cloneNode(deep); + public cloneNode(deep = false): HTMLMediaElement { + return super.cloneNode(deep); } } diff --git a/packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts b/packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts deleted file mode 100644 index 2d8ace0b7..000000000 --- a/packages/happy-dom/src/nodes/html-media-element/IHTMLMediaElement.ts +++ /dev/null @@ -1,110 +0,0 @@ -import Event from '../../event/Event.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Media Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement. - */ - -export interface IMediaError { - code: number; - message: string; -} -export default interface IHTMLMediaElement extends IHTMLElement { - readonly currentSrc: string; - readonly duration: number; - readonly ended: boolean; - readonly error: IMediaError | null; - readonly networkState: number; - readonly played: object; // TimeRanges https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges - readonly readyState: number; - readonly seekable: object; // TimeRanges https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges - readonly seeking: boolean; - readonly textTracks: object[]; - readonly videoTracks: object[]; - readonly buffered: object; // TimeRanges https://developer.mozilla.org/en-US/docs/Web/API/TimeRanges - autoplay: boolean; - controls: boolean; - crossOrigin: string; // Only anonymus and 'use-credentials' is valid - currentTime: number | string; - defaultMuted: boolean; - defaultPlaybackRate: number | string; - loop: boolean; - muted: boolean; - paused: boolean; - playbackRate: number | string; - preload: string; - preservesPitch: boolean; - src: string; - volume: number | string; - - // Events - onabort: (event: Event) => void | null; - oncanplay: (event: Event) => void | null; - oncanplaythrough: (event: Event) => void | null; - ondurationchange: (event: Event) => void | null; - onemptied: (event: Event) => void | null; - onended: (event: Event) => void | null; - onerror: (event: Event) => void | null; - onloadeddata: (event: Event) => void | null; - onloadedmetadata: (event: Event) => void | null; - onloadstart: (event: Event) => void | null; - onpause: (event: Event) => void | null; - onplay: (event: Event) => void | null; - onplaying: (event: Event) => void | null; - onprogress: (event: Event) => void | null; - onratechange: (event: Event) => void | null; - onresize: (event: Event) => void | null; - onseeked: (event: Event) => void | null; - onseeking: (event: Event) => void | null; - onstalled: (event: Event) => void | null; - onsuspend: (event: Event) => void | null; - ontimeupdate: (event: Event) => void | null; - onvolumechange: (event: Event) => void | null; - onwaiting: (event: Event) => void | null; - - /** - * A MediaStream object which can be used as a source for audio and/or video data by other media processing code, - * or as a source for WebRTC. - * Https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/captureStream - */ - captureStream(): object; - - /** - * The HTMLMediaElement method canPlayType() reports how likely it is that the current browser will be able to play - * media of a given MIME type. - * Https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/canPlayType - * possible return value: "" | "probably" | "maybe". - */ - canPlayType(_type: string): string; - - /** - * The HTMLMediaElement method load() resets the media element to its initial state and begins the process of - * selecting a media source and loading the media in preparation for playback to begin at the beginning. - * Https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/load. - */ - load(): void; - - /** - * The HTMLMediaElement.pause() method will pause playback of the media, if the media is already in a paused state - * this method will have no effect. - */ - pause(): void; - - /** - * The HTMLMediaElement play() method attempts to begin playback of the media. It returns a Promise - * which is resolved when playback has been successfully started. - */ - play(): Promise; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLMediaElement; -} diff --git a/packages/happy-dom/src/nodes/html-media-element/TimeRange.ts b/packages/happy-dom/src/nodes/html-media-element/TimeRange.ts new file mode 100644 index 000000000..0d8283521 --- /dev/null +++ b/packages/happy-dom/src/nodes/html-media-element/TimeRange.ts @@ -0,0 +1,26 @@ +/** + * Based on implementation from JSDOM. + * + * @see https://github.com/jsdom/jsdom/blob/master/lib/jsdom/living/nodes/HTMLMediaElement-impl.js#L7 + */ +export default class TimeRange { + public readonly length: number = 0; + + /** + * Returns start. + * + * @returns Start. + */ + public start(): number { + return 0; + } + + /** + * Returns end. + * + * @returns End. + */ + public end(): number { + return 0; + } +} diff --git a/packages/happy-dom/src/nodes/html-meta-element/HTMLMetaElement.ts b/packages/happy-dom/src/nodes/html-meta-element/HTMLMetaElement.ts index d64f49cdb..4de31f98e 100644 --- a/packages/happy-dom/src/nodes/html-meta-element/HTMLMetaElement.ts +++ b/packages/happy-dom/src/nodes/html-meta-element/HTMLMetaElement.ts @@ -1,4 +1,3 @@ -import IHTMLMetaElement from './IHTMLMetaElement.js'; import HTMLElement from '../html-element/HTMLElement.js'; /** @@ -7,7 +6,7 @@ import HTMLElement from '../html-element/HTMLElement.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMetaElement. */ -export default class HTMLMetaElement extends HTMLElement implements IHTMLMetaElement { +export default class HTMLMetaElement extends HTMLElement { /** * Returns content. * diff --git a/packages/happy-dom/src/nodes/html-meta-element/IHTMLMetaElement.ts b/packages/happy-dom/src/nodes/html-meta-element/IHTMLMetaElement.ts deleted file mode 100644 index 42e467c9d..000000000 --- a/packages/happy-dom/src/nodes/html-meta-element/IHTMLMetaElement.ts +++ /dev/null @@ -1,14 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Meta Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLMetaElement. - */ -export default interface IHTMLMetaElement extends IHTMLElement { - content: string; - httpEquiv: string; - name: string; - scheme: string; -} diff --git a/packages/happy-dom/src/nodes/html-opt-group-element/HTMLOptGroupElement.ts b/packages/happy-dom/src/nodes/html-opt-group-element/HTMLOptGroupElement.ts index 4530e9c11..5dc8e3950 100644 --- a/packages/happy-dom/src/nodes/html-opt-group-element/HTMLOptGroupElement.ts +++ b/packages/happy-dom/src/nodes/html-opt-group-element/HTMLOptGroupElement.ts @@ -1,5 +1,4 @@ import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLOptGroupElement from './IHTMLOptGroupElement.js'; /** * HTML Opt Group Element. @@ -7,7 +6,7 @@ import IHTMLOptGroupElement from './IHTMLOptGroupElement.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptGroupElement. */ -export default class HTMLOptGroupElement extends HTMLElement implements IHTMLOptGroupElement { +export default class HTMLOptGroupElement extends HTMLElement { /** * Returns label. * diff --git a/packages/happy-dom/src/nodes/html-opt-group-element/IHTMLOptGroupElement.ts b/packages/happy-dom/src/nodes/html-opt-group-element/IHTMLOptGroupElement.ts deleted file mode 100644 index e5ac0858e..000000000 --- a/packages/happy-dom/src/nodes/html-opt-group-element/IHTMLOptGroupElement.ts +++ /dev/null @@ -1,12 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Opt Group Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptGroupElement. - */ -export default interface IHTMLOptGroupElement extends IHTMLElement { - disabled: boolean; - label: string; -} diff --git a/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElement.ts b/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElement.ts index e297c55cf..3381497ca 100644 --- a/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElement.ts +++ b/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElement.ts @@ -1,12 +1,10 @@ -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; +import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; import HTMLSelectElement from '../html-select-element/HTMLSelectElement.js'; -import IHTMLSelectElement from '../html-select-element/IHTMLSelectElement.js'; -import INode from '../node/INode.js'; +import Node from '../node/Node.js'; import HTMLOptionElementNamedNodeMap from './HTMLOptionElementNamedNodeMap.js'; -import IHTMLOptionElement from './IHTMLOptionElement.js'; /** * HTML Option Element. @@ -14,8 +12,8 @@ import IHTMLOptionElement from './IHTMLOptionElement.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionElement. */ -export default class HTMLOptionElement extends HTMLElement implements IHTMLOptionElement { - public override [PropertySymbol.attributes]: INamedNodeMap = new HTMLOptionElementNamedNodeMap( +export default class HTMLOptionElement extends HTMLElement { + public override [PropertySymbol.attributes]: NamedNodeMap = new HTMLOptionElementNamedNodeMap( this ); public [PropertySymbol.selectedness] = false; @@ -46,7 +44,7 @@ export default class HTMLOptionElement extends HTMLElement implements IHTMLOptio */ public get index(): number { return this[PropertySymbol.selectNode] - ? (this[PropertySymbol.selectNode]).options.indexOf(this) + ? (this[PropertySymbol.selectNode]).options.indexOf(this) : 0; } @@ -55,8 +53,8 @@ export default class HTMLOptionElement extends HTMLElement implements IHTMLOptio * * @returns Form. */ - public get form(): IHTMLFormElement { - return this[PropertySymbol.formNode]; + public get form(): HTMLFormElement { + return this[PropertySymbol.formNode]; } /** @@ -127,7 +125,7 @@ export default class HTMLOptionElement extends HTMLElement implements IHTMLOptio /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const oldSelectNode = this[PropertySymbol.selectNode]; super[PropertySymbol.connectToNode](parentNode); diff --git a/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElementNamedNodeMap.ts index fb99cff3e..3ffe72d2b 100644 --- a/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-option-element/HTMLOptionElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLSelectElement from '../html-select-element/HTMLSelectElement.js'; @@ -15,7 +15,7 @@ export default class HTMLOptionElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -40,7 +40,7 @@ export default class HTMLOptionElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-option-element/IHTMLOptionElement.ts b/packages/happy-dom/src/nodes/html-option-element/IHTMLOptionElement.ts deleted file mode 100644 index 1c93a324d..000000000 --- a/packages/happy-dom/src/nodes/html-option-element/IHTMLOptionElement.ts +++ /dev/null @@ -1,17 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; - -/** - * HTML Option Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionElement. - */ -export default interface IHTMLOptionElement extends IHTMLElement { - readonly form: IHTMLFormElement; - readonly index: number; - selected: boolean; - value: string; - text: string; - disabled: boolean; -} diff --git a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts index 9fb73f9ae..8d92d9e17 100644 --- a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts +++ b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElement.ts @@ -1,10 +1,9 @@ import HTMLElement from '../html-element/HTMLElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLScriptElement from './IHTMLScriptElement.js'; import Event from '../../event/Event.js'; import ErrorEvent from '../../event/events/ErrorEvent.js'; -import INode from '../../nodes/node/INode.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import Node from '../../nodes/node/Node.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLScriptElementNamedNodeMap from './HTMLScriptElementNamedNodeMap.js'; import WindowErrorUtility from '../../window/WindowErrorUtility.js'; import WindowBrowserSettingsReader from '../../window/WindowBrowserSettingsReader.js'; @@ -18,13 +17,13 @@ import BrowserErrorCaptureEnum from '../../browser/enums/BrowserErrorCaptureEnum * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLScriptElement. */ -export default class HTMLScriptElement extends HTMLElement implements IHTMLScriptElement { +export default class HTMLScriptElement extends HTMLElement { // Events public onerror: (event: ErrorEvent) => void = null; public onload: (event: Event) => void = null; // Internal properties - public override [PropertySymbol.attributes]: INamedNodeMap; + public override [PropertySymbol.attributes]: NamedNodeMap; public [PropertySymbol.evaluateScript] = true; // Private properties @@ -196,14 +195,14 @@ export default class HTMLScriptElement extends HTMLElement implements IHTMLScrip * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLScriptElement { - return super.cloneNode(deep); + public cloneNode(deep = false): HTMLScriptElement { + return super.cloneNode(deep); } /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const isConnected = this[PropertySymbol.isConnected]; const isParentConnected = parentNode ? parentNode[PropertySymbol.isConnected] : false; const browserSettings = WindowBrowserSettingsReader.getSettings( diff --git a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementNamedNodeMap.ts index 391131687..0a5cbd48f 100644 --- a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLScriptElement from './HTMLScriptElement.js'; @@ -27,7 +27,7 @@ export default class HTMLScriptElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( diff --git a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementScriptLoader.ts b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementScriptLoader.ts index a7d3001ce..7f57a6c40 100644 --- a/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementScriptLoader.ts +++ b/packages/happy-dom/src/nodes/html-script-element/HTMLScriptElementScriptLoader.ts @@ -5,7 +5,7 @@ import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; import ResourceFetch from '../../fetch/ResourceFetch.js'; import WindowErrorUtility from '../../window/WindowErrorUtility.js'; import DocumentReadyStateManager from '../document/DocumentReadyStateManager.js'; -import IHTMLScriptElement from './IHTMLScriptElement.js'; +import HTMLScriptElement from './HTMLScriptElement.js'; import IBrowserFrame from '../../browser/types/IBrowserFrame.js'; import BrowserErrorCaptureEnum from '../../browser/enums/BrowserErrorCaptureEnum.js'; @@ -13,7 +13,7 @@ import BrowserErrorCaptureEnum from '../../browser/enums/BrowserErrorCaptureEnum * Helper class for getting the URL relative to a Location object. */ export default class HTMLScriptElementScriptLoader { - #element: IHTMLScriptElement; + #element: HTMLScriptElement; #browserFrame: IBrowserFrame; #loadedScriptURL: string | null = null; @@ -24,7 +24,7 @@ export default class HTMLScriptElementScriptLoader { * @param options.element Element. * @param options.browserFrame Browser frame. */ - constructor(options: { element: IHTMLScriptElement; browserFrame: IBrowserFrame }) { + constructor(options: { element: HTMLScriptElement; browserFrame: IBrowserFrame }) { this.#element = options.element; this.#browserFrame = options.browserFrame; } diff --git a/packages/happy-dom/src/nodes/html-script-element/IHTMLScriptElement.ts b/packages/happy-dom/src/nodes/html-script-element/IHTMLScriptElement.ts deleted file mode 100644 index 3a3bd3078..000000000 --- a/packages/happy-dom/src/nodes/html-script-element/IHTMLScriptElement.ts +++ /dev/null @@ -1,26 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Script Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLScriptElement. - */ -export default interface IHTMLScriptElement extends IHTMLElement { - type: string; - src: string; - charset: string; - lang: string; - async: boolean; - defer: boolean; - text: string; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLScriptElement; -} diff --git a/packages/happy-dom/src/nodes/html-select-element/HTMLOptionsCollection.ts b/packages/happy-dom/src/nodes/html-select-element/HTMLOptionsCollection.ts index de78bf375..65495e4d5 100644 --- a/packages/happy-dom/src/nodes/html-select-element/HTMLOptionsCollection.ts +++ b/packages/happy-dom/src/nodes/html-select-element/HTMLOptionsCollection.ts @@ -1,8 +1,7 @@ import DOMException from '../../exception/DOMException.js'; import HTMLCollection from '../element/HTMLCollection.js'; -import IHTMLSelectElement from './IHTMLSelectElement.js'; -import IHTMLOptionElement from '../html-option-element/IHTMLOptionElement.js'; -import IHTMLOptionsCollection from './IHTMLOptionsCollection.js'; +import HTMLSelectElement from './HTMLSelectElement.js'; +import HTMLOptionElement from '../html-option-element/HTMLOptionElement.js'; /** * HTML Options Collection. @@ -10,17 +9,14 @@ import IHTMLOptionsCollection from './IHTMLOptionsCollection.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionsCollection. */ -export default class HTMLOptionsCollection - extends HTMLCollection - implements IHTMLOptionsCollection -{ - #selectElement: IHTMLSelectElement; +export default class HTMLOptionsCollection extends HTMLCollection { + #selectElement: HTMLSelectElement; /** * * @param selectElement */ - constructor(selectElement: IHTMLSelectElement) { + constructor(selectElement: HTMLSelectElement) { super(); this.#selectElement = selectElement; @@ -49,7 +45,7 @@ export default class HTMLOptionsCollection * * @param index Index. */ - public item(index: number): IHTMLOptionElement { + public item(index: number): HTMLOptionElement { return this[index]; } @@ -58,7 +54,7 @@ export default class HTMLOptionsCollection * @param element * @param before */ - public add(element: IHTMLOptionElement, before?: number | IHTMLOptionElement): void { + public add(element: HTMLOptionElement, before?: number | HTMLOptionElement): void { if (!before && before !== 0) { this.#selectElement.appendChild(element); return; @@ -91,7 +87,7 @@ export default class HTMLOptionsCollection */ public remove(index: number): void { if (this[index]) { - this.#selectElement.removeChild(this[index]); + this.#selectElement.removeChild(this[index]); } } } diff --git a/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElement.ts b/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElement.ts index 2cb995304..81721cba0 100644 --- a/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElement.ts +++ b/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElement.ts @@ -1,21 +1,16 @@ import HTMLElement from '../html-element/HTMLElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; +import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; import ValidityState from '../../validity-state/ValidityState.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; +import HTMLLabelElement from '../html-label-element/HTMLLabelElement.js'; import HTMLOptionElement from '../html-option-element/HTMLOptionElement.js'; import HTMLOptionsCollection from './HTMLOptionsCollection.js'; -import INodeList from '../node/INodeList.js'; -import IHTMLSelectElement from './IHTMLSelectElement.js'; +import NodeList from '../node/NodeList.js'; import Event from '../../event/Event.js'; -import IHTMLOptionElement from '../html-option-element/IHTMLOptionElement.js'; -import IHTMLOptionsCollection from './IHTMLOptionsCollection.js'; -import INode from '../node/INode.js'; +import Node from '../node/Node.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; -import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; import HTMLLabelElementUtility from '../html-label-element/HTMLLabelElementUtility.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLSelectElementNamedNodeMap from './HTMLSelectElementNamedNodeMap.js'; /** @@ -24,16 +19,16 @@ import HTMLSelectElementNamedNodeMap from './HTMLSelectElementNamedNodeMap.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement. */ -export default class HTMLSelectElement extends HTMLElement implements IHTMLSelectElement { +export default class HTMLSelectElement extends HTMLElement { // Internal properties. - public override [PropertySymbol.attributes]: INamedNodeMap = new HTMLSelectElementNamedNodeMap( + public override [PropertySymbol.attributes]: NamedNodeMap = new HTMLSelectElementNamedNodeMap( this ); public [PropertySymbol.validationMessage] = ''; public [PropertySymbol.validity] = new ValidityState(this); - public [PropertySymbol.selectNode]: INode = this; + public [PropertySymbol.selectNode]: Node = this; public [PropertySymbol.length] = 0; - public [PropertySymbol.options]: IHTMLOptionsCollection = new HTMLOptionsCollection(this); + public [PropertySymbol.options]: HTMLOptionsCollection = new HTMLOptionsCollection(this); // Events public onchange: (event: Event) => void | null = null; @@ -53,7 +48,7 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec * * @returns Options. */ - public get options(): IHTMLOptionsCollection { + public get options(): HTMLOptionsCollection { return this[PropertySymbol.options]; } @@ -261,7 +256,7 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec * * @returns Label elements. */ - public get labels(): INodeList { + public get labels(): NodeList { return HTMLLabelElementUtility.getAssociatedLabelElements(this); } @@ -270,8 +265,8 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec * * @returns Form. */ - public get form(): IHTMLFormElement { - return this[PropertySymbol.formNode]; + public get form(): HTMLFormElement { + return this[PropertySymbol.formNode]; } /** @@ -294,7 +289,7 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec * * @param index Index. */ - public item(index: number): IHTMLOptionElement { + public item(index: number): HTMLOptionElement { return this[PropertySymbol.options].item(index); } @@ -304,7 +299,7 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec * @param element HTMLOptionElement to add. * @param before HTMLOptionElement or index number. */ - public add(element: IHTMLOptionElement, before?: number | IHTMLOptionElement): void { + public add(element: HTMLOptionElement, before?: number | HTMLOptionElement): void { this[PropertySymbol.options].add(element, before); } @@ -361,7 +356,7 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec * @see https://html.spec.whatwg.org/multipage/form-elements.html#selectedness-setting-algorithm * @param [selectedOption] Selected option. */ - public [PropertySymbol.updateOptionItems](selectedOption?: IHTMLOptionElement): void { + public [PropertySymbol.updateOptionItems](selectedOption?: HTMLOptionElement): void { const optionElements = this.getElementsByTagName('option'); if (optionElements.length < this[PropertySymbol.options].length) { @@ -403,7 +398,7 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec const option = optionElements[i]; let disabled = option.hasAttributeNS(null, 'disabled'); - const parentNode = option[PropertySymbol.parentNode]; + const parentNode = option[PropertySymbol.parentNode]; if ( parentNode && parentNode[PropertySymbol.nodeType] === NodeTypeEnum.elementNode && @@ -429,7 +424,7 @@ export default class HTMLSelectElement extends HTMLElement implements IHTMLSelec /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const oldFormNode = this[PropertySymbol.formNode]; super[PropertySymbol.connectToNode](parentNode); diff --git a/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElementNamedNodeMap.ts index 667144978..8ba99d9cb 100644 --- a/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-select-element/HTMLSelectElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; @@ -15,7 +15,7 @@ export default class HTMLSelectElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -40,7 +40,7 @@ export default class HTMLSelectElementNamedNodeMap extends HTMLElementNamedNodeM /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-select-element/IHTMLOptionsCollection.ts b/packages/happy-dom/src/nodes/html-select-element/IHTMLOptionsCollection.ts deleted file mode 100644 index 1d1193a00..000000000 --- a/packages/happy-dom/src/nodes/html-select-element/IHTMLOptionsCollection.ts +++ /dev/null @@ -1,35 +0,0 @@ -import IHTMLCollection from '../element/IHTMLCollection.js'; -import IHTMLOptionElement from '../html-option-element/IHTMLOptionElement.js'; - -/** - * HTML Options Collection. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLOptionsCollection. - */ -export default interface IHTMLOptionsCollection extends IHTMLCollection { - selectedIndex: number; - length: number; - - /** - * Adds new option to collection. - * - * @param element HTMLOptionElement or HTMLOptGroupElement to add. - * @param before HTMLOptionElement or index number. - */ - add(element: IHTMLOptionElement, before?: number | IHTMLOptionElement): void; - - /** - * Returns option element by index. - * - * @param index Index. - */ - item(index: number): IHTMLOptionElement; - - /** - * Removes option element from the collection. - * - * @param index Index. - */ - remove(index: number): void; -} diff --git a/packages/happy-dom/src/nodes/html-select-element/IHTMLSelectElement.ts b/packages/happy-dom/src/nodes/html-select-element/IHTMLSelectElement.ts deleted file mode 100644 index fc133eb9d..000000000 --- a/packages/happy-dom/src/nodes/html-select-element/IHTMLSelectElement.ts +++ /dev/null @@ -1,83 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; -import INodeList from '../node/INodeList.js'; -import IHTMLOptionsCollection from './IHTMLOptionsCollection.js'; -import ValidityState from '../../validity-state/ValidityState.js'; -import Event from '../../event/Event.js'; -import IHTMLOptionElement from '../html-option-element/IHTMLOptionElement.js'; -import IHTMLOptGroupElement from '../html-opt-group-element/IHTMLOptGroupElement.js'; - -/** - * HTML Select Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLSelectElement. - */ -export default interface IHTMLSelectElement extends IHTMLElement { - readonly form: IHTMLFormElement; - readonly labels: INodeList; - readonly options: IHTMLOptionsCollection; - readonly type: string; - readonly validity: ValidityState; - readonly willValidate: boolean; - readonly validationMessage: string; - autofocus: boolean; - disabled: boolean; - length: number; - selectedIndex: number; - value: string; - name: string; - multiple: boolean; - required: boolean; - - // Events - onchange: (event: Event) => void | null; - oninput: (event: Event) => void | null; - - /** - * Adds new option to collection. - * - * @param element HTMLOptionElement or HTMLOptGroupElement to add. - * @param before HTMLOptionElement or index number. - */ - add( - element: IHTMLOptionElement | IHTMLOptGroupElement, - before?: number | IHTMLOptionElement | IHTMLOptGroupElement - ): void; - - /** - * Returns option element by index. - * - * @param index Index. - */ - item(index: number): IHTMLOptionElement | IHTMLOptGroupElement; - - /** - * Removes option element from the collection. - * - * @param index Index. - */ - remove(index?: number): void; - - /** - * Sets validation message. - * - * @param message Message. - */ - setCustomValidity(message: string): void; - - /** - * Checks validity. - * - * @returns "true" if the field is valid. - */ - checkValidity(): boolean; - - /** - * Reports validity. - * - * @returns "true" if the field is valid. - */ - reportValidity(): boolean; -} diff --git a/packages/happy-dom/src/nodes/html-slot-element/HTMLSlotElement.ts b/packages/happy-dom/src/nodes/html-slot-element/HTMLSlotElement.ts index 2baac06dc..70833640b 100644 --- a/packages/happy-dom/src/nodes/html-slot-element/HTMLSlotElement.ts +++ b/packages/happy-dom/src/nodes/html-slot-element/HTMLSlotElement.ts @@ -1,10 +1,9 @@ import HTMLElement from '../html-element/HTMLElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IShadowRoot from '../shadow-root/IShadowRoot.js'; -import IHTMLSlotElement from './IHTMLSlotElement.js'; -import IText from '../text/IText.js'; -import IElement from '../element/IElement.js'; -import INode from '../node/INode.js'; +import ShadowRoot from '../shadow-root/ShadowRoot.js'; +import Text from '../text/Text.js'; +import Element from '../element/Element.js'; +import Node from '../node/Node.js'; import Event from '../../event/Event.js'; /** @@ -13,7 +12,7 @@ import Event from '../../event/Event.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLSlotElement. */ -export default class HTMLSlotElement extends HTMLElement implements IHTMLSlotElement { +export default class HTMLSlotElement extends HTMLElement { // Events public onslotchange: (event: Event) => void | null = null; @@ -40,7 +39,7 @@ export default class HTMLSlotElement extends HTMLElement implements IHTMLSlotEle * * @param _nodes Nodes. */ - public assign(..._nodes: Array): void { + public assign(..._nodes: Array): void { // TODO: Do nothing for now. We need to find an example of how it is expected to work before it can be implemented. } @@ -51,8 +50,8 @@ export default class HTMLSlotElement extends HTMLElement implements IHTMLSlotEle * @param [options.flatten] A boolean value indicating whether to return the assigned nodes of any available child elements (true) or not (false). Defaults to false. * @returns Nodes. */ - public assignedNodes(options?: { flatten?: boolean }): INode[] { - const host = (this.getRootNode())?.host; + public assignedNodes(options?: { flatten?: boolean }): Node[] { + const host = (this.getRootNode())?.host; // TODO: Add support for options.flatten. We need to find an example of how it is expected to work before it can be implemented. @@ -76,8 +75,8 @@ export default class HTMLSlotElement extends HTMLElement implements IHTMLSlotEle * @param [_options.flatten] A boolean value indicating whether to return the assigned elements of any available child elements (true) or not (false). Defaults to false. * @returns Nodes. */ - public assignedElements(_options?: { flatten?: boolean }): IElement[] { - const host = (this.getRootNode())?.host; + public assignedElements(_options?: { flatten?: boolean }): Element[] { + const host = (this.getRootNode())?.host; // TODO: Add support for options.flatten. We need to find an example of how it expected to work before it can be implemented. @@ -109,7 +108,7 @@ export default class HTMLSlotElement extends HTMLElement implements IHTMLSlotEle * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLSlotElement { + public cloneNode(deep = false): HTMLSlotElement { return super.cloneNode(deep); } } diff --git a/packages/happy-dom/src/nodes/html-slot-element/IHTMLSlotElement.ts b/packages/happy-dom/src/nodes/html-slot-element/IHTMLSlotElement.ts deleted file mode 100644 index b053c1b1b..000000000 --- a/packages/happy-dom/src/nodes/html-slot-element/IHTMLSlotElement.ts +++ /dev/null @@ -1,51 +0,0 @@ -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IText from '../text/IText.js'; -import IElement from '../element/IElement.js'; -import INode from '../node/INode.js'; -import Event from '../../event/Event.js'; - -/** - * HTML Slot Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLSlotElement. - */ -export default interface IHTMLSlotElement extends IHTMLElement { - // Events - onslotchange: (event: Event) => void | null; - - name: string; - - /** - * Sets the slot's manually assigned nodes to an ordered set of slottables. - * - * @param nodes Nodes. - */ - assign(...nodes: Array): void; - - /** - * Returns assigned nodes. - * - * @param [options] Options. - * @param [options.flatten] A boolean value indicating whether to return the assigned nodes of any available child elements (true) or not (false). Defaults to false. - * @returns Nodes. - */ - assignedNodes(options?: { flatten?: boolean }): INode[]; - - /** - * Returns assigned nodes. - * - * @param [options.flatten] A boolean value indicating whether to return the assigned elements of any available child elements (true) or not (false). Defaults to false. - * @returns Nodes. - */ - assignedElements(options?: { flatten?: boolean }): IElement[]; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLSlotElement; -} diff --git a/packages/happy-dom/src/nodes/html-style-element/HTMLStyleElement.ts b/packages/happy-dom/src/nodes/html-style-element/HTMLStyleElement.ts index b16da2663..9bb370282 100644 --- a/packages/happy-dom/src/nodes/html-style-element/HTMLStyleElement.ts +++ b/packages/happy-dom/src/nodes/html-style-element/HTMLStyleElement.ts @@ -1,7 +1,6 @@ import CSSStyleSheet from '../../css/CSSStyleSheet.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLStyleElement from './IHTMLStyleElement.js'; /** * HTML Style Element. @@ -9,7 +8,7 @@ import IHTMLStyleElement from './IHTMLStyleElement.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLStyleElement. */ -export default class HTMLStyleElement extends HTMLElement implements IHTMLStyleElement { +export default class HTMLStyleElement extends HTMLElement { private [PropertySymbol.sheet]: CSSStyleSheet | null = null; /** diff --git a/packages/happy-dom/src/nodes/html-style-element/IHTMLStyleElement.ts b/packages/happy-dom/src/nodes/html-style-element/IHTMLStyleElement.ts deleted file mode 100644 index 8f351dacc..000000000 --- a/packages/happy-dom/src/nodes/html-style-element/IHTMLStyleElement.ts +++ /dev/null @@ -1,15 +0,0 @@ -import CSSStyleSheet from '../../css/CSSStyleSheet.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Style Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLStyleElement. - */ -export default interface IHTMLStyleElement extends IHTMLElement { - media: string; - type: string; - disabled: boolean; - readonly sheet: CSSStyleSheet; -} diff --git a/packages/happy-dom/src/nodes/html-template-element/HTMLTemplateElement.ts b/packages/happy-dom/src/nodes/html-template-element/HTMLTemplateElement.ts index 8ff4fa083..8fc0478e6 100644 --- a/packages/happy-dom/src/nodes/html-template-element/HTMLTemplateElement.ts +++ b/packages/happy-dom/src/nodes/html-template-element/HTMLTemplateElement.ts @@ -1,11 +1,9 @@ import HTMLElement from '../html-element/HTMLElement.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IDocumentFragment from '../document-fragment/IDocumentFragment.js'; -import INode from '../node/INode.js'; -import IHTMLTemplateElement from './IHTMLTemplateElement.js'; +import DocumentFragment from '../document-fragment/DocumentFragment.js'; +import Node from '../node/Node.js'; import XMLSerializer from '../../xml-serializer/XMLSerializer.js'; import XMLParser from '../../xml-parser/XMLParser.js'; -import DocumentFragment from '../document-fragment/DocumentFragment.js'; /** * HTML Template Element. @@ -13,9 +11,9 @@ import DocumentFragment from '../document-fragment/DocumentFragment.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement. */ -export default class HTMLTemplateElement extends HTMLElement implements IHTMLTemplateElement { +export default class HTMLTemplateElement extends HTMLElement { // Internal properties - public [PropertySymbol.content]: IDocumentFragment = + public [PropertySymbol.content]: DocumentFragment = this[PropertySymbol.ownerDocument].createDocumentFragment(); /** @@ -23,7 +21,7 @@ export default class HTMLTemplateElement extends HTMLElement implements IHTMLTem * * @returns Content. */ - public get content(): IDocumentFragment { + public get content(): DocumentFragment { return this[PropertySymbol.content]; } @@ -52,14 +50,14 @@ export default class HTMLTemplateElement extends HTMLElement implements IHTMLTem /** * @override */ - public get firstChild(): INode { + public get firstChild(): Node { return this[PropertySymbol.content].firstChild; } /** * @override */ - public get lastChild(): INode { + public get lastChild(): Node { return this[PropertySymbol.content].lastChild; } @@ -82,36 +80,36 @@ export default class HTMLTemplateElement extends HTMLElement implements IHTMLTem /** * @override */ - public appendChild(node: INode): INode { + public appendChild(node: Node): Node { return this[PropertySymbol.content].appendChild(node); } /** * @override */ - public removeChild(node: INode): INode { + public removeChild(node: Node): Node { return this[PropertySymbol.content].removeChild(node); } /** * @override */ - public insertBefore(newNode: INode, referenceNode: INode): INode { + public insertBefore(newNode: Node, referenceNode: Node): Node { return this[PropertySymbol.content].insertBefore(newNode, referenceNode); } /** * @override */ - public replaceChild(newChild: INode, oldChild: INode): INode { + public replaceChild(newChild: Node, oldChild: Node): Node { return this[PropertySymbol.content].replaceChild(newChild, oldChild); } /** * @override */ - public cloneNode(deep = false): IHTMLTemplateElement { - const clone = super.cloneNode(deep); + public cloneNode(deep = false): HTMLTemplateElement { + const clone = super.cloneNode(deep); clone[PropertySymbol.content] = this[PropertySymbol.content].cloneNode(deep); return clone; } diff --git a/packages/happy-dom/src/nodes/html-template-element/IHTMLTemplateElement.ts b/packages/happy-dom/src/nodes/html-template-element/IHTMLTemplateElement.ts deleted file mode 100644 index 2cbb37631..000000000 --- a/packages/happy-dom/src/nodes/html-template-element/IHTMLTemplateElement.ts +++ /dev/null @@ -1,21 +0,0 @@ -import IDocumentFragment from '../document-fragment/IDocumentFragment.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; - -/** - * HTML Template Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLTemplateElement. - */ -export default interface IHTMLTemplateElement extends IHTMLElement { - readonly content: IDocumentFragment; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLTemplateElement; -} diff --git a/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElement.ts b/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElement.ts index f81a80a84..f34adedad 100644 --- a/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElement.ts +++ b/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElement.ts @@ -4,16 +4,14 @@ import DOMException from '../../exception/DOMException.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; import HTMLElement from '../html-element/HTMLElement.js'; import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; import HTMLInputElementSelectionDirectionEnum from '../html-input-element/HTMLInputElementSelectionDirectionEnum.js'; import HTMLInputElementSelectionModeEnum from '../html-input-element/HTMLInputElementSelectionModeEnum.js'; -import INode from '../node/INode.js'; +import Node from '../node/Node.js'; import ValidityState from '../../validity-state/ValidityState.js'; -import IHTMLTextAreaElement from './IHTMLTextAreaElement.js'; -import INodeList from '../node/INodeList.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; +import NodeList from '../node/NodeList.js'; +import HTMLLabelElement from '../html-label-element/HTMLLabelElement.js'; import HTMLLabelElementUtility from '../html-label-element/HTMLLabelElementUtility.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import HTMLTextAreaElementNamedNodeMap from './HTMLTextAreaElementNamedNodeMap.js'; /** @@ -22,7 +20,7 @@ import HTMLTextAreaElementNamedNodeMap from './HTMLTextAreaElementNamedNodeMap.j * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLTextAreaElement. */ -export default class HTMLTextAreaElement extends HTMLElement implements IHTMLTextAreaElement { +export default class HTMLTextAreaElement extends HTMLElement { public readonly type = 'textarea'; // Events @@ -30,7 +28,7 @@ export default class HTMLTextAreaElement extends HTMLElement implements IHTMLTex public onselectionchange: (event: Event) => void | null = null; // Internal properties - public override [PropertySymbol.attributes]: INamedNodeMap = new HTMLTextAreaElementNamedNodeMap( + public override [PropertySymbol.attributes]: NamedNodeMap = new HTMLTextAreaElementNamedNodeMap( this ); public [PropertySymbol.validationMessage] = ''; @@ -415,8 +413,8 @@ export default class HTMLTextAreaElement extends HTMLElement implements IHTMLTex * * @returns Form. */ - public get form(): IHTMLFormElement { - return this[PropertySymbol.formNode]; + public get form(): HTMLFormElement { + return this[PropertySymbol.formNode]; } /** @@ -433,7 +431,7 @@ export default class HTMLTextAreaElement extends HTMLElement implements IHTMLTex * * @returns Label elements. */ - public get labels(): INodeList { + public get labels(): NodeList { return HTMLLabelElementUtility.getAssociatedLabelElements(this); } @@ -574,7 +572,7 @@ export default class HTMLTextAreaElement extends HTMLElement implements IHTMLTex * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IHTMLTextAreaElement { + public cloneNode(deep = false): HTMLTextAreaElement { const clone = super.cloneNode(deep); clone[PropertySymbol.value] = this[PropertySymbol.value]; @@ -599,7 +597,7 @@ export default class HTMLTextAreaElement extends HTMLElement implements IHTMLTex /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const oldFormNode = this[PropertySymbol.formNode]; super[PropertySymbol.connectToNode](parentNode); diff --git a/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.ts index b182f16d1..3bbfe257b 100644 --- a/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/html-text-area-element/HTMLTextAreaElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import HTMLElementNamedNodeMap from '../html-element/HTMLElementNamedNodeMap.js'; import HTMLFormElement from '../html-form-element/HTMLFormElement.js'; @@ -15,7 +15,7 @@ export default class HTMLTextAreaElementNamedNodeMap extends HTMLElementNamedNod /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -40,7 +40,7 @@ export default class HTMLTextAreaElementNamedNodeMap extends HTMLElementNamedNod /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/html-text-area-element/IHTMLTextAreaElement.ts b/packages/happy-dom/src/nodes/html-text-area-element/IHTMLTextAreaElement.ts deleted file mode 100644 index 7142e7fd2..000000000 --- a/packages/happy-dom/src/nodes/html-text-area-element/IHTMLTextAreaElement.ts +++ /dev/null @@ -1,102 +0,0 @@ -import Event from '../../event/Event.js'; -import ValidityState from '../../validity-state/ValidityState.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; -import IHTMLFormElement from '../html-form-element/IHTMLFormElement.js'; -import HTMLInputElementSelectionModeEnum from '../html-input-element/HTMLInputElementSelectionModeEnum.js'; -import IHTMLLabelElement from '../html-label-element/IHTMLLabelElement.js'; -import INodeList from '../node/INodeList.js'; - -/** - * HTML Text Area Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLTextAreaElement. - */ -export default interface IHTMLTextAreaElement extends IHTMLElement { - readonly type: string; - readonly form: IHTMLFormElement; - readonly validationMessage: string; - readonly labels: INodeList; - readonly validity: ValidityState; - defaultValue: string; - minLength: number; - maxLength: number; - name: string; - placeholder: string; - inputmode: string; - cols: string; - rows: string; - autocomplete: string; - readOnly: boolean; - disabled: boolean; - autofocus: boolean; - required: boolean; - value: string; - selectionStart: number; - selectionEnd: number; - selectionDirection: string; - textLength: number; - - // Events - oninput: (event: Event) => void | null; - onselectionchange: (event: Event) => void | null; - - /** - * Selects the text. - */ - select(): void; - - /** - * Set selection range. - * - * @param start Start. - * @param end End. - * @param [direction="none"] Direction. - */ - setSelectionRange(start: number, end: number, direction: string): void; - - /** - * Set range text. - * - * @param replacement Replacement. - * @param [start] Start. - * @param [end] End. - * @param [direction] Direction. - */ - setRangeText( - replacement: string, - start: number, - end: number, - selectionMode?: HTMLInputElementSelectionModeEnum - ): void; - - /** - * Checks validity. - * - * @returns "true" if the field is valid. - */ - checkValidity(): boolean; - - /** - * Reports validity. - * - * @returns "true" if the field is valid. - */ - reportValidity(): boolean; - - /** - * Sets validation message. - * - * @param message Message. - */ - setCustomValidity(message: string): void; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IHTMLTextAreaElement; -} diff --git a/packages/happy-dom/src/nodes/html-unknown-element/HTMLUnknownElement.ts b/packages/happy-dom/src/nodes/html-unknown-element/HTMLUnknownElement.ts index 0d46acebd..b314c241f 100644 --- a/packages/happy-dom/src/nodes/html-unknown-element/HTMLUnknownElement.ts +++ b/packages/happy-dom/src/nodes/html-unknown-element/HTMLUnknownElement.ts @@ -1,5 +1,4 @@ import HTMLElement from '../html-element/HTMLElement.js'; -import IHTMLElement from '../html-element/IHTMLElement.js'; /** * HTML Unknown Element. @@ -7,4 +6,4 @@ import IHTMLElement from '../html-element/IHTMLElement.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/HTMLUnknownElement. */ -export default class HTMLUnknownElement extends HTMLElement implements IHTMLElement {} +export default class HTMLUnknownElement extends HTMLElement {} diff --git a/packages/happy-dom/src/nodes/html-video-element/HTMLVideoElement.ts b/packages/happy-dom/src/nodes/html-video-element/HTMLVideoElement.ts index 983ea6062..dbbb3666d 100644 --- a/packages/happy-dom/src/nodes/html-video-element/HTMLVideoElement.ts +++ b/packages/happy-dom/src/nodes/html-video-element/HTMLVideoElement.ts @@ -1,5 +1,4 @@ import HTMLMediaElement from '../html-media-element/HTMLMediaElement.js'; -import IHTMLVideoElement from './IHTMLVideoElement.js'; /** * HTML Video Element. @@ -8,4 +7,4 @@ import IHTMLVideoElement from './IHTMLVideoElement.js'; * https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement. * */ -export default class HTMLVideoElement extends HTMLMediaElement implements IHTMLVideoElement {} +export default class HTMLVideoElement extends HTMLMediaElement {} diff --git a/packages/happy-dom/src/nodes/html-video-element/IHTMLVideoElement.ts b/packages/happy-dom/src/nodes/html-video-element/IHTMLVideoElement.ts deleted file mode 100644 index 15252d6c4..000000000 --- a/packages/happy-dom/src/nodes/html-video-element/IHTMLVideoElement.ts +++ /dev/null @@ -1,11 +0,0 @@ -import IHTMLMediaElement from '../html-media-element/IHTMLMediaElement.js'; - -/** - * HTML Video Element. - * - * Reference: - * https://developer.mozilla.org/en-US/docs/Web/API/HTMLVideoElement. - */ - -type IHTMLVideoElement = IHTMLMediaElement; -export default IHTMLVideoElement; diff --git a/packages/happy-dom/src/nodes/node/INode.ts b/packages/happy-dom/src/nodes/node/INode.ts deleted file mode 100644 index 38220a1fa..000000000 --- a/packages/happy-dom/src/nodes/node/INode.ts +++ /dev/null @@ -1,68 +0,0 @@ -import IEventTarget from '../../event/IEventTarget.js'; -import IDocument from '../document/IDocument.js'; -import IElement from '../element/IElement.js'; -import INodeList from './INodeList.js'; -import NodeTypeEnum from './NodeTypeEnum.js'; -import NodeDocumentPositionEnum from './NodeDocumentPositionEnum.js'; - -export default interface INode extends IEventTarget { - readonly ELEMENT_NODE: NodeTypeEnum; - readonly ATTRIBUTE_NODE: NodeTypeEnum; - readonly TEXT_NODE: NodeTypeEnum; - readonly CDATA_SECTION_NODE: NodeTypeEnum; - readonly COMMENT_NODE: NodeTypeEnum; - readonly DOCUMENT_NODE: NodeTypeEnum; - readonly DOCUMENT_TYPE_NODE: NodeTypeEnum; - readonly DOCUMENT_FRAGMENT_NODE: NodeTypeEnum; - readonly PROCESSING_INSTRUCTION_NODE: NodeTypeEnum; - readonly DOCUMENT_POSITION_DISCONNECTED: NodeDocumentPositionEnum; - readonly DOCUMENT_POSITION_PRECEDING: NodeDocumentPositionEnum; - readonly DOCUMENT_POSITION_FOLLOWING: NodeDocumentPositionEnum; - readonly DOCUMENT_POSITION_CONTAINS: NodeDocumentPositionEnum; - readonly DOCUMENT_POSITION_CONTAINED_BY: NodeDocumentPositionEnum; - readonly DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: NodeDocumentPositionEnum; - readonly ownerDocument: IDocument; - readonly parentNode: INode | null; - readonly parentElement: IElement | null; - readonly nodeType: number; - readonly childNodes: INodeList; - readonly isConnected: boolean; - readonly nodeName: string; - readonly previousSibling: INode; - readonly nextSibling: INode; - readonly firstChild: INode; - readonly lastChild: INode; - readonly baseURI: string; - nodeValue: string; - textContent: string; - connectedCallback?(): void; - disconnectedCallback?(): void; - getRootNode(options?: { composed: boolean }): INode; - cloneNode(deep?: boolean): INode; - appendChild(node: INode): INode; - removeChild(node: INode): INode; - hasChildNodes(): boolean; - contains(otherNode: INode | null): boolean; - insertBefore(newNode: INode, referenceNode?: INode | null): INode; - replaceChild(newChild: INode, oldChild: INode): INode; - toString(): string; - compareDocumentPosition(otherNode: INode): number; - normalize(): void; - - /** - * Determines whether the given node is equal to the current node. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/Node/isSameNode - * @param node Node to check. - * @returns True if the given node is equal to the current node, otherwise false. - */ - isSameNode(node: INode): boolean; - - /** - * Compares two nodes. - * - * @param node Node to compare. - * @returns "true" if nodes are equal. - */ - isEqualNode(node: INode): boolean; -} diff --git a/packages/happy-dom/src/nodes/node/INodeList.ts b/packages/happy-dom/src/nodes/node/INodeList.ts deleted file mode 100644 index f5d43acc4..000000000 --- a/packages/happy-dom/src/nodes/node/INodeList.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * NodeList. - */ -export default interface INodeList extends Array { - /** - * Returns item by index. - * - * @param index Index. - */ - item(index: number): T; -} diff --git a/packages/happy-dom/src/nodes/node/Node.ts b/packages/happy-dom/src/nodes/node/Node.ts index 4a74db04f..68c9eb2f4 100644 --- a/packages/happy-dom/src/nodes/node/Node.ts +++ b/packages/happy-dom/src/nodes/node/Node.ts @@ -1,23 +1,21 @@ import EventTarget from '../../event/EventTarget.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import MutationListener from '../../mutation-observer/MutationListener.js'; -import INode from './INode.js'; -import IDocument from '../document/IDocument.js'; -import IElement from '../element/IElement.js'; +import Document from '../document/Document.js'; +import Element from '../element/Element.js'; import NodeTypeEnum from './NodeTypeEnum.js'; import NodeDocumentPositionEnum from './NodeDocumentPositionEnum.js'; import NodeUtility from './NodeUtility.js'; -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import NodeList from './NodeList.js'; -import INodeList from './INodeList.js'; import NodeFactory from '../NodeFactory.js'; /** * Node. */ -export default class Node extends EventTarget implements INode { +export default class Node extends EventTarget { // This is used when overriding a Node class and set it in a owner document context (used in BrowserWindow.constructor()). - public static [PropertySymbol.ownerDocument]: IDocument | null; + public static [PropertySymbol.ownerDocument]: Document | null; // Public properties public static readonly ELEMENT_NODE = NodeTypeEnum.elementNode; @@ -56,15 +54,15 @@ export default class Node extends EventTarget implements INode { // Internal properties public [PropertySymbol.isConnected] = false; - public [PropertySymbol.ownerDocument]: IDocument; - public [PropertySymbol.parentNode]: INode | null = null; + public [PropertySymbol.ownerDocument]: Document; + public [PropertySymbol.parentNode]: Node | null = null; public [PropertySymbol.nodeType]: NodeTypeEnum; - public [PropertySymbol.rootNode]: INode = null; - public [PropertySymbol.formNode]: INode = null; - public [PropertySymbol.selectNode]: INode = null; - public [PropertySymbol.textAreaNode]: INode = null; + public [PropertySymbol.rootNode]: Node = null; + public [PropertySymbol.formNode]: Node = null; + public [PropertySymbol.selectNode]: Node = null; + public [PropertySymbol.textAreaNode]: Node = null; public [PropertySymbol.observers]: MutationListener[] = []; - public [PropertySymbol.childNodes]: INodeList = new NodeList(); + public [PropertySymbol.childNodes]: NodeList = new NodeList(); /** * Constructor. @@ -109,7 +107,7 @@ export default class Node extends EventTarget implements INode { * * @returns Owner document. */ - public get ownerDocument(): IDocument { + public get ownerDocument(): Document { return this[PropertySymbol.ownerDocument]; } @@ -118,7 +116,7 @@ export default class Node extends EventTarget implements INode { * * @returns Parent node. */ - public get parentNode(): INode | null { + public get parentNode(): Node | null { return this[PropertySymbol.parentNode]; } @@ -136,7 +134,7 @@ export default class Node extends EventTarget implements INode { * * @returns Child nodes list. */ - public get childNodes(): INodeList { + public get childNodes(): NodeList { return this[PropertySymbol.childNodes]; } @@ -190,7 +188,7 @@ export default class Node extends EventTarget implements INode { * * @returns Node. */ - public get previousSibling(): INode { + public get previousSibling(): Node { if (this[PropertySymbol.parentNode]) { const index = (this[PropertySymbol.parentNode])[PropertySymbol.childNodes].indexOf( this @@ -207,7 +205,7 @@ export default class Node extends EventTarget implements INode { * * @returns Node. */ - public get nextSibling(): INode { + public get nextSibling(): Node { if (this[PropertySymbol.parentNode]) { const index = (this[PropertySymbol.parentNode])[PropertySymbol.childNodes].indexOf( this @@ -227,7 +225,7 @@ export default class Node extends EventTarget implements INode { * * @returns Node. */ - public get firstChild(): INode { + public get firstChild(): Node { if (this[PropertySymbol.childNodes].length > 0) { return this[PropertySymbol.childNodes][0]; } @@ -239,7 +237,7 @@ export default class Node extends EventTarget implements INode { * * @returns Node. */ - public get lastChild(): INode { + public get lastChild(): Node { if (this[PropertySymbol.childNodes].length > 0) { return this[PropertySymbol.childNodes][this[PropertySymbol.childNodes].length - 1]; } @@ -251,12 +249,12 @@ export default class Node extends EventTarget implements INode { * * @returns Element. */ - public get parentElement(): IElement | null { + public get parentElement(): Element | null { let parent = this[PropertySymbol.parentNode]; while (parent && parent[PropertySymbol.nodeType] !== NodeTypeEnum.elementNode) { parent = parent[PropertySymbol.parentNode]; } - return parent; + return parent; } /** @@ -297,7 +295,7 @@ export default class Node extends EventTarget implements INode { * @param otherNode Node to test with. * @returns "true" if this node contains the other node. */ - public contains(otherNode: INode): boolean { + public contains(otherNode: Node): boolean { if (otherNode === undefined) { return false; } @@ -311,7 +309,7 @@ export default class Node extends EventTarget implements INode { * @param options.composed A Boolean that indicates whether the shadow root should be returned (false, the default), or a root node beyond shadow root (true). * @returns Node. */ - public getRootNode(options?: { composed: boolean }): INode { + public getRootNode(options?: { composed: boolean }): Node { if (!this[PropertySymbol.isConnected]) { return this; } @@ -329,7 +327,7 @@ export default class Node extends EventTarget implements INode { * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): INode { + public cloneNode(deep = false): Node { const clone = NodeFactory.createNode( this[PropertySymbol.ownerDocument], this.constructor @@ -359,7 +357,7 @@ export default class Node extends EventTarget implements INode { * @param node Node to append. * @returns Appended node. */ - public appendChild(node: INode): INode { + public appendChild(node: Node): Node { return NodeUtility.appendChild(this, node); } @@ -369,7 +367,7 @@ export default class Node extends EventTarget implements INode { * @param node Node to remove. * @returns Removed node. */ - public removeChild(node: INode): INode { + public removeChild(node: Node): Node { return NodeUtility.removeChild(this, node); } @@ -380,7 +378,7 @@ export default class Node extends EventTarget implements INode { * @param referenceNode Node to insert before. * @returns Inserted node. */ - public insertBefore(newNode: INode, referenceNode: INode | null): INode { + public insertBefore(newNode: Node, referenceNode: Node | null): Node { if (arguments.length < 2) { throw new TypeError( `Failed to execute 'insertBefore' on 'Node': 2 arguments required, but only ${arguments.length} present.` @@ -396,7 +394,7 @@ export default class Node extends EventTarget implements INode { * @param oldChild Old child. * @returns Replaced node. */ - public replaceChild(newChild: INode, oldChild: INode): INode { + public replaceChild(newChild: Node, oldChild: Node): Node { this.insertBefore(newChild, oldChild); this.removeChild(oldChild); @@ -410,7 +408,7 @@ export default class Node extends EventTarget implements INode { * @param node Node to compare. * @returns boolean - `true` if two nodes are equal. */ - public isEqualNode(node: INode): boolean { + public isEqualNode(node: Node): boolean { return NodeUtility.isEqualNode(this, node); } @@ -461,7 +459,7 @@ export default class Node extends EventTarget implements INode { * * @param parentNode Parent node. */ - public [PropertySymbol.connectToNode](parentNode: INode = null): void { + public [PropertySymbol.connectToNode](parentNode: Node = null): void { const isConnected = !!parentNode && parentNode[PropertySymbol.isConnected]; const formNode = (this)[PropertySymbol.formNode]; const selectNode = (this)[PropertySymbol.selectNode]; @@ -495,7 +493,7 @@ export default class Node extends EventTarget implements INode { this[PropertySymbol.isConnected] = isConnected; if (!isConnected) { - if (this[PropertySymbol.ownerDocument][PropertySymbol.activeElement] === this) { + if (this[PropertySymbol.ownerDocument][PropertySymbol.activeElement] === this) { this[PropertySymbol.ownerDocument][PropertySymbol.activeElement] = null; } } @@ -532,7 +530,7 @@ export default class Node extends EventTarget implements INode { * @see https://dom.spec.whatwg.org/#dom-node-comparedocumentposition * @param otherNode Other node. */ - public compareDocumentPosition(otherNode: INode): number { + public compareDocumentPosition(otherNode: Node): number { /** * 1. If this is other, then return zero. */ @@ -543,8 +541,8 @@ export default class Node extends EventTarget implements INode { /** * 2. Let node1 be other and node2 be this. */ - let node1: INode = otherNode; - let node2: INode = this; + let node1: Node = otherNode; + let node2: Node = this; /** * 3. Let attr1 and attr2 be null. @@ -557,7 +555,7 @@ export default class Node extends EventTarget implements INode { */ if (node1[PropertySymbol.nodeType] === NodeTypeEnum.attributeNode) { attr1 = node1; - node1 = (attr1)[PropertySymbol.ownerElement]; + node1 = (attr1)[PropertySymbol.ownerElement]; } /** @@ -566,7 +564,7 @@ export default class Node extends EventTarget implements INode { */ if (node2[PropertySymbol.nodeType] === NodeTypeEnum.attributeNode) { attr2 = node2; - node2 = (attr2)[PropertySymbol.ownerElement]; + node2 = (attr2)[PropertySymbol.ownerElement]; /** * 5.2. If attr1 and node1 are non-null, and node2 is node1, then: @@ -575,11 +573,11 @@ export default class Node extends EventTarget implements INode { /** * 5.2.1. For each attr in node2’s attribute list: */ - for (const attr of Object.values((node2)[PropertySymbol.attributes])) { + for (const attr of Object.values((node2)[PropertySymbol.attributes])) { /** * 5.2.1.1. If attr equals attr1, then return the result of adding DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC and DOCUMENT_POSITION_PRECEDING. */ - if (NodeUtility.isEqualNode(attr, attr1)) { + if (NodeUtility.isEqualNode(attr, attr1)) { return ( Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | Node.DOCUMENT_POSITION_PRECEDING ); @@ -588,7 +586,7 @@ export default class Node extends EventTarget implements INode { /** * 5.2.1.2. If attr equals attr2, then return the result of adding DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC and DOCUMENT_POSITION_FOLLOWING. */ - if (NodeUtility.isEqualNode(attr, attr2)) { + if (NodeUtility.isEqualNode(attr, attr2)) { return ( Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC | Node.DOCUMENT_POSITION_FOLLOWING ); @@ -597,8 +595,8 @@ export default class Node extends EventTarget implements INode { } } - const node2Ancestors: INode[] = []; - let node2Ancestor: INode = node2; + const node2Ancestors: Node[] = []; + let node2Ancestor: Node = node2; while (node2Ancestor) { /** @@ -612,8 +610,8 @@ export default class Node extends EventTarget implements INode { node2Ancestor = node2Ancestor[PropertySymbol.parentNode]; } - const node1Ancestors: INode[] = []; - let node1Ancestor: INode = node1; + const node1Ancestors: Node[] = []; + let node1Ancestor: Node = node1; while (node1Ancestor) { /** @@ -627,7 +625,7 @@ export default class Node extends EventTarget implements INode { node1Ancestor = node1Ancestor[PropertySymbol.parentNode]; } - const reverseArrayIndex = (array: INode[], reverseIndex: number): INode => { + const reverseArrayIndex = (array: Node[], reverseIndex: number): Node => { return array[array.length - 1 - reverseIndex]; }; @@ -670,7 +668,7 @@ export default class Node extends EventTarget implements INode { const node2Node = reverseArrayIndex(node2Ancestors, commonAncestorIndex + 1); const node1Node = reverseArrayIndex(node1Ancestors, commonAncestorIndex + 1); - const computeNodeIndexes = (nodes: INode[]): void => { + const computeNodeIndexes = (nodes: Node[]): void => { for (const childNode of nodes) { computeNodeIndexes((childNode)[PropertySymbol.childNodes]); @@ -736,7 +734,7 @@ export default class Node extends EventTarget implements INode { * @param node Node to check. * @returns True if the given node is equal to the current node, otherwise false. */ - public isSameNode(node: INode): boolean { + public isSameNode(node: Node): boolean { return this === node; } } diff --git a/packages/happy-dom/src/nodes/node/NodeList.ts b/packages/happy-dom/src/nodes/node/NodeList.ts index 94f354b26..e5b6095fd 100644 --- a/packages/happy-dom/src/nodes/node/NodeList.ts +++ b/packages/happy-dom/src/nodes/node/NodeList.ts @@ -1,9 +1,7 @@ -import INodeList from './INodeList.js'; - /** * Class list. */ -export default class NodeList extends Array implements INodeList { +export default class NodeList extends Array { /** * Returns `Symbol.toStringTag`. * diff --git a/packages/happy-dom/src/nodes/node/NodeUtility.ts b/packages/happy-dom/src/nodes/node/NodeUtility.ts index 3ec32cef6..1382f6892 100644 --- a/packages/happy-dom/src/nodes/node/NodeUtility.ts +++ b/packages/happy-dom/src/nodes/node/NodeUtility.ts @@ -1,16 +1,15 @@ -import IText from '../text/IText.js'; +import Text from '../text/Text.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IComment from '../comment/IComment.js'; -import INode from './INode.js'; +import Comment from '../comment/Comment.js'; +import Node from './Node.js'; import NodeTypeEnum from './NodeTypeEnum.js'; -import IElement from '../element/IElement.js'; -import IDocumentType from '../document-type/IDocumentType.js'; -import IAttr from '../attr/IAttr.js'; -import IProcessingInstruction from '../processing-instruction/IProcessingInstruction.js'; -import IShadowRoot from '../shadow-root/IShadowRoot.js'; +import Element from '../element/Element.js'; +import DocumentType from '../document-type/DocumentType.js'; +import Attr from '../attr/Attr.js'; +import ProcessingInstruction from '../processing-instruction/ProcessingInstruction.js'; +import ShadowRoot from '../shadow-root/ShadowRoot.js'; import DOMException from '../../exception/DOMException.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; -import Node from './Node.js'; import MutationRecord from '../../mutation-observer/MutationRecord.js'; import MutationTypeEnum from '../../mutation-observer/MutationTypeEnum.js'; @@ -28,10 +27,10 @@ export default class NodeUtility { * @returns Appended node. */ public static appendChild( - ancestorNode: INode, - node: INode, + ancestorNode: Node, + node: Node, options?: { disableAncestorValidation?: boolean } - ): INode { + ): Node { if (node === ancestorNode) { throw new DOMException( "Failed to execute 'appendChild' on 'Node': Not possible to append a node as a child of itself." @@ -100,7 +99,7 @@ export default class NodeUtility { * @param node Node to remove. * @returns Removed node. */ - public static removeChild(ancestorNode: INode, node: INode): INode { + public static removeChild(ancestorNode: Node, node: Node): Node { const index = (ancestorNode)[PropertySymbol.childNodes].indexOf(node); if (index === -1) { @@ -147,11 +146,11 @@ export default class NodeUtility { * @returns Inserted node. */ public static insertBefore( - ancestorNode: INode, - newNode: INode, - referenceNode: INode | null, + ancestorNode: Node, + newNode: Node, + referenceNode: Node | null, options?: { disableAncestorValidation?: boolean } - ): INode { + ): Node { if ( !options?.disableAncestorValidation && this.isInclusiveAncestor(newNode, ancestorNode, true) @@ -232,7 +231,7 @@ export default class NodeUtility { * @param node The node to be tested. * @returns "true" if the node is a text node. */ - public static isTextNode(node: INode | null): node is IText { + public static isTextNode(node: Node | null): node is Text { return node?.[PropertySymbol.nodeType] === NodeTypeEnum.textNode; } @@ -249,8 +248,8 @@ export default class NodeUtility { * @returns "true" if inclusive ancestor. */ public static isInclusiveAncestor( - ancestorNode: INode | null, - referenceNode: INode | null, + ancestorNode: Node | null, + referenceNode: Node | null, includeShadowRoots = false ): boolean { if (ancestorNode === null || referenceNode === null) { @@ -280,7 +279,7 @@ export default class NodeUtility { return true; } - let parent: INode = referenceNode[PropertySymbol.parentNode]; + let parent: Node = referenceNode[PropertySymbol.parentNode]; while (parent) { if (ancestorNode === parent) { @@ -289,8 +288,8 @@ export default class NodeUtility { parent = parent[PropertySymbol.parentNode] ? parent[PropertySymbol.parentNode] - : includeShadowRoots && (parent).host - ? (parent).host + : includeShadowRoots && (parent).host + ? (parent).host : null; } @@ -308,12 +307,12 @@ export default class NodeUtility { * @param nodeB Node B. * @returns "true" if following. */ - public static isFollowing(nodeA: INode, nodeB: INode): boolean { + public static isFollowing(nodeA: Node, nodeB: Node): boolean { if (nodeA === nodeB) { return false; } - let current: INode = nodeB; + let current: Node = nodeB; while (current) { current = this.following(current); @@ -336,7 +335,7 @@ export default class NodeUtility { * @param node Node. * @returns Node length. */ - public static getNodeLength(node: INode): number { + public static getNodeLength(node: Node): number { switch (node[PropertySymbol.nodeType]) { case NodeTypeEnum.documentTypeNode: return 0; @@ -344,7 +343,7 @@ export default class NodeUtility { case NodeTypeEnum.textNode: case NodeTypeEnum.processingInstructionNode: case NodeTypeEnum.commentNode: - return (node).data.length; + return (node).data.length; default: return (node)[PropertySymbol.childNodes].length; @@ -361,7 +360,7 @@ export default class NodeUtility { * @param [root] Root. * @returns Following node. */ - public static following(node: INode, root?: INode): INode { + public static following(node: Node, root?: Node): Node { const firstChild = node.firstChild; if (firstChild) { @@ -393,7 +392,7 @@ export default class NodeUtility { * @param node Node. * @returns Next descendant node. */ - public static nextDescendantNode(node: INode): INode { + public static nextDescendantNode(node: Node): Node { while (node && !node.nextSibling) { node = node[PropertySymbol.parentNode]; } @@ -411,7 +410,7 @@ export default class NodeUtility { * @param elementA * @param elementB */ - public static attributeListsEqual(elementA: IElement, elementB: IElement): boolean { + public static attributeListsEqual(elementA: Element, elementB: Element): boolean { for (let i = 0, max = elementA[PropertySymbol.attributes].length; i < max; i++) { const attributeA = elementA[PropertySymbol.attributes][i]; const attributeB = elementB[PropertySymbol.attributes].getNamedItemNS( @@ -432,15 +431,15 @@ export default class NodeUtility { * @param nodeA Node A. * @param nodeB Node B. */ - public static isEqualNode(nodeA: INode, nodeB: INode): boolean { + public static isEqualNode(nodeA: Node, nodeB: Node): boolean { if (nodeA[PropertySymbol.nodeType] !== nodeB[PropertySymbol.nodeType]) { return false; } switch (nodeA[PropertySymbol.nodeType]) { case NodeTypeEnum.documentTypeNode: - const documentTypeA = nodeA; - const documentTypeB = nodeB; + const documentTypeA = nodeA; + const documentTypeB = nodeB; if ( documentTypeA.name !== documentTypeB.name || @@ -451,8 +450,8 @@ export default class NodeUtility { } break; case NodeTypeEnum.elementNode: - const elementA = nodeA; - const elementB = nodeB; + const elementA = nodeA; + const elementB = nodeB; if ( elementA[PropertySymbol.namespaceURI] !== elementB[PropertySymbol.namespaceURI] || @@ -464,8 +463,8 @@ export default class NodeUtility { } break; case NodeTypeEnum.attributeNode: - const attributeA = nodeA; - const attributeB = nodeB; + const attributeA = nodeA; + const attributeB = nodeB; if ( attributeA[PropertySymbol.namespaceURI] !== attributeB[PropertySymbol.namespaceURI] || @@ -476,8 +475,8 @@ export default class NodeUtility { } break; case NodeTypeEnum.processingInstructionNode: - const processingInstructionA = nodeA; - const processingInstructionB = nodeB; + const processingInstructionA = nodeA; + const processingInstructionB = nodeB; if ( processingInstructionA.target !== processingInstructionB.target || @@ -488,7 +487,7 @@ export default class NodeUtility { break; case NodeTypeEnum.textNode: case NodeTypeEnum.commentNode: - type TextOrComment = IText | IComment; + type TextOrComment = Text | Comment; const textOrCommentA = nodeA; const textOrCommentB = nodeB; @@ -500,7 +499,7 @@ export default class NodeUtility { if ( nodeA[PropertySymbol.nodeType] === NodeTypeEnum.elementNode && - !NodeUtility.attributeListsEqual(nodeA, nodeB) + !NodeUtility.attributeListsEqual(nodeA, nodeB) ) { return false; } diff --git a/packages/happy-dom/src/nodes/parent-node/IParentNode.ts b/packages/happy-dom/src/nodes/parent-node/IParentNode.ts index a558143b6..1aa2af346 100644 --- a/packages/happy-dom/src/nodes/parent-node/IParentNode.ts +++ b/packages/happy-dom/src/nodes/parent-node/IParentNode.ts @@ -1,29 +1,29 @@ -import IHTMLCollection from '../element/IHTMLCollection.js'; -import IElement from '../element/IElement.js'; -import INode from '../node/INode.js'; -import INodeList from '../node/INodeList.js'; +import HTMLCollection from '../element/HTMLCollection.js'; +import Element from '../element/Element.js'; +import Node from '../node/Node.js'; +import NodeList from '../node/NodeList.js'; import IHTMLElementTagNameMap from '../../config/IHTMLElementTagNameMap.js'; import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.js'; -export default interface IParentNode extends INode { +export default interface IParentNode extends Node { readonly childElementCount: number; - readonly firstElementChild: IElement; - readonly lastElementChild: IElement; - readonly children: IHTMLCollection; + readonly firstElementChild: Element; + readonly lastElementChild: Element; + readonly children: HTMLCollection; /** * Inserts a set of Node objects or DOMString objects after the last child of the ParentNode. DOMString objects are inserted as equivalent Text nodes. * * @param nodes List of Node or DOMString. */ - append(...nodes: (INode | string)[]): void; + append(...nodes: (Node | string)[]): void; /** * Inserts a set of Node objects or DOMString objects before the first child of the ParentNode. DOMString objects are inserted as equivalent Text nodes. * * @param nodes List of Node or DOMString. */ - prepend(...nodes: (INode | string)[]): void; + prepend(...nodes: (Node | string)[]): void; /** * Query CSS Selector to find matching node. @@ -37,7 +37,7 @@ export default interface IParentNode extends INode { querySelector( selector: K ): ISVGElementTagNameMap[K] | null; - querySelector(selector: string): IElement | null; + querySelector(selector: string): Element | null; /** * Query CSS selector to find matching nodes. @@ -47,11 +47,11 @@ export default interface IParentNode extends INode { */ querySelectorAll( selector: K - ): INodeList; + ): NodeList; querySelectorAll( selector: K - ): INodeList; - querySelectorAll(selector: string): INodeList; + ): NodeList; + querySelectorAll(selector: string): NodeList; /** * Query CSS selector to find matching nodes. @@ -59,7 +59,7 @@ export default interface IParentNode extends INode { * @param selector CSS selector. * @returns Matching elements. */ - querySelectorAll(selector: string): INodeList; + querySelectorAll(selector: string): NodeList; /** * Returns an elements by class name. @@ -67,7 +67,7 @@ export default interface IParentNode extends INode { * @param className Tag name. * @returns Matching element. */ - getElementsByClassName(className: string): IHTMLCollection; + getElementsByClassName(className: string): HTMLCollection; /** * Returns an elements by tag name. @@ -77,11 +77,11 @@ export default interface IParentNode extends INode { */ getElementsByTagName( tagName: K - ): IHTMLCollection; + ): HTMLCollection; getElementsByTagName( tagName: K - ): IHTMLCollection; - getElementsByTagName(tagName: string): IHTMLCollection; + ): HTMLCollection; + getElementsByTagName(tagName: string): HTMLCollection; /** * Returns an elements by tag name and namespace. @@ -93,17 +93,17 @@ export default interface IParentNode extends INode { getElementsByTagNameNS( namespaceURI: 'http://www.w3.org/1999/xhtml', tagName: K - ): IHTMLCollection; + ): HTMLCollection; getElementsByTagNameNS( namespaceURI: 'http://www.w3.org/2000/svg', tagName: K - ): IHTMLCollection; - getElementsByTagNameNS(namespaceURI: string, tagName: string): IHTMLCollection; + ): HTMLCollection; + getElementsByTagNameNS(namespaceURI: string, tagName: string): HTMLCollection; /** * Replaces the existing children of a node with a specified new set of children. * * @param nodes List of Node or DOMString. */ - replaceChildren(...nodes: (INode | string)[]): void; + replaceChildren(...nodes: (Node | string)[]): void; } diff --git a/packages/happy-dom/src/nodes/parent-node/ParentNodeUtility.ts b/packages/happy-dom/src/nodes/parent-node/ParentNodeUtility.ts index d9006cc6b..44b837da8 100644 --- a/packages/happy-dom/src/nodes/parent-node/ParentNodeUtility.ts +++ b/packages/happy-dom/src/nodes/parent-node/ParentNodeUtility.ts @@ -1,12 +1,10 @@ import XMLParser from '../../xml-parser/XMLParser.js'; import * as PropertySymbol from '../../PropertySymbol.js'; -import IDocumentFragment from '../document-fragment/IDocumentFragment.js'; -import IDocument from '../document/IDocument.js'; -import IElement from '../element/IElement.js'; -import IHTMLCollection from '../element/IHTMLCollection.js'; -import INode from '../node/INode.js'; -import HTMLCollection from '../element/HTMLCollection.js'; import DocumentFragment from '../document-fragment/DocumentFragment.js'; +import Document from '../document/Document.js'; +import Element from '../element/Element.js'; +import HTMLCollection from '../element/HTMLCollection.js'; +import Node from '../node/Node.js'; import NamespaceURI from '../../config/NamespaceURI.js'; /** @@ -20,12 +18,12 @@ export default class ParentNodeUtility { * @param nodes List of Node or DOMString. */ public static append( - parentNode: IElement | IDocument | IDocumentFragment, - ...nodes: (INode | string)[] + parentNode: Element | Document | DocumentFragment, + ...nodes: (Node | string)[] ): void { for (const node of nodes) { if (typeof node === 'string') { - XMLParser.parse(parentNode[PropertySymbol.ownerDocument], node, { + XMLParser.parse(parentNode[PropertySymbol.ownerDocument], node, { rootNode: parentNode }); } else { @@ -41,14 +39,14 @@ export default class ParentNodeUtility { * @param nodes List of Node or DOMString. */ public static prepend( - parentNode: IElement | IDocument | IDocumentFragment, - ...nodes: (string | INode)[] + parentNode: Element | Document | DocumentFragment, + ...nodes: (string | Node)[] ): void { const firstChild = parentNode.firstChild; for (const node of nodes) { if (typeof node === 'string') { const newChildNodes = (( - XMLParser.parse(parentNode[PropertySymbol.ownerDocument], node) + XMLParser.parse(parentNode[PropertySymbol.ownerDocument], node) ))[PropertySymbol.childNodes].slice(); for (const newChildNode of newChildNodes) { parentNode.insertBefore(newChildNode, firstChild); @@ -66,8 +64,8 @@ export default class ParentNodeUtility { * @param nodes List of Node or DOMString. */ public static replaceChildren( - parentNode: IElement | IDocument | IDocumentFragment, - ...nodes: (string | INode)[] + parentNode: Element | Document | DocumentFragment, + ...nodes: (string | Node)[] ): void { for (const node of (parentNode)[PropertySymbol.childNodes].slice()) { parentNode.removeChild(node); @@ -84,17 +82,17 @@ export default class ParentNodeUtility { * @returns Matching element. */ public static getElementsByClassName( - parentNode: IElement | IDocumentFragment | IDocument, + parentNode: Element | DocumentFragment | Document, className: string - ): IHTMLCollection { - let matches = new HTMLCollection(); + ): HTMLCollection { + let matches = new HTMLCollection(); for (const child of (parentNode)[PropertySymbol.children]) { if (child.className.split(' ').includes(className)) { matches.push(child); } - matches = >( - matches.concat(this.getElementsByClassName(child, className)) + matches = >( + matches.concat(this.getElementsByClassName(child, className)) ); } @@ -109,19 +107,19 @@ export default class ParentNodeUtility { * @returns Matching element. */ public static getElementsByTagName( - parentNode: IElement | IDocumentFragment | IDocument, + parentNode: Element | DocumentFragment | Document, tagName: string - ): IHTMLCollection { + ): HTMLCollection { const upperTagName = tagName.toUpperCase(); const includeAll = tagName === '*'; - let matches = new HTMLCollection(); + let matches = new HTMLCollection(); for (const child of (parentNode)[PropertySymbol.children]) { if (includeAll || child[PropertySymbol.tagName].toUpperCase() === upperTagName) { matches.push(child); } - matches = >( - matches.concat(this.getElementsByTagName(child, tagName)) + matches = >( + matches.concat(this.getElementsByTagName(child, tagName)) ); } @@ -137,14 +135,14 @@ export default class ParentNodeUtility { * @returns Matching element. */ public static getElementsByTagNameNS( - parentNode: IElement | IDocumentFragment | IDocument, + parentNode: Element | DocumentFragment | Document, namespaceURI: string, tagName: string - ): IHTMLCollection { + ): HTMLCollection { // When the namespace is HTML, the tag name is case-insensitive. const formattedTagName = namespaceURI === NamespaceURI.html ? tagName.toUpperCase() : tagName; const includeAll = tagName === '*'; - let matches = new HTMLCollection(); + let matches = new HTMLCollection(); for (const child of (parentNode)[PropertySymbol.children]) { if ( @@ -153,8 +151,8 @@ export default class ParentNodeUtility { ) { matches.push(child); } - matches = >( - matches.concat(this.getElementsByTagNameNS(child, namespaceURI, tagName)) + matches = >( + matches.concat(this.getElementsByTagNameNS(child, namespaceURI, tagName)) ); } @@ -170,16 +168,16 @@ export default class ParentNodeUtility { * @returns Matching element. */ public static getElementByTagName( - parentNode: IElement | IDocumentFragment | IDocument, + parentNode: Element | DocumentFragment | Document, tagName: string - ): IElement { + ): Element { const upperTagName = tagName.toUpperCase(); for (const child of (parentNode)[PropertySymbol.children]) { if (child[PropertySymbol.tagName] === upperTagName) { - return child; + return child; } - const match = this.getElementByTagName(child, tagName); + const match = this.getElementByTagName(child, tagName); if (match) { return match; } @@ -196,16 +194,16 @@ export default class ParentNodeUtility { * @returns Matching element. */ public static getElementById( - parentNode: IElement | IDocumentFragment | IDocument, + parentNode: Element | DocumentFragment | Document, id: string - ): IElement { + ): Element { id = String(id); for (const child of (parentNode)[PropertySymbol.children]) { if (child.id === id) { - return child; + return child; } - const match = this.getElementById(child, id); + const match = this.getElementById(child, id); if (match) { return match; diff --git a/packages/happy-dom/src/nodes/processing-instruction/IProcessingInstruction.ts b/packages/happy-dom/src/nodes/processing-instruction/IProcessingInstruction.ts deleted file mode 100644 index f191ccb8b..000000000 --- a/packages/happy-dom/src/nodes/processing-instruction/IProcessingInstruction.ts +++ /dev/null @@ -1,5 +0,0 @@ -import ICharacterData from '../character-data/ICharacterData.js'; - -export default interface IProcessingInstruction extends ICharacterData { - target: string; -} diff --git a/packages/happy-dom/src/nodes/processing-instruction/ProcessingInstruction.ts b/packages/happy-dom/src/nodes/processing-instruction/ProcessingInstruction.ts index c7de93cfd..09321f0af 100644 --- a/packages/happy-dom/src/nodes/processing-instruction/ProcessingInstruction.ts +++ b/packages/happy-dom/src/nodes/processing-instruction/ProcessingInstruction.ts @@ -1,4 +1,3 @@ -import IProcessingInstruction from './IProcessingInstruction.js'; import CharacterData from '../character-data/CharacterData.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; import * as PropertySymbol from '../../PropertySymbol.js'; @@ -8,7 +7,7 @@ import * as PropertySymbol from '../../PropertySymbol.js'; * * Reference: https://developer.mozilla.org/en-US/docs/Web/API/ProcessingInstruction. */ -export default class ProcessingInstruction extends CharacterData implements IProcessingInstruction { +export default class ProcessingInstruction extends CharacterData { public [PropertySymbol.nodeType] = NodeTypeEnum.processingInstructionNode; public [PropertySymbol.target]: string; diff --git a/packages/happy-dom/src/nodes/shadow-root/IShadowRoot.ts b/packages/happy-dom/src/nodes/shadow-root/IShadowRoot.ts deleted file mode 100644 index 68bb5be25..000000000 --- a/packages/happy-dom/src/nodes/shadow-root/IShadowRoot.ts +++ /dev/null @@ -1,27 +0,0 @@ -import IDocumentFragment from '../document-fragment/IDocumentFragment.js'; -import IElement from '../element/IElement.js'; -import Event from '../../event/Event.js'; -import { CSSStyleSheet } from '../../index.js'; - -/** - * ShadowRoot. - */ -export default interface IShadowRoot extends IDocumentFragment { - mode: string; - innerHTML: string; - host: IElement; - adoptedStyleSheets: CSSStyleSheet[]; - readonly activeElement: IElement | null; - - // Events - onslotchange: (event: Event) => void | null; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IShadowRoot; -} diff --git a/packages/happy-dom/src/nodes/shadow-root/ShadowRoot.ts b/packages/happy-dom/src/nodes/shadow-root/ShadowRoot.ts index b419f11b3..6e557d741 100644 --- a/packages/happy-dom/src/nodes/shadow-root/ShadowRoot.ts +++ b/packages/happy-dom/src/nodes/shadow-root/ShadowRoot.ts @@ -2,23 +2,23 @@ import DocumentFragment from '../document-fragment/DocumentFragment.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import XMLParser from '../../xml-parser/XMLParser.js'; import XMLSerializer from '../../xml-serializer/XMLSerializer.js'; -import IElement from '../element/IElement.js'; +import Element from '../element/Element.js'; import CSSStyleSheet from '../../css/CSSStyleSheet.js'; -import IShadowRoot from './IShadowRoot.js'; -import IHTMLElement from '../../nodes/html-element/IHTMLElement.js'; +import HTMLElement from '../../nodes/html-element/HTMLElement.js'; import Event from '../../event/Event.js'; +import SVGElement from '../svg-element/SVGElement.js'; /** * ShadowRoot. */ -export default class ShadowRoot extends DocumentFragment implements IShadowRoot { +export default class ShadowRoot extends DocumentFragment { // Events public onslotchange: (event: Event) => void | null = null; // Internal properties public [PropertySymbol.adoptedStyleSheets]: CSSStyleSheet[] = []; public [PropertySymbol.mode] = 'open'; - public [PropertySymbol.host]: IElement | null = null; + public [PropertySymbol.host]: Element | null = null; /** * Returns mode. @@ -34,7 +34,7 @@ export default class ShadowRoot extends DocumentFragment implements IShadowRoot * * @returns Host. */ - public get host(): IElement { + public get host(): Element { return this[PropertySymbol.host]; } @@ -90,8 +90,8 @@ export default class ShadowRoot extends DocumentFragment implements IShadowRoot * * @returns Active element. */ - public get activeElement(): IHTMLElement | null { - const activeElement: IHTMLElement = + public get activeElement(): HTMLElement | SVGElement | null { + const activeElement: HTMLElement | SVGElement = this[PropertySymbol.ownerDocument][PropertySymbol.activeElement]; if ( activeElement && @@ -119,7 +119,7 @@ export default class ShadowRoot extends DocumentFragment implements IShadowRoot * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IShadowRoot { + public cloneNode(deep = false): ShadowRoot { const clone = super.cloneNode(deep); clone[PropertySymbol.mode] = this.mode; return clone; diff --git a/packages/happy-dom/src/nodes/svg-element/ISVGElement.ts b/packages/happy-dom/src/nodes/svg-element/ISVGElement.ts deleted file mode 100644 index 26fbcdb43..000000000 --- a/packages/happy-dom/src/nodes/svg-element/ISVGElement.ts +++ /dev/null @@ -1,35 +0,0 @@ -import Event from '../../event/Event.js'; -import CSSStyleDeclaration from '../../css/declaration/CSSStyleDeclaration.js'; -import IElement from '../element/IElement.js'; -import ISVGSVGElement from './ISVGSVGElement.js'; - -/** - * SVG Element. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGElement - */ -export default interface ISVGElement extends IElement { - readonly viewportElement: ISVGElement; - readonly ownerSVGElement: ISVGSVGElement; - readonly dataset: { [key: string]: string }; - readonly style: CSSStyleDeclaration; - tabIndex: number; - - // Events - onabort: (event: Event) => void | null; - onerror: (event: Event) => void | null; - onload: (event: Event) => void | null; - onresize: (event: Event) => void | null; - onscroll: (event: Event) => void | null; - onunload: (event: Event) => void | null; - - /** - * Triggers a blur event. - */ - blur(): void; - - /** - * Triggers a focus event. - */ - focus(): void; -} diff --git a/packages/happy-dom/src/nodes/svg-element/ISVGGraphicsElement.ts b/packages/happy-dom/src/nodes/svg-element/ISVGGraphicsElement.ts deleted file mode 100644 index 1e3aa6ee9..000000000 --- a/packages/happy-dom/src/nodes/svg-element/ISVGGraphicsElement.ts +++ /dev/null @@ -1,33 +0,0 @@ -import DOMRect from '../element/DOMRect.js'; -import DOMMatrix from './DOMMatrix.js'; -import ISVGElement from './ISVGElement.js'; - -/** - * SVG Graphics Element. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGGraphicsElement - */ -export default interface ISVGGraphicsElement extends ISVGElement { - readonly transform: {}; - - /** - * Returns DOM rect. - * - * @returns DOM rect. - */ - getBBox(): DOMRect; - - /** - * Returns CTM. - * - * @returns CTM. - */ - getCTM(): DOMMatrix; - - /** - * Returns screen CTM. - * - * @returns Screen CTM. - */ - getScreenCTM(): DOMMatrix; -} diff --git a/packages/happy-dom/src/nodes/svg-element/ISVGSVGElement.ts b/packages/happy-dom/src/nodes/svg-element/ISVGSVGElement.ts deleted file mode 100644 index 38941b4ef..000000000 --- a/packages/happy-dom/src/nodes/svg-element/ISVGSVGElement.ts +++ /dev/null @@ -1,161 +0,0 @@ -import Event from '../../event/Event.js'; -import INode from '../node/INode.js'; -import ISVGGraphicsElement from './ISVGGraphicsElement.js'; -import SVGAngle from './SVGAngle.js'; -import SVGAnimatedRect from './SVGAnimatedRect.js'; -import SVGLength from './SVGLength.js'; -import SVGNumber from './SVGNumber.js'; -import SVGPoint from './SVGPoint.js'; -import SVGRect from './SVGRect.js'; -import SVGTransform from './SVGTransform.js'; - -/** - * SVG Graphics Element. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGSVGElement - */ -export default interface ISVGSVGElement extends ISVGGraphicsElement { - preserveAspectRatio: string; - width: string; - height: string; - x: string; - y: string; - contentScriptType: string; - currentScale: number; - viewport: SVGRect; - currentTranslate: SVGPoint; - viewBox: SVGAnimatedRect; - - // Events - onafterprint: (event: Event) => void | null; - onbeforeprint: (event: Event) => void | null; - onbeforeunload: (event: Event) => void | null; - ongamepadconnected: (event: Event) => void | null; - ongamepaddisconnected: (event: Event) => void | null; - onhashchange: (event: Event) => void | null; - onlanguagechange: (event: Event) => void | null; - onmessage: (event: Event) => void | null; - onmessageerror: (event: Event) => void | null; - onoffline: (event: Event) => void | null; - ononline: (event: Event) => void | null; - onpagehide: (event: Event) => void | null; - onpageshow: (event: Event) => void | null; - onpopstate: (event: Event) => void | null; - onrejectionhandled: (event: Event) => void | null; - onstorage: (event: Event) => void | null; - onunhandledrejection: (event: Event) => void | null; - onunload: (event: Event) => void | null; - - /** - * Pauses animation. - */ - pauseAnimations(): void; - - /** - * Unpauses animation. - */ - unpauseAnimations(): void; - - /** - * Returns "true" if animation is paused. - * - * @returns "true" if animation is paused. - */ - animationsPaused(): boolean; - - /** - * Returns the current time in seconds relative to the start time for the current SVG document fragment. - * - * @returns Current time. - */ - getCurrentTime(): number; - - /** - * Sets current time. - */ - setCurrentTime(): void; - - /** - * Returns intersection list. - * - * @returns Intersection list. - */ - getIntersectionList(): INode[]; - - /** - * Returns enclousure list. - * - * @returns Enclousure list. - */ - getEnclosureList(): INode[]; - - /** - * Returns true if the rendered content of the given element intersects the supplied rectangle. - * - * @returns Intersection state. - */ - checkIntersection(): boolean; - - /** - * Returns true if the rendered content of the given element is entirely contained within the supplied rectangle. - * - * @returns Enclousure state. - */ - checkEnclosure(): boolean; - - /** - * Unselects any selected objects, including any selections of text strings and type-in bars. - */ - deselectAll(): void; - - /** - * Returns a number. - * - * @returns Number. - */ - createSVGNumber(): SVGNumber; - - /** - * Returns a length. - * - * @returns Length. - */ - createSVGLength(): SVGLength; - - /** - * Returns a angle. - * - * @returns Angle. - */ - createSVGAngle(): SVGAngle; - - /** - * Returns a point. - * - * @returns Point. - */ - createSVGPoint(): SVGPoint; - - /** - * Returns a rect. - * - * @returns Rect. - */ - createSVGRect(): SVGRect; - - /** - * Returns a transform. - * - * @returns Transform. - */ - createSVGTransform(): SVGTransform; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): ISVGSVGElement; -} diff --git a/packages/happy-dom/src/nodes/svg-element/SVGElement.ts b/packages/happy-dom/src/nodes/svg-element/SVGElement.ts index 71ebfdc93..7582229a1 100644 --- a/packages/happy-dom/src/nodes/svg-element/SVGElement.ts +++ b/packages/happy-dom/src/nodes/svg-element/SVGElement.ts @@ -1,12 +1,11 @@ import CSSStyleDeclaration from '../../css/declaration/CSSStyleDeclaration.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import Element from '../element/Element.js'; -import ISVGElement from './ISVGElement.js'; -import ISVGSVGElement from './ISVGSVGElement.js'; +import SVGSVGElement from './SVGSVGElement.js'; import Event from '../../event/Event.js'; import Dataset from '../element/Dataset.js'; import HTMLElementUtility from '../html-element/HTMLElementUtility.js'; -import INamedNodeMap from '../../named-node-map/INamedNodeMap.js'; +import NamedNodeMap from '../../named-node-map/NamedNodeMap.js'; import SVGElementNamedNodeMap from './SVGElementNamedNodeMap.js'; /** @@ -15,7 +14,7 @@ import SVGElementNamedNodeMap from './SVGElementNamedNodeMap.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/SVGElement. */ -export default class SVGElement extends Element implements ISVGElement { +export default class SVGElement extends Element { // Events public onabort: (event: Event) => void | null = null; public onerror: (event: Event) => void | null = null; @@ -25,7 +24,7 @@ export default class SVGElement extends Element implements ISVGElement { public onunload: (event: Event) => void | null = null; // Internal properties - public override [PropertySymbol.attributes]: INamedNodeMap = new SVGElementNamedNodeMap(this); + public override [PropertySymbol.attributes]: NamedNodeMap = new SVGElementNamedNodeMap(this); public [PropertySymbol.style]: CSSStyleDeclaration | null = null; // Private properties @@ -36,7 +35,7 @@ export default class SVGElement extends Element implements ISVGElement { * * @returns SVG rect. */ - public get viewportElement(): ISVGElement { + public get viewportElement(): SVGElement { return null; } @@ -45,11 +44,11 @@ export default class SVGElement extends Element implements ISVGElement { * * @returns Element. */ - public get ownerSVGElement(): ISVGSVGElement { + public get ownerSVGElement(): SVGSVGElement { let parent = this[PropertySymbol.parentNode]; while (parent) { if (parent[PropertySymbol.localName] === 'svg') { - return parent; + return parent; } parent = parent[PropertySymbol.parentNode]; diff --git a/packages/happy-dom/src/nodes/svg-element/SVGElementNamedNodeMap.ts b/packages/happy-dom/src/nodes/svg-element/SVGElementNamedNodeMap.ts index e2fd4fcc2..5315570ec 100644 --- a/packages/happy-dom/src/nodes/svg-element/SVGElementNamedNodeMap.ts +++ b/packages/happy-dom/src/nodes/svg-element/SVGElementNamedNodeMap.ts @@ -1,4 +1,4 @@ -import IAttr from '../attr/IAttr.js'; +import Attr from '../attr/Attr.js'; import * as PropertySymbol from '../../PropertySymbol.js'; import ElementNamedNodeMap from '../element/ElementNamedNodeMap.js'; import SVGElement from './SVGElement.js'; @@ -14,7 +14,7 @@ export default class SVGElementNamedNodeMap extends ElementNamedNodeMap { /** * @override */ - public override setNamedItem(item: IAttr): IAttr | null { + public override setNamedItem(item: Attr): Attr | null { const replacedItem = super.setNamedItem(item); if ( @@ -30,7 +30,7 @@ export default class SVGElementNamedNodeMap extends ElementNamedNodeMap { /** * @override */ - public override [PropertySymbol.removeNamedItem](name: string): IAttr | null { + public override [PropertySymbol.removeNamedItem](name: string): Attr | null { const removedItem = super[PropertySymbol.removeNamedItem](name); if ( diff --git a/packages/happy-dom/src/nodes/svg-element/SVGGraphicsElement.ts b/packages/happy-dom/src/nodes/svg-element/SVGGraphicsElement.ts index c76948bf8..c9ca352ca 100644 --- a/packages/happy-dom/src/nodes/svg-element/SVGGraphicsElement.ts +++ b/packages/happy-dom/src/nodes/svg-element/SVGGraphicsElement.ts @@ -1,14 +1,13 @@ import SVGElement from './SVGElement.js'; import DOMRect from '../element/DOMRect.js'; import DOMMatrix from './DOMMatrix.js'; -import ISVGGraphicsElement from './ISVGGraphicsElement.js'; /** * SVG Graphics Element. * * @see https://developer.mozilla.org/en-US/docs/Web/API/SVGGraphicsElement */ -export default class SVGGraphicsElement extends SVGElement implements ISVGGraphicsElement { +export default class SVGGraphicsElement extends SVGElement { public readonly transform = {}; /** diff --git a/packages/happy-dom/src/nodes/svg-element/SVGSVGElement.ts b/packages/happy-dom/src/nodes/svg-element/SVGSVGElement.ts index 1c1f3f2a2..c56a65b54 100644 --- a/packages/happy-dom/src/nodes/svg-element/SVGSVGElement.ts +++ b/packages/happy-dom/src/nodes/svg-element/SVGSVGElement.ts @@ -6,14 +6,13 @@ import SVGAngle from './SVGAngle.js'; import SVGNumber from './SVGNumber.js'; import SVGTransform from './SVGTransform.js'; import SVGAnimatedRect from './SVGAnimatedRect.js'; -import ISVGSVGElement from './ISVGSVGElement.js'; -import INode from '../node/INode.js'; +import Node from '../node/Node.js'; import Event from '../../event/Event.js'; /** * SVGSVGElement. */ -export default class SVGSVGElement extends SVGGraphicsElement implements ISVGSVGElement { +export default class SVGSVGElement extends SVGGraphicsElement { // Events public onafterprint: (event: Event) => void | null = null; public onbeforeprint: (event: Event) => void | null = null; @@ -236,7 +235,7 @@ export default class SVGSVGElement extends SVGGraphicsElement implements ISVGSVG * * @returns Intersection list. */ - public getIntersectionList(): INode[] { + public getIntersectionList(): Node[] { return []; } @@ -245,7 +244,7 @@ export default class SVGSVGElement extends SVGGraphicsElement implements ISVGSVG * * @returns Enclousure list. */ - public getEnclosureList(): INode[] { + public getEnclosureList(): Node[] { return []; } @@ -333,7 +332,7 @@ export default class SVGSVGElement extends SVGGraphicsElement implements ISVGSVG * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): ISVGSVGElement { - return super.cloneNode(deep); + public cloneNode(deep = false): SVGSVGElement { + return super.cloneNode(deep); } } diff --git a/packages/happy-dom/src/nodes/text/IText.ts b/packages/happy-dom/src/nodes/text/IText.ts deleted file mode 100644 index 1556e595d..000000000 --- a/packages/happy-dom/src/nodes/text/IText.ts +++ /dev/null @@ -1,22 +0,0 @@ -import ICharacterData from '../character-data/ICharacterData.js'; - -export default interface IText extends ICharacterData { - /** - * Breaks the Text node into two nodes at the specified offset, keeping both nodes in the tree as siblings. - * - * @see https://dom.spec.whatwg.org/#dom-text-splittext - * @see https://dom.spec.whatwg.org/#dom-text-splittext - * @param offset Offset. - * @returns New text node. - */ - splitText(offset: number): IText; - - /** - * Clones a node. - * - * @override - * @param [deep=false] "true" to clone deep. - * @returns Cloned node. - */ - cloneNode(deep?: boolean): IText; -} diff --git a/packages/happy-dom/src/nodes/text/Text.ts b/packages/happy-dom/src/nodes/text/Text.ts index acb5ba0b3..adabcc4ca 100644 --- a/packages/happy-dom/src/nodes/text/Text.ts +++ b/packages/happy-dom/src/nodes/text/Text.ts @@ -1,16 +1,15 @@ import * as PropertySymbol from '../../PropertySymbol.js'; import CharacterData from '../character-data/CharacterData.js'; -import IText from './IText.js'; import DOMException from '../../exception/DOMException.js'; import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js'; import HTMLTextAreaElement from '../html-text-area-element/HTMLTextAreaElement.js'; -import INode from '../node/INode.js'; +import Node from '../node/Node.js'; import NodeTypeEnum from '../node/NodeTypeEnum.js'; /** * Text node. */ -export default class Text extends CharacterData implements IText { +export default class Text extends CharacterData { public override [PropertySymbol.nodeType] = NodeTypeEnum.textNode; /** @@ -47,7 +46,7 @@ export default class Text extends CharacterData implements IText { * @param offset Offset. * @returns New text node. */ - public splitText(offset: number): IText { + public splitText(offset: number): Text { const length = this[PropertySymbol.data].length; if (offset < 0 || offset > length) { @@ -59,7 +58,7 @@ export default class Text extends CharacterData implements IText { const count = length - offset; const newData = this.substringData(offset, count); - const newNode = this[PropertySymbol.ownerDocument].createTextNode(newData); + const newNode = this[PropertySymbol.ownerDocument].createTextNode(newData); if (this[PropertySymbol.parentNode] !== null) { this[PropertySymbol.parentNode].insertBefore(newNode, this.nextSibling); @@ -86,14 +85,14 @@ export default class Text extends CharacterData implements IText { * @param [deep=false] "true" to clone deep. * @returns Cloned node. */ - public cloneNode(deep = false): IText { + public cloneNode(deep = false): Text { return super.cloneNode(deep); } /** * @override */ - public override [PropertySymbol.connectToNode](parentNode: INode = null): void { + public override [PropertySymbol.connectToNode](parentNode: Node = null): void { const oldTextAreaNode = this[PropertySymbol.textAreaNode]; super[PropertySymbol.connectToNode](parentNode); diff --git a/packages/happy-dom/src/query-selector/QuerySelector.ts b/packages/happy-dom/src/query-selector/QuerySelector.ts index ee05543b9..718ea3651 100644 --- a/packages/happy-dom/src/query-selector/QuerySelector.ts +++ b/packages/happy-dom/src/query-selector/QuerySelector.ts @@ -1,21 +1,19 @@ -import IElement from '../nodes/element/IElement.js'; +import Element from '../nodes/element/Element.js'; import * as PropertySymbol from '../PropertySymbol.js'; import SelectorItem from './SelectorItem.js'; -import INodeList from '../nodes/node/INodeList.js'; import NodeList from '../nodes/node/NodeList.js'; import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; import SelectorCombinatorEnum from './SelectorCombinatorEnum.js'; -import IDocument from '../nodes/document/IDocument.js'; -import IDocumentFragment from '../nodes/document-fragment/IDocumentFragment.js'; +import Document from '../nodes/document/Document.js'; +import DocumentFragment from '../nodes/document-fragment/DocumentFragment.js'; import SelectorParser from './SelectorParser.js'; import ISelectorMatch from './ISelectorMatch.js'; -import Element from '../nodes/element/Element.js'; import IHTMLElementTagNameMap from '../config/IHTMLElementTagNameMap.js'; import ISVGElementTagNameMap from '../config/ISVGElementTagNameMap.js'; -type IDocumentPositionAndElement = { +type DocumentPositionAndElement = { documentPosition: string; - element: IElement; + element: Element; }; /** @@ -37,9 +35,9 @@ export default class QuerySelector { * @returns HTML elements. */ public static querySelectorAll( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: K - ): INodeList; + ): NodeList; /** * Finds elements based on a query selector. @@ -49,9 +47,9 @@ export default class QuerySelector { * @returns HTML elements. */ public static querySelectorAll( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: K - ): INodeList; + ): NodeList; /** * Finds elements based on a query selector. @@ -61,9 +59,9 @@ export default class QuerySelector { * @returns HTML elements. */ public static querySelectorAll( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: string - ): INodeList; + ): NodeList; /** * Finds elements based on a query selector. @@ -73,9 +71,9 @@ export default class QuerySelector { * @returns HTML elements. */ public static querySelectorAll( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: string - ): INodeList { + ): NodeList { if (selector === '') { throw new Error( `Failed to execute 'querySelectorAll' on '${node.constructor.name}': The provided selector is empty.` @@ -83,7 +81,7 @@ export default class QuerySelector { } if (selector === null || selector === undefined) { - return new NodeList(); + return new NodeList(); } if (INVALID_SELECTOR_REGEXP.test(selector)) { @@ -93,18 +91,18 @@ export default class QuerySelector { } const groups = SelectorParser.getSelectorGroups(selector); - let matches: IDocumentPositionAndElement[] = []; + let matches: DocumentPositionAndElement[] = []; for (const items of groups) { matches = matches.concat( node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode - ? this.findAll(node, [node], items) + ? this.findAll(node, [node], items) : this.findAll(null, (node)[PropertySymbol.children], items) ); } - const nodeList = new NodeList(); - const matchesMap: { [position: string]: IElement } = {}; + const nodeList = new NodeList(); + const matchesMap: { [position: string]: Element } = {}; for (let i = 0, max = matches.length; i < max; i++) { matchesMap[matches[i].documentPosition] = matches[i].element; @@ -126,7 +124,7 @@ export default class QuerySelector { * @returns HTML element. */ public static querySelector( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: K ): IHTMLElementTagNameMap[K] | null; @@ -138,7 +136,7 @@ export default class QuerySelector { * @returns HTML element. */ public static querySelector( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: K ): ISVGElementTagNameMap[K] | null; @@ -150,9 +148,9 @@ export default class QuerySelector { * @returns HTML element. */ public static querySelector( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: string - ): IElement | null; + ): Element | null; /** * Finds an element based on a query selector. @@ -162,9 +160,9 @@ export default class QuerySelector { * @returns HTML element. */ public static querySelector( - node: IElement | IDocument | IDocumentFragment, + node: Element | Document | DocumentFragment, selector: string - ): IElement | null { + ): Element | null { if (selector === '') { throw new Error( `Failed to execute 'querySelector' on '${node.constructor.name}': The provided selector is empty.` @@ -184,7 +182,7 @@ export default class QuerySelector { for (const items of SelectorParser.getSelectorGroups(selector)) { const match = node[PropertySymbol.nodeType] === NodeTypeEnum.elementNode - ? this.findFirst(node, [node], items) + ? this.findFirst(node, [node], items) : this.findFirst(null, (node)[PropertySymbol.children], items); if (match) { @@ -202,7 +200,7 @@ export default class QuerySelector { * @param selector Selector to match with. * @returns Result. */ - public static match(element: IElement, selector: string): ISelectorMatch | null { + public static match(element: Element, selector: string): ISelectorMatch | null { if (!selector) { return null; } @@ -240,8 +238,8 @@ export default class QuerySelector { * @returns Result. */ private static matchSelector( - targetElement: IElement, - currentElement: IElement, + targetElement: Element, + currentElement: Element, selectorItems: SelectorItem[], priorityWeight = 0 ): ISelectorMatch | null { @@ -313,14 +311,14 @@ export default class QuerySelector { * @returns Document position and element map. */ private static findAll( - rootElement: IElement, - children: IElement[], + rootElement: Element, + children: Element[], selectorItems: SelectorItem[], documentPosition?: string - ): IDocumentPositionAndElement[] { + ): DocumentPositionAndElement[] { const selectorItem = selectorItems[0]; const nextSelectorItem = selectorItems[1]; - let matched: IDocumentPositionAndElement[] = []; + let matched: DocumentPositionAndElement[] = []; for (let i = 0, max = children.length; i < max; i++) { const child = children[i]; @@ -390,10 +388,10 @@ export default class QuerySelector { * @returns HTML element. */ private static findFirst( - rootElement: IElement, - children: IElement[], + rootElement: Element, + children: Element[], selectorItems: SelectorItem[] - ): IElement { + ): Element { const selectorItem = selectorItems[0]; const nextSelectorItem = selectorItems[1]; diff --git a/packages/happy-dom/src/query-selector/SelectorItem.ts b/packages/happy-dom/src/query-selector/SelectorItem.ts index c1915be52..603255bc2 100644 --- a/packages/happy-dom/src/query-selector/SelectorItem.ts +++ b/packages/happy-dom/src/query-selector/SelectorItem.ts @@ -1,8 +1,7 @@ import DOMException from '../exception/DOMException.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IElement from '../nodes/element/IElement.js'; import Element from '../nodes/element/Element.js'; -import IHTMLInputElement from '../nodes/html-input-element/IHTMLInputElement.js'; +import HTMLInputElement from '../nodes/html-input-element/HTMLInputElement.js'; import SelectorCombinatorEnum from './SelectorCombinatorEnum.js'; import ISelectorAttribute from './ISelectorAttribute.js'; import ISelectorMatch from './ISelectorMatch.js'; @@ -56,7 +55,7 @@ export default class SelectorItem { * @param element HTML element. * @returns Result. */ - public match(element: IElement): ISelectorMatch | null { + public match(element: Element): ISelectorMatch | null { let priorityWeight = 0; if (this.isPseudoElement) { @@ -111,8 +110,8 @@ export default class SelectorItem { * @param element Element. * @returns Result. */ - private matchPsuedo(element: IElement): boolean { - const parent = element[PropertySymbol.parentNode]; + private matchPsuedo(element: Element): boolean { + const parent = element[PropertySymbol.parentNode]; const parentChildren = element[PropertySymbol.parentNode] ? (element[PropertySymbol.parentNode])[PropertySymbol.children] : []; @@ -168,8 +167,8 @@ export default class SelectorItem { * @param pseudo Pseudo. */ private matchPseudoItem( - element: IElement, - parentChildren: IElement[], + element: Element, + parentChildren: Element[], pseudo: ISelectorPseudo ): boolean { switch (pseudo.name) { @@ -206,7 +205,7 @@ export default class SelectorItem { } return isFound; case 'checked': - return element[PropertySymbol.tagName] === 'INPUT' && (element).checked; + return element[PropertySymbol.tagName] === 'INPUT' && (element).checked; case 'empty': return !(element)[PropertySymbol.children].length; case 'root': @@ -257,7 +256,7 @@ export default class SelectorItem { * @param element Element. * @returns Result. */ - private matchAttributes(element: IElement): ISelectorMatch | null { + private matchAttributes(element: Element): ISelectorMatch | null { if (!this.attributes) { return null; } @@ -294,7 +293,7 @@ export default class SelectorItem { * @param element Element. * @returns Result. */ - private matchClass(element: IElement): ISelectorMatch | null { + private matchClass(element: Element): ISelectorMatch | null { if (!this.classNames) { return null; } diff --git a/packages/happy-dom/src/range/IRangeBoundaryPoint.ts b/packages/happy-dom/src/range/IRangeBoundaryPoint.ts index c11507808..480755174 100644 --- a/packages/happy-dom/src/range/IRangeBoundaryPoint.ts +++ b/packages/happy-dom/src/range/IRangeBoundaryPoint.ts @@ -1,9 +1,9 @@ -import INode from '../nodes/node/INode.js'; +import Node from '../nodes/node/Node.js'; /** * Range boundary point. */ export default interface IRangeBoundaryPoint { - node: INode; + node: Node; offset: number; } diff --git a/packages/happy-dom/src/range/Range.ts b/packages/happy-dom/src/range/Range.ts index 1ad63bea8..78767f346 100644 --- a/packages/happy-dom/src/range/Range.ts +++ b/packages/happy-dom/src/range/Range.ts @@ -1,8 +1,7 @@ -import INode from '../nodes/node/INode.js'; -import * as PropertySymbol from '../PropertySymbol.js'; import Node from '../nodes/node/Node.js'; -import IDocument from '../nodes/document/IDocument.js'; -import IDocumentFragment from '../nodes/document-fragment/IDocumentFragment.js'; +import * as PropertySymbol from '../PropertySymbol.js'; +import Document from '../nodes/document/Document.js'; +import DocumentFragment from '../nodes/document-fragment/DocumentFragment.js'; import DOMRect from '../nodes/element/DOMRect.js'; import RangeHowEnum from './RangeHowEnum.js'; import DOMException from '../exception/DOMException.js'; @@ -11,12 +10,11 @@ import RangeUtility from './RangeUtility.js'; import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; import NodeUtility from '../nodes/node/NodeUtility.js'; import XMLParser from '../xml-parser/XMLParser.js'; -import IComment from '../nodes/comment/IComment.js'; -import IText from '../nodes/text/IText.js'; -import DOMRectListFactory from '../nodes/element/DOMRectListFactory.js'; -import IDOMRectList from '../nodes/element/IDOMRectList.js'; +import Comment from '../nodes/comment/Comment.js'; +import Text from '../nodes/text/Text.js'; +import DOMRectList from '../nodes/element/DOMRectList.js'; import IRangeBoundaryPoint from './IRangeBoundaryPoint.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; /** * Range. @@ -38,15 +36,15 @@ export default class Range { public readonly START_TO_START: number = RangeHowEnum.startToStart; public [PropertySymbol.start]: IRangeBoundaryPoint | null = null; public [PropertySymbol.end]: IRangeBoundaryPoint | null = null; - #window: IBrowserWindow; - public readonly [PropertySymbol.ownerDocument]: IDocument; + #window: BrowserWindow; + public readonly [PropertySymbol.ownerDocument]: Document; /** * Constructor. * * @param window Window. */ - constructor(window: IBrowserWindow) { + constructor(window: BrowserWindow) { this.#window = window; this[PropertySymbol.ownerDocument] = window.document; this[PropertySymbol.start] = { node: window.document, offset: 0 }; @@ -59,7 +57,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-startcontainer * @returns Start container. */ - public get startContainer(): INode { + public get startContainer(): Node { return this[PropertySymbol.start].node; } @@ -69,7 +67,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-endcontainer * @returns End container. */ - public get endContainer(): INode { + public get endContainer(): Node { return this[PropertySymbol.end].node; } @@ -126,7 +124,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-commonancestorcontainer * @returns Node. */ - public get commonAncestorContainer(): INode { + public get commonAncestorContainer(): Node { let container = this[PropertySymbol.start].node; while (container) { @@ -181,11 +179,11 @@ export default class Range { ); } - const thisPoint: { node: INode; offset: number } = { + const thisPoint: { node: Node; offset: number } = { node: null, offset: 0 }; - const sourcePoint: { node: INode; offset: number } = { + const sourcePoint: { node: Node; offset: number } = { node: null, offset: 0 }; @@ -228,7 +226,7 @@ export default class Range { * @param offset Offset. * @returns -1,0, or 1. */ - public comparePoint(node: INode, offset): number { + public comparePoint(node: Node, offset): number { if (node[PropertySymbol.ownerDocument] !== this[PropertySymbol.ownerDocument]) { throw new DOMException( `The two Ranges are not in the same tree.`, @@ -265,7 +263,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#concept-range-clone * @returns Document fragment. */ - public cloneContents(): IDocumentFragment { + public cloneContents(): DocumentFragment { const fragment = this[PropertySymbol.ownerDocument].createDocumentFragment(); const startOffset = this.startOffset; const endOffset = this.endOffset; @@ -281,7 +279,7 @@ export default class Range { NodeTypeEnum.processingInstructionNode || this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.commentNode) ) { - const clone = (this[PropertySymbol.start].node).cloneNode(false); + const clone = (this[PropertySymbol.start].node).cloneNode(false); clone[PropertySymbol.data] = clone.substringData(startOffset, endOffset - startOffset); fragment.appendChild(clone); return fragment; @@ -347,7 +345,7 @@ export default class Range { NodeTypeEnum.processingInstructionNode || firstPartialContainedChild[PropertySymbol.nodeType] === NodeTypeEnum.commentNode) ) { - const clone = (this[PropertySymbol.start].node).cloneNode(false); + const clone = (this[PropertySymbol.start].node).cloneNode(false); clone[PropertySymbol.data] = clone.substringData( startOffset, NodeUtility.getNodeLength(this[PropertySymbol.start].node) - startOffset @@ -380,7 +378,7 @@ export default class Range { NodeTypeEnum.processingInstructionNode || lastPartiallyContainedChild[PropertySymbol.nodeType] === NodeTypeEnum.commentNode) ) { - const clone = (this[PropertySymbol.end].node).cloneNode(false); + const clone = (this[PropertySymbol.end].node).cloneNode(false); clone[PropertySymbol.data] = clone.substringData(0, endOffset); fragment.appendChild(clone); @@ -425,9 +423,9 @@ export default class Range { * @param tagString Tag string. * @returns Document fragment. */ - public createContextualFragment(tagString: string): IDocumentFragment { + public createContextualFragment(tagString: string): DocumentFragment { // TODO: We only have support for HTML in the parser currently, so it is not necessary to check which context it is - return XMLParser.parse(this[PropertySymbol.ownerDocument], tagString); + return XMLParser.parse(this[PropertySymbol.ownerDocument], tagString); } /** @@ -450,7 +448,7 @@ export default class Range { NodeTypeEnum.processingInstructionNode || this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.commentNode) ) { - (this[PropertySymbol.start].node).replaceData( + (this[PropertySymbol.start].node).replaceData( startOffset, endOffset - startOffset, '' @@ -508,7 +506,7 @@ export default class Range { NodeTypeEnum.processingInstructionNode || this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.commentNode ) { - (this[PropertySymbol.start].node).replaceData( + (this[PropertySymbol.start].node).replaceData( this.startOffset, NodeUtility.getNodeLength(this[PropertySymbol.start].node) - this.startOffset, '' @@ -526,7 +524,7 @@ export default class Range { NodeTypeEnum.processingInstructionNode || this[PropertySymbol.end].node[PropertySymbol.nodeType] === NodeTypeEnum.commentNode ) { - (this[PropertySymbol.end].node).replaceData(0, endOffset, ''); + (this[PropertySymbol.end].node).replaceData(0, endOffset, ''); } this[PropertySymbol.start].node = newNode; @@ -550,7 +548,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-extractcontents * @returns Document fragment. */ - public extractContents(): IDocumentFragment { + public extractContents(): DocumentFragment { const fragment = this[PropertySymbol.ownerDocument].createDocumentFragment(); const startOffset = this.startOffset; const endOffset = this.endOffset; @@ -566,12 +564,12 @@ export default class Range { NodeTypeEnum.processingInstructionNode || this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.commentNode) ) { - const clone = this[PropertySymbol.start].node.cloneNode(false); + const clone = this[PropertySymbol.start].node.cloneNode(false); clone[PropertySymbol.data] = clone.substringData(startOffset, endOffset - startOffset); fragment.appendChild(clone); - (this[PropertySymbol.start].node).replaceData( + (this[PropertySymbol.start].node).replaceData( startOffset, endOffset - startOffset, '' @@ -670,7 +668,7 @@ export default class Range { NodeTypeEnum.processingInstructionNode || firstPartialContainedChild[PropertySymbol.nodeType] === NodeTypeEnum.commentNode) ) { - const clone = this[PropertySymbol.start].node.cloneNode(false); + const clone = this[PropertySymbol.start].node.cloneNode(false); clone[PropertySymbol.data] = clone.substringData( startOffset, NodeUtility.getNodeLength(this[PropertySymbol.start].node) - startOffset @@ -678,7 +676,7 @@ export default class Range { fragment.appendChild(clone); - (this[PropertySymbol.start].node).replaceData( + (this[PropertySymbol.start].node).replaceData( startOffset, NodeUtility.getNodeLength(this[PropertySymbol.start].node) - startOffset, '' @@ -708,12 +706,12 @@ export default class Range { NodeTypeEnum.processingInstructionNode || lastPartiallyContainedChild[PropertySymbol.nodeType] === NodeTypeEnum.commentNode) ) { - const clone = this[PropertySymbol.end].node.cloneNode(false); + const clone = this[PropertySymbol.end].node.cloneNode(false); clone[PropertySymbol.data] = clone.substringData(0, endOffset); fragment.appendChild(clone); - (this[PropertySymbol.end].node).replaceData(0, endOffset, ''); + (this[PropertySymbol.end].node).replaceData(0, endOffset, ''); } else if (lastPartiallyContainedChild !== null) { const clone = lastPartiallyContainedChild.cloneNode(false); fragment.appendChild(clone); @@ -751,9 +749,9 @@ export default class Range { * * @returns DOMRect objects. */ - public getClientRects(): IDOMRectList { + public getClientRects(): DOMRectList { // TODO: Not full implementation - return DOMRectListFactory.create(); + return new DOMRectList(); } /** @@ -764,7 +762,7 @@ export default class Range { * @param offset Offset. * @returns "true" if in range. */ - public isPointInRange(node: INode, offset = 0): boolean { + public isPointInRange(node: Node, offset = 0): boolean { if (node[PropertySymbol.ownerDocument] !== this[PropertySymbol.ownerDocument]) { return false; } @@ -795,7 +793,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#concept-range-insert * @param newNode New node. */ - public insertNode(newNode: INode): void { + public insertNode(newNode: Node): void { if ( this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.processingInstructionNode || @@ -817,7 +815,7 @@ export default class Range { : referenceNode[PropertySymbol.parentNode]; if (this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.textNode) { - referenceNode = (this[PropertySymbol.start].node).splitText(this.startOffset); + referenceNode = (this[PropertySymbol.start].node).splitText(this.startOffset); } if (newNode === referenceNode) { @@ -854,7 +852,7 @@ export default class Range { * @param node Reference node. * @returns "true" if it intersects. */ - public intersectsNode(node: INode): boolean { + public intersectsNode(node: Node): boolean { if (node[PropertySymbol.ownerDocument] !== this[PropertySymbol.ownerDocument]) { return false; } @@ -885,7 +883,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#concept-range-select * @param node Reference node. */ - public selectNode(node: INode): void { + public selectNode(node: Node): void { if (!node[PropertySymbol.parentNode]) { throw new DOMException( `The given Node has no parent.`, @@ -907,7 +905,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-selectnodecontents * @param node Reference node. */ - public selectNodeContents(node: INode): void { + public selectNodeContents(node: Node): void { if (node[PropertySymbol.nodeType] === NodeTypeEnum.documentTypeNode) { throw new DOMException( "DocumentType Node can't be used as boundary point.", @@ -928,7 +926,7 @@ export default class Range { * @param node End node. * @param offset End offset. */ - public setEnd(node: INode, offset = 0): void { + public setEnd(node: Node, offset = 0): void { RangeUtility.validateBoundaryPoint({ node, offset }); const boundaryPoint = { node, offset }; @@ -955,7 +953,7 @@ export default class Range { * @param node Start node. * @param offset Start offset. */ - public setStart(node: INode, offset = 0): void { + public setStart(node: Node, offset = 0): void { RangeUtility.validateBoundaryPoint({ node, offset }); const boundaryPoint = { node, offset }; @@ -981,7 +979,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-setendafter * @param node Reference node. */ - public setEndAfter(node: INode): void { + public setEndAfter(node: Node): void { if (!node[PropertySymbol.parentNode]) { throw new DOMException( 'The given Node has no parent.', @@ -1000,7 +998,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-setendbefore * @param node Reference node. */ - public setEndBefore(node: INode): void { + public setEndBefore(node: Node): void { if (!node[PropertySymbol.parentNode]) { throw new DOMException( 'The given Node has no parent.', @@ -1019,7 +1017,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-setstartafter * @param node Reference node. */ - public setStartAfter(node: INode): void { + public setStartAfter(node: Node): void { if (!node[PropertySymbol.parentNode]) { throw new DOMException( 'The given Node has no parent.', @@ -1038,7 +1036,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-setstartbefore * @param node Reference node. */ - public setStartBefore(node: INode): void { + public setStartBefore(node: Node): void { if (!node[PropertySymbol.parentNode]) { throw new DOMException( 'The given Node has no parent.', @@ -1057,7 +1055,7 @@ export default class Range { * @see https://dom.spec.whatwg.org/#dom-range-surroundcontents * @param newParent New parent. */ - public surroundContents(newParent: INode): void { + public surroundContents(newParent: Node): void { let node = this.commonAncestorContainer; const endNode = NodeUtility.nextDescendantNode(node); while (node !== endNode) { @@ -1109,11 +1107,11 @@ export default class Range { this[PropertySymbol.start].node === this[PropertySymbol.end].node && this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.textNode ) { - return (this[PropertySymbol.start].node).data.slice(startOffset, endOffset); + return (this[PropertySymbol.start].node).data.slice(startOffset, endOffset); } if (this[PropertySymbol.start].node[PropertySymbol.nodeType] === NodeTypeEnum.textNode) { - string += (this[PropertySymbol.start].node).data.slice(startOffset); + string += (this[PropertySymbol.start].node).data.slice(startOffset); } const endNode = NodeUtility.nextDescendantNode(this[PropertySymbol.end].node); @@ -1124,14 +1122,14 @@ export default class Range { currentNode[PropertySymbol.nodeType] === NodeTypeEnum.textNode && RangeUtility.isContained(currentNode, this) ) { - string += (currentNode).data; + string += (currentNode).data; } currentNode = NodeUtility.following(currentNode); } if (this[PropertySymbol.end].node[PropertySymbol.nodeType] === NodeTypeEnum.textNode) { - string += (this[PropertySymbol.end].node).data.slice(0, endOffset); + string += (this[PropertySymbol.end].node).data.slice(0, endOffset); } return string; diff --git a/packages/happy-dom/src/range/RangeUtility.ts b/packages/happy-dom/src/range/RangeUtility.ts index 81d591b2d..053674463 100644 --- a/packages/happy-dom/src/range/RangeUtility.ts +++ b/packages/happy-dom/src/range/RangeUtility.ts @@ -2,7 +2,6 @@ import DOMException from '../exception/DOMException.js'; import * as PropertySymbol from '../PropertySymbol.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; -import INode from '../nodes/node/INode.js'; import Node from '../nodes/node/Node.js'; import NodeUtility from '../nodes/node/NodeUtility.js'; import Range from './Range.js'; @@ -88,7 +87,7 @@ export default class RangeUtility { * @param range Range. * @returns "true" if contained. */ - public static isContained(node: INode, range: Range): boolean { + public static isContained(node: Node, range: Range): boolean { return ( this.compareBoundaryPointsPosition( { node, offset: 0 }, @@ -108,7 +107,7 @@ export default class RangeUtility { * @param range Range. * @returns "true" if partially contained. */ - public static isPartiallyContained(node: INode, range: Range): boolean { + public static isPartiallyContained(node: Node, range: Range): boolean { return ( (NodeUtility.isInclusiveAncestor(node, range.startContainer) && !NodeUtility.isInclusiveAncestor(node, range.endContainer)) || diff --git a/packages/happy-dom/src/selection/Selection.ts b/packages/happy-dom/src/selection/Selection.ts index 3504d0bfe..404b97976 100644 --- a/packages/happy-dom/src/selection/Selection.ts +++ b/packages/happy-dom/src/selection/Selection.ts @@ -2,8 +2,8 @@ import Event from '../event/Event.js'; import * as PropertySymbol from '../PropertySymbol.js'; import DOMException from '../exception/DOMException.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; -import IDocument from '../nodes/document/IDocument.js'; -import INode from '../nodes/node/INode.js'; +import Document from '../nodes/document/Document.js'; +import Node from '../nodes/node/Node.js'; import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; import NodeUtility from '../nodes/node/NodeUtility.js'; import Range from '../range/Range.js'; @@ -20,7 +20,7 @@ import SelectionDirectionEnum from './SelectionDirectionEnum.js'; * https://developer.mozilla.org/en-US/docs/Web/API/Selection. */ export default class Selection { - readonly #ownerDocument: IDocument = null; + readonly #ownerDocument: Document = null; #range: Range = null; #direction: SelectionDirectionEnum = SelectionDirectionEnum.directionless; @@ -29,7 +29,7 @@ export default class Selection { * * @param ownerDocument Owner document. */ - constructor(ownerDocument: IDocument) { + constructor(ownerDocument: Document) { this.#ownerDocument = ownerDocument; } @@ -75,7 +75,7 @@ export default class Selection { * @see https://w3c.github.io/selection-api/#dom-selection-anchornode * @returns Node. */ - public get anchorNode(): INode { + public get anchorNode(): Node { if (!this.#range) { return null; } @@ -106,7 +106,7 @@ export default class Selection { * @alias anchorNode * @returns Node. */ - public get baseNode(): INode { + public get baseNode(): Node { return this.anchorNode; } @@ -127,7 +127,7 @@ export default class Selection { * @see https://w3c.github.io/selection-api/#dom-selection-focusnode * @returns Node. */ - public get focusNode(): INode { + public get focusNode(): Node { return this.anchorNode; } @@ -148,7 +148,7 @@ export default class Selection { * @alias focusNode * @returns Node. */ - public get extentNode(): INode { + public get extentNode(): Node { return this.focusNode; } @@ -229,7 +229,7 @@ export default class Selection { * @param node Node. * @param offset Offset. */ - public collapse(node: INode, offset: number): void { + public collapse(node: Node, offset: number): void { if (node === null) { this.removeAllRanges(); return; @@ -268,7 +268,7 @@ export default class Selection { * @param node Node. * @param offset Offset. */ - public setPosition(node: INode, offset: number): void { + public setPosition(node: Node, offset: number): void { this.collapse(node, offset); } @@ -328,7 +328,7 @@ export default class Selection { * @param [allowPartialContainment] Set to "true" to allow partial containment. * @returns Always returns "true" for now. */ - public containsNode(node: INode, allowPartialContainment = false): boolean { + public containsNode(node: Node, allowPartialContainment = false): boolean { if (!this.#range || node[PropertySymbol.ownerDocument] !== this.#ownerDocument) { return false; } @@ -367,7 +367,7 @@ export default class Selection { * @param node Node. * @param offset Offset. */ - public extend(node: INode, offset: number): void { + public extend(node: Node, offset: number): void { if (node[PropertySymbol.ownerDocument] !== this.#ownerDocument) { return; } @@ -423,7 +423,7 @@ export default class Selection { * @see https://w3c.github.io/selection-api/#dom-selection-selectallchildren * @param node Node. */ - public selectAllChildren(node: INode): void { + public selectAllChildren(node: Node): void { if (node[PropertySymbol.nodeType] === NodeTypeEnum.documentTypeNode) { throw new DOMException( "DocumentType Node can't be used as boundary point.", @@ -456,9 +456,9 @@ export default class Selection { * @param focusOffset Focus offset. */ public setBaseAndExtent( - anchorNode: INode, + anchorNode: Node, anchorOffset: number, - focusNode: INode, + focusNode: Node, focusOffset: number ): void { if ( diff --git a/packages/happy-dom/src/tree-walker/INodeFilter.ts b/packages/happy-dom/src/tree-walker/INodeFilter.ts index 034769741..6642a6ad2 100644 --- a/packages/happy-dom/src/tree-walker/INodeFilter.ts +++ b/packages/happy-dom/src/tree-walker/INodeFilter.ts @@ -1,5 +1,5 @@ -import INode from '../nodes/node/INode.js'; +import Node from '../nodes/node/Node.js'; -type INodeFilter = ((node: INode) => number) | { acceptNode(node: INode): number }; +type INodeFilter = ((node: Node) => number) | { acceptNode(node: Node): number }; export default INodeFilter; diff --git a/packages/happy-dom/src/tree-walker/NodeIterator.ts b/packages/happy-dom/src/tree-walker/NodeIterator.ts index c533112f6..fed8c2579 100644 --- a/packages/happy-dom/src/tree-walker/NodeIterator.ts +++ b/packages/happy-dom/src/tree-walker/NodeIterator.ts @@ -1,6 +1,6 @@ import INodeFilter from './INodeFilter.js'; import TreeWalker from './TreeWalker.js'; -import INode from '../nodes/node/INode.js'; +import Node from '../nodes/node/Node.js'; /** * The NodeIterator object represents the nodes of a document subtree and a position within them. @@ -9,7 +9,7 @@ import INode from '../nodes/node/INode.js'; * https://developer.mozilla.org/en-US/docs/Web/API/NodeIterator */ export default class NodeIterator { - public root: INode = null; + public root: Node = null; public whatToShow = -1; public filter: INodeFilter = null; @@ -22,7 +22,7 @@ export default class NodeIterator { * @param [whatToShow] What to show. * @param [filter] Filter. */ - constructor(root: INode, whatToShow = -1, filter: INodeFilter = null) { + constructor(root: Node, whatToShow = -1, filter: INodeFilter = null) { this.root = root; this.whatToShow = whatToShow; this.filter = filter; @@ -34,7 +34,7 @@ export default class NodeIterator { * * @returns Current node. */ - public nextNode(): INode { + public nextNode(): Node { return this.#walker.nextNode(); } @@ -43,7 +43,7 @@ export default class NodeIterator { * * @returns Current node. */ - public previousNode(): INode { + public previousNode(): Node { return this.#walker.previousNode(); } } diff --git a/packages/happy-dom/src/tree-walker/TreeWalker.ts b/packages/happy-dom/src/tree-walker/TreeWalker.ts index 5a264a0e5..ca7790840 100644 --- a/packages/happy-dom/src/tree-walker/TreeWalker.ts +++ b/packages/happy-dom/src/tree-walker/TreeWalker.ts @@ -1,19 +1,18 @@ import Node from '../nodes/node/Node.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import NodeFilter from './NodeFilter.js'; import INodeFilter from './INodeFilter.js'; import NodeFilterMask from './NodeFilterMask.js'; import DOMException from '../exception/DOMException.js'; -import INode from '../nodes/node/INode.js'; +import NodeFilter from './NodeFilter.js'; /** * The TreeWalker object represents the nodes of a document subtree and a position within them. */ export default class TreeWalker { - public root: INode = null; + public root: Node = null; public whatToShow = -1; public filter: INodeFilter = null; - public currentNode: INode = null; + public currentNode: Node = null; /** * Constructor. @@ -22,7 +21,7 @@ export default class TreeWalker { * @param [whatToShow] What to show. * @param [filter] Filter. */ - constructor(root: INode, whatToShow = -1, filter: INodeFilter = null) { + constructor(root: Node, whatToShow = -1, filter: INodeFilter = null) { if (!(root instanceof Node)) { throw new DOMException('Parameter 1 was not of type Node.'); } @@ -38,7 +37,7 @@ export default class TreeWalker { * * @returns Current node. */ - public nextNode(): INode { + public nextNode(): Node { if (!this.firstChild()) { while (!this.nextSibling() && this.parentNode()) {} this.currentNode = this.currentNode === this.root ? null : this.currentNode || null; @@ -51,7 +50,7 @@ export default class TreeWalker { * * @returns Current node. */ - public previousNode(): INode { + public previousNode(): Node { while (!this.previousSibling() && this.parentNode()) {} this.currentNode = this.currentNode === this.root ? null : this.currentNode || null; return this.currentNode; @@ -62,7 +61,7 @@ export default class TreeWalker { * * @returns Current node. */ - public parentNode(): INode { + public parentNode(): Node { if ( this.currentNode !== this.root && this.currentNode && @@ -87,7 +86,7 @@ export default class TreeWalker { * * @returns Current node. */ - public firstChild(): INode { + public firstChild(): Node { const childNodes = this.currentNode ? (this.currentNode)[PropertySymbol.childNodes] : []; if (childNodes.length > 0) { @@ -108,7 +107,7 @@ export default class TreeWalker { * * @returns Current node. */ - public lastChild(): INode { + public lastChild(): Node { const childNodes = this.currentNode ? (this.currentNode)[PropertySymbol.childNodes] : []; if (childNodes.length > 0) { @@ -129,7 +128,7 @@ export default class TreeWalker { * * @returns Current node. */ - public previousSibling(): INode { + public previousSibling(): Node { if ( this.currentNode !== this.root && this.currentNode && @@ -159,7 +158,7 @@ export default class TreeWalker { * * @returns Current node. */ - public nextSibling(): INode { + public nextSibling(): Node { if ( this.currentNode !== this.root && this.currentNode && @@ -193,7 +192,7 @@ export default class TreeWalker { * @param node Node. * @returns Child nodes. */ - private filterNode(node: INode): number { + private filterNode(node: Node): number { const mask = NodeFilterMask[node.nodeType]; if (mask && (this.whatToShow & mask) == 0) { diff --git a/packages/happy-dom/src/validity-state/ValidityState.ts b/packages/happy-dom/src/validity-state/ValidityState.ts index c3bb9f5f6..2f428a25c 100644 --- a/packages/happy-dom/src/validity-state/ValidityState.ts +++ b/packages/happy-dom/src/validity-state/ValidityState.ts @@ -1,12 +1,10 @@ -import IHTMLButtonElement from '../nodes/html-button-element/IHTMLButtonElement.js'; +import HTMLButtonElement from '../nodes/html-button-element/HTMLButtonElement.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IHTMLFormElement from '../nodes/html-form-element/IHTMLFormElement.js'; +import HTMLFormElement from '../nodes/html-form-element/HTMLFormElement.js'; import HTMLInputElement from '../nodes/html-input-element/HTMLInputElement.js'; -import IHTMLInputElement from '../nodes/html-input-element/IHTMLInputElement.js'; -import IHTMLSelectElement from '../nodes/html-select-element/IHTMLSelectElement.js'; +import HTMLSelectElement from '../nodes/html-select-element/HTMLSelectElement.js'; import HTMLTextAreaElement from '../nodes/html-text-area-element/HTMLTextAreaElement.js'; -import IHTMLTextAreaElement from '../nodes/html-text-area-element/IHTMLTextAreaElement.js'; -import IShadowRoot from '../nodes/shadow-root/IShadowRoot.js'; +import ShadowRoot from '../nodes/shadow-root/ShadowRoot.js'; const EMAIL_REGEXP = /^([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x22([^\x0d\x22\x5c\x80-\xff]|\x5c[\x00-\x7f])*\x22))*\x40([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d)(\x2e([^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c\x3e\x40\x5b-\x5d\x7f-\xff]+|\x5b([^\x0d\x5b-\x5d\x80-\xff]|\x5c[\x00-\x7f])*\x5d))*$/; @@ -22,11 +20,7 @@ const URL_REGEXP = * @see https://developer.mozilla.org/en-US/docs/Web/API/ValidityState */ export default class ValidityState { - private element: - | IHTMLInputElement - | IHTMLTextAreaElement - | IHTMLSelectElement - | IHTMLButtonElement; + private element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement; /** * Constructor. @@ -34,7 +28,7 @@ export default class ValidityState { * @param element Input element. */ constructor( - element: IHTMLInputElement | IHTMLTextAreaElement | IHTMLSelectElement | IHTMLButtonElement + element: HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | HTMLButtonElement ) { this.element = element; } @@ -169,7 +163,7 @@ export default class ValidityState { * @returns "true" if valid. */ public get valueMissing(): boolean { - if (!(this.element).required) { + if (!(this.element).required) { return false; } if (this.element instanceof HTMLInputElement) { @@ -183,8 +177,8 @@ export default class ValidityState { return true; } const root = - this.element[PropertySymbol.formNode] || - this.element.getRootNode(); + this.element[PropertySymbol.formNode] || + this.element.getRootNode(); return !root || !root.querySelector(`input[name="${this.element.name}"]:checked`); } } diff --git a/packages/happy-dom/src/window/BrowserWindow.ts b/packages/happy-dom/src/window/BrowserWindow.ts index 7e15cb3f9..7a40289ab 100644 --- a/packages/happy-dom/src/window/BrowserWindow.ts +++ b/packages/happy-dom/src/window/BrowserWindow.ts @@ -9,7 +9,6 @@ import NodeFilter from '../tree-walker/NodeFilter.js'; import Text from '../nodes/text/Text.js'; import Comment from '../nodes/comment/Comment.js'; import ShadowRoot from '../nodes/shadow-root/ShadowRoot.js'; -import Element from '../nodes/element/Element.js'; import HTMLTemplateElement from '../nodes/html-template-element/HTMLTemplateElement.js'; import HTMLFormElementImplementation from '../nodes/html-form-element/HTMLFormElement.js'; import HTMLElement from '../nodes/html-element/HTMLElement.js'; @@ -85,7 +84,6 @@ import ErrorEvent from '../event/events/ErrorEvent.js'; import StorageEvent from '../event/events/StorageEvent.js'; import SubmitEvent from '../event/events/SubmitEvent.js'; import Screen from '../screen/Screen.js'; -import IResponse from '../fetch/types/IResponse.js'; import IRequestInit from '../fetch/types/IRequestInit.js'; import Storage from '../storage/Storage.js'; import HTMLCollection from '../nodes/element/HTMLCollection.js'; @@ -109,9 +107,8 @@ import XMLHttpRequestEventTarget from '../xml-http-request/XMLHttpRequestEventTa import Base64 from '../base64/Base64.js'; import Attr from '../nodes/attr/Attr.js'; import NamedNodeMap from '../named-node-map/NamedNodeMap.js'; -import IElement from '../nodes/element/IElement.js'; +import Element from '../nodes/element/Element.js'; import ProcessingInstruction from '../nodes/processing-instruction/ProcessingInstruction.js'; -import RequestInfo from '../fetch/types/IRequestInfo.js'; import FileList from '../nodes/html-input-element/FileList.js'; import Stream from 'stream'; import { ReadableStream } from 'stream/web'; @@ -122,7 +119,6 @@ import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; import RadioNodeList from '../nodes/html-form-element/RadioNodeList.js'; import ValidityState from '../validity-state/ValidityState.js'; import WindowErrorUtility from './WindowErrorUtility.js'; -import ICrossOriginBrowserWindow from './ICrossOriginBrowserWindow.js'; import Permissions from '../permissions/Permissions.js'; import PermissionStatus from '../permissions/PermissionStatus.js'; import Clipboard from '../clipboard/Clipboard.js'; @@ -142,7 +138,6 @@ import WindowPageOpenUtility from './WindowPageOpenUtility.js'; import IResponseBody from '../fetch/types/IResponseBody.js'; import IResponseInit from '../fetch/types/IResponseInit.js'; import IRequestInfo from '../fetch/types/IRequestInfo.js'; -import IBrowserWindow from './IBrowserWindow.js'; import BrowserErrorCaptureEnum from '../browser/enums/BrowserErrorCaptureEnum.js'; import AudioImplementation from '../nodes/html-audio-element/Audio.js'; import ImageImplementation from '../nodes/html-image-element/Image.js'; @@ -152,6 +147,9 @@ import FileReaderImplementation from '../file/FileReader.js'; import RequestImplementation from '../fetch/Request.js'; import ResponseImplementation from '../fetch/Response.js'; import RangeImplementation from '../range/Range.js'; +import INodeJSGlobal from './INodeJSGlobal.js'; +import CrossOriginBrowserWindow from './CrossOriginBrowserWindow.js'; +import Response from '../fetch/Response.js'; const TIMER = { setTimeout: globalThis.setTimeout.bind(globalThis), @@ -170,7 +168,7 @@ const IS_NODE_JS_TIMEOUT_ENVIRONMENT = setTimeout.toString().includes('new Timeo * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/Window. */ -export default class BrowserWindow extends EventTarget implements IBrowserWindow { +export default class BrowserWindow extends EventTarget implements INodeJSGlobal { // Nodes public readonly Node: typeof Node = Node; public readonly Attr: typeof Attr = Attr; @@ -225,7 +223,7 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow public readonly HTMLPreElement: typeof HTMLElement = HTMLElement; public readonly HTMLUListElement: typeof HTMLElement = HTMLElement; public readonly HTMLOListElement: typeof HTMLElement = HTMLElement; - public readonly HTMLLIElement: typeof HTMLElement = HTMLElement; + public readonly HTMLLElement: typeof HTMLElement = HTMLElement; public readonly HTMLMenuElement: typeof HTMLElement = HTMLElement; public readonly HTMLDListElement: typeof HTMLElement = HTMLElement; public readonly HTMLDivElement: typeof HTMLElement = HTMLElement; @@ -414,11 +412,11 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow public readonly history: History; public readonly navigator: Navigator; public readonly console: Console; - public readonly self: IBrowserWindow = this; - public readonly top: IBrowserWindow = this; - public readonly parent: IBrowserWindow = this; - public readonly window: IBrowserWindow = this; - public readonly globalThis: IBrowserWindow = this; + public readonly self: BrowserWindow = this; + public readonly top: BrowserWindow = this; + public readonly parent: BrowserWindow = this; + public readonly window: BrowserWindow = this; + public readonly globalThis: BrowserWindow = this; public readonly screen: Screen; public readonly sessionStorage: Storage; public readonly localStorage: Storage; @@ -680,7 +678,7 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow * * @returns Opener. */ - public get opener(): IBrowserWindow | ICrossOriginBrowserWindow | null { + public get opener(): BrowserWindow | CrossOriginBrowserWindow | null { return this.#browserFrame[PropertySymbol.openerWindow]; } @@ -843,7 +841,7 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow * @param element Element. * @returns CSS style declaration. */ - public getComputedStyle(element: IElement): CSSStyleDeclaration { + public getComputedStyle(element: Element): CSSStyleDeclaration { element[PropertySymbol.computedStyle] = element[PropertySymbol.computedStyle] || new CSSStyleDeclaration(element, true); return element[PropertySymbol.computedStyle]; @@ -928,7 +926,7 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow url?: string, target?: string, features?: string - ): IBrowserWindow | ICrossOriginBrowserWindow | null { + ): BrowserWindow | CrossOriginBrowserWindow | null { return WindowPageOpenUtility.openPage(this.#browserFrame, { url, target, @@ -1116,7 +1114,7 @@ export default class BrowserWindow extends EventTarget implements IBrowserWindow * @param [init] Init. * @returns Promise. */ - public async fetch(url: RequestInfo, init?: IRequestInit): Promise { + public async fetch(url: IRequestInfo, init?: IRequestInit): Promise { return await new Fetch({ browserFrame: this.#browserFrame, window: this, diff --git a/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts b/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts index 1f24c8683..c5df5673c 100644 --- a/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts +++ b/packages/happy-dom/src/window/CrossOriginBrowserWindow.ts @@ -1,23 +1,22 @@ import EventTarget from '../event/EventTarget.js'; -import IBrowserWindow from './IBrowserWindow.js'; +import BrowserWindow from './BrowserWindow.js'; import DOMException from '../exception/DOMException.js'; import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; import Location from '../location/Location.js'; -import ICrossOriginBrowserWindow from './ICrossOriginBrowserWindow.js'; /** * Browser window with limited access due to CORS restrictions in iframes. */ export default class CrossOriginBrowserWindow extends EventTarget - implements ICrossOriginBrowserWindow + implements CrossOriginBrowserWindow { public readonly self = this; public readonly window = this; - public readonly parent: IBrowserWindow | ICrossOriginBrowserWindow; - public readonly top: IBrowserWindow | ICrossOriginBrowserWindow; + public readonly parent: BrowserWindow | CrossOriginBrowserWindow; + public readonly top: BrowserWindow | CrossOriginBrowserWindow; public readonly location: Location; - #targetWindow: IBrowserWindow; + #targetWindow: BrowserWindow; /** * Constructor. @@ -25,7 +24,7 @@ export default class CrossOriginBrowserWindow * @param target Target window. * @param [parent] Parent window. */ - constructor(target: IBrowserWindow, parent?: IBrowserWindow) { + constructor(target: BrowserWindow, parent?: BrowserWindow) { super(); this.parent = parent ?? this; @@ -55,7 +54,7 @@ export default class CrossOriginBrowserWindow * * @returns Opener. */ - public get opener(): IBrowserWindow | ICrossOriginBrowserWindow | null { + public get opener(): BrowserWindow | CrossOriginBrowserWindow | null { return this.#targetWindow.opener; } diff --git a/packages/happy-dom/src/window/GlobalWindow.ts b/packages/happy-dom/src/window/GlobalWindow.ts index 437be0edf..3b2315b51 100644 --- a/packages/happy-dom/src/window/GlobalWindow.ts +++ b/packages/happy-dom/src/window/GlobalWindow.ts @@ -1,4 +1,3 @@ -import IWindow from './IWindow.js'; import * as PropertySymbol from '../PropertySymbol.js'; import Window from './Window.js'; import { Buffer } from 'buffer'; @@ -9,7 +8,7 @@ import { Buffer } from 'buffer'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/Window. */ -export default class GlobalWindow extends Window implements IWindow { +export default class GlobalWindow extends Window { // Node.js Globals public Array: typeof Array = globalThis.Array; public ArrayBuffer: typeof ArrayBuffer = globalThis.ArrayBuffer; diff --git a/packages/happy-dom/src/window/IBrowserWindow.ts b/packages/happy-dom/src/window/IBrowserWindow.ts deleted file mode 100644 index 3f5511cdb..000000000 --- a/packages/happy-dom/src/window/IBrowserWindow.ts +++ /dev/null @@ -1,595 +0,0 @@ -import CustomElementRegistry from '../custom-element/CustomElementRegistry.js'; -import * as PropertySymbol from '../PropertySymbol.js'; -import Document from '../nodes/document/Document.js'; -import IDocument from '../nodes/document/IDocument.js'; -import HTMLDocument from '../nodes/html-document/HTMLDocument.js'; -import XMLDocument from '../nodes/xml-document/XMLDocument.js'; -import SVGDocument from '../nodes/svg-document/SVGDocument.js'; -import DocumentType from '../nodes/document-type/DocumentType.js'; -import Node from '../nodes/node/Node.js'; -import Text from '../nodes/text/Text.js'; -import Comment from '../nodes/comment/Comment.js'; -import ShadowRoot from '../nodes/shadow-root/ShadowRoot.js'; -import Element from '../nodes/element/Element.js'; -import HTMLTemplateElement from '../nodes/html-template-element/HTMLTemplateElement.js'; -import HTMLFormElement from '../nodes/html-form-element/HTMLFormElement.js'; -import HTMLElement from '../nodes/html-element/HTMLElement.js'; -import HTMLUnknownElement from '../nodes/html-unknown-element/HTMLUnknownElement.js'; -import HTMLInputElement from '../nodes/html-input-element/HTMLInputElement.js'; -import HTMLSelectElement from '../nodes/html-select-element/HTMLSelectElement.js'; -import HTMLTextAreaElement from '../nodes/html-text-area-element/HTMLTextAreaElement.js'; -import HTMLLinkElement from '../nodes/html-link-element/HTMLLinkElement.js'; -import HTMLStyleElement from '../nodes/html-style-element/HTMLStyleElement.js'; -import HTMLSlotElement from '../nodes/html-slot-element/HTMLSlotElement.js'; -import HTMLLabelElement from '../nodes/html-label-element/HTMLLabelElement.js'; -import HTMLMetaElement from '../nodes/html-meta-element/HTMLMetaElement.js'; -import HTMLMediaElement from '../nodes/html-media-element/HTMLMediaElement.js'; -import HTMLAudioElement from '../nodes/html-audio-element/HTMLAudioElement.js'; -import HTMLVideoElement from '../nodes/html-video-element/HTMLVideoElement.js'; -import HTMLBaseElement from '../nodes/html-base-element/HTMLBaseElement.js'; -import HTMLIFrameElement from '../nodes/html-iframe-element/HTMLIFrameElement.js'; -import SVGSVGElement from '../nodes/svg-element/SVGSVGElement.js'; -import SVGElement from '../nodes/svg-element/SVGElement.js'; -import HTMLScriptElement from '../nodes/html-script-element/HTMLScriptElement.js'; -import HTMLDialogElement from '../nodes/html-dialog-element/HTMLDialogElement.js'; -import HTMLImageElement from '../nodes/html-image-element/HTMLImageElement.js'; -import Image from '../nodes/html-image-element/Image.js'; -import Audio from '../nodes/html-audio-element/Audio.js'; -import DocumentFragment from '../nodes/document-fragment/DocumentFragment.js'; -import CharacterData from '../nodes/character-data/CharacterData.js'; -import NodeIterator from '../tree-walker/NodeIterator.js'; -import TreeWalker from '../tree-walker/TreeWalker.js'; -import Event from '../event/Event.js'; -import CustomEvent from '../event/events/CustomEvent.js'; -import AnimationEvent from '../event/events/AnimationEvent.js'; -import KeyboardEvent from '../event/events/KeyboardEvent.js'; -import ProgressEvent from '../event/events/ProgressEvent.js'; -import MediaQueryListEvent from '../event/events/MediaQueryListEvent.js'; -import HashChangeEvent from '../event/events/HashChangeEvent.js'; -import TouchEvent from '../event/events/TouchEvent.js'; -import Touch from '../event/Touch.js'; -import EventTarget from '../event/EventTarget.js'; -import { URLSearchParams } from 'url'; -import URL from '../url/URL.js'; -import Location from '../location/Location.js'; -import MutationObserver from '../mutation-observer/MutationObserver.js'; -import MutationRecord from '../mutation-observer/MutationRecord.js'; -import DOMParser from '../dom-parser/DOMParser.js'; -import XMLSerializer from '../xml-serializer/XMLSerializer.js'; -import ResizeObserver from '../resize-observer/ResizeObserver.js'; -import Blob from '../file/Blob.js'; -import File from '../file/File.js'; -import DOMException from '../exception/DOMException.js'; -import FileReader from '../file/FileReader.js'; -import History from '../history/History.js'; -import CSSStyleSheet from '../css/CSSStyleSheet.js'; -import CSSStyleDeclaration from '../css/declaration/CSSStyleDeclaration.js'; -import CSS from '../css/CSS.js'; -import CSSUnitValue from '../css/CSSUnitValue.js'; -import CSSRule from '../css/CSSRule.js'; -import CSSContainerRule from '../css/rules/CSSContainerRule.js'; -import CSSFontFaceRule from '../css/rules/CSSFontFaceRule.js'; -import CSSKeyframeRule from '../css/rules/CSSKeyframeRule.js'; -import CSSKeyframesRule from '../css/rules/CSSKeyframesRule.js'; -import CSSMediaRule from '../css/rules/CSSMediaRule.js'; -import CSSStyleRule from '../css/rules/CSSStyleRule.js'; -import CSSSupportsRule from '../css/rules/CSSSupportsRule.js'; -import PointerEvent from '../event/events/PointerEvent.js'; -import MouseEvent from '../event/events/MouseEvent.js'; -import FocusEvent from '../event/events/FocusEvent.js'; -import WheelEvent from '../event/events/WheelEvent.js'; -import DataTransfer from '../event/DataTransfer.js'; -import DataTransferItem from '../event/DataTransferItem.js'; -import DataTransferItemList from '../event/DataTransferItemList.js'; -import InputEvent from '../event/events/InputEvent.js'; -import UIEvent from '../event/UIEvent.js'; -import ErrorEvent from '../event/events/ErrorEvent.js'; -import StorageEvent from '../event/events/StorageEvent.js'; -import SubmitEvent from '../event/events/SubmitEvent.js'; -import MessageEvent from '../event/events/MessageEvent.js'; -import MessagePort from '../event/MessagePort.js'; -import Screen from '../screen/Screen.js'; -import Storage from '../storage/Storage.js'; -import NodeFilter from '../tree-walker/NodeFilter.js'; -import HTMLCollection from '../nodes/element/HTMLCollection.js'; -import HTMLFormControlsCollection from '../nodes/html-form-element/HTMLFormControlsCollection.js'; -import NodeList from '../nodes/node/NodeList.js'; -import Selection from '../selection/Selection.js'; -import IEventTarget from '../event/IEventTarget.js'; -import Navigator from '../navigator/Navigator.js'; -import MimeType from '../navigator/MimeType.js'; -import MimeTypeArray from '../navigator/MimeTypeArray.js'; -import Plugin from '../navigator/Plugin.js'; -import PluginArray from '../navigator/PluginArray.js'; -import IRequestInit from '../fetch/types/IRequestInit.js'; -import IResponse from '../fetch/types/IResponse.js'; -import Range from '../range/Range.js'; -import MediaQueryList from '../match-media/MediaQueryList.js'; -import XMLHttpRequest from '../xml-http-request/XMLHttpRequest.js'; -import XMLHttpRequestUpload from '../xml-http-request/XMLHttpRequestUpload.js'; -import XMLHttpRequestEventTarget from '../xml-http-request/XMLHttpRequestEventTarget.js'; -import DOMRect from '../nodes/element/DOMRect.js'; -import Attr from '../nodes/attr/Attr.js'; -import NamedNodeMap from '../named-node-map/NamedNodeMap.js'; -import IElement from '../nodes/element/IElement.js'; -import SVGGraphicsElement from '../nodes/svg-element/SVGGraphicsElement.js'; -import ProcessingInstruction from '../nodes/processing-instruction/ProcessingInstruction.js'; -import RequestInfo from '../fetch/types/IRequestInfo.js'; -import FileList from '../nodes/html-input-element/FileList.js'; -import Stream from 'stream'; -import { ReadableStream } from 'stream/web'; -import { webcrypto } from 'crypto'; -import FormData from '../form-data/FormData.js'; -import AbortController from '../fetch/AbortController.js'; -import AbortSignal from '../fetch/AbortSignal.js'; -import RadioNodeList from '../nodes/html-form-element/RadioNodeList.js'; -import ValidityState from '../validity-state/ValidityState.js'; -import INodeJSGlobal from './INodeJSGlobal.js'; -import ICrossOriginBrowserWindow from './ICrossOriginBrowserWindow.js'; -import Permissions from '../permissions/Permissions.js'; -import PermissionStatus from '../permissions/PermissionStatus.js'; -import Clipboard from '../clipboard/Clipboard.js'; -import ClipboardItem from '../clipboard/ClipboardItem.js'; -import ClipboardEvent from '../event/events/ClipboardEvent.js'; -import Headers from '../fetch/Headers.js'; -import Request from '../fetch/Request.js'; -import Response from '../fetch/Response.js'; -import HTMLAnchorElement from '../nodes/html-anchor-element/HTMLAnchorElement.js'; -import HTMLButtonElement from '../nodes/html-button-element/HTMLButtonElement.js'; -import HTMLOptGroupElement from '../nodes/html-opt-group-element/HTMLOptGroupElement.js'; -import HTMLOptionElement from '../nodes/html-option-element/HTMLOptionElement.js'; -import IResponseBody from '../fetch/types/IResponseBody.js'; -import IResponseInit from '../fetch/types/IResponseInit.js'; -import BrowserWindow from './BrowserWindow.js'; - -/** - * Window without dependencies to server side specific packages. - */ -export default interface IBrowserWindow extends IEventTarget, INodeJSGlobal { - // Nodes - readonly Node: typeof Node; - readonly Attr: typeof Attr; - readonly SVGSVGElement: typeof SVGSVGElement; - readonly SVGElement: typeof SVGElement; - readonly SVGGraphicsElement: typeof SVGGraphicsElement; - readonly Text: typeof Text; - readonly Comment: typeof Comment; - readonly ShadowRoot: typeof ShadowRoot; - readonly Element: typeof Element; - readonly DocumentFragment: typeof DocumentFragment; - readonly CharacterData: typeof CharacterData; - readonly ProcessingInstruction: typeof ProcessingInstruction; - readonly Document: new () => Document; - readonly HTMLDocument: new () => HTMLDocument; - readonly XMLDocument: new () => XMLDocument; - readonly SVGDocument: new () => SVGDocument; - readonly DocumentType: typeof DocumentType; - - // Element classes - readonly HTMLAnchorElement: typeof HTMLAnchorElement; - readonly HTMLButtonElement: typeof HTMLButtonElement; - readonly HTMLOptGroupElement: typeof HTMLOptGroupElement; - readonly HTMLOptionElement: typeof HTMLOptionElement; - readonly HTMLElement: typeof HTMLElement; - readonly HTMLUnknownElement: typeof HTMLUnknownElement; - readonly HTMLTemplateElement: typeof HTMLTemplateElement; - readonly HTMLFormElement: typeof HTMLFormElement; - readonly HTMLInputElement: typeof HTMLInputElement; - readonly HTMLSelectElement: typeof HTMLSelectElement; - readonly HTMLTextAreaElement: typeof HTMLTextAreaElement; - readonly HTMLImageElement: typeof HTMLImageElement; - readonly HTMLScriptElement: typeof HTMLScriptElement; - readonly HTMLLinkElement: typeof HTMLLinkElement; - readonly HTMLStyleElement: typeof HTMLStyleElement; - readonly HTMLSlotElement: typeof HTMLSlotElement; - readonly HTMLLabelElement: typeof HTMLLabelElement; - readonly HTMLMetaElement: typeof HTMLMetaElement; - readonly HTMLMediaElement: typeof HTMLMediaElement; - readonly HTMLAudioElement: typeof HTMLAudioElement; - readonly HTMLVideoElement: typeof HTMLVideoElement; - readonly HTMLBaseElement: typeof HTMLBaseElement; - readonly HTMLIFrameElement: typeof HTMLIFrameElement; - readonly HTMLDialogElement: typeof HTMLDialogElement; - - /** - * Non-implemented element classes - */ - readonly HTMLHeadElement: typeof HTMLElement; - readonly HTMLTitleElement: typeof HTMLElement; - readonly HTMLBodyElement: typeof HTMLElement; - readonly HTMLHeadingElement: typeof HTMLElement; - readonly HTMLParagraphElement: typeof HTMLElement; - readonly HTMLHRElement: typeof HTMLElement; - readonly HTMLPreElement: typeof HTMLElement; - readonly HTMLUListElement: typeof HTMLElement; - readonly HTMLOListElement: typeof HTMLElement; - readonly HTMLLIElement: typeof HTMLElement; - readonly HTMLMenuElement: typeof HTMLElement; - readonly HTMLDListElement: typeof HTMLElement; - readonly HTMLDivElement: typeof HTMLElement; - readonly HTMLAreaElement: typeof HTMLElement; - readonly HTMLBRElement: typeof HTMLElement; - readonly HTMLCanvasElement: typeof HTMLElement; - readonly HTMLDataElement: typeof HTMLElement; - readonly HTMLDataListElement: typeof HTMLElement; - readonly HTMLDetailsElement: typeof HTMLElement; - readonly HTMLDirectoryElement: typeof HTMLElement; - readonly HTMLFieldSetElement: typeof HTMLElement; - readonly HTMLFontElement: typeof HTMLElement; - readonly HTMLHtmlElement: typeof HTMLElement; - readonly HTMLLegendElement: typeof HTMLElement; - readonly HTMLMapElement: typeof HTMLElement; - readonly HTMLMarqueeElement: typeof HTMLElement; - readonly HTMLMeterElement: typeof HTMLElement; - readonly HTMLModElement: typeof HTMLElement; - readonly HTMLOutputElement: typeof HTMLElement; - readonly HTMLPictureElement: typeof HTMLElement; - readonly HTMLProgressElement: typeof HTMLElement; - readonly HTMLQuoteElement: typeof HTMLElement; - readonly HTMLSourceElement: typeof HTMLElement; - readonly HTMLSpanElement: typeof HTMLElement; - readonly HTMLTableCaptionElement: typeof HTMLElement; - readonly HTMLTableCellElement: typeof HTMLElement; - readonly HTMLTableColElement: typeof HTMLElement; - readonly HTMLTableElement: typeof HTMLElement; - readonly HTMLTimeElement: typeof HTMLElement; - readonly HTMLTableRowElement: typeof HTMLElement; - readonly HTMLTableSectionElement: typeof HTMLElement; - readonly HTMLFrameElement: typeof HTMLElement; - readonly HTMLFrameSetElement: typeof HTMLElement; - readonly HTMLEmbedElement: typeof HTMLElement; - readonly HTMLObjectElement: typeof HTMLElement; - readonly HTMLParamElement: typeof HTMLElement; - readonly HTMLTrackElement: typeof HTMLElement; - - // Event classes - readonly Event: typeof Event; - readonly UIEvent: typeof UIEvent; - readonly CustomEvent: typeof CustomEvent; - readonly AnimationEvent: typeof AnimationEvent; - readonly KeyboardEvent: typeof KeyboardEvent; - readonly PointerEvent: typeof PointerEvent; - readonly MouseEvent: typeof MouseEvent; - readonly FocusEvent: typeof FocusEvent; - readonly WheelEvent: typeof WheelEvent; - readonly InputEvent: typeof InputEvent; - readonly ErrorEvent: typeof ErrorEvent; - readonly StorageEvent: typeof StorageEvent; - readonly SubmitEvent: typeof SubmitEvent; - readonly MessageEvent: typeof MessageEvent; - readonly MessagePort: typeof MessagePort; - readonly ProgressEvent: typeof ProgressEvent; - readonly MediaQueryListEvent: typeof MediaQueryListEvent; - readonly HashChangeEvent: typeof HashChangeEvent; - readonly ClipboardEvent: typeof ClipboardEvent; - readonly TouchEvent: typeof TouchEvent; - readonly Touch: typeof Touch; - - /** - * Non-implemented event classes - */ - readonly AudioProcessingEvent: typeof Event; - readonly BeforeInputEvent: typeof Event; - readonly BeforeUnloadEvent: typeof Event; - readonly BlobEvent: typeof Event; - readonly CloseEvent: typeof Event; - readonly CompositionEvent: typeof Event; - readonly CSSFontFaceLoadEvent: typeof Event; - readonly DeviceLightEvent: typeof Event; - readonly DeviceMotionEvent: typeof Event; - readonly DeviceOrientationEvent: typeof Event; - readonly DeviceProximityEvent: typeof Event; - readonly DOMTransactionEvent: typeof Event; - readonly DragEvent: typeof Event; - readonly EditingBeforeInputEvent: typeof Event; - readonly FetchEvent: typeof Event; - readonly GamepadEvent: typeof Event; - readonly IDBVersionChangeEvent: typeof Event; - readonly MediaStreamEvent: typeof Event; - readonly MutationEvent: typeof Event; - readonly OfflineAudioCompletionEvent: typeof Event; - readonly OverconstrainedError: typeof Event; - readonly PageTransitionEvent: typeof Event; - readonly PaymentRequestUpdateEvent: typeof Event; - readonly PopStateEvent: typeof Event; - readonly RelatedEvent: typeof Event; - readonly RTCDataChannelEvent: typeof Event; - readonly RTCIdentityErrorEvent: typeof Event; - readonly RTCIdentityEvent: typeof Event; - readonly RTCPeerConnectionIceEvent: typeof Event; - readonly SensorEvent: typeof Event; - readonly SVGEvent: typeof Event; - readonly SVGZoomEvent: typeof Event; - readonly TimeEvent: typeof Event; - readonly TrackEvent: typeof Event; - readonly TransitionEvent: typeof Event; - readonly UserProximityEvent: typeof Event; - readonly WebGLContextEvent: typeof Event; - readonly TextEvent: typeof Event; - - // Other classes - readonly Image: typeof Image; - readonly Audio: typeof Audio; - readonly NamedNodeMap: typeof NamedNodeMap; - readonly EventTarget: typeof EventTarget; - readonly DataTransfer: typeof DataTransfer; - readonly DataTransferItem: typeof DataTransferItem; - readonly DataTransferItemList: typeof DataTransferItemList; - readonly URL: typeof URL; - readonly URLSearchParams: typeof URLSearchParams; - readonly Location: typeof Location; - readonly CustomElementRegistry: typeof CustomElementRegistry; - readonly Window: typeof BrowserWindow; - readonly XMLSerializer: typeof XMLSerializer; - readonly ResizeObserver: typeof ResizeObserver; - readonly CSSStyleSheet: typeof CSSStyleSheet; - readonly Blob: typeof Blob; - readonly File: typeof File; - readonly FileReader: new () => FileReader; - readonly DOMException: typeof DOMException; - readonly History: typeof History; - readonly Screen: typeof Screen; - readonly Storage: typeof Storage; - readonly HTMLCollection: typeof HTMLCollection; - readonly HTMLFormControlsCollection: typeof HTMLFormControlsCollection; - readonly NodeList: typeof NodeList; - readonly CSSUnitValue: typeof CSSUnitValue; - readonly CSS: CSS; - readonly CSSRule: typeof CSSRule; - readonly CSSContainerRule: typeof CSSContainerRule; - readonly CSSFontFaceRule: typeof CSSFontFaceRule; - readonly CSSKeyframeRule: typeof CSSKeyframeRule; - readonly CSSKeyframesRule: typeof CSSKeyframesRule; - readonly CSSMediaRule: typeof CSSMediaRule; - readonly CSSStyleRule: typeof CSSStyleRule; - readonly CSSSupportsRule: typeof CSSSupportsRule; - readonly Selection: typeof Selection; - readonly Navigator: typeof Navigator; - readonly MimeType: typeof MimeType; - readonly MimeTypeArray: typeof MimeTypeArray; - readonly Plugin: typeof Plugin; - readonly PluginArray: typeof PluginArray; - readonly Headers: typeof Headers; - readonly Request: new (input: RequestInfo, init?: IRequestInit) => Request; - readonly Response: { - redirect: (url: string, status?: number) => Response; - error: () => Response; - json: (data: object, init?: IResponseInit) => Response; - new (body?: IResponseBody, init?: IResponseInit): Response; - }; - readonly Range: new () => Range; - readonly DOMRect: typeof DOMRect; - readonly XMLHttpRequest: new () => XMLHttpRequest; - readonly XMLHttpRequestUpload: typeof XMLHttpRequestUpload; - readonly XMLHttpRequestEventTarget: typeof XMLHttpRequestEventTarget; - readonly FileList: typeof FileList; - readonly ReadableStream: typeof ReadableStream; - readonly WritableStream: typeof Stream.Writable; - readonly TransformStream: typeof Stream.Transform; - readonly FormData: typeof FormData; - readonly AbortController: typeof AbortController; - readonly AbortSignal: typeof AbortSignal; - readonly RadioNodeList: typeof RadioNodeList; - readonly ValidityState: typeof ValidityState; - readonly Permissions: typeof Permissions; - readonly PermissionStatus: typeof PermissionStatus; - readonly Clipboard: typeof Clipboard; - readonly ClipboardItem: typeof ClipboardItem; - - readonly NodeFilter: typeof NodeFilter; - readonly NodeIterator: typeof NodeIterator; - readonly TreeWalker: typeof TreeWalker; - readonly DOMParser: new () => DOMParser; - readonly MutationObserver: typeof MutationObserver; - readonly MutationRecord: typeof MutationRecord; - readonly CSSStyleDeclaration: typeof CSSStyleDeclaration; - - // Events - onload: ((event: Event) => void) | null; - onerror: ((event: ErrorEvent) => void) | null; - - // Public Properties - readonly document: IDocument; - readonly customElements: CustomElementRegistry; - readonly location: Location; - readonly history: History; - readonly navigator: Navigator; - readonly console: Console; - readonly self: IBrowserWindow; - readonly top: IBrowserWindow | ICrossOriginBrowserWindow; - readonly opener: IBrowserWindow | ICrossOriginBrowserWindow | null; - readonly parent: IBrowserWindow | ICrossOriginBrowserWindow; - readonly window: IBrowserWindow; - readonly globalThis: IBrowserWindow; - readonly screen: Screen; - innerWidth: number; - innerHeight: number; - outerWidth: number; - outerHeight: number; - devicePixelRatio: number; - readonly screenLeft: number; - readonly screenTop: number; - readonly screenX: number; - readonly screenY: number; - readonly sessionStorage: Storage; - readonly localStorage: Storage; - readonly performance: typeof performance; - readonly pageXOffset: number; - readonly pageYOffset: number; - readonly scrollX: number; - readonly scrollY: number; - readonly crypto: typeof webcrypto; - readonly closed: boolean; - name: string; - - /** - * Returns an object containing the values of all CSS properties of an element. - * - * @param element Element. - * @returns CSS style declaration. - */ - getComputedStyle(element: IElement): CSSStyleDeclaration; - - /** - * Returns selection. - * - * @returns Selection. - */ - getSelection(): Selection; - - /** - * Scrolls to a particular set of coordinates. - * - * @param x X position or options object. - * @param y Y position. - */ - scroll(x: { top?: number; left?: number; behavior?: string } | number, y?: number): void; - - /** - * Scrolls to a particular set of coordinates. - * - * @param x X position or options object. - * @param y Y position. - */ - scrollTo(x: { top?: number; left?: number; behavior?: string } | number, y?: number): void; - - /** - * Shifts focus away from the window. - */ - blur(): void; - - /** - * Gives focus to the window. - */ - focus(): void; - - /** - * Loads a specified resource into a new or existing browsing context (that is, a tab, a window, or an iframe) under a specified name. - * - * @param [url] URL. - * @param [target] Target. - * @param [windowFeatures] Window features. - */ - open( - url?: string, - target?: string, - windowFeatures?: string - ): IBrowserWindow | ICrossOriginBrowserWindow | null; - - /** - * Closes the window. - */ - close(): void; - - /** - * Returns a new MediaQueryList object that can then be used to determine if the document matches the media query string. - * - * @param mediaQueryString A string specifying the media query to parse into a MediaQueryList. - * @returns A new MediaQueryList. - */ - matchMedia(mediaQueryString: string): MediaQueryList; - - /** - * Sets a timer which executes a function once the timer expires. - * - * @param callback Function to be executed. - * @param [delay=0] Delay in ms. - * @param args Arguments passed to the callback function. - * @returns Timeout ID. - */ - setTimeout(callback: Function, delay?: number, ...args: unknown[]): NodeJS.Timeout; - - /** - * Cancels a timeout previously established by calling setTimeout(). - * - * @param id ID of the timeout. - */ - clearTimeout(id: NodeJS.Timeout): void; - - /** - * Calls a function with a fixed time delay between each call. - * - * @param callback Function to be executed. - * @param [delay=0] Delay in ms. - * @param args Arguments passed to the callback function. - * @returns Interval ID. - */ - setInterval(callback: Function, delay?: number, ...args: unknown[]): NodeJS.Timeout; - - /** - * Cancels a timed repeating action which was previously established by a call to setInterval(). - * - * @param id ID of the interval. - */ - clearInterval(id: NodeJS.Timeout): void; - - /** - * Mock animation frames with timeouts. - * - * @param {Function} callback Callback. - * @returns {NodeJS.Timeout} ID. - */ - requestAnimationFrame(callback: (timestamp: number) => void): NodeJS.Immediate; - - /** - * Mock animation frames with timeouts. - * - * @param {NodeJS.Timeout} id ID. - */ - cancelAnimationFrame(id: NodeJS.Immediate): void; - - /** - * This method provides an easy, logical way to fetch resources asynchronously across the network. - * - * @param url URL. - * @param [init] Init. - * @returns Promise. - */ - fetch(url: RequestInfo, init?: IRequestInit): Promise; - - /** - * Creates a Base64-encoded ASCII string from a binary string (i.e., a string in which each character in the string is treated as a byte of binary data). - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/btoa - * @param data Binary data. - * @returns Base64-encoded string. - */ - btoa(data: unknown): string; - - /** - * Decodes a string of data which has been encoded using Base64 encoding. - * - * @see https://developer.mozilla.org/en-US/docs/Web/API/atob - * @see https://infra.spec.whatwg.org/#forgiving-base64-encode. - * @see Https://html.spec.whatwg.org/multipage/webappapis.html#btoa. - * @param data Binary string. - * @returns An ASCII string containing decoded data from encodedData. - */ - atob(data: unknown): string; - - /** - * Safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it spawned, or between a page and an iframe embedded within it. - * - * @param message Message. - * @param listener Listener. - */ - postMessage(message: unknown, targetOrigin?: string, transfer?: unknown[]): void; - - /** - * Resizes the window. - * - * @param width Width. - * @param height Height. - */ - resizeTo(width: number, height: number): void; - - /** - * Resizes the current window by a specified amount. - */ - resizeBy(width: number, height: number): void; - - /** - * Destroys the window. - */ - [PropertySymbol.destroy](): void; -} diff --git a/packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts b/packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts deleted file mode 100644 index 7c98770b4..000000000 --- a/packages/happy-dom/src/window/ICrossOriginBrowserWindow.ts +++ /dev/null @@ -1,40 +0,0 @@ -import IBrowserWindow from './IBrowserWindow.js'; -import Location from '../location/Location.js'; -import IEventTarget from '../event/IEventTarget.js'; - -/** - * Browser window with limited access due to CORS restrictions in iframes. - */ -export default interface ICrossOriginBrowserWindow extends IEventTarget { - readonly self: ICrossOriginBrowserWindow; - readonly window: ICrossOriginBrowserWindow; - readonly parent: IBrowserWindow | ICrossOriginBrowserWindow; - readonly top: IBrowserWindow | ICrossOriginBrowserWindow; - readonly location: Location; - readonly opener: IBrowserWindow | ICrossOriginBrowserWindow | null; - readonly closed: boolean; - - /** - * Shifts focus away from the window. - */ - blur(): void; - - /** - * Gives focus to the window. - */ - focus(): void; - - /** - * Closes the window. - */ - close(): void; - - /** - * Safely enables cross-origin communication between Window objects; e.g., between a page and a pop-up that it spawned, or between a page and an iframe embedded within it. - * - * @param message Message. - * @param [targetOrigin=*] Target origin. - * @param transfer Transfer. Not implemented. - */ - postMessage(message: unknown, targetOrigin?: string, transfer?: unknown[]): void; -} diff --git a/packages/happy-dom/src/window/IWindow.ts b/packages/happy-dom/src/window/IWindow.ts deleted file mode 100644 index dacd12a90..000000000 --- a/packages/happy-dom/src/window/IWindow.ts +++ /dev/null @@ -1,10 +0,0 @@ -import DetachedWindowAPI from './DetachedWindowAPI.js'; -import IBrowserWindow from './IBrowserWindow.js'; - -/** - * Window. - */ -export default interface IWindow extends IBrowserWindow { - // Detached Window API. - readonly happyDOM: DetachedWindowAPI; -} diff --git a/packages/happy-dom/src/window/Window.ts b/packages/happy-dom/src/window/Window.ts index bbfdeb065..6d19e1c8d 100644 --- a/packages/happy-dom/src/window/Window.ts +++ b/packages/happy-dom/src/window/Window.ts @@ -1,4 +1,3 @@ -import IWindow from './IWindow.js'; import DetachedWindowAPI from './DetachedWindowAPI.js'; import IOptionalBrowserSettings from '../browser/types/IOptionalBrowserSettings.js'; import BrowserWindow from './BrowserWindow.js'; @@ -10,7 +9,7 @@ import DetachedBrowser from '../browser/detached-browser/DetachedBrowser.js'; * Reference: * https://developer.mozilla.org/en-US/docs/Web/API/Window. */ -export default class Window extends BrowserWindow implements IWindow { +export default class Window extends BrowserWindow { // Detached Window API. public readonly happyDOM: DetachedWindowAPI; diff --git a/packages/happy-dom/src/window/WindowBrowserSettingsReader.ts b/packages/happy-dom/src/window/WindowBrowserSettingsReader.ts index a8b51b8a7..06a8fa9bf 100644 --- a/packages/happy-dom/src/window/WindowBrowserSettingsReader.ts +++ b/packages/happy-dom/src/window/WindowBrowserSettingsReader.ts @@ -1,6 +1,6 @@ import IBrowserSettings from '../browser/types/IBrowserSettings.js'; import * as PropertySymbol from '../PropertySymbol.js'; -import IBrowserWindow from './IBrowserWindow.js'; +import BrowserWindow from './BrowserWindow.js'; /** * Browser settings reader that will allow to read settings more securely as it is not possible to override a settings object to make DOM functionality act on it. @@ -14,7 +14,7 @@ export default class WindowBrowserSettingsReader { * @param window Window. * @returns Settings. */ - public static getSettings(window: IBrowserWindow): IBrowserSettings | null { + public static getSettings(window: BrowserWindow): IBrowserSettings | null { const id = window[PropertySymbol.happyDOMSettingsID]; if (id === undefined || !this.#settings[id]) { @@ -30,7 +30,7 @@ export default class WindowBrowserSettingsReader { * @param window Window. * @param settings Settings. */ - public static setSettings(window: IBrowserWindow, settings: IBrowserSettings): void { + public static setSettings(window: BrowserWindow, settings: IBrowserSettings): void { if (window[PropertySymbol.happyDOMSettingsID] !== undefined) { return; } @@ -43,7 +43,7 @@ export default class WindowBrowserSettingsReader { * * @param window Window. */ - public static removeSettings(window: IBrowserWindow): void { + public static removeSettings(window: BrowserWindow): void { const id = window[PropertySymbol.happyDOMSettingsID]; if (id !== undefined && this.#settings[id]) { diff --git a/packages/happy-dom/src/window/WindowErrorUtility.ts b/packages/happy-dom/src/window/WindowErrorUtility.ts index ae5fdf68c..c775ba496 100644 --- a/packages/happy-dom/src/window/WindowErrorUtility.ts +++ b/packages/happy-dom/src/window/WindowErrorUtility.ts @@ -1,7 +1,7 @@ -import IBrowserWindow from './IBrowserWindow.js'; +import BrowserWindow from './BrowserWindow.js'; import * as PropertySymbol from '../PropertySymbol.js'; import ErrorEvent from '../event/events/ErrorEvent.js'; -import IElement from '../nodes/element/IElement.js'; +import Element from '../nodes/element/Element.js'; /** * Error utility. @@ -19,7 +19,7 @@ export default class WindowErrorUtility { * @returns Result. */ public static captureError( - elementOrWindow: IBrowserWindow | IElement, + elementOrWindow: BrowserWindow | Element, callback: () => T, cleanup?: () => void ): T | null { @@ -52,15 +52,15 @@ export default class WindowErrorUtility { * @param elementOrWindow Element or Window. * @param error Error. */ - public static dispatchError(elementOrWindow: IBrowserWindow | IElement, error: Error): void { - if ((elementOrWindow).console) { - (elementOrWindow).console.error(error); + public static dispatchError(elementOrWindow: BrowserWindow | Element, error: Error): void { + if ((elementOrWindow).console) { + (elementOrWindow).console.error(error); elementOrWindow.dispatchEvent(new ErrorEvent('error', { message: error.message, error })); } else { - (elementOrWindow)[PropertySymbol.ownerDocument][ + (elementOrWindow)[PropertySymbol.ownerDocument][ PropertySymbol.defaultView ].console.error(error); - (elementOrWindow).dispatchEvent( + (elementOrWindow).dispatchEvent( new ErrorEvent('error', { message: error.message, error }) ); } diff --git a/packages/happy-dom/src/window/WindowPageOpenUtility.ts b/packages/happy-dom/src/window/WindowPageOpenUtility.ts index a49dcc1c8..26e977c5c 100644 --- a/packages/happy-dom/src/window/WindowPageOpenUtility.ts +++ b/packages/happy-dom/src/window/WindowPageOpenUtility.ts @@ -1,8 +1,7 @@ -import IBrowserWindow from './IBrowserWindow.js'; +import BrowserWindow from './BrowserWindow.js'; import CrossOriginBrowserWindow from './CrossOriginBrowserWindow.js'; import IBrowserFrame from '../browser/types/IBrowserFrame.js'; import FetchCORSUtility from '../fetch/utilities/FetchCORSUtility.js'; -import ICrossOriginBrowserWindow from './ICrossOriginBrowserWindow.js'; import BrowserFrameURL from '../browser/utilities/BrowserFrameURL.js'; import { URL } from 'url'; import * as PropertySymbol from '../PropertySymbol.js'; @@ -27,7 +26,7 @@ export default class WindowPageOpenUtility { target?: string; features?: string; } - ): IBrowserWindow | ICrossOriginBrowserWindow | null { + ): BrowserWindow | CrossOriginBrowserWindow | null { const features = this.getWindowFeatures(options?.features || ''); const target = options?.target !== undefined ? String(options.target) : null; const originURL = new URL(browserFrame.window.location.href); diff --git a/packages/happy-dom/src/xml-http-request/XMLHttpRequest.ts b/packages/happy-dom/src/xml-http-request/XMLHttpRequest.ts index 4bc42266b..b018bda94 100644 --- a/packages/happy-dom/src/xml-http-request/XMLHttpRequest.ts +++ b/packages/happy-dom/src/xml-http-request/XMLHttpRequest.ts @@ -2,7 +2,7 @@ import XMLHttpRequestEventTarget from './XMLHttpRequestEventTarget.js'; import * as PropertySymbol from '../PropertySymbol.js'; import XMLHttpRequestReadyStateEnum from './XMLHttpRequestReadyStateEnum.js'; import Event from '../event/Event.js'; -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; import Blob from '../file/Blob.js'; import XMLHttpRequestUpload from './XMLHttpRequestUpload.js'; import DOMException from '../exception/DOMException.js'; @@ -10,12 +10,11 @@ import DOMExceptionNameEnum from '../exception/DOMExceptionNameEnum.js'; import XMLHttpResponseTypeEnum from './XMLHttpResponseTypeEnum.js'; import ErrorEvent from '../event/events/ErrorEvent.js'; import IBrowserFrame from '../browser/types/IBrowserFrame.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import Headers from '../fetch/Headers.js'; import Fetch from '../fetch/Fetch.js'; import SyncFetch from '../fetch/SyncFetch.js'; import Request from '../fetch/Request.js'; -import IResponse from '../fetch/types/IResponse.js'; import ISyncResponse from '../fetch/types/ISyncResponse.js'; import AbortController from '../fetch/AbortController.js'; import ProgressEvent from '../event/events/ProgressEvent.js'; @@ -23,6 +22,7 @@ import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; import IRequestBody from '../fetch/types/IRequestBody.js'; import XMLHttpRequestResponseDataParser from './XMLHttpRequestResponseDataParser.js'; import FetchRequestHeaderUtility from '../fetch/utilities/FetchRequestHeaderUtility.js'; +import Response from '../fetch/Response.js'; /** * XMLHttpRequest. @@ -44,14 +44,14 @@ export default class XMLHttpRequest extends XMLHttpRequestEventTarget { // Private properties #browserFrame: IBrowserFrame; - #window: IBrowserWindow; + #window: BrowserWindow; #async = true; #abortController: AbortController | null = null; #aborted = false; #request: Request | null = null; - #response: IResponse | ISyncResponse | null = null; + #response: Response | ISyncResponse | null = null; #responseType: XMLHttpResponseTypeEnum | '' = ''; - #responseBody: ArrayBuffer | Blob | IDocument | object | string | null = null; + #responseBody: ArrayBuffer | Blob | Document | object | string | null = null; #readyState: XMLHttpRequestReadyStateEnum = XMLHttpRequestReadyStateEnum.unsent; /** @@ -61,7 +61,7 @@ export default class XMLHttpRequest extends XMLHttpRequestEventTarget { * @param injected.browserFrame Browser frame. * @param injected.window Window. */ - constructor(injected: { browserFrame: IBrowserFrame; window: IBrowserWindow }) { + constructor(injected: { browserFrame: IBrowserFrame; window: BrowserWindow }) { super(); this.#browserFrame = injected.browserFrame; this.#window = injected.window; @@ -90,7 +90,7 @@ export default class XMLHttpRequest extends XMLHttpRequestEventTarget { * * @returns Response. */ - public get response(): ArrayBuffer | Blob | IDocument | object | string | null { + public get response(): ArrayBuffer | Blob | Document | object | string | null { if (!this.#response) { return ''; } @@ -120,14 +120,14 @@ export default class XMLHttpRequest extends XMLHttpRequestEventTarget { * @throws {DOMException} If the response type is not text or empty. * @returns Response XML. */ - public get responseXML(): IDocument { + public get responseXML(): Document { if (this.responseType !== XMLHttpResponseTypeEnum.document && this.responseType !== '') { throw new DOMException( `Failed to read the 'responseXML' property from 'XMLHttpRequest': The value is only accessible if the object's 'responseType' is '' or 'document' (was '${this.responseType}').`, DOMExceptionNameEnum.invalidStateError ); } - return this.responseType === '' ? null : this.#responseBody; + return this.responseType === '' ? null : this.#responseBody; } /** @@ -285,7 +285,7 @@ export default class XMLHttpRequest extends XMLHttpRequestEventTarget { * * @param body Optional data to send as request body. */ - public send(body?: IDocument | IRequestBody): void { + public send(body?: Document | IRequestBody): void { if (this.readyState != XMLHttpRequestReadyStateEnum.opened) { throw new DOMException( `Failed to execute 'send' on 'XMLHttpRequest': Connection must be opened before send() is called.`, @@ -297,9 +297,9 @@ export default class XMLHttpRequest extends XMLHttpRequestEventTarget { if ( typeof body === 'object' && body !== null && - (body)[PropertySymbol.nodeType] === NodeTypeEnum.documentNode + (body)[PropertySymbol.nodeType] === NodeTypeEnum.documentNode ) { - body = (body).documentElement.outerHTML; + body = (body).documentElement.outerHTML; } if (this.#async) { diff --git a/packages/happy-dom/src/xml-http-request/XMLHttpRequestResponseDataParser.ts b/packages/happy-dom/src/xml-http-request/XMLHttpRequestResponseDataParser.ts index adc2e809e..bfebe8e9e 100644 --- a/packages/happy-dom/src/xml-http-request/XMLHttpRequestResponseDataParser.ts +++ b/packages/happy-dom/src/xml-http-request/XMLHttpRequestResponseDataParser.ts @@ -1,7 +1,7 @@ import XMLHttpResponseTypeEnum from './XMLHttpResponseTypeEnum.js'; -import IBrowserWindow from '../window/IBrowserWindow.js'; +import BrowserWindow from '../window/BrowserWindow.js'; import Blob from '../file/Blob.js'; -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; import { Buffer } from 'buffer'; /** @@ -19,11 +19,11 @@ export default class XMLHttpRequestResponseDataParser { * @returns Parsed response. **/ public static parse(options: { - window: IBrowserWindow; + window: BrowserWindow; responseType: string; data?: Buffer; contentType?: string; - }): ArrayBuffer | Blob | IDocument | object | string | null { + }): ArrayBuffer | Blob | Document | object | string | null { if (!options.data) { return ''; } diff --git a/packages/happy-dom/src/xml-parser/XMLParser.ts b/packages/happy-dom/src/xml-parser/XMLParser.ts index b05538409..ccf5d3084 100755 --- a/packages/happy-dom/src/xml-parser/XMLParser.ts +++ b/packages/happy-dom/src/xml-parser/XMLParser.ts @@ -1,12 +1,12 @@ -import IDocument from '../nodes/document/IDocument.js'; +import Document from '../nodes/document/Document.js'; import * as PropertySymbol from '../PropertySymbol.js'; import NamespaceURI from '../config/NamespaceURI.js'; import HTMLScriptElement from '../nodes/html-script-element/HTMLScriptElement.js'; -import IElement from '../nodes/element/IElement.js'; +import Element from '../nodes/element/Element.js'; import HTMLLinkElement from '../nodes/html-link-element/HTMLLinkElement.js'; -import IDocumentType from '../nodes/document-type/IDocumentType.js'; -import INode from '../nodes/node/INode.js'; -import IDocumentFragment from '../nodes/document-fragment/IDocumentFragment.js'; +import DocumentType from '../nodes/document-type/DocumentType.js'; +import Node from '../nodes/node/Node.js'; +import DocumentFragment from '../nodes/document-fragment/DocumentFragment.js'; import HTMLElementConfig from '../config/HTMLElementConfig.js'; import * as Entities from 'entities'; import HTMLElementConfigContentModelEnum from '../config/HTMLElementConfigContentModelEnum.js'; @@ -72,16 +72,16 @@ export default class XMLParser { * @returns Root node. */ public static parse( - document: IDocument, + document: Document, xml: string, - options?: { rootNode?: IElement | IDocumentFragment | IDocument; evaluateScripts?: boolean } - ): IElement | IDocumentFragment | IDocument { + options?: { rootNode?: Element | DocumentFragment | Document; evaluateScripts?: boolean } + ): Element | DocumentFragment | Document { const root = options && options.rootNode ? options.rootNode : document.createDocumentFragment(); - const stack: INode[] = [root]; + const stack: Node[] = [root]; const stackTagNames: string[] = []; const markupRegexp = new RegExp(MARKUP_REGEXP, 'gm'); const { evaluateScripts = false } = options || {}; - let currentNode: INode | null = root; + let currentNode: Node | null = root; let match: RegExpExecArray; let readState: MarkupReadStateEnum = MarkupReadStateEnum.startOrEndTag; let startTagIndex = 0; @@ -125,7 +125,7 @@ export default class XMLParser { stackTagNames.includes(tagName) ) { while (currentNode !== root) { - if ((currentNode)[PropertySymbol.tagName].toUpperCase() === tagName) { + if ((currentNode)[PropertySymbol.tagName].toUpperCase() === tagName) { stack.pop(); stackTagNames.pop(); currentNode = stack[stack.length - 1] || root; @@ -142,7 +142,7 @@ export default class XMLParser { const namespaceURI = tagName === 'SVG' ? NamespaceURI.svg - : (currentNode)[PropertySymbol.namespaceURI] || NamespaceURI.html; + : (currentNode)[PropertySymbol.namespaceURI] || NamespaceURI.html; const newElement = document.createElementNS(namespaceURI, localName); currentNode.appendChild(newElement); @@ -156,7 +156,7 @@ export default class XMLParser { if ( match[2].toUpperCase() === - (currentNode)[PropertySymbol.tagName]?.toUpperCase() + (currentNode)[PropertySymbol.tagName]?.toUpperCase() ) { stack.pop(); stackTagNames.pop(); @@ -166,7 +166,7 @@ export default class XMLParser { match[3] || match[4] || (match[6] && - (currentNode)[PropertySymbol.namespaceURI] === NamespaceURI.html) + (currentNode)[PropertySymbol.namespaceURI] === NamespaceURI.html) ) { // Comment. @@ -236,12 +236,12 @@ export default class XMLParser { // In XML and SVG namespaces, the attribute "xmlns" should be set to the "http://www.w3.org/2000/xmlns/" namespace. const namespaceURI = - (currentNode)[PropertySymbol.namespaceURI] === NamespaceURI.svg && + (currentNode)[PropertySymbol.namespaceURI] === NamespaceURI.svg && name === 'xmlns' ? NamespaceURI.xmlns : null; - (currentNode).setAttributeNS(namespaceURI, name, value); + (currentNode).setAttributeNS(namespaceURI, name, value); startTagIndex += attributeMatch[0].length; } else if ( @@ -260,7 +260,7 @@ export default class XMLParser { // We need to check if the attribute string is read completely. // The attribute string can potentially contain "/>" or ">". if (hasAttributeStringEnded) { - const config = HTMLElementConfig[(currentNode)[PropertySymbol.localName]]; + const config = HTMLElementConfig[(currentNode)[PropertySymbol.localName]]; // Checks if the tag is a self closing tag (ends with "/>") or void element. // When it is a self closing tag or void element it should be closed immediately. @@ -270,7 +270,7 @@ export default class XMLParser { config?.contentModel === HTMLElementConfigContentModelEnum.noDescendants || // SVG tag is self closing (). (match[7] && - (currentNode)[PropertySymbol.namespaceURI] === NamespaceURI.svg) + (currentNode)[PropertySymbol.namespaceURI] === NamespaceURI.svg) ) { stack.pop(); stackTagNames.pop(); @@ -342,7 +342,7 @@ export default class XMLParser { * @param value Value. * @returns Document type node. */ - private static getDocumentTypeNode(document: IDocument, value: string): IDocumentType { + private static getDocumentTypeNode(document: Document, value: string): DocumentType { if (!value.toUpperCase().startsWith('DOCTYPE')) { return null; } diff --git a/packages/happy-dom/src/xml-serializer/XMLSerializer.ts b/packages/happy-dom/src/xml-serializer/XMLSerializer.ts index 17eb2df6a..cec652d05 100644 --- a/packages/happy-dom/src/xml-serializer/XMLSerializer.ts +++ b/packages/happy-dom/src/xml-serializer/XMLSerializer.ts @@ -2,11 +2,9 @@ import Element from '../nodes/element/Element.js'; import * as PropertySymbol from '../PropertySymbol.js'; import Node from '../nodes/node/Node.js'; import DocumentType from '../nodes/document-type/DocumentType.js'; -import INode from '../nodes/node/INode.js'; -import IElement from '../nodes/element/IElement.js'; -import IHTMLTemplateElement from '../nodes/html-template-element/IHTMLTemplateElement.js'; +import HTMLTemplateElement from '../nodes/html-template-element/HTMLTemplateElement.js'; import NodeTypeEnum from '../nodes/node/NodeTypeEnum.js'; -import IProcessingInstruction from '../nodes/processing-instruction/IProcessingInstruction.js'; +import ProcessingInstruction from '../nodes/processing-instruction/ProcessingInstruction.js'; import * as Entities from 'entities'; import DocumentFragment from '../nodes/document-fragment/DocumentFragment.js'; import ShadowRoot from '../nodes/shadow-root/ShadowRoot.js'; @@ -47,7 +45,7 @@ export default class XMLSerializer { * @param root Root element. * @returns Result. */ - public serializeToString(root: INode): string { + public serializeToString(root: Node): string { switch (root[PropertySymbol.nodeType]) { case NodeTypeEnum.elementNode: const element = root; @@ -60,7 +58,7 @@ export default class XMLSerializer { const childNodes = localName === 'template' - ? ((root).content)[PropertySymbol.childNodes] + ? ((root).content)[PropertySymbol.childNodes] : (root)[PropertySymbol.childNodes]; let innerHTML = ''; @@ -92,7 +90,7 @@ export default class XMLSerializer { return ``; case NodeTypeEnum.processingInstructionNode: // TODO: Add support for processing instructions. - return ``; + return ``; case NodeTypeEnum.textNode: return this.options.escapeEntities ? Entities.escapeText(root.textContent) @@ -114,7 +112,7 @@ export default class XMLSerializer { * @param element Element. * @returns Attributes. */ - private getAttributes(element: IElement): string { + private getAttributes(element: Element): string { let attributeString = ''; if ( diff --git a/packages/happy-dom/test/AdoptedStyleSheetCustomElement.ts b/packages/happy-dom/test/AdoptedStyleSheetCustomElement.ts index 6a42c9cd0..0dc8460c9 100644 --- a/packages/happy-dom/test/AdoptedStyleSheetCustomElement.ts +++ b/packages/happy-dom/test/AdoptedStyleSheetCustomElement.ts @@ -1,4 +1,4 @@ -import IShadowRoot from '../src/nodes/shadow-root/IShadowRoot.js'; +import ShadowRoot from '../src/nodes/shadow-root/ShadowRoot.js'; import HTMLElement from '../src/nodes/html-element/HTMLElement.js'; import CSSStyleSheet from '../src/css/CSSStyleSheet.js'; @@ -13,7 +13,7 @@ export default class AdoptedStyleSheetCustomElement extends HTMLElement { oldValue: string | null; newValue: string | null; }> = []; - private internalShadowRoot: IShadowRoot; + private internalShadowRoot: ShadowRoot; /** * Constructor. diff --git a/packages/happy-dom/test/CustomElement.ts b/packages/happy-dom/test/CustomElement.ts index 399bd1990..0d6e0ed1e 100644 --- a/packages/happy-dom/test/CustomElement.ts +++ b/packages/happy-dom/test/CustomElement.ts @@ -1,4 +1,4 @@ -import IShadowRoot from '../src/nodes/shadow-root/IShadowRoot.js'; +import ShadowRoot from '../src/nodes/shadow-root/ShadowRoot.js'; import HTMLElement from '../src/nodes/html-element/HTMLElement.js'; /** @@ -12,7 +12,7 @@ export default class CustomElement extends HTMLElement { oldValue: string | null; newValue: string | null; }> = []; - private internalShadowRoot: IShadowRoot; + private internalShadowRoot: ShadowRoot; /** * Constructor. diff --git a/packages/happy-dom/test/browser/BrowserFrame.test.ts b/packages/happy-dom/test/browser/BrowserFrame.test.ts index 177f408fc..0339bcdbc 100644 --- a/packages/happy-dom/test/browser/BrowserFrame.test.ts +++ b/packages/happy-dom/test/browser/BrowserFrame.test.ts @@ -2,8 +2,8 @@ import { Script } from 'vm'; import Browser from '../../src/browser/Browser'; import Event from '../../src/event/Event'; import BrowserWindow from '../../src/window/BrowserWindow'; -import IRequest from '../../src/fetch/types/IRequest'; -import IResponse from '../../src/fetch/types/IResponse'; +import Request from '../../src/fetch/types/Request'; +import Response from '../../src/fetch/types/Response'; import { describe, it, expect, afterEach, vi } from 'vitest'; import Fetch from '../../src/fetch/Fetch'; import DOMException from '../../src/exception/DOMException'; @@ -12,7 +12,7 @@ import BrowserNavigationCrossOriginPolicyEnum from '../../src/browser/enums/Brow import BrowserFrameFactory from '../../src/browser/utilities/BrowserFrameFactory'; import BrowserErrorCaptureEnum from '../../src/browser/enums/BrowserErrorCaptureEnum'; import Headers from '../../src/fetch/Headers'; -import IHTMLAnchorElement from '../../src/nodes/html-anchor-element/IHTMLAnchorElement'; +import HTMLAnchorElement from '../../src/nodes/html-anchor-element/HTMLAnchorElement'; import * as PropertySymbol from '../../src/PropertySymbol'; describe('BrowserFrame', () => { @@ -139,9 +139,9 @@ describe('BrowserFrame', () => { describe('waitForNavigation()', () => { it('Waits page to have been navigated.', async () => { let count = 0; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { count++; - return Promise.resolve({ + return Promise.resolve({ text: () => new Promise((resolve) => setTimeout( @@ -206,10 +206,10 @@ describe('BrowserFrame', () => { describe('goto()', () => { it('Navigates to a URL.', async () => { - let request: IRequest | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + let request: Request | null = null; + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => setTimeout(() => resolve('Test'), 1)) @@ -224,9 +224,9 @@ describe('BrowserFrame', () => { referrerPolicy: 'no-referrer-when-downgrade' }); - expect((response).url).toBe('http://localhost:3000/'); - expect(((request)).referrer).toBe('http://localhost:3000/referrer'); - expect(((request)).referrerPolicy).toBe('no-referrer-when-downgrade'); + expect((response).url).toBe('http://localhost:3000/'); + expect(((request)).referrer).toBe('http://localhost:3000/referrer'); + expect(((request)).referrerPolicy).toBe('no-referrer-when-downgrade'); expect(page.mainFrame.url).toBe('http://localhost:3000/'); expect(page.mainFrame.window).not.toBe(oldWindow); expect(oldWindow.location.href).toBe('about:blank'); @@ -284,10 +284,10 @@ describe('BrowserFrame', () => { }); it('Handles error status code in response.', async () => { - let request: IRequest | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + let request: Request | null = null; + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, status: 404, statusText: 'Not Found', @@ -308,14 +308,14 @@ describe('BrowserFrame', () => { expect(page.mainFrame.window.location.href).toBe('http://localhost:3000/'); expect(page.mainFrame.window.document.body.innerHTML).toBe('404 error'); - expect(((response)).status).toBe(404); + expect(((response)).status).toBe(404); expect(page.virtualConsolePrinter.readAsString()).toBe( 'GET http://localhost:3000/ 404 (Not Found)\n' ); }); it('Handles reject when performing fetch.', async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Error')); }); @@ -337,7 +337,7 @@ describe('BrowserFrame', () => { }); it(`Doesn't navigate a child frame with a different origin from its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -362,8 +362,8 @@ describe('BrowserFrame', () => { }); it(`Navigates a child frame with the same origin as its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -389,7 +389,7 @@ describe('BrowserFrame', () => { }); it(`Doesn't navigate a popup with a different origin from its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -415,8 +415,8 @@ describe('BrowserFrame', () => { }); it(`Navigates a popup with the same origin as its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -443,7 +443,7 @@ describe('BrowserFrame', () => { }); it(`Doesn't navigate from one origin to another if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -467,8 +467,8 @@ describe('BrowserFrame', () => { }); it(`Navigates from "http" to "https" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -495,8 +495,8 @@ describe('BrowserFrame', () => { }); it(`Navigates from "https" to "https" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -523,8 +523,8 @@ describe('BrowserFrame', () => { }); it(`Navigates from "about" to "http" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -549,8 +549,8 @@ describe('BrowserFrame', () => { }); it(`Navigates from "https" to "about" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -577,7 +577,7 @@ describe('BrowserFrame', () => { }); it(`Doesn't navigate from "https" to "http" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -601,8 +601,8 @@ describe('BrowserFrame', () => { }); it(`Navigates child frames if the setting "navigation.disableChildFrameNavigation" is set to "false".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -627,7 +627,7 @@ describe('BrowserFrame', () => { }); it(`Doesn't navigate child frames if the setting "navigation.disableChildFrameNavigation" is set to "true".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -651,8 +651,8 @@ describe('BrowserFrame', () => { }); it(`Navigates child pages if the setting "navigation.disableChildPageNavigation" is set to "false".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -678,7 +678,7 @@ describe('BrowserFrame', () => { }); it(`Doesn't navigate child pages if the setting "navigation.disableChildPageNavigation" is set to "true".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -703,7 +703,7 @@ describe('BrowserFrame', () => { }); it(`Doesn't navigate the main frame if the setting "navigation.disableMainFrameNavigation" is set to "true".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -725,8 +725,8 @@ describe('BrowserFrame', () => { }); it(`Navigates the main frame if the setting "navigation.disableMainFrameNavigation" is set to "false".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); diff --git a/packages/happy-dom/test/browser/BrowserPage.test.ts b/packages/happy-dom/test/browser/BrowserPage.test.ts index 18d675bb9..13efc4014 100644 --- a/packages/happy-dom/test/browser/BrowserPage.test.ts +++ b/packages/happy-dom/test/browser/BrowserPage.test.ts @@ -3,7 +3,7 @@ import BrowserFrame from '../../src/browser/BrowserFrame'; import BrowserWindow from '../../src/window/BrowserWindow'; import VirtualConsolePrinter from '../../src/console/VirtualConsolePrinter'; import VirtualConsole from '../../src/console/VirtualConsole'; -import IResponse from '../../src/fetch/types/IResponse'; +import Response from '../../src/fetch/types/Response'; import { describe, it, expect, afterEach, vi } from 'vitest'; import IGoToOptions from '../../src/browser/types/IGoToOptions'; import BrowserFrameFactory from '../../src/browser/utilities/BrowserFrameFactory'; @@ -262,11 +262,11 @@ describe('BrowserPage', () => { vi.spyOn(page.mainFrame, 'goto').mockImplementation((url, options) => { usedURL = url; usedOptions = options; - return Promise.resolve({ url }); + return Promise.resolve({ url }); }); const response = await page.goto('http://localhost:3000', { timeout: 10000 }); - expect((response).url).toBe('http://localhost:3000'); + expect((response).url).toBe('http://localhost:3000'); expect(usedURL).toBe('http://localhost:3000'); expect(usedOptions).toEqual({ timeout: 10000 }); }); diff --git a/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts b/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts index efc66088d..bc5dce229 100644 --- a/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts +++ b/packages/happy-dom/test/browser/detached-browser/DetachedBrowserFrame.test.ts @@ -2,8 +2,8 @@ import { Script } from 'vm'; import DetachedBrowser from '../../../src/browser/detached-browser/DetachedBrowser'; import Event from '../../../src/event/Event'; import BrowserWindow from '../../../src/window/BrowserWindow'; -import IRequest from '../../../src/fetch/types/IRequest'; -import IResponse from '../../../src/fetch/types/IResponse'; +import Request from '../../../src/fetch/types/Request'; +import Response from '../../../src/fetch/types/Response'; import { describe, it, expect, afterEach, vi } from 'vitest'; import Fetch from '../../../src/fetch/Fetch'; import DOMException from '../../../src/exception/DOMException'; @@ -12,7 +12,7 @@ import BrowserNavigationCrossOriginPolicyEnum from '../../../src/browser/enums/B import BrowserFrameFactory from '../../../src/browser/utilities/BrowserFrameFactory'; import BrowserErrorCaptureEnum from '../../../src/browser/enums/BrowserErrorCaptureEnum'; import Headers from '../../../src/fetch/Headers'; -import IHTMLAnchorElement from '../../../src/nodes/html-anchor-element/IHTMLAnchorElement'; +import HTMLAnchorElement from '../../../src/nodes/html-anchor-element/HTMLAnchorElement'; import * as PropertySymbol from '../../../src/PropertySymbol'; describe('DetachedBrowserFrame', () => { @@ -166,9 +166,9 @@ describe('DetachedBrowserFrame', () => { describe('waitForNavigation()', () => { it('Waits page to have been navigated.', async () => { let count = 0; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { count++; - return Promise.resolve({ + return Promise.resolve({ text: () => new Promise((resolve) => setTimeout( @@ -242,10 +242,10 @@ describe('DetachedBrowserFrame', () => { describe('goto()', () => { it('Navigates to a URL.', async () => { - let request: IRequest | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + let request: Request | null = null; + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => setTimeout(() => resolve('Test'), 1)) @@ -263,9 +263,9 @@ describe('DetachedBrowserFrame', () => { referrerPolicy: 'no-referrer-when-downgrade' }); - expect((response).url).toBe('http://localhost:3000/'); - expect(((request)).referrer).toBe('http://localhost:3000/referrer'); - expect(((request)).referrerPolicy).toBe('no-referrer-when-downgrade'); + expect((response).url).toBe('http://localhost:3000/'); + expect(((request)).referrer).toBe('http://localhost:3000/referrer'); + expect(((request)).referrerPolicy).toBe('no-referrer-when-downgrade'); expect(page.mainFrame.url).toBe('http://localhost:3000/'); expect(page.mainFrame.window).not.toBe(oldWindow); expect(oldWindow.location.href).toBe('about:blank'); @@ -332,10 +332,10 @@ describe('DetachedBrowserFrame', () => { }); it('Handles error status code in response.', async () => { - let request: IRequest | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + let request: Request | null = null; + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, status: 404, statusText: 'Not Found', @@ -359,14 +359,14 @@ describe('DetachedBrowserFrame', () => { expect(page.mainFrame.window.location.href).toBe('http://localhost:3000/'); expect(page.mainFrame.window.document.body.innerHTML).toBe('404 error'); - expect(((response)).status).toBe(404); + expect(((response)).status).toBe(404); expect(page.virtualConsolePrinter.readAsString()).toBe( 'GET http://localhost:3000/ 404 (Not Found)\n' ); }); it('Handles reject when performing fetch.', async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Error')); }); @@ -391,7 +391,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate a child frame with a different origin from its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -419,8 +419,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates a child frame with the same origin as its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -449,7 +449,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate a popup with a different origin from its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -478,8 +478,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates a popup with the same origin as its parent if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -509,7 +509,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate from one origin to another if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.sameOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -536,8 +536,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates from "http" to "https" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -567,8 +567,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates from "https" to "https" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -598,8 +598,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates from "about" to "http" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -627,8 +627,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates from "https" to "about" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -658,7 +658,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate from "https" to "http" if the setting "navigation.crossOriginPolicy" is set to "${BrowserNavigationCrossOriginPolicyEnum.strictOrigin}".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -685,8 +685,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates child frames if the setting "navigation.disableChildFrameNavigation" is set to "false".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -714,7 +714,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate child frames if the setting "navigation.disableChildFrameNavigation" is set to "true".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -741,8 +741,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates child pages if the setting "navigation.disableChildPageNavigation" is set to "false".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -771,7 +771,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate child pages if the setting "navigation.disableChildPageNavigation" is set to "true".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -799,7 +799,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate the main frame if the setting "navigation.disableMainFrameNavigation" is set to "true".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -824,8 +824,8 @@ describe('DetachedBrowserFrame', () => { }); it(`Navigates the main frame if the setting "navigation.disableMainFrameNavigation" is set to "false".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); @@ -851,7 +851,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Doesn't navigate the main page frame of a detached browser.`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); @@ -875,7 +875,7 @@ describe('DetachedBrowserFrame', () => { }); it(`Sets URL when the main page frame of a detached browser if "disableFallbackToSetURL" is set to "false".`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Should not be called.')); }); diff --git a/packages/happy-dom/test/browser/detached-browser/DetachedBrowserPage.test.ts b/packages/happy-dom/test/browser/detached-browser/DetachedBrowserPage.test.ts index dbc9b7ecf..9aef3710f 100644 --- a/packages/happy-dom/test/browser/detached-browser/DetachedBrowserPage.test.ts +++ b/packages/happy-dom/test/browser/detached-browser/DetachedBrowserPage.test.ts @@ -4,7 +4,7 @@ import Window from '../../../src/window/Window'; import BrowserWindow from '../../../src/window/BrowserWindow'; import VirtualConsolePrinter from '../../../src/console/VirtualConsolePrinter'; import VirtualConsole from '../../../src/console/VirtualConsole'; -import IResponse from '../../../src/fetch/types/IResponse'; +import Response from '../../../src/fetch/types/Response'; import { describe, it, expect, afterEach, vi } from 'vitest'; import IGoToOptions from '../../../src/browser/types/IGoToOptions'; import BrowserFrameFactory from '../../../src/browser/utilities/BrowserFrameFactory'; @@ -275,11 +275,11 @@ describe('DetachedBrowserPage', () => { vi.spyOn(page.mainFrame, 'goto').mockImplementation((url, options) => { usedURL = url; usedOptions = options; - return Promise.resolve({ url }); + return Promise.resolve({ url }); }); const response = await page.goto('http://localhost:3000', { timeout: 10000 }); - expect((response).url).toBe('http://localhost:3000'); + expect((response).url).toBe('http://localhost:3000'); expect(usedURL).toBe('http://localhost:3000'); expect(usedOptions).toEqual({ timeout: 10000 }); }); diff --git a/packages/happy-dom/test/clipboard/Clipboard.test.ts b/packages/happy-dom/test/clipboard/Clipboard.test.ts index 7bb33c189..eb0993eff 100644 --- a/packages/happy-dom/test/clipboard/Clipboard.test.ts +++ b/packages/happy-dom/test/clipboard/Clipboard.test.ts @@ -1,11 +1,11 @@ import ClipboardItem from '../../src/clipboard/ClipboardItem.js'; import Blob from '../../src/file/Blob.js'; import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('Clipboard', () => { - let window: IWindow; + let window: Window; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/css/declaration/CSSStyleDeclaration.test.ts b/packages/happy-dom/test/css/declaration/CSSStyleDeclaration.test.ts index 102838797..0f2dc2aec 100644 --- a/packages/happy-dom/test/css/declaration/CSSStyleDeclaration.test.ts +++ b/packages/happy-dom/test/css/declaration/CSSStyleDeclaration.test.ts @@ -1,14 +1,14 @@ import CSSStyleDeclaration from '../../../src/css/declaration/CSSStyleDeclaration.js'; import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('CSSStyleDeclaration', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLElement; + let window: Window; + let document: Document; + let element: HTMLElement; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/css/declaration/element-style/CSSStyleDeclarationElementStyle.test.ts b/packages/happy-dom/test/css/declaration/element-style/CSSStyleDeclarationElementStyle.test.ts index aa0ecf684..98777d18c 100644 --- a/packages/happy-dom/test/css/declaration/element-style/CSSStyleDeclarationElementStyle.test.ts +++ b/packages/happy-dom/test/css/declaration/element-style/CSSStyleDeclarationElementStyle.test.ts @@ -1,14 +1,14 @@ import Window from '../../../../src/window/Window.js'; -import IWindow from '../../../../src/window/IWindow.js'; -import IDocument from '../../../../src/nodes/document/IDocument.js'; -import IHTMLElement from '../../../../src/nodes/html-element/IHTMLElement.js'; +import Window from '../../../../src/window/Window.js'; +import Document from '../../../../src/nodes/document/Document.js'; +import HTMLElement from '../../../../src/nodes/html-element/HTMLElement.js'; import CSSStyleDeclarationElementStyle from '../../../../src/css/declaration/element-style/CSSStyleDeclarationElementStyle.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('CSSStyleDeclarationElementStyle', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLElement; + let window: Window; + let document: Document; + let element: HTMLElement; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/custom-element/CustomElementRegistry.test.ts b/packages/happy-dom/test/custom-element/CustomElementRegistry.test.ts index c27c1e1a1..f5806e6af 100644 --- a/packages/happy-dom/test/custom-element/CustomElementRegistry.test.ts +++ b/packages/happy-dom/test/custom-element/CustomElementRegistry.test.ts @@ -1,7 +1,7 @@ import CustomElement from '../CustomElement.js'; import CustomElementRegistry from '../../src/custom-element/CustomElementRegistry.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import Window from '../../src/window/Window.js'; import DOMException from '../../src/exception/DOMException.js'; import { beforeEach, describe, it, expect } from 'vitest'; @@ -10,8 +10,8 @@ import NamespaceURI from '../../src/config/NamespaceURI.js'; describe('CustomElementRegistry', () => { let customElements; - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/dom-implementation/DOMImplementation.test.ts b/packages/happy-dom/test/dom-implementation/DOMImplementation.test.ts index 1b373fac5..5d2cbf9ae 100644 --- a/packages/happy-dom/test/dom-implementation/DOMImplementation.test.ts +++ b/packages/happy-dom/test/dom-implementation/DOMImplementation.test.ts @@ -1,11 +1,11 @@ import HTMLDocument from '../../src/nodes/html-document/HTMLDocument'; import XMLDocument from '../../src/nodes/xml-document/XMLDocument'; -import IWindow from '../../src/window/IWindow'; +import Window from '../../src/window/Window'; import Window from '../../src/window/Window'; import { beforeEach, describe, it, expect } from 'vitest'; describe('DOMImplementation', () => { - let window: IWindow; + let window: Window; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/dom-token-list/DOMTokenList.test.ts b/packages/happy-dom/test/dom-token-list/DOMTokenList.test.ts index 3951c7c7a..574ee8338 100644 --- a/packages/happy-dom/test/dom-token-list/DOMTokenList.test.ts +++ b/packages/happy-dom/test/dom-token-list/DOMTokenList.test.ts @@ -1,15 +1,15 @@ -import IWindow from '../../src/window/IWindow.js'; import Window from '../../src/window/Window.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; -import IElement from '../../src/nodes/element/IElement.js'; -import IDOMTokenList from '../../src/dom-token-list/IDOMTokenList.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; +import Element from '../../src/nodes/element/Element.js'; +import DOMTokenList from '../../src/dom-token-list/DOMTokenList.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('DOMTokenList', () => { - let window: IWindow; - let document: IDocument; - let element: IElement; - let classList: IDOMTokenList; + let window: Window; + let document: Document; + let element: Element; + let classList: DOMTokenList; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/event/Event.test.ts b/packages/happy-dom/test/event/Event.test.ts index ebb27855b..9c2d87a06 100644 --- a/packages/happy-dom/test/event/Event.test.ts +++ b/packages/happy-dom/test/event/Event.test.ts @@ -1,14 +1,14 @@ -import IWindow from '../../src/window/IWindow.js'; import Window from '../../src/window/Window.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import Event from '../../src/event/Event.js'; import CustomElement from '../CustomElement.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; -import IEventTarget from '../../src/event/IEventTarget.js'; +import EventTarget from '../../src/event/EventTarget.js'; describe('Event', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -173,7 +173,7 @@ describe('Event', () => { it('Returns a composed path.', () => { const div = document.createElement('div'); const span = document.createElement('span'); - let composedPath: IEventTarget[] | null = null; + let composedPath: EventTarget[] | null = null; div.appendChild(span); document.body.appendChild(div); @@ -188,19 +188,19 @@ describe('Event', () => { }) ); - expect(((composedPath)).length).toBe(6); - expect(((composedPath))[0] === span).toBe(true); - expect(((composedPath))[1] === div).toBe(true); - expect(((composedPath))[2] === document.body).toBe(true); - expect(((composedPath))[3] === document.documentElement).toBe(true); - expect(((composedPath))[4] === document).toBe(true); - expect(((composedPath))[5] === window).toBe(true); + expect(((composedPath)).length).toBe(6); + expect(((composedPath))[0] === span).toBe(true); + expect(((composedPath))[1] === div).toBe(true); + expect(((composedPath))[2] === document.body).toBe(true); + expect(((composedPath))[3] === document.documentElement).toBe(true); + expect(((composedPath))[4] === document).toBe(true); + expect(((composedPath))[5] === window).toBe(true); }); it('Goes through shadow roots if composed is set to "true".', () => { const div = document.createElement('div'); const customELement = document.createElement('custom-element'); - let composedPath: IEventTarget[] | null = null; + let composedPath: EventTarget[] | null = null; div.appendChild(customELement); @@ -217,26 +217,26 @@ describe('Event', () => { }) ); - expect(((composedPath)).length).toBe(9); + expect(((composedPath)).length).toBe(9); expect( - ((composedPath))[0] === + ((composedPath))[0] === customELement.shadowRoot.children[1].children[0] ).toBe(true); expect( - ((composedPath))[1] === customELement.shadowRoot.children[1] + ((composedPath))[1] === customELement.shadowRoot.children[1] ).toBe(true); - expect(((composedPath))[2] === customELement.shadowRoot).toBe(true); - expect(((composedPath))[3] === customELement).toBe(true); - expect(((composedPath))[4] === div).toBe(true); - expect(((composedPath))[5] === document.body).toBe(true); - expect(((composedPath))[6] === document.documentElement).toBe(true); - expect(((composedPath))[7] === document).toBe(true); - expect(((composedPath))[8] === window).toBe(true); + expect(((composedPath))[2] === customELement.shadowRoot).toBe(true); + expect(((composedPath))[3] === customELement).toBe(true); + expect(((composedPath))[4] === div).toBe(true); + expect(((composedPath))[5] === document.body).toBe(true); + expect(((composedPath))[6] === document.documentElement).toBe(true); + expect(((composedPath))[7] === document).toBe(true); + expect(((composedPath))[8] === window).toBe(true); }); it('Does not go through shadow roots if composed is set to "false".', () => { const customELement = document.createElement('custom-element'); - let composedPath: IEventTarget[] | null = null; + let composedPath: EventTarget[] | null = null; document.body.appendChild(customELement); @@ -250,21 +250,21 @@ describe('Event', () => { }) ); - expect(((composedPath)).length).toBe(3); + expect(((composedPath)).length).toBe(3); expect( - ((composedPath))[0] === + ((composedPath))[0] === customELement.shadowRoot.children[1].children[0] ).toBe(true); expect( - ((composedPath))[1] === customELement.shadowRoot.children[1] + ((composedPath))[1] === customELement.shadowRoot.children[1] ).toBe(true); - expect(((composedPath))[2] === customELement.shadowRoot).toBe(true); + expect(((composedPath))[2] === customELement.shadowRoot).toBe(true); }); it('Returns correct composed for HTMLAnchorElement event target and composed is set to "true".', () => { const anchor = document.createElement('a'); anchor.setAttribute('href', 'https://example.com'); - let composedPath: IEventTarget[] | null = null; + let composedPath: EventTarget[] | null = null; document.body.appendChild(anchor); @@ -279,12 +279,12 @@ describe('Event', () => { }) ); - expect(((composedPath)).length).toBe(5); - expect(((composedPath))[0] === anchor).toBe(true); - expect(((composedPath))[1] === document.body).toBe(true); - expect(((composedPath))[2] === document.documentElement).toBe(true); - expect(((composedPath))[3] === document).toBe(true); - expect(((composedPath))[4] === window).toBe(true); + expect(((composedPath)).length).toBe(5); + expect(((composedPath))[0] === anchor).toBe(true); + expect(((composedPath))[1] === document.body).toBe(true); + expect(((composedPath))[2] === document.documentElement).toBe(true); + expect(((composedPath))[3] === document).toBe(true); + expect(((composedPath))[4] === window).toBe(true); }); }); }); diff --git a/packages/happy-dom/test/event/events/SubmitEvent.test.ts b/packages/happy-dom/test/event/events/SubmitEvent.test.ts index 7fc9f32fc..c54072000 100644 --- a/packages/happy-dom/test/event/events/SubmitEvent.test.ts +++ b/packages/happy-dom/test/event/events/SubmitEvent.test.ts @@ -1,6 +1,6 @@ import Event from '../../../src/event/Event.js'; import SubmitEvent from '../../../src/event/events/SubmitEvent.js'; -import IHTMLButtonElement from '../../../src/nodes/html-button-element/IHTMLButtonElement.js'; +import HTMLButtonElement from '../../../src/nodes/html-button-element/HTMLButtonElement.js'; import Window from '../../../src/window/Window.js'; import { describe, it, expect } from 'vitest'; diff --git a/packages/happy-dom/test/fetch/Fetch.test.ts b/packages/happy-dom/test/fetch/Fetch.test.ts index fe5117513..395b58857 100644 --- a/packages/happy-dom/test/fetch/Fetch.test.ts +++ b/packages/happy-dom/test/fetch/Fetch.test.ts @@ -1,5 +1,5 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import Response from '../../src/fetch/Response.js'; import Headers from '../../src/fetch/Headers.js'; import DOMException from '../../src/exception/DOMException.js'; diff --git a/packages/happy-dom/test/fetch/Request.test.ts b/packages/happy-dom/test/fetch/Request.test.ts index 51b5fd235..8821df385 100644 --- a/packages/happy-dom/test/fetch/Request.test.ts +++ b/packages/happy-dom/test/fetch/Request.test.ts @@ -1,6 +1,6 @@ -import IWindow from '../../src/window/IWindow.js'; import Window from '../../src/window/Window.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import Request from '../../src/fetch/Request.js'; import URL from '../../src/url/URL.js'; import Headers from '../../src/fetch/Headers.js'; @@ -20,8 +20,8 @@ import * as PropertySymbol from '../../src/PropertySymbol.js'; const TEST_URL = 'https://example.com/'; describe('Request', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/fetch/ResourceFetch.test.ts b/packages/happy-dom/test/fetch/ResourceFetch.test.ts index 46035c3ca..fcae9ea97 100644 --- a/packages/happy-dom/test/fetch/ResourceFetch.test.ts +++ b/packages/happy-dom/test/fetch/ResourceFetch.test.ts @@ -1,6 +1,6 @@ -import IBrowserWindow from '../../src/window/IBrowserWindow.js'; +import BrowserWindow from '../../src/window/BrowserWindow.js'; import ResourceFetch from '../../src/fetch/ResourceFetch.js'; -import IResponse from '../../src/fetch/types/IResponse.js'; +import Response from '../../src/fetch/Response.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import Browser from '../../src/browser/Browser.js'; import Fetch from '../../src/fetch/Fetch.js'; @@ -11,7 +11,7 @@ import DOMException from '../../src/exception/DOMException.js'; const URL = 'https://localhost:8080/base/'; describe('ResourceFetch', () => { - let window: IBrowserWindow; + let window: BrowserWindow; let resourceFetch: ResourceFetch; beforeEach(() => { @@ -38,7 +38,7 @@ describe('ResourceFetch', () => { url: this.request.url, method: this.request.method }; - return { + return { text: () => Promise.resolve('test'), ok: true }; @@ -55,7 +55,7 @@ describe('ResourceFetch', () => { it('Handles error when resource is fetched asynchrounously.', async () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation(async function () { - return { + return { ok: false, status: 404, statusText: 'Not Found' diff --git a/packages/happy-dom/test/fetch/Response.test.ts b/packages/happy-dom/test/fetch/Response.test.ts index e11c4bb27..61937e821 100644 --- a/packages/happy-dom/test/fetch/Response.test.ts +++ b/packages/happy-dom/test/fetch/Response.test.ts @@ -10,16 +10,16 @@ import FetchBodyUtility from '../../src/fetch/utilities/FetchBodyUtility.js'; import Blob from '../../src/file/Blob.js'; import File from '../../src/file/File.js'; import FormData from '../../src/form-data/FormData.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; -import IWindow from '../../src/window/IWindow.js'; +import Document from '../../src/nodes/document/Document.js'; +import Window from '../../src/window/Window.js'; import Window from '../../src/window/Window.js'; import * as PropertySymbol from '../../src/PropertySymbol.js'; import { ReadableStream } from 'stream/web'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; describe('Response', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/fetch/SyncFetch.test.ts b/packages/happy-dom/test/fetch/SyncFetch.test.ts index ab4daa1f2..91d330174 100644 --- a/packages/happy-dom/test/fetch/SyncFetch.test.ts +++ b/packages/happy-dom/test/fetch/SyncFetch.test.ts @@ -1,4 +1,4 @@ -import IBrowserWindow from '../../src/window/IBrowserWindow.js'; +import BrowserWindow from '../../src/window/BrowserWindow.js'; import Headers from '../../src/fetch/Headers.js'; import DOMException from '../../src/exception/DOMException.js'; import DOMExceptionNameEnum from '../../src/exception/DOMExceptionNameEnum.js'; @@ -19,7 +19,7 @@ import '../types.d.js'; describe('SyncFetch', () => { let browserFrame: IBrowserFrame; - let window: IBrowserWindow; + let window: BrowserWindow; beforeEach(() => { const browser = new Browser(); diff --git a/packages/happy-dom/test/form-data/FormData.test.ts b/packages/happy-dom/test/form-data/FormData.test.ts index 5e6a82e29..d4f067c32 100644 --- a/packages/happy-dom/test/form-data/FormData.test.ts +++ b/packages/happy-dom/test/form-data/FormData.test.ts @@ -1,12 +1,12 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import File from '../../src/file/File.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('FormData', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/location/Location.test.ts b/packages/happy-dom/test/location/Location.test.ts index ba6ba4944..16a3d0ec2 100644 --- a/packages/happy-dom/test/location/Location.test.ts +++ b/packages/happy-dom/test/location/Location.test.ts @@ -2,7 +2,7 @@ import Browser from '../../src/browser/Browser.js'; import BrowserFrame from '../../src/browser/BrowserFrame.js'; import IBrowserFrame from '../../src/browser/types/IBrowserFrame.js'; import IGoToOptions from '../../src/browser/types/IGoToOptions.js'; -import IResponse from '../../src/fetch/types/IResponse.js'; +import Response from '../../src/fetch/Response.js'; import Location from '../../src/location/Location.js'; import { beforeEach, describe, it, expect, vi } from 'vitest'; import HashChangeEvent from '../../src/event/events/HashChangeEvent.js'; @@ -148,7 +148,7 @@ describe('Location', () => { let calledOptions: IGoToOptions | undefined = undefined; vi.spyOn(browserFrame, 'goto').mockImplementation( - async (url, options?: IGoToOptions): Promise => { + async (url, options?: IGoToOptions): Promise => { calledURL = url; calledOptions = options; return null; @@ -164,7 +164,7 @@ describe('Location', () => { it('Handles promise rejections.', async () => { const location = new Location(browserFrame, 'about:blank'); - vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { + vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { return Promise.reject(new Error('Test error')); }); @@ -321,7 +321,7 @@ describe('Location', () => { let calledOptions: IGoToOptions | undefined = undefined; vi.spyOn(browserFrame, 'goto').mockImplementation( - async (url, options?: IGoToOptions): Promise => { + async (url, options?: IGoToOptions): Promise => { calledURL = url; calledOptions = options; return null; @@ -337,7 +337,7 @@ describe('Location', () => { it('Handles promise rejections.', async () => { const location = new Location(browserFrame, 'about:blank'); - vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { + vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { return Promise.reject(new Error('Test error')); }); @@ -358,7 +358,7 @@ describe('Location', () => { let calledOptions: IGoToOptions | undefined = undefined; vi.spyOn(browserFrame, 'goto').mockImplementation( - async (url, options?: IGoToOptions): Promise => { + async (url, options?: IGoToOptions): Promise => { calledURL = url; calledOptions = options; return null; @@ -374,7 +374,7 @@ describe('Location', () => { it('Handles promise rejections.', async () => { const location = new Location(browserFrame, 'about:blank'); - vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { + vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { return Promise.reject(new Error('Test error')); }); @@ -395,7 +395,7 @@ describe('Location', () => { let calledOptions: IGoToOptions | undefined = undefined; vi.spyOn(browserFrame, 'goto').mockImplementation( - async (url, options?: IGoToOptions): Promise => { + async (url, options?: IGoToOptions): Promise => { calledURL = url; calledOptions = options; return null; @@ -411,7 +411,7 @@ describe('Location', () => { it('Handles promise rejections.', async () => { const location = new Location(browserFrame, 'about:blank'); - vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { + vi.spyOn(browserFrame, 'goto').mockImplementation((): Promise => { return Promise.reject(new Error('Test error')); }); diff --git a/packages/happy-dom/test/match-media/MediaQueryList.test.ts b/packages/happy-dom/test/match-media/MediaQueryList.test.ts index c70870ef2..4bb21831d 100644 --- a/packages/happy-dom/test/match-media/MediaQueryList.test.ts +++ b/packages/happy-dom/test/match-media/MediaQueryList.test.ts @@ -1,11 +1,11 @@ -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import Window from '../../src/window/Window.js'; import MediaQueryList from '../../src/match-media/MediaQueryList.js'; import MediaQueryListEvent from '../../src/event/events/MediaQueryListEvent.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('MediaQueryList', () => { - let window: IWindow; + let window: Window; beforeEach(() => { window = new Window({ width: 1024, height: 768 }); diff --git a/packages/happy-dom/test/named-node-map/NamedNodeMap.test.ts b/packages/happy-dom/test/named-node-map/NamedNodeMap.test.ts index f1e74852e..eb70917aa 100644 --- a/packages/happy-dom/test/named-node-map/NamedNodeMap.test.ts +++ b/packages/happy-dom/test/named-node-map/NamedNodeMap.test.ts @@ -1,18 +1,18 @@ -import IWindow from '../../src/window/IWindow.js'; import Window from '../../src/window/Window.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; -import IElement from '../../src/nodes/element/IElement.js'; -import INamedNodeMap from '../../src/named-node-map/INamedNodeMap.js'; -import IAttr from '../../src/nodes/attr/IAttr.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; +import Element from '../../src/nodes/element/Element.js'; +import NamedNodeMap from '../../src/named-node-map/NamedNodeMap.js'; +import Attr from '../../src/nodes/attr/Attr.js'; import DOMException from '../../src/exception/DOMException.js'; import DOMExceptionNameEnum from '../../src/exception/DOMExceptionNameEnum.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('NamedNodeMap', () => { - let window: IWindow; - let document: IDocument; - let element: IElement; - let attributes: INamedNodeMap; + let window: Window; + let document: Document; + let element: Element; + let attributes: NamedNodeMap; beforeEach(() => { window = new Window(); @@ -38,7 +38,7 @@ describe('NamedNodeMap', () => { element.setAttribute('key1', 'value1'); element.setAttribute('key2', 'value2'); - const attributeList: IAttr[] = []; + const attributeList: Attr[] = []; for (const attribute of attributes) { attributeList.push(attribute); diff --git a/packages/happy-dom/test/navigator/Navigator.test.ts b/packages/happy-dom/test/navigator/Navigator.test.ts index dc1054433..80050778a 100644 --- a/packages/happy-dom/test/navigator/Navigator.test.ts +++ b/packages/happy-dom/test/navigator/Navigator.test.ts @@ -1,12 +1,12 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import Navigator from '../../src/navigator/Navigator.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import Permissions from '../../src/permissions/Permissions.js'; import Clipboard from '../../src/clipboard/Clipboard.js'; import PackageVersion from '../../src/version.js'; -import IResponse from '../../src/fetch/types/IResponse.js'; -import IRequest from '../../src/fetch/types/IRequest.js'; +import Response from '../../src/fetch/Response.js'; +import Request from '../../src/fetch/Request.js'; import Fetch from '../../src/fetch/Fetch.js'; import Stream from 'stream'; @@ -54,7 +54,7 @@ const PROPERTIES = { }; describe('Window', () => { - let window: IWindow; + let window: Window; beforeEach(() => { window = new Window(); @@ -88,23 +88,23 @@ describe('Window', () => { describe('sendBeacon()', () => { it('Sends a beacon request.', async () => { const expectedURL = 'https://localhost:8080/path/'; - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - request = this.request; - return Promise.resolve({}); + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + request = this.request; + return Promise.resolve({}); }); window.navigator.sendBeacon(expectedURL, 'test-data'); const chunks: Buffer[] = []; - for await (const chunk of ((request)).body) { + for await (const chunk of ((request)).body) { chunks.push(Buffer.from(chunk)); } expect(Buffer.concat(chunks).toString()).toBe('test-data'); - expect(((request)).url).toBe(expectedURL); + expect(((request)).url).toBe(expectedURL); }); }); }); diff --git a/packages/happy-dom/test/nodes/document-fragment/DocumentFragment.test.ts b/packages/happy-dom/test/nodes/document-fragment/DocumentFragment.test.ts index 7d5b48ffe..380bc2cd7 100644 --- a/packages/happy-dom/test/nodes/document-fragment/DocumentFragment.test.ts +++ b/packages/happy-dom/test/nodes/document-fragment/DocumentFragment.test.ts @@ -1,21 +1,21 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; import DocumentFragment from '../../../src/nodes/document-fragment/DocumentFragment.js'; -import IDocumentFragment from '../../../src/nodes/document-fragment/IDocumentFragment.js'; +import DocumentFragment from '../../../src/nodes/document-fragment/DocumentFragment.js'; import Node from '../../../src/nodes/node/Node.js'; import ParentNodeUtility from '../../../src/nodes/parent-node/ParentNodeUtility.js'; import QuerySelector from '../../../src/query-selector/QuerySelector.js'; import HTMLTemplateElement from '../../../src/nodes/html-template-element/HTMLTemplateElement.js'; import Text from '../../../src/nodes/text/Text.js'; -import INodeList from '../../../src/nodes/node/INodeList.js'; -import IElement from '../../../src/nodes/element/IElement.js'; +import NodeList from '../../../src/nodes/node/NodeList.js'; +import Element from '../../../src/nodes/element/Element.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import * as PropertySymbol from '../../../src/PropertySymbol.js'; describe('DocumentFragment', () => { let window: Window; let document: Document; - let documentFragment: IDocumentFragment; + let documentFragment: DocumentFragment; beforeEach(() => { window = new Window(); @@ -184,7 +184,7 @@ describe('DocumentFragment', () => { vi.spyOn(QuerySelector, 'querySelectorAll').mockImplementation((parentNode, selector) => { expect(parentNode).toBe(documentFragment); expect(selector).toBe(expectedSelector); - return >[element]; + return >[element]; }); expect(Array.from(documentFragment.querySelectorAll(expectedSelector))).toEqual([element]); diff --git a/packages/happy-dom/test/nodes/document/Document.test.ts b/packages/happy-dom/test/nodes/document/Document.test.ts index ce9e1ae60..bc4015625 100644 --- a/packages/happy-dom/test/nodes/document/Document.test.ts +++ b/packages/happy-dom/test/nodes/document/Document.test.ts @@ -1,5 +1,5 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; +import Window from '../../../src/window/Window.js'; import CustomElement from '../../CustomElement.js'; import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; import Text from '../../../src/nodes/text/Text.js'; @@ -8,7 +8,7 @@ import DocumentFragment from '../../../src/nodes/document-fragment/DocumentFragm import NodeIterator from '../../../src/tree-walker/NodeIterator.js'; import TreeWalker from '../../../src/tree-walker/TreeWalker.js'; import Node from '../../../src/nodes/node/Node.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Document from '../../../src/nodes/document/Document.js'; import Document from '../../../src/nodes/document/Document.js'; import Element from '../../../src/nodes/element/Element.js'; import Event from '../../../src/event/Event.js'; @@ -20,24 +20,24 @@ import ParentNodeUtility from '../../../src/nodes/parent-node/ParentNodeUtility. import QuerySelector from '../../../src/query-selector/QuerySelector.js'; import NodeFilter from '../../../src/tree-walker/NodeFilter.js'; import HTMLTemplateElement from '../../../src/nodes/html-template-element/HTMLTemplateElement.js'; -import IHTMLCollection from '../../../src/nodes/element/IHTMLCollection.js'; -import IElement from '../../../src/nodes/element/IElement.js'; -import INodeList from '../../../src/nodes/node/INodeList.js'; -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; -import IHTMLLinkElement from '../../../src/nodes/html-link-element/IHTMLLinkElement.js'; -import IResponse from '../../../src/fetch/types/IResponse.js'; +import HTMLCollection from '../../../src/nodes/element/HTMLCollection.js'; +import Element from '../../../src/nodes/element/Element.js'; +import NodeList from '../../../src/nodes/node/NodeList.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; +import HTMLLinkElement from '../../../src/nodes/html-link-element/HTMLLinkElement.js'; +import Response from '../../../src/fetch/Response.js'; import ResourceFetch from '../../../src/fetch/ResourceFetch.js'; -import IHTMLScriptElement from '../../../src/nodes/html-script-element/IHTMLScriptElement.js'; +import HTMLScriptElement from '../../../src/nodes/html-script-element/HTMLScriptElement.js'; import DocumentReadyStateEnum from '../../../src/nodes/document/DocumentReadyStateEnum.js'; -import ISVGElement from '../../../src/nodes/svg-element/ISVGElement.js'; +import SVGElement from '../../../src/nodes/svg-element/SVGElement.js'; import CustomEvent from '../../../src/event/events/CustomEvent.js'; import Selection from '../../../src/selection/Selection.js'; import Range from '../../../src/range/Range.js'; import ProcessingInstruction from '../../../src/nodes/processing-instruction/ProcessingInstruction.js'; import DOMException from '../../../src/exception/DOMException.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; -import IShadowRoot from '../../../src/nodes/shadow-root/IShadowRoot.js'; -import IBrowserWindow from '../../../src/window/IBrowserWindow.js'; +import ShadowRoot from '../../../src/nodes/shadow-root/ShadowRoot.js'; +import BrowserWindow from '../../../src/window/BrowserWindow.js'; import Fetch from '../../../src/fetch/Fetch.js'; import * as PropertySymbol from '../../../src/PropertySymbol.js'; import HTMLUnknownElement from '../../../src/nodes/html-unknown-element/HTMLUnknownElement.js'; @@ -45,8 +45,8 @@ import HTMLUnknownElement from '../../../src/nodes/html-unknown-element/HTMLUnkn /* eslint-disable jsdoc/require-jsdoc */ describe('Document', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -298,7 +298,7 @@ describe('Document', () => { it('Returns and sets title.', () => { document.title = 'test title'; expect(document.title).toBe('test title'); - const title = document.head.querySelector('title'); + const title = document.head.querySelector('title'); expect(title.textContent).toBe('test title'); document.title = 'new title'; expect(document.title).toBe('new title'); @@ -347,7 +347,7 @@ describe('Document', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation(function () { fetchedUrl = this.request.url; - return >Promise.resolve({ + return >Promise.resolve({ text: () => Promise.resolve('button { background-color: red }'), ok: true }); @@ -423,7 +423,7 @@ describe('Document', () => { } public connectedCallback(): void { - (this.shadowRoot).innerHTML = ` + (this.shadowRoot).innerHTML = `
@@ -437,7 +437,7 @@ describe('Document', () => { } public connectedCallback(): void { - (this.shadowRoot).innerHTML = ` + (this.shadowRoot).innerHTML = `
@@ -453,8 +453,8 @@ describe('Document', () => { div.appendChild(customElementA); document.body.appendChild(div); - const button = ( - (( + const button = ( + (( customElementA.shadowRoot.querySelector('custom-element-b') )).shadowRoot.querySelector('button') ); @@ -578,7 +578,7 @@ describe('Document', () => { vi.spyOn(QuerySelector, 'querySelectorAll').mockImplementation((parentNode, selector) => { expect(parentNode === document).toBe(true); expect(selector).toEqual(expectedSelector); - return >[element]; + return >[element]; }); const result = document.querySelectorAll(expectedSelector); @@ -612,7 +612,7 @@ describe('Document', () => { (parentNode, requestedClassName) => { expect(parentNode === document).toBe(true); expect(requestedClassName).toEqual(className); - return >[element]; + return >[element]; } ); @@ -631,7 +631,7 @@ describe('Document', () => { (parentNode, requestedTagName) => { expect(parentNode === document).toBe(true); expect(requestedTagName).toEqual(tagName); - return >[element]; + return >[element]; } ); @@ -652,7 +652,7 @@ describe('Document', () => { expect(parentNode === document).toBe(true); expect(requestedNamespaceURI).toEqual(namespaceURI); expect(requestedTagName).toEqual(tagName); - return >([element]); + return >([element]); } ); @@ -983,13 +983,13 @@ describe('Document', () => { }); it('Creates an SVG element and can set style on it.', () => { - const element = document.createElementNS(NamespaceURI.svg, 'svg'); + const element = document.createElementNS(NamespaceURI.svg, 'svg'); element.style.cssText = 'user-select:none;'; expect(element.style.cssText).toBe('user-select: none;'); }); it("Creates an element when tag name isn't a string.", () => { - const element = ( + const element = ( document.createElementNS((null), (true)) ); expect(element.tagName).toBe('TRUE'); @@ -1238,9 +1238,9 @@ describe('Document', () => { const jsURL = 'https://localhost:8080/path/to/file.js'; const cssResponse = 'body { background-color: red; }'; const jsResponse = 'globalThis.test = "test";'; - let resourceFetchCSSWindow: IBrowserWindow | null = null; + let resourceFetchCSSWindow: BrowserWindow | null = null; let resourceFetchCSSURL: string | null = null; - let resourceFetchJSWindow: IBrowserWindow | null = null; + let resourceFetchJSWindow: BrowserWindow | null = null; let resourceFetchJSURL: string | null = null; let readyChangeEvent: Event | null = null; @@ -1260,11 +1260,11 @@ describe('Document', () => { readyChangeEvent = event; }); - const script = document.createElement('script'); + const script = document.createElement('script'); script.async = true; script.src = jsURL; - const link = document.createElement('link'); + const link = document.createElement('link'); link.href = cssURL; link.rel = 'stylesheet'; diff --git a/packages/happy-dom/test/nodes/element/Element.test.ts b/packages/happy-dom/test/nodes/element/Element.test.ts index af6369fdd..4ed5b7005 100644 --- a/packages/happy-dom/test/nodes/element/Element.test.ts +++ b/packages/happy-dom/test/nodes/element/Element.test.ts @@ -1,10 +1,10 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; +import Window from '../../../src/window/Window.js'; import XMLSerializer from '../../../src/xml-serializer/XMLSerializer.js'; import XMLParser from '../../../src/xml-parser/XMLParser.js'; import CustomElement from '../../CustomElement.js'; import ShadowRoot from '../../../src/nodes/shadow-root/ShadowRoot.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Document from '../../../src/nodes/document/Document.js'; import Text from '../../../src/nodes/text/Text.js'; import DOMRect from '../../../src/nodes/element/DOMRect.js'; import NamespaceURI from '../../../src/config/NamespaceURI.js'; @@ -14,27 +14,27 @@ import ChildNodeUtility from '../../../src/nodes/child-node/ChildNodeUtility.js' import NonDocumentChildNodeUtility from '../../../src/nodes/child-node/NonDocumentChildNodeUtility.js'; import HTMLTemplateElement from '../../../src/nodes/html-template-element/HTMLTemplateElement.js'; import Node from '../../../src/nodes/node/Node.js'; -import IHTMLCollection from '../../../src/nodes/element/IHTMLCollection.js'; -import IElement from '../../../src/nodes/element/IElement.js'; +import HTMLCollection from '../../../src/nodes/element/HTMLCollection.js'; +import Element from '../../../src/nodes/element/Element.js'; import Element from '../../../src/nodes/element/Element.js'; -import INodeList from '../../../src/nodes/node/INodeList.js'; -import IAttr from '../../../src/nodes/attr/IAttr.js'; +import NodeList from '../../../src/nodes/node/NodeList.js'; +import Attr from '../../../src/nodes/attr/Attr.js'; import Event from '../../../src/event/Event.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; -import INode from '../../../src/nodes/node/INode.js'; +import Node from '../../../src/nodes/node/Node.js'; import * as PropertySymbol from '../../../src/PropertySymbol.js'; const NAMESPACE_URI = 'https://test.test'; describe('Element', () => { - let window: IWindow; - let document: IDocument; - let element: IElement; + let window: Window; + let document: Document; + let element: Element; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('div'); + element = document.createElement('div'); window.customElements.define('custom-element', CustomElement); }); @@ -454,7 +454,7 @@ describe('Element', () => { document.body.appendChild(parent); - const insertedNode = parent.insertAdjacentElement('beforebegin', newNode); + const insertedNode = parent.insertAdjacentElement('beforebegin', newNode); expect(insertedNode === newNode).toBe(true); expect(parent.childNodes.length).toEqual(0); @@ -480,7 +480,7 @@ describe('Element', () => { document.body.appendChild(parent); - const insertedNode = parent.insertAdjacentElement('afterbegin', newNode); + const insertedNode = parent.insertAdjacentElement('afterbegin', newNode); expect(insertedNode === newNode).toBe(true); expect(parent.childNodes[0] === insertedNode).toBe(true); @@ -495,7 +495,7 @@ describe('Element', () => { parent.appendChild(child); document.body.appendChild(parent); - const insertedNode = parent.insertAdjacentElement('beforeend', newNode); + const insertedNode = parent.insertAdjacentElement('beforeend', newNode); expect(insertedNode === newNode).toBe(true); expect(parent.childNodes[1] === insertedNode).toBe(true); @@ -508,7 +508,7 @@ describe('Element', () => { document.body.appendChild(parent); - const insertedNode = parent.insertAdjacentElement('afterend', newNode); + const insertedNode = parent.insertAdjacentElement('afterend', newNode); expect(insertedNode === newNode).toBe(true); expect(parent.childNodes.length).toEqual(0); @@ -556,7 +556,7 @@ describe('Element', () => { parent.insertAdjacentHTML('beforebegin', markup); expect(parent.childNodes.length).toBe(0); - expect((document.body.childNodes[0]).outerHTML).toEqual(markup); + expect((document.body.childNodes[0]).outerHTML).toEqual(markup); }); it('Inserts the given HTML inside the reference element before the first child.', () => { @@ -568,7 +568,7 @@ describe('Element', () => { document.body.appendChild(parent); parent.insertAdjacentHTML('afterbegin', markup); - expect((parent.childNodes[0]).outerHTML).toEqual(markup); + expect((parent.childNodes[0]).outerHTML).toEqual(markup); expect(parent.childNodes[1] === child).toBe(true); }); @@ -582,7 +582,7 @@ describe('Element', () => { parent.insertAdjacentHTML('beforeend', markup); expect(parent.childNodes[0] === child).toBe(true); - expect((parent.childNodes[1]).outerHTML).toEqual(markup); + expect((parent.childNodes[1]).outerHTML).toEqual(markup); }); it('Inserts the given HTML right after the reference element.', () => { @@ -594,7 +594,7 @@ describe('Element', () => { expect(parent.childNodes.length).toEqual(0); expect(document.body.childNodes[0] === parent).toBe(true); - expect((document.body.childNodes[1]).outerHTML).toEqual(markup); + expect((document.body.childNodes[1]).outerHTML).toEqual(markup); }); it('Inserts the given HTML right after the reference element if it has a sibling.', () => { @@ -608,7 +608,7 @@ describe('Element', () => { expect(parent.childNodes.length).toBe(0); expect(document.body.childNodes[0] === parent).toBe(true); - expect((document.body.childNodes[1]).outerHTML).toEqual(markup); + expect((document.body.childNodes[1]).outerHTML).toEqual(markup); expect(document.body.childNodes[2] === sibling).toBe(true); }); }); @@ -838,7 +838,7 @@ describe('Element', () => { vi.spyOn(QuerySelector, 'querySelectorAll').mockImplementation((parentNode, selector) => { expect(parentNode).toBe(document); expect(selector).toEqual(expectedSelector); - return >[element]; + return >[element]; }); const result = document.querySelectorAll(expectedSelector); @@ -871,7 +871,7 @@ describe('Element', () => { (parentNode, requestedClassName) => { expect(parentNode).toBe(element); expect(requestedClassName).toEqual(className); - return >[child]; + return >[child]; } ); @@ -890,7 +890,7 @@ describe('Element', () => { (parentNode, requestedTagName) => { expect(parentNode).toBe(element); expect(requestedTagName).toEqual(tagName); - return >[child]; + return >[child]; } ); @@ -911,7 +911,7 @@ describe('Element', () => { expect(parentNode).toBe(element); expect(requestedNamespaceURI).toEqual(namespaceURI); expect(requestedTagName).toEqual(tagName); - return >[child]; + return >[child]; } ); @@ -1116,8 +1116,8 @@ describe('Element', () => { div.innerHTML = ''; - const a = div.querySelector('#a'); - const b = div.querySelector('#b'); + const a = div.querySelector('#a'); + const b = div.querySelector('#b'); div.insertBefore(a, b); @@ -1588,33 +1588,33 @@ describe('Element', () => { expect(element.attributes.length).toBe(2); - expect((element.attributes[0]).name).toBe('key1'); - expect((element.attributes[0]).namespaceURI).toBe(NamespaceURI.svg); - expect((element.attributes[0]).value).toBe('value1'); - expect((element.attributes[0]).specified).toBe(true); - expect((element.attributes[0]).ownerElement).toBe(element); - expect((element.attributes[0]).ownerDocument).toBe(document); - - expect((element.attributes[1]).name).toBe('key2'); - expect((element.attributes[1]).namespaceURI).toBe(null); - expect((element.attributes[1]).value).toBe('value2'); - expect((element.attributes[1]).specified).toBe(true); - expect((element.attributes[1]).ownerElement).toBe(element); - expect((element.attributes[1]).ownerDocument).toBe(document); - - expect((element.attributes['key1']).name).toBe('key1'); - expect((element.attributes['key1']).namespaceURI).toBe(NamespaceURI.svg); - expect((element.attributes['key1']).value).toBe('value1'); - expect((element.attributes['key1']).specified).toBe(true); - expect((element.attributes['key1']).ownerElement).toBe(element); - expect((element.attributes['key1']).ownerDocument).toBe(document); - - expect((element.attributes['key2']).name).toBe('key2'); - expect((element.attributes['key2']).namespaceURI).toBe(null); - expect((element.attributes['key2']).value).toBe('value2'); - expect((element.attributes['key2']).specified).toBe(true); - expect((element.attributes['key2']).ownerElement).toBe(element); - expect((element.attributes['key2']).ownerDocument).toBe(document); + expect((element.attributes[0]).name).toBe('key1'); + expect((element.attributes[0]).namespaceURI).toBe(NamespaceURI.svg); + expect((element.attributes[0]).value).toBe('value1'); + expect((element.attributes[0]).specified).toBe(true); + expect((element.attributes[0]).ownerElement).toBe(element); + expect((element.attributes[0]).ownerDocument).toBe(document); + + expect((element.attributes[1]).name).toBe('key2'); + expect((element.attributes[1]).namespaceURI).toBe(null); + expect((element.attributes[1]).value).toBe('value2'); + expect((element.attributes[1]).specified).toBe(true); + expect((element.attributes[1]).ownerElement).toBe(element); + expect((element.attributes[1]).ownerDocument).toBe(document); + + expect((element.attributes['key1']).name).toBe('key1'); + expect((element.attributes['key1']).namespaceURI).toBe(NamespaceURI.svg); + expect((element.attributes['key1']).value).toBe('value1'); + expect((element.attributes['key1']).specified).toBe(true); + expect((element.attributes['key1']).ownerElement).toBe(element); + expect((element.attributes['key1']).ownerDocument).toBe(document); + + expect((element.attributes['key2']).name).toBe('key2'); + expect((element.attributes['key2']).namespaceURI).toBe(null); + expect((element.attributes['key2']).value).toBe('value2'); + expect((element.attributes['key2']).specified).toBe(true); + expect((element.attributes['key2']).ownerElement).toBe(element); + expect((element.attributes['key2']).ownerDocument).toBe(document); }); it('Sets an Attr node on an element.', () => { @@ -1630,33 +1630,33 @@ describe('Element', () => { expect(svg.attributes.length).toBe(2); - expect((svg.attributes[0]).name).toBe('KEY1'); - expect((svg.attributes[0]).namespaceURI).toBe(NamespaceURI.svg); - expect((svg.attributes[0]).value).toBe('value1'); - expect((svg.attributes[0]).specified).toBe(true); - expect((svg.attributes[0]).ownerElement).toBe(svg); - expect((svg.attributes[0]).ownerDocument).toBe(document); - - expect((svg.attributes[1]).name).toBe('key2'); - expect((svg.attributes[1]).namespaceURI).toBe(null); - expect((svg.attributes[1]).value).toBe('value2'); - expect((svg.attributes[1]).specified).toBe(true); - expect((svg.attributes[1]).ownerElement).toBe(svg); - expect((svg.attributes[1]).ownerDocument).toBe(document); - - expect((svg.attributes['KEY1']).name).toBe('KEY1'); - expect((svg.attributes['KEY1']).namespaceURI).toBe(NamespaceURI.svg); - expect((svg.attributes['KEY1']).value).toBe('value1'); - expect((svg.attributes['KEY1']).specified).toBe(true); - expect((svg.attributes['KEY1']).ownerElement).toBe(svg); - expect((svg.attributes['KEY1']).ownerDocument).toBe(document); - - expect((svg.attributes['key2']).name).toBe('key2'); - expect((svg.attributes['key2']).namespaceURI).toBe(null); - expect((svg.attributes['key2']).value).toBe('value2'); - expect((svg.attributes['key2']).specified).toBe(true); - expect((svg.attributes['key2']).ownerElement).toBe(svg); - expect((svg.attributes['key2']).ownerDocument).toBe(document); + expect((svg.attributes[0]).name).toBe('KEY1'); + expect((svg.attributes[0]).namespaceURI).toBe(NamespaceURI.svg); + expect((svg.attributes[0]).value).toBe('value1'); + expect((svg.attributes[0]).specified).toBe(true); + expect((svg.attributes[0]).ownerElement).toBe(svg); + expect((svg.attributes[0]).ownerDocument).toBe(document); + + expect((svg.attributes[1]).name).toBe('key2'); + expect((svg.attributes[1]).namespaceURI).toBe(null); + expect((svg.attributes[1]).value).toBe('value2'); + expect((svg.attributes[1]).specified).toBe(true); + expect((svg.attributes[1]).ownerElement).toBe(svg); + expect((svg.attributes[1]).ownerDocument).toBe(document); + + expect((svg.attributes['KEY1']).name).toBe('KEY1'); + expect((svg.attributes['KEY1']).namespaceURI).toBe(NamespaceURI.svg); + expect((svg.attributes['KEY1']).value).toBe('value1'); + expect((svg.attributes['KEY1']).specified).toBe(true); + expect((svg.attributes['KEY1']).ownerElement).toBe(svg); + expect((svg.attributes['KEY1']).ownerDocument).toBe(document); + + expect((svg.attributes['key2']).name).toBe('key2'); + expect((svg.attributes['key2']).namespaceURI).toBe(null); + expect((svg.attributes['key2']).value).toBe('value2'); + expect((svg.attributes['key2']).specified).toBe(true); + expect((svg.attributes['key2']).ownerElement).toBe(svg); + expect((svg.attributes['key2']).ownerDocument).toBe(document); }); }); } diff --git a/packages/happy-dom/test/nodes/html-anchor-element/HTMLAnchorElement.test.ts b/packages/happy-dom/test/nodes/html-anchor-element/HTMLAnchorElement.test.ts index 3444b6ecf..979fedb60 100644 --- a/packages/happy-dom/test/nodes/html-anchor-element/HTMLAnchorElement.test.ts +++ b/packages/happy-dom/test/nodes/html-anchor-element/HTMLAnchorElement.test.ts @@ -1,17 +1,17 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLAnchorElement from '../../../src/nodes/html-anchor-element/IHTMLAnchorElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLAnchorElement from '../../../src/nodes/html-anchor-element/HTMLAnchorElement.js'; import { beforeEach, describe, it, expect, vi } from 'vitest'; import PointerEvent from '../../../src/event/events/PointerEvent.js'; -import IRequest from '../../../src/fetch/types/IRequest.js'; -import IResponse from '../../../src/fetch/types/IResponse.js'; +import Request from '../../../src/fetch/Request.js'; +import Response from '../../../src/fetch/Response.js'; import Fetch from '../../../src/fetch/Fetch.js'; import Browser from '../../../src/browser/Browser.js'; describe('HTMLAnchorElement', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window({ url: 'https://www.somesite.com/test.html' }); @@ -53,69 +53,69 @@ describe('HTMLAnchorElement', () => { describe('get href()', () => { it('Returns the "href" attribute.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'test'); expect(element.href).toBe('https://www.somesite.com/test'); }); it('Returns the "href" attribute when scheme is http.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'http://www.example.com'); expect(element.href).toBe('http://www.example.com/'); }); it('Returns the "href" attribute when scheme is tel.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'tel:+123456789'); expect(element.href).toBe('tel:+123456789'); }); it('Returns the "href" attribute when scheme-relative', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', '//example.com'); expect(element.href).toBe('https://example.com/'); }); it('Returns empty string if "href" attribute is empty.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); expect(element.href).toBe(''); }); }); describe('toString()', () => { it('Returns the "href" attribute.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'test'); expect(element.toString()).toBe('https://www.somesite.com/test'); }); it('Returns the "href" attribute when scheme is http.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'http://www.example.com'); expect(element.toString()).toBe('http://www.example.com/'); }); it('Returns the "href" attribute when scheme is tel.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'tel:+123456789'); expect(element.toString()).toBe('tel:+123456789'); }); it('Returns the "href" attribute when scheme-relative', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', '//example.com'); expect(element.toString()).toBe('https://example.com/'); }); it('Returns empty string if "href" attribute is empty.', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); expect(element.toString()).toBe(''); }); }); describe('set href()', () => { it('Sets the attribute "href".', () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.href = 'test'; expect(element.getAttribute('href')).toBe('test'); }); @@ -123,19 +123,19 @@ describe('HTMLAnchorElement', () => { describe('get origin()', () => { it("Returns the href URL's origin.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.origin).toBe('https://www.example.com'); }); it("Returns the href URL's origin with port when non-standard.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'http://www.example.com:8080/path?q1=a#xyz'); expect(element.origin).toBe('http://www.example.com:8080'); }); it("Returns the page's origin when href is relative.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', '/path?q1=a#xyz'); expect(element.origin).toBe('https://www.somesite.com'); }); @@ -143,7 +143,7 @@ describe('HTMLAnchorElement', () => { describe('get protocol()', () => { it("Returns the href URL's protocol.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.protocol).toBe('https:'); }); @@ -151,7 +151,7 @@ describe('HTMLAnchorElement', () => { describe('set protocol()', () => { it("Sets the href URL's protocol.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.protocol).toBe('https:'); @@ -164,7 +164,7 @@ describe('HTMLAnchorElement', () => { describe('get username()', () => { it("Returns the href URL's username.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://user:pw@www.example.com:443/path?q1=a#xyz'); expect(element.username).toBe('user'); }); @@ -172,7 +172,7 @@ describe('HTMLAnchorElement', () => { describe('set username()', () => { it("Sets the href URL's username.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://user:pw@www.example.com:443/path?q1=a#xyz'); expect(element.username).toBe('user'); @@ -185,7 +185,7 @@ describe('HTMLAnchorElement', () => { describe('get password()', () => { it("Returns the href URL's password.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://user:pw@www.example.com:443/path?q1=a#xyz'); expect(element.password).toBe('pw'); }); @@ -193,7 +193,7 @@ describe('HTMLAnchorElement', () => { describe('set password()', () => { it("Sets the href URL's password.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://user:pw@www.example.com:443/path?q1=a#xyz'); expect(element.password).toBe('pw'); @@ -206,7 +206,7 @@ describe('HTMLAnchorElement', () => { describe('get host()', () => { it("Returns the href URL's host.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.host).toBe('www.example.com'); }); @@ -214,7 +214,7 @@ describe('HTMLAnchorElement', () => { describe('set host()', () => { it("Sets the href URL's host.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.host).toBe('www.example.com'); @@ -227,7 +227,7 @@ describe('HTMLAnchorElement', () => { describe('get hostname()', () => { it("Returns the href URL's hostname.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.hostname).toBe('www.example.com'); }); @@ -235,7 +235,7 @@ describe('HTMLAnchorElement', () => { describe('set hostname()', () => { it("Sets the href URL's hostname.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.hostname).toBe('www.example.com'); @@ -248,7 +248,7 @@ describe('HTMLAnchorElement', () => { describe('get port()', () => { it("Returns the href URL's port.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.port).toBe(''); @@ -259,7 +259,7 @@ describe('HTMLAnchorElement', () => { describe('set port()', () => { it("Sets the href URL's port.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.port).toBe(''); @@ -272,7 +272,7 @@ describe('HTMLAnchorElement', () => { describe('get pathname()', () => { it("Returns the href URL's pathname.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.pathname).toBe('/path'); }); @@ -280,7 +280,7 @@ describe('HTMLAnchorElement', () => { describe('set pathname()', () => { it("Sets the href URL's pathname.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.pathname).toBe('/path'); @@ -293,7 +293,7 @@ describe('HTMLAnchorElement', () => { describe('get search()', () => { it("Returns the href URL's search.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.search).toBe('?q1=a'); }); @@ -301,7 +301,7 @@ describe('HTMLAnchorElement', () => { describe('set search()', () => { it("Sets the href URL's search.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.search).toBe('?q1=a'); @@ -314,7 +314,7 @@ describe('HTMLAnchorElement', () => { describe('get hash()', () => { it("Returns the href URL's hash.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.hash).toBe('#xyz'); }); @@ -322,7 +322,7 @@ describe('HTMLAnchorElement', () => { describe('set hash()', () => { it("Sets the href URL's hash.", () => { - const element = document.createElement('a'); + const element = document.createElement('a'); element.setAttribute('href', 'https://www.example.com:443/path?q1=a#xyz'); expect(element.hash).toBe('#xyz'); @@ -339,13 +339,13 @@ describe('HTMLAnchorElement', () => { const page = browser.newPage(); const window = page.mainFrame.window; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); - const element = window.document.createElement('a'); + const element = window.document.createElement('a'); element.href = 'https://www.example.com'; window.document.body.appendChild(element); element.dispatchEvent(new PointerEvent('click')); @@ -369,13 +369,13 @@ describe('HTMLAnchorElement', () => { const page = browser.newPage(); const window = page.mainFrame.window; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); - const element = window.document.createElement('a'); + const element = window.document.createElement('a'); element.href = 'https://www.example.com'; element.target = '_blank'; window.document.body.appendChild(element); @@ -400,13 +400,13 @@ describe('HTMLAnchorElement', () => { const page = browser.newPage(); const window = page.mainFrame.window; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); - const element = window.document.createElement('a'); + const element = window.document.createElement('a'); element.href = 'https://www.example.com'; element.dispatchEvent(new PointerEvent('click')); @@ -430,11 +430,11 @@ describe('HTMLAnchorElement', () => { }); document = window.document; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { throw new Error('Fetch should not be called.'); }); - const element = document.createElement('a'); + const element = document.createElement('a'); element.href = 'https://www.example.com'; document.body.appendChild(element); element.dispatchEvent(new PointerEvent('click')); @@ -452,13 +452,13 @@ describe('HTMLAnchorElement', () => { }); document = window.document; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { throw new Error('Fetch should not be called.'); }); - const newWindow = window.open(); + const newWindow = window.open(); - const element = newWindow.document.createElement('a'); + const element = newWindow.document.createElement('a'); element.href = 'https://www.example.com'; newWindow.document.body.appendChild(element); element.dispatchEvent(new PointerEvent('click')); @@ -476,11 +476,11 @@ describe('HTMLAnchorElement', () => { }); document = window.document; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { throw new Error('Fetch should not be called.'); }); - const element = document.createElement('a'); + const element = document.createElement('a'); element.href = 'https://www.example.com'; document.body.appendChild(element); element.dispatchEvent(new PointerEvent('click')); @@ -488,40 +488,40 @@ describe('HTMLAnchorElement', () => { }); it('Opens a window when a "click" event is dispatched on an element with target set to "_blank" inside the main frame of a detached browser.', () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - request = this.request; - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + request = this.request; + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); - const element = document.createElement('a'); + const element = document.createElement('a'); element.target = '_blank'; element.href = 'https://www.example.com'; document.body.appendChild(element); element.dispatchEvent(new PointerEvent('click')); - expect(((request)).url).toBe('https://www.example.com/'); + expect(((request)).url).toBe('https://www.example.com/'); }); it('Navigates the browser when a "click" event is dispatched on an element inside a non-main frame of a detached browser.', () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - request = this.request; - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + request = this.request; + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); - const newWindow = window.open(); + const newWindow = window.open(); - const element = newWindow.document.createElement('a'); + const element = newWindow.document.createElement('a'); element.href = 'https://www.example.com'; newWindow.document.body.appendChild(element); element.dispatchEvent(new PointerEvent('click')); - expect(((request)).url).toBe('https://www.example.com/'); + expect(((request)).url).toBe('https://www.example.com/'); expect(newWindow.closed).toBe(true); }); }); diff --git a/packages/happy-dom/test/nodes/html-base-element/HTMLBaseElement.test.ts b/packages/happy-dom/test/nodes/html-base-element/HTMLBaseElement.test.ts index b11c93874..d5310adfb 100644 --- a/packages/happy-dom/test/nodes/html-base-element/HTMLBaseElement.test.ts +++ b/packages/happy-dom/test/nodes/html-base-element/HTMLBaseElement.test.ts @@ -1,12 +1,12 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLBaseElement from '../../../src/nodes/html-base-element/IHTMLBaseElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLBaseElement from '../../../src/nodes/html-base-element/HTMLBaseElement.js'; import { beforeEach, afterEach, describe, it, expect } from 'vitest'; describe('HTMLBaseElement', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -15,7 +15,7 @@ describe('HTMLBaseElement', () => { describe('get target()', () => { it('Returns the "target" attribute.', () => { - const element = document.createElement('base'); + const element = document.createElement('base'); element.setAttribute('target', 'test'); expect(element.target).toBe('test'); }); @@ -23,7 +23,7 @@ describe('HTMLBaseElement', () => { describe('set target()', () => { it('Sets the attribute "target".', () => { - const element = document.createElement('base'); + const element = document.createElement('base'); element.target = 'test'; expect(element.getAttribute('target')).toBe('test'); }); @@ -31,13 +31,13 @@ describe('HTMLBaseElement', () => { describe('get href()', () => { it('Returns the "href" attribute.', () => { - const element = document.createElement('base'); + const element = document.createElement('base'); element.setAttribute('href', 'test'); expect(element.href).toBe('test'); }); it('Returns location.href if not set.', () => { - const element = document.createElement('base'); + const element = document.createElement('base'); document.location.href = 'https://localhost:8080/base/path/to/script/?key=value=1#test'; expect(element.href).toBe('https://localhost:8080/base/path/to/script/?key=value=1#test'); }); @@ -45,7 +45,7 @@ describe('HTMLBaseElement', () => { describe('set href()', () => { it('Sets the attribute "href".', () => { - const element = document.createElement('base'); + const element = document.createElement('base'); element.href = 'test'; expect(element.getAttribute('href')).toBe('test'); }); diff --git a/packages/happy-dom/test/nodes/html-button-element/HTMLButtonElement.test.ts b/packages/happy-dom/test/nodes/html-button-element/HTMLButtonElement.test.ts index 5a86387bf..8c1fe28cf 100644 --- a/packages/happy-dom/test/nodes/html-button-element/HTMLButtonElement.test.ts +++ b/packages/happy-dom/test/nodes/html-button-element/HTMLButtonElement.test.ts @@ -1,22 +1,22 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; -import IHTMLButtonElement from '../../../src/nodes/html-button-element/IHTMLButtonElement.js'; +import HTMLButtonElement from '../../../src/nodes/html-button-element/HTMLButtonElement.js'; import Event from '../../../src/event/Event.js'; import SubmitEvent from '../../../src/event/events/SubmitEvent'; -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; -import IHTMLFormElement from '../../../src/nodes/html-form-element/IHTMLFormElement.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; +import HTMLFormElement from '../../../src/nodes/html-form-element/HTMLFormElement.js'; import ValidityState from '../../../src/validity-state/ValidityState.js'; import { beforeEach, afterEach, describe, it, expect } from 'vitest'; describe('HTMLButtonElement', () => { let window: Window; let document: Document; - let element: IHTMLButtonElement; + let element: HTMLButtonElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('button'); + element = document.createElement('button'); }); describe('Object.prototype.toString', () => { @@ -53,14 +53,14 @@ describe('HTMLButtonElement', () => { }); it(`Sets name as property in parent form elements.`, () => { - const form = document.createElement('form'); + const form = document.createElement('form'); form.appendChild(element); element.name = 'button1'; expect(form.elements['button1']).toBe(element); }); it(`Sets name as property in parent element children.`, () => { - const div = document.createElement('div'); + const div = document.createElement('div'); div.appendChild(element); element.name = 'button1'; expect(div.children['button1']).toBe(element); @@ -334,8 +334,8 @@ describe('HTMLButtonElement', () => { describe('dispatchEvent()', () => { it('Submits form if type is "submit" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('button'); + const form = document.createElement('form'); + const button = document.createElement('button'); let submitTriggeredCount = 0; @@ -346,7 +346,7 @@ describe('HTMLButtonElement', () => { document.body.appendChild(form); - let submitter: IHTMLElement | null = null; + let submitter: HTMLElement | null = null; form.addEventListener('submit', (event) => { submitTriggeredCount++; submitter = (event).submitter; @@ -359,8 +359,8 @@ describe('HTMLButtonElement', () => { }); it('Submits form associated by ID if type is "submit" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('button'); + const form = document.createElement('form'); + const button = document.createElement('button'); let submitTriggeredCount = 0; @@ -370,7 +370,7 @@ describe('HTMLButtonElement', () => { document.body.appendChild(form); document.body.appendChild(button); - let submitter: IHTMLElement | null = null; + let submitter: HTMLElement | null = null; form.addEventListener('submit', (event) => { submitTriggeredCount++; submitter = (event).submitter; @@ -383,8 +383,8 @@ describe('HTMLButtonElement', () => { }); it('Resets form if type is "reset" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('button'); + const form = document.createElement('form'); + const button = document.createElement('button'); let resetTriggeredCount = 0; @@ -402,8 +402,8 @@ describe('HTMLButtonElement', () => { }); it('Resets form associated by ID if type is "reset" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('button'); + const form = document.createElement('form'); + const button = document.createElement('button'); let resetTriggeredCount = 0; diff --git a/packages/happy-dom/test/nodes/html-dialog-element/HTMLDialogElement.test.ts b/packages/happy-dom/test/nodes/html-dialog-element/HTMLDialogElement.test.ts index d9901613e..bcb5ffdc7 100644 --- a/packages/happy-dom/test/nodes/html-dialog-element/HTMLDialogElement.test.ts +++ b/packages/happy-dom/test/nodes/html-dialog-element/HTMLDialogElement.test.ts @@ -1,19 +1,19 @@ import Event from '../../../src/event/Event.js'; -import IHTMLDialogElement from '../../../src/nodes/html-dialog-element/IHTMLDialogElement.js'; +import HTMLDialogElement from '../../../src/nodes/html-dialog-element/HTMLDialogElement.js'; import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLDialogElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLDialogElement; + let window: Window; + let document: Document; + let element: HTMLDialogElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('dialog'); + element = document.createElement('dialog'); }); describe('Object.prototype.toString', () => { diff --git a/packages/happy-dom/test/nodes/html-element/HTMLElement.test.ts b/packages/happy-dom/test/nodes/html-element/HTMLElement.test.ts index 5c14c6064..51f68ec5f 100644 --- a/packages/happy-dom/test/nodes/html-element/HTMLElement.test.ts +++ b/packages/happy-dom/test/nodes/html-element/HTMLElement.test.ts @@ -1,10 +1,10 @@ import PointerEvent from '../../../src/event/events/PointerEvent.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Document from '../../../src/nodes/document/Document.js'; import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; import HTMLElementUtility from '../../../src/nodes/html-element/HTMLElementUtility.js'; -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; -import ISVGElement from '../../../src/nodes/svg-element/ISVGElement.js'; -import IWindow from '../../../src/window/IWindow.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; +import SVGElement from '../../../src/nodes/svg-element/SVGElement.js'; +import Window from '../../../src/window/Window.js'; import Window from '../../../src/window/Window.js'; import CustomElement from '../../CustomElement.js'; import * as PropertySymbol from '../../../src/PropertySymbol.js'; @@ -12,14 +12,14 @@ import CustomElementRegistry from '../../../src/custom-element/CustomElementRegi import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; describe('HTMLElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLElement; + let window: Window; + let document: Document; + let element: HTMLElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('div'); + element = document.createElement('div'); }); afterEach(() => { @@ -34,7 +34,7 @@ describe('HTMLElement', () => { describe('get accessKey()', () => { it('Returns "".', () => { - const div = document.createElement('div'); + const div = document.createElement('div'); expect(div.accessKey).toBe(''); }); }); @@ -312,7 +312,7 @@ describe('HTMLElement', () => { const main = document.createElement('main'); main.innerHTML = ``; document.body.append(main); - const button = main.querySelector('button'); + const button = main.querySelector('button'); expect(button.dataset.test).toBe('test'); }); @@ -320,11 +320,11 @@ describe('HTMLElement', () => { it('Finds closest ancestor element by data attribute.', () => { const main = document.createElement('main'); document.body.append(main); - const div = document.createElement('div'); + const div = document.createElement('div'); div.dataset.test = 'test'; div.innerHTML = ''; main.append(div); - const button = main.querySelector('button'); + const button = main.querySelector('button'); expect(button.closest('[data-test]')).toBe(div); }); }); @@ -402,11 +402,11 @@ describe('HTMLElement', () => { describe('blur()', () => { it('Calls HTMLElementUtility.blur().', () => { - let blurredElement: IHTMLElement | null = null; + let blurredElement: HTMLElement | null = null; vi.spyOn(HTMLElementUtility, 'blur').mockImplementation( - (element: IHTMLElement | ISVGElement) => { - blurredElement = element; + (element: HTMLElement | SVGElement) => { + blurredElement = element; } ); @@ -418,11 +418,11 @@ describe('HTMLElement', () => { describe('focus()', () => { it('Calls HTMLElementUtility.focus().', () => { - let focusedElement: IHTMLElement | null = null; + let focusedElement: HTMLElement | null = null; vi.spyOn(HTMLElementUtility, 'focus').mockImplementation( - (element: IHTMLElement | ISVGElement) => { - focusedElement = element; + (element: HTMLElement | SVGElement) => { + focusedElement = element; } ); diff --git a/packages/happy-dom/test/nodes/html-element/HTMLElementUtility.test.ts b/packages/happy-dom/test/nodes/html-element/HTMLElementUtility.test.ts index 69ff653ea..90769aed5 100644 --- a/packages/happy-dom/test/nodes/html-element/HTMLElementUtility.test.ts +++ b/packages/happy-dom/test/nodes/html-element/HTMLElementUtility.test.ts @@ -1,14 +1,14 @@ -import ISVGElement from '../../../src/nodes/svg-element/ISVGElement.js'; +import SVGElement from '../../../src/nodes/svg-element/SVGElement.js'; import FocusEvent from '../../../src/event/events/FocusEvent.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; -import IWindow from '../../../src/window/IWindow.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; +import Window from '../../../src/window/Window.js'; import Window from '../../../src/window/Window.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLElementUtility', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -18,8 +18,8 @@ describe('HTMLElementUtility', () => { describe('blur()', () => { it('Dispatches "blur" and "focusout" event.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { let triggeredBlurEvent: FocusEvent | null = null; let triggeredFocusOutEvent: FocusEvent | null = null; @@ -53,8 +53,8 @@ describe('HTMLElementUtility', () => { it('Does not dispatch "blur" event if not connected to the DOM.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { let triggeredEvent: FocusEvent | null = null; @@ -71,8 +71,8 @@ describe('HTMLElementUtility', () => { it('Does not dispatch "blur" event if it is not in focus.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { let triggeredEvent: FocusEvent | null = null; @@ -92,8 +92,8 @@ describe('HTMLElementUtility', () => { describe('focus()', () => { it('Dispatches "focus" and "focusin" event.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { let triggeredFocusEvent: FocusEvent | null = null; let triggeredFocusInEvent: FocusEvent | null = null; @@ -126,8 +126,8 @@ describe('HTMLElementUtility', () => { it('Does not dispatch "focus" event if not connected to the DOM.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { let triggeredEvent: FocusEvent | null = null; @@ -143,8 +143,8 @@ describe('HTMLElementUtility', () => { it('Does not dispatch "focus" event if it is already focused.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { let triggeredEvent: FocusEvent | null = null; @@ -164,10 +164,10 @@ describe('HTMLElementUtility', () => { it('Dispatches "blur" event on the previously focused element.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { - const previousElement = document.createElement('div'); + const previousElement = document.createElement('div'); let triggeredEvent: FocusEvent | null = null; document.body.appendChild(element); @@ -192,11 +192,11 @@ describe('HTMLElementUtility', () => { describe('Related targets', () => { it('Sets relatedTarget.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { - const focusElement = element.cloneNode(); - const blurElement = element.cloneNode(); + const focusElement = element.cloneNode(); + const blurElement = element.cloneNode(); let triggeredBlurEvent: FocusEvent | null = null; let triggeredFocusOutEvent: FocusEvent | null = null; let triggeredFocusEvent: FocusEvent | null = null; @@ -240,11 +240,11 @@ describe('HTMLElementUtility', () => { it('Sets relatedTarget to null if blur does not have new focus target.', () => { for (const element of [ - document.createElement('div'), - document.createElementNS('http://www.w3.org/2000/svg', 'svg') + document.createElement('div'), + document.createElementNS('http://www.w3.org/2000/svg', 'svg') ]) { - const focusElement = element.cloneNode(); - const blurElement = element.cloneNode(); + const focusElement = element.cloneNode(); + const blurElement = element.cloneNode(); let triggeredBlurEvent: FocusEvent | null = null; let triggeredFocusOutEvent: FocusEvent | null = null; diff --git a/packages/happy-dom/test/nodes/html-form-element/HTMLFormElement.test.ts b/packages/happy-dom/test/nodes/html-form-element/HTMLFormElement.test.ts index 10c9a2eb6..23d23349f 100644 --- a/packages/happy-dom/test/nodes/html-form-element/HTMLFormElement.test.ts +++ b/packages/happy-dom/test/nodes/html-form-element/HTMLFormElement.test.ts @@ -2,20 +2,20 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; import HTMLFormElement from '../../../src/nodes/html-form-element/HTMLFormElement.js'; import RadioNodeList from '../../../src/nodes/html-form-element/RadioNodeList.js'; -import IHTMLInputElement from '../../../src/nodes/html-input-element/IHTMLInputElement.js'; +import HTMLInputElement from '../../../src/nodes/html-input-element/HTMLInputElement.js'; import Event from '../../../src/event/Event.js'; import SubmitEvent from '../../../src/event/events/SubmitEvent.js'; -import IHTMLSelectElement from '../../../src/nodes/html-select-element/IHTMLSelectElement.js'; -import IHTMLTextAreaElement from '../../../src/nodes/html-text-area-element/IHTMLTextAreaElement.js'; -import IHTMLButtonElement from '../../../src/nodes/html-button-element/IHTMLButtonElement.js'; +import HTMLSelectElement from '../../../src/nodes/html-select-element/HTMLSelectElement.js'; +import HTMLTextAreaElement from '../../../src/nodes/html-text-area-element/HTMLTextAreaElement.js'; +import HTMLButtonElement from '../../../src/nodes/html-button-element/HTMLButtonElement.js'; import Fetch from '../../../src/fetch/Fetch.js'; -import IRequest from '../../../src/fetch/types/IRequest.js'; -import IResponse from '../../../src/fetch/types/IResponse.js'; +import Request from '../../../src/fetch/Request.js'; +import Response from '../../../src/fetch/Response.js'; import Browser from '../../../src/browser/Browser.js'; import File from '../../../src/file/File.js'; -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; -import IHTMLIFrameElement from '../../../src/nodes/html-iframe-element/IHTMLIFrameElement.js'; -import IBrowserWindow from '../../../src/window/IBrowserWindow.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; +import HTMLIFrameElement from '../../../src/nodes/html-iframe-element/HTMLIFrameElement.js'; +import BrowserWindow from '../../../src/window/BrowserWindow.js'; import { beforeEach, describe, it, expect, vi } from 'vitest'; describe('HTMLFormElement', () => { @@ -199,8 +199,8 @@ describe('HTMLFormElement', () => { expect(elements.namedItem('radio1')?.value).toBe('value2'); expect(elements.namedItem('1')?.value).toBe('value1'); - (elements.namedItem('text1')).name = 'text2'; - (elements.namedItem('text2')).id = 'text3'; + (elements.namedItem('text1')).name = 'text2'; + (elements.namedItem('text2')).id = 'text3'; expect(element['text2'] === root.children[0]).toBe(true); expect(element['text3'] === root.children[0]).toBe(true); @@ -382,7 +382,7 @@ describe('HTMLFormElement', () => { describe('submit()', () => { it('Fallbacks to set location URL when in the main frame of a detached Window.', () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { throw new Error('Request should not be sent.'); }); @@ -395,11 +395,11 @@ describe('HTMLFormElement', () => { }); it('Submits form as query string when method is "GET".', async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => setTimeout(() => resolve('Test'), 2)) @@ -429,9 +429,9 @@ describe('HTMLFormElement', () => { await page.mainFrame.waitForNavigation(); - expect(((request)).referrer).toBe('about:client'); - expect(((request)).referrerPolicy).toBe('origin'); - expect(((request)).method).toBe('GET'); + expect(((request)).referrer).toBe('about:client'); + expect(((request)).referrerPolicy).toBe('origin'); + expect(((request)).method).toBe('GET'); expect(page.mainFrame.url).toBe( 'http://example.com/?text1=value1&text2=value2&checkbox1=value1&radio1=value2' @@ -446,11 +446,11 @@ describe('HTMLFormElement', () => { for (const method of ['POST', 'PUT', 'DELETE', 'PATCH']) { it(`Submits form as form data when method is "${method}".`, async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => @@ -478,20 +478,20 @@ describe('HTMLFormElement', () => { `); - (oldWindow.document.body.children[0]).click(); + (oldWindow.document.body.children[0]).click(); await page.mainFrame.waitForNavigation(); - expect(((request)).referrer).toBe('about:client'); - expect(((request)).referrerPolicy).toBe('origin'); - expect(((request)).method).toBe(method); + expect(((request)).referrer).toBe('about:client'); + expect(((request)).referrerPolicy).toBe('origin'); + expect(((request)).method).toBe(method); expect( - ((request)).headers + ((request)).headers .get('Content-Type') ?.startsWith('multipart/form-data; boundary=----HappyDOMFormDataBoundary') ).toBe(true); - const requestFormData = await ((request)).formData(); + const requestFormData = await ((request)).formData(); const list: Array<{ key: string; value: string | File }> = []; for (const [key, value] of requestFormData) { @@ -514,11 +514,11 @@ describe('HTMLFormElement', () => { } it(`Supports "_self" as target.`, async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => setTimeout(() => resolve('Test'), 2)) @@ -542,7 +542,7 @@ describe('HTMLFormElement', () => { `); - (oldWindow.document.body.children[0]).click(); + (oldWindow.document.body.children[0]).click(); await page.mainFrame.waitForNavigation(); @@ -552,11 +552,11 @@ describe('HTMLFormElement', () => { }); it(`Supports "_top" as target.`, async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => @@ -596,8 +596,8 @@ describe('HTMLFormElement', () => { oldWindow.document.querySelector('iframe')?.addEventListener('load', resolve) ); - (( - (oldWindow.document.body.children[0]).contentWindow + (( + (oldWindow.document.body.children[0]).contentWindow )).document.body .querySelector('button') ?.click(); @@ -610,11 +610,11 @@ describe('HTMLFormElement', () => { }); it(`Supports "_parent" as target.`, async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => @@ -654,8 +654,8 @@ describe('HTMLFormElement', () => { oldWindow.document.querySelector('iframe')?.addEventListener('load', resolve) ); - (( - (oldWindow.document.body.children[0]).contentWindow + (( + (oldWindow.document.body.children[0]).contentWindow )).document.body .querySelector('button') ?.click(); @@ -668,11 +668,11 @@ describe('HTMLFormElement', () => { }); it(`Supports "_blank" as target.`, async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => setTimeout(() => resolve('Test'), 2)) @@ -710,11 +710,11 @@ describe('HTMLFormElement', () => { }); it(`Uses "action" from button when "formaction" is set as an attribute on the button.`, async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => setTimeout(() => resolve('Test'), 2)) @@ -738,7 +738,7 @@ describe('HTMLFormElement', () => { `); - (oldWindow.document.body.children[0]).click(); + (oldWindow.document.body.children[0]).click(); await page.mainFrame.waitForNavigation(); @@ -808,11 +808,11 @@ describe('HTMLFormElement', () => { expect(submitEvent).toBe(null); - (root.children[0]).value = 'value'; - (root.children[2]).click(); - (root.children[6]).click(); + (root.children[0]).value = 'value'; + (root.children[2]).click(); + (root.children[6]).click(); - element.requestSubmit(root.children[1]); + element.requestSubmit(root.children[1]); expect(((submitEvent)).type).toBe('submit'); expect(((submitEvent)).submitter).toBe(root.children[1]); @@ -839,7 +839,7 @@ describe('HTMLFormElement', () => { document.body.appendChild(element); const root = element.children[0]; - const submitter = root.children[7]; + const submitter = root.children[7]; let submitEvent: Event | null = null; element.addEventListener('submit', (event: Event) => (submitEvent = event)); @@ -851,7 +851,7 @@ describe('HTMLFormElement', () => { }); it('Fallbacks to set location URL when in the main frame of a detached Window.', () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { throw new Error('Request should not be sent.'); }); @@ -864,11 +864,11 @@ describe('HTMLFormElement', () => { }); it('Submits form as query string when method is "GET".', async () => { - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { request = this.request; - return Promise.resolve({ + return Promise.resolve({ url: request?.url, text: () => new Promise((resolve) => setTimeout(() => resolve('Test'), 2)) @@ -894,8 +894,7 @@ describe('HTMLFormElement', () => { `); - (oldWindow.document.querySelector('input[name="text1"]')).value = - 'invalid'; + (oldWindow.document.querySelector('input[name="text1"]')).value = 'invalid'; oldWindow.document.body.children[0]['button1'].click(); @@ -903,15 +902,15 @@ describe('HTMLFormElement', () => { expect(page.mainFrame.url).toBe('http://referrer.example.com/'); - (oldWindow.document.querySelector('input[name="text1"]')).value = 'test'; + (oldWindow.document.querySelector('input[name="text1"]')).value = 'test'; oldWindow.document.body.children[0]['button1'].click(); await page.mainFrame.waitForNavigation(); - expect(((request)).referrer).toBe('about:client'); - expect(((request)).referrerPolicy).toBe('origin'); - expect(((request)).method).toBe('GET'); + expect(((request)).referrer).toBe('about:client'); + expect(((request)).referrerPolicy).toBe('origin'); + expect(((request)).method).toBe('GET'); expect(page.mainFrame.url).toBe( 'http://example.com/?text1=test&text2=value2&checkbox1=value1&radio1=value2' @@ -950,12 +949,12 @@ describe('HTMLFormElement', () => { const root = element.children[0]; let resetEvent: Event | null = null; - (root.children[0]).value = 'New value'; - (root.children[1]).value = 'value3'; - (root.children[2]).value = 'New value'; - (root.children[3]).click(); - (root.children[5]).click(); - (root.children[7]).click(); + (root.children[0]).value = 'New value'; + (root.children[1]).value = 'value3'; + (root.children[2]).value = 'New value'; + (root.children[3]).click(); + (root.children[5]).click(); + (root.children[7]).click(); element.addEventListener('reset', (event: Event) => (resetEvent = event)); @@ -963,17 +962,17 @@ describe('HTMLFormElement', () => { expect(((resetEvent)).type).toBe('reset'); - expect((root.children[0]).value).toBe('Default value'); - expect((root.children[1]).value).toBe('value2'); - expect((root.children[2]).value).toBe('Default value'); + expect((root.children[0]).value).toBe('Default value'); + expect((root.children[1]).value).toBe('value2'); + expect((root.children[2]).value).toBe('Default value'); - expect((root.children[3]).checked).toBe(false); - expect((root.children[4]).checked).toBe(true); - expect((root.children[5]).checked).toBe(false); + expect((root.children[3]).checked).toBe(false); + expect((root.children[4]).checked).toBe(true); + expect((root.children[5]).checked).toBe(false); - expect((root.children[6]).checked).toBe(false); - expect((root.children[7]).checked).toBe(true); - expect((root.children[8]).checked).toBe(false); + expect((root.children[6]).checked).toBe(false); + expect((root.children[7]).checked).toBe(true); + expect((root.children[8]).checked).toBe(false); }); }); @@ -1007,13 +1006,13 @@ describe('HTMLFormElement', () => { expect(invalidEvents.length).toBe(7); invalidEvents = []; - (root.children[0]).value = 'value'; - (root.children[1]).options[0].value = 'value'; - (root.children[2]).value = 'value'; - (root.children[3]).click(); - (root.children[4]).click(); - (root.children[5]).click(); - (root.children[7]).click(); + (root.children[0]).value = 'value'; + (root.children[1]).options[0].value = 'value'; + (root.children[2]).value = 'value'; + (root.children[3]).click(); + (root.children[4]).click(); + (root.children[5]).click(); + (root.children[7]).click(); expect(element[method]()).toBe(true); expect(invalidEvents.length).toBe(0); diff --git a/packages/happy-dom/test/nodes/html-iframe-element/HTMLIFrameElement.test.ts b/packages/happy-dom/test/nodes/html-iframe-element/HTMLIFrameElement.test.ts index 227d930f5..fdcad0c69 100644 --- a/packages/happy-dom/test/nodes/html-iframe-element/HTMLIFrameElement.test.ts +++ b/packages/happy-dom/test/nodes/html-iframe-element/HTMLIFrameElement.test.ts @@ -1,9 +1,9 @@ import Window from '../../../src/window/Window.js'; import BrowserWindow from '../../../src/window/BrowserWindow.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLIFrameElement from '../../../src/nodes/html-iframe-element/IHTMLIFrameElement.js'; -import IResponse from '../../../src/fetch/types/IResponse.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLIFrameElement from '../../../src/nodes/html-iframe-element/HTMLIFrameElement.js'; +import Response from '../../../src/fetch/Response.js'; import ErrorEvent from '../../../src/event/events/ErrorEvent.js'; import CrossOriginBrowserWindow from '../../../src/window/CrossOriginBrowserWindow.js'; import MessageEvent from '../../../src/event/events/MessageEvent.js'; @@ -15,14 +15,14 @@ import Headers from '../../../src/fetch/Headers.js'; import Browser from '../../../src/browser/Browser.js'; describe('HTMLIFrameElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLIFrameElement; + let window: Window; + let document: Document; + let element: HTMLIFrameElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('iframe'); + element = document.createElement('iframe'); }); afterEach(() => { @@ -80,7 +80,7 @@ describe('HTMLIFrameElement', () => { const page = browser.newPage(); const window = page.mainFrame.window; const document = window.document; - const element = document.createElement('iframe'); + const element = document.createElement('iframe'); element.src = 'https://localhost:8080/iframe.html'; document.body.appendChild(element); @@ -95,7 +95,7 @@ describe('HTMLIFrameElement', () => { vi.spyOn(BrowserWindow.prototype, 'fetch').mockImplementation((url: IRequestInfo) => { return new Promise((resolve) => { setTimeout(() => { - resolve(({ + resolve(({ text: () => Promise.resolve(responseHTML), ok: true, headers: new Headers({ 'x-frame-options': 'deny' }) @@ -124,7 +124,7 @@ describe('HTMLIFrameElement', () => { vi.spyOn(BrowserWindow.prototype, 'fetch').mockImplementation((url: IRequestInfo) => { return new Promise((resolve) => { setTimeout(() => { - resolve(({ + resolve(({ text: () => Promise.resolve(responseHTML), ok: true, headers: new Headers({ 'x-frame-options': 'sameorigin' }) @@ -155,7 +155,7 @@ describe('HTMLIFrameElement', () => { fetchedURL = url; return new Promise((resolve) => { setTimeout(() => { - resolve(({ + resolve(({ text: () => Promise.resolve(responseHTML), ok: true, headers: new Headers({ 'x-frame-options': 'sameorigin' }) @@ -187,7 +187,7 @@ describe('HTMLIFrameElement', () => { vi.spyOn(BrowserWindow.prototype, 'fetch').mockImplementation((url: IRequestInfo) => { fetchedURL = url; - return Promise.resolve(({ + return Promise.resolve(({ text: () => Promise.resolve(responseHTML), ok: true, headers: new Headers() @@ -214,7 +214,7 @@ describe('HTMLIFrameElement', () => { const responseHTML = 'Test'; vi.spyOn(BrowserWindow.prototype, 'fetch').mockImplementation((url: IRequestInfo) => { - return Promise.resolve(({ + return Promise.resolve(({ text: () => Promise.resolve(responseHTML), ok: true, headers: new Headers() @@ -237,13 +237,13 @@ describe('HTMLIFrameElement', () => { const page = browser.newPage(); const window = page.mainFrame.window; const document = window.document; - const element = document.createElement('iframe'); + const element = document.createElement('iframe'); const responseHTML = 'Test'; page.mainFrame.url = 'https://localhost:8080'; vi.spyOn(BrowserWindow.prototype, 'fetch').mockImplementation((url: IRequestInfo) => { - return Promise.resolve(({ + return Promise.resolve(({ text: () => Promise.resolve(responseHTML), ok: true, headers: new Headers() @@ -266,7 +266,7 @@ describe('HTMLIFrameElement', () => { const page = browser.newPage(); const window = page.mainFrame.window; const document = window.document; - const element = document.createElement('iframe'); + const element = document.createElement('iframe'); const iframeOrigin = 'https://other.origin.com'; const iframeSrc = iframeOrigin + '/iframe.html'; const documentOrigin = 'https://localhost:8080'; @@ -275,11 +275,11 @@ describe('HTMLIFrameElement', () => { page.mainFrame.url = documentOrigin; vi.spyOn(BrowserWindow.prototype, 'fetch').mockImplementation( - (url: IRequestInfo): Promise => { + (url: IRequestInfo): Promise => { fetchedURL = url; return new Promise((resolve) => { setTimeout(() => { - resolve(({ + resolve(({ text: () => Promise.resolve('Test'), ok: true, headers: new Headers() @@ -330,7 +330,7 @@ describe('HTMLIFrameElement', () => { const error = new Error('Error'); vi.spyOn(BrowserWindow.prototype, 'fetch').mockImplementation(() => { - return Promise.resolve(({ + return Promise.resolve(({ text: () => Promise.reject(error), ok: true, headers: new Headers() diff --git a/packages/happy-dom/test/nodes/html-input-element/FileList.test.ts b/packages/happy-dom/test/nodes/html-input-element/FileList.test.ts index 38cfde418..43b5267dc 100644 --- a/packages/happy-dom/test/nodes/html-input-element/FileList.test.ts +++ b/packages/happy-dom/test/nodes/html-input-element/FileList.test.ts @@ -1,13 +1,13 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/Window.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; import File from '../../../src/file/File.js'; -import IHTMLInputElement from '../../../src/nodes/html-input-element/IHTMLInputElement.js'; +import HTMLInputElement from '../../../src/nodes/html-input-element/HTMLInputElement.js'; import { beforeEach, afterEach, describe, it, expect } from 'vitest'; describe('FileList', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -16,7 +16,7 @@ describe('FileList', () => { describe('item()', () => { it('Returns file at index.', () => { - const element = document.createElement('input'); + const element = document.createElement('input'); const file1 = new File([''], 'file.txt'); const file2 = new File([''], 'file2.txt'); diff --git a/packages/happy-dom/test/nodes/html-input-element/HTMLInputElement.test.ts b/packages/happy-dom/test/nodes/html-input-element/HTMLInputElement.test.ts index 4a4930d5b..2b292a611 100644 --- a/packages/happy-dom/test/nodes/html-input-element/HTMLInputElement.test.ts +++ b/packages/happy-dom/test/nodes/html-input-element/HTMLInputElement.test.ts @@ -1,28 +1,28 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLInputElement from '../../../src/nodes/html-input-element/IHTMLInputElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLInputElement from '../../../src/nodes/html-input-element/HTMLInputElement.js'; import DOMException from '../../../src/exception/DOMException.js'; import File from '../../../src/file/File.js'; import Event from '../../../src/event/Event.js'; import HTMLInputElementSelectionModeEnum from '../../../src/nodes/html-input-element/HTMLInputElementSelectionModeEnum.js'; import HTMLInputElementSelectionDirectionEnum from '../../../src/nodes/html-input-element/HTMLInputElementSelectionDirectionEnum.js'; import ValidityState from '../../../src/validity-state/ValidityState.js'; -import IHTMLFormElement from '../../../src/nodes/html-form-element/IHTMLFormElement.js'; +import HTMLFormElement from '../../../src/nodes/html-form-element/HTMLFormElement.js'; import DOMExceptionNameEnum from '../../../src/exception/DOMExceptionNameEnum.js'; import SubmitEvent from '../../../src/event/events/SubmitEvent.js'; import { beforeEach, describe, it, expect } from 'vitest'; import PointerEvent from '../../../src/event/events/PointerEvent.js'; describe('HTMLInputElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLInputElement; + let window: Window; + let document: Document; + let element: HTMLInputElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('input'); + element = document.createElement('input'); }); describe('Object.prototype.toString', () => { @@ -761,9 +761,9 @@ describe('HTMLInputElement', () => { it('Unchecks other radio buttons with the same name in a form.', () => { const form = document.createElement('form'); - const radio1 = document.createElement('input'); - const radio2 = document.createElement('input'); - const radio3 = document.createElement('input'); + const radio1 = document.createElement('input'); + const radio2 = document.createElement('input'); + const radio3 = document.createElement('input'); radio1.type = 'radio'; radio2.type = 'radio'; @@ -791,9 +791,9 @@ describe('HTMLInputElement', () => { }); it('Unchecks other radio buttons with the same name outside of a form', () => { - const radio1 = document.createElement('input'); - const radio2 = document.createElement('input'); - const radio3 = document.createElement('input'); + const radio1 = document.createElement('input'); + const radio2 = document.createElement('input'); + const radio3 = document.createElement('input'); radio1.type = 'radio'; radio2.type = 'radio'; @@ -1292,8 +1292,8 @@ describe('HTMLInputElement', () => { }); it('Submits form if type is "submit" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('input'); + const form = document.createElement('form'); + const button = document.createElement('input'); let submitTriggeredCount = 0; @@ -1303,10 +1303,10 @@ describe('HTMLInputElement', () => { document.body.appendChild(form); - let submitter: IHTMLInputElement | null = null; + let submitter: HTMLInputElement | null = null; form.addEventListener('submit', (event) => { submitTriggeredCount++; - submitter = (event).submitter; + submitter = (event).submitter; }); button.click(); @@ -1316,8 +1316,8 @@ describe('HTMLInputElement', () => { }); it('Submits form associated by ID if type is "submit" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('input'); + const form = document.createElement('form'); + const button = document.createElement('input'); let submitTriggeredCount = 0; @@ -1328,10 +1328,10 @@ describe('HTMLInputElement', () => { document.body.appendChild(form); document.body.appendChild(button); - let submitter: IHTMLInputElement | null = null; + let submitter: HTMLInputElement | null = null; form.addEventListener('submit', (event) => { submitTriggeredCount++; - submitter = (event).submitter; + submitter = (event).submitter; }); button.click(); @@ -1341,8 +1341,8 @@ describe('HTMLInputElement', () => { }); it('Resets form if type is "reset" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('input'); + const form = document.createElement('form'); + const button = document.createElement('input'); let resetTriggeredCount = 0; @@ -1360,8 +1360,8 @@ describe('HTMLInputElement', () => { }); it('Resets form associated by ID if type is "reset" and is a "click" event.', () => { - const form = document.createElement('form'); - const button = document.createElement('input'); + const form = document.createElement('form'); + const button = document.createElement('input'); let resetTriggeredCount = 0; diff --git a/packages/happy-dom/test/nodes/html-input-element/HTMLInputElementValueSanitizer.test.ts b/packages/happy-dom/test/nodes/html-input-element/HTMLInputElementValueSanitizer.test.ts index b29ae78ed..0ef4a9e8b 100644 --- a/packages/happy-dom/test/nodes/html-input-element/HTMLInputElementValueSanitizer.test.ts +++ b/packages/happy-dom/test/nodes/html-input-element/HTMLInputElementValueSanitizer.test.ts @@ -1,21 +1,21 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLInputElement from '../../../src/nodes/html-input-element/IHTMLInputElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLInputElement from '../../../src/nodes/html-input-element/HTMLInputElement.js'; import HTMLInputElementValueSanitizer from '../../../src/nodes/html-input-element/HTMLInputElementValueSanitizer.js'; import HTMLInputElement from '../../../src/nodes/html-input-element/HTMLInputElement.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLInputElementValueSanitizer', () => { describe('sanitize', () => { - let window: IWindow; - let document: IDocument; - let input: IHTMLInputElement; + let window: Window; + let document: Document; + let input: HTMLInputElement; beforeEach(() => { window = new Window(); document = window.document; - input = document.createElement('input'); + input = document.createElement('input'); }); type TestCase = { diff --git a/packages/happy-dom/test/nodes/html-label-element/HTMLLabelElement.test.ts b/packages/happy-dom/test/nodes/html-label-element/HTMLLabelElement.test.ts index f4ccd9165..88a61b1e7 100644 --- a/packages/happy-dom/test/nodes/html-label-element/HTMLLabelElement.test.ts +++ b/packages/happy-dom/test/nodes/html-label-element/HTMLLabelElement.test.ts @@ -1,19 +1,19 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; -import IHTMLLabelElement from '../../../src/nodes/html-label-element/IHTMLLabelElement.js'; -import IHTMLInputElement from '../../../src/nodes/html-input-element/IHTMLInputElement.js'; +import HTMLLabelElement from '../../../src/nodes/html-label-element/HTMLLabelElement.js'; +import HTMLInputElement from '../../../src/nodes/html-input-element/HTMLInputElement.js'; import PointerEvent from '../../../src/event/events/PointerEvent.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLLabelElement', () => { let window: Window; let document: Document; - let element: IHTMLLabelElement; + let element: HTMLLabelElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('label'); + element = document.createElement('label'); }); describe('Object.prototype.toString', () => { @@ -81,7 +81,7 @@ describe('HTMLLabelElement', () => { describe('dispatchEvent()', () => { it('Dispatches a click event on the control element if it exists.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); const span = document.createElement('span'); input.type = 'checkbox'; diff --git a/packages/happy-dom/test/nodes/html-link-element/HTMLLinkElement.test.ts b/packages/happy-dom/test/nodes/html-link-element/HTMLLinkElement.test.ts index f66f9a1c1..df584b919 100644 --- a/packages/happy-dom/test/nodes/html-link-element/HTMLLinkElement.test.ts +++ b/packages/happy-dom/test/nodes/html-link-element/HTMLLinkElement.test.ts @@ -1,16 +1,16 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IBrowserWindow from '../../../src/window/IBrowserWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLLinkElement from '../../../src/nodes/html-link-element/IHTMLLinkElement.js'; +import Window from '../../../src/window/Window.js'; +import BrowserWindow from '../../../src/window/BrowserWindow.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLLinkElement from '../../../src/nodes/html-link-element/HTMLLinkElement.js'; import ResourceFetch from '../../../src/fetch/ResourceFetch.js'; import Event from '../../../src/event/Event.js'; import ErrorEvent from '../../../src/event/events/ErrorEvent.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; describe('HTMLLinkElement', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -88,7 +88,7 @@ describe('HTMLLinkElement', () => { it('Loads and evaluates an external CSS file when the attribute "href" and "rel" is set and the element is connected to DOM.', async () => { const element = document.createElement('link'); const css = 'div { background: red; }'; - let loadedWindow: IBrowserWindow | null = null; + let loadedWindow: BrowserWindow | null = null; let loadedURL: string | null = null; let loadEvent: Event | null = null; @@ -143,7 +143,7 @@ describe('HTMLLinkElement', () => { it('Does not load and evaluate external CSS files if the element is not connected to DOM.', () => { const element = document.createElement('link'); const css = 'div { background: red; }'; - let loadedWindow: IBrowserWindow | null = null; + let loadedWindow: BrowserWindow | null = null; let loadedURL: string | null = null; vi.spyOn(ResourceFetch.prototype, 'fetch').mockImplementation(async function (url: string) { @@ -165,7 +165,7 @@ describe('HTMLLinkElement', () => { const element = document.createElement('link'); const css = 'div { background: red; }'; let loadEvent: Event | null = null; - let loadedWindow: IBrowserWindow | null = null; + let loadedWindow: BrowserWindow | null = null; let loadedURL: string | null = null; vi.spyOn(ResourceFetch.prototype, 'fetch').mockImplementation(async function (url: string) { @@ -217,7 +217,7 @@ describe('HTMLLinkElement', () => { it('Does not load external CSS file when "href" attribute has been set if the element is not connected to DOM.', () => { const element = document.createElement('link'); const css = 'div { background: red; }'; - let loadedWindow: IBrowserWindow | null = null; + let loadedWindow: BrowserWindow | null = null; let loadedURL: string | null = null; vi.spyOn(ResourceFetch.prototype, 'fetch').mockImplementation(async function (url: string) { diff --git a/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts b/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts index 99eca91d9..ac59b5ef2 100644 --- a/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts +++ b/packages/happy-dom/test/nodes/html-media-element/HTMLMediaElement.test.ts @@ -1,21 +1,21 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; +import Window from '../../../src/window/Window.js'; import DOMException from '../../../src/exception/DOMException.js'; import DOMExceptionNameEnum from '../../../src/exception/DOMExceptionNameEnum.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLMediaElement from '../../../src/nodes/html-media-element/IHTMLMediaElement.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLMediaElement from '../../../src/nodes/html-media-element/HTMLMediaElement.js'; import Event from '../../../src/event/Event.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLMediaElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLMediaElement; + let window: Window; + let document: Document; + let element: HTMLMediaElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('audio'); + element = document.createElement('audio'); }); describe('Object.prototype.toString', () => { diff --git a/packages/happy-dom/test/nodes/html-meta-element/HTMLMetaElement.test.ts b/packages/happy-dom/test/nodes/html-meta-element/HTMLMetaElement.test.ts index 718ea5fc9..58dcc37b8 100644 --- a/packages/happy-dom/test/nodes/html-meta-element/HTMLMetaElement.test.ts +++ b/packages/happy-dom/test/nodes/html-meta-element/HTMLMetaElement.test.ts @@ -1,17 +1,17 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; -import IHTMLMetaElement from '../../../src/nodes/html-meta-element/IHTMLMetaElement.js'; +import HTMLMetaElement from '../../../src/nodes/html-meta-element/HTMLMetaElement.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLMetaElement', () => { let window: Window; let document: Document; - let element: IHTMLMetaElement; + let element: HTMLMetaElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('meta'); + element = document.createElement('meta'); }); describe('Object.prototype.toString', () => { diff --git a/packages/happy-dom/test/nodes/html-option-element/HTMLOptionElement.test.ts b/packages/happy-dom/test/nodes/html-option-element/HTMLOptionElement.test.ts index 081d37d55..36d9df483 100644 --- a/packages/happy-dom/test/nodes/html-option-element/HTMLOptionElement.test.ts +++ b/packages/happy-dom/test/nodes/html-option-element/HTMLOptionElement.test.ts @@ -1,18 +1,18 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; -import IHTMLOptionElement from '../../../src/nodes/html-option-element/IHTMLOptionElement.js'; -import IHTMLSelectElement from '../../../src/nodes/html-select-element/IHTMLSelectElement.js'; +import HTMLOptionElement from '../../../src/nodes/html-option-element/HTMLOptionElement.js'; +import HTMLSelectElement from '../../../src/nodes/html-select-element/HTMLSelectElement.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLOptionElement', () => { let window: Window; let document: Document; - let element: IHTMLOptionElement; + let element: HTMLOptionElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('option'); + element = document.createElement('option'); }); describe('Object.prototype.toString', () => { @@ -63,9 +63,9 @@ describe('HTMLOptionElement', () => { describe('get selected()', () => { it('Returns the selected state of the option.', () => { - const select = document.createElement('select'); - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); + const select = document.createElement('select'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); expect(option1.selected).toBe(false); expect(option2.selected).toBe(false); @@ -94,9 +94,9 @@ describe('HTMLOptionElement', () => { describe('set selected()', () => { it('Sets the selected state of the option.', () => { - const select = document.createElement('select'); - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); + const select = document.createElement('select'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); expect(option1.selected).toBe(false); expect(option2.selected).toBe(false); diff --git a/packages/happy-dom/test/nodes/html-option-element/HTMLOptionsCollection.test.ts b/packages/happy-dom/test/nodes/html-option-element/HTMLOptionsCollection.test.ts index 97b3c2baf..06eb1b538 100644 --- a/packages/happy-dom/test/nodes/html-option-element/HTMLOptionsCollection.test.ts +++ b/packages/happy-dom/test/nodes/html-option-element/HTMLOptionsCollection.test.ts @@ -1,14 +1,14 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; import HTMLSelectElement from '../../../src/nodes/html-select-element/HTMLSelectElement.js'; import HTMLOptionElement from '../../../src/nodes/html-option-element/HTMLOptionElement.js'; import DOMException from '../../../src/exception/DOMException.js'; import { beforeEach, afterEach, describe, it, expect } from 'vitest'; describe('HTMLOptionsCollection', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts b/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts index 63e84afe8..59388a95b 100644 --- a/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts +++ b/packages/happy-dom/test/nodes/html-script-element/HTMLScriptElement.test.ts @@ -1,19 +1,19 @@ import Window from '../../../src/window/Window.js'; -import IHTMLScriptElement from '../../../src/nodes/html-script-element/IHTMLScriptElement.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IResponse from '../../../src/fetch/types/IResponse.js'; +import HTMLScriptElement from '../../../src/nodes/html-script-element/HTMLScriptElement.js'; +import Document from '../../../src/nodes/document/Document.js'; +import Response from '../../../src/fetch/Response.js'; import ResourceFetch from '../../../src/fetch/ResourceFetch.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import Event from '../../../src/event/Event.js'; import ErrorEvent from '../../../src/event/events/ErrorEvent.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IBrowserWindow from '../../../src/window/IBrowserWindow.js'; +import Window from '../../../src/window/Window.js'; +import BrowserWindow from '../../../src/window/BrowserWindow.js'; import Fetch from '../../../src/fetch/Fetch.js'; import BrowserErrorCaptureEnum from '../../../src/browser/enums/BrowserErrorCaptureEnum.js'; describe('HTMLScriptElement', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -94,7 +94,7 @@ describe('HTMLScriptElement', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { + { text: async () => 'globalThis.test = "test";', ok: true, status: 200 @@ -116,7 +116,7 @@ describe('HTMLScriptElement', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { + { text: async () => 'globalThis.test = "test";', ok: true, status: 200 @@ -181,14 +181,14 @@ describe('HTMLScriptElement', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation(async function () { fetchedURL = this.request.url; - return { + return { text: async () => 'globalThis.test = "test";globalThis.currentScript = document.currentScript;', ok: true }; }); - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/path/to/script.js'; script.async = true; script.addEventListener('load', (event) => { @@ -209,7 +209,7 @@ describe('HTMLScriptElement', () => { let errorEvent: ErrorEvent | null = null; vi.spyOn(Fetch.prototype, 'send').mockImplementation( - async () => ({ + async () => ({ text: () => null, ok: false, status: 404, @@ -217,7 +217,7 @@ describe('HTMLScriptElement', () => { }) ); - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/path/to/script.js'; script.async = true; script.addEventListener('error', (event) => { @@ -235,7 +235,7 @@ describe('HTMLScriptElement', () => { it('Loads external script synchronously with relative URL.', async () => { const window = new Window({ url: 'https://localhost:8080/base/' }); - let fetchedWindow: IBrowserWindow | null = null; + let fetchedWindow: BrowserWindow | null = null; let fetchedURL: string | null = null; let loadEvent: Event | null = null; @@ -245,7 +245,7 @@ describe('HTMLScriptElement', () => { return 'globalThis.test = "test";globalThis.currentScript = document.currentScript;'; }); - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'path/to/script.js'; script.addEventListener('load', (event) => { loadEvent = event; @@ -269,7 +269,7 @@ describe('HTMLScriptElement', () => { throw thrownError; }); - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'path/to/script.js'; script.addEventListener('error', (event) => { errorEvent = event; @@ -361,7 +361,7 @@ describe('HTMLScriptElement', () => { let errorEvent: ErrorEvent | null = null; - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/path/to/script.js'; script.async = true; script.addEventListener('error', (event) => { @@ -383,7 +383,7 @@ describe('HTMLScriptElement', () => { let errorEvent: ErrorEvent | null = null; - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/path/to/script.js'; script.addEventListener('error', (event) => { errorEvent = event; @@ -404,7 +404,7 @@ describe('HTMLScriptElement', () => { let errorEvent: ErrorEvent | null = null; - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/path/to/script.js'; script.async = true; script.addEventListener('error', (event) => { @@ -426,7 +426,7 @@ describe('HTMLScriptElement', () => { let errorEvent: ErrorEvent | null = null; - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/path/to/script.js'; script.addEventListener('error', (event) => { errorEvent = event; @@ -444,7 +444,7 @@ describe('HTMLScriptElement', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { + { text: async () => 'globalThis.test = /;', ok: true } @@ -452,7 +452,7 @@ describe('HTMLScriptElement', () => { window.addEventListener('error', (event) => (errorEvent = event)); - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/base/path/to/script/'; script.async = true; @@ -479,7 +479,7 @@ describe('HTMLScriptElement', () => { window.addEventListener('error', (event) => (errorEvent = event)); - const script = window.document.createElement('script'); + const script = window.document.createElement('script'); script.src = 'https://localhost:8080/base/path/to/script/'; document.body.appendChild(script); diff --git a/packages/happy-dom/test/nodes/html-select-element/HTMLSelectElement.test.ts b/packages/happy-dom/test/nodes/html-select-element/HTMLSelectElement.test.ts index 08b8a0a6b..de2adea62 100644 --- a/packages/happy-dom/test/nodes/html-select-element/HTMLSelectElement.test.ts +++ b/packages/happy-dom/test/nodes/html-select-element/HTMLSelectElement.test.ts @@ -1,21 +1,21 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLSelectElement from '../../../src/nodes/html-select-element/IHTMLSelectElement.js'; -import IHTMLOptionElement from '../../../src/nodes/html-option-element/IHTMLOptionElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLSelectElement from '../../../src/nodes/html-select-element/HTMLSelectElement.js'; +import HTMLOptionElement from '../../../src/nodes/html-option-element/HTMLOptionElement.js'; import ValidityState from '../../../src/validity-state/ValidityState.js'; import Event from '../../../src/event/Event.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLSelectElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLSelectElement; + let window: Window; + let document: Document; + let element: HTMLSelectElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('select'); + element = document.createElement('select'); }); describe('Object.prototype.toString', () => { @@ -26,32 +26,32 @@ describe('HTMLSelectElement', () => { describe('get options()', () => { it('Reflects changes as options elements are added and removed from the DOM.', () => { - const option1 = document.createElement('option'); + const option1 = document.createElement('option'); option1.value = 'option1'; element.appendChild(option1); expect(element.options.length).toBe(1); - expect((element.options[0]).value).toBe('option1'); + expect((element.options[0]).value).toBe('option1'); element.removeChild(option1); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); option2.value = 'option2'; option3.value = 'option3'; element.appendChild(option2); element.appendChild(option3); expect(element.options.length).toBe(2); - expect((element.options[0]).value).toBe('option2'); - expect((element.options[1]).value).toBe('option3'); + expect((element.options[0]).value).toBe('option2'); + expect((element.options[1]).value).toBe('option3'); }); }); describe('get value()', () => { it('Returns the value of the first option element in the list of options in tree order that has its selectedness set to true.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); option1.selected = true; option1.value = 'option1'; option2.value = 'option2'; @@ -66,8 +66,8 @@ describe('HTMLSelectElement', () => { }); it('Returns empty string if no option is selected.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); option1.value = 'option1'; option2.value = 'option2'; element.appendChild(option1); @@ -83,8 +83,8 @@ describe('HTMLSelectElement', () => { describe('set value()', () => { it('Sets options.selectedIndex.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); option1.value = 'option1'; option2.value = 'option2'; element.appendChild(option1); @@ -229,8 +229,8 @@ describe('HTMLSelectElement', () => { describe(`add()`, () => { it('Appends options.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); element.add(option1); element.add(option2); @@ -247,9 +247,9 @@ describe('HTMLSelectElement', () => { }); it('Appends an option before an index.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); element.add(option1); element.add(option2); @@ -270,9 +270,9 @@ describe('HTMLSelectElement', () => { }); it('Appends an option before an option element.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); element.add(option1); element.add(option2); @@ -295,9 +295,9 @@ describe('HTMLSelectElement', () => { describe(`item()`, () => { it('Returns an option element on a specified index.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); element.add(option1); element.add(option2); @@ -316,9 +316,9 @@ describe('HTMLSelectElement', () => { describe(`appendChild()`, () => { it('Adds appended option or option group elements to the HTMLOptionsCollection.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); element.appendChild(option1); element.appendChild(option2); @@ -342,10 +342,10 @@ describe('HTMLSelectElement', () => { }); it('Does not include other types of elements in the HTMLOptionsCollection.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); - const div = document.createElement('div'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); + const div = document.createElement('div'); element.appendChild(option1); element.appendChild(option2); @@ -373,9 +373,9 @@ describe('HTMLSelectElement', () => { describe(`insertBefore()`, () => { it('Adds inserted option or option group elements to the HTMLOptionsCollection at correct index.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); element.appendChild(option1); element.appendChild(option2); @@ -399,9 +399,9 @@ describe('HTMLSelectElement', () => { }); it('Appends inserted option or option group elements to the HTMLOptionsCollection if referenceNode is null.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); element.appendChild(option1); element.appendChild(option2); @@ -427,9 +427,9 @@ describe('HTMLSelectElement', () => { describe(`removeChild()`, () => { it('Removes an option or option group elements from the HTMLOptionsCollection.', () => { - const option1 = document.createElement('option'); - const option2 = document.createElement('option'); - const option3 = document.createElement('option'); + const option1 = document.createElement('option'); + const option2 = document.createElement('option'); + const option3 = document.createElement('option'); element.appendChild(option1); element.appendChild(option2); @@ -465,7 +465,7 @@ describe('HTMLSelectElement', () => { for (const method of ['checkValidity', 'reportValidity']) { describe(`${method}()`, () => { it('Returns "true" if the field is "disabled".', () => { - const option1 = document.createElement('option'); + const option1 = document.createElement('option'); option1.value = ''; element.appendChild(option1); @@ -476,7 +476,7 @@ describe('HTMLSelectElement', () => { }); it('Returns "false" if invalid.', () => { - const option1 = document.createElement('option'); + const option1 = document.createElement('option'); option1.value = ''; element.appendChild(option1); @@ -486,7 +486,7 @@ describe('HTMLSelectElement', () => { }); it('Triggers an "invalid" event when invalid.', () => { - const option1 = document.createElement('option'); + const option1 = document.createElement('option'); option1.value = ''; element.appendChild(option1); diff --git a/packages/happy-dom/test/nodes/html-slot-element/HTMLSlotElement.test.ts b/packages/happy-dom/test/nodes/html-slot-element/HTMLSlotElement.test.ts index ccfc7283e..89a585a24 100644 --- a/packages/happy-dom/test/nodes/html-slot-element/HTMLSlotElement.test.ts +++ b/packages/happy-dom/test/nodes/html-slot-element/HTMLSlotElement.test.ts @@ -1,9 +1,9 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; -import IHTMLSlotElement from '../../../src/nodes/html-slot-element/IHTMLSlotElement.js'; +import HTMLSlotElement from '../../../src/nodes/html-slot-element/HTMLSlotElement.js'; import CustomElementWithNamedSlots from './CustomElementWithNamedSlots.js'; import CustomElementWithSlot from './CustomElementWithSlot.js'; -import INodeList from '../../../src/nodes/node/INodeList.js'; +import NodeList from '../../../src/nodes/node/NodeList.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLSlotElement', () => { @@ -32,7 +32,7 @@ describe('HTMLSlotElement', () => { describe('get name()', () => { it('Returns attribute value.', () => { - const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); + const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); expect(slot.name).toBe(''); slot.setAttribute('name', 'value'); expect(slot.name).toBe('value'); @@ -41,7 +41,7 @@ describe('HTMLSlotElement', () => { describe('set name()', () => { it('Sets attribute value.', () => { - const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); + const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); slot.name = 'value'; expect(slot.getAttribute('name')).toBe('value'); }); @@ -49,7 +49,7 @@ describe('HTMLSlotElement', () => { describe('assign()', () => { it("Sets the slot's manually assigned nodes to an ordered set of slottables.", () => { - const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); + const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); // TODO: Do nothing for now. We need to find an example of how it is expected to work before it can be implemented. expect(slot.assign()).toBe(undefined); }); @@ -57,7 +57,7 @@ describe('HTMLSlotElement', () => { describe('assignedNodes()', () => { it('Returns nodes appended to the custom element.', () => { - const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); + const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); const text = document.createTextNode('text'); const comment = document.createComment('text'); const div = document.createElement('div'); @@ -84,7 +84,7 @@ describe('HTMLSlotElement', () => { customElementWithNamedSlots.appendChild(div); customElementWithNamedSlots.appendChild(span); - const slots = >( + const slots = >( customElementWithNamedSlots.shadowRoot.querySelectorAll('slot') ); @@ -95,7 +95,7 @@ describe('HTMLSlotElement', () => { describe('assignedElements()', () => { it('Returns elements appended to the custom element.', () => { - const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); + const slot = customElementWithSlot.shadowRoot?.querySelector('slot'); const text = document.createTextNode('text'); const comment = document.createComment('text'); const div = document.createElement('div'); @@ -126,7 +126,7 @@ describe('HTMLSlotElement', () => { customElementWithNamedSlots.appendChild(span1); customElementWithNamedSlots.appendChild(span2); - const slots = >( + const slots = >( customElementWithNamedSlots.shadowRoot.querySelectorAll('slot') ); diff --git a/packages/happy-dom/test/nodes/html-style-element/HTMLStyleElement.test.ts b/packages/happy-dom/test/nodes/html-style-element/HTMLStyleElement.test.ts index 48fd9a2ee..4572db21b 100644 --- a/packages/happy-dom/test/nodes/html-style-element/HTMLStyleElement.test.ts +++ b/packages/happy-dom/test/nodes/html-style-element/HTMLStyleElement.test.ts @@ -1,18 +1,18 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLStyleElement from '../../../src/nodes/html-style-element/IHTMLStyleElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLStyleElement from '../../../src/nodes/html-style-element/HTMLStyleElement.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLStyleElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLStyleElement; + let window: Window; + let document: Document; + let element: HTMLStyleElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('style'); + element = document.createElement('style'); }); describe('Object.prototype.toString', () => { diff --git a/packages/happy-dom/test/nodes/html-template-element/HTMLTemplateElement.test.ts b/packages/happy-dom/test/nodes/html-template-element/HTMLTemplateElement.test.ts index ff3d7b865..896ab418e 100644 --- a/packages/happy-dom/test/nodes/html-template-element/HTMLTemplateElement.test.ts +++ b/packages/happy-dom/test/nodes/html-template-element/HTMLTemplateElement.test.ts @@ -1,20 +1,20 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLTemplateElement from '../../../src/nodes/html-template-element/IHTMLTemplateElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLTemplateElement from '../../../src/nodes/html-template-element/HTMLTemplateElement.js'; import XMLSerializer from '../../../src/xml-serializer/XMLSerializer.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import CustomElement from '../../CustomElement.js'; describe('HTMLTemplateElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLTemplateElement; + let window: Window; + let document: Document; + let element: HTMLTemplateElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('template'); + element = document.createElement('template'); }); afterEach(() => { diff --git a/packages/happy-dom/test/nodes/html-text-area-element/HTMLTextAreaElement.test.ts b/packages/happy-dom/test/nodes/html-text-area-element/HTMLTextAreaElement.test.ts index dac5e724a..0a5ae0abb 100644 --- a/packages/happy-dom/test/nodes/html-text-area-element/HTMLTextAreaElement.test.ts +++ b/packages/happy-dom/test/nodes/html-text-area-element/HTMLTextAreaElement.test.ts @@ -1,23 +1,23 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; -import IHTMLTextAreaElement from '../../../src/nodes/html-text-area-element/IHTMLTextAreaElement.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; +import HTMLTextAreaElement from '../../../src/nodes/html-text-area-element/HTMLTextAreaElement.js'; import HTMLInputElementSelectionModeEnum from '../../../src/nodes/html-input-element/HTMLInputElementSelectionModeEnum.js'; import HTMLInputElementSelectionDirectionEnum from '../../../src/nodes/html-input-element/HTMLInputElementSelectionDirectionEnum.js'; import ValidityState from '../../../src/validity-state/ValidityState.js'; import Event from '../../../src/event/Event.js'; -import IText from '../../../src/nodes/text/IText.js'; +import Text from '../../../src/nodes/text/Text.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('HTMLTextAreaElement', () => { - let window: IWindow; - let document: IDocument; - let element: IHTMLTextAreaElement; + let window: Window; + let document: Document; + let element: HTMLTextAreaElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElement('textarea'); + element = document.createElement('textarea'); }); describe('Object.prototype.toString', () => { @@ -49,7 +49,7 @@ describe('HTMLTextAreaElement', () => { expect(element.selectionDirection).toBe(HTMLInputElementSelectionDirectionEnum.none); element.selectionDirection = HTMLInputElementSelectionDirectionEnum.forward; - (element.childNodes[0]).data = 'NEW_TEST_VALUE'; + (element.childNodes[0]).data = 'NEW_TEST_VALUE'; expect(element.selectionStart).toBe(14); expect(element.selectionEnd).toBe(14); expect(element.selectionDirection).toBe(HTMLInputElementSelectionDirectionEnum.none); diff --git a/packages/happy-dom/test/nodes/node/Node.test.ts b/packages/happy-dom/test/nodes/node/Node.test.ts index 58f1586b3..80334c8b0 100644 --- a/packages/happy-dom/test/nodes/node/Node.test.ts +++ b/packages/happy-dom/test/nodes/node/Node.test.ts @@ -1,6 +1,6 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; import Node from '../../../src/nodes/node/Node.js'; import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; import HTMLTemplateElement from '../../../src/nodes/html-template-element/HTMLTemplateElement.js'; @@ -11,12 +11,12 @@ import Text from '../../../src/nodes/text/Text.js'; import EventPhaseEnum from '../../../src/event/EventPhaseEnum.js'; import ErrorEvent from '../../../src/event/events/ErrorEvent.js'; import { beforeEach, describe, it, expect } from 'vitest'; -import IShadowRoot from '../../../src/nodes/shadow-root/IShadowRoot.js'; +import ShadowRoot from '../../../src/nodes/shadow-root/ShadowRoot.js'; import NodeFactory from '../../../src/nodes/NodeFactory.js'; describe('Node', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; let customElementOutput; beforeEach(() => { @@ -41,7 +41,7 @@ describe('Node', () => { * Connected. */ public connectedCallback(): void { - (this.shadowRoot).innerHTML = '
Test
'; + (this.shadowRoot).innerHTML = '
Test
'; (this.constructor).output.push('Counter:connected'); } @@ -343,7 +343,7 @@ describe('Node', () => { document.body.appendChild(customElement); - const rootNode = (customElement.shadowRoot).querySelector('span')?.getRootNode(); + const rootNode = (customElement.shadowRoot).querySelector('span')?.getRootNode(); expect(rootNode === customElement.shadowRoot).toBe(true); }); @@ -353,7 +353,7 @@ describe('Node', () => { document.body.appendChild(customElement); - const rootNode = (customElement.shadowRoot) + const rootNode = (customElement.shadowRoot) .querySelector('span') ?.getRootNode({ composed: true }); diff --git a/packages/happy-dom/test/nodes/node/NodeUtility.test.ts b/packages/happy-dom/test/nodes/node/NodeUtility.test.ts index d2497e081..70b0ab782 100644 --- a/packages/happy-dom/test/nodes/node/NodeUtility.test.ts +++ b/packages/happy-dom/test/nodes/node/NodeUtility.test.ts @@ -1,14 +1,14 @@ import Window from '../../../src/window/Window.js'; -import IWindow from '../../../src/window/IWindow.js'; -import IDocument from '../../../src/nodes/document/IDocument.js'; +import Window from '../../../src/window/Window.js'; +import Document from '../../../src/nodes/document/Document.js'; import NodeUtility from '../../../src/nodes/node/NodeUtility.js'; import NodeTypeEnum from '../../../src/nodes/node/NodeTypeEnum.js'; import * as PropertySymbol from '../../../src/PropertySymbol.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('NodeUtility', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/nodes/shadow-root/ShadowRoot.test.ts b/packages/happy-dom/test/nodes/shadow-root/ShadowRoot.test.ts index bce07d12b..6ae5ae3b6 100644 --- a/packages/happy-dom/test/nodes/shadow-root/ShadowRoot.test.ts +++ b/packages/happy-dom/test/nodes/shadow-root/ShadowRoot.test.ts @@ -1,4 +1,4 @@ -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; import CustomElement from '../../CustomElement.js'; @@ -20,8 +20,8 @@ describe('ShadowRoot', () => { shadowRoot.innerHTML = '
Test
'; expect(shadowRoot.childNodes.length).toBe(1); expect(shadowRoot.childNodes[0].childNodes.length).toBe(1); - expect((shadowRoot.childNodes[0]).tagName).toBe('DIV'); - expect((shadowRoot.childNodes[0].childNodes[0]).tagName).toBe('SPAN'); + expect((shadowRoot.childNodes[0]).tagName).toBe('DIV'); + expect((shadowRoot.childNodes[0].childNodes[0]).tagName).toBe('SPAN'); }); }); @@ -38,8 +38,8 @@ describe('ShadowRoot', () => { it('Returns the currently active element within the ShadowRoot.', () => { const customElement = document.createElement('custom-element'); const shadowRoot = customElement.shadowRoot; - const div = document.createElement('div'); - const span = document.createElement('span'); + const div = document.createElement('div'); + const span = document.createElement('span'); document.body.appendChild(customElement); @@ -70,7 +70,7 @@ describe('ShadowRoot', () => { it('Unsets the active element when it gets disconnected.', () => { const customElement = document.createElement('custom-element'); const shadowRoot = customElement.shadowRoot; - const div = document.createElement('div'); + const div = document.createElement('div'); document.body.appendChild(customElement); diff --git a/packages/happy-dom/test/nodes/svg-element/SVGElement.test.ts b/packages/happy-dom/test/nodes/svg-element/SVGElement.test.ts index 6409091ad..da4557230 100644 --- a/packages/happy-dom/test/nodes/svg-element/SVGElement.test.ts +++ b/packages/happy-dom/test/nodes/svg-element/SVGElement.test.ts @@ -1,23 +1,23 @@ import Window from '../../../src/window/Window.js'; import Document from '../../../src/nodes/document/Document.js'; -import ISVGSVGElement from '../../../src/nodes/svg-element/ISVGSVGElement.js'; +import SVGSVGElement from '../../../src/nodes/svg-element/SVGSVGElement.js'; import NamespaceURI from '../../../src/config/NamespaceURI.js'; -import ISVGElement from '../../../src/nodes/svg-element/ISVGElement.js'; +import SVGElement from '../../../src/nodes/svg-element/SVGElement.js'; import HTMLElementUtility from '../../../src/nodes/html-element/HTMLElementUtility.js'; import { beforeEach, describe, it, expect, vi, afterEach } from 'vitest'; -import IHTMLElement from '../../../src/nodes/html-element/IHTMLElement.js'; +import HTMLElement from '../../../src/nodes/html-element/HTMLElement.js'; describe('SVGElement', () => { let window: Window; let document: Document; - let element: ISVGSVGElement; - let line: ISVGElement; + let element: SVGSVGElement; + let line: SVGElement; beforeEach(() => { window = new Window(); document = window.document; - element = document.createElementNS(NamespaceURI.svg, 'svg'); - line = document.createElementNS(NamespaceURI.svg, 'line'); + element = document.createElementNS(NamespaceURI.svg, 'svg'); + line = document.createElementNS(NamespaceURI.svg, 'line'); }); afterEach(() => { @@ -92,11 +92,11 @@ describe('SVGElement', () => { describe('blur()', () => { it('Calls HTMLElementUtility.blur().', () => { - let blurredElement: ISVGElement | null = null; + let blurredElement: SVGElement | null = null; vi.spyOn(HTMLElementUtility, 'blur').mockImplementation( - (element: ISVGElement | IHTMLElement) => { - blurredElement = element; + (element: SVGElement | HTMLElement) => { + blurredElement = element; } ); @@ -108,11 +108,11 @@ describe('SVGElement', () => { describe('focus()', () => { it('Calls HTMLElementUtility.focus().', () => { - let focusedElement: ISVGElement | null = null; + let focusedElement: SVGElement | null = null; vi.spyOn(HTMLElementUtility, 'focus').mockImplementation( - (element: ISVGElement | IHTMLElement) => { - focusedElement = element; + (element: SVGElement | HTMLElement) => { + focusedElement = element; } ); diff --git a/packages/happy-dom/test/permissions/Permissions.test.ts b/packages/happy-dom/test/permissions/Permissions.test.ts index 7ad176659..dba5f883a 100644 --- a/packages/happy-dom/test/permissions/Permissions.test.ts +++ b/packages/happy-dom/test/permissions/Permissions.test.ts @@ -1,10 +1,10 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import PermissionNameEnum from '../../src/permissions/PermissionNameEnum.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('Permissions', () => { - let window: IWindow; + let window: Window; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/query-selector/QuerySelector.test.ts b/packages/happy-dom/test/query-selector/QuerySelector.test.ts index 9df87f251..e29230848 100644 --- a/packages/happy-dom/test/query-selector/QuerySelector.test.ts +++ b/packages/happy-dom/test/query-selector/QuerySelector.test.ts @@ -1,15 +1,15 @@ -import IHTMLElement from '../../src/nodes/html-element/IHTMLElement.js'; +import HTMLElement from '../../src/nodes/html-element/HTMLElement.js'; import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import QuerySelectorHTML from './data/QuerySelectorHTML.js'; import QuerySelectorNthChildHTML from './data/QuerySelectorNthChildHTML.js'; -import IHTMLInputElement from '../../src/nodes/html-input-element/IHTMLInputElement.js'; +import HTMLInputElement from '../../src/nodes/html-input-element/HTMLInputElement.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('QuerySelector', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -155,7 +155,7 @@ describe('QuerySelector', () => { }); it('Returns a NodeList with the method item().', () => { - const container = document.createElement('div'); + const container = document.createElement('div'); container.innerHTML = QuerySelectorHTML; const elements = container.querySelectorAll('span'); expect(elements.item(0) === container.children[0].children[1].children[0]).toBe(true); @@ -691,18 +691,18 @@ describe('QuerySelector', () => { expect(elements.length).toBe(1); expect(elements[0] === container.children[0].children[0]).toBe(true); - const input = elements[0]; + const input = elements[0]; expect(input.value).toBe('one'); - const twoEl = container.querySelector("input[value='two']"); + const twoEl = container.querySelector("input[value='two']"); twoEl.checked = true; elements = container.querySelectorAll('input[name="op"]:checked'); expect(elements.length).toBe(1); expect(elements[0] === container.children[0].children[1]).toBe(true); - expect((elements[0]).value).toBe('two'); + expect((elements[0]).value).toBe('two'); }); it('Returns all elements matching "span:not([type=hidden])".', () => { diff --git a/packages/happy-dom/test/range/Range.test.ts b/packages/happy-dom/test/range/Range.test.ts index 5d3b4673e..6ff6ab3bb 100644 --- a/packages/happy-dom/test/range/Range.test.ts +++ b/packages/happy-dom/test/range/Range.test.ts @@ -1,15 +1,15 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import Range from '../../src/range/Range.js'; import NodeTypeEnum from '../../src/nodes/node/NodeTypeEnum.js'; -import IText from '../../src/nodes/text/IText.js'; +import Text from '../../src/nodes/text/Text.js'; import DOMRect from '../../src/nodes/element/DOMRect.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('Range', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; let range: Range; beforeEach(() => { @@ -271,7 +271,7 @@ describe('Range', () => { expect(documentFragment.nodeType).toBe(NodeTypeEnum.documentFragmentNode); expect(documentFragment.childNodes.length).toBe(1); expect(documentFragment.firstChild.nodeType).toBe(NodeTypeEnum.textNode); - expect((documentFragment.firstChild).data).toBe('My text'); + expect((documentFragment.firstChild).data).toBe('My text'); document.body.appendChild(documentFragment); @@ -392,7 +392,7 @@ describe('Range', () => { }); describe('getClientRects()', () => { - it('Returns an empty IDOMRectList.', () => { + it('Returns an empty DOMRectList.', () => { const clientRects = range.getClientRects(); expect(Array.isArray(clientRects)).toBe(true); expect(typeof clientRects.item).toBe('function'); diff --git a/packages/happy-dom/test/selection/Selection.test.ts b/packages/happy-dom/test/selection/Selection.test.ts index 5cec5d2fb..2c7f32580 100644 --- a/packages/happy-dom/test/selection/Selection.test.ts +++ b/packages/happy-dom/test/selection/Selection.test.ts @@ -1,6 +1,6 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import Selection from '../../src/selection/Selection.js'; import SelectionDirectionEnum from '../../src/selection/SelectionDirectionEnum.js'; import DOMException from '../../src/exception/DOMException.js'; @@ -10,8 +10,8 @@ import { beforeEach, describe, it, expect } from 'vitest'; import Event from '../../src/event/Event.js'; describe('Selection', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; let selection: Selection; beforeEach(() => { diff --git a/packages/happy-dom/test/tree-walker/NodeIterator.test.ts b/packages/happy-dom/test/tree-walker/NodeIterator.test.ts index f4ed31ce0..5e27221e1 100644 --- a/packages/happy-dom/test/tree-walker/NodeIterator.test.ts +++ b/packages/happy-dom/test/tree-walker/NodeIterator.test.ts @@ -1,13 +1,13 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import NodeFilter from '../../src/tree-walker/NodeFilter.js'; import Element from '../../src/nodes/element/Element.js'; import Comment from '../../src/nodes/comment/Comment.js'; import Node from '../../src/nodes/node/Node.js'; import TreeWalkerHTML from './data/TreeWalkerHTML.js'; import { beforeEach, describe, it, expect } from 'vitest'; -import INode from '../../src/nodes/node/INode.js'; +import Node from '../../src/nodes/node/Node.js'; const NODE_TO_STRING = (node: Node): string => { if (node instanceof Element) { @@ -19,8 +19,8 @@ const NODE_TO_STRING = (node: Node): string => { }; describe('NodeIterator', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -167,9 +167,9 @@ describe('NodeIterator', () => { describe('previousNode()', () => { it('Returns the previous node when executed after a nextNode() call.', () => { const NodeIterator = document.createNodeIterator(document.body); - let expectedPreviousNode: INode | null = null; - let previousNode: INode | null = null; - let currentNode: INode | null = null; + let expectedPreviousNode: Node | null = null; + let previousNode: Node | null = null; + let currentNode: Node | null = null; while ((currentNode = NodeIterator.nextNode())) { if (previousNode) { diff --git a/packages/happy-dom/test/tree-walker/TreeWalker.test.ts b/packages/happy-dom/test/tree-walker/TreeWalker.test.ts index 7aeb7c081..1da1712d4 100644 --- a/packages/happy-dom/test/tree-walker/TreeWalker.test.ts +++ b/packages/happy-dom/test/tree-walker/TreeWalker.test.ts @@ -1,13 +1,13 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import NodeFilter from '../../src/tree-walker/NodeFilter.js'; import Element from '../../src/nodes/element/Element.js'; import Comment from '../../src/nodes/comment/Comment.js'; import Node from '../../src/nodes/node/Node.js'; import TreeWalkerHTML from './data/TreeWalkerHTML.js'; import { beforeEach, describe, it, expect } from 'vitest'; -import INode from '../../src/nodes/node/INode.js'; +import Node from '../../src/nodes/node/Node.js'; const NODE_TO_STRING = (node: Node): string => { if (node instanceof Element) { @@ -20,8 +20,8 @@ const NODE_TO_STRING = (node: Node): string => { }; describe('TreeWalker', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -168,9 +168,9 @@ describe('TreeWalker', () => { describe('previousNode()', () => { it('Returns the previous node when executed after a nextNode() call.', () => { const treeWalker = document.createTreeWalker(document.body); - let expectedPreviousNode: INode | null = null; - let previousNode: INode | null = null; - let currentNode: INode | null = null; + let expectedPreviousNode: Node | null = null; + let previousNode: Node | null = null; + let currentNode: Node | null = null; while ((currentNode = treeWalker.nextNode())) { if (previousNode) { diff --git a/packages/happy-dom/test/validity-state/ValidityState.test.ts b/packages/happy-dom/test/validity-state/ValidityState.test.ts index 9a615e3dc..4228b24fe 100644 --- a/packages/happy-dom/test/validity-state/ValidityState.test.ts +++ b/packages/happy-dom/test/validity-state/ValidityState.test.ts @@ -1,12 +1,12 @@ -import IWindow from '../../src/window/IWindow.js'; import Window from '../../src/window/Window.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; -import IHTMLInputElement from '../../src/nodes/html-input-element/IHTMLInputElement.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; +import HTMLInputElement from '../../src/nodes/html-input-element/HTMLInputElement.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('ValidityState', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -15,7 +15,7 @@ describe('ValidityState', () => { describe('get badInput()', () => { it('Returns "false" for a valid "number" input field.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '123'; input.type = 'number'; @@ -24,7 +24,7 @@ describe('ValidityState', () => { }); it('Returns "false" for a valid "range" input field.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '123'; input.type = 'range'; @@ -33,7 +33,7 @@ describe('ValidityState', () => { }); it('Returns "true" for a "number" input field with non digit characters in the value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = 'a123'; input.type = 'number'; @@ -42,7 +42,7 @@ describe('ValidityState', () => { }); it('Returns "true" for a "range" input field with non digit characters in the value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = 'a123'; input.type = 'range'; @@ -53,7 +53,7 @@ describe('ValidityState', () => { describe('get customError()', () => { it('Returns "true" if the field has a custom error message.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); expect(input.validity.customError).toBe(false); @@ -65,7 +65,7 @@ describe('ValidityState', () => { describe('get patternMismatch()', () => { it('Returns "true" if a defined pattern doesn\'nt match.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = 'a123'; input.pattern = '[0-9]'; @@ -84,7 +84,7 @@ describe('ValidityState', () => { describe('get rangeOverflow()', () => { it('Returns "true" if a "number" input field has a "max" set to a value lower than the value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '10'; input.max = '9'; @@ -98,7 +98,7 @@ describe('ValidityState', () => { }); it('Returns "true" if a "range" input field has a "max" set to a value greater than the value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '10'; input.max = '9'; @@ -114,7 +114,7 @@ describe('ValidityState', () => { describe('get rangeUnderflow()', () => { it('Returns "true" if a "number" input field has a "min" set to a value lower than the value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '9'; input.min = '10'; @@ -128,7 +128,7 @@ describe('ValidityState', () => { }); it('Returns "true" if a "range" input field has a "min" set to a value lower than the value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '9'; input.min = '10'; @@ -144,7 +144,7 @@ describe('ValidityState', () => { describe('get stepMismatch()', () => { it('Returns "true" if a "number" input field has "step" set to a non-steppable value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '9'; input.step = '2'; @@ -158,7 +158,7 @@ describe('ValidityState', () => { }); it('Returns "true" if a "range" input field has "step" set to a non-steppable value.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = '9'; input.step = '2'; @@ -174,7 +174,7 @@ describe('ValidityState', () => { describe('get tooLong()', () => { it('Returns "true" for an input field that has "maxLength" set and the length of "value" is longer.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = 'abcdef'; input.maxLength = 3; @@ -187,7 +187,7 @@ describe('ValidityState', () => { }); it('Returns "true" for an text area field that has "maxLength" set and the length of "value" is longer.', () => { - const textarea = document.createElement('textarea'); + const textarea = document.createElement('textarea'); textarea.value = 'abcdef'; textarea.maxLength = 3; @@ -202,7 +202,7 @@ describe('ValidityState', () => { describe('get tooShort()', () => { it('Returns "true" for an input field that has "minLength" set and the length of "value" is shorter.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = 'abc'; input.minLength = 6; @@ -215,7 +215,7 @@ describe('ValidityState', () => { }); it('Returns "true" for an text area field that has "minLength" set and the length of "value" is shorter.', () => { - const textarea = document.createElement('textarea'); + const textarea = document.createElement('textarea'); textarea.value = 'abc'; textarea.minLength = 6; @@ -230,7 +230,7 @@ describe('ValidityState', () => { describe('get typeMismatch()', () => { it('Returns "true" for an "email" input field with a value that is not an email.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = 'name@domain.'; input.type = 'email'; @@ -243,7 +243,7 @@ describe('ValidityState', () => { }); it('Returns "true" for an "url" input field with a value that is not an URL.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.value = 'domain.com/path/'; input.type = 'url'; @@ -258,14 +258,14 @@ describe('ValidityState', () => { describe('get valueMissing()', () => { it('Returns "false" when required is set to "false".', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); expect(input.required).toBe(false); expect(input.validity.valueMissing).toBe(false); }); it('Returns "true" when required is set to "true" for a "checkbox" input element where "checked" is set to "false".', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.type = 'checkbox'; input.required = true; @@ -279,7 +279,7 @@ describe('ValidityState', () => { }); it('Returns "true" when required is set to "true" for a "radio" input element where "checked" is set to "false".', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.type = 'radio'; input.required = true; @@ -293,7 +293,7 @@ describe('ValidityState', () => { }); it('Returns "true" when required is set to "true" for any element where "value" has not been set.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); input.required = true; @@ -307,7 +307,7 @@ describe('ValidityState', () => { describe('get valid()', () => { it('Returns "false" for an invalid field.', () => { - const input = document.createElement('input'); + const input = document.createElement('input'); expect(input.validity.valid).toBe(true); diff --git a/packages/happy-dom/test/window/BrowserWindow.test.ts b/packages/happy-dom/test/window/BrowserWindow.test.ts index f9d1bcb87..85fa79ed5 100644 --- a/packages/happy-dom/test/window/BrowserWindow.test.ts +++ b/packages/happy-dom/test/window/BrowserWindow.test.ts @@ -1,11 +1,11 @@ import CSSStyleDeclaration from '../../src/css/declaration/CSSStyleDeclaration.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; -import IHTMLLinkElement from '../../src/nodes/html-link-element/IHTMLLinkElement.js'; -import IHTMLElement from '../../src/nodes/html-element/IHTMLElement.js'; +import Document from '../../src/nodes/document/Document.js'; +import HTMLLinkElement from '../../src/nodes/html-link-element/HTMLLinkElement.js'; +import HTMLElement from '../../src/nodes/html-element/HTMLElement.js'; import ResourceFetch from '../../src/fetch/ResourceFetch.js'; -import IHTMLScriptElement from '../../src/nodes/html-script-element/IHTMLScriptElement.js'; -import IWindow from '../../src/window/IWindow.js'; -import IBrowserWindow from '../../src/window/IBrowserWindow.js'; +import HTMLScriptElement from '../../src/nodes/html-script-element/HTMLScriptElement.js'; +import Window from '../../src/window/Window.js'; +import BrowserWindow from '../../src/window/BrowserWindow.js'; import Navigator from '../../src/navigator/Navigator.js'; import Headers from '../../src/fetch/Headers.js'; import Selection from '../../src/selection/Selection.js'; @@ -14,8 +14,8 @@ import DOMExceptionNameEnum from '../../src/exception/DOMExceptionNameEnum.js'; import CustomElement from '../CustomElement.js'; import Request from '../../src/fetch/Request.js'; import Response from '../../src/fetch/Response.js'; -import IRequest from '../../src/fetch/types/IRequest.js'; -import IResponse from '../../src/fetch/types/IResponse.js'; +import Request from '../../src/fetch/Request.js'; +import Response from '../../src/fetch/Response.js'; import Fetch from '../../src/fetch/Fetch.js'; import MessageEvent from '../../src/event/events/MessageEvent.js'; import Event from '../../src/event/Event.js'; @@ -24,9 +24,9 @@ import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import Permissions from '../../src/permissions/Permissions.js'; import Clipboard from '../../src/clipboard/Clipboard.js'; import PackageVersion from '../../src/version.js'; -import IHTMLDialogElement from '../../src/nodes/html-dialog-element/IHTMLDialogElement.js'; +import HTMLDialogElement from '../../src/nodes/html-dialog-element/HTMLDialogElement.js'; import Browser from '../../src/browser/Browser.js'; -import ICrossOriginBrowserWindow from '../../src/window/ICrossOriginBrowserWindow.js'; +import CrossOriginBrowserWindow from '../../src/window/CrossOriginBrowserWindow.js'; import CrossOriginBrowserWindow from '../../src/window/CrossOriginBrowserWindow.js'; import BrowserFrameFactory from '../../src/browser/utilities/BrowserFrameFactory.js'; import IBrowser from '../../src/browser/types/IBrowser.js'; @@ -51,8 +51,8 @@ describe('BrowserWindow', () => { let browser: IBrowser; let browserPage: IBrowserPage; let browserFrame: IBrowserFrame; - let window: IBrowserWindow; - let document: IDocument; + let window: BrowserWindow; + let document: Document; beforeEach(() => { browser = new Browser(); @@ -310,7 +310,7 @@ describe('BrowserWindow', () => { describe('getComputedStyle()', () => { it('Handles default properties "display" and "direction".', () => { - const element = document.createElement('div'); + const element = document.createElement('div'); const computedStyle = window.getComputedStyle(element); expect(computedStyle.display).toBe(''); @@ -322,7 +322,7 @@ describe('BrowserWindow', () => { }); it('Handles default properties "display" on a dialog element.', () => { - const element = document.createElement('dialog'); + const element = document.createElement('dialog'); const computedStyle = window.getComputedStyle(element); expect(computedStyle.display).toBe(''); @@ -341,7 +341,7 @@ describe('BrowserWindow', () => { }); it('Returns a CSSStyleDeclaration object with computed styles that are live updated whenever the element styles are changed.', () => { - const element = document.createElement('div'); + const element = document.createElement('div'); const computedStyle = window.getComputedStyle(element); element.style.color = 'red'; @@ -360,8 +360,8 @@ describe('BrowserWindow', () => { }); it('Returns a CSSStyleDeclaration object with computed styles from style sheets.', () => { - const parent = document.createElement('div'); - const element = document.createElement('span'); + const parent = document.createElement('div'); + const element = document.createElement('span'); const computedStyle = window.getComputedStyle(element); const parentStyle = document.createElement('style'); const elementStyle = document.createElement('style'); @@ -424,7 +424,7 @@ describe('BrowserWindow', () => { }); it('Returns a CSSStyleDeclaration object with computed styles from style sheets for elements in a HTMLShadowRoot.', () => { - const element = document.createElement('span'); + const element = document.createElement('span'); const elementStyle = document.createElement('style'); const customElement = document.createElement('custom-element'); const elementComputedStyle = window.getComputedStyle(element); @@ -440,7 +440,7 @@ describe('BrowserWindow', () => { document.body.appendChild(customElement); const customElementComputedStyle = window.getComputedStyle( - customElement.shadowRoot?.querySelector('span') + customElement.shadowRoot?.querySelector('span') ); // Default value on HTML is "16px Times New Roman" @@ -454,7 +454,7 @@ describe('BrowserWindow', () => { }); it('Returns a CSSStyleDeclaration object with computed styles from adopted style sheets for elements in a HTMLShadowRoot.', () => { - const element = document.createElement('span'); + const element = document.createElement('span'); const customElement = ( document.createElement('adopted-style-sheet-custom-element') ); @@ -472,7 +472,7 @@ describe('BrowserWindow', () => { document.body.appendChild(customElement); const customElementComputedStyle = window.getComputedStyle( - customElement.shadowRoot?.querySelector('span') + customElement.shadowRoot?.querySelector('span') ); // Default value on HTML is "16px Times New Roman" @@ -486,8 +486,8 @@ describe('BrowserWindow', () => { }); it('Returns values defined by a CSS variables.', () => { - const parent = document.createElement('div'); - const element = document.createElement('span'); + const parent = document.createElement('div'); + const element = document.createElement('span'); const computedStyle = window.getComputedStyle(element); const parentStyle = document.createElement('style'); const elementStyle = document.createElement('style'); @@ -526,8 +526,8 @@ describe('BrowserWindow', () => { }); it('Returns values defined by a CSS variables when a fallback is used.', () => { - const parent = document.createElement('div'); - const element = document.createElement('span'); + const parent = document.createElement('div'); + const element = document.createElement('span'); const computedStyle = window.getComputedStyle(element); const parentStyle = document.createElement('style'); const elementStyle = document.createElement('style'); @@ -565,7 +565,7 @@ describe('BrowserWindow', () => { }); it('Returns values defined by a CSS variables when multiple fallbacks are used', () => { - const div = document.createElement('div'); + const div = document.createElement('div'); const divStyle = document.createElement('style'); divStyle.innerHTML = ` @@ -595,8 +595,8 @@ describe('BrowserWindow', () => { }); it('Returns a CSSStyleDeclaration object with computed styles containing "rem" and "em" measurement values converted to pixels.', () => { - const parent = document.createElement('div'); - const element = document.createElement('span'); + const parent = document.createElement('div'); + const element = document.createElement('span'); const computedStyle = window.getComputedStyle(element); const parentStyle = document.createElement('style'); const elementStyle = document.createElement('style'); @@ -631,8 +631,8 @@ describe('BrowserWindow', () => { }); it('Returns a CSSStyleDeclaration object with computed styles containing "%" measurement values that have not been converted, as it is not supported yet.', () => { - const parent = document.createElement('div'); - const element = document.createElement('span'); + const parent = document.createElement('div'); + const element = document.createElement('span'); const computedStyle = window.getComputedStyle(element); const parentStyle = document.createElement('style'); const elementStyle = document.createElement('style'); @@ -670,8 +670,8 @@ describe('BrowserWindow', () => { browser.settings.disableComputedStyleRendering = true; document = window.document; - const parent = document.createElement('div'); - const element = document.createElement('span'); + const parent = document.createElement('div'); + const element = document.createElement('span'); const computedStyle = window.getComputedStyle(element); const parentStyle = document.createElement('style'); const elementStyle = document.createElement('style'); @@ -716,7 +716,7 @@ describe('BrowserWindow', () => { { value: '1Q', result: '0.945px' } ]) { it(`Returns a CSSStyleDeclaration object with computed styles for a "${measurement.value}" measurement value converted to pixels.`, () => { - const element = document.createElement('div'); + const element = document.createElement('div'); element.style.width = measurement.value; document.body.appendChild(element); expect(window.getComputedStyle(element).width).toBe(measurement.result); @@ -1063,25 +1063,25 @@ describe('BrowserWindow', () => { describe('fetch()', () => { it(`Forwards the request to Fetch and calls Fetch.send().`, async () => { const expectedURL = 'https://localhost:8080/path/'; - const expectedResponse = {}; + const expectedResponse = {}; const requestInit = { method: 'PUT', headers: { 'test-header': 'test-value' } }; - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - request = this.request; + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + request = this.request; return Promise.resolve(expectedResponse); }); const response = await window.fetch(expectedURL, requestInit); expect(response).toBe(expectedResponse); - expect(((request)).url).toBe(expectedURL); - expect(((request)).headers.get('test-header')).toBe('test-value'); + expect(((request)).url).toBe(expectedURL); + expect(((request)).headers.get('test-header')).toBe('test-value'); }); }); @@ -1176,9 +1176,9 @@ describe('BrowserWindow', () => { const jsURL = 'https://localhost:8080/path/to/file.js'; const cssResponse = 'body { background-color: red; }'; const jsResponse = 'globalThis.test = "test";'; - let resourceFetchCSSWindow: IBrowserWindow | null = null; + let resourceFetchCSSWindow: BrowserWindow | null = null; let resourceFetchCSSURL: string | null = null; - let resourceFetchJSWindow: IBrowserWindow | null = null; + let resourceFetchJSWindow: BrowserWindow | null = null; let resourceFetchJSURL: string | null = null; let loadEvent: Event | null = null; @@ -1198,11 +1198,11 @@ describe('BrowserWindow', () => { loadEvent = event; }); - const script = document.createElement('script'); + const script = document.createElement('script'); script.async = true; script.src = jsURL; - const link = document.createElement('link'); + const link = document.createElement('link'); link.href = cssURL; link.rel = 'stylesheet'; @@ -1233,7 +1233,7 @@ describe('BrowserWindow', () => { errorEvents.push(event); }); - const script = document.createElement('script'); + const script = document.createElement('script'); script.innerText = 'throw new Error("Script error");'; document.body.appendChild(script); @@ -1400,13 +1400,13 @@ describe('BrowserWindow', () => { describe('open()', () => { it('Opens a new window without URL.', () => { - const newWindow = window.open(); + const newWindow = window.open(); expect(newWindow).toBeInstanceOf(BrowserWindow); expect(newWindow.location.href).toBe('about:blank'); }); it('Opens a URL with Javascript.', async () => { - const newWindow = window.open(`javascript:document.write('Test');`); + const newWindow = window.open(`javascript:document.write('Test');`); expect(newWindow).toBeInstanceOf(BrowserWindow); expect(newWindow.location.href).toBe('about:blank'); await new Promise((resolve) => setTimeout(resolve, 1)); @@ -1414,7 +1414,7 @@ describe('BrowserWindow', () => { }); it('Dispatches error event when the Javascript code is invalid.', async () => { - const newWindow = window.open(`javascript:document.write(test);`); + const newWindow = window.open(`javascript:document.write(test);`); let errorEvent: ErrorEvent | null = null; newWindow.addEventListener('error', (event) => (errorEvent = event)); expect(newWindow).toBeInstanceOf(BrowserWindow); @@ -1427,21 +1427,21 @@ describe('BrowserWindow', () => { it('Opens a new window with URL.', async () => { const html = 'Test'; - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - request = this.request; - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + request = this.request; + return Promise.resolve({ text: () => new Promise((resolve) => setTimeout(() => resolve(html))) }); }); browserFrame.url = 'https://localhost:8080/test/'; - const newWindow = window.open('/path/to/file.html'); + const newWindow = window.open('/path/to/file.html'); expect(newWindow).toBeInstanceOf(BrowserWindow); expect(newWindow.location.href).toBe('https://localhost:8080/path/to/file.html'); - expect(((request)).url).toBe('https://localhost:8080/path/to/file.html'); + expect(((request)).url).toBe('https://localhost:8080/path/to/file.html'); await new Promise((resolve) => { newWindow.addEventListener('load', () => { @@ -1452,7 +1452,7 @@ describe('BrowserWindow', () => { }); it('Sets width, height, top and left when popup is set as a feature.', () => { - const newWindow = ( + const newWindow = ( window.open('', '', 'popup=yes,width=100,height=200,top=300,left=400') ); expect(newWindow).toBeInstanceOf(BrowserWindow); @@ -1465,7 +1465,7 @@ describe('BrowserWindow', () => { }); it(`Doesn't Sets width, height, top and left when popup is set as a feature.`, () => { - const newWindow = window.open('', '', 'width=100,height=200,top=300,left=400'); + const newWindow = window.open('', '', 'width=100,height=200,top=300,left=400'); expect(newWindow).toBeInstanceOf(BrowserWindow); expect(newWindow.innerWidth).toBe(1024); expect(newWindow.innerHeight).toBe(768); @@ -1476,7 +1476,7 @@ describe('BrowserWindow', () => { }); it('Sets the target as name on the Window instance.', () => { - const newWindow = window.open('', 'test'); + const newWindow = window.open('', 'test'); expect(newWindow).toBeInstanceOf(BrowserWindow); expect(newWindow.name).toBe('test'); }); @@ -1484,14 +1484,14 @@ describe('BrowserWindow', () => { it(`Doesn't set opener if "noopener" has been specified as a feature without an URL.`, () => { const browser = new Browser(); const page = browser.newPage(); - const newWindow = page.mainFrame.window.open('', '', 'noopener'); + const newWindow = page.mainFrame.window.open('', '', 'noopener'); expect(newWindow).toBe(null); expect(browser.defaultContext.pages[1].mainFrame.window.opener).toBe(null); }); it(`Doesn't set opener if "noopener" has been specified as a feature when opening an URL.`, () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); @@ -1499,7 +1499,7 @@ describe('BrowserWindow', () => { const browser = new Browser(); const page = browser.newPage(); page.mainFrame.url = 'https://www.github.com/capricorn86/happy-dom/'; - const newWindow = page.mainFrame.window.open('/test/', '', 'noopener'); + const newWindow = page.mainFrame.window.open('/test/', '', 'noopener'); expect(newWindow).toBe(null); expect(browser.defaultContext.pages[1].mainFrame.window.opener).toBe(null); }); @@ -1508,18 +1508,18 @@ describe('BrowserWindow', () => { const browser = new Browser(); const page = browser.newPage(); const html = 'Test'; - let request: IRequest | null = null; + let request: Request | null = null; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - request = this.request; - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + request = this.request; + return Promise.resolve({ text: () => new Promise((resolve) => setTimeout(() => resolve(html))) }); }); page.mainFrame.url = 'https://www.github.com/capricorn86/happy-dom/'; - const newWindow = ( + const newWindow = ( page.mainFrame.window.open('https://developer.mozilla.org/en-US/docs/Web/API/Window/open') ); @@ -1530,7 +1530,7 @@ describe('BrowserWindow', () => { expect(browser.defaultContext.pages[1].mainFrame.url).toBe( 'https://developer.mozilla.org/en-US/docs/Web/API/Window/open' ); - expect(((request)).url).toBe( + expect(((request)).url).toBe( 'https://developer.mozilla.org/en-US/docs/Web/API/Window/open' ); @@ -1554,11 +1554,11 @@ describe('BrowserWindow', () => { const browser = new Browser(); const page = browser.newPage(); - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return Promise.reject(new Error('Test error')); }); - page.mainFrame.window.open('https://www.github.com/'); + page.mainFrame.window.open('https://www.github.com/'); await new Promise((resolve) => setTimeout(resolve, 1)); @@ -1580,7 +1580,7 @@ describe('BrowserWindow', () => { }); it(`Resize a popup window.`, () => { - const newWindow = window.open('', '', 'popup'); + const newWindow = window.open('', '', 'popup'); newWindow.resizeTo(100, 200); expect(newWindow.innerWidth).toBe(100); expect(newWindow.innerHeight).toBe(200); @@ -1599,7 +1599,7 @@ describe('BrowserWindow', () => { }); it(`Resize a popup window.`, () => { - const newWindow = window.open('', '', 'popup'); + const newWindow = window.open('', '', 'popup'); newWindow.resizeBy(-100, -200); expect(newWindow.innerWidth).toBe(1024 - 100); expect(newWindow.innerHeight).toBe(768 - 200); diff --git a/packages/happy-dom/test/window/DetachedWindowAPI.test.ts b/packages/happy-dom/test/window/DetachedWindowAPI.test.ts index e8f28d5cb..78e64e3ad 100644 --- a/packages/happy-dom/test/window/DetachedWindowAPI.test.ts +++ b/packages/happy-dom/test/window/DetachedWindowAPI.test.ts @@ -1,5 +1,5 @@ import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import HTTP from 'http'; import Stream from 'stream'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; @@ -9,7 +9,7 @@ import DefaultBrowserSettings from '../../src/browser/DefaultBrowserSettings.js' import '../types.d.js'; describe('DetachedWindowAPI', () => { - let window: IWindow; + let window: Window; beforeEach(() => { window = new Window(); diff --git a/packages/happy-dom/test/window/GlobalWindow.test.ts b/packages/happy-dom/test/window/GlobalWindow.test.ts index 8f3087342..c30733a00 100644 --- a/packages/happy-dom/test/window/GlobalWindow.test.ts +++ b/packages/happy-dom/test/window/GlobalWindow.test.ts @@ -1,9 +1,9 @@ import GlobalWindow from '../../src/window/GlobalWindow.js'; -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import { beforeEach, describe, it, expect } from 'vitest'; describe('GlobalWindow', () => { - let window: IWindow; + let window: Window; beforeEach(() => { window = new GlobalWindow(); diff --git a/packages/happy-dom/test/window/Window.test.ts b/packages/happy-dom/test/window/Window.test.ts index 3478b1f5d..ab49e1393 100644 --- a/packages/happy-dom/test/window/Window.test.ts +++ b/packages/happy-dom/test/window/Window.test.ts @@ -1,15 +1,15 @@ -import IDocument from '../../src/nodes/document/IDocument.js'; +import Document from '../../src/nodes/document/Document.js'; +import Window from '../../src/window/Window.js'; import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; import Headers from '../../src/fetch/Headers.js'; import CustomElement from '../../test/CustomElement.js'; -import IResponse from '../../src/fetch/types/IResponse.js'; +import Response from '../../src/fetch/Response.js'; import Fetch from '../../src/fetch/Fetch.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import VirtualConsole from '../../src/console/VirtualConsole.js'; import VirtualConsolePrinter from '../../src/console/VirtualConsolePrinter.js'; import PackageVersion from '../../src/version.js'; -import IHTMLIFrameElement from '../../src/nodes/html-iframe-element/IHTMLIFrameElement.js'; +import HTMLIFrameElement from '../../src/nodes/html-iframe-element/HTMLIFrameElement.js'; import DetachedWindowAPI from '../../src/window/DetachedWindowAPI.js'; import '../types.d.js'; import BrowserErrorCaptureEnum from '../../src/browser/enums/BrowserErrorCaptureEnum.js'; @@ -26,8 +26,8 @@ const GET_NAVIGATOR_PLATFORM = (): string => { }; describe('Window', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -232,8 +232,8 @@ describe('Window', () => { it('Returns "undefined" when navigating an iframe for security reasons. The page loaded can potentially contain malicious code.', async () => { await new Promise((resolve) => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -241,11 +241,11 @@ describe('Window', () => { window.happyDOM?.setURL('https://localhost:8080'); - const iframe = document.createElement('iframe'); + const iframe = document.createElement('iframe'); iframe.src = 'https://localhost:8080/test/page/'; iframe.addEventListener('load', () => { - expect((iframe.contentWindow).happyDOM).toBeUndefined(); + expect((iframe.contentWindow).happyDOM).toBeUndefined(); resolve(null); }); @@ -255,8 +255,8 @@ describe('Window', () => { it('Returns "undefined" when opening a new page. The page loaded can potentially contain malicious code.', async () => { await new Promise((resolve) => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve(({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve(({ text: () => Promise.resolve('Test'), headers: new Headers() })); @@ -264,7 +264,7 @@ describe('Window', () => { window.happyDOM?.setURL('https://localhost:8080'); - const newWindow = window.open('https://localhost:8080/test/page/'); + const newWindow = window.open('https://localhost:8080/test/page/'); newWindow.addEventListener('load', () => { expect(newWindow.happyDOM).toBeUndefined(); @@ -276,7 +276,7 @@ describe('Window', () => { describe('open()', () => { it(`Doesn't navigate the browser if the target is the main frame of a detached browser.`, () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { throw new Error('This should not be called.'); }); @@ -293,23 +293,23 @@ describe('Window', () => { }); it(`Navigates the "_top" frame of a detached browser.`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); window.happyDOM?.setURL('https://localhost:8080'); - const newWindow = window.open('/test/1/', '_blank'); + const newWindow = window.open('/test/1/', '_blank'); expect(newWindow.name).toBe(''); newWindow.document.write(''); - const iframe = newWindow.document.querySelector('iframe'); - expect((iframe.contentWindow).happyDOM).toBeUndefined(); - const newWindow2 = ( - (iframe.contentWindow).open('https://localhost:8080/test/2/', '_top') + const iframe = newWindow.document.querySelector('iframe'); + expect((iframe.contentWindow).happyDOM).toBeUndefined(); + const newWindow2 = ( + (iframe.contentWindow).open('https://localhost:8080/test/2/', '_top') ); expect(newWindow2.name).toBe(''); @@ -321,23 +321,23 @@ describe('Window', () => { }); it(`Navigates the "_parent" frame of a detached browser.`, async () => { - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { - return Promise.resolve({ + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + return Promise.resolve({ text: () => Promise.resolve('Test') }); }); window.happyDOM?.setURL('https://localhost:8080'); - const newWindow = window.open('/test/1/', '_blank'); + const newWindow = window.open('/test/1/', '_blank'); expect(newWindow.name).toBe(''); newWindow.document.write(''); - const iframe = newWindow.document.querySelector('iframe'); - expect((iframe.contentWindow).happyDOM).toBeUndefined(); - const newWindow2 = ( - (iframe.contentWindow).open('https://localhost:8080/test/2/', '_parent') + const iframe = newWindow.document.querySelector('iframe'); + expect((iframe.contentWindow).happyDOM).toBeUndefined(); + const newWindow2 = ( + (iframe.contentWindow).open('https://localhost:8080/test/2/', '_parent') ); expect(newWindow2.name).toBe(''); diff --git a/packages/happy-dom/test/xml-http-request/XMLHttpRequest.test.ts b/packages/happy-dom/test/xml-http-request/XMLHttpRequest.test.ts index 6bfb5c3c2..a8f72f5eb 100644 --- a/packages/happy-dom/test/xml-http-request/XMLHttpRequest.test.ts +++ b/packages/happy-dom/test/xml-http-request/XMLHttpRequest.test.ts @@ -1,18 +1,18 @@ import XMLHttpRequest from '../../src/xml-http-request/XMLHttpRequest.js'; import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; +import Window from '../../src/window/Window.js'; import XMLHttpRequestReadyStateEnum from '../../src/xml-http-request/XMLHttpRequestReadyStateEnum.js'; import XMLHttpResponseTypeEnum from '../../src/xml-http-request/XMLHttpResponseTypeEnum.js'; import ProgressEvent from '../../src/event/events/ProgressEvent.js'; import Blob from '../../src/file/Blob.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Document from '../../src/nodes/document/Document.js'; import { beforeEach, afterEach, describe, it, expect, vi } from 'vitest'; import SyncFetch from '../../src/fetch/SyncFetch.js'; -import IResponse from '../../src/fetch/types/IResponse.js'; +import Response from '../../src/fetch/Response.js'; import ISyncResponse from '../../src/fetch/types/ISyncResponse.js'; import Fetch from '../../src/fetch/Fetch.js'; import Headers from '../../src/fetch/Headers.js'; -import IHeaders from '../../src/fetch/types/IHeaders.js'; +import Headers from '../../src/fetch/Headers.js'; import DOMException from '../../src/exception/DOMException.js'; import DOMExceptionNameEnum from '../../src/exception/DOMExceptionNameEnum.js'; import { ReadableStream } from 'stream/web'; @@ -46,7 +46,7 @@ const FORBIDDEN_REQUEST_HEADERS = [ ]; describe('XMLHttpRequest', () => { - let window: IWindow; + let window: Window; let request: XMLHttpRequest; beforeEach(() => { @@ -65,7 +65,7 @@ describe('XMLHttpRequest', () => { vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( () => { - headers: new Headers(), + headers: new Headers(), status: 201 } ); @@ -81,7 +81,7 @@ describe('XMLHttpRequest', () => { it('Returns status for asynchrounous requests.', async () => { await new Promise((resolve) => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( - async () => { headers: new Headers(), status: 201 } + async () => { headers: new Headers(), status: 201 } ); expect(request.status).toBe(0); @@ -105,7 +105,7 @@ describe('XMLHttpRequest', () => { expect(request.statusText).toBe(''); vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( - () => { headers: new Headers(), statusText } + () => { headers: new Headers(), statusText } ); request.open('GET', REQUEST_URL, false); @@ -119,7 +119,7 @@ describe('XMLHttpRequest', () => { const statusText = 'Test'; vi.spyOn(Fetch.prototype, 'send').mockImplementation( - async () => { headers: new Headers(), statusText } + async () => { headers: new Headers(), statusText } ); expect(request.statusText).toBe(''); @@ -143,8 +143,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -172,8 +172,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -201,8 +201,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -216,7 +216,7 @@ describe('XMLHttpRequest', () => { request.open('GET', REQUEST_URL, true); request.addEventListener('load', () => { - expect((request.response).documentElement.outerHTML).toBe( + expect((request.response).documentElement.outerHTML).toBe( 'Test' ); resolve(null); @@ -232,8 +232,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -261,8 +261,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -287,7 +287,7 @@ describe('XMLHttpRequest', () => { describe('get responseURL()', () => { it('Returns response URL for synchrounous requests.', () => { vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( - () => { headers: new Headers(), url: WINDOW_URL + REQUEST_URL } + () => { headers: new Headers(), url: WINDOW_URL + REQUEST_URL } ); expect(request.responseURL).toBe(''); @@ -301,7 +301,7 @@ describe('XMLHttpRequest', () => { it('Returns response URL for asynchrounous requests.', async () => { await new Promise((resolve) => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( - async () => { headers: new Headers(), url: WINDOW_URL + REQUEST_URL } + async () => { headers: new Headers(), url: WINDOW_URL + REQUEST_URL } ); expect(request.responseURL).toBe(''); @@ -321,7 +321,7 @@ describe('XMLHttpRequest', () => { describe('get readyState()', () => { it('Returns ready state for synchrounous requests.', () => { vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( - () => { headers: new Headers() } + () => { headers: new Headers() } ); expect(request.readyState).toBe(XMLHttpRequestReadyStateEnum.unsent); @@ -338,8 +338,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -376,7 +376,7 @@ describe('XMLHttpRequest', () => { const responseText = 'test'; vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( - () => { headers: new Headers(), body: Buffer.from(responseText) } + () => { headers: new Headers(), body: Buffer.from(responseText) } ); request.open('GET', REQUEST_URL, false); @@ -390,8 +390,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -427,7 +427,7 @@ describe('XMLHttpRequest', () => { it(`Throws an exception if readyState is "loading".`, async () => { await new Promise((resolve) => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( - async () => { headers: new Headers() } + async () => { headers: new Headers() } ); request.open('GET', REQUEST_URL, true); @@ -481,7 +481,7 @@ describe('XMLHttpRequest', () => { 'test-header': this.request.headers.get('test-header') } }; - return { headers: new Headers() }; + return { headers: new Headers() }; }); request.open('GET', REQUEST_URL, false); @@ -504,7 +504,7 @@ describe('XMLHttpRequest', () => { 'test-header': this.request.headers.get('test-header') } }; - return { headers: new Headers() }; + return { headers: new Headers() }; }); request.open('GET', REQUEST_URL, true); @@ -540,7 +540,7 @@ describe('XMLHttpRequest', () => { vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( () => { - headers: new Headers({ + headers: new Headers({ key1: 'value1', key2: 'value2' }) @@ -559,8 +559,8 @@ describe('XMLHttpRequest', () => { await new Promise((resolve) => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers({ + { + headers: new Headers({ key1: 'value1', key2: 'value2' }) @@ -591,7 +591,7 @@ describe('XMLHttpRequest', () => { vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( () => { - headers: new Headers({ + headers: new Headers({ key1: 'value1', key2: 'value2' }) @@ -608,8 +608,8 @@ describe('XMLHttpRequest', () => { await new Promise((resolve) => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers({ + { + headers: new Headers({ 'Content-Length': '4', key1: 'value1', key2: 'value2' @@ -651,7 +651,7 @@ describe('XMLHttpRequest', () => { const responseText = 'test'; vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( - () => { headers: new Headers(), body: Buffer.from(responseText) } + () => { headers: new Headers(), body: Buffer.from(responseText) } ); request.open('GET', REQUEST_URL, false); @@ -665,7 +665,7 @@ describe('XMLHttpRequest', () => { const responseText = 'test'; vi.spyOn(SyncFetch.prototype, 'send').mockImplementation( - () => { headers: new Headers(), body: Buffer.from(responseText) } + () => { headers: new Headers(), body: Buffer.from(responseText) } ); request.open('GET', REQUEST_URL, false); @@ -690,8 +690,8 @@ describe('XMLHttpRequest', () => { method: this.request.method, url: this.request.url }; - return { - headers: new Headers({ + return { + headers: new Headers({ 'Content-Length': String(responseText.length), 'Content-Type': 'text/html' }), @@ -743,8 +743,8 @@ describe('XMLHttpRequest', () => { method: this.request.method, url: this.request.url }; - return { - headers: new Headers({ + return { + headers: new Headers({ 'Content-Length': String(responseText.length), 'Content-Type': 'text/html' }), @@ -791,8 +791,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation( async () => - { - headers: new Headers(), + { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -825,8 +825,8 @@ describe('XMLHttpRequest', () => { method: this.request.method, url: this.request.url }; - return { - headers: new Headers({ + return { + headers: new Headers({ 'Content-Length': String(responseText.length), 'Content-Type': 'text/html' }), @@ -882,8 +882,8 @@ describe('XMLHttpRequest', () => { Authorization: this.request.headers.get('Authorization') } }; - return { - headers: new Headers({ + return { + headers: new Headers({ 'Content-Length': String(responseText.length), 'Content-Type': 'text/html' }), @@ -941,8 +941,8 @@ describe('XMLHttpRequest', () => { Authorization: this.request.headers.get('Authorization') } }; - return { - headers: new Headers({ + return { + headers: new Headers({ 'Content-Length': String(responseText.length), 'Content-Type': 'text/html' }), @@ -988,8 +988,8 @@ describe('XMLHttpRequest', () => { url: this.request.url, body: requestBody }; - return { - headers: new Headers({ + return { + headers: new Headers({ 'Content-Length': String(responseText.length), 'Content-Type': 'text/html' }), @@ -1079,8 +1079,8 @@ describe('XMLHttpRequest', () => { const responseText = 'responseText'; vi.spyOn(Fetch.prototype, 'send').mockImplementation(async function () { await new Promise((resolve) => setTimeout(resolve, 2)); - return { - headers: new Headers(), + return { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -1104,10 +1104,10 @@ describe('XMLHttpRequest', () => { return await new Promise((resolve) => { let isAborted = false; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return new Promise((resolve, reject) => { const timeout = setTimeout(() => { - resolve({ headers: new Headers() }); + resolve({ headers: new Headers() }); }, 50); this.request.signal.addEventListener('abort', () => { isAborted = true; @@ -1152,8 +1152,8 @@ describe('XMLHttpRequest', () => { vi.spyOn(Fetch.prototype, 'send').mockImplementation(async function () { await new Promise((resolve) => setTimeout(resolve, 2)); - return { - headers: new Headers(), + return { + headers: new Headers(), body: new ReadableStream({ start(controller) { controller.enqueue(responseText); @@ -1175,10 +1175,10 @@ describe('XMLHttpRequest', () => { it('Aborts an ongoing request when cancelling all Happy DOM asynchrounous tasks.', async () => { let isAborted = false; - vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { + vi.spyOn(Fetch.prototype, 'send').mockImplementation(function (): Promise { return new Promise((resolve, reject) => { const timeout = setTimeout(() => { - resolve({ headers: new Headers() }); + resolve({ headers: new Headers() }); }, 50); this.request.signal.addEventListener('abort', () => { isAborted = true; diff --git a/packages/happy-dom/test/xml-parser/XMLParser.test.ts b/packages/happy-dom/test/xml-parser/XMLParser.test.ts index 9d56aafc0..13a30abad 100644 --- a/packages/happy-dom/test/xml-parser/XMLParser.test.ts +++ b/packages/happy-dom/test/xml-parser/XMLParser.test.ts @@ -1,14 +1,14 @@ import XMLParser from '../../src/xml-parser/XMLParser.js'; import Window from '../../src/window/Window.js'; -import IWindow from '../../src/window/IWindow.js'; -import IDocument from '../../src/nodes/document/IDocument.js'; +import Window from '../../src/window/Window.js'; +import Document from '../../src/nodes/document/Document.js'; import Node from '../../src/nodes/node/Node.js'; -import IHTMLElement from '../../src/nodes/html-element/IHTMLElement.js'; +import HTMLElement from '../../src/nodes/html-element/HTMLElement.js'; import XMLParserHTML from './data/XMLParserHTML.js'; import NamespaceURI from '../../src/config/NamespaceURI.js'; import DocumentType from '../../src/nodes/document-type/DocumentType.js'; import XMLSerializer from '../../src/xml-serializer/XMLSerializer.js'; -import IHTMLTemplateElement from '../../src/nodes/html-template-element/IHTMLTemplateElement.js'; +import HTMLTemplateElement from '../../src/nodes/html-template-element/HTMLTemplateElement.js'; import NodeTypeEnum from '../../src/nodes/node/NodeTypeEnum.js'; import { beforeEach, describe, it, expect } from 'vitest'; @@ -21,8 +21,8 @@ const GET_EXPECTED_HTML = (html: string): string => .replace('', ''); describe('XMLParser', () => { - let window: IWindow; - let document: IDocument; + let window: Window; + let document: Document; beforeEach(() => { window = new Window(); @@ -34,7 +34,7 @@ describe('XMLParser', () => { const root = XMLParser.parse(document, '
'); expect(root.childNodes.length).toBe(1); expect(root.childNodes[0].childNodes.length).toBe(0); - expect((root.childNodes[0]).tagName).toBe('DIV'); + expect((root.childNodes[0]).tagName).toBe('DIV'); }); it('Parses HTML with a single
with attributes.', () => { @@ -44,81 +44,73 @@ describe('XMLParser', () => { ); expect(root.childNodes.length).toBe(1); expect(root.childNodes[0].childNodes.length).toBe(0); - expect((root.childNodes[0]).tagName).toBe('DIV'); - expect((root.childNodes[0]).id).toBe('id'); - expect((root.childNodes[0]).className).toBe('class1 class2'); + expect((root.childNodes[0]).tagName).toBe('DIV'); + expect((root.childNodes[0]).id).toBe('id'); + expect((root.childNodes[0]).className).toBe('class1 class2'); - expect((root.childNodes[0]).attributes.length).toBe(3); + expect((root.childNodes[0]).attributes.length).toBe(3); - expect((root.childNodes[0]).attributes[0].name).toBe('class'); - expect((root.childNodes[0]).attributes[0].value).toBe('class1 class2'); - expect((root.childNodes[0]).attributes[0].namespaceURI).toBe(null); - expect((root.childNodes[0]).attributes[0].specified).toBe(true); + expect((root.childNodes[0]).attributes[0].name).toBe('class'); + expect((root.childNodes[0]).attributes[0].value).toBe('class1 class2'); + expect((root.childNodes[0]).attributes[0].namespaceURI).toBe(null); + expect((root.childNodes[0]).attributes[0].specified).toBe(true); expect( - (root.childNodes[0]).attributes[0].ownerElement === root.childNodes[0] + (root.childNodes[0]).attributes[0].ownerElement === root.childNodes[0] ).toBe(true); - expect((root.childNodes[0]).attributes[0].ownerDocument === document).toBe( - true - ); + expect((root.childNodes[0]).attributes[0].ownerDocument === document).toBe(true); - expect((root.childNodes[0]).attributes[1].name).toBe('id'); - expect((root.childNodes[0]).attributes[1].value).toBe('id'); - expect((root.childNodes[0]).attributes[1].namespaceURI).toBe(null); - expect((root.childNodes[0]).attributes[1].specified).toBe(true); + expect((root.childNodes[0]).attributes[1].name).toBe('id'); + expect((root.childNodes[0]).attributes[1].value).toBe('id'); + expect((root.childNodes[0]).attributes[1].namespaceURI).toBe(null); + expect((root.childNodes[0]).attributes[1].specified).toBe(true); expect( - (root.childNodes[0]).attributes[1].ownerElement === root.childNodes[0] + (root.childNodes[0]).attributes[1].ownerElement === root.childNodes[0] ).toBe(true); - expect((root.childNodes[0]).attributes[1].ownerDocument === document).toBe( - true - ); + expect((root.childNodes[0]).attributes[1].ownerDocument === document).toBe(true); - expect((root.childNodes[0]).attributes[2].name).toBe('data-no-value'); - expect((root.childNodes[0]).attributes[2].value).toBe(''); - expect((root.childNodes[0]).attributes[2].namespaceURI).toBe(null); - expect((root.childNodes[0]).attributes[2].specified).toBe(true); + expect((root.childNodes[0]).attributes[2].name).toBe('data-no-value'); + expect((root.childNodes[0]).attributes[2].value).toBe(''); + expect((root.childNodes[0]).attributes[2].namespaceURI).toBe(null); + expect((root.childNodes[0]).attributes[2].specified).toBe(true); expect( - (root.childNodes[0]).attributes[2].ownerElement === root.childNodes[0] + (root.childNodes[0]).attributes[2].ownerElement === root.childNodes[0] ).toBe(true); - expect((root.childNodes[0]).attributes[2].ownerDocument === document).toBe( - true - ); + expect((root.childNodes[0]).attributes[2].ownerDocument === document).toBe(true); - expect((root.childNodes[0]).attributes['class'].name).toBe('class'); - expect((root.childNodes[0]).attributes['class'].value).toBe('class1 class2'); - expect((root.childNodes[0]).attributes['class'].namespaceURI).toBe(null); - expect((root.childNodes[0]).attributes['class'].specified).toBe(true); - expect( - (root.childNodes[0]).attributes['class'].ownerElement === root.childNodes[0] - ).toBe(true); + expect((root.childNodes[0]).attributes['class'].name).toBe('class'); + expect((root.childNodes[0]).attributes['class'].value).toBe('class1 class2'); + expect((root.childNodes[0]).attributes['class'].namespaceURI).toBe(null); + expect((root.childNodes[0]).attributes['class'].specified).toBe(true); expect( - (root.childNodes[0]).attributes['class'].ownerDocument === document + (root.childNodes[0]).attributes['class'].ownerElement === root.childNodes[0] ).toBe(true); + expect((root.childNodes[0]).attributes['class'].ownerDocument === document).toBe( + true + ); - expect((root.childNodes[0]).attributes['id'].name).toBe('id'); - expect((root.childNodes[0]).attributes['id'].value).toBe('id'); - expect((root.childNodes[0]).attributes['id'].namespaceURI).toBe(null); - expect((root.childNodes[0]).attributes['id'].specified).toBe(true); + expect((root.childNodes[0]).attributes['id'].name).toBe('id'); + expect((root.childNodes[0]).attributes['id'].value).toBe('id'); + expect((root.childNodes[0]).attributes['id'].namespaceURI).toBe(null); + expect((root.childNodes[0]).attributes['id'].specified).toBe(true); expect( - (root.childNodes[0]).attributes['id'].ownerElement === root.childNodes[0] + (root.childNodes[0]).attributes['id'].ownerElement === root.childNodes[0] ).toBe(true); - expect((root.childNodes[0]).attributes['id'].ownerDocument === document).toBe( + expect((root.childNodes[0]).attributes['id'].ownerDocument === document).toBe( true ); - expect((root.childNodes[0]).attributes['data-no-value'].name).toBe( + expect((root.childNodes[0]).attributes['data-no-value'].name).toBe( 'data-no-value' ); - expect((root.childNodes[0]).attributes['data-no-value'].value).toBe(''); - expect((root.childNodes[0]).attributes['data-no-value'].namespaceURI).toBe( - null - ); - expect((root.childNodes[0]).attributes['data-no-value'].specified).toBe(true); + expect((root.childNodes[0]).attributes['data-no-value'].value).toBe(''); + expect((root.childNodes[0]).attributes['data-no-value'].namespaceURI).toBe(null); + expect((root.childNodes[0]).attributes['data-no-value'].specified).toBe(true); expect( - (root.childNodes[0]).attributes['data-no-value'].ownerElement === + (root.childNodes[0]).attributes['data-no-value'].ownerElement === root.childNodes[0] ).toBe(true); expect( - (root.childNodes[0]).attributes['data-no-value'].ownerDocument === document + (root.childNodes[0]).attributes['data-no-value'].ownerDocument === document ).toBe(true); }); @@ -244,12 +236,12 @@ describe('XMLParser', () => {
` ); - expect((root.children[0].children[0]).innerText).toBe( + expect((root.children[0].children[0]).innerText).toBe( `if(11){console.log("1")}` ); - expect((root.children[0].children[1]).innerText).toBe(''); - expect((root.children[0].children[2]).innerText).toBe(''); + expect((root.children[0].children[1]).innerText).toBe(''); + expect((root.children[0].children[2]).innerText).toBe(''); expect(new XMLSerializer().serializeToString(root)).toBe( `
@@ -270,7 +262,7 @@ describe('XMLParser', () => { ` ); - expect((root2.children[0].children[1].children[0]).innerText).toBe( + expect((root2.children[0].children[1].children[0]).innerText).toBe( 'var vars = []; for (var i=0;i { const root = XMLParser.parse(document, `
test`); expect(root.childNodes.length).toBe(1); - expect((root.childNodes[0]).tagName).toBe('DIV'); + expect((root.childNodes[0]).tagName).toBe('DIV'); expect(root.childNodes[0].childNodes[0].nodeType).toBe(Node.TEXT_NODE); }); @@ -438,7 +430,7 @@ describe('XMLParser', () => { ` ); - expect((root.children[0]).innerText).toBe(`console.log('hello')`); + expect((root.children[0]).innerText).toBe(`console.log('hello')`); }); it('Handles different value types.', () => { @@ -525,7 +517,7 @@ describe('XMLParser', () => { it('Parses