happy-dom
Version:
Happy DOM is a JavaScript implementation of a web browser without its graphical user interface. It includes many web standards from WHATWG DOM and HTML.
1,509 lines (1,226 loc) • 70.5 kB
text/typescript
import Element from '../element/Element.js';
import * as PropertySymbol from '../../PropertySymbol.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';
import DocumentFragment from '../document-fragment/DocumentFragment.js';
import Event from '../../event/Event.js';
import DOMImplementation from '../../dom-implementation/DOMImplementation.js';
import INodeFilter from '../../tree-walker/INodeFilter.js';
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 CSSStyleSheet from '../../css/CSSStyleSheet.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 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 ShadowRoot from '../shadow-root/ShadowRoot.js';
import Range from '../../range/Range.js';
import Attr from '../attr/Attr.js';
import ProcessingInstruction from '../processing-instruction/ProcessingInstruction.js';
import VisibilityStateEnum from './VisibilityStateEnum.js';
import NodeTypeEnum from '../node/NodeTypeEnum.js';
import CookieStringUtility from '../../cookie/urilities/CookieStringUtility.js';
import { URL } from 'url';
import IHTMLElementTagNameMap from '../../config/IHTMLElementTagNameMap.js';
import ISVGElementTagNameMap from '../../config/ISVGElementTagNameMap.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';
import HTMLHtmlElement from '../html-html-element/HTMLHtmlElement.js';
import HTMLBodyElement from '../html-body-element/HTMLBodyElement.js';
import HTMLHeadElement from '../html-head-element/HTMLHeadElement.js';
import HTMLBaseElement from '../html-base-element/HTMLBaseElement.js';
import ICachedResult from '../node/ICachedResult.js';
import HTMLTitleElement from '../html-title-element/HTMLTitleElement.js';
import WindowBrowserContext from '../../window/WindowBrowserContext.js';
import NodeFactory from '../NodeFactory.js';
import SVGElementConfig from '../../config/SVGElementConfig.js';
import StringUtility from '../../utilities/StringUtility.js';
import HTMLParser from '../../html-parser/HTMLParser.js';
import PreloadEntry from '../../fetch/preload/PreloadEntry.js';
import DOMExceptionNameEnum from '../../exception/DOMExceptionNameEnum.js';
const PROCESSING_INSTRUCTION_TARGET_REGEXP = /^[a-z][a-z0-9-]+$/;
/**
* Document.
*/
export default class Document extends Node {
// Internal properties
public [PropertySymbol.children]: HTMLCollection<Element> | null = null;
public [PropertySymbol.activeElement]: HTMLElement | SVGElement = null;
public [PropertySymbol.nextActiveElement]: HTMLElement | SVGElement = null;
public [PropertySymbol.currentScript]: HTMLScriptElement = null;
public [PropertySymbol.rootNode] = this;
public [PropertySymbol.isFirstWrite] = true;
public [PropertySymbol.isFirstWriteAfterOpen] = false;
public [PropertySymbol.nodeType] = NodeTypeEnum.documentNode;
public [PropertySymbol.isConnected] = true;
public [PropertySymbol.adoptedStyleSheets]: CSSStyleSheet[] = [];
public [PropertySymbol.implementation] = new DOMImplementation(this);
public [PropertySymbol.readyState] = DocumentReadyStateEnum.interactive;
public [PropertySymbol.referrer] = '';
public [PropertySymbol.defaultView]: BrowserWindow | null = null;
public [PropertySymbol.forms]: HTMLCollection<HTMLFormElement> | null = null;
public [PropertySymbol.affectsComputedStyleCache]: ICachedResult[] = [];
public [PropertySymbol.ownerDocument]: Document = <Document>(<unknown>null);
public [PropertySymbol.elementIdMap]: Map<
string,
{ htmlCollection: HTMLCollection<Element> | null; elements: Element[] }
> = new Map();
public [PropertySymbol.contentType]: string = 'text/html';
public [PropertySymbol.xmlProcessingInstruction]: ProcessingInstruction | null = null;
public [PropertySymbol.preloads]: Map<string, PreloadEntry> = new Map();
public [PropertySymbol.propertyEventListeners]: Map<string, (event: Event) => void> = new Map();
public declare cloneNode: (deep?: boolean) => Document;
// Private properties
#selection: Selection = null;
// Events
/* eslint-disable jsdoc/require-jsdoc */
public get onreadystatechange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onreadystatechange') ?? null;
}
public set onreadystatechange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onreadystatechange', value);
}
public get onpointerlockchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerlockchange') ?? null;
}
public set onpointerlockchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerlockchange', value);
}
public get onpointerlockerror(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerlockerror') ?? null;
}
public set onpointerlockerror(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerlockerror', value);
}
public get onbeforecopy(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onbeforecopy') ?? null;
}
public set onbeforecopy(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onbeforecopy', value);
}
public get onbeforecut(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onbeforecut') ?? null;
}
public set onbeforecut(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onbeforecut', value);
}
public get onbeforepaste(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onbeforepaste') ?? null;
}
public set onbeforepaste(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onbeforepaste', value);
}
public get onfreeze(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onfreeze') ?? null;
}
public set onfreeze(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onfreeze', value);
}
public get onprerenderingchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onprerenderingchange') ?? null;
}
public set onprerenderingchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onprerenderingchange', value);
}
public get onresume(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onresume') ?? null;
}
public set onresume(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onresume', value);
}
public get onsearch(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onsearch') ?? null;
}
public set onsearch(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onsearch', value);
}
public get onvisibilitychange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onvisibilitychange') ?? null;
}
public set onvisibilitychange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onvisibilitychange', value);
}
public get onfullscreenchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onfullscreenchange') ?? null;
}
public set onfullscreenchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onfullscreenchange', value);
}
public get onfullscreenerror(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onfullscreenerror') ?? null;
}
public set onfullscreenerror(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onfullscreenerror', value);
}
public get onwebkitfullscreenchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwebkitfullscreenchange') ?? null;
}
public set onwebkitfullscreenchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwebkitfullscreenchange', value);
}
public get onwebkitfullscreenerror(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwebkitfullscreenerror') ?? null;
}
public set onwebkitfullscreenerror(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwebkitfullscreenerror', value);
}
public get onbeforexrselect(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onbeforexrselect') ?? null;
}
public set onbeforexrselect(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onbeforexrselect', value);
}
public get onabort(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onabort') ?? null;
}
public set onabort(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onabort', value);
}
public get onbeforeinput(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onbeforeinput') ?? null;
}
public set onbeforeinput(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onbeforeinput', value);
}
public get onbeforematch(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onbeforematch') ?? null;
}
public set onbeforematch(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onbeforematch', value);
}
public get onbeforetoggle(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onbeforetoggle') ?? null;
}
public set onbeforetoggle(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onbeforetoggle', value);
}
public get onblur(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onblur') ?? null;
}
public set onblur(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onblur', value);
}
public get oncancel(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncancel') ?? null;
}
public set oncancel(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncancel', value);
}
public get oncanplay(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncanplay') ?? null;
}
public set oncanplay(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncanplay', value);
}
public get oncanplaythrough(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncanplaythrough') ?? null;
}
public set oncanplaythrough(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncanplaythrough', value);
}
public get onchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onchange') ?? null;
}
public set onchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onchange', value);
}
public get onclick(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onclick') ?? null;
}
public set onclick(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onclick', value);
}
public get onclose(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onclose') ?? null;
}
public set onclose(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onclose', value);
}
public get oncontentvisibilityautostatechange(): ((event: Event) => void) | null {
return (
this[PropertySymbol.propertyEventListeners].get('oncontentvisibilityautostatechange') ?? null
);
}
public set oncontentvisibilityautostatechange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncontentvisibilityautostatechange', value);
}
public get oncontextlost(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncontextlost') ?? null;
}
public set oncontextlost(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncontextlost', value);
}
public get oncontextmenu(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncontextmenu') ?? null;
}
public set oncontextmenu(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncontextmenu', value);
}
public get oncontextrestored(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncontextrestored') ?? null;
}
public set oncontextrestored(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncontextrestored', value);
}
public get oncuechange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncuechange') ?? null;
}
public set oncuechange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncuechange', value);
}
public get ondblclick(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondblclick') ?? null;
}
public set ondblclick(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondblclick', value);
}
public get ondrag(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondrag') ?? null;
}
public set ondrag(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondrag', value);
}
public get ondragend(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondragend') ?? null;
}
public set ondragend(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondragend', value);
}
public get ondragenter(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondragenter') ?? null;
}
public set ondragenter(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondragenter', value);
}
public get ondragleave(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondragleave') ?? null;
}
public set ondragleave(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondragleave', value);
}
public get ondragover(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondragover') ?? null;
}
public set ondragover(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondragover', value);
}
public get ondragstart(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondragstart') ?? null;
}
public set ondragstart(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondragstart', value);
}
public get ondrop(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondrop') ?? null;
}
public set ondrop(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondrop', value);
}
public get ondurationchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ondurationchange') ?? null;
}
public set ondurationchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ondurationchange', value);
}
public get onemptied(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onemptied') ?? null;
}
public set onemptied(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onemptied', value);
}
public get onended(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onended') ?? null;
}
public set onended(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onended', value);
}
public get onerror(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onerror') ?? null;
}
public set onerror(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onerror', value);
}
public get onfocus(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onfocus') ?? null;
}
public set onfocus(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onfocus', value);
}
public get onformdata(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onformdata') ?? null;
}
public set onformdata(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onformdata', value);
}
public get oninput(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oninput') ?? null;
}
public set oninput(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oninput', value);
}
public get oninvalid(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oninvalid') ?? null;
}
public set oninvalid(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oninvalid', value);
}
public get onkeydown(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onkeydown') ?? null;
}
public set onkeydown(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onkeydown', value);
}
public get onkeypress(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onkeypress') ?? null;
}
public set onkeypress(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onkeypress', value);
}
public get onkeyup(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onkeyup') ?? null;
}
public set onkeyup(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onkeyup', value);
}
public get onload(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onload') ?? null;
}
public set onload(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onload', value);
}
public get onloadeddata(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onloadeddata') ?? null;
}
public set onloadeddata(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onloadeddata', value);
}
public get onloadedmetadata(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onloadedmetadata') ?? null;
}
public set onloadedmetadata(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onloadedmetadata', value);
}
public get onloadstart(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onloadstart') ?? null;
}
public set onloadstart(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onloadstart', value);
}
public get onmousedown(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmousedown') ?? null;
}
public set onmousedown(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmousedown', value);
}
public get onmouseenter(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmouseenter') ?? null;
}
public set onmouseenter(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmouseenter', value);
}
public get onmouseleave(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmouseleave') ?? null;
}
public set onmouseleave(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmouseleave', value);
}
public get onmousemove(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmousemove') ?? null;
}
public set onmousemove(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmousemove', value);
}
public get onmouseout(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmouseout') ?? null;
}
public set onmouseout(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmouseout', value);
}
public get onmouseover(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmouseover') ?? null;
}
public set onmouseover(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmouseover', value);
}
public get onmouseup(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmouseup') ?? null;
}
public set onmouseup(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmouseup', value);
}
public get onmousewheel(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onmousewheel') ?? null;
}
public set onmousewheel(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onmousewheel', value);
}
public get onpause(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpause') ?? null;
}
public set onpause(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpause', value);
}
public get onplay(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onplay') ?? null;
}
public set onplay(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onplay', value);
}
public get onplaying(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onplaying') ?? null;
}
public set onplaying(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onplaying', value);
}
public get onprogress(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onprogress') ?? null;
}
public set onprogress(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onprogress', value);
}
public get onratechange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onratechange') ?? null;
}
public set onratechange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onratechange', value);
}
public get onreset(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onreset') ?? null;
}
public set onreset(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onreset', value);
}
public get onresize(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onresize') ?? null;
}
public set onresize(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onresize', value);
}
public get onscroll(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onscroll') ?? null;
}
public set onscroll(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onscroll', value);
}
public get onsecuritypolicyviolation(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onsecuritypolicyviolation') ?? null;
}
public set onsecuritypolicyviolation(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onsecuritypolicyviolation', value);
}
public get onseeked(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onseeked') ?? null;
}
public set onseeked(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onseeked', value);
}
public get onseeking(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onseeking') ?? null;
}
public set onseeking(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onseeking', value);
}
public get onselect(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onselect') ?? null;
}
public set onselect(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onselect', value);
}
public get onslotchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onslotchange') ?? null;
}
public set onslotchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onslotchange', value);
}
public get onstalled(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onstalled') ?? null;
}
public set onstalled(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onstalled', value);
}
public get onsubmit(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onsubmit') ?? null;
}
public set onsubmit(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onsubmit', value);
}
public get onsuspend(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onsuspend') ?? null;
}
public set onsuspend(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onsuspend', value);
}
public get ontimeupdate(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ontimeupdate') ?? null;
}
public set ontimeupdate(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ontimeupdate', value);
}
public get ontoggle(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ontoggle') ?? null;
}
public set ontoggle(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ontoggle', value);
}
public get onvolumechange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onvolumechange') ?? null;
}
public set onvolumechange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onvolumechange', value);
}
public get onwaiting(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwaiting') ?? null;
}
public set onwaiting(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwaiting', value);
}
public get onwebkitanimationend(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwebkitanimationend') ?? null;
}
public set onwebkitanimationend(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwebkitanimationend', value);
}
public get onwebkitanimationiteration(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwebkitanimationiteration') ?? null;
}
public set onwebkitanimationiteration(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwebkitanimationiteration', value);
}
public get onwebkitanimationstart(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwebkitanimationstart') ?? null;
}
public set onwebkitanimationstart(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwebkitanimationstart', value);
}
public get onwebkittransitionend(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwebkittransitionend') ?? null;
}
public set onwebkittransitionend(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwebkittransitionend', value);
}
public get onwheel(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onwheel') ?? null;
}
public set onwheel(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onwheel', value);
}
public get onauxclick(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onauxclick') ?? null;
}
public set onauxclick(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onauxclick', value);
}
public get ongotpointercapture(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ongotpointercapture') ?? null;
}
public set ongotpointercapture(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ongotpointercapture', value);
}
public get onlostpointercapture(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onlostpointercapture') ?? null;
}
public set onlostpointercapture(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onlostpointercapture', value);
}
public get onpointerdown(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerdown') ?? null;
}
public set onpointerdown(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerdown', value);
}
public get onpointermove(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointermove') ?? null;
}
public set onpointermove(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointermove', value);
}
public get onpointerrawupdate(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerrawupdate') ?? null;
}
public set onpointerrawupdate(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerrawupdate', value);
}
public get onpointerup(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerup') ?? null;
}
public set onpointerup(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerup', value);
}
public get onpointercancel(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointercancel') ?? null;
}
public set onpointercancel(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointercancel', value);
}
public get onpointerover(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerover') ?? null;
}
public set onpointerover(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerover', value);
}
public get onpointerout(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerout') ?? null;
}
public set onpointerout(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerout', value);
}
public get onpointerenter(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerenter') ?? null;
}
public set onpointerenter(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerenter', value);
}
public get onpointerleave(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpointerleave') ?? null;
}
public set onpointerleave(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpointerleave', value);
}
public get onselectstart(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onselectstart') ?? null;
}
public set onselectstart(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onselectstart', value);
}
public get onselectionchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onselectionchange') ?? null;
}
public set onselectionchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onselectionchange', value);
}
public get onanimationend(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onanimationend') ?? null;
}
public set onanimationend(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onanimationend', value);
}
public get onanimationiteration(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onanimationiteration') ?? null;
}
public set onanimationiteration(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onanimationiteration', value);
}
public get onanimationstart(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onanimationstart') ?? null;
}
public set onanimationstart(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onanimationstart', value);
}
public get ontransitionrun(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ontransitionrun') ?? null;
}
public set ontransitionrun(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ontransitionrun', value);
}
public get ontransitionstart(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ontransitionstart') ?? null;
}
public set ontransitionstart(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ontransitionstart', value);
}
public get ontransitionend(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ontransitionend') ?? null;
}
public set ontransitionend(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ontransitionend', value);
}
public get ontransitioncancel(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('ontransitioncancel') ?? null;
}
public set ontransitioncancel(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('ontransitioncancel', value);
}
public get oncopy(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncopy') ?? null;
}
public set oncopy(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncopy', value);
}
public get oncut(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('oncut') ?? null;
}
public set oncut(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('oncut', value);
}
public get onpaste(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onpaste') ?? null;
}
public set onpaste(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onpaste', value);
}
public get onscrollend(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onscrollend') ?? null;
}
public set onscrollend(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onscrollend', value);
}
public get onscrollsnapchange(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onscrollsnapchange') ?? null;
}
public set onscrollsnapchange(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onscrollsnapchange', value);
}
public get onscrollsnapchanging(): ((event: Event) => void) | null {
return this[PropertySymbol.propertyEventListeners].get('onscrollsnapchanging') ?? null;
}
public set onscrollsnapchanging(value: ((event: Event) => void) | null) {
this[PropertySymbol.propertyEventListeners].set('onscrollsnapchanging', value);
}
/* eslint-enable jsdoc/require-jsdoc */
/**
* Returns adopted style sheets.
*
* @returns Adopted style sheets.
*/
public get adoptedStyleSheets(): CSSStyleSheet[] {
return this[PropertySymbol.adoptedStyleSheets];
}
/**
* Sets adopted style sheets.
*
* @param value Adopted style sheets.
*/
public set adoptedStyleSheets(value: CSSStyleSheet[]) {
this[PropertySymbol.adoptedStyleSheets] = value;
}
/**
* Returns DOM implementation.
*
* @returns DOM implementation.
*/
public get implementation(): DOMImplementation {
return this[PropertySymbol.implementation];
}
/**
* Returns document ready state.
*
* @returns Document ready state.
*/
public get readyState(): DocumentReadyStateEnum {
return this[PropertySymbol.readyState];
}
/**
* Returns referrer.
*
* @returns Referrer.
*/
public get referrer(): string {
return this[PropertySymbol.referrer];
}
/**
* Returns default view.
*
* @returns Default view.
*/
public get defaultView(): BrowserWindow | null {
return this[PropertySymbol.defaultView];
}
/**
* Returns document children.
*/
public get children(): HTMLCollection<Element> {
if (!this[PropertySymbol.children]) {
const elements = this[PropertySymbol.elementArray];
this[PropertySymbol.children] = new HTMLCollection<Element>(
PropertySymbol.illegalConstructor,
() => elements
);
}
return this[PropertySymbol.children];
}
/**
* Returns character set.
*
* @deprecated
* @returns Character set.
*/
public get charset(): string {
return this.characterSet;
}
/**
* Returns character set.
*
* @returns Character set.
*/
public get characterSet(): string {
const charset = QuerySelector.querySelector(this, 'meta[charset]')?.getAttributeNS(
null,
'charset'
);
return charset ? charset : 'UTF-8';
}
/**
* Returns title.
*
* @returns Title.
*/
public get title(): string {
const element = <HTMLTitleElement | null>ParentNodeUtility.getElementByTagName(this, 'title');
if (element) {
return element.text.trim();
}
return '';
}
/**
* Returns set title.
*
*/
public set title(title: string) {
const element = ParentNodeUtility.getElementByTagName(this, 'title');
if (element) {
element.textContent = title;
} else {
const newElement = this.createElement('title');
newElement.textContent = title;
this.head.appendChild(newElement);
}
}
/**
* Returns a collection of all area elements and a elements in a document with a value for the href attribute.
*/
public get links(): NodeList<HTMLAnchorElement | HTMLElement> {
return <NodeList<HTMLElement>>QuerySelector.querySelectorAll(this, 'a[href],area[href]');
}
/**
* Returns a collection of all form elements in a document.
*/
public get forms(): HTMLCollection<HTMLFormElement> {
if (!this[PropertySymbol.forms]) {
this[PropertySymbol.forms] = <HTMLCollection<HTMLFormElement>>(
ParentNodeUtility.getElementsByTagName(this, 'form')
);
}
return this[PropertySymbol.forms];
}
/**
* Last element child.
*
* @returns Element.
*/
public get childElementCount(): number {
return this[PropertySymbol.elementArray].length;
}
/**
* First element child.
*
* @returns Element.
*/
public get firstElementChild(): Element {
return this[PropertySymbol.elementArray][0] ?? null;
}
/**
* Last element child.
*
* @returns Element.
*/
public get lastElementChild(): Element {
const children = this[PropertySymbol.elementArray];
return children[children.length - 1] ?? null;
}
/**
* Returns cookie string.
*
* @returns Cookie.
*/
public get cookie(): string {
const browserFrame = new WindowBrowserContext(this[PropertySymbol.window]).getBrowserFrame();
if (!browserFrame) {
return '';
}
return CookieStringUtility.cookiesToString(
browserFrame.page.context.cookieContainer.getCookies(
new URL(this[PropertySymbol.window].location.href),
true
)
);
}
/**
* Sets a cookie string.
*
* @param cookie Cookie string.
*/
public set cookie(cookie: string) {
const browserFrame = new WindowBrowserContext(this[PropertySymbol.window]).getBrowserFrame();
if (!browserFrame) {
return;
}
browserFrame.page.context.cookieContainer.addCookies([
CookieStringUtility.stringToCookie(new URL(this[PropertySymbol.window].location.href), cookie)
]);
}
/**
* Node name.
*
* @returns Node name.
*/
public get nodeName(): string {
return '#document';
}
/**
* Returns <html> element.
*
* @returns Element.
*/
public get documentElement(): HTMLHtmlElement {
return <HTMLHtmlElement>this[PropertySymbol.elementArray][0] ?? null;
}
/**
* Returns document type element.
*
* @returns Document type.
*/
public get doctype(): DocumentType {
for (const node of this[PropertySymbol.nodeArray]) {
if (node instanceof DocumentType) {
return node;
}
}
return null;
}
/**
* Returns <body> element.
*
* @returns Element.
*/
public get body(): HTMLBodyElement {
const documentElement = this.documentElement;
return documentElement
? <HTMLBodyElement>ParentNodeUtility.getElementByTagName(documentElement, 'body')
: null;
}
/**
* Returns <head> element.
*
* @returns Element.
*/
public get head(): HTMLHeadElement {
const documentElement = this.documentElement;
return documentElement
? <HTMLHeadElement>ParentNodeUtility.getElementByTagName(documentElement, 'head')
: null;
}
/**
* Returns CSS style sheets.
*
* @returns CSS style sheets.
*/
public get styleSheets(): CSSStyleSheet[] {
const styles = <NodeList<HTMLLinkElement | HTMLStyleElement>>(
QuerySelector.querySelectorAll(this, 'link[rel="stylesheet"][href],style')
);
const styleSheets = [];
for (const style of styles) {
const sheet = style.sheet;
if (sheet) {
styleSheets.push(sheet);
}
}
return styleSheets;
}
/**
* Returns active element.
*
* @returns Active element.
*/
public get activeElement(): HTMLElement | SVGElement {
if (
this[PropertySymbol.activeElement] &&
!this[PropertySymbol.activeElement][PropertySymbol.isConnected]
) {
this[PropertySymbol.activeElement] = null;
}
if (
this[PropertySymbol.activeElement] &&
this[PropertySymbol.activeElement] instanceof Element
) {
let rootNode: ShadowRoot | Document = <ShadowRoot | Document>(
this[PropertySymbol.activeElement].getRootNode()
);
let activeElement = this[PropertySymbol.activeElement];
while (rootNode !== this) {
activeElement = <HTMLElement | SVGElement>(<ShadowRoot>rootNode).host;
rootNode = activeElement ? <ShadowRoot | Document>activeElement.getRootNode() : this;
}
return activeElement;
}
return this[PropertySymbol.activeElement] || this.body || this.documentElement || null;
}
/**
* Returns scrolling element.
*
* @returns Scrolling element.
*/
public get scrollingElement(): HTMLElement {
return this.documentElement;
}
/**
* Returns location.
*
* @returns Location.
*/
public get location(): Location {
return this[PropertySymbol.window].location;
}
/**
* Returns scripts.
*
* @returns Scripts.
*/
public get scripts(): HTMLCollection<HTMLScriptElement> {
return this.getElementsByTagName('script');
}
/**
* Returns base URI.
*
* @override
* @returns Base URI.
*/
public get baseURI(): string {
const element = <HTMLBaseElement>ParentNodeUtility.getElementByTagName(this, 'base');
if (element) {
return element.href;
}
return this[PropertySymbol.window].location.href;
}
/**
* Returns URL.
*
* @returns URL of the current document.
* */
public get URL(): string {
return this[PropertySymbol.window].location.href;
}
/**
* Returns document URI.
*
* @returns URL of the current document.
* */
public get documentURI(): string {
return this.URL;
}
/**
* Returns domain.
*
* @returns Domain.
* */
public get domain(): string {
return this[PropertySymbol.window].location.hostname;
}
/**
* Returns document visibility state.
*
* @returns the visibility state of the current document.
* */
public get visibilityState(): VisibilityStateEnum {
if (this.defaultView) {
return VisibilityStateEnum.visible;
}
return VisibilityStateEnum.hidden;
}
/**
* Returns document hidden state.
*
* @returns the hidden state of the current document.
* */
public get hidden(): boolean {
if (this.defaultView) {
return false;
}
return true;
}
/**
* Gets the currently executing script element.
*
* @returns the currently executing script element.
*/
public get currentScript(): HTMLScriptElement {
return this[PropertySymbol.currentScript];
}
/**
* Returns content type.
*
* @returns Content type.
*/
public get contentType(): string {
return this[PropertySymbol.contentType];
}
/**
* 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.
*/
public append(...nodes: (Node | string)[]): void {
ParentNodeUtility.append(this, ...nodes);
}
/**
* 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.
*/
public prepend(...nodes: (Node | string)[]): void {
ParentNodeUtility.prepend(this, ...nodes);
}
/**
* Replaces the existing children of a node with a specified new set of children.
*
* @param nodes List of Node or DOMString.
*/
public replaceChildren(...nodes: (Node | string)[]): void {
ParentNodeUtility.replaceChildren(this, ...nodes);
}
/**
* Query CSS selector to find matching nodes.
*
* @param selector CSS selector.
* @returns Matching elements.
*/
public querySelectorAll<K extends keyof IHTMLElementTagNameMap>(
selector: K
): NodeList<IHTMLElementTagNameMap[K]>;
/**
* Query CSS selector to find matching elments.
*
* @param selector CSS selector.
* @returns Matching elements.
*/
public querySelectorAll<K extends keyof ISVGElementTagNameMap>(
selector: K
): NodeList<ISVGElementTagNameMap[K]>;
/**
* Query CSS selector to find matching elments.
*
* @param selector CSS selector.
* @returns Matching elements.
*/
public querySelectorAll(selector: string): NodeList<Element>;
/**
* Query CSS selector to find matching elments.
*
* @param selector CSS selector.
* @returns Matching elements.
*/
public querySelectorAll(selector: string): NodeList<Element> {
return QuerySelector.querySelectorAll(this, selector);
}
/**
* Query CSS Selector to find matching node.
*
* @param selector CSS selector.
* @returns Matching element.
*/
public querySelector<K extends keyof IHTMLElementTagNameMap>(
selector: K
): IHTMLElement