@amazon/vinyl-tsx 4.0.0 → 4.0.1-next.20261016184530

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../vinyl-util/test/browserTestUtil/benchmark/Benchmark.ts", "../../../vinyl-util/test/browserTestUtil/env/jasmineEnv.ts", "../../../vinyl-util/test/browserTestUtil/expect/expectNothing.ts", "../../../vinyl-util/test/browserTestUtil/mock/createSpyFactory.ts", "../../../vinyl-util/test/browserTestUtil/mock/dom/lib.dom.ts", "../../../vinyl-util/test/browserTestUtil/mock/dom/globals.ts", "../../src/domUtil.ts", "../../src/extensions/connectedObserver.ts", "../../test/benchmark/setup.ts", "../../test/benchmark/extensions/connectedObserver.bench.ts"],
4
- "sourcesContent": ["/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//-------------------------------------------------------------------------\n// A Benchmarking utility for testing and comparing performance.\n//-------------------------------------------------------------------------\n\n/**\n * Gets the current high resolution timestamp, platform dependent.\n */\nlet now: () => number\nif (\n typeof window !== 'undefined' &&\n typeof window.performance !== 'undefined' &&\n typeof window.performance.now !== 'undefined'\n) {\n now = () => window.performance.now()\n} else if (\n typeof self !== 'undefined' &&\n typeof self.performance !== 'undefined' &&\n typeof self.performance.now !== 'undefined'\n) {\n now = () => self.performance.now()\n} else {\n now = () => Date.now()\n}\n\nexport interface BenchMarkOptions {\n /**\n * The amount of time to run the executor before beginning measurement (in seconds).\n */\n readonly warmupTime: number\n\n /**\n * When time has elapsed past this duration during a cycle (in seconds), there will be no\n * operations.\n * The cycle will end when `maxCycleDuration` has been reached.\n */\n readonly maxCycleDuration: number\n\n /**\n * The number of trials to run.\n */\n readonly cycles: number\n}\n\nexport interface CycleResults {\n /**\n * The number of seconds the cycle ran.\n */\n readonly duration: number\n\n /**\n * The number of completed executions.\n */\n readonly ops: number\n}\n\nexport class BenchmarkRunResults {\n readonly cycleResults: number[] = []\n\n private _totalSamples = 0\n get totalSamples(): number {\n return this._totalSamples\n }\n\n get cycleResultsNoOutliers(): number[] {\n const sD = this.standardDeviation\n const avg = average(this.cycleResults)\n return this.cycleResults.filter((e) => {\n const zScore = (avg - e) / sD\n return Math.abs(zScore) < 3\n })\n }\n\n /**\n * Returns the mean ops per second minus outliers of greater than 3 standard deviations.\n */\n get meanOpsPerSec(): number {\n return average(this.cycleResultsNoOutliers)\n }\n\n get standardDeviation(): number {\n return standardDeviation(this.cycleResults)\n }\n\n get variance(): number {\n return this.standardDeviation / this.meanOpsPerSec\n }\n\n /**\n * Returns the mean ops / s \u00B1 variance % as a string.\n */\n get meanOpsStr(): string {\n const mean = this.meanOpsPerSec.toLocaleString(undefined, {\n maximumSignificantDigits: 4,\n })\n const variance = this.variance.toLocaleString(undefined, {\n style: 'percent',\n })\n return `${mean} \u00B1${variance}`\n }\n\n constructor(readonly name: string) {}\n\n add(cycle: CycleResults) {\n const opsPerSecond = cycle.ops / cycle.duration\n let index = this.cycleResults.findIndex((value) => opsPerSecond < value)\n if (index < 0) index = this.cycleResults.length\n this.cycleResults.splice(index, 0, opsPerSecond)\n this._totalSamples += cycle.ops\n }\n\n toString(): string {\n if (!this.cycleResults.length) return 'No results'\n return `${this.name}: ${this.meanOpsStr} ops/sec`\n }\n}\n\nexport class RunResultsComparison {\n /**\n * Sorted by median ops/s from slowest to fastest.\n */\n readonly results: BenchmarkRunResults[]\n\n constructor(\n readonly name: string,\n results: BenchmarkRunResults[]\n ) {\n this.results = results.sort((a, b) => {\n return a.meanOpsPerSec - b.meanOpsPerSec\n })\n }\n\n logToTable(): void {\n const r = this.results.map((run) => {\n const variance = run.variance.toLocaleString(undefined, {\n style: 'percent',\n })\n const mean = run.meanOpsPerSec.toLocaleString(undefined, {\n maximumSignificantDigits: 4,\n })\n\n return {\n Name: run.name,\n Mean: `${mean} \u00B1${variance}`,\n Samples: run.totalSamples,\n Compare: this.runComparisonToString(run),\n }\n })\n // Use the names as the index.\n const table = r.reduce<any>((acc, { Name, ...x }) => {\n acc[Name] = x\n return acc\n }, {})\n console.log('\\n' + this.name)\n console.table(table)\n }\n\n runComparisonToString(run: BenchmarkRunResults): string {\n const baseline = this.results[0]?.meanOpsPerSec ?? 0\n const fasterPercent = run.meanOpsPerSec / baseline - 1\n return fasterPercent < 0.01\n ? '-'\n : fasterPercent.toLocaleString(undefined, {\n style: 'percent',\n }) + ' faster'\n }\n}\n\nexport function compareResults(\n name: string,\n ...results: BenchmarkRunResults[]\n): RunResultsComparison {\n return new RunResultsComparison(name, results)\n}\n\nconst defaultBenchmarkOptions: BenchMarkOptions = {\n warmupTime: 0.5,\n maxCycleDuration: 0.5,\n cycles: 9,\n} as const\n\nexport class Benchmark {\n private static semaphore: Promise<any> = nextFrame()\n\n private readonly options: BenchMarkOptions\n\n /**\n * Constructs a new Benchmark.\n *\n * @param name The name of the benchmark, to be used when logging.\n * @param executor The method to execute and measure. If this method returns a promise, the\n * promise will be awaited. The executor should either always return a promise, or never.\n * @param options Optional configuration for the benchmark.\n */\n constructor(\n readonly name: string,\n readonly executor: () => any,\n options?: Partial<BenchMarkOptions>\n ) {\n this.options = { ...defaultBenchmarkOptions, ...options }\n }\n\n async run(): Promise<BenchmarkRunResults> {\n const opts = this.options\n // Wait for any currently running work to complete.\n await Benchmark.semaphore\n\n const warmupTimeMs = opts.warmupTime * 1000\n const cycleStart = now()\n let isAsync = false\n do {\n const result = this.executor()\n // If the executor returns a promise, it is considered an async test and the benchmark\n // should await its result.\n isAsync = isAsync || (result && typeof result.then === 'function')\n if (isAsync) await result\n } while (now() - cycleStart < warmupTimeMs)\n const resultsPromise: Promise<BenchmarkRunResults> = (async () => {\n const results = new BenchmarkRunResults(this.name)\n for (let i = 0; i < opts.cycles; i++) {\n const cycleResults = await this.runCycle(isAsync)\n results.add(cycleResults)\n await nextFrame()\n }\n return results\n })()\n Benchmark.semaphore = resultsPromise\n return await resultsPromise\n }\n\n /**\n * Runs one cycle. A cycle will repeat the executor approximately `options.maxCycleDuration`\n * seconds.\n *\n * @param isAsync\n * @return Returns the duration (in seconds) and number of operations the cycle repeated.\n */\n private async runCycle(isAsync: boolean): Promise<CycleResults> {\n const cycleMs = this.options.maxCycleDuration * 1000\n let ops = 0\n const cycleStart = now()\n do {\n const result = this.executor()\n if (isAsync) await result\n ops++\n } while (now() - cycleStart < cycleMs)\n const duration = (now() - cycleStart) / 1000\n return {\n duration,\n ops,\n }\n }\n}\n\n/**\n * Creates and runs a benchmark, logging the result.\n *\n * @param name\n * @param executor\n * @param options\n */\nexport function benchmark(\n name: string,\n executor: () => any,\n options?: Partial<BenchMarkOptions>\n): Promise<BenchmarkRunResults> {\n const benchmark = new Benchmark(name, executor, options)\n return benchmark.run().then((results) => {\n console.log(results.toString())\n return results\n })\n}\n\n/**\n * To avoid killing the browser's frame.\n */\nfunction nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve)\n })\n}\n\n/**\n * Returns the standard deviation of the given values.\n *\n * @param values\n */\nfunction standardDeviation(values: readonly number[]): number {\n const avg = average(values)\n const squareDiffs = values.map((value) => {\n const diff = value - avg\n return diff * diff\n })\n const avgSquareDiff = average(squareDiffs)\n return Math.sqrt(avgSquareDiff)\n}\n\n/**\n * Returns the mean/average of the given values.\n *\n * @param values\n */\nfunction average(values: readonly number[]): number {\n const sum = values.reduce((acc, value) => acc + value, 0)\n return sum / values.length\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nlet nextTestTimeoutOverridden: boolean = false\n\n/**\n * Sets the timeout for the current describe block.\n *\n * @param timeout The test timeout, in seconds.\n */\nexport function setTestTimeout(timeout: number) {\n let originalTimeout: number | null = null\n beforeEach(() => {\n originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL\n if (!nextTestTimeoutOverridden)\n jasmine.DEFAULT_TIMEOUT_INTERVAL = timeout * 1000\n })\n\n afterEach(() => {\n if (originalTimeout) jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout\n if (nextTestTimeoutOverridden) nextTestTimeoutOverridden = false\n })\n}\n\n/**\n * Sets the timeout for the next test and only the next test,\n * overriding any value set subsequently to setTestTimeout.\n *\n * @param timeout The test timeout, in seconds.\n */\nexport function setNextTestTimeout(timeout: number) {\n nextTestTimeoutOverridden = true\n jasmine.DEFAULT_TIMEOUT_INTERVAL = timeout * 1000\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Some tests (such as benchmarks or type expectations) have no jasmine expectations.\n */\nexport function expectNothing() {\n expect(true).toBeTruthy()\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport createSpy = jasmine.createSpy\nimport Spy = jasmine.Spy\nimport SpyAnd = jasmine.SpyAnd\nimport Calls = jasmine.Calls\nimport MatchableArgs = jasmine.MatchableArgs\n\ntype Fun = (...args: any[]) => any\n\n/**\n * A SpyFactory creates spies by member access. The spies will be named based on the key,\n * and the type interface of the Spy will match the corresponding interface function.\n */\nexport interface SpyFactory<T> {\n <K extends FunctionKeys<T>>(\n key: K\n ): T[K] extends Fun ? Spy2<NoThisType<NonNullable<T[K]>>> : never\n}\n\n/**\n * Fixes Jasmine's Spy type.\n * Jasmine's Spy interface has a call signature instead of intersecting the original function type.\n * This causes parameterized types of the call signature to be dropped.\n */\nexport type Spy2<Fn extends Fun> = Fn & {\n and: SpyAnd<Fn>\n calls: Calls<Fn>\n withArgs(...args: MatchableArgs<Fn>): Spy<Fn>\n}\n\nexport type FunctionKeys<T> = {\n [P in keyof T]: T[P] extends Fun ? P : never\n}[keyof T]\n\n/**\n * Creates a new spy factory.\n *\n * @param createFake If provided, all spies will be created with the fake implementation createFake\n * returns for the given key.\n */\nexport function createSpyFactory<T>(\n createFake?: (key: FunctionKeys<T>) => Fun\n): SpyFactory<T> {\n return (key: FunctionKeys<T>) => {\n const spy = createSpy(String(key))\n if (createFake) spy.and.callFake(createFake(key))\n return spy as any\n }\n}\n\n/**\n * Creates a Spy.\n * This is an alias to jasmine.createSpy with fixed type parameters.\n * @param key\n */\nexport function createSpy2<Fn extends Fun | undefined>(\n key: keyof any\n): Spy2<NoThisType<NonNullable<Fn>>> {\n return createSpy(String(key)) as any\n}\n\n/**\n * Replaces `this` type with `any` in a method signature.\n */\nexport type NoThisType<Fn extends Fun> =\n ReturnType<Fn> extends ThisType<any>\n ? Fn & ((...args: Parameters<Fn>) => any)\n : Fn\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/*\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by @amazon/vinyl-mock-generator\n */\n\n/* eslint-disable @typescript-eslint/prefer-as-const */\n/* eslint-disable @typescript-eslint/no-deprecated */\n\nimport { createSpy2 } from '../createSpyFactory'\n\nexport class MockAbortController implements AbortController {\n signal: AbortSignal = undefined as any\n\n abort = createSpy2<AbortController['abort']>('abort')\n}\n\nexport class MockAbortSignal implements AbortSignal {\n aborted: boolean = false\n onabort: ((this: AbortSignal, ev: Event) => any) | null = null\n reason: any = undefined\n\n throwIfAborted = createSpy2<AbortSignal['throwIfAborted']>('throwIfAborted')\n addEventListener =\n createSpy2<AbortSignal['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<AbortSignal['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<AbortSignal['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockAudioContext implements AudioContext {\n baseLatency: number = 0\n outputLatency: number = 0\n audioWorklet: AudioWorklet = undefined as any\n currentTime: number = 0\n destination: AudioDestinationNode = undefined as any\n listener: AudioListener = undefined as any\n onstatechange: ((this: BaseAudioContext, ev: Event) => any) | null = null\n sampleRate: number = 0\n state: AudioContextState = 'closed'\n\n close = createSpy2<AudioContext['close']>('close')\n createMediaElementSource = createSpy2<\n AudioContext['createMediaElementSource']\n >('createMediaElementSource')\n createMediaStreamDestination = createSpy2<\n AudioContext['createMediaStreamDestination']\n >('createMediaStreamDestination')\n createMediaStreamSource = createSpy2<\n AudioContext['createMediaStreamSource']\n >('createMediaStreamSource')\n getOutputTimestamp =\n createSpy2<AudioContext['getOutputTimestamp']>('getOutputTimestamp')\n resume = createSpy2<AudioContext['resume']>('resume')\n suspend = createSpy2<AudioContext['suspend']>('suspend')\n addEventListener =\n createSpy2<AudioContext['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<AudioContext['removeEventListener']>(\n 'removeEventListener'\n )\n createAnalyser =\n createSpy2<AudioContext['createAnalyser']>('createAnalyser')\n createBiquadFilter =\n createSpy2<AudioContext['createBiquadFilter']>('createBiquadFilter')\n createBuffer = createSpy2<AudioContext['createBuffer']>('createBuffer')\n createBufferSource =\n createSpy2<AudioContext['createBufferSource']>('createBufferSource')\n createChannelMerger = createSpy2<AudioContext['createChannelMerger']>(\n 'createChannelMerger'\n )\n createChannelSplitter = createSpy2<AudioContext['createChannelSplitter']>(\n 'createChannelSplitter'\n )\n createConstantSource = createSpy2<AudioContext['createConstantSource']>(\n 'createConstantSource'\n )\n createConvolver =\n createSpy2<AudioContext['createConvolver']>('createConvolver')\n createDelay = createSpy2<AudioContext['createDelay']>('createDelay')\n createDynamicsCompressor = createSpy2<\n AudioContext['createDynamicsCompressor']\n >('createDynamicsCompressor')\n createGain = createSpy2<AudioContext['createGain']>('createGain')\n createIIRFilter =\n createSpy2<AudioContext['createIIRFilter']>('createIIRFilter')\n createOscillator =\n createSpy2<AudioContext['createOscillator']>('createOscillator')\n createPanner = createSpy2<AudioContext['createPanner']>('createPanner')\n createPeriodicWave =\n createSpy2<AudioContext['createPeriodicWave']>('createPeriodicWave')\n createScriptProcessor = createSpy2<AudioContext['createScriptProcessor']>(\n 'createScriptProcessor'\n )\n createStereoPanner =\n createSpy2<AudioContext['createStereoPanner']>('createStereoPanner')\n createWaveShaper =\n createSpy2<AudioContext['createWaveShaper']>('createWaveShaper')\n decodeAudioData =\n createSpy2<AudioContext['decodeAudioData']>('decodeAudioData')\n dispatchEvent = createSpy2<AudioContext['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockCache implements Cache {\n add = createSpy2<Cache['add']>('add')\n addAll = createSpy2<Cache['addAll']>('addAll')\n delete = createSpy2<Cache['delete']>('delete')\n keys = createSpy2<Cache['keys']>('keys')\n match = createSpy2<Cache['match']>('match')\n matchAll = createSpy2<Cache['matchAll']>('matchAll')\n put = createSpy2<Cache['put']>('put')\n}\n\nexport class MockCacheStorage implements CacheStorage {\n delete = createSpy2<CacheStorage['delete']>('delete')\n has = createSpy2<CacheStorage['has']>('has')\n keys = createSpy2<CacheStorage['keys']>('keys')\n match = createSpy2<CacheStorage['match']>('match')\n open = createSpy2<CacheStorage['open']>('open')\n}\n\nexport class MockCustomEvent<T = any> implements CustomEvent<T> {\n detail: T = undefined as any\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n initCustomEvent =\n createSpy2<CustomEvent<T>['initCustomEvent']>('initCustomEvent')\n composedPath = createSpy2<CustomEvent<T>['composedPath']>('composedPath')\n initEvent = createSpy2<CustomEvent<T>['initEvent']>('initEvent')\n preventDefault =\n createSpy2<CustomEvent<T>['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n CustomEvent<T>['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<CustomEvent<T>['stopPropagation']>('stopPropagation')\n}\n\nexport class MockDocument implements Document {\n URL: string = ''\n alinkColor: string = ''\n all: HTMLAllCollection = undefined as any\n anchors: HTMLCollectionOf<HTMLAnchorElement> = undefined as any\n applets: HTMLCollection = undefined as any\n bgColor: string = ''\n body: HTMLElement = undefined as any\n characterSet: string = ''\n charset: string = ''\n compatMode: string = ''\n contentType: string = ''\n cookie: string = ''\n currentScript: HTMLOrSVGScriptElement | null = undefined as any\n defaultView: (WindowProxy & typeof globalThis) | null = undefined as any\n designMode: string = ''\n dir: string = ''\n doctype: DocumentType | null = null\n documentElement: HTMLElement = undefined as any\n documentURI: string = ''\n domain: string = ''\n embeds: HTMLCollectionOf<HTMLEmbedElement> = undefined as any\n fgColor: string = ''\n forms: HTMLCollectionOf<HTMLFormElement> = undefined as any\n fragmentDirective: FragmentDirective = undefined as any\n fullscreen: boolean = false\n fullscreenEnabled: boolean = false\n head: HTMLHeadElement = undefined as any\n hidden: boolean = false\n images: HTMLCollectionOf<HTMLImageElement> = undefined as any\n implementation: DOMImplementation = undefined as any\n inputEncoding: string = ''\n lastModified: string = ''\n linkColor: string = ''\n links: HTMLCollectionOf<HTMLAnchorElement | HTMLAreaElement> =\n undefined as any\n onfullscreenchange: ((this: Document, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Document, ev: Event) => any) | null = null\n onpointerlockchange: ((this: Document, ev: Event) => any) | null = null\n onpointerlockerror: ((this: Document, ev: Event) => any) | null = null\n onreadystatechange: ((this: Document, ev: Event) => any) | null = null\n onvisibilitychange: ((this: Document, ev: Event) => any) | null = null\n ownerDocument: null = null\n pictureInPictureEnabled: boolean = false\n plugins: HTMLCollectionOf<HTMLEmbedElement> = undefined as any\n readyState: DocumentReadyState = 'complete'\n referrer: string = ''\n rootElement: SVGSVGElement | null = null\n scripts: HTMLCollectionOf<HTMLScriptElement> = undefined as any\n scrollingElement: Element | null = null\n timeline: DocumentTimeline = undefined as any\n title: string = ''\n visibilityState: DocumentVisibilityState = 'hidden'\n vlinkColor: string = ''\n location: any = undefined\n textContent: null = null\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n activeElement: Element | null = null\n adoptedStyleSheets: CSSStyleSheet[] = []\n fullscreenElement: Element | null = null\n pictureInPictureElement: Element | null = null\n pointerLockElement: Element | null = null\n styleSheets: StyleSheetList = undefined as any\n fonts: FontFaceSet = undefined as any\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n\n adoptNode = createSpy2<Document['adoptNode']>('adoptNode')\n captureEvents = createSpy2<Document['captureEvents']>('captureEvents')\n caretPositionFromPoint = createSpy2<Document['caretPositionFromPoint']>(\n 'caretPositionFromPoint'\n )\n caretRangeFromPoint = createSpy2<Document['caretRangeFromPoint']>(\n 'caretRangeFromPoint'\n )\n clear = createSpy2<Document['clear']>('clear')\n close = createSpy2<Document['close']>('close')\n createAttribute = createSpy2<Document['createAttribute']>('createAttribute')\n createAttributeNS =\n createSpy2<Document['createAttributeNS']>('createAttributeNS')\n createCDATASection =\n createSpy2<Document['createCDATASection']>('createCDATASection')\n createComment = createSpy2<Document['createComment']>('createComment')\n createDocumentFragment = createSpy2<Document['createDocumentFragment']>(\n 'createDocumentFragment'\n )\n createElement = createSpy2<Document['createElement']>('createElement')\n createElementNS = createSpy2<Document['createElementNS']>('createElementNS')\n createEvent = createSpy2<Document['createEvent']>('createEvent')\n createNodeIterator =\n createSpy2<Document['createNodeIterator']>('createNodeIterator')\n createProcessingInstruction = createSpy2<\n Document['createProcessingInstruction']\n >('createProcessingInstruction')\n createRange = createSpy2<Document['createRange']>('createRange')\n createTextNode = createSpy2<Document['createTextNode']>('createTextNode')\n createTreeWalker =\n createSpy2<Document['createTreeWalker']>('createTreeWalker')\n execCommand = createSpy2<Document['execCommand']>('execCommand')\n exitFullscreen = createSpy2<Document['exitFullscreen']>('exitFullscreen')\n exitPictureInPicture = createSpy2<Document['exitPictureInPicture']>(\n 'exitPictureInPicture'\n )\n exitPointerLock = createSpy2<Document['exitPointerLock']>('exitPointerLock')\n getElementById = createSpy2<Document['getElementById']>('getElementById')\n getElementsByClassName = createSpy2<Document['getElementsByClassName']>(\n 'getElementsByClassName'\n )\n getElementsByName =\n createSpy2<Document['getElementsByName']>('getElementsByName')\n getElementsByTagName = createSpy2<Document['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<Document['getElementsByTagNameNS']>(\n 'getElementsByTagNameNS'\n )\n getSelection = createSpy2<Document['getSelection']>('getSelection')\n hasFocus = createSpy2<Document['hasFocus']>('hasFocus')\n hasStorageAccess =\n createSpy2<Document['hasStorageAccess']>('hasStorageAccess')\n importNode = createSpy2<Document['importNode']>('importNode')\n open = createSpy2<Document['open']>('open')\n queryCommandEnabled = createSpy2<Document['queryCommandEnabled']>(\n 'queryCommandEnabled'\n )\n queryCommandIndeterm = createSpy2<Document['queryCommandIndeterm']>(\n 'queryCommandIndeterm'\n )\n queryCommandState =\n createSpy2<Document['queryCommandState']>('queryCommandState')\n queryCommandSupported = createSpy2<Document['queryCommandSupported']>(\n 'queryCommandSupported'\n )\n queryCommandValue =\n createSpy2<Document['queryCommandValue']>('queryCommandValue')\n releaseEvents = createSpy2<Document['releaseEvents']>('releaseEvents')\n requestStorageAccess = createSpy2<Document['requestStorageAccess']>(\n 'requestStorageAccess'\n )\n startViewTransition = createSpy2<Document['startViewTransition']>(\n 'startViewTransition'\n )\n write = createSpy2<Document['write']>('write')\n writeln = createSpy2<Document['writeln']>('writeln')\n addEventListener =\n createSpy2<Document['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<Document['removeEventListener']>(\n 'removeEventListener'\n )\n appendChild = createSpy2<Document['appendChild']>('appendChild')\n cloneNode = createSpy2<Document['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<Document['compareDocumentPosition']>(\n 'compareDocumentPosition'\n )\n contains = createSpy2<Document['contains']>('contains')\n getRootNode = createSpy2<Document['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<Document['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<Document['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<Document['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<Document['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<Document['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<Document['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<Document['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<Document['normalize']>('normalize')\n removeChild = createSpy2<Document['removeChild']>('removeChild')\n replaceChild = createSpy2<Document['replaceChild']>('replaceChild')\n elementFromPoint =\n createSpy2<Document['elementFromPoint']>('elementFromPoint')\n elementsFromPoint =\n createSpy2<Document['elementsFromPoint']>('elementsFromPoint')\n getAnimations = createSpy2<Document['getAnimations']>('getAnimations')\n append = createSpy2<Document['append']>('append')\n prepend = createSpy2<Document['prepend']>('prepend')\n querySelector = createSpy2<Document['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<Document['querySelectorAll']>('querySelectorAll')\n replaceChildren = createSpy2<Document['replaceChildren']>('replaceChildren')\n createExpression =\n createSpy2<Document['createExpression']>('createExpression')\n createNSResolver =\n createSpy2<Document['createNSResolver']>('createNSResolver')\n evaluate = createSpy2<Document['evaluate']>('evaluate')\n dispatchEvent = createSpy2<Document['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockErrorEvent implements ErrorEvent {\n colno: number = 0\n error: any = undefined\n filename: string = ''\n lineno: number = 0\n message: string = ''\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath = createSpy2<ErrorEvent['composedPath']>('composedPath')\n initEvent = createSpy2<ErrorEvent['initEvent']>('initEvent')\n preventDefault = createSpy2<ErrorEvent['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n ErrorEvent['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<ErrorEvent['stopPropagation']>('stopPropagation')\n}\n\nexport class MockEvent implements Event {\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath = createSpy2<Event['composedPath']>('composedPath')\n initEvent = createSpy2<Event['initEvent']>('initEvent')\n preventDefault = createSpy2<Event['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<Event['stopImmediatePropagation']>(\n 'stopImmediatePropagation'\n )\n stopPropagation = createSpy2<Event['stopPropagation']>('stopPropagation')\n}\n\nexport class MockEventTarget implements EventTarget {\n addEventListener =\n createSpy2<EventTarget['addEventListener']>('addEventListener')\n dispatchEvent = createSpy2<EventTarget['dispatchEvent']>('dispatchEvent')\n removeEventListener = createSpy2<EventTarget['removeEventListener']>(\n 'removeEventListener'\n )\n}\n\nexport class MockHTMLAudioElement implements HTMLAudioElement {\n autoplay: boolean = false\n buffered: TimeRanges = undefined as any\n controls: boolean = false\n crossOrigin: string | null = ''\n currentSrc: string = ''\n currentTime: number = 0\n defaultMuted: boolean = false\n defaultPlaybackRate: number = 0\n disableRemotePlayback: boolean = false\n duration: number = 0\n ended: boolean = false\n error: MediaError | null = null\n loop: boolean = false\n mediaKeys: MediaKeys | null = null\n muted: boolean = false\n networkState: number = 0\n onencrypted:\n ((this: HTMLMediaElement, ev: MediaEncryptedEvent) => any) | null = null\n onwaitingforkey: ((this: HTMLMediaElement, ev: Event) => any) | null = null\n paused: boolean = false\n playbackRate: number = 0\n played: TimeRanges = undefined as any\n preload: 'none' | 'metadata' | 'auto' | '' = 'none'\n preservesPitch: boolean = false\n readyState: number = 0\n remote: RemotePlayback = undefined as any\n seekable: TimeRanges = undefined as any\n seeking: boolean = false\n sinkId: string = ''\n src: string = ''\n srcObject: MediaProvider | null = undefined as any\n textTracks: TextTrackList = undefined as any\n volume: number = 0\n NETWORK_EMPTY: 0 = 0\n NETWORK_IDLE: 1 = 1\n NETWORK_LOADING: 2 = 2\n NETWORK_NO_SOURCE: 3 = 3\n HAVE_NOTHING: 0 = 0\n HAVE_METADATA: 1 = 1\n HAVE_CURRENT_DATA: 2 = 2\n HAVE_FUTURE_DATA: 3 = 3\n HAVE_ENOUGH_DATA: 4 = 4\n accessKey: string = ''\n accessKeyLabel: string = ''\n autocapitalize: string = ''\n autocorrect: boolean = false\n dir: string = ''\n draggable: boolean = false\n hidden: boolean = false\n inert: boolean = false\n innerText: string = ''\n lang: string = ''\n offsetHeight: number = 0\n offsetLeft: number = 0\n offsetParent: Element | null = null\n offsetTop: number = 0\n offsetWidth: number = 0\n outerText: string = ''\n popover: string | null = ''\n spellcheck: boolean = false\n title: string = ''\n translate: boolean = false\n writingSuggestions: string = ''\n attributes: NamedNodeMap = undefined as any\n className: string = ''\n clientHeight: number = 0\n clientLeft: number = 0\n clientTop: number = 0\n clientWidth: number = 0\n currentCSSZoom: number = 0\n id: string = ''\n innerHTML: string = ''\n localName: string = ''\n namespaceURI: string | null = ''\n onfullscreenchange: ((this: Element, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Element, ev: Event) => any) | null = null\n outerHTML: string = ''\n ownerDocument: Document = undefined as any\n prefix: string | null = ''\n scrollHeight: number = 0\n scrollLeft: number = 0\n scrollTop: number = 0\n scrollWidth: number = 0\n shadowRoot: ShadowRoot | null = null\n slot: string = ''\n tagName: string = ''\n classList: any = undefined\n part: any = undefined\n textContent: any = undefined\n attributeStyleMap: StylePropertyMap = undefined as any\n style: any = undefined\n contentEditable: string = ''\n enterKeyHint: string = ''\n inputMode: string = ''\n isContentEditable: boolean = false\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n autofocus: boolean = false\n dataset: DOMStringMap = undefined as any\n tabIndex: number = 0\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n ariaActiveDescendantElement: Element | null = null\n ariaAtomic: string | null = ''\n ariaAutoComplete: string | null = ''\n ariaBrailleLabel: string | null = ''\n ariaBrailleRoleDescription: string | null = ''\n ariaBusy: string | null = ''\n ariaChecked: string | null = ''\n ariaColCount: string | null = ''\n ariaColIndex: string | null = ''\n ariaColIndexText: string | null = ''\n ariaColSpan: string | null = ''\n ariaControlsElements: ReadonlyArray<Element> | null = null\n ariaCurrent: string | null = ''\n ariaDescribedByElements: ReadonlyArray<Element> | null = null\n ariaDescription: string | null = ''\n ariaDetailsElements: ReadonlyArray<Element> | null = null\n ariaDisabled: string | null = ''\n ariaErrorMessageElements: ReadonlyArray<Element> | null = null\n ariaExpanded: string | null = ''\n ariaFlowToElements: ReadonlyArray<Element> | null = null\n ariaHasPopup: string | null = ''\n ariaHidden: string | null = ''\n ariaInvalid: string | null = ''\n ariaKeyShortcuts: string | null = ''\n ariaLabel: string | null = ''\n ariaLabelledByElements: ReadonlyArray<Element> | null = null\n ariaLevel: string | null = ''\n ariaLive: string | null = ''\n ariaModal: string | null = ''\n ariaMultiLine: string | null = ''\n ariaMultiSelectable: string | null = ''\n ariaOrientation: string | null = ''\n ariaOwnsElements: ReadonlyArray<Element> | null = null\n ariaPlaceholder: string | null = ''\n ariaPosInSet: string | null = ''\n ariaPressed: string | null = ''\n ariaReadOnly: string | null = ''\n ariaRelevant: string | null = ''\n ariaRequired: string | null = ''\n ariaRoleDescription: string | null = ''\n ariaRowCount: string | null = ''\n ariaRowIndex: string | null = ''\n ariaRowIndexText: string | null = ''\n ariaRowSpan: string | null = ''\n ariaSelected: string | null = ''\n ariaSetSize: string | null = ''\n ariaSort: string | null = ''\n ariaValueMax: string | null = ''\n ariaValueMin: string | null = ''\n ariaValueNow: string | null = ''\n ariaValueText: string | null = ''\n role: string | null = ''\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n assignedSlot: HTMLSlotElement | null = null\n\n addEventListener =\n createSpy2<HTMLAudioElement['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<HTMLAudioElement['removeEventListener']>(\n 'removeEventListener'\n )\n addTextTrack = createSpy2<HTMLAudioElement['addTextTrack']>('addTextTrack')\n canPlayType = createSpy2<HTMLAudioElement['canPlayType']>('canPlayType')\n fastSeek = createSpy2<HTMLAudioElement['fastSeek']>('fastSeek')\n load = createSpy2<HTMLAudioElement['load']>('load')\n pause = createSpy2<HTMLAudioElement['pause']>('pause')\n play = createSpy2<HTMLAudioElement['play']>('play')\n setMediaKeys = createSpy2<HTMLAudioElement['setMediaKeys']>('setMediaKeys')\n setSinkId = createSpy2<HTMLAudioElement['setSinkId']>('setSinkId')\n attachInternals =\n createSpy2<HTMLAudioElement['attachInternals']>('attachInternals')\n click = createSpy2<HTMLAudioElement['click']>('click')\n hidePopover = createSpy2<HTMLAudioElement['hidePopover']>('hidePopover')\n showPopover = createSpy2<HTMLAudioElement['showPopover']>('showPopover')\n togglePopover =\n createSpy2<HTMLAudioElement['togglePopover']>('togglePopover')\n attachShadow = createSpy2<HTMLAudioElement['attachShadow']>('attachShadow')\n checkVisibility =\n createSpy2<HTMLAudioElement['checkVisibility']>('checkVisibility')\n closest = createSpy2<HTMLAudioElement['closest']>('closest')\n computedStyleMap =\n createSpy2<HTMLAudioElement['computedStyleMap']>('computedStyleMap')\n getAttribute = createSpy2<HTMLAudioElement['getAttribute']>('getAttribute')\n getAttributeNS =\n createSpy2<HTMLAudioElement['getAttributeNS']>('getAttributeNS')\n getAttributeNames =\n createSpy2<HTMLAudioElement['getAttributeNames']>('getAttributeNames')\n getAttributeNode =\n createSpy2<HTMLAudioElement['getAttributeNode']>('getAttributeNode')\n getAttributeNodeNS =\n createSpy2<HTMLAudioElement['getAttributeNodeNS']>('getAttributeNodeNS')\n getBoundingClientRect = createSpy2<\n HTMLAudioElement['getBoundingClientRect']\n >('getBoundingClientRect')\n getClientRects =\n createSpy2<HTMLAudioElement['getClientRects']>('getClientRects')\n getElementsByClassName = createSpy2<\n HTMLAudioElement['getElementsByClassName']\n >('getElementsByClassName')\n getElementsByTagName = createSpy2<HTMLAudioElement['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<\n HTMLAudioElement['getElementsByTagNameNS']\n >('getElementsByTagNameNS')\n getHTML = createSpy2<HTMLAudioElement['getHTML']>('getHTML')\n hasAttribute = createSpy2<HTMLAudioElement['hasAttribute']>('hasAttribute')\n hasAttributeNS =\n createSpy2<HTMLAudioElement['hasAttributeNS']>('hasAttributeNS')\n hasAttributes =\n createSpy2<HTMLAudioElement['hasAttributes']>('hasAttributes')\n hasPointerCapture =\n createSpy2<HTMLAudioElement['hasPointerCapture']>('hasPointerCapture')\n insertAdjacentElement = createSpy2<\n HTMLAudioElement['insertAdjacentElement']\n >('insertAdjacentElement')\n insertAdjacentHTML =\n createSpy2<HTMLAudioElement['insertAdjacentHTML']>('insertAdjacentHTML')\n insertAdjacentText =\n createSpy2<HTMLAudioElement['insertAdjacentText']>('insertAdjacentText')\n matches = createSpy2<HTMLAudioElement['matches']>('matches')\n releasePointerCapture = createSpy2<\n HTMLAudioElement['releasePointerCapture']\n >('releasePointerCapture')\n removeAttribute =\n createSpy2<HTMLAudioElement['removeAttribute']>('removeAttribute')\n removeAttributeNS =\n createSpy2<HTMLAudioElement['removeAttributeNS']>('removeAttributeNS')\n removeAttributeNode = createSpy2<HTMLAudioElement['removeAttributeNode']>(\n 'removeAttributeNode'\n )\n requestFullscreen =\n createSpy2<HTMLAudioElement['requestFullscreen']>('requestFullscreen')\n requestPointerLock =\n createSpy2<HTMLAudioElement['requestPointerLock']>('requestPointerLock')\n scroll = createSpy2<HTMLAudioElement['scroll']>('scroll')\n scrollBy = createSpy2<HTMLAudioElement['scrollBy']>('scrollBy')\n scrollIntoView =\n createSpy2<HTMLAudioElement['scrollIntoView']>('scrollIntoView')\n scrollTo = createSpy2<HTMLAudioElement['scrollTo']>('scrollTo')\n setAttribute = createSpy2<HTMLAudioElement['setAttribute']>('setAttribute')\n setAttributeNS =\n createSpy2<HTMLAudioElement['setAttributeNS']>('setAttributeNS')\n setAttributeNode =\n createSpy2<HTMLAudioElement['setAttributeNode']>('setAttributeNode')\n setAttributeNodeNS =\n createSpy2<HTMLAudioElement['setAttributeNodeNS']>('setAttributeNodeNS')\n setHTMLUnsafe =\n createSpy2<HTMLAudioElement['setHTMLUnsafe']>('setHTMLUnsafe')\n setPointerCapture =\n createSpy2<HTMLAudioElement['setPointerCapture']>('setPointerCapture')\n toggleAttribute =\n createSpy2<HTMLAudioElement['toggleAttribute']>('toggleAttribute')\n webkitMatchesSelector = createSpy2<\n HTMLAudioElement['webkitMatchesSelector']\n >('webkitMatchesSelector')\n blur = createSpy2<HTMLAudioElement['blur']>('blur')\n focus = createSpy2<HTMLAudioElement['focus']>('focus')\n appendChild = createSpy2<HTMLAudioElement['appendChild']>('appendChild')\n cloneNode = createSpy2<HTMLAudioElement['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<\n HTMLAudioElement['compareDocumentPosition']\n >('compareDocumentPosition')\n contains = createSpy2<HTMLAudioElement['contains']>('contains')\n getRootNode = createSpy2<HTMLAudioElement['getRootNode']>('getRootNode')\n hasChildNodes =\n createSpy2<HTMLAudioElement['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<HTMLAudioElement['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<HTMLAudioElement['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<HTMLAudioElement['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<HTMLAudioElement['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<HTMLAudioElement['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<HTMLAudioElement['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<HTMLAudioElement['normalize']>('normalize')\n removeChild = createSpy2<HTMLAudioElement['removeChild']>('removeChild')\n replaceChild = createSpy2<HTMLAudioElement['replaceChild']>('replaceChild')\n animate = createSpy2<HTMLAudioElement['animate']>('animate')\n getAnimations =\n createSpy2<HTMLAudioElement['getAnimations']>('getAnimations')\n after = createSpy2<HTMLAudioElement['after']>('after')\n before = createSpy2<HTMLAudioElement['before']>('before')\n remove = createSpy2<HTMLAudioElement['remove']>('remove')\n replaceWith = createSpy2<HTMLAudioElement['replaceWith']>('replaceWith')\n append = createSpy2<HTMLAudioElement['append']>('append')\n prepend = createSpy2<HTMLAudioElement['prepend']>('prepend')\n querySelector =\n createSpy2<HTMLAudioElement['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<HTMLAudioElement['querySelectorAll']>('querySelectorAll')\n replaceChildren =\n createSpy2<HTMLAudioElement['replaceChildren']>('replaceChildren')\n dispatchEvent =\n createSpy2<HTMLAudioElement['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockHTMLDivElement implements HTMLDivElement {\n align: string = ''\n accessKey: string = ''\n accessKeyLabel: string = ''\n autocapitalize: string = ''\n autocorrect: boolean = false\n dir: string = ''\n draggable: boolean = false\n hidden: boolean = false\n inert: boolean = false\n innerText: string = ''\n lang: string = ''\n offsetHeight: number = 0\n offsetLeft: number = 0\n offsetParent: Element | null = null\n offsetTop: number = 0\n offsetWidth: number = 0\n outerText: string = ''\n popover: string | null = ''\n spellcheck: boolean = false\n title: string = ''\n translate: boolean = false\n writingSuggestions: string = ''\n attributes: NamedNodeMap = undefined as any\n className: string = ''\n clientHeight: number = 0\n clientLeft: number = 0\n clientTop: number = 0\n clientWidth: number = 0\n currentCSSZoom: number = 0\n id: string = ''\n innerHTML: string = ''\n localName: string = ''\n namespaceURI: string | null = ''\n onfullscreenchange: ((this: Element, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Element, ev: Event) => any) | null = null\n outerHTML: string = ''\n ownerDocument: Document = undefined as any\n prefix: string | null = ''\n scrollHeight: number = 0\n scrollLeft: number = 0\n scrollTop: number = 0\n scrollWidth: number = 0\n shadowRoot: ShadowRoot | null = null\n slot: string = ''\n tagName: string = ''\n classList: any = undefined\n part: any = undefined\n textContent: any = undefined\n attributeStyleMap: StylePropertyMap = undefined as any\n style: any = undefined\n contentEditable: string = ''\n enterKeyHint: string = ''\n inputMode: string = ''\n isContentEditable: boolean = false\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n autofocus: boolean = false\n dataset: DOMStringMap = undefined as any\n tabIndex: number = 0\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n ariaActiveDescendantElement: Element | null = null\n ariaAtomic: string | null = ''\n ariaAutoComplete: string | null = ''\n ariaBrailleLabel: string | null = ''\n ariaBrailleRoleDescription: string | null = ''\n ariaBusy: string | null = ''\n ariaChecked: string | null = ''\n ariaColCount: string | null = ''\n ariaColIndex: string | null = ''\n ariaColIndexText: string | null = ''\n ariaColSpan: string | null = ''\n ariaControlsElements: ReadonlyArray<Element> | null = null\n ariaCurrent: string | null = ''\n ariaDescribedByElements: ReadonlyArray<Element> | null = null\n ariaDescription: string | null = ''\n ariaDetailsElements: ReadonlyArray<Element> | null = null\n ariaDisabled: string | null = ''\n ariaErrorMessageElements: ReadonlyArray<Element> | null = null\n ariaExpanded: string | null = ''\n ariaFlowToElements: ReadonlyArray<Element> | null = null\n ariaHasPopup: string | null = ''\n ariaHidden: string | null = ''\n ariaInvalid: string | null = ''\n ariaKeyShortcuts: string | null = ''\n ariaLabel: string | null = ''\n ariaLabelledByElements: ReadonlyArray<Element> | null = null\n ariaLevel: string | null = ''\n ariaLive: string | null = ''\n ariaModal: string | null = ''\n ariaMultiLine: string | null = ''\n ariaMultiSelectable: string | null = ''\n ariaOrientation: string | null = ''\n ariaOwnsElements: ReadonlyArray<Element> | null = null\n ariaPlaceholder: string | null = ''\n ariaPosInSet: string | null = ''\n ariaPressed: string | null = ''\n ariaReadOnly: string | null = ''\n ariaRelevant: string | null = ''\n ariaRequired: string | null = ''\n ariaRoleDescription: string | null = ''\n ariaRowCount: string | null = ''\n ariaRowIndex: string | null = ''\n ariaRowIndexText: string | null = ''\n ariaRowSpan: string | null = ''\n ariaSelected: string | null = ''\n ariaSetSize: string | null = ''\n ariaSort: string | null = ''\n ariaValueMax: string | null = ''\n ariaValueMin: string | null = ''\n ariaValueNow: string | null = ''\n ariaValueText: string | null = ''\n role: string | null = ''\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n assignedSlot: HTMLSlotElement | null = null\n\n addEventListener =\n createSpy2<HTMLDivElement['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<HTMLDivElement['removeEventListener']>(\n 'removeEventListener'\n )\n attachInternals =\n createSpy2<HTMLDivElement['attachInternals']>('attachInternals')\n click = createSpy2<HTMLDivElement['click']>('click')\n hidePopover = createSpy2<HTMLDivElement['hidePopover']>('hidePopover')\n showPopover = createSpy2<HTMLDivElement['showPopover']>('showPopover')\n togglePopover = createSpy2<HTMLDivElement['togglePopover']>('togglePopover')\n attachShadow = createSpy2<HTMLDivElement['attachShadow']>('attachShadow')\n checkVisibility =\n createSpy2<HTMLDivElement['checkVisibility']>('checkVisibility')\n closest = createSpy2<HTMLDivElement['closest']>('closest')\n computedStyleMap =\n createSpy2<HTMLDivElement['computedStyleMap']>('computedStyleMap')\n getAttribute = createSpy2<HTMLDivElement['getAttribute']>('getAttribute')\n getAttributeNS =\n createSpy2<HTMLDivElement['getAttributeNS']>('getAttributeNS')\n getAttributeNames =\n createSpy2<HTMLDivElement['getAttributeNames']>('getAttributeNames')\n getAttributeNode =\n createSpy2<HTMLDivElement['getAttributeNode']>('getAttributeNode')\n getAttributeNodeNS =\n createSpy2<HTMLDivElement['getAttributeNodeNS']>('getAttributeNodeNS')\n getBoundingClientRect = createSpy2<HTMLDivElement['getBoundingClientRect']>(\n 'getBoundingClientRect'\n )\n getClientRects =\n createSpy2<HTMLDivElement['getClientRects']>('getClientRects')\n getElementsByClassName = createSpy2<\n HTMLDivElement['getElementsByClassName']\n >('getElementsByClassName')\n getElementsByTagName = createSpy2<HTMLDivElement['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<\n HTMLDivElement['getElementsByTagNameNS']\n >('getElementsByTagNameNS')\n getHTML = createSpy2<HTMLDivElement['getHTML']>('getHTML')\n hasAttribute = createSpy2<HTMLDivElement['hasAttribute']>('hasAttribute')\n hasAttributeNS =\n createSpy2<HTMLDivElement['hasAttributeNS']>('hasAttributeNS')\n hasAttributes = createSpy2<HTMLDivElement['hasAttributes']>('hasAttributes')\n hasPointerCapture =\n createSpy2<HTMLDivElement['hasPointerCapture']>('hasPointerCapture')\n insertAdjacentElement = createSpy2<HTMLDivElement['insertAdjacentElement']>(\n 'insertAdjacentElement'\n )\n insertAdjacentHTML =\n createSpy2<HTMLDivElement['insertAdjacentHTML']>('insertAdjacentHTML')\n insertAdjacentText =\n createSpy2<HTMLDivElement['insertAdjacentText']>('insertAdjacentText')\n matches = createSpy2<HTMLDivElement['matches']>('matches')\n releasePointerCapture = createSpy2<HTMLDivElement['releasePointerCapture']>(\n 'releasePointerCapture'\n )\n removeAttribute =\n createSpy2<HTMLDivElement['removeAttribute']>('removeAttribute')\n removeAttributeNS =\n createSpy2<HTMLDivElement['removeAttributeNS']>('removeAttributeNS')\n removeAttributeNode = createSpy2<HTMLDivElement['removeAttributeNode']>(\n 'removeAttributeNode'\n )\n requestFullscreen =\n createSpy2<HTMLDivElement['requestFullscreen']>('requestFullscreen')\n requestPointerLock =\n createSpy2<HTMLDivElement['requestPointerLock']>('requestPointerLock')\n scroll = createSpy2<HTMLDivElement['scroll']>('scroll')\n scrollBy = createSpy2<HTMLDivElement['scrollBy']>('scrollBy')\n scrollIntoView =\n createSpy2<HTMLDivElement['scrollIntoView']>('scrollIntoView')\n scrollTo = createSpy2<HTMLDivElement['scrollTo']>('scrollTo')\n setAttribute = createSpy2<HTMLDivElement['setAttribute']>('setAttribute')\n setAttributeNS =\n createSpy2<HTMLDivElement['setAttributeNS']>('setAttributeNS')\n setAttributeNode =\n createSpy2<HTMLDivElement['setAttributeNode']>('setAttributeNode')\n setAttributeNodeNS =\n createSpy2<HTMLDivElement['setAttributeNodeNS']>('setAttributeNodeNS')\n setHTMLUnsafe = createSpy2<HTMLDivElement['setHTMLUnsafe']>('setHTMLUnsafe')\n setPointerCapture =\n createSpy2<HTMLDivElement['setPointerCapture']>('setPointerCapture')\n toggleAttribute =\n createSpy2<HTMLDivElement['toggleAttribute']>('toggleAttribute')\n webkitMatchesSelector = createSpy2<HTMLDivElement['webkitMatchesSelector']>(\n 'webkitMatchesSelector'\n )\n blur = createSpy2<HTMLDivElement['blur']>('blur')\n focus = createSpy2<HTMLDivElement['focus']>('focus')\n appendChild = createSpy2<HTMLDivElement['appendChild']>('appendChild')\n cloneNode = createSpy2<HTMLDivElement['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<\n HTMLDivElement['compareDocumentPosition']\n >('compareDocumentPosition')\n contains = createSpy2<HTMLDivElement['contains']>('contains')\n getRootNode = createSpy2<HTMLDivElement['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<HTMLDivElement['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<HTMLDivElement['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<HTMLDivElement['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<HTMLDivElement['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<HTMLDivElement['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<HTMLDivElement['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<HTMLDivElement['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<HTMLDivElement['normalize']>('normalize')\n removeChild = createSpy2<HTMLDivElement['removeChild']>('removeChild')\n replaceChild = createSpy2<HTMLDivElement['replaceChild']>('replaceChild')\n animate = createSpy2<HTMLDivElement['animate']>('animate')\n getAnimations = createSpy2<HTMLDivElement['getAnimations']>('getAnimations')\n after = createSpy2<HTMLDivElement['after']>('after')\n before = createSpy2<HTMLDivElement['before']>('before')\n remove = createSpy2<HTMLDivElement['remove']>('remove')\n replaceWith = createSpy2<HTMLDivElement['replaceWith']>('replaceWith')\n append = createSpy2<HTMLDivElement['append']>('append')\n prepend = createSpy2<HTMLDivElement['prepend']>('prepend')\n querySelector = createSpy2<HTMLDivElement['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<HTMLDivElement['querySelectorAll']>('querySelectorAll')\n replaceChildren =\n createSpy2<HTMLDivElement['replaceChildren']>('replaceChildren')\n dispatchEvent = createSpy2<HTMLDivElement['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockHTMLMediaElement implements HTMLMediaElement {\n autoplay: boolean = false\n buffered: TimeRanges = undefined as any\n controls: boolean = false\n crossOrigin: string | null = ''\n currentSrc: string = ''\n currentTime: number = 0\n defaultMuted: boolean = false\n defaultPlaybackRate: number = 0\n disableRemotePlayback: boolean = false\n duration: number = 0\n ended: boolean = false\n error: MediaError | null = null\n loop: boolean = false\n mediaKeys: MediaKeys | null = null\n muted: boolean = false\n networkState: number = 0\n onencrypted:\n ((this: HTMLMediaElement, ev: MediaEncryptedEvent) => any) | null = null\n onwaitingforkey: ((this: HTMLMediaElement, ev: Event) => any) | null = null\n paused: boolean = false\n playbackRate: number = 0\n played: TimeRanges = undefined as any\n preload: 'none' | 'metadata' | 'auto' | '' = 'none'\n preservesPitch: boolean = false\n readyState: number = 0\n remote: RemotePlayback = undefined as any\n seekable: TimeRanges = undefined as any\n seeking: boolean = false\n sinkId: string = ''\n src: string = ''\n srcObject: MediaProvider | null = undefined as any\n textTracks: TextTrackList = undefined as any\n volume: number = 0\n NETWORK_EMPTY: 0 = 0\n NETWORK_IDLE: 1 = 1\n NETWORK_LOADING: 2 = 2\n NETWORK_NO_SOURCE: 3 = 3\n HAVE_NOTHING: 0 = 0\n HAVE_METADATA: 1 = 1\n HAVE_CURRENT_DATA: 2 = 2\n HAVE_FUTURE_DATA: 3 = 3\n HAVE_ENOUGH_DATA: 4 = 4\n accessKey: string = ''\n accessKeyLabel: string = ''\n autocapitalize: string = ''\n autocorrect: boolean = false\n dir: string = ''\n draggable: boolean = false\n hidden: boolean = false\n inert: boolean = false\n innerText: string = ''\n lang: string = ''\n offsetHeight: number = 0\n offsetLeft: number = 0\n offsetParent: Element | null = null\n offsetTop: number = 0\n offsetWidth: number = 0\n outerText: string = ''\n popover: string | null = ''\n spellcheck: boolean = false\n title: string = ''\n translate: boolean = false\n writingSuggestions: string = ''\n attributes: NamedNodeMap = undefined as any\n className: string = ''\n clientHeight: number = 0\n clientLeft: number = 0\n clientTop: number = 0\n clientWidth: number = 0\n currentCSSZoom: number = 0\n id: string = ''\n innerHTML: string = ''\n localName: string = ''\n namespaceURI: string | null = ''\n onfullscreenchange: ((this: Element, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Element, ev: Event) => any) | null = null\n outerHTML: string = ''\n ownerDocument: Document = undefined as any\n prefix: string | null = ''\n scrollHeight: number = 0\n scrollLeft: number = 0\n scrollTop: number = 0\n scrollWidth: number = 0\n shadowRoot: ShadowRoot | null = null\n slot: string = ''\n tagName: string = ''\n classList: any = undefined\n part: any = undefined\n textContent: any = undefined\n attributeStyleMap: StylePropertyMap = undefined as any\n style: any = undefined\n contentEditable: string = ''\n enterKeyHint: string = ''\n inputMode: string = ''\n isContentEditable: boolean = false\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n autofocus: boolean = false\n dataset: DOMStringMap = undefined as any\n tabIndex: number = 0\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n ariaActiveDescendantElement: Element | null = null\n ariaAtomic: string | null = ''\n ariaAutoComplete: string | null = ''\n ariaBrailleLabel: string | null = ''\n ariaBrailleRoleDescription: string | null = ''\n ariaBusy: string | null = ''\n ariaChecked: string | null = ''\n ariaColCount: string | null = ''\n ariaColIndex: string | null = ''\n ariaColIndexText: string | null = ''\n ariaColSpan: string | null = ''\n ariaControlsElements: ReadonlyArray<Element> | null = null\n ariaCurrent: string | null = ''\n ariaDescribedByElements: ReadonlyArray<Element> | null = null\n ariaDescription: string | null = ''\n ariaDetailsElements: ReadonlyArray<Element> | null = null\n ariaDisabled: string | null = ''\n ariaErrorMessageElements: ReadonlyArray<Element> | null = null\n ariaExpanded: string | null = ''\n ariaFlowToElements: ReadonlyArray<Element> | null = null\n ariaHasPopup: string | null = ''\n ariaHidden: string | null = ''\n ariaInvalid: string | null = ''\n ariaKeyShortcuts: string | null = ''\n ariaLabel: string | null = ''\n ariaLabelledByElements: ReadonlyArray<Element> | null = null\n ariaLevel: string | null = ''\n ariaLive: string | null = ''\n ariaModal: string | null = ''\n ariaMultiLine: string | null = ''\n ariaMultiSelectable: string | null = ''\n ariaOrientation: string | null = ''\n ariaOwnsElements: ReadonlyArray<Element> | null = null\n ariaPlaceholder: string | null = ''\n ariaPosInSet: string | null = ''\n ariaPressed: string | null = ''\n ariaReadOnly: string | null = ''\n ariaRelevant: string | null = ''\n ariaRequired: string | null = ''\n ariaRoleDescription: string | null = ''\n ariaRowCount: string | null = ''\n ariaRowIndex: string | null = ''\n ariaRowIndexText: string | null = ''\n ariaRowSpan: string | null = ''\n ariaSelected: string | null = ''\n ariaSetSize: string | null = ''\n ariaSort: string | null = ''\n ariaValueMax: string | null = ''\n ariaValueMin: string | null = ''\n ariaValueNow: string | null = ''\n ariaValueText: string | null = ''\n role: string | null = ''\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n assignedSlot: HTMLSlotElement | null = null\n\n addTextTrack = createSpy2<HTMLMediaElement['addTextTrack']>('addTextTrack')\n canPlayType = createSpy2<HTMLMediaElement['canPlayType']>('canPlayType')\n fastSeek = createSpy2<HTMLMediaElement['fastSeek']>('fastSeek')\n load = createSpy2<HTMLMediaElement['load']>('load')\n pause = createSpy2<HTMLMediaElement['pause']>('pause')\n play = createSpy2<HTMLMediaElement['play']>('play')\n setMediaKeys = createSpy2<HTMLMediaElement['setMediaKeys']>('setMediaKeys')\n setSinkId = createSpy2<HTMLMediaElement['setSinkId']>('setSinkId')\n addEventListener =\n createSpy2<HTMLMediaElement['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<HTMLMediaElement['removeEventListener']>(\n 'removeEventListener'\n )\n attachInternals =\n createSpy2<HTMLMediaElement['attachInternals']>('attachInternals')\n click = createSpy2<HTMLMediaElement['click']>('click')\n hidePopover = createSpy2<HTMLMediaElement['hidePopover']>('hidePopover')\n showPopover = createSpy2<HTMLMediaElement['showPopover']>('showPopover')\n togglePopover =\n createSpy2<HTMLMediaElement['togglePopover']>('togglePopover')\n attachShadow = createSpy2<HTMLMediaElement['attachShadow']>('attachShadow')\n checkVisibility =\n createSpy2<HTMLMediaElement['checkVisibility']>('checkVisibility')\n closest = createSpy2<HTMLMediaElement['closest']>('closest')\n computedStyleMap =\n createSpy2<HTMLMediaElement['computedStyleMap']>('computedStyleMap')\n getAttribute = createSpy2<HTMLMediaElement['getAttribute']>('getAttribute')\n getAttributeNS =\n createSpy2<HTMLMediaElement['getAttributeNS']>('getAttributeNS')\n getAttributeNames =\n createSpy2<HTMLMediaElement['getAttributeNames']>('getAttributeNames')\n getAttributeNode =\n createSpy2<HTMLMediaElement['getAttributeNode']>('getAttributeNode')\n getAttributeNodeNS =\n createSpy2<HTMLMediaElement['getAttributeNodeNS']>('getAttributeNodeNS')\n getBoundingClientRect = createSpy2<\n HTMLMediaElement['getBoundingClientRect']\n >('getBoundingClientRect')\n getClientRects =\n createSpy2<HTMLMediaElement['getClientRects']>('getClientRects')\n getElementsByClassName = createSpy2<\n HTMLMediaElement['getElementsByClassName']\n >('getElementsByClassName')\n getElementsByTagName = createSpy2<HTMLMediaElement['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<\n HTMLMediaElement['getElementsByTagNameNS']\n >('getElementsByTagNameNS')\n getHTML = createSpy2<HTMLMediaElement['getHTML']>('getHTML')\n hasAttribute = createSpy2<HTMLMediaElement['hasAttribute']>('hasAttribute')\n hasAttributeNS =\n createSpy2<HTMLMediaElement['hasAttributeNS']>('hasAttributeNS')\n hasAttributes =\n createSpy2<HTMLMediaElement['hasAttributes']>('hasAttributes')\n hasPointerCapture =\n createSpy2<HTMLMediaElement['hasPointerCapture']>('hasPointerCapture')\n insertAdjacentElement = createSpy2<\n HTMLMediaElement['insertAdjacentElement']\n >('insertAdjacentElement')\n insertAdjacentHTML =\n createSpy2<HTMLMediaElement['insertAdjacentHTML']>('insertAdjacentHTML')\n insertAdjacentText =\n createSpy2<HTMLMediaElement['insertAdjacentText']>('insertAdjacentText')\n matches = createSpy2<HTMLMediaElement['matches']>('matches')\n releasePointerCapture = createSpy2<\n HTMLMediaElement['releasePointerCapture']\n >('releasePointerCapture')\n removeAttribute =\n createSpy2<HTMLMediaElement['removeAttribute']>('removeAttribute')\n removeAttributeNS =\n createSpy2<HTMLMediaElement['removeAttributeNS']>('removeAttributeNS')\n removeAttributeNode = createSpy2<HTMLMediaElement['removeAttributeNode']>(\n 'removeAttributeNode'\n )\n requestFullscreen =\n createSpy2<HTMLMediaElement['requestFullscreen']>('requestFullscreen')\n requestPointerLock =\n createSpy2<HTMLMediaElement['requestPointerLock']>('requestPointerLock')\n scroll = createSpy2<HTMLMediaElement['scroll']>('scroll')\n scrollBy = createSpy2<HTMLMediaElement['scrollBy']>('scrollBy')\n scrollIntoView =\n createSpy2<HTMLMediaElement['scrollIntoView']>('scrollIntoView')\n scrollTo = createSpy2<HTMLMediaElement['scrollTo']>('scrollTo')\n setAttribute = createSpy2<HTMLMediaElement['setAttribute']>('setAttribute')\n setAttributeNS =\n createSpy2<HTMLMediaElement['setAttributeNS']>('setAttributeNS')\n setAttributeNode =\n createSpy2<HTMLMediaElement['setAttributeNode']>('setAttributeNode')\n setAttributeNodeNS =\n createSpy2<HTMLMediaElement['setAttributeNodeNS']>('setAttributeNodeNS')\n setHTMLUnsafe =\n createSpy2<HTMLMediaElement['setHTMLUnsafe']>('setHTMLUnsafe')\n setPointerCapture =\n createSpy2<HTMLMediaElement['setPointerCapture']>('setPointerCapture')\n toggleAttribute =\n createSpy2<HTMLMediaElement['toggleAttribute']>('toggleAttribute')\n webkitMatchesSelector = createSpy2<\n HTMLMediaElement['webkitMatchesSelector']\n >('webkitMatchesSelector')\n blur = createSpy2<HTMLMediaElement['blur']>('blur')\n focus = createSpy2<HTMLMediaElement['focus']>('focus')\n appendChild = createSpy2<HTMLMediaElement['appendChild']>('appendChild')\n cloneNode = createSpy2<HTMLMediaElement['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<\n HTMLMediaElement['compareDocumentPosition']\n >('compareDocumentPosition')\n contains = createSpy2<HTMLMediaElement['contains']>('contains')\n getRootNode = createSpy2<HTMLMediaElement['getRootNode']>('getRootNode')\n hasChildNodes =\n createSpy2<HTMLMediaElement['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<HTMLMediaElement['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<HTMLMediaElement['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<HTMLMediaElement['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<HTMLMediaElement['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<HTMLMediaElement['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<HTMLMediaElement['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<HTMLMediaElement['normalize']>('normalize')\n removeChild = createSpy2<HTMLMediaElement['removeChild']>('removeChild')\n replaceChild = createSpy2<HTMLMediaElement['replaceChild']>('replaceChild')\n animate = createSpy2<HTMLMediaElement['animate']>('animate')\n getAnimations =\n createSpy2<HTMLMediaElement['getAnimations']>('getAnimations')\n after = createSpy2<HTMLMediaElement['after']>('after')\n before = createSpy2<HTMLMediaElement['before']>('before')\n remove = createSpy2<HTMLMediaElement['remove']>('remove')\n replaceWith = createSpy2<HTMLMediaElement['replaceWith']>('replaceWith')\n append = createSpy2<HTMLMediaElement['append']>('append')\n prepend = createSpy2<HTMLMediaElement['prepend']>('prepend')\n querySelector =\n createSpy2<HTMLMediaElement['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<HTMLMediaElement['querySelectorAll']>('querySelectorAll')\n replaceChildren =\n createSpy2<HTMLMediaElement['replaceChildren']>('replaceChildren')\n dispatchEvent =\n createSpy2<HTMLMediaElement['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockMediaError implements MediaError {\n code: number = 0\n message: string = ''\n MEDIA_ERR_ABORTED: 1 = 1\n MEDIA_ERR_NETWORK: 2 = 2\n MEDIA_ERR_DECODE: 3 = 3\n MEDIA_ERR_SRC_NOT_SUPPORTED: 4 = 4\n}\n\nexport class MockMediaKeyMessageEvent implements MediaKeyMessageEvent {\n message: ArrayBuffer = new ArrayBuffer(0)\n messageType: MediaKeyMessageType = 'individualization-request'\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath =\n createSpy2<MediaKeyMessageEvent['composedPath']>('composedPath')\n initEvent = createSpy2<MediaKeyMessageEvent['initEvent']>('initEvent')\n preventDefault =\n createSpy2<MediaKeyMessageEvent['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n MediaKeyMessageEvent['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<MediaKeyMessageEvent['stopPropagation']>('stopPropagation')\n}\n\nexport class MockMediaKeySession implements MediaKeySession {\n closed: Promise<MediaKeySessionClosedReason> = undefined as any\n expiration: number = 0\n keyStatuses: MediaKeyStatusMap = undefined as any\n onkeystatuseschange: ((this: MediaKeySession, ev: Event) => any) | null =\n null\n onmessage:\n ((this: MediaKeySession, ev: MediaKeyMessageEvent) => any) | null = null\n sessionId: string = ''\n\n close = createSpy2<MediaKeySession['close']>('close')\n generateRequest =\n createSpy2<MediaKeySession['generateRequest']>('generateRequest')\n load = createSpy2<MediaKeySession['load']>('load')\n remove = createSpy2<MediaKeySession['remove']>('remove')\n update = createSpy2<MediaKeySession['update']>('update')\n addEventListener =\n createSpy2<MediaKeySession['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<MediaKeySession['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent =\n createSpy2<MediaKeySession['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockMediaKeySystemAccess implements MediaKeySystemAccess {\n keySystem: string = ''\n\n createMediaKeys =\n createSpy2<MediaKeySystemAccess['createMediaKeys']>('createMediaKeys')\n getConfiguration =\n createSpy2<MediaKeySystemAccess['getConfiguration']>('getConfiguration')\n}\n\nexport class MockMediaKeys implements MediaKeys {\n createSession = createSpy2<MediaKeys['createSession']>('createSession')\n getStatusForPolicy =\n createSpy2<MediaKeys['getStatusForPolicy']>('getStatusForPolicy')\n setServerCertificate = createSpy2<MediaKeys['setServerCertificate']>(\n 'setServerCertificate'\n )\n}\n\nexport class MockMediaSource implements MediaSource {\n activeSourceBuffers: SourceBufferList = undefined as any\n duration: number = 0\n onsourceclose: ((this: MediaSource, ev: Event) => any) | null = null\n onsourceended: ((this: MediaSource, ev: Event) => any) | null = null\n onsourceopen: ((this: MediaSource, ev: Event) => any) | null = null\n readyState: ReadyState = 'closed'\n sourceBuffers: SourceBufferList = undefined as any\n\n addSourceBuffer =\n createSpy2<MediaSource['addSourceBuffer']>('addSourceBuffer')\n clearLiveSeekableRange = createSpy2<MediaSource['clearLiveSeekableRange']>(\n 'clearLiveSeekableRange'\n )\n endOfStream = createSpy2<MediaSource['endOfStream']>('endOfStream')\n removeSourceBuffer =\n createSpy2<MediaSource['removeSourceBuffer']>('removeSourceBuffer')\n setLiveSeekableRange = createSpy2<MediaSource['setLiveSeekableRange']>(\n 'setLiveSeekableRange'\n )\n addEventListener =\n createSpy2<MediaSource['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<MediaSource['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<MediaSource['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockMediaStream implements MediaStream {\n active: boolean = false\n id: string = ''\n onaddtrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null =\n null\n onremovetrack:\n ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null = null\n\n addTrack = createSpy2<MediaStream['addTrack']>('addTrack')\n clone = createSpy2<MediaStream['clone']>('clone')\n getAudioTracks = createSpy2<MediaStream['getAudioTracks']>('getAudioTracks')\n getTrackById = createSpy2<MediaStream['getTrackById']>('getTrackById')\n getTracks = createSpy2<MediaStream['getTracks']>('getTracks')\n getVideoTracks = createSpy2<MediaStream['getVideoTracks']>('getVideoTracks')\n removeTrack = createSpy2<MediaStream['removeTrack']>('removeTrack')\n addEventListener =\n createSpy2<MediaStream['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<MediaStream['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<MediaStream['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockNavigator implements Navigator {\n clipboard: Clipboard = undefined as any\n credentials: CredentialsContainer = undefined as any\n doNotTrack: string | null = ''\n geolocation: Geolocation = undefined as any\n login: NavigatorLogin = undefined as any\n maxTouchPoints: number = 0\n mediaCapabilities: MediaCapabilities = undefined as any\n mediaDevices: MediaDevices = undefined as any\n mediaSession: MediaSession = undefined as any\n permissions: Permissions = undefined as any\n serviceWorker: ServiceWorkerContainer = undefined as any\n userActivation: UserActivation = undefined as any\n wakeLock: WakeLock = undefined as any\n webdriver: boolean = false\n hardwareConcurrency: number = 0\n cookieEnabled: boolean = false\n appCodeName: string = ''\n appName: string = ''\n appVersion: string = ''\n platform: string = ''\n product: string = ''\n productSub: string = ''\n userAgent: string = ''\n vendor: string = ''\n vendorSub: string = ''\n language: string = ''\n languages: ReadonlyArray<string> = []\n locks: LockManager = undefined as any\n onLine: boolean = false\n mimeTypes: MimeTypeArray = undefined as any\n pdfViewerEnabled: boolean = false\n plugins: PluginArray = undefined as any\n storage: StorageManager = undefined as any\n\n canShare = createSpy2<Navigator['canShare']>('canShare')\n getGamepads = createSpy2<Navigator['getGamepads']>('getGamepads')\n requestMIDIAccess =\n createSpy2<Navigator['requestMIDIAccess']>('requestMIDIAccess')\n requestMediaKeySystemAccess = createSpy2<\n Navigator['requestMediaKeySystemAccess']\n >('requestMediaKeySystemAccess')\n sendBeacon = createSpy2<Navigator['sendBeacon']>('sendBeacon')\n share = createSpy2<Navigator['share']>('share')\n vibrate = createSpy2<Navigator['vibrate']>('vibrate')\n clearAppBadge = createSpy2<Navigator['clearAppBadge']>('clearAppBadge')\n setAppBadge = createSpy2<Navigator['setAppBadge']>('setAppBadge')\n registerProtocolHandler = createSpy2<Navigator['registerProtocolHandler']>(\n 'registerProtocolHandler'\n )\n javaEnabled = createSpy2<Navigator['javaEnabled']>('javaEnabled')\n}\n\nexport class MockNode implements Node {\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n ownerDocument: Document | null = null\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n textContent: string | null = ''\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n\n appendChild = createSpy2<Node['appendChild']>('appendChild')\n cloneNode = createSpy2<Node['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<Node['compareDocumentPosition']>(\n 'compareDocumentPosition'\n )\n contains = createSpy2<Node['contains']>('contains')\n getRootNode = createSpy2<Node['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<Node['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<Node['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<Node['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<Node['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<Node['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<Node['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<Node['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<Node['normalize']>('normalize')\n removeChild = createSpy2<Node['removeChild']>('removeChild')\n replaceChild = createSpy2<Node['replaceChild']>('replaceChild')\n addEventListener = createSpy2<Node['addEventListener']>('addEventListener')\n dispatchEvent = createSpy2<Node['dispatchEvent']>('dispatchEvent')\n removeEventListener = createSpy2<Node['removeEventListener']>(\n 'removeEventListener'\n )\n}\n\nexport class MockProgressEvent<\n T extends EventTarget = EventTarget,\n> implements ProgressEvent<T> {\n lengthComputable: boolean = false\n loaded: number = 0\n target: T | null = undefined as any\n total: number = 0\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath = createSpy2<ProgressEvent<T>['composedPath']>('composedPath')\n initEvent = createSpy2<ProgressEvent<T>['initEvent']>('initEvent')\n preventDefault =\n createSpy2<ProgressEvent<T>['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n ProgressEvent<T>['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<ProgressEvent<T>['stopPropagation']>('stopPropagation')\n}\n\nexport class MockPromiseRejectionEvent implements PromiseRejectionEvent {\n promise: Promise<any> = undefined as any\n reason: any = undefined\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath =\n createSpy2<PromiseRejectionEvent['composedPath']>('composedPath')\n initEvent = createSpy2<PromiseRejectionEvent['initEvent']>('initEvent')\n preventDefault =\n createSpy2<PromiseRejectionEvent['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n PromiseRejectionEvent['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<PromiseRejectionEvent['stopPropagation']>('stopPropagation')\n}\n\nexport class MockSourceBuffer implements SourceBuffer {\n appendWindowEnd: number = 0\n appendWindowStart: number = 0\n buffered: TimeRanges = undefined as any\n mode: AppendMode = 'segments'\n onabort: ((this: SourceBuffer, ev: Event) => any) | null = null\n onerror: ((this: SourceBuffer, ev: Event) => any) | null = null\n onupdate: ((this: SourceBuffer, ev: Event) => any) | null = null\n onupdateend: ((this: SourceBuffer, ev: Event) => any) | null = null\n onupdatestart: ((this: SourceBuffer, ev: Event) => any) | null = null\n timestampOffset: number = 0\n updating: boolean = false\n\n abort = createSpy2<SourceBuffer['abort']>('abort')\n appendBuffer = createSpy2<SourceBuffer['appendBuffer']>('appendBuffer')\n changeType = createSpy2<SourceBuffer['changeType']>('changeType')\n remove = createSpy2<SourceBuffer['remove']>('remove')\n addEventListener =\n createSpy2<SourceBuffer['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<SourceBuffer['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<SourceBuffer['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockStorage implements Storage {\n [key: string]: any\n\n length: number = 0\n\n clear = createSpy2<Storage['clear']>('clear')\n getItem = createSpy2<Storage['getItem']>('getItem')\n key = createSpy2<Storage['key']>('key')\n removeItem = createSpy2<Storage['removeItem']>('removeItem')\n setItem = createSpy2<Storage['setItem']>('setItem')\n}\n\nexport class MockText implements Text {\n wholeText: string = ''\n data: string = ''\n length: number = 0\n ownerDocument: Document = undefined as any\n textContent: any = undefined\n assignedSlot: HTMLSlotElement | null = null\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n\n splitText = createSpy2<Text['splitText']>('splitText')\n appendData = createSpy2<Text['appendData']>('appendData')\n deleteData = createSpy2<Text['deleteData']>('deleteData')\n insertData = createSpy2<Text['insertData']>('insertData')\n replaceData = createSpy2<Text['replaceData']>('replaceData')\n substringData = createSpy2<Text['substringData']>('substringData')\n appendChild = createSpy2<Text['appendChild']>('appendChild')\n cloneNode = createSpy2<Text['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<Text['compareDocumentPosition']>(\n 'compareDocumentPosition'\n )\n contains = createSpy2<Text['contains']>('contains')\n getRootNode = createSpy2<Text['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<Text['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<Text['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<Text['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<Text['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<Text['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<Text['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<Text['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<Text['normalize']>('normalize')\n removeChild = createSpy2<Text['removeChild']>('removeChild')\n replaceChild = createSpy2<Text['replaceChild']>('replaceChild')\n after = createSpy2<Text['after']>('after')\n before = createSpy2<Text['before']>('before')\n remove = createSpy2<Text['remove']>('remove')\n replaceWith = createSpy2<Text['replaceWith']>('replaceWith')\n addEventListener = createSpy2<Text['addEventListener']>('addEventListener')\n dispatchEvent = createSpy2<Text['dispatchEvent']>('dispatchEvent')\n removeEventListener = createSpy2<Text['removeEventListener']>(\n 'removeEventListener'\n )\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MockAbortSignal, MockMediaSource } from './lib.dom'\nimport { createSpy2 } from '../createSpyFactory'\n\nexport class MockMediaSourceGlobal extends MockMediaSource {\n static canConstructInDedicatedWorker = false\n static isTypeSupported =\n createSpy2<(typeof global.MediaSource)['isTypeSupported']>(\n 'isTypeSupported'\n )\n}\n\nexport class MockAbortSignalGlobal extends MockAbortSignal {\n static abort = createSpy2<(typeof global.AbortSignal)['abort']>('abort')\n static any = createSpy2<(typeof global.AbortSignal)['any']>('any')\n static timeout =\n createSpy2<(typeof global.AbortSignal)['timeout']>('timeout')\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n selectors: K,\n parentNode?: ParentNode\n): HTMLElementTagNameMap[K]\nexport function el(selectors: string, parentNode?: ParentNode): HTMLElement\nexport function el<E extends Element = Element>(\n selectors: string,\n parentNode: ParentNode = document\n): E {\n const element = parentNode.querySelector(selectors)\n if (!element) throw new Error(`${selectors} must be a DOM element`)\n return element as E\n}\n\nexport interface QuerySelector {\n <K extends keyof HTMLElementTagNameMap>(\n selectors: K,\n parentNode?: ParentNode\n ): HTMLElementTagNameMap[K]\n (selectors: string): HTMLElement\n}\n\nexport function bindQuerySelector(parentNode: ParentNode): QuerySelector {\n return (selectors: string) => el(selectors, parentNode)\n}\n\nexport function hide(element: HTMLElement) {\n element.style.display = 'none'\n}\n\nexport function show(element: HTMLElement) {\n element.style.removeProperty('display')\n}\n\nexport function getVisible(element: HTMLElement): boolean {\n return element.style.display !== 'none'\n}\n\nexport function setVisible(element: HTMLElement, value: boolean) {\n if (getVisible(element) === value) return\n if (value) show(element)\n else hide(element)\n}\n\nexport function isHidden(element: HTMLElement) {\n let node: HTMLElement | null = element\n while (node) {\n if (getComputedStyle(node).display === 'none') return true\n node = node.parentElement\n }\n return false\n}\n\nexport function isInputElement(\n value: Element | null\n): value is HTMLInputElement {\n return value?.tagName.toLowerCase() === 'input'\n}\n\n/**\n * Adds or removes a class token to an element.\n *\n * @param value The element whose classList to modify.\n * @param token The class token.\n * @param toggled If true, the token is added, if false, removed.\n */\nexport function setClassToken(\n value: HTMLElement,\n token: string,\n toggled: boolean\n) {\n if (toggled) {\n value.classList.add(token)\n } else {\n value.classList.remove(token)\n }\n}\n\nexport type ElementInitOptions = {\n readonly parent?: HTMLElement\n readonly className?: string\n}\n\n/**\n * Recursively walks a node hierarchy, invoking a callback for every node, depth first.\n *\n * @param node\n * @param callback\n */\nexport function walkDomDepthFirst(\n node: Node | undefined | null,\n callback: (node: Node) => void\n) {\n if (!node) return\n let next = node.firstChild\n while (next) {\n // Snapshot the sibling before recursing so a callback that moves\n // `next` can't sever the chain and skip the rest of the row.\n const after = next.nextSibling\n walkDomDepthFirst(next, callback)\n next = after\n }\n callback(node)\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { walkDomDepthFirst } from '../domUtil'\nimport type { Maybe, Unsubscribe } from '@amazon/vinyl-util'\n\n/**\n * Where {@link onConnect} keeps a node's callbacks, so the observer can call them without an event\n * dispatch. A registered symbol, so every copy of this library on a page shares it.\n */\nconst CONNECTION_CALLBACKS: unique symbol = Symbol.for(\n '@amazon/vinyl-tsx/connectionCallbacks'\n)\n\ninterface ConnectionCallbacks {\n readonly connect: Set<() => void>\n readonly disconnect: Set<() => void>\n}\n\ntype ObservedNode = Node & { [CONNECTION_CALLBACKS]?: ConnectionCallbacks }\n\nfunction callbacksOf(node: Node): ConnectionCallbacks {\n const observed = node as ObservedNode\n let callbacks = observed[CONNECTION_CALLBACKS]\n if (!callbacks) {\n callbacks = { connect: new Set(), disconnect: new Set() }\n observed[CONNECTION_CALLBACKS] = callbacks\n }\n return callbacks\n}\n\nfunction notify(node: Node, type: keyof ConnectionCallbacks): void {\n const callbacks = (node as ObservedNode)[CONNECTION_CALLBACKS]?.[type]\n if (callbacks?.size) for (const callback of [...callbacks]) callback()\n}\n\nexport interface ConnectedObserverOptions {\n /**\n * Whether to dispatch a `connect` / `disconnect` DOM event on every node of an added or removed\n * subtree, for listeners added with `addEventListener` (default true). {@link onConnect}\n * callbacks run either way. Without the events, mounting or removing a large tree skips one\n * event dispatch per node, which otherwise dominates the observer's cost.\n */\n readonly events?: boolean\n}\n\n/**\n * Dispatches a 'connected' event on nodes attached to the dom, dispatches 'disconnected' when removed.\n * Allows nodes to observe connected changes without creating a memory leak.\n */\nexport function initializeConnectedObserver(\n options: ConnectedObserverOptions = {}\n): Unsubscribe {\n const events = options.events ?? true\n const observer = new MutationObserver((mutations) => {\n const removed = new Set<Node>()\n const added = new Set<Node>()\n\n // First pass: flatten removed and added nodes so we can detect nodes re-ordered.\n for (const mutation of mutations) {\n mutation.removedNodes.forEach((node) => removed.add(node))\n mutation.addedNodes.forEach((node) => added.add(node))\n }\n\n // Second pass: handle added/removed, skipping reorders\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (removed.has(node)) continue\n walkDomDepthFirst(node, (iNode) => {\n notify(iNode, 'connect')\n if (events) {\n iNode.dispatchEvent(\n new CustomEvent('connect', { bubbles: false })\n )\n }\n })\n }\n\n for (const node of mutation.removedNodes) {\n if (added.has(node)) continue\n walkDomDepthFirst(node, (iNode) => {\n notify(iNode, 'disconnect')\n if (events) {\n iNode.dispatchEvent(\n new CustomEvent('disconnect', { bubbles: false })\n )\n }\n })\n }\n }\n })\n\n observer.observe(document, { childList: true, subtree: true })\n\n return () => {\n observer.disconnect()\n }\n}\n\n/**\n * Invokes a callback when the given target is connected to the DOM.\n * If the callback returns a function, that function will be invoked when disconnected.\n *\n * @param target\n * @param callback\n */\nexport function onConnect<T extends Node>(\n target: T,\n callback: (node: T) => Maybe<Unsubscribe> | void\n): Unsubscribe {\n let sub: Maybe<Unsubscribe> | void = null\n let connected = false\n const onConnect = () => {\n if (connected) return\n connected = true\n sub = callback(target)\n }\n const onDisconnect = () => {\n connected = false\n sub?.()\n sub = null\n }\n const callbacks = callbacksOf(target)\n callbacks.connect.add(onConnect)\n callbacks.disconnect.add(onDisconnect)\n // Still listening for the events, for an observer from an older copy of this library.\n target.addEventListener('connect', onConnect)\n target.addEventListener('disconnect', onDisconnect)\n if (target.isConnected) onConnect()\n return () => {\n callbacks.connect.delete(onConnect)\n callbacks.disconnect.delete(onDisconnect)\n target.removeEventListener('connect', onConnect)\n target.removeEventListener('disconnect', onDisconnect)\n onDisconnect()\n }\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n BenchmarkRunResults,\n RunResultsComparison,\n} from '@amazon/vinyl-util/browserTestUtil'\nimport {\n compareResults,\n expectNothing,\n setTestTimeout,\n} from '@amazon/vinyl-util/browserTestUtil'\n\nexport function setupBenchmark(): void {\n setTestTimeout(180)\n afterEach(expectNothing)\n}\n\nconst comparisons: RunResultsComparison[] = []\n\n/**\n * Adds a benchmark comparison to be displayed at the end of the test.\n * @param comparison\n */\nexport function addComparison(comparison: RunResultsComparison) {\n comparisons.push(comparison)\n}\n\n/**\n * Adds a list of benchmark results to be compared with each other.\n * The results will be logged then for browser environments displayed at the end of the suite.\n *\n * @param name The comparison suite name.\n * @param results\n */\nexport function addBenchmarks(name: string, ...results: BenchmarkRunResults[]) {\n const comparison = compareResults(name, ...results)\n comparison.logToTable()\n comparisons.push(comparison)\n}\n\nif (typeof document !== 'undefined') {\n jasmine.getEnv().addReporter({\n jasmineDone: () => {\n console.log('Tests complete')\n const jasmineContainer = document.getElementsByClassName(\n 'jasmine_html-reporter'\n )[0]\n jasmineContainer.parentElement?.removeChild(jasmineContainer)\n const container = createEl('div', document.body)\n container.id = 'benchmarkResults'\n const sortedComparisons = [...comparisons].sort((a, b) =>\n a.name > b.name ? 1 : -1\n )\n for (const comparison of sortedComparisons) {\n toTableHtml(comparison, container)\n }\n },\n })\n}\n\nfunction toTableHtml(\n comparison: RunResultsComparison,\n parent?: HTMLElement\n): HTMLDivElement {\n const container = createEl('div', parent)\n container.className = 'benchmarkComparison'\n const title = createEl('h2', container)\n title.innerText = comparison.name\n const table = createEl('table', container)\n const head = createEl('thead', table)\n const headRow = createEl('tr', head)\n const name = createEl('th', headRow)\n name.innerText = 'Name'\n const median = createEl('th', headRow)\n median.innerText = 'Mean ops/s'\n const samples = createEl('th', headRow)\n samples.innerText = 'Samples'\n const compare = createEl('th', headRow)\n compare.innerText = '% Comparison'\n\n const body = createEl('tbody', table)\n comparison.results.forEach((result) => {\n const row = createEl('tr', body)\n createEl('th', row).innerText = result.name\n createEl('td', row).innerText = result.meanOpsStr\n createEl('td', row).innerText = result.totalSamples.toLocaleString()\n createEl('td', row).innerText = comparison.runComparisonToString(result)\n })\n return container\n}\n\nfunction createEl<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n parent?: HTMLElement,\n options?: ElementCreationOptions\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName, options)\n if (parent) parent.appendChild(element)\n return element\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Unsubscribe } from '@amazon/vinyl-util'\nimport type { BenchmarkRunResults } from '@amazon/vinyl-util/browserTestUtil'\nimport { benchmark } from '@amazon/vinyl-util/browserTestUtil'\nimport {\n initializeConnectedObserver,\n onConnect,\n walkDomDepthFirst,\n} from '@amazon/vinyl-tsx'\nimport { addBenchmarks, setupBenchmark } from '../setup'\n\ndescribe('connectedObserver', () => {\n setupBenchmark()\n\n const observers: Record<string, () => Unsubscribe> = {\n 'no observer': () => () => {},\n 'events on': () => initializeConnectedObserver(),\n 'events off': () => initializeConnectedObserver({ events: false }),\n }\n\n let connections = 0\n\n /**\n * A grid of cards, 7 nodes each. With listeners, a card and its title text (2 of 7 nodes)\n * observe their connection, the way jsx hooks and ActiveText do.\n */\n function createPage(cards: number, listeners: boolean): HTMLElement {\n const page = document.createElement('div')\n let row: HTMLElement = page\n for (let i = 0; i < cards; i++) {\n if (i % 10 === 0) row = append(page, 'div')\n const card = append(row, 'div')\n append(card, 'div')\n const meta = append(card, 'div')\n const title = document.createTextNode(`Title ${i}`)\n append(meta, 'span').appendChild(title)\n append(meta, 'span').appendChild(\n document.createTextNode(`Subtitle ${i}`)\n )\n if (listeners) {\n observe(card)\n observe(title)\n }\n }\n return page\n }\n\n function append(parent: Node, tagName: string): HTMLElement {\n return parent.appendChild(document.createElement(tagName))\n }\n\n function observe(node: Node) {\n onConnect(node, () => {\n connections++\n return () => connections--\n })\n }\n\n function countNodes(root: Node): number {\n let count = 0\n walkDomDepthFirst(root, () => count++)\n return count\n }\n\n /**\n * Mutation observer callbacks run in a microtask queued by the first mutation, so they have\n * run once the executor resumes from an await.\n */\n function flushMutations(): Promise<void> {\n return Promise.resolve()\n }\n\n async function compareObservers(\n name: string,\n executor: (container: HTMLElement) => Promise<void>\n ) {\n const results: BenchmarkRunResults[] = []\n for (const [observerName, initialize] of Object.entries(observers)) {\n const container = document.body.appendChild(\n document.createElement('div')\n )\n const unsubscribe = initialize()\n try {\n results.push(\n await benchmark(observerName, () => executor(container))\n )\n } finally {\n unsubscribe()\n container.remove()\n }\n }\n addBenchmarks(name, ...results)\n }\n\n ;[1000, 5000].forEach((size) => {\n const cards = Math.round(size / 7)\n\n describe(`${size} nodes`, () => {\n const page = createPage(cards, true)\n const nodes = countNodes(page)\n const label = `${nodes.toLocaleString()} nodes, ${Math.round(\n ((cards * 2) / nodes) * 100\n )}% with listeners`\n\n it('mount and unmount', async () => {\n await compareObservers(\n `mount and unmount ${label}`,\n async (container) => {\n container.appendChild(page)\n await flushMutations()\n page.remove()\n await flushMutations()\n }\n )\n })\n\n it('page swap', async () => {\n const pages = [page, createPage(cards, true)]\n let next = 0\n await compareObservers(\n `page swap ${label}`,\n async (container) => {\n if (container.firstChild) {\n container.replaceChild(\n pages[next],\n container.firstChild\n )\n } else {\n container.appendChild(pages[next])\n }\n next = 1 - next\n await flushMutations()\n }\n )\n })\n\n it('mount and unmount without listeners', async () => {\n const emptyPage = createPage(cards, false)\n await compareObservers(\n `mount and unmount ${nodes.toLocaleString()} nodes, no listeners`,\n async (container) => {\n container.appendChild(emptyPage)\n await flushMutations()\n emptyPage.remove()\n await flushMutations()\n }\n )\n })\n })\n })\n})\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//-------------------------------------------------------------------------\n// A Benchmarking utility for testing and comparing performance.\n//-------------------------------------------------------------------------\n\n/**\n * Gets the current high resolution timestamp, platform dependent.\n */\nlet now: () => number\nif (\n typeof window !== 'undefined' &&\n typeof window.performance !== 'undefined' &&\n typeof window.performance.now !== 'undefined'\n) {\n now = () => window.performance.now()\n} else if (\n typeof self !== 'undefined' &&\n typeof self.performance !== 'undefined' &&\n typeof self.performance.now !== 'undefined'\n) {\n now = () => self.performance.now()\n} else {\n now = () => Date.now()\n}\n\nexport interface BenchMarkOptions {\n /**\n * The amount of time to run the executor before beginning measurement (in seconds).\n */\n readonly warmupTime: number\n\n /**\n * When time has elapsed past this duration during a cycle (in seconds), there will be no\n * operations.\n * The cycle will end when `maxCycleDuration` has been reached.\n */\n readonly maxCycleDuration: number\n\n /**\n * The number of trials to run.\n */\n readonly cycles: number\n}\n\nexport interface CycleResults {\n /**\n * The number of seconds the cycle ran.\n */\n readonly duration: number\n\n /**\n * The number of completed executions.\n */\n readonly ops: number\n}\n\nexport class BenchmarkRunResults {\n readonly cycleResults: number[] = []\n\n private _totalSamples = 0\n get totalSamples(): number {\n return this._totalSamples\n }\n\n get cycleResultsNoOutliers(): number[] {\n const sD = this.standardDeviation\n const avg = average(this.cycleResults)\n return this.cycleResults.filter((e) => {\n const zScore = (avg - e) / sD\n return Math.abs(zScore) < 3\n })\n }\n\n /**\n * Returns the mean ops per second minus outliers of greater than 3 standard deviations.\n */\n get meanOpsPerSec(): number {\n return average(this.cycleResultsNoOutliers)\n }\n\n get standardDeviation(): number {\n return standardDeviation(this.cycleResults)\n }\n\n get variance(): number {\n return this.standardDeviation / this.meanOpsPerSec\n }\n\n /**\n * Returns the mean ops / s \u00B1 variance % as a string.\n */\n get meanOpsStr(): string {\n const mean = this.meanOpsPerSec.toLocaleString(undefined, {\n maximumSignificantDigits: 4,\n })\n const variance = this.variance.toLocaleString(undefined, {\n style: 'percent',\n })\n return `${mean} \u00B1${variance}`\n }\n\n constructor(readonly name: string) {}\n\n add(cycle: CycleResults) {\n const opsPerSecond = cycle.ops / cycle.duration\n let index = this.cycleResults.findIndex((value) => opsPerSecond < value)\n if (index < 0) index = this.cycleResults.length\n this.cycleResults.splice(index, 0, opsPerSecond)\n this._totalSamples += cycle.ops\n }\n\n toString(): string {\n if (!this.cycleResults.length) return 'No results'\n return `${this.name}: ${this.meanOpsStr} ops/sec`\n }\n}\n\nexport class RunResultsComparison {\n /**\n * Sorted by median ops/s from slowest to fastest.\n */\n readonly results: BenchmarkRunResults[]\n\n constructor(\n readonly name: string,\n results: BenchmarkRunResults[]\n ) {\n this.results = results.sort((a, b) => {\n return a.meanOpsPerSec - b.meanOpsPerSec\n })\n }\n\n logToTable(): void {\n const r = this.results.map((run) => {\n const variance = run.variance.toLocaleString(undefined, {\n style: 'percent',\n })\n const mean = run.meanOpsPerSec.toLocaleString(undefined, {\n maximumSignificantDigits: 4,\n })\n\n return {\n Name: run.name,\n Mean: `${mean} \u00B1${variance}`,\n Samples: run.totalSamples,\n Compare: this.runComparisonToString(run),\n }\n })\n // Use the names as the index.\n const table = r.reduce<any>((acc, { Name, ...x }) => {\n acc[Name] = x\n return acc\n }, {})\n console.log('\\n' + this.name)\n console.table(table)\n }\n\n runComparisonToString(run: BenchmarkRunResults): string {\n const baseline = this.results[0]?.meanOpsPerSec ?? 0\n const fasterPercent = run.meanOpsPerSec / baseline - 1\n return fasterPercent < 0.01\n ? '-'\n : fasterPercent.toLocaleString(undefined, {\n style: 'percent',\n }) + ' faster'\n }\n}\n\nexport function compareResults(\n name: string,\n ...results: BenchmarkRunResults[]\n): RunResultsComparison {\n return new RunResultsComparison(name, results)\n}\n\nconst defaultBenchmarkOptions: BenchMarkOptions = {\n warmupTime: 0.5,\n maxCycleDuration: 0.5,\n cycles: 9,\n} as const\n\nexport class Benchmark {\n private static semaphore: Promise<any> = nextFrame()\n\n private readonly options: BenchMarkOptions\n\n /**\n * Constructs a new Benchmark.\n *\n * @param name The name of the benchmark, to be used when logging.\n * @param executor The method to execute and measure. If this method returns a promise, the\n * promise will be awaited. The executor should either always return a promise, or never.\n * @param options Optional configuration for the benchmark.\n */\n constructor(\n readonly name: string,\n readonly executor: () => any,\n options?: Partial<BenchMarkOptions>\n ) {\n this.options = { ...defaultBenchmarkOptions, ...options }\n }\n\n async run(): Promise<BenchmarkRunResults> {\n const opts = this.options\n // Wait for any currently running work to complete.\n await Benchmark.semaphore\n\n const warmupTimeMs = opts.warmupTime * 1000\n const cycleStart = now()\n let isAsync = false\n do {\n const result = this.executor()\n // If the executor returns a promise, it is considered an async test and the benchmark\n // should await its result.\n isAsync = isAsync || (result && typeof result.then === 'function')\n if (isAsync) await result\n } while (now() - cycleStart < warmupTimeMs)\n const resultsPromise: Promise<BenchmarkRunResults> = (async () => {\n const results = new BenchmarkRunResults(this.name)\n for (let i = 0; i < opts.cycles; i++) {\n const cycleResults = await this.runCycle(isAsync)\n results.add(cycleResults)\n await nextFrame()\n }\n return results\n })()\n Benchmark.semaphore = resultsPromise\n return await resultsPromise\n }\n\n /**\n * Runs one cycle. A cycle will repeat the executor approximately `options.maxCycleDuration`\n * seconds.\n *\n * @param isAsync\n * @return Returns the duration (in seconds) and number of operations the cycle repeated.\n */\n private async runCycle(isAsync: boolean): Promise<CycleResults> {\n const cycleMs = this.options.maxCycleDuration * 1000\n let ops = 0\n const cycleStart = now()\n do {\n const result = this.executor()\n if (isAsync) await result\n ops++\n } while (now() - cycleStart < cycleMs)\n const duration = (now() - cycleStart) / 1000\n return {\n duration,\n ops,\n }\n }\n}\n\n/**\n * Creates and runs a benchmark, logging the result.\n *\n * @param name\n * @param executor\n * @param options\n */\nexport function benchmark(\n name: string,\n executor: () => any,\n options?: Partial<BenchMarkOptions>\n): Promise<BenchmarkRunResults> {\n const benchmark = new Benchmark(name, executor, options)\n return benchmark.run().then((results) => {\n console.log(results.toString())\n return results\n })\n}\n\n/**\n * To avoid killing the browser's frame.\n */\nfunction nextFrame(): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve)\n })\n}\n\n/**\n * Returns the standard deviation of the given values.\n *\n * @param values\n */\nfunction standardDeviation(values: readonly number[]): number {\n const avg = average(values)\n const squareDiffs = values.map((value) => {\n const diff = value - avg\n return diff * diff\n })\n const avgSquareDiff = average(squareDiffs)\n return Math.sqrt(avgSquareDiff)\n}\n\n/**\n * Returns the mean/average of the given values.\n *\n * @param values\n */\nfunction average(values: readonly number[]): number {\n const sum = values.reduce((acc, value) => acc + value, 0)\n return sum / values.length\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nlet nextTestTimeoutOverridden: boolean = false\n\n/**\n * Sets the timeout for the current describe block.\n *\n * @param timeout The test timeout, in seconds.\n */\nexport function setTestTimeout(timeout: number) {\n let originalTimeout: number | null = null\n beforeEach(() => {\n originalTimeout = jasmine.DEFAULT_TIMEOUT_INTERVAL\n if (!nextTestTimeoutOverridden)\n jasmine.DEFAULT_TIMEOUT_INTERVAL = timeout * 1000\n })\n\n afterEach(() => {\n if (originalTimeout) jasmine.DEFAULT_TIMEOUT_INTERVAL = originalTimeout\n if (nextTestTimeoutOverridden) nextTestTimeoutOverridden = false\n })\n}\n\n/**\n * Sets the timeout for the next test and only the next test,\n * overriding any value set subsequently to setTestTimeout.\n *\n * @param timeout The test timeout, in seconds.\n */\nexport function setNextTestTimeout(timeout: number) {\n nextTestTimeoutOverridden = true\n jasmine.DEFAULT_TIMEOUT_INTERVAL = timeout * 1000\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Some tests (such as benchmarks or type expectations) have no jasmine expectations.\n */\nexport function expectNothing() {\n expect(true).toBeTruthy()\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport createSpy = jasmine.createSpy\nimport Spy = jasmine.Spy\nimport SpyAnd = jasmine.SpyAnd\nimport Calls = jasmine.Calls\nimport MatchableArgs = jasmine.MatchableArgs\n\ntype Fun = (...args: any[]) => any\n\n/**\n * A SpyFactory creates spies by member access. The spies will be named based on the key,\n * and the type interface of the Spy will match the corresponding interface function.\n */\nexport interface SpyFactory<T> {\n <K extends FunctionKeys<T>>(\n key: K\n ): T[K] extends Fun ? Spy2<NoThisType<NonNullable<T[K]>>> : never\n}\n\n/**\n * Fixes Jasmine's Spy type.\n * Jasmine's Spy interface has a call signature instead of intersecting the original function type.\n * This causes parameterized types of the call signature to be dropped.\n */\nexport type Spy2<Fn extends Fun> = Fn & {\n and: SpyAnd<Fn>\n calls: Calls<Fn>\n withArgs(...args: MatchableArgs<Fn>): Spy<Fn>\n}\n\nexport type FunctionKeys<T> = {\n [P in keyof T]: T[P] extends Fun ? P : never\n}[keyof T]\n\n/**\n * Creates a new spy factory.\n *\n * @param createFake If provided, all spies will be created with the fake implementation createFake\n * returns for the given key.\n */\nexport function createSpyFactory<T>(\n createFake?: (key: FunctionKeys<T>) => Fun\n): SpyFactory<T> {\n return (key: FunctionKeys<T>) => {\n const spy = createSpy(String(key))\n if (createFake) spy.and.callFake(createFake(key))\n return spy as any\n }\n}\n\n/**\n * Creates a Spy.\n * This is an alias to jasmine.createSpy with fixed type parameters.\n * @param key\n */\nexport function createSpy2<Fn extends Fun | undefined>(\n key: keyof any\n): Spy2<NoThisType<NonNullable<Fn>>> {\n return createSpy(String(key)) as any\n}\n\n/**\n * Replaces `this` type with `any` in a method signature.\n */\nexport type NoThisType<Fn extends Fun> =\n ReturnType<Fn> extends ThisType<any>\n ? Fn & ((...args: Parameters<Fn>) => any)\n : Fn\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/*\n * AUTO-GENERATED FILE - DO NOT EDIT\n * Generated by @amazon/vinyl-mock-generator\n */\n\n/* eslint-disable @typescript-eslint/prefer-as-const */\n/* eslint-disable @typescript-eslint/no-deprecated */\n\nimport { createSpy2 } from '../createSpyFactory'\n\nexport class MockAbortController implements AbortController {\n signal: AbortSignal = undefined as any\n\n abort = createSpy2<AbortController['abort']>('abort')\n}\n\nexport class MockAbortSignal implements AbortSignal {\n aborted: boolean = false\n onabort: ((this: AbortSignal, ev: Event) => any) | null = null\n reason: any = undefined\n\n throwIfAborted = createSpy2<AbortSignal['throwIfAborted']>('throwIfAborted')\n addEventListener =\n createSpy2<AbortSignal['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<AbortSignal['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<AbortSignal['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockAudioContext implements AudioContext {\n baseLatency: number = 0\n outputLatency: number = 0\n audioWorklet: AudioWorklet = undefined as any\n currentTime: number = 0\n destination: AudioDestinationNode = undefined as any\n listener: AudioListener = undefined as any\n onstatechange: ((this: BaseAudioContext, ev: Event) => any) | null = null\n sampleRate: number = 0\n state: AudioContextState = 'closed'\n\n close = createSpy2<AudioContext['close']>('close')\n createMediaElementSource = createSpy2<\n AudioContext['createMediaElementSource']\n >('createMediaElementSource')\n createMediaStreamDestination = createSpy2<\n AudioContext['createMediaStreamDestination']\n >('createMediaStreamDestination')\n createMediaStreamSource = createSpy2<\n AudioContext['createMediaStreamSource']\n >('createMediaStreamSource')\n getOutputTimestamp =\n createSpy2<AudioContext['getOutputTimestamp']>('getOutputTimestamp')\n resume = createSpy2<AudioContext['resume']>('resume')\n suspend = createSpy2<AudioContext['suspend']>('suspend')\n addEventListener =\n createSpy2<AudioContext['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<AudioContext['removeEventListener']>(\n 'removeEventListener'\n )\n createAnalyser =\n createSpy2<AudioContext['createAnalyser']>('createAnalyser')\n createBiquadFilter =\n createSpy2<AudioContext['createBiquadFilter']>('createBiquadFilter')\n createBuffer = createSpy2<AudioContext['createBuffer']>('createBuffer')\n createBufferSource =\n createSpy2<AudioContext['createBufferSource']>('createBufferSource')\n createChannelMerger = createSpy2<AudioContext['createChannelMerger']>(\n 'createChannelMerger'\n )\n createChannelSplitter = createSpy2<AudioContext['createChannelSplitter']>(\n 'createChannelSplitter'\n )\n createConstantSource = createSpy2<AudioContext['createConstantSource']>(\n 'createConstantSource'\n )\n createConvolver =\n createSpy2<AudioContext['createConvolver']>('createConvolver')\n createDelay = createSpy2<AudioContext['createDelay']>('createDelay')\n createDynamicsCompressor = createSpy2<\n AudioContext['createDynamicsCompressor']\n >('createDynamicsCompressor')\n createGain = createSpy2<AudioContext['createGain']>('createGain')\n createIIRFilter =\n createSpy2<AudioContext['createIIRFilter']>('createIIRFilter')\n createOscillator =\n createSpy2<AudioContext['createOscillator']>('createOscillator')\n createPanner = createSpy2<AudioContext['createPanner']>('createPanner')\n createPeriodicWave =\n createSpy2<AudioContext['createPeriodicWave']>('createPeriodicWave')\n createScriptProcessor = createSpy2<AudioContext['createScriptProcessor']>(\n 'createScriptProcessor'\n )\n createStereoPanner =\n createSpy2<AudioContext['createStereoPanner']>('createStereoPanner')\n createWaveShaper =\n createSpy2<AudioContext['createWaveShaper']>('createWaveShaper')\n decodeAudioData =\n createSpy2<AudioContext['decodeAudioData']>('decodeAudioData')\n dispatchEvent = createSpy2<AudioContext['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockCache implements Cache {\n add = createSpy2<Cache['add']>('add')\n addAll = createSpy2<Cache['addAll']>('addAll')\n delete = createSpy2<Cache['delete']>('delete')\n keys = createSpy2<Cache['keys']>('keys')\n match = createSpy2<Cache['match']>('match')\n matchAll = createSpy2<Cache['matchAll']>('matchAll')\n put = createSpy2<Cache['put']>('put')\n}\n\nexport class MockCacheStorage implements CacheStorage {\n delete = createSpy2<CacheStorage['delete']>('delete')\n has = createSpy2<CacheStorage['has']>('has')\n keys = createSpy2<CacheStorage['keys']>('keys')\n match = createSpy2<CacheStorage['match']>('match')\n open = createSpy2<CacheStorage['open']>('open')\n}\n\nexport class MockCustomEvent<T = any> implements CustomEvent<T> {\n detail: T = undefined as any\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n initCustomEvent =\n createSpy2<CustomEvent<T>['initCustomEvent']>('initCustomEvent')\n composedPath = createSpy2<CustomEvent<T>['composedPath']>('composedPath')\n initEvent = createSpy2<CustomEvent<T>['initEvent']>('initEvent')\n preventDefault =\n createSpy2<CustomEvent<T>['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n CustomEvent<T>['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<CustomEvent<T>['stopPropagation']>('stopPropagation')\n}\n\nexport class MockDocument implements Document {\n URL: string = ''\n alinkColor: string = ''\n all: HTMLAllCollection = undefined as any\n anchors: HTMLCollectionOf<HTMLAnchorElement> = undefined as any\n applets: HTMLCollection = undefined as any\n bgColor: string = ''\n body: HTMLElement = undefined as any\n characterSet: string = ''\n charset: string = ''\n compatMode: string = ''\n contentType: string = ''\n cookie: string = ''\n currentScript: HTMLOrSVGScriptElement | null = undefined as any\n defaultView: (WindowProxy & typeof globalThis) | null = undefined as any\n designMode: string = ''\n dir: string = ''\n doctype: DocumentType | null = null\n documentElement: HTMLElement = undefined as any\n documentURI: string = ''\n domain: string = ''\n embeds: HTMLCollectionOf<HTMLEmbedElement> = undefined as any\n fgColor: string = ''\n forms: HTMLCollectionOf<HTMLFormElement> = undefined as any\n fragmentDirective: FragmentDirective = undefined as any\n fullscreen: boolean = false\n fullscreenEnabled: boolean = false\n head: HTMLHeadElement = undefined as any\n hidden: boolean = false\n images: HTMLCollectionOf<HTMLImageElement> = undefined as any\n implementation: DOMImplementation = undefined as any\n inputEncoding: string = ''\n lastModified: string = ''\n linkColor: string = ''\n links: HTMLCollectionOf<HTMLAnchorElement | HTMLAreaElement> =\n undefined as any\n onfullscreenchange: ((this: Document, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Document, ev: Event) => any) | null = null\n onpointerlockchange: ((this: Document, ev: Event) => any) | null = null\n onpointerlockerror: ((this: Document, ev: Event) => any) | null = null\n onreadystatechange: ((this: Document, ev: Event) => any) | null = null\n onvisibilitychange: ((this: Document, ev: Event) => any) | null = null\n ownerDocument: null = null\n pictureInPictureEnabled: boolean = false\n plugins: HTMLCollectionOf<HTMLEmbedElement> = undefined as any\n readyState: DocumentReadyState = 'complete'\n referrer: string = ''\n rootElement: SVGSVGElement | null = null\n scripts: HTMLCollectionOf<HTMLScriptElement> = undefined as any\n scrollingElement: Element | null = null\n timeline: DocumentTimeline = undefined as any\n title: string = ''\n visibilityState: DocumentVisibilityState = 'hidden'\n vlinkColor: string = ''\n location: any = undefined\n textContent: null = null\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n activeElement: Element | null = null\n adoptedStyleSheets: CSSStyleSheet[] = []\n fullscreenElement: Element | null = null\n pictureInPictureElement: Element | null = null\n pointerLockElement: Element | null = null\n styleSheets: StyleSheetList = undefined as any\n fonts: FontFaceSet = undefined as any\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n\n adoptNode = createSpy2<Document['adoptNode']>('adoptNode')\n captureEvents = createSpy2<Document['captureEvents']>('captureEvents')\n caretPositionFromPoint = createSpy2<Document['caretPositionFromPoint']>(\n 'caretPositionFromPoint'\n )\n caretRangeFromPoint = createSpy2<Document['caretRangeFromPoint']>(\n 'caretRangeFromPoint'\n )\n clear = createSpy2<Document['clear']>('clear')\n close = createSpy2<Document['close']>('close')\n createAttribute = createSpy2<Document['createAttribute']>('createAttribute')\n createAttributeNS =\n createSpy2<Document['createAttributeNS']>('createAttributeNS')\n createCDATASection =\n createSpy2<Document['createCDATASection']>('createCDATASection')\n createComment = createSpy2<Document['createComment']>('createComment')\n createDocumentFragment = createSpy2<Document['createDocumentFragment']>(\n 'createDocumentFragment'\n )\n createElement = createSpy2<Document['createElement']>('createElement')\n createElementNS = createSpy2<Document['createElementNS']>('createElementNS')\n createEvent = createSpy2<Document['createEvent']>('createEvent')\n createNodeIterator =\n createSpy2<Document['createNodeIterator']>('createNodeIterator')\n createProcessingInstruction = createSpy2<\n Document['createProcessingInstruction']\n >('createProcessingInstruction')\n createRange = createSpy2<Document['createRange']>('createRange')\n createTextNode = createSpy2<Document['createTextNode']>('createTextNode')\n createTreeWalker =\n createSpy2<Document['createTreeWalker']>('createTreeWalker')\n execCommand = createSpy2<Document['execCommand']>('execCommand')\n exitFullscreen = createSpy2<Document['exitFullscreen']>('exitFullscreen')\n exitPictureInPicture = createSpy2<Document['exitPictureInPicture']>(\n 'exitPictureInPicture'\n )\n exitPointerLock = createSpy2<Document['exitPointerLock']>('exitPointerLock')\n getElementById = createSpy2<Document['getElementById']>('getElementById')\n getElementsByClassName = createSpy2<Document['getElementsByClassName']>(\n 'getElementsByClassName'\n )\n getElementsByName =\n createSpy2<Document['getElementsByName']>('getElementsByName')\n getElementsByTagName = createSpy2<Document['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<Document['getElementsByTagNameNS']>(\n 'getElementsByTagNameNS'\n )\n getSelection = createSpy2<Document['getSelection']>('getSelection')\n hasFocus = createSpy2<Document['hasFocus']>('hasFocus')\n hasStorageAccess =\n createSpy2<Document['hasStorageAccess']>('hasStorageAccess')\n importNode = createSpy2<Document['importNode']>('importNode')\n open = createSpy2<Document['open']>('open')\n queryCommandEnabled = createSpy2<Document['queryCommandEnabled']>(\n 'queryCommandEnabled'\n )\n queryCommandIndeterm = createSpy2<Document['queryCommandIndeterm']>(\n 'queryCommandIndeterm'\n )\n queryCommandState =\n createSpy2<Document['queryCommandState']>('queryCommandState')\n queryCommandSupported = createSpy2<Document['queryCommandSupported']>(\n 'queryCommandSupported'\n )\n queryCommandValue =\n createSpy2<Document['queryCommandValue']>('queryCommandValue')\n releaseEvents = createSpy2<Document['releaseEvents']>('releaseEvents')\n requestStorageAccess = createSpy2<Document['requestStorageAccess']>(\n 'requestStorageAccess'\n )\n startViewTransition = createSpy2<Document['startViewTransition']>(\n 'startViewTransition'\n )\n write = createSpy2<Document['write']>('write')\n writeln = createSpy2<Document['writeln']>('writeln')\n addEventListener =\n createSpy2<Document['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<Document['removeEventListener']>(\n 'removeEventListener'\n )\n appendChild = createSpy2<Document['appendChild']>('appendChild')\n cloneNode = createSpy2<Document['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<Document['compareDocumentPosition']>(\n 'compareDocumentPosition'\n )\n contains = createSpy2<Document['contains']>('contains')\n getRootNode = createSpy2<Document['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<Document['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<Document['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<Document['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<Document['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<Document['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<Document['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<Document['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<Document['normalize']>('normalize')\n removeChild = createSpy2<Document['removeChild']>('removeChild')\n replaceChild = createSpy2<Document['replaceChild']>('replaceChild')\n elementFromPoint =\n createSpy2<Document['elementFromPoint']>('elementFromPoint')\n elementsFromPoint =\n createSpy2<Document['elementsFromPoint']>('elementsFromPoint')\n getAnimations = createSpy2<Document['getAnimations']>('getAnimations')\n append = createSpy2<Document['append']>('append')\n prepend = createSpy2<Document['prepend']>('prepend')\n querySelector = createSpy2<Document['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<Document['querySelectorAll']>('querySelectorAll')\n replaceChildren = createSpy2<Document['replaceChildren']>('replaceChildren')\n createExpression =\n createSpy2<Document['createExpression']>('createExpression')\n createNSResolver =\n createSpy2<Document['createNSResolver']>('createNSResolver')\n evaluate = createSpy2<Document['evaluate']>('evaluate')\n dispatchEvent = createSpy2<Document['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockErrorEvent implements ErrorEvent {\n colno: number = 0\n error: any = undefined\n filename: string = ''\n lineno: number = 0\n message: string = ''\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath = createSpy2<ErrorEvent['composedPath']>('composedPath')\n initEvent = createSpy2<ErrorEvent['initEvent']>('initEvent')\n preventDefault = createSpy2<ErrorEvent['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n ErrorEvent['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<ErrorEvent['stopPropagation']>('stopPropagation')\n}\n\nexport class MockEvent implements Event {\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath = createSpy2<Event['composedPath']>('composedPath')\n initEvent = createSpy2<Event['initEvent']>('initEvent')\n preventDefault = createSpy2<Event['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<Event['stopImmediatePropagation']>(\n 'stopImmediatePropagation'\n )\n stopPropagation = createSpy2<Event['stopPropagation']>('stopPropagation')\n}\n\nexport class MockEventTarget implements EventTarget {\n addEventListener =\n createSpy2<EventTarget['addEventListener']>('addEventListener')\n dispatchEvent = createSpy2<EventTarget['dispatchEvent']>('dispatchEvent')\n removeEventListener = createSpy2<EventTarget['removeEventListener']>(\n 'removeEventListener'\n )\n}\n\nexport class MockHTMLAudioElement implements HTMLAudioElement {\n autoplay: boolean = false\n buffered: TimeRanges = undefined as any\n controls: boolean = false\n crossOrigin: string | null = ''\n currentSrc: string = ''\n currentTime: number = 0\n defaultMuted: boolean = false\n defaultPlaybackRate: number = 0\n disableRemotePlayback: boolean = false\n duration: number = 0\n ended: boolean = false\n error: MediaError | null = null\n loop: boolean = false\n mediaKeys: MediaKeys | null = null\n muted: boolean = false\n networkState: number = 0\n onencrypted:\n ((this: HTMLMediaElement, ev: MediaEncryptedEvent) => any) | null = null\n onwaitingforkey: ((this: HTMLMediaElement, ev: Event) => any) | null = null\n paused: boolean = false\n playbackRate: number = 0\n played: TimeRanges = undefined as any\n preload: 'none' | 'metadata' | 'auto' | '' = 'none'\n preservesPitch: boolean = false\n readyState: number = 0\n remote: RemotePlayback = undefined as any\n seekable: TimeRanges = undefined as any\n seeking: boolean = false\n sinkId: string = ''\n src: string = ''\n srcObject: MediaProvider | null = undefined as any\n textTracks: TextTrackList = undefined as any\n volume: number = 0\n NETWORK_EMPTY: 0 = 0\n NETWORK_IDLE: 1 = 1\n NETWORK_LOADING: 2 = 2\n NETWORK_NO_SOURCE: 3 = 3\n HAVE_NOTHING: 0 = 0\n HAVE_METADATA: 1 = 1\n HAVE_CURRENT_DATA: 2 = 2\n HAVE_FUTURE_DATA: 3 = 3\n HAVE_ENOUGH_DATA: 4 = 4\n accessKey: string = ''\n accessKeyLabel: string = ''\n autocapitalize: string = ''\n autocorrect: boolean = false\n dir: string = ''\n draggable: boolean = false\n hidden: boolean = false\n inert: boolean = false\n innerText: string = ''\n lang: string = ''\n offsetHeight: number = 0\n offsetLeft: number = 0\n offsetParent: Element | null = null\n offsetTop: number = 0\n offsetWidth: number = 0\n outerText: string = ''\n popover: string | null = ''\n spellcheck: boolean = false\n title: string = ''\n translate: boolean = false\n writingSuggestions: string = ''\n attributes: NamedNodeMap = undefined as any\n className: string = ''\n clientHeight: number = 0\n clientLeft: number = 0\n clientTop: number = 0\n clientWidth: number = 0\n currentCSSZoom: number = 0\n id: string = ''\n innerHTML: string = ''\n localName: string = ''\n namespaceURI: string | null = ''\n onfullscreenchange: ((this: Element, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Element, ev: Event) => any) | null = null\n outerHTML: string = ''\n ownerDocument: Document = undefined as any\n prefix: string | null = ''\n scrollHeight: number = 0\n scrollLeft: number = 0\n scrollTop: number = 0\n scrollWidth: number = 0\n shadowRoot: ShadowRoot | null = null\n slot: string = ''\n tagName: string = ''\n classList: any = undefined\n part: any = undefined\n textContent: any = undefined\n attributeStyleMap: StylePropertyMap = undefined as any\n style: any = undefined\n contentEditable: string = ''\n enterKeyHint: string = ''\n inputMode: string = ''\n isContentEditable: boolean = false\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n autofocus: boolean = false\n dataset: DOMStringMap = undefined as any\n tabIndex: number = 0\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n ariaActiveDescendantElement: Element | null = null\n ariaAtomic: string | null = ''\n ariaAutoComplete: string | null = ''\n ariaBrailleLabel: string | null = ''\n ariaBrailleRoleDescription: string | null = ''\n ariaBusy: string | null = ''\n ariaChecked: string | null = ''\n ariaColCount: string | null = ''\n ariaColIndex: string | null = ''\n ariaColIndexText: string | null = ''\n ariaColSpan: string | null = ''\n ariaControlsElements: ReadonlyArray<Element> | null = null\n ariaCurrent: string | null = ''\n ariaDescribedByElements: ReadonlyArray<Element> | null = null\n ariaDescription: string | null = ''\n ariaDetailsElements: ReadonlyArray<Element> | null = null\n ariaDisabled: string | null = ''\n ariaErrorMessageElements: ReadonlyArray<Element> | null = null\n ariaExpanded: string | null = ''\n ariaFlowToElements: ReadonlyArray<Element> | null = null\n ariaHasPopup: string | null = ''\n ariaHidden: string | null = ''\n ariaInvalid: string | null = ''\n ariaKeyShortcuts: string | null = ''\n ariaLabel: string | null = ''\n ariaLabelledByElements: ReadonlyArray<Element> | null = null\n ariaLevel: string | null = ''\n ariaLive: string | null = ''\n ariaModal: string | null = ''\n ariaMultiLine: string | null = ''\n ariaMultiSelectable: string | null = ''\n ariaOrientation: string | null = ''\n ariaOwnsElements: ReadonlyArray<Element> | null = null\n ariaPlaceholder: string | null = ''\n ariaPosInSet: string | null = ''\n ariaPressed: string | null = ''\n ariaReadOnly: string | null = ''\n ariaRelevant: string | null = ''\n ariaRequired: string | null = ''\n ariaRoleDescription: string | null = ''\n ariaRowCount: string | null = ''\n ariaRowIndex: string | null = ''\n ariaRowIndexText: string | null = ''\n ariaRowSpan: string | null = ''\n ariaSelected: string | null = ''\n ariaSetSize: string | null = ''\n ariaSort: string | null = ''\n ariaValueMax: string | null = ''\n ariaValueMin: string | null = ''\n ariaValueNow: string | null = ''\n ariaValueText: string | null = ''\n role: string | null = ''\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n assignedSlot: HTMLSlotElement | null = null\n\n addEventListener =\n createSpy2<HTMLAudioElement['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<HTMLAudioElement['removeEventListener']>(\n 'removeEventListener'\n )\n addTextTrack = createSpy2<HTMLAudioElement['addTextTrack']>('addTextTrack')\n canPlayType = createSpy2<HTMLAudioElement['canPlayType']>('canPlayType')\n fastSeek = createSpy2<HTMLAudioElement['fastSeek']>('fastSeek')\n load = createSpy2<HTMLAudioElement['load']>('load')\n pause = createSpy2<HTMLAudioElement['pause']>('pause')\n play = createSpy2<HTMLAudioElement['play']>('play')\n setMediaKeys = createSpy2<HTMLAudioElement['setMediaKeys']>('setMediaKeys')\n setSinkId = createSpy2<HTMLAudioElement['setSinkId']>('setSinkId')\n attachInternals =\n createSpy2<HTMLAudioElement['attachInternals']>('attachInternals')\n click = createSpy2<HTMLAudioElement['click']>('click')\n hidePopover = createSpy2<HTMLAudioElement['hidePopover']>('hidePopover')\n showPopover = createSpy2<HTMLAudioElement['showPopover']>('showPopover')\n togglePopover =\n createSpy2<HTMLAudioElement['togglePopover']>('togglePopover')\n attachShadow = createSpy2<HTMLAudioElement['attachShadow']>('attachShadow')\n checkVisibility =\n createSpy2<HTMLAudioElement['checkVisibility']>('checkVisibility')\n closest = createSpy2<HTMLAudioElement['closest']>('closest')\n computedStyleMap =\n createSpy2<HTMLAudioElement['computedStyleMap']>('computedStyleMap')\n getAttribute = createSpy2<HTMLAudioElement['getAttribute']>('getAttribute')\n getAttributeNS =\n createSpy2<HTMLAudioElement['getAttributeNS']>('getAttributeNS')\n getAttributeNames =\n createSpy2<HTMLAudioElement['getAttributeNames']>('getAttributeNames')\n getAttributeNode =\n createSpy2<HTMLAudioElement['getAttributeNode']>('getAttributeNode')\n getAttributeNodeNS =\n createSpy2<HTMLAudioElement['getAttributeNodeNS']>('getAttributeNodeNS')\n getBoundingClientRect = createSpy2<\n HTMLAudioElement['getBoundingClientRect']\n >('getBoundingClientRect')\n getClientRects =\n createSpy2<HTMLAudioElement['getClientRects']>('getClientRects')\n getElementsByClassName = createSpy2<\n HTMLAudioElement['getElementsByClassName']\n >('getElementsByClassName')\n getElementsByTagName = createSpy2<HTMLAudioElement['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<\n HTMLAudioElement['getElementsByTagNameNS']\n >('getElementsByTagNameNS')\n getHTML = createSpy2<HTMLAudioElement['getHTML']>('getHTML')\n hasAttribute = createSpy2<HTMLAudioElement['hasAttribute']>('hasAttribute')\n hasAttributeNS =\n createSpy2<HTMLAudioElement['hasAttributeNS']>('hasAttributeNS')\n hasAttributes =\n createSpy2<HTMLAudioElement['hasAttributes']>('hasAttributes')\n hasPointerCapture =\n createSpy2<HTMLAudioElement['hasPointerCapture']>('hasPointerCapture')\n insertAdjacentElement = createSpy2<\n HTMLAudioElement['insertAdjacentElement']\n >('insertAdjacentElement')\n insertAdjacentHTML =\n createSpy2<HTMLAudioElement['insertAdjacentHTML']>('insertAdjacentHTML')\n insertAdjacentText =\n createSpy2<HTMLAudioElement['insertAdjacentText']>('insertAdjacentText')\n matches = createSpy2<HTMLAudioElement['matches']>('matches')\n releasePointerCapture = createSpy2<\n HTMLAudioElement['releasePointerCapture']\n >('releasePointerCapture')\n removeAttribute =\n createSpy2<HTMLAudioElement['removeAttribute']>('removeAttribute')\n removeAttributeNS =\n createSpy2<HTMLAudioElement['removeAttributeNS']>('removeAttributeNS')\n removeAttributeNode = createSpy2<HTMLAudioElement['removeAttributeNode']>(\n 'removeAttributeNode'\n )\n requestFullscreen =\n createSpy2<HTMLAudioElement['requestFullscreen']>('requestFullscreen')\n requestPointerLock =\n createSpy2<HTMLAudioElement['requestPointerLock']>('requestPointerLock')\n scroll = createSpy2<HTMLAudioElement['scroll']>('scroll')\n scrollBy = createSpy2<HTMLAudioElement['scrollBy']>('scrollBy')\n scrollIntoView =\n createSpy2<HTMLAudioElement['scrollIntoView']>('scrollIntoView')\n scrollTo = createSpy2<HTMLAudioElement['scrollTo']>('scrollTo')\n setAttribute = createSpy2<HTMLAudioElement['setAttribute']>('setAttribute')\n setAttributeNS =\n createSpy2<HTMLAudioElement['setAttributeNS']>('setAttributeNS')\n setAttributeNode =\n createSpy2<HTMLAudioElement['setAttributeNode']>('setAttributeNode')\n setAttributeNodeNS =\n createSpy2<HTMLAudioElement['setAttributeNodeNS']>('setAttributeNodeNS')\n setHTMLUnsafe =\n createSpy2<HTMLAudioElement['setHTMLUnsafe']>('setHTMLUnsafe')\n setPointerCapture =\n createSpy2<HTMLAudioElement['setPointerCapture']>('setPointerCapture')\n toggleAttribute =\n createSpy2<HTMLAudioElement['toggleAttribute']>('toggleAttribute')\n webkitMatchesSelector = createSpy2<\n HTMLAudioElement['webkitMatchesSelector']\n >('webkitMatchesSelector')\n blur = createSpy2<HTMLAudioElement['blur']>('blur')\n focus = createSpy2<HTMLAudioElement['focus']>('focus')\n appendChild = createSpy2<HTMLAudioElement['appendChild']>('appendChild')\n cloneNode = createSpy2<HTMLAudioElement['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<\n HTMLAudioElement['compareDocumentPosition']\n >('compareDocumentPosition')\n contains = createSpy2<HTMLAudioElement['contains']>('contains')\n getRootNode = createSpy2<HTMLAudioElement['getRootNode']>('getRootNode')\n hasChildNodes =\n createSpy2<HTMLAudioElement['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<HTMLAudioElement['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<HTMLAudioElement['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<HTMLAudioElement['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<HTMLAudioElement['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<HTMLAudioElement['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<HTMLAudioElement['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<HTMLAudioElement['normalize']>('normalize')\n removeChild = createSpy2<HTMLAudioElement['removeChild']>('removeChild')\n replaceChild = createSpy2<HTMLAudioElement['replaceChild']>('replaceChild')\n animate = createSpy2<HTMLAudioElement['animate']>('animate')\n getAnimations =\n createSpy2<HTMLAudioElement['getAnimations']>('getAnimations')\n after = createSpy2<HTMLAudioElement['after']>('after')\n before = createSpy2<HTMLAudioElement['before']>('before')\n remove = createSpy2<HTMLAudioElement['remove']>('remove')\n replaceWith = createSpy2<HTMLAudioElement['replaceWith']>('replaceWith')\n append = createSpy2<HTMLAudioElement['append']>('append')\n prepend = createSpy2<HTMLAudioElement['prepend']>('prepend')\n querySelector =\n createSpy2<HTMLAudioElement['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<HTMLAudioElement['querySelectorAll']>('querySelectorAll')\n replaceChildren =\n createSpy2<HTMLAudioElement['replaceChildren']>('replaceChildren')\n dispatchEvent =\n createSpy2<HTMLAudioElement['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockHTMLDivElement implements HTMLDivElement {\n align: string = ''\n accessKey: string = ''\n accessKeyLabel: string = ''\n autocapitalize: string = ''\n autocorrect: boolean = false\n dir: string = ''\n draggable: boolean = false\n hidden: boolean = false\n inert: boolean = false\n innerText: string = ''\n lang: string = ''\n offsetHeight: number = 0\n offsetLeft: number = 0\n offsetParent: Element | null = null\n offsetTop: number = 0\n offsetWidth: number = 0\n outerText: string = ''\n popover: string | null = ''\n spellcheck: boolean = false\n title: string = ''\n translate: boolean = false\n writingSuggestions: string = ''\n attributes: NamedNodeMap = undefined as any\n className: string = ''\n clientHeight: number = 0\n clientLeft: number = 0\n clientTop: number = 0\n clientWidth: number = 0\n currentCSSZoom: number = 0\n id: string = ''\n innerHTML: string = ''\n localName: string = ''\n namespaceURI: string | null = ''\n onfullscreenchange: ((this: Element, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Element, ev: Event) => any) | null = null\n outerHTML: string = ''\n ownerDocument: Document = undefined as any\n prefix: string | null = ''\n scrollHeight: number = 0\n scrollLeft: number = 0\n scrollTop: number = 0\n scrollWidth: number = 0\n shadowRoot: ShadowRoot | null = null\n slot: string = ''\n tagName: string = ''\n classList: any = undefined\n part: any = undefined\n textContent: any = undefined\n attributeStyleMap: StylePropertyMap = undefined as any\n style: any = undefined\n contentEditable: string = ''\n enterKeyHint: string = ''\n inputMode: string = ''\n isContentEditable: boolean = false\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n autofocus: boolean = false\n dataset: DOMStringMap = undefined as any\n tabIndex: number = 0\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n ariaActiveDescendantElement: Element | null = null\n ariaAtomic: string | null = ''\n ariaAutoComplete: string | null = ''\n ariaBrailleLabel: string | null = ''\n ariaBrailleRoleDescription: string | null = ''\n ariaBusy: string | null = ''\n ariaChecked: string | null = ''\n ariaColCount: string | null = ''\n ariaColIndex: string | null = ''\n ariaColIndexText: string | null = ''\n ariaColSpan: string | null = ''\n ariaControlsElements: ReadonlyArray<Element> | null = null\n ariaCurrent: string | null = ''\n ariaDescribedByElements: ReadonlyArray<Element> | null = null\n ariaDescription: string | null = ''\n ariaDetailsElements: ReadonlyArray<Element> | null = null\n ariaDisabled: string | null = ''\n ariaErrorMessageElements: ReadonlyArray<Element> | null = null\n ariaExpanded: string | null = ''\n ariaFlowToElements: ReadonlyArray<Element> | null = null\n ariaHasPopup: string | null = ''\n ariaHidden: string | null = ''\n ariaInvalid: string | null = ''\n ariaKeyShortcuts: string | null = ''\n ariaLabel: string | null = ''\n ariaLabelledByElements: ReadonlyArray<Element> | null = null\n ariaLevel: string | null = ''\n ariaLive: string | null = ''\n ariaModal: string | null = ''\n ariaMultiLine: string | null = ''\n ariaMultiSelectable: string | null = ''\n ariaOrientation: string | null = ''\n ariaOwnsElements: ReadonlyArray<Element> | null = null\n ariaPlaceholder: string | null = ''\n ariaPosInSet: string | null = ''\n ariaPressed: string | null = ''\n ariaReadOnly: string | null = ''\n ariaRelevant: string | null = ''\n ariaRequired: string | null = ''\n ariaRoleDescription: string | null = ''\n ariaRowCount: string | null = ''\n ariaRowIndex: string | null = ''\n ariaRowIndexText: string | null = ''\n ariaRowSpan: string | null = ''\n ariaSelected: string | null = ''\n ariaSetSize: string | null = ''\n ariaSort: string | null = ''\n ariaValueMax: string | null = ''\n ariaValueMin: string | null = ''\n ariaValueNow: string | null = ''\n ariaValueText: string | null = ''\n role: string | null = ''\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n assignedSlot: HTMLSlotElement | null = null\n\n addEventListener =\n createSpy2<HTMLDivElement['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<HTMLDivElement['removeEventListener']>(\n 'removeEventListener'\n )\n attachInternals =\n createSpy2<HTMLDivElement['attachInternals']>('attachInternals')\n click = createSpy2<HTMLDivElement['click']>('click')\n hidePopover = createSpy2<HTMLDivElement['hidePopover']>('hidePopover')\n showPopover = createSpy2<HTMLDivElement['showPopover']>('showPopover')\n togglePopover = createSpy2<HTMLDivElement['togglePopover']>('togglePopover')\n attachShadow = createSpy2<HTMLDivElement['attachShadow']>('attachShadow')\n checkVisibility =\n createSpy2<HTMLDivElement['checkVisibility']>('checkVisibility')\n closest = createSpy2<HTMLDivElement['closest']>('closest')\n computedStyleMap =\n createSpy2<HTMLDivElement['computedStyleMap']>('computedStyleMap')\n getAttribute = createSpy2<HTMLDivElement['getAttribute']>('getAttribute')\n getAttributeNS =\n createSpy2<HTMLDivElement['getAttributeNS']>('getAttributeNS')\n getAttributeNames =\n createSpy2<HTMLDivElement['getAttributeNames']>('getAttributeNames')\n getAttributeNode =\n createSpy2<HTMLDivElement['getAttributeNode']>('getAttributeNode')\n getAttributeNodeNS =\n createSpy2<HTMLDivElement['getAttributeNodeNS']>('getAttributeNodeNS')\n getBoundingClientRect = createSpy2<HTMLDivElement['getBoundingClientRect']>(\n 'getBoundingClientRect'\n )\n getClientRects =\n createSpy2<HTMLDivElement['getClientRects']>('getClientRects')\n getElementsByClassName = createSpy2<\n HTMLDivElement['getElementsByClassName']\n >('getElementsByClassName')\n getElementsByTagName = createSpy2<HTMLDivElement['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<\n HTMLDivElement['getElementsByTagNameNS']\n >('getElementsByTagNameNS')\n getHTML = createSpy2<HTMLDivElement['getHTML']>('getHTML')\n hasAttribute = createSpy2<HTMLDivElement['hasAttribute']>('hasAttribute')\n hasAttributeNS =\n createSpy2<HTMLDivElement['hasAttributeNS']>('hasAttributeNS')\n hasAttributes = createSpy2<HTMLDivElement['hasAttributes']>('hasAttributes')\n hasPointerCapture =\n createSpy2<HTMLDivElement['hasPointerCapture']>('hasPointerCapture')\n insertAdjacentElement = createSpy2<HTMLDivElement['insertAdjacentElement']>(\n 'insertAdjacentElement'\n )\n insertAdjacentHTML =\n createSpy2<HTMLDivElement['insertAdjacentHTML']>('insertAdjacentHTML')\n insertAdjacentText =\n createSpy2<HTMLDivElement['insertAdjacentText']>('insertAdjacentText')\n matches = createSpy2<HTMLDivElement['matches']>('matches')\n releasePointerCapture = createSpy2<HTMLDivElement['releasePointerCapture']>(\n 'releasePointerCapture'\n )\n removeAttribute =\n createSpy2<HTMLDivElement['removeAttribute']>('removeAttribute')\n removeAttributeNS =\n createSpy2<HTMLDivElement['removeAttributeNS']>('removeAttributeNS')\n removeAttributeNode = createSpy2<HTMLDivElement['removeAttributeNode']>(\n 'removeAttributeNode'\n )\n requestFullscreen =\n createSpy2<HTMLDivElement['requestFullscreen']>('requestFullscreen')\n requestPointerLock =\n createSpy2<HTMLDivElement['requestPointerLock']>('requestPointerLock')\n scroll = createSpy2<HTMLDivElement['scroll']>('scroll')\n scrollBy = createSpy2<HTMLDivElement['scrollBy']>('scrollBy')\n scrollIntoView =\n createSpy2<HTMLDivElement['scrollIntoView']>('scrollIntoView')\n scrollTo = createSpy2<HTMLDivElement['scrollTo']>('scrollTo')\n setAttribute = createSpy2<HTMLDivElement['setAttribute']>('setAttribute')\n setAttributeNS =\n createSpy2<HTMLDivElement['setAttributeNS']>('setAttributeNS')\n setAttributeNode =\n createSpy2<HTMLDivElement['setAttributeNode']>('setAttributeNode')\n setAttributeNodeNS =\n createSpy2<HTMLDivElement['setAttributeNodeNS']>('setAttributeNodeNS')\n setHTMLUnsafe = createSpy2<HTMLDivElement['setHTMLUnsafe']>('setHTMLUnsafe')\n setPointerCapture =\n createSpy2<HTMLDivElement['setPointerCapture']>('setPointerCapture')\n toggleAttribute =\n createSpy2<HTMLDivElement['toggleAttribute']>('toggleAttribute')\n webkitMatchesSelector = createSpy2<HTMLDivElement['webkitMatchesSelector']>(\n 'webkitMatchesSelector'\n )\n blur = createSpy2<HTMLDivElement['blur']>('blur')\n focus = createSpy2<HTMLDivElement['focus']>('focus')\n appendChild = createSpy2<HTMLDivElement['appendChild']>('appendChild')\n cloneNode = createSpy2<HTMLDivElement['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<\n HTMLDivElement['compareDocumentPosition']\n >('compareDocumentPosition')\n contains = createSpy2<HTMLDivElement['contains']>('contains')\n getRootNode = createSpy2<HTMLDivElement['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<HTMLDivElement['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<HTMLDivElement['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<HTMLDivElement['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<HTMLDivElement['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<HTMLDivElement['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<HTMLDivElement['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<HTMLDivElement['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<HTMLDivElement['normalize']>('normalize')\n removeChild = createSpy2<HTMLDivElement['removeChild']>('removeChild')\n replaceChild = createSpy2<HTMLDivElement['replaceChild']>('replaceChild')\n animate = createSpy2<HTMLDivElement['animate']>('animate')\n getAnimations = createSpy2<HTMLDivElement['getAnimations']>('getAnimations')\n after = createSpy2<HTMLDivElement['after']>('after')\n before = createSpy2<HTMLDivElement['before']>('before')\n remove = createSpy2<HTMLDivElement['remove']>('remove')\n replaceWith = createSpy2<HTMLDivElement['replaceWith']>('replaceWith')\n append = createSpy2<HTMLDivElement['append']>('append')\n prepend = createSpy2<HTMLDivElement['prepend']>('prepend')\n querySelector = createSpy2<HTMLDivElement['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<HTMLDivElement['querySelectorAll']>('querySelectorAll')\n replaceChildren =\n createSpy2<HTMLDivElement['replaceChildren']>('replaceChildren')\n dispatchEvent = createSpy2<HTMLDivElement['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockHTMLMediaElement implements HTMLMediaElement {\n autoplay: boolean = false\n buffered: TimeRanges = undefined as any\n controls: boolean = false\n crossOrigin: string | null = ''\n currentSrc: string = ''\n currentTime: number = 0\n defaultMuted: boolean = false\n defaultPlaybackRate: number = 0\n disableRemotePlayback: boolean = false\n duration: number = 0\n ended: boolean = false\n error: MediaError | null = null\n loop: boolean = false\n mediaKeys: MediaKeys | null = null\n muted: boolean = false\n networkState: number = 0\n onencrypted:\n ((this: HTMLMediaElement, ev: MediaEncryptedEvent) => any) | null = null\n onwaitingforkey: ((this: HTMLMediaElement, ev: Event) => any) | null = null\n paused: boolean = false\n playbackRate: number = 0\n played: TimeRanges = undefined as any\n preload: 'none' | 'metadata' | 'auto' | '' = 'none'\n preservesPitch: boolean = false\n readyState: number = 0\n remote: RemotePlayback = undefined as any\n seekable: TimeRanges = undefined as any\n seeking: boolean = false\n sinkId: string = ''\n src: string = ''\n srcObject: MediaProvider | null = undefined as any\n textTracks: TextTrackList = undefined as any\n volume: number = 0\n NETWORK_EMPTY: 0 = 0\n NETWORK_IDLE: 1 = 1\n NETWORK_LOADING: 2 = 2\n NETWORK_NO_SOURCE: 3 = 3\n HAVE_NOTHING: 0 = 0\n HAVE_METADATA: 1 = 1\n HAVE_CURRENT_DATA: 2 = 2\n HAVE_FUTURE_DATA: 3 = 3\n HAVE_ENOUGH_DATA: 4 = 4\n accessKey: string = ''\n accessKeyLabel: string = ''\n autocapitalize: string = ''\n autocorrect: boolean = false\n dir: string = ''\n draggable: boolean = false\n hidden: boolean = false\n inert: boolean = false\n innerText: string = ''\n lang: string = ''\n offsetHeight: number = 0\n offsetLeft: number = 0\n offsetParent: Element | null = null\n offsetTop: number = 0\n offsetWidth: number = 0\n outerText: string = ''\n popover: string | null = ''\n spellcheck: boolean = false\n title: string = ''\n translate: boolean = false\n writingSuggestions: string = ''\n attributes: NamedNodeMap = undefined as any\n className: string = ''\n clientHeight: number = 0\n clientLeft: number = 0\n clientTop: number = 0\n clientWidth: number = 0\n currentCSSZoom: number = 0\n id: string = ''\n innerHTML: string = ''\n localName: string = ''\n namespaceURI: string | null = ''\n onfullscreenchange: ((this: Element, ev: Event) => any) | null = null\n onfullscreenerror: ((this: Element, ev: Event) => any) | null = null\n outerHTML: string = ''\n ownerDocument: Document = undefined as any\n prefix: string | null = ''\n scrollHeight: number = 0\n scrollLeft: number = 0\n scrollTop: number = 0\n scrollWidth: number = 0\n shadowRoot: ShadowRoot | null = null\n slot: string = ''\n tagName: string = ''\n classList: any = undefined\n part: any = undefined\n textContent: any = undefined\n attributeStyleMap: StylePropertyMap = undefined as any\n style: any = undefined\n contentEditable: string = ''\n enterKeyHint: string = ''\n inputMode: string = ''\n isContentEditable: boolean = false\n onabort: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onanimationcancel:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationend:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationiteration:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onanimationstart:\n ((this: GlobalEventHandlers, ev: AnimationEvent) => any) | null = null\n onauxclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onbeforeinput: ((this: GlobalEventHandlers, ev: InputEvent) => any) | null =\n null\n onbeforematch: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onbeforetoggle:\n ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null = null\n onblur: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n oncancel: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncanplaythrough: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onclick: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onclose: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextlost: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncontextmenu:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oncontextrestored: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n oncopy: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n oncuechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oncut: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n ondblclick: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n ondrag: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragend: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondragenter: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragleave: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragover: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondragstart: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null =\n null\n ondrop: ((this: GlobalEventHandlers, ev: DragEvent) => any) | null = null\n ondurationchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onemptied: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onended: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onerror: OnErrorEventHandler = undefined as any\n onfocus: ((this: GlobalEventHandlers, ev: FocusEvent) => any) | null = null\n onformdata: ((this: GlobalEventHandlers, ev: FormDataEvent) => any) | null =\n null\n ongotpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n oninput: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n oninvalid: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onkeydown: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeypress: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onkeyup: ((this: GlobalEventHandlers, ev: KeyboardEvent) => any) | null =\n null\n onload: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadeddata: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onloadedmetadata: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onloadstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onlostpointercapture:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onmousedown: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseenter: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseleave: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmousemove: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseout: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseover: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onmouseup: ((this: GlobalEventHandlers, ev: MouseEvent) => any) | null =\n null\n onpaste: ((this: GlobalEventHandlers, ev: ClipboardEvent) => any) | null =\n null\n onpause: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplay: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onplaying: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onpointercancel:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerdown:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerenter:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerleave:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointermove:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerout:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerover:\n ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null = null\n onpointerrawupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onpointerup: ((this: GlobalEventHandlers, ev: PointerEvent) => any) | null =\n null\n onprogress: ((this: GlobalEventHandlers, ev: ProgressEvent) => any) | null =\n null\n onratechange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onreset: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onresize: ((this: GlobalEventHandlers, ev: UIEvent) => any) | null = null\n onscroll: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onscrollend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsecuritypolicyviolation:\n | ((this: GlobalEventHandlers, ev: SecurityPolicyViolationEvent) => any)\n | null = null\n onseeked: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onseeking: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselect: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onselectionchange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onselectstart: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onslotchange: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onstalled: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onsubmit: ((this: GlobalEventHandlers, ev: SubmitEvent) => any) | null =\n null\n onsuspend: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontimeupdate: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n ontoggle: ((this: GlobalEventHandlers, ev: ToggleEvent) => any) | null =\n null\n ontransitioncancel:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionend:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionrun:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n ontransitionstart:\n ((this: GlobalEventHandlers, ev: TransitionEvent) => any) | null = null\n onvolumechange: ((this: GlobalEventHandlers, ev: Event) => any) | null =\n null\n onwaiting: ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationiteration:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkitanimationstart:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwebkittransitionend:\n ((this: GlobalEventHandlers, ev: Event) => any) | null = null\n onwheel: ((this: GlobalEventHandlers, ev: WheelEvent) => any) | null = null\n autofocus: boolean = false\n dataset: DOMStringMap = undefined as any\n tabIndex: number = 0\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n ariaActiveDescendantElement: Element | null = null\n ariaAtomic: string | null = ''\n ariaAutoComplete: string | null = ''\n ariaBrailleLabel: string | null = ''\n ariaBrailleRoleDescription: string | null = ''\n ariaBusy: string | null = ''\n ariaChecked: string | null = ''\n ariaColCount: string | null = ''\n ariaColIndex: string | null = ''\n ariaColIndexText: string | null = ''\n ariaColSpan: string | null = ''\n ariaControlsElements: ReadonlyArray<Element> | null = null\n ariaCurrent: string | null = ''\n ariaDescribedByElements: ReadonlyArray<Element> | null = null\n ariaDescription: string | null = ''\n ariaDetailsElements: ReadonlyArray<Element> | null = null\n ariaDisabled: string | null = ''\n ariaErrorMessageElements: ReadonlyArray<Element> | null = null\n ariaExpanded: string | null = ''\n ariaFlowToElements: ReadonlyArray<Element> | null = null\n ariaHasPopup: string | null = ''\n ariaHidden: string | null = ''\n ariaInvalid: string | null = ''\n ariaKeyShortcuts: string | null = ''\n ariaLabel: string | null = ''\n ariaLabelledByElements: ReadonlyArray<Element> | null = null\n ariaLevel: string | null = ''\n ariaLive: string | null = ''\n ariaModal: string | null = ''\n ariaMultiLine: string | null = ''\n ariaMultiSelectable: string | null = ''\n ariaOrientation: string | null = ''\n ariaOwnsElements: ReadonlyArray<Element> | null = null\n ariaPlaceholder: string | null = ''\n ariaPosInSet: string | null = ''\n ariaPressed: string | null = ''\n ariaReadOnly: string | null = ''\n ariaRelevant: string | null = ''\n ariaRequired: string | null = ''\n ariaRoleDescription: string | null = ''\n ariaRowCount: string | null = ''\n ariaRowIndex: string | null = ''\n ariaRowIndexText: string | null = ''\n ariaRowSpan: string | null = ''\n ariaSelected: string | null = ''\n ariaSetSize: string | null = ''\n ariaSort: string | null = ''\n ariaValueMax: string | null = ''\n ariaValueMin: string | null = ''\n ariaValueNow: string | null = ''\n ariaValueText: string | null = ''\n role: string | null = ''\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n childElementCount: number = 0\n children: HTMLCollection = undefined as any\n firstElementChild: Element | null = null\n lastElementChild: Element | null = null\n assignedSlot: HTMLSlotElement | null = null\n\n addTextTrack = createSpy2<HTMLMediaElement['addTextTrack']>('addTextTrack')\n canPlayType = createSpy2<HTMLMediaElement['canPlayType']>('canPlayType')\n fastSeek = createSpy2<HTMLMediaElement['fastSeek']>('fastSeek')\n load = createSpy2<HTMLMediaElement['load']>('load')\n pause = createSpy2<HTMLMediaElement['pause']>('pause')\n play = createSpy2<HTMLMediaElement['play']>('play')\n setMediaKeys = createSpy2<HTMLMediaElement['setMediaKeys']>('setMediaKeys')\n setSinkId = createSpy2<HTMLMediaElement['setSinkId']>('setSinkId')\n addEventListener =\n createSpy2<HTMLMediaElement['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<HTMLMediaElement['removeEventListener']>(\n 'removeEventListener'\n )\n attachInternals =\n createSpy2<HTMLMediaElement['attachInternals']>('attachInternals')\n click = createSpy2<HTMLMediaElement['click']>('click')\n hidePopover = createSpy2<HTMLMediaElement['hidePopover']>('hidePopover')\n showPopover = createSpy2<HTMLMediaElement['showPopover']>('showPopover')\n togglePopover =\n createSpy2<HTMLMediaElement['togglePopover']>('togglePopover')\n attachShadow = createSpy2<HTMLMediaElement['attachShadow']>('attachShadow')\n checkVisibility =\n createSpy2<HTMLMediaElement['checkVisibility']>('checkVisibility')\n closest = createSpy2<HTMLMediaElement['closest']>('closest')\n computedStyleMap =\n createSpy2<HTMLMediaElement['computedStyleMap']>('computedStyleMap')\n getAttribute = createSpy2<HTMLMediaElement['getAttribute']>('getAttribute')\n getAttributeNS =\n createSpy2<HTMLMediaElement['getAttributeNS']>('getAttributeNS')\n getAttributeNames =\n createSpy2<HTMLMediaElement['getAttributeNames']>('getAttributeNames')\n getAttributeNode =\n createSpy2<HTMLMediaElement['getAttributeNode']>('getAttributeNode')\n getAttributeNodeNS =\n createSpy2<HTMLMediaElement['getAttributeNodeNS']>('getAttributeNodeNS')\n getBoundingClientRect = createSpy2<\n HTMLMediaElement['getBoundingClientRect']\n >('getBoundingClientRect')\n getClientRects =\n createSpy2<HTMLMediaElement['getClientRects']>('getClientRects')\n getElementsByClassName = createSpy2<\n HTMLMediaElement['getElementsByClassName']\n >('getElementsByClassName')\n getElementsByTagName = createSpy2<HTMLMediaElement['getElementsByTagName']>(\n 'getElementsByTagName'\n )\n getElementsByTagNameNS = createSpy2<\n HTMLMediaElement['getElementsByTagNameNS']\n >('getElementsByTagNameNS')\n getHTML = createSpy2<HTMLMediaElement['getHTML']>('getHTML')\n hasAttribute = createSpy2<HTMLMediaElement['hasAttribute']>('hasAttribute')\n hasAttributeNS =\n createSpy2<HTMLMediaElement['hasAttributeNS']>('hasAttributeNS')\n hasAttributes =\n createSpy2<HTMLMediaElement['hasAttributes']>('hasAttributes')\n hasPointerCapture =\n createSpy2<HTMLMediaElement['hasPointerCapture']>('hasPointerCapture')\n insertAdjacentElement = createSpy2<\n HTMLMediaElement['insertAdjacentElement']\n >('insertAdjacentElement')\n insertAdjacentHTML =\n createSpy2<HTMLMediaElement['insertAdjacentHTML']>('insertAdjacentHTML')\n insertAdjacentText =\n createSpy2<HTMLMediaElement['insertAdjacentText']>('insertAdjacentText')\n matches = createSpy2<HTMLMediaElement['matches']>('matches')\n releasePointerCapture = createSpy2<\n HTMLMediaElement['releasePointerCapture']\n >('releasePointerCapture')\n removeAttribute =\n createSpy2<HTMLMediaElement['removeAttribute']>('removeAttribute')\n removeAttributeNS =\n createSpy2<HTMLMediaElement['removeAttributeNS']>('removeAttributeNS')\n removeAttributeNode = createSpy2<HTMLMediaElement['removeAttributeNode']>(\n 'removeAttributeNode'\n )\n requestFullscreen =\n createSpy2<HTMLMediaElement['requestFullscreen']>('requestFullscreen')\n requestPointerLock =\n createSpy2<HTMLMediaElement['requestPointerLock']>('requestPointerLock')\n scroll = createSpy2<HTMLMediaElement['scroll']>('scroll')\n scrollBy = createSpy2<HTMLMediaElement['scrollBy']>('scrollBy')\n scrollIntoView =\n createSpy2<HTMLMediaElement['scrollIntoView']>('scrollIntoView')\n scrollTo = createSpy2<HTMLMediaElement['scrollTo']>('scrollTo')\n setAttribute = createSpy2<HTMLMediaElement['setAttribute']>('setAttribute')\n setAttributeNS =\n createSpy2<HTMLMediaElement['setAttributeNS']>('setAttributeNS')\n setAttributeNode =\n createSpy2<HTMLMediaElement['setAttributeNode']>('setAttributeNode')\n setAttributeNodeNS =\n createSpy2<HTMLMediaElement['setAttributeNodeNS']>('setAttributeNodeNS')\n setHTMLUnsafe =\n createSpy2<HTMLMediaElement['setHTMLUnsafe']>('setHTMLUnsafe')\n setPointerCapture =\n createSpy2<HTMLMediaElement['setPointerCapture']>('setPointerCapture')\n toggleAttribute =\n createSpy2<HTMLMediaElement['toggleAttribute']>('toggleAttribute')\n webkitMatchesSelector = createSpy2<\n HTMLMediaElement['webkitMatchesSelector']\n >('webkitMatchesSelector')\n blur = createSpy2<HTMLMediaElement['blur']>('blur')\n focus = createSpy2<HTMLMediaElement['focus']>('focus')\n appendChild = createSpy2<HTMLMediaElement['appendChild']>('appendChild')\n cloneNode = createSpy2<HTMLMediaElement['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<\n HTMLMediaElement['compareDocumentPosition']\n >('compareDocumentPosition')\n contains = createSpy2<HTMLMediaElement['contains']>('contains')\n getRootNode = createSpy2<HTMLMediaElement['getRootNode']>('getRootNode')\n hasChildNodes =\n createSpy2<HTMLMediaElement['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<HTMLMediaElement['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<HTMLMediaElement['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<HTMLMediaElement['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<HTMLMediaElement['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<HTMLMediaElement['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<HTMLMediaElement['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<HTMLMediaElement['normalize']>('normalize')\n removeChild = createSpy2<HTMLMediaElement['removeChild']>('removeChild')\n replaceChild = createSpy2<HTMLMediaElement['replaceChild']>('replaceChild')\n animate = createSpy2<HTMLMediaElement['animate']>('animate')\n getAnimations =\n createSpy2<HTMLMediaElement['getAnimations']>('getAnimations')\n after = createSpy2<HTMLMediaElement['after']>('after')\n before = createSpy2<HTMLMediaElement['before']>('before')\n remove = createSpy2<HTMLMediaElement['remove']>('remove')\n replaceWith = createSpy2<HTMLMediaElement['replaceWith']>('replaceWith')\n append = createSpy2<HTMLMediaElement['append']>('append')\n prepend = createSpy2<HTMLMediaElement['prepend']>('prepend')\n querySelector =\n createSpy2<HTMLMediaElement['querySelector']>('querySelector')\n querySelectorAll =\n createSpy2<HTMLMediaElement['querySelectorAll']>('querySelectorAll')\n replaceChildren =\n createSpy2<HTMLMediaElement['replaceChildren']>('replaceChildren')\n dispatchEvent =\n createSpy2<HTMLMediaElement['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockMediaError implements MediaError {\n code: number = 0\n message: string = ''\n MEDIA_ERR_ABORTED: 1 = 1\n MEDIA_ERR_NETWORK: 2 = 2\n MEDIA_ERR_DECODE: 3 = 3\n MEDIA_ERR_SRC_NOT_SUPPORTED: 4 = 4\n}\n\nexport class MockMediaKeyMessageEvent implements MediaKeyMessageEvent {\n message: ArrayBuffer = new ArrayBuffer(0)\n messageType: MediaKeyMessageType = 'individualization-request'\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath =\n createSpy2<MediaKeyMessageEvent['composedPath']>('composedPath')\n initEvent = createSpy2<MediaKeyMessageEvent['initEvent']>('initEvent')\n preventDefault =\n createSpy2<MediaKeyMessageEvent['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n MediaKeyMessageEvent['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<MediaKeyMessageEvent['stopPropagation']>('stopPropagation')\n}\n\nexport class MockMediaKeySession implements MediaKeySession {\n closed: Promise<MediaKeySessionClosedReason> = undefined as any\n expiration: number = 0\n keyStatuses: MediaKeyStatusMap = undefined as any\n onkeystatuseschange: ((this: MediaKeySession, ev: Event) => any) | null =\n null\n onmessage:\n ((this: MediaKeySession, ev: MediaKeyMessageEvent) => any) | null = null\n sessionId: string = ''\n\n close = createSpy2<MediaKeySession['close']>('close')\n generateRequest =\n createSpy2<MediaKeySession['generateRequest']>('generateRequest')\n load = createSpy2<MediaKeySession['load']>('load')\n remove = createSpy2<MediaKeySession['remove']>('remove')\n update = createSpy2<MediaKeySession['update']>('update')\n addEventListener =\n createSpy2<MediaKeySession['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<MediaKeySession['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent =\n createSpy2<MediaKeySession['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockMediaKeySystemAccess implements MediaKeySystemAccess {\n keySystem: string = ''\n\n createMediaKeys =\n createSpy2<MediaKeySystemAccess['createMediaKeys']>('createMediaKeys')\n getConfiguration =\n createSpy2<MediaKeySystemAccess['getConfiguration']>('getConfiguration')\n}\n\nexport class MockMediaKeys implements MediaKeys {\n createSession = createSpy2<MediaKeys['createSession']>('createSession')\n getStatusForPolicy =\n createSpy2<MediaKeys['getStatusForPolicy']>('getStatusForPolicy')\n setServerCertificate = createSpy2<MediaKeys['setServerCertificate']>(\n 'setServerCertificate'\n )\n}\n\nexport class MockMediaSource implements MediaSource {\n activeSourceBuffers: SourceBufferList = undefined as any\n duration: number = 0\n onsourceclose: ((this: MediaSource, ev: Event) => any) | null = null\n onsourceended: ((this: MediaSource, ev: Event) => any) | null = null\n onsourceopen: ((this: MediaSource, ev: Event) => any) | null = null\n readyState: ReadyState = 'closed'\n sourceBuffers: SourceBufferList = [] as unknown as SourceBufferList\n\n addSourceBuffer =\n createSpy2<MediaSource['addSourceBuffer']>('addSourceBuffer')\n clearLiveSeekableRange = createSpy2<MediaSource['clearLiveSeekableRange']>(\n 'clearLiveSeekableRange'\n )\n endOfStream = createSpy2<MediaSource['endOfStream']>('endOfStream')\n removeSourceBuffer =\n createSpy2<MediaSource['removeSourceBuffer']>('removeSourceBuffer')\n setLiveSeekableRange = createSpy2<MediaSource['setLiveSeekableRange']>(\n 'setLiveSeekableRange'\n )\n addEventListener =\n createSpy2<MediaSource['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<MediaSource['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<MediaSource['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockMediaStream implements MediaStream {\n active: boolean = false\n id: string = ''\n onaddtrack: ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null =\n null\n onremovetrack:\n ((this: MediaStream, ev: MediaStreamTrackEvent) => any) | null = null\n\n addTrack = createSpy2<MediaStream['addTrack']>('addTrack')\n clone = createSpy2<MediaStream['clone']>('clone')\n getAudioTracks = createSpy2<MediaStream['getAudioTracks']>('getAudioTracks')\n getTrackById = createSpy2<MediaStream['getTrackById']>('getTrackById')\n getTracks = createSpy2<MediaStream['getTracks']>('getTracks')\n getVideoTracks = createSpy2<MediaStream['getVideoTracks']>('getVideoTracks')\n removeTrack = createSpy2<MediaStream['removeTrack']>('removeTrack')\n addEventListener =\n createSpy2<MediaStream['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<MediaStream['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<MediaStream['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockNavigator implements Navigator {\n clipboard: Clipboard = undefined as any\n credentials: CredentialsContainer = undefined as any\n doNotTrack: string | null = ''\n geolocation: Geolocation = undefined as any\n login: NavigatorLogin = undefined as any\n maxTouchPoints: number = 0\n mediaCapabilities: MediaCapabilities = undefined as any\n mediaDevices: MediaDevices = undefined as any\n mediaSession: MediaSession = undefined as any\n permissions: Permissions = undefined as any\n serviceWorker: ServiceWorkerContainer = undefined as any\n userActivation: UserActivation = undefined as any\n wakeLock: WakeLock = undefined as any\n webdriver: boolean = false\n hardwareConcurrency: number = 0\n cookieEnabled: boolean = false\n appCodeName: string = ''\n appName: string = ''\n appVersion: string = ''\n platform: string = ''\n product: string = ''\n productSub: string = ''\n userAgent: string = ''\n vendor: string = ''\n vendorSub: string = ''\n language: string = ''\n languages: ReadonlyArray<string> = []\n locks: LockManager = undefined as any\n onLine: boolean = false\n mimeTypes: MimeTypeArray = undefined as any\n pdfViewerEnabled: boolean = false\n plugins: PluginArray = undefined as any\n storage: StorageManager = undefined as any\n\n canShare = createSpy2<Navigator['canShare']>('canShare')\n getGamepads = createSpy2<Navigator['getGamepads']>('getGamepads')\n requestMIDIAccess =\n createSpy2<Navigator['requestMIDIAccess']>('requestMIDIAccess')\n requestMediaKeySystemAccess = createSpy2<\n Navigator['requestMediaKeySystemAccess']\n >('requestMediaKeySystemAccess')\n sendBeacon = createSpy2<Navigator['sendBeacon']>('sendBeacon')\n share = createSpy2<Navigator['share']>('share')\n vibrate = createSpy2<Navigator['vibrate']>('vibrate')\n clearAppBadge = createSpy2<Navigator['clearAppBadge']>('clearAppBadge')\n setAppBadge = createSpy2<Navigator['setAppBadge']>('setAppBadge')\n registerProtocolHandler = createSpy2<Navigator['registerProtocolHandler']>(\n 'registerProtocolHandler'\n )\n javaEnabled = createSpy2<Navigator['javaEnabled']>('javaEnabled')\n}\n\nexport class MockNode implements Node {\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n ownerDocument: Document | null = null\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n textContent: string | null = ''\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n\n appendChild = createSpy2<Node['appendChild']>('appendChild')\n cloneNode = createSpy2<Node['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<Node['compareDocumentPosition']>(\n 'compareDocumentPosition'\n )\n contains = createSpy2<Node['contains']>('contains')\n getRootNode = createSpy2<Node['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<Node['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<Node['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<Node['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<Node['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<Node['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<Node['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<Node['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<Node['normalize']>('normalize')\n removeChild = createSpy2<Node['removeChild']>('removeChild')\n replaceChild = createSpy2<Node['replaceChild']>('replaceChild')\n addEventListener = createSpy2<Node['addEventListener']>('addEventListener')\n dispatchEvent = createSpy2<Node['dispatchEvent']>('dispatchEvent')\n removeEventListener = createSpy2<Node['removeEventListener']>(\n 'removeEventListener'\n )\n}\n\nexport class MockProgressEvent<\n T extends EventTarget = EventTarget,\n> implements ProgressEvent<T> {\n lengthComputable: boolean = false\n loaded: number = 0\n target: T | null = undefined as any\n total: number = 0\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath = createSpy2<ProgressEvent<T>['composedPath']>('composedPath')\n initEvent = createSpy2<ProgressEvent<T>['initEvent']>('initEvent')\n preventDefault =\n createSpy2<ProgressEvent<T>['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n ProgressEvent<T>['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<ProgressEvent<T>['stopPropagation']>('stopPropagation')\n}\n\nexport class MockPromiseRejectionEvent implements PromiseRejectionEvent {\n promise: Promise<any> = undefined as any\n reason: any = undefined\n bubbles: boolean = false\n cancelBubble: boolean = false\n cancelable: boolean = false\n composed: boolean = false\n currentTarget: EventTarget | null = null\n defaultPrevented: boolean = false\n eventPhase: number = 0\n isTrusted: boolean = false\n returnValue: boolean = false\n srcElement: EventTarget | null = null\n target: EventTarget | null = null\n timeStamp: DOMHighResTimeStamp = 0\n type: string = ''\n NONE: 0 = 0\n CAPTURING_PHASE: 1 = 1\n AT_TARGET: 2 = 2\n BUBBLING_PHASE: 3 = 3\n\n composedPath =\n createSpy2<PromiseRejectionEvent['composedPath']>('composedPath')\n initEvent = createSpy2<PromiseRejectionEvent['initEvent']>('initEvent')\n preventDefault =\n createSpy2<PromiseRejectionEvent['preventDefault']>('preventDefault')\n stopImmediatePropagation = createSpy2<\n PromiseRejectionEvent['stopImmediatePropagation']\n >('stopImmediatePropagation')\n stopPropagation =\n createSpy2<PromiseRejectionEvent['stopPropagation']>('stopPropagation')\n}\n\nexport class MockSourceBuffer implements SourceBuffer {\n appendWindowEnd: number = 0\n appendWindowStart: number = 0\n buffered: TimeRanges = undefined as any\n mode: AppendMode = 'segments'\n onabort: ((this: SourceBuffer, ev: Event) => any) | null = null\n onerror: ((this: SourceBuffer, ev: Event) => any) | null = null\n onupdate: ((this: SourceBuffer, ev: Event) => any) | null = null\n onupdateend: ((this: SourceBuffer, ev: Event) => any) | null = null\n onupdatestart: ((this: SourceBuffer, ev: Event) => any) | null = null\n timestampOffset: number = 0\n updating: boolean = false\n\n abort = createSpy2<SourceBuffer['abort']>('abort')\n appendBuffer = createSpy2<SourceBuffer['appendBuffer']>('appendBuffer')\n changeType = createSpy2<SourceBuffer['changeType']>('changeType')\n remove = createSpy2<SourceBuffer['remove']>('remove')\n addEventListener =\n createSpy2<SourceBuffer['addEventListener']>('addEventListener')\n removeEventListener = createSpy2<SourceBuffer['removeEventListener']>(\n 'removeEventListener'\n )\n dispatchEvent = createSpy2<SourceBuffer['dispatchEvent']>('dispatchEvent')\n}\n\nexport class MockStorage implements Storage {\n [key: string]: any\n\n length: number = 0\n\n clear = createSpy2<Storage['clear']>('clear')\n getItem = createSpy2<Storage['getItem']>('getItem')\n key = createSpy2<Storage['key']>('key')\n removeItem = createSpy2<Storage['removeItem']>('removeItem')\n setItem = createSpy2<Storage['setItem']>('setItem')\n}\n\nexport class MockText implements Text {\n wholeText: string = ''\n data: string = ''\n length: number = 0\n ownerDocument: Document = undefined as any\n textContent: any = undefined\n assignedSlot: HTMLSlotElement | null = null\n baseURI: string = ''\n childNodes: NodeListOf<ChildNode> = undefined as any\n firstChild: ChildNode | null = null\n isConnected: boolean = false\n lastChild: ChildNode | null = null\n nextSibling: ChildNode | null = null\n nodeName: string = ''\n nodeType: number = 0\n nodeValue: string | null = ''\n parentElement: HTMLElement | null = null\n parentNode: ParentNode | null = null\n previousSibling: ChildNode | null = null\n ELEMENT_NODE: 1 = 1\n ATTRIBUTE_NODE: 2 = 2\n TEXT_NODE: 3 = 3\n CDATA_SECTION_NODE: 4 = 4\n ENTITY_REFERENCE_NODE: 5 = 5\n ENTITY_NODE: 6 = 6\n PROCESSING_INSTRUCTION_NODE: 7 = 7\n COMMENT_NODE: 8 = 8\n DOCUMENT_NODE: 9 = 9\n DOCUMENT_TYPE_NODE: 10 = 10\n DOCUMENT_FRAGMENT_NODE: 11 = 11\n NOTATION_NODE: 12 = 12\n DOCUMENT_POSITION_DISCONNECTED: 0x01 = 1\n DOCUMENT_POSITION_PRECEDING: 0x02 = 2\n DOCUMENT_POSITION_FOLLOWING: 0x04 = 4\n DOCUMENT_POSITION_CONTAINS: 0x08 = 8\n DOCUMENT_POSITION_CONTAINED_BY: 0x10 = 16\n DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: 0x20 = 32\n nextElementSibling: Element | null = null\n previousElementSibling: Element | null = null\n\n splitText = createSpy2<Text['splitText']>('splitText')\n appendData = createSpy2<Text['appendData']>('appendData')\n deleteData = createSpy2<Text['deleteData']>('deleteData')\n insertData = createSpy2<Text['insertData']>('insertData')\n replaceData = createSpy2<Text['replaceData']>('replaceData')\n substringData = createSpy2<Text['substringData']>('substringData')\n appendChild = createSpy2<Text['appendChild']>('appendChild')\n cloneNode = createSpy2<Text['cloneNode']>('cloneNode')\n compareDocumentPosition = createSpy2<Text['compareDocumentPosition']>(\n 'compareDocumentPosition'\n )\n contains = createSpy2<Text['contains']>('contains')\n getRootNode = createSpy2<Text['getRootNode']>('getRootNode')\n hasChildNodes = createSpy2<Text['hasChildNodes']>('hasChildNodes')\n insertBefore = createSpy2<Text['insertBefore']>('insertBefore')\n isDefaultNamespace =\n createSpy2<Text['isDefaultNamespace']>('isDefaultNamespace')\n isEqualNode = createSpy2<Text['isEqualNode']>('isEqualNode')\n isSameNode = createSpy2<Text['isSameNode']>('isSameNode')\n lookupNamespaceURI =\n createSpy2<Text['lookupNamespaceURI']>('lookupNamespaceURI')\n lookupPrefix = createSpy2<Text['lookupPrefix']>('lookupPrefix')\n normalize = createSpy2<Text['normalize']>('normalize')\n removeChild = createSpy2<Text['removeChild']>('removeChild')\n replaceChild = createSpy2<Text['replaceChild']>('replaceChild')\n after = createSpy2<Text['after']>('after')\n before = createSpy2<Text['before']>('before')\n remove = createSpy2<Text['remove']>('remove')\n replaceWith = createSpy2<Text['replaceWith']>('replaceWith')\n addEventListener = createSpy2<Text['addEventListener']>('addEventListener')\n dispatchEvent = createSpy2<Text['dispatchEvent']>('dispatchEvent')\n removeEventListener = createSpy2<Text['removeEventListener']>(\n 'removeEventListener'\n )\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MockAbortSignal, MockMediaSource } from './lib.dom'\nimport { createSpy2 } from '../createSpyFactory'\n\nexport class MockMediaSourceGlobal extends MockMediaSource {\n static canConstructInDedicatedWorker = false\n static isTypeSupported =\n createSpy2<(typeof global.MediaSource)['isTypeSupported']>(\n 'isTypeSupported'\n )\n}\n\nexport class MockAbortSignalGlobal extends MockAbortSignal {\n static abort = createSpy2<(typeof global.AbortSignal)['abort']>('abort')\n static any = createSpy2<(typeof global.AbortSignal)['any']>('any')\n static timeout =\n createSpy2<(typeof global.AbortSignal)['timeout']>('timeout')\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nexport function el<K extends keyof HTMLElementTagNameMap>(\n selectors: K,\n parentNode?: ParentNode\n): HTMLElementTagNameMap[K]\nexport function el(selectors: string, parentNode?: ParentNode): HTMLElement\nexport function el<E extends Element = Element>(\n selectors: string,\n parentNode: ParentNode = document\n): E {\n const element = parentNode.querySelector(selectors)\n if (!element) throw new Error(`${selectors} must be a DOM element`)\n return element as E\n}\n\nexport interface QuerySelector {\n <K extends keyof HTMLElementTagNameMap>(\n selectors: K,\n parentNode?: ParentNode\n ): HTMLElementTagNameMap[K]\n (selectors: string): HTMLElement\n}\n\nexport function bindQuerySelector(parentNode: ParentNode): QuerySelector {\n return (selectors: string) => el(selectors, parentNode)\n}\n\nexport function hide(element: HTMLElement) {\n element.style.display = 'none'\n}\n\nexport function show(element: HTMLElement) {\n element.style.removeProperty('display')\n}\n\nexport function getVisible(element: HTMLElement): boolean {\n return element.style.display !== 'none'\n}\n\nexport function setVisible(element: HTMLElement, value: boolean) {\n if (getVisible(element) === value) return\n if (value) show(element)\n else hide(element)\n}\n\nexport function isHidden(element: HTMLElement) {\n let node: HTMLElement | null = element\n while (node) {\n if (getComputedStyle(node).display === 'none') return true\n node = node.parentElement\n }\n return false\n}\n\nexport function isInputElement(\n value: Element | null\n): value is HTMLInputElement {\n return value?.tagName.toLowerCase() === 'input'\n}\n\n/**\n * Adds or removes a class token to an element.\n *\n * @param value The element whose classList to modify.\n * @param token The class token.\n * @param toggled If true, the token is added, if false, removed.\n */\nexport function setClassToken(\n value: HTMLElement,\n token: string,\n toggled: boolean\n) {\n if (toggled) {\n value.classList.add(token)\n } else {\n value.classList.remove(token)\n }\n}\n\nexport type ElementInitOptions = {\n readonly parent?: HTMLElement\n readonly className?: string\n}\n\n/**\n * Recursively walks a node hierarchy, invoking a callback for every node, depth first.\n *\n * @param node\n * @param callback\n */\nexport function walkDomDepthFirst(\n node: Node | undefined | null,\n callback: (node: Node) => void\n) {\n if (!node) return\n let next = node.firstChild\n while (next) {\n // Snapshot the sibling before recursing so a callback that moves\n // `next` can't sever the chain and skip the rest of the row.\n const after = next.nextSibling\n walkDomDepthFirst(next, callback)\n next = after\n }\n callback(node)\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { walkDomDepthFirst } from '../domUtil'\nimport type { Maybe, Unsubscribe } from '@amazon/vinyl-util'\n\n/**\n * Where {@link onConnect} keeps a node's callbacks, so the observer can call them without an event\n * dispatch. A registered symbol, so every copy of this library on a page shares it.\n */\nconst CONNECTION_CALLBACKS: unique symbol = Symbol.for(\n '@amazon/vinyl-tsx/connectionCallbacks'\n)\n\ninterface ConnectionCallbacks {\n readonly connect: Set<() => void>\n readonly disconnect: Set<() => void>\n}\n\ntype ObservedNode = Node & { [CONNECTION_CALLBACKS]?: ConnectionCallbacks }\n\nfunction callbacksOf(node: Node): ConnectionCallbacks {\n const observed = node as ObservedNode\n let callbacks = observed[CONNECTION_CALLBACKS]\n if (!callbacks) {\n callbacks = { connect: new Set(), disconnect: new Set() }\n observed[CONNECTION_CALLBACKS] = callbacks\n }\n return callbacks\n}\n\nfunction notify(node: Node, type: keyof ConnectionCallbacks): void {\n const callbacks = (node as ObservedNode)[CONNECTION_CALLBACKS]?.[type]\n if (callbacks?.size) for (const callback of [...callbacks]) callback()\n}\n\nexport interface ConnectedObserverOptions {\n /**\n * Whether to dispatch a `connect` / `disconnect` DOM event on every node of an added or removed\n * subtree, for listeners added with `addEventListener` (default true). {@link onConnect}\n * callbacks run either way. Without the events, mounting or removing a large tree skips one\n * event dispatch per node, which otherwise dominates the observer's cost.\n */\n readonly events?: boolean\n}\n\n/**\n * Dispatches a 'connected' event on nodes attached to the dom, dispatches 'disconnected' when removed.\n * Allows nodes to observe connected changes without creating a memory leak.\n */\nexport function initializeConnectedObserver(\n options: ConnectedObserverOptions = {}\n): Unsubscribe {\n const events = options.events ?? true\n const observer = new MutationObserver((mutations) => {\n const removed = new Set<Node>()\n const added = new Set<Node>()\n\n // First pass: flatten removed and added nodes so we can detect nodes re-ordered.\n for (const mutation of mutations) {\n mutation.removedNodes.forEach((node) => removed.add(node))\n mutation.addedNodes.forEach((node) => added.add(node))\n }\n\n // Second pass: handle added/removed, skipping reorders\n for (const mutation of mutations) {\n for (const node of mutation.addedNodes) {\n if (removed.has(node)) continue\n walkDomDepthFirst(node, (iNode) => {\n notify(iNode, 'connect')\n if (events) {\n iNode.dispatchEvent(\n new CustomEvent('connect', { bubbles: false })\n )\n }\n })\n }\n\n for (const node of mutation.removedNodes) {\n if (added.has(node)) continue\n walkDomDepthFirst(node, (iNode) => {\n notify(iNode, 'disconnect')\n if (events) {\n iNode.dispatchEvent(\n new CustomEvent('disconnect', { bubbles: false })\n )\n }\n })\n }\n }\n })\n\n observer.observe(document, { childList: true, subtree: true })\n\n return () => {\n observer.disconnect()\n }\n}\n\n/**\n * Invokes a callback when the given target is connected to the DOM.\n * If the callback returns a function, that function will be invoked when disconnected.\n *\n * @param target\n * @param callback\n */\nexport function onConnect<T extends Node>(\n target: T,\n callback: (node: T) => Maybe<Unsubscribe> | void\n): Unsubscribe {\n let sub: Maybe<Unsubscribe> | void = null\n let connected = false\n const onConnect = () => {\n if (connected) return\n connected = true\n sub = callback(target)\n }\n const onDisconnect = () => {\n connected = false\n sub?.()\n sub = null\n }\n const callbacks = callbacksOf(target)\n callbacks.connect.add(onConnect)\n callbacks.disconnect.add(onDisconnect)\n // Still listening for the events, for an observer from an older copy of this library.\n target.addEventListener('connect', onConnect)\n target.addEventListener('disconnect', onDisconnect)\n if (target.isConnected) onConnect()\n return () => {\n callbacks.connect.delete(onConnect)\n callbacks.disconnect.delete(onDisconnect)\n target.removeEventListener('connect', onConnect)\n target.removeEventListener('disconnect', onDisconnect)\n onDisconnect()\n }\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n BenchmarkRunResults,\n RunResultsComparison,\n} from '@amazon/vinyl-util/browserTestUtil'\nimport {\n compareResults,\n expectNothing,\n setTestTimeout,\n} from '@amazon/vinyl-util/browserTestUtil'\n\nexport function setupBenchmark(): void {\n setTestTimeout(180)\n afterEach(expectNothing)\n}\n\nconst comparisons: RunResultsComparison[] = []\n\n/**\n * Adds a benchmark comparison to be displayed at the end of the test.\n * @param comparison\n */\nexport function addComparison(comparison: RunResultsComparison) {\n comparisons.push(comparison)\n}\n\n/**\n * Adds a list of benchmark results to be compared with each other.\n * The results will be logged then for browser environments displayed at the end of the suite.\n *\n * @param name The comparison suite name.\n * @param results\n */\nexport function addBenchmarks(name: string, ...results: BenchmarkRunResults[]) {\n const comparison = compareResults(name, ...results)\n comparison.logToTable()\n comparisons.push(comparison)\n}\n\nif (typeof document !== 'undefined') {\n jasmine.getEnv().addReporter({\n jasmineDone: () => {\n console.log('Tests complete')\n const jasmineContainer = document.getElementsByClassName(\n 'jasmine_html-reporter'\n )[0]\n jasmineContainer.parentElement?.removeChild(jasmineContainer)\n const container = createEl('div', document.body)\n container.id = 'benchmarkResults'\n const sortedComparisons = [...comparisons].sort((a, b) =>\n a.name > b.name ? 1 : -1\n )\n for (const comparison of sortedComparisons) {\n toTableHtml(comparison, container)\n }\n },\n })\n}\n\nfunction toTableHtml(\n comparison: RunResultsComparison,\n parent?: HTMLElement\n): HTMLDivElement {\n const container = createEl('div', parent)\n container.className = 'benchmarkComparison'\n const title = createEl('h2', container)\n title.innerText = comparison.name\n const table = createEl('table', container)\n const head = createEl('thead', table)\n const headRow = createEl('tr', head)\n const name = createEl('th', headRow)\n name.innerText = 'Name'\n const median = createEl('th', headRow)\n median.innerText = 'Mean ops/s'\n const samples = createEl('th', headRow)\n samples.innerText = 'Samples'\n const compare = createEl('th', headRow)\n compare.innerText = '% Comparison'\n\n const body = createEl('tbody', table)\n comparison.results.forEach((result) => {\n const row = createEl('tr', body)\n createEl('th', row).innerText = result.name\n createEl('td', row).innerText = result.meanOpsStr\n createEl('td', row).innerText = result.totalSamples.toLocaleString()\n createEl('td', row).innerText = comparison.runComparisonToString(result)\n })\n return container\n}\n\nfunction createEl<K extends keyof HTMLElementTagNameMap>(\n tagName: K,\n parent?: HTMLElement,\n options?: ElementCreationOptions\n): HTMLElementTagNameMap[K] {\n const element = document.createElement(tagName, options)\n if (parent) parent.appendChild(element)\n return element\n}\n", "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { Unsubscribe } from '@amazon/vinyl-util'\nimport type { BenchmarkRunResults } from '@amazon/vinyl-util/browserTestUtil'\nimport { benchmark } from '@amazon/vinyl-util/browserTestUtil'\nimport {\n initializeConnectedObserver,\n onConnect,\n walkDomDepthFirst,\n} from '@amazon/vinyl-tsx'\nimport { addBenchmarks, setupBenchmark } from '../setup'\n\ndescribe('connectedObserver', () => {\n setupBenchmark()\n\n const observers: Record<string, () => Unsubscribe> = {\n 'no observer': () => () => {},\n 'events on': () => initializeConnectedObserver(),\n 'events off': () => initializeConnectedObserver({ events: false }),\n }\n\n let connections = 0\n\n /**\n * A grid of cards, 7 nodes each. With listeners, a card and its title text (2 of 7 nodes)\n * observe their connection, the way jsx hooks and ActiveText do.\n */\n function createPage(cards: number, listeners: boolean): HTMLElement {\n const page = document.createElement('div')\n let row: HTMLElement = page\n for (let i = 0; i < cards; i++) {\n if (i % 10 === 0) row = append(page, 'div')\n const card = append(row, 'div')\n append(card, 'div')\n const meta = append(card, 'div')\n const title = document.createTextNode(`Title ${i}`)\n append(meta, 'span').appendChild(title)\n append(meta, 'span').appendChild(\n document.createTextNode(`Subtitle ${i}`)\n )\n if (listeners) {\n observe(card)\n observe(title)\n }\n }\n return page\n }\n\n function append(parent: Node, tagName: string): HTMLElement {\n return parent.appendChild(document.createElement(tagName))\n }\n\n function observe(node: Node) {\n onConnect(node, () => {\n connections++\n return () => connections--\n })\n }\n\n function countNodes(root: Node): number {\n let count = 0\n walkDomDepthFirst(root, () => count++)\n return count\n }\n\n /**\n * Mutation observer callbacks run in a microtask queued by the first mutation, so they have\n * run once the executor resumes from an await.\n */\n function flushMutations(): Promise<void> {\n return Promise.resolve()\n }\n\n async function compareObservers(\n name: string,\n executor: (container: HTMLElement) => Promise<void>\n ) {\n const results: BenchmarkRunResults[] = []\n for (const [observerName, initialize] of Object.entries(observers)) {\n const container = document.body.appendChild(\n document.createElement('div')\n )\n const unsubscribe = initialize()\n try {\n results.push(\n await benchmark(observerName, () => executor(container))\n )\n } finally {\n unsubscribe()\n container.remove()\n }\n }\n addBenchmarks(name, ...results)\n }\n\n ;[1000, 5000].forEach((size) => {\n const cards = Math.round(size / 7)\n\n describe(`${size} nodes`, () => {\n const page = createPage(cards, true)\n const nodes = countNodes(page)\n const label = `${nodes.toLocaleString()} nodes, ${Math.round(\n ((cards * 2) / nodes) * 100\n )}% with listeners`\n\n it('mount and unmount', async () => {\n await compareObservers(\n `mount and unmount ${label}`,\n async (container) => {\n container.appendChild(page)\n await flushMutations()\n page.remove()\n await flushMutations()\n }\n )\n })\n\n it('page swap', async () => {\n const pages = [page, createPage(cards, true)]\n let next = 0\n await compareObservers(\n `page swap ${label}`,\n async (container) => {\n if (container.firstChild) {\n container.replaceChild(\n pages[next],\n container.firstChild\n )\n } else {\n container.appendChild(pages[next])\n }\n next = 1 - next\n await flushMutations()\n }\n )\n })\n\n it('mount and unmount without listeners', async () => {\n const emptyPage = createPage(cards, false)\n await compareObservers(\n `mount and unmount ${nodes.toLocaleString()} nodes, no listeners`,\n async (container) => {\n container.appendChild(emptyPage)\n await flushMutations()\n emptyPage.remove()\n await flushMutations()\n }\n )\n })\n })\n })\n})\n"],
5
+ "mappings": "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",
6
6
  "names": ["benchmark", "onConnect"]
7
7
  }