diff --git a/AGENTS.md b/AGENTS.md index b67319ba7..c12c93dd8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,6 +18,9 @@ Include the task ID in the commit subject and include its implementation, tests, and status updates together. Verify the commit before starting the next task. Do not bundle multiple newly completed tasks or include unrelated work. This does not authorize pushing or publishing. Use Yarn Classic 1.22.22 as packageManager and maintain only the root yarn.lock. +Core public declarations are authored in packages/artplayer/public/ and generated +with yarn build:types into the existing types/ entrypoints. Do not hand-edit the +generated core declarations; yarn check:types is read-only and rejects drift. Use Node from .node-version; frozen Yarn installs and strict toolchain checks are required. Bun remains an isolated evaluation and must not replace Yarn without a new user decision. The user also authorizes installing needed dependencies and adding or improving reasonable @@ -137,7 +140,8 @@ For proxy/plugin work, prefer validating on the local demo page rather than reas - `packages/artplayer/src/contextmenu/`: context menu items - `packages/artplayer/src/plugins/`: built-in plugins - `packages/artplayer/src/utils/`: shared helpers, component base classes, DOM utilities -- `packages/artplayer/types/`: public TS declarations +- `packages/artplayer/public/`: public TypeScript declaration sources +- `packages/artplayer/types/`: generated public declarations and compatibility documentation ### Ecosystem packages @@ -246,7 +250,8 @@ If adding HLS-like quality/audio selection elsewhere: ## Build and Artifact Rules -- Always edit `src/` and `types/` first. +- Always edit source first: core runtime in `src/`, core declarations in `public/`; + other packages retain `types/` until their own declaration source migration. - Rebuild package artifacts after source changes that should ship. - Do not treat `dist/` as source of truth. - If a change affects demo behavior, also verify the matching file in `docs/assets/example/`. diff --git a/docs/assets/ts/artplayer.d.ts b/docs/assets/ts/artplayer.d.ts index 33950eaaa..9c953fedf 100644 --- a/docs/assets/ts/artplayer.d.ts +++ b/docs/assets/ts/artplayer.d.ts @@ -1,1370 +1,1377 @@ -export interface Utils { - isBrowser: boolean - userAgent: string - isMobile: boolean - isSafari: boolean - isIOS: boolean - isIOS13: boolean - - query: (selector: string, parent?: Document | HTMLElement) => T | null - queryAll: (selector: string, parent?: Document | HTMLElement) => T[] - addClass: (target: HTMLElement, className: string) => void - removeClass: (target: HTMLElement, className: string) => void - hasClass: (target: HTMLElement, className: string) => boolean - append: (target: HTMLElement, child: HTMLElement | string) => Element | ChildNode - remove: (target: HTMLElement) => HTMLElement - replaceElement: (newChild: HTMLElement, oldChild: HTMLElement) => HTMLElement - siblings: (target: HTMLElement) => HTMLElement[] - inverseClass: (target: HTMLElement, className: string) => void - createElement: (tag: K) => HTMLElementTagNameMap[K] - setStyle: ( - element: HTMLElement, - key: T, - value: string | CSSStyleDeclaration[T], - ) => HTMLElement - setStyles: (element: HTMLElement, styles: Partial) => HTMLElement - getStyle: { - (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType?: true): number - (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType: false): string +// Generated from packages/artplayer/public/artplayer.ts by yarn build:ts. Do not edit. +/* eslint-disable ts/no-redeclare, ts/no-namespace -- UMD constructor and named types share the global export. */ +declare namespace ArtplayerDefinitions { + export interface ComponentInput extends Omit { + html?: string | HTMLElement | number } - setStyleText: (id: string, cssText: string) => void - getRect: (el: HTMLElement) => { top: number, left: number, width: number, height: number } - tooltip: (target: HTMLElement, msg: string, pos?: string) => void - isInViewport: (target: HTMLElement, offset?: number) => boolean - includeFromEvent: (event: Event, target: HTMLElement) => boolean - getSafeAreaInsets: () => { top: number, right: number, bottom: number, left: number } - - srtToVtt: (srtText: string) => string - vttToBlob: (vttText: string) => string - assToVtt: (assText: string) => string - - getExt: (url: string) => string - download: (url: string, name: string) => void - loadImg: (url: string, scale?: number) => Promise - - errorHandle: (condition: T, msg: string) => T extends true ? T : never - silencePromise: (value: T) => T extends Promise ? Promise : T - def: { - /** Historical string-key signature; runtime returns obj. */ - (obj: object, name: string, value: unknown): void - (obj: T, name: PropertyKey, value: PropertyDescriptor & ThisType): T - } - has: (obj: object, name: PropertyKey) => boolean - get: (obj: object, name: PropertyKey) => PropertyDescriptor | undefined - mergeDeep: (...args: T) => T[number] - - sleep: (ms?: number) => Promise - /** Historical return type; runtime discards the callback result and ignores context. */ - debounce: any>(func: F, wait: number, context?: object) => (...args: Parameters) => ReturnType - /** Historical return type; runtime discards the callback result. */ - throttle: any>(func: F, wait: number) => (...args: Parameters) => ReturnType - - clamp: (num: number, a: number, b: number) => number - secondToTime: (second: number) => string - escape: (str: string) => string - unescape: (str: string) => string - capitalize: (str: string) => string - - ArtPlayerError: new (message?: string, context?: ((...args: never[]) => unknown) | (abstract new (...args: never[]) => object)) => Error - - getIcon: (key?: string, html?: string | HTMLElement) => HTMLElement - getComposedPath: (event: Event) => EventTarget[] - supportsFlex: () => boolean -} - -export interface Template { - readonly html: string - readonly $container: HTMLDivElement - readonly $player: HTMLDivElement - readonly $video: HTMLVideoElement - readonly $track: HTMLTrackElement - readonly $poster: HTMLDivElement - readonly $subtitle: HTMLDivElement - readonly $danmuku: HTMLDivElement - readonly $bottom: HTMLDivElement - readonly $progress: HTMLDivElement - readonly $controls: HTMLDivElement - readonly $controlsLeft: HTMLDivElement - readonly $controlsCenter: HTMLDivElement - readonly $controlsRight: HTMLDivElement - readonly $layer: HTMLDivElement - readonly $loading: HTMLDivElement - readonly $notice: HTMLDivElement - readonly $noticeInner: HTMLDivElement - readonly $mask: HTMLDivElement - readonly $state: HTMLDivElement - readonly $setting: HTMLDivElement - readonly $info: HTMLDivElement - readonly $infoPanel: HTMLDivElement - readonly $infoClose: HTMLDivElement - readonly $contextmenu: HTMLDivElement -} - -export interface Subtitle { - /** - * The subtitle url - */ - url?: string - - /** - * The subtitle name - */ - name?: string - - /** - * The subtitle type - */ - type?: 'vtt' | 'srt' | 'ass' | (string & Record) - - /** - * The subtitle style object - */ - style?: Partial - - /** - * The subtitle encoding, default utf-8 - */ - encoding?: string - - /** - * Whether use escape, default true - */ - escape?: boolean - - /** - * Change the vtt text - */ - onVttLoad?: (vtt: string) => string -} - -export interface SettingOption extends Omit { - html: string - icon: string | undefined - tooltip: string | undefined - $item: HTMLDivElement - $icon: HTMLDivElement | undefined - $html: HTMLDivElement - $tooltip: HTMLDivElement | undefined - $switch: HTMLDivElement | undefined - $range: HTMLInputElement | undefined - $parent: SettingOption | undefined - $parents: SettingOption[] - $option: SettingOption[] - $events: Array<() => void> - $formatted: boolean -} - -export interface Setting { - /** - * Html string or html element of setting name - */ - html: string | HTMLElement - - /** - * Html string or html element of setting icon - */ - icon?: string | HTMLElement - - /** - * The width of setting - */ - width?: number - - /** - * The tooltip of setting - */ - tooltip?: string | HTMLElement - - /** - * Whether the default is selected - */ - default?: boolean - - /** - * Custom selector list - */ - selector?: Setting[] - - /** - * When the setting was mounted - */ - mounted?: (this: Artplayer, panel: HTMLDivElement, item: Setting) => void - - /** - * When selector item click - */ - onSelect?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - - /** - * Custom switch item - */ - switch?: boolean - - /** - * When switch item click - */ - onSwitch?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - - /** - * Custom range item - */ - range?: [value?: number, min?: number, max?: number, step?: number] - - /** - * When range item change - */ - onRange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - - /** - * When range item change in real time - */ - onChange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - - /** - * When range item change in real time - */ - onClick?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - - /** - * Allow custom properties - */ - [key: string]: any -} - -export interface Quality { - /** - * Whether the default is selected - */ - default?: boolean - - /** - * Html string of quality - */ - html: string | HTMLElement - - /** - * Video quality url - */ - url: string -} - -export type PluginFactory = (this: Host, art: Host) => Result - -/** Augment this interface with installed plugin results; augmentation does not register a plugin. */ -export interface Plugins { - /** Legacy signature: synchronous factories return this registry; Promise factories return a Promise of it. */ - add: (plugin: PluginFactory) => Promise - [name: string]: unknown -} - -export type AspectRatio = 'default' | '4:3' | '16:9' | (`${number}:${number}` & Record) -export type PlaybackRate = 0.5 | 0.75 | 1.0 | 1.25 | 1.5 | 1.75 | 2.0 | (number & Record) -export type Flip = 'normal' | 'horizontal' | 'vertical' | (string & Record) -export type State = 'standard' | 'mini' | 'pip' | 'fullscreen' | 'fullscreenWeb' - -export declare class Player { - get aspectRatio(): AspectRatio - set aspectRatio(ratio: AspectRatio) - - get state(): State - set state(state: State) - - get type(): CustomType - set type(name: CustomType) - - get playbackRate(): PlaybackRate - set playbackRate(rate: PlaybackRate) - - get currentTime(): number - set currentTime(time: number) - - get duration(): number - get played(): number - get playing(): boolean - - get flip(): Flip - set flip(state: Flip) - - get fullscreen(): boolean - set fullscreen(state: boolean) - - get fullscreenWeb(): boolean - set fullscreenWeb(state: boolean) - - get loaded(): number - get loadedTime(): number - - get mini(): boolean - set mini(state: boolean) - - get pip(): boolean - set pip(state: boolean) - - get poster(): string - set poster(url: string) - - get rect(): DOMRect - get bottom(): number - get height(): number - get left(): number - get right(): number - get top(): number - get width(): number - get x(): number - get y(): number - - set seek(time: number) - get seek(): number - - set forward(time: number) - get forward(): number - - set backward(time: number) - get backward(): number - - get url(): string - set url(url: string) - - get volume(): number - set volume(percentage: number) - - get muted(): boolean - set muted(state: boolean) - - get theme(): string - set theme(theme: string) - - get subtitleOffset(): number - set subtitleOffset(time: number) - - get switch(): string - set switch(url: string) - - get quality(): Quality[] - set quality(quality: Quality[]) - - get thumbnails(): Thumbnails - set thumbnails(thumbnails: Thumbnails) - - pause(): void - play(): Promise - /** Legacy signature; runtime preserves pause's synchronous result or play's Promise. */ - toggle(): void - - attr(key: string, value?: unknown): unknown - cssVar(key: T, value?: CssVar[T]): CssVar[T] - - switchUrl(url: string): Promise - switchQuality(url: string): Promise - - getDataURL(): Promise - getBlobUrl(): Promise - screenshot(name?: string): Promise - - airplay(): void - autoSize(): void - autoHeight(): void - reset(): void -} - -/** Accurate playback method view; assign an existing player without a runtime wrapper. */ -export interface PlaybackControls { - play: () => Promise - pause: () => void - toggle: () => Promise | void -} - -export type CustomType - = | 'flv' - | 'm3u8' - | 'hls' - | 'ts' - | 'mpd' - | 'torrent' - | (string & Record) - -export interface Thumbnails { - /** - * The thumbnail image url - */ - url: string - - /** - * The thumbnail item number - */ - number?: number - - /** - * The thumbnail column size - */ - column?: number - - /** - * The thumbnail width - */ - width?: number - - /** - * The thumbnail height - */ - height?: number - - /** - * The thumbnail scale - */ - scale?: number -} - -/** Constructor input; Option retains its historical required URL/read types. */ -export interface OptionInput extends Omit { - url?: string - controls?: ComponentInput[] - layers?: ComponentInput[] - contextmenu?: ComponentInput[] -} - -export interface Option { - /** - * The player id - */ - id?: string - - /** - * The container mounted by the player - */ - container: string | HTMLDivElement - - /** - * Video url - */ - url: string - - /** - * Video poster image url - */ - poster?: string - - /** - * Video url type - */ - type?: CustomType - - /** - * Player color theme - */ - theme?: string - - /** - * Player language - */ - lang?: keyof I18n - - /** - * Player default volume - */ - volume?: number - - /** - * Whether live broadcast mode - */ - isLive?: boolean - - /** - * Whether video muted - */ - muted?: boolean - - /** - * Whether video auto play - */ - autoplay?: boolean - - /** - * Whether player auto resize - */ - autoSize?: boolean - - /** - * Whether player auto run mini mode - */ - autoMini?: boolean - - /** - * Whether video auto loop - */ - loop?: boolean - - /** - * Whether show video flip button - */ - flip?: boolean - - /** - * Whether show video playback rate button - */ - playbackRate?: boolean - - /** - * Whether show video aspect ratio button - */ - aspectRatio?: boolean - - /** - * Whether show video screenshot button - */ - screenshot?: boolean - - /** - * Whether show video setting button - */ - setting?: boolean - - /** - * Whether to enable player hotkey - */ - hotkey?: boolean - - /** - * Whether show video pip button - */ - pip?: boolean - - /** - * Do you want to run only one player at a time - */ - mutex?: boolean - - /** - * Whether use backdrop in UI - */ - backdrop?: boolean - - /** - * Whether show video window fullscreen button - */ - fullscreen?: boolean - - /** - * Whether show video web fullscreen button - */ - fullscreenWeb?: boolean - - /** - * Whether to enable player subtitle offset - */ - subtitleOffset?: boolean - - /** - * Whether to enable player mini progress bar - */ - miniProgressBar?: boolean - - /** - * Whether use SSR function - */ - useSSR?: boolean - - /** - * Whether use playsInline in mobile - */ - playsInline?: boolean - - /** - * Whether use lock in mobile - */ - lock?: boolean - - /** - * Whether use gesture in mobile - */ - gesture?: boolean - - /** - * Whether use fast forward in mobile - */ - fastForward?: boolean - - /** - * Whether use auto playback - */ - autoPlayback?: boolean - - /** - * Whether use auto orientation in mobile - */ - autoOrientation?: boolean - - /** - * Whether use airplay - */ - airplay?: boolean - - /** - * Custom video proxy - */ - proxy?: (this: Artplayer, art: Artplayer) => HTMLCanvasElement | HTMLVideoElement | undefined - - /** - * Custom plugin list - */ - plugins?: PluginFactory[] - - /** - * Custom layer list - */ - layers?: ComponentOption[] - - /** - * Custom contextmenu list - */ - contextmenu?: ComponentOption[] - - /** - * Custom control list - */ - controls?: ComponentOption[] - - /** - * Custom setting list - */ - settings?: Setting[] - - /** - * Custom video quality list - */ - quality?: Quality[] - - /** - * Custom highlight list - */ - highlight?: { + export interface Selector { /** - * The highlight time + * Whether the default is selected */ - time: number - + default?: boolean /** - * The highlight text + * Html string of selector */ - text: string - }[] - - /** - * Custom thumbnail - */ - thumbnails?: Thumbnails - - /** - * Custom subtitle option - */ - subtitle?: Subtitle - - /** - * Other video attribute - */ - moreVideoAttr?: Partial unknown - ? never - : K]: HTMLVideoElement[K] - }>> - - /** - * Custom i18n - */ - i18n?: I18n - - /** - * Custom default icons - */ - icons?: { - [key in keyof Icons]?: HTMLElement | string + html: string | HTMLElement + /** + * Value of selector item + */ + value?: string | number + /** + * Allow custom properties + */ + [key: string]: any } - - /** - * Custom css variables - */ - cssVar?: Partial - - /** - * Custom video type function - */ - customType?: Partial< - Record< - CustomType, - (this: Artplayer, video: HTMLVideoElement, url: string, art: Artplayer) => unknown | Promise - > - > -} - -export interface Icons { - readonly loading: HTMLDivElement - readonly state: HTMLDivElement - readonly play: HTMLDivElement - readonly pause: HTMLDivElement - readonly check: HTMLDivElement - readonly volume: HTMLDivElement - readonly volumeClose: HTMLDivElement - readonly screenshot: HTMLDivElement - readonly setting: HTMLDivElement - readonly pip: HTMLDivElement - readonly arrowLeft: HTMLDivElement - readonly arrowRight: HTMLDivElement - readonly playbackRate: HTMLDivElement - readonly aspectRatio: HTMLDivElement - readonly config: HTMLDivElement - readonly lock: HTMLDivElement - readonly flip: HTMLDivElement - readonly unlock: HTMLDivElement - readonly fullscreenOff: HTMLDivElement - readonly fullscreenOn: HTMLDivElement - readonly fullscreenWebOff: HTMLDivElement - readonly fullscreenWebOn: HTMLDivElement - readonly switchOn: HTMLDivElement - readonly switchOff: HTMLDivElement - readonly error: HTMLDivElement - readonly close: HTMLDivElement - readonly airplay: HTMLDivElement - readonly [key: string]: HTMLDivElement -} - -type I18nKeys - = | 'en' - | 'zh-cn' - | 'zh-tw' - | 'pl' - | 'cs' - | 'es' - | 'fa' - | 'fr' - | 'id' - | 'ru' - | 'tr' - | 'ar' - | 'vi' - | (string & Record) - -interface I18nValue { - 'Video Info': string - 'Close': string - 'Video Load Failed': string - 'Volume': string - 'Play': string - 'Pause': string - 'Rate': string - 'Mute': string - 'Video Flip': string - 'Horizontal': string - 'Vertical': string - 'Reconnect': string - 'Show Setting': string - 'Hide Setting': string - 'Screenshot': string - 'Play Speed': string - 'Aspect Ratio': string - 'Default': string - 'Normal': string - 'Open': string - 'Switch Video': string - 'Switch Subtitle': string - 'Fullscreen': string - 'Exit Fullscreen': string - 'Web Fullscreen': string - 'Exit Web Fullscreen': string - 'Mini Player': string - 'PIP Mode': string - 'Exit PIP Mode': string - 'PIP Not Supported': string - 'Fullscreen Not Supported': string - 'Subtitle Offset': string - 'Last Seen': string - 'Jump Play': string - 'AirPlay': string - 'AirPlay Not Available': string -} - -export type I18n = Partial>> - -export type Bar = 'loaded' | 'played' | 'hover' - -/** Actual built-in subtitle update payloads; legacy Events keeps its scalar types. */ -export interface SubtitleUpdateEvents { - subtitleBeforeUpdate: [cues: VTTCue[]] - subtitleAfterUpdate: [cues: VTTCue[]] -} - -export interface Events { - 'document:click': [event: Event] - 'document:mouseup': [event: Event] - 'document:keydown': [event: Event] - 'document:touchend': [event: Event] - 'document:touchmove': [event: Event] - 'document:mousemove': [event: Event] - 'document:pointerup': [event: Event] - 'document:contextmenu': [event: Event] - 'document:pointermove': [event: Event] - 'document:visibilitychange': [event: Event] - 'document:webkitfullscreenchange': [event: Event] - - 'window:resize': [event: Event] - 'window:scroll': [event: Event] - 'window:orientationchange': [event: Event] - - 'video:abort': [event: Event] - 'video:canplay': [event: Event] - 'video:canplaythrough': [event: Event] - 'video:complete': [event: Event] - 'video:durationchange': [event: Event] - 'video:emptied': [event: Event] - 'video:encrypted': [event: Event] - 'video:ended': [event: Event] - 'video:error': [error: Error] - 'video:loadeddata': [event: Event] - 'video:loadedmetadata': [event: Event] - 'video:loadstart': [event: Event] - 'video:pause': [event: Event] - 'video:play': [event: Event] - 'video:playing': [event: Event] - 'video:progress': [event: Event] - 'video:ratechange': [event: Event] - 'video:seeked': [event: Event] - 'video:seeking': [event: Event] - 'video:stalled': [event: Event] - 'video:suspend': [event: Event] - 'video:timeupdate': [event: Event] - 'video:volumechange': [event: Event] - 'video:waiting': [event: Event] - - 'info': [state: boolean] - 'layer': [state: boolean] - 'loading': [state: boolean] - 'mask': [state: boolean] - 'subtitle': [state: boolean] - 'contextmenu': [state: boolean] - 'control': [state: boolean] - 'setting': [state: boolean] - 'hotkey': [event: KeyboardEvent] - - 'destroy': [] - - 'subtitleOffset': [offset: number] - /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ - 'subtitleBeforeUpdate': [cue: VTTCue] - /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ - 'subtitleAfterUpdate': [cue: VTTCue] - 'subtitleLoad': [cues: VTTCue[], option: Subtitle] - - 'focus': [event: Event] - 'blur': [event: Event] - 'dblclick': [event: Event] - 'click': [event: Event] - 'hover': [state: boolean, event: Event] - 'mousemove': [event: Event] - - 'resize': [] - 'view': [state: boolean] - 'lock': [state: boolean] - 'aspectRatio': [aspectRatio: AspectRatio] - 'autoHeight': [height: number] - 'autoSize': [size: { width: number, height: number }] - 'ready': [] - 'airplay': [] - 'raf': [] - - 'error': [error: Error, reconnectTime: number] - 'flip': [flip: Flip] - 'fullscreen': [state: boolean] - 'fullscreenError': [event: Event] - 'fullscreenWeb': [state: boolean] - 'mini': [state: boolean] - 'pause': [] - 'pip': [state: boolean] - 'play': [] - 'screenshot': [dataUri: string] - 'seek': [currentTime: number, time: number] - 'restart': [url: string] - 'muted': [state: boolean] - 'setBar': [type: Bar, percentage: number, event?: Event | undefined] - 'keydown': [event: KeyboardEvent] -} - -/** The event bus exposed by Artplayer.Emitter; no new runtime export. */ -export interface Emitter> { - e?: { [Name in keyof Events]?: { fn: (...args: [...Events[Name]]) => unknown, ctx: unknown }[] } - on: (name: Name, fn: (this: Context, ...args: [...Events[Name]]) => unknown, ctx?: Context) => this - once: (name: Name, fn: (this: Context, ...args: [...Events[Name]]) => unknown, ctx?: Context) => this - emit: (name: Name, ...args: [...Events[Name]]) => this - off: (name: Name, fn?: (...args: [...Events[Name]]) => unknown) => this -} - -export interface CssVar { - '--art-theme': string - '--art-font-color': string - '--art-background-color': string - '--art-text-shadow-color': string - '--art-transition-duration': string - '--art-padding': string - '--art-border-radius': string - '--art-progress-height': string - '--art-progress-color': string - '--art-progress-top-gap': string - '--art-hover-color': string - '--art-loaded-color': string - '--art-state-size': string - '--art-state-opacity': number - '--art-bottom-height': string - '--art-bottom-offset': string - '--art-bottom-gap': string - '--art-highlight-width': string - '--art-highlight-color': string - '--art-control-height': string - '--art-control-opacity': number - '--art-control-icon-size': string - '--art-control-icon-scale': number - '--art-volume-height': string - '--art-volume-handle-size': string - '--art-lock-size': string - '--art-indicator-scale': number - '--art-indicator-size': string - '--art-fullscreen-web-index': 9999 - '--art-settings-icon-size': string - '--art-settings-max-height': string - '--art-selector-max-height': string - '--art-contextmenus-min-width': string - '--art-subtitle-font-size': string - '--art-subtitle-gap': string - '--art-subtitle-bottom': string - '--art-subtitle-border': string - '--art-widget-background': string - '--art-tip-background': string - '--art-scrollbar-size': string - '--art-scrollbar-background': string - '--art-scrollbar-background-hover': string - '--art-mini-progress-height': string -} - -export interface Config { - readonly properties: readonly [ - 'audioTracks', - 'autoplay', - 'buffered', - 'controller', - 'controls', - 'crossOrigin', - 'currentSrc', - 'currentTime', - 'defaultMuted', - 'defaultPlaybackRate', - 'duration', - 'ended', - 'error', - 'loop', - 'mediaGroup', - 'muted', - 'networkState', - 'paused', - 'playbackRate', - 'played', - 'preload', - 'readyState', - 'seekable', - 'seeking', - 'src', - 'startDate', - 'textTracks', - 'videoTracks', - 'volume', - ] - readonly methods: readonly ['addTextTrack', 'canPlayType', 'load', 'play', 'pause'] - readonly events: readonly [ - 'abort', - 'canplay', - 'canplaythrough', - 'durationchange', - 'emptied', - 'ended', - 'error', - 'loadeddata', - 'loadedmetadata', - 'loadstart', - 'pause', - 'play', - 'playing', - 'progress', - 'ratechange', - 'seeked', - 'seeking', - 'stalled', - 'suspend', - 'timeupdate', - 'volumechange', - 'waiting', - ] - readonly prototypes: readonly [ - 'width', - 'height', - 'videoWidth', - 'videoHeight', - 'poster', - 'webkitDecodedFrameCount', - 'webkitDroppedFrameCount', - 'playsInline', - 'webkitSupportsFullscreen', - 'webkitDisplayingFullscreen', - 'onenterpictureinpicture', - 'onleavepictureinpicture', - 'disablePictureInPicture', - 'cancelVideoFrameCallback', - 'requestVideoFrameCallback', - 'getVideoPlaybackQuality', - 'requestPictureInPicture', - 'webkitEnterFullScreen', - 'webkitEnterFullscreen', - 'webkitExitFullScreen', - 'webkitExitFullscreen', - ] -} - -/** Input accepted by the existing HTML renderer, including numeric content. */ -export interface ComponentInput extends Omit { - html?: string | HTMLElement | number -} - -export interface Selector { - /** - * Whether the default is selected - */ - default?: boolean - - /** - * Html string of selector - */ - html: string | HTMLElement - - /** - * Value of selector item - */ - value?: string | number - - /** - * Allow custom properties - */ - [key: string]: any -} - -export interface Component { - /** - * Component self-increasing id - */ - readonly id: number - - /** - * Component parent name - */ - readonly name: string | undefined - - /** - * Component parent element - */ - readonly $parent: HTMLElement | undefined - - /** - * Whether to show component parent - */ - get show(): boolean - - /** - * Whether to show component parent - */ - set show(state: boolean) - - /** - * Toggle the component parent - */ - toggle: () => void - - /** - * Dynamic add a component - */ - add: { - (option: ComponentOption | ((art: Artplayer) => ComponentOption)): HTMLElement | undefined - (option: ComponentInput | ((art: Artplayer) => ComponentInput)): HTMLElement | undefined - } - - /** - * Dynamic remove a component by name - */ - remove: (name: string) => void - - /** - * Dynamic update a component - */ - update: { - (option: ComponentOption): HTMLElement | undefined - (option: ComponentInput): HTMLElement | undefined - } -} - -export interface ComponentOption { - /** - * Html string or html element of component - */ - html?: string | HTMLElement - - /** - * Whether to disable component - */ - disable?: boolean - - /** - * Unique name for component - */ - name?: string - - /** - * Component sort index - */ - index?: number - - /** - * Component style object - */ - style?: Partial - - /** - * Component click event - */ - click?: (this: Artplayer, component: Component, event: Event) => void - - /** - * When the component was mounted - */ - mounted?: (this: Artplayer, element: HTMLElement) => void - - /** - * When the component was before unmount - */ - beforeUnmount?: (this: Artplayer, element: HTMLElement) => void - - /** - * Component tooltip, use in controls - */ - tooltip?: string - - /** - * Component position, use in controls - */ - position?: 'top' | 'left' | 'right' | (string & Record) - - /** - * Custom selector list, use in controls - */ - selector?: Selector[] - - /** - * When selector item click, use in controls - */ - onSelect?: (this: Artplayer, selector: Selector, element: HTMLElement, event: Event) => void -} - -export type { - Config, - Emitter, - Events, - I18n, - Icons, - Option, - OptionInput, - PlaybackControls, - Player, - PluginFactory, - Plugins, - Setting, - SettingOption, - Subtitle, - SubtitleUpdateEvents, - Template, - Utils, -} - -export default class Artplayer extends Player { - constructor(option: Option, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) - constructor(option: OptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) - - static readonly instances: Artplayer[] - static readonly version: string - static readonly env: 'development' | 'production' - static readonly build: string - static readonly config: Config - static readonly utils: Utils - static readonly scheme: Record - static readonly Emitter: new >(...args: unknown[]) => Emitter - static readonly validator: (option: T, scheme: object) => T - static readonly kindOf: (item: unknown) => string - static readonly html: Artplayer['template']['html'] - static readonly option: Option - - static STYLE: string - static DEBUG: boolean - static CONTEXTMENU: boolean - static NOTICE_TIME: number - static SETTING_WIDTH: number - static SETTING_ITEM_WIDTH: number - static SETTING_ITEM_HEIGHT: number - static RESIZE_TIME: number - static SCROLL_TIME: number - static SCROLL_GAP: number - static AUTO_PLAYBACK_MAX: number - static AUTO_PLAYBACK_MIN: number - static AUTO_PLAYBACK_TIMEOUT: number - static RECONNECT_TIME_MAX: number - static RECONNECT_SLEEP_TIME: number - static CONTROL_HIDE_TIME: number - static DBCLICK_TIME: number - static DBCLICK_FULLSCREEN: boolean - static MOBILE_DBCLICK_PLAY: boolean - static MOBILE_CLICK_PLAY: boolean - static AUTO_ORIENTATION_TIME: number - static INFO_LOOP_TIME: number - static FAST_FORWARD_VALUE: number - static FAST_FORWARD_TIME: number - static TOUCH_MOVE_RATIO: number - static VOLUME_STEP: number - static SEEK_STEP: number - static PLAYBACK_RATE: number[] - static ASPECT_RATIO: string[] - static FLIP: string[] - static FULLSCREEN_WEB_IN_BODY: boolean - static LOG_VERSION: boolean - static USE_RAF: boolean - static REMOVE_SRC_WHEN_DESTROY: boolean - - readonly id: number - readonly option: Option - readonly isLock: boolean - readonly isReady: boolean - readonly isFocus: boolean - readonly isInput: boolean - readonly isRotate: boolean - readonly isDestroy: boolean - - flv?: unknown - m3u8?: unknown - hls?: unknown - ts?: unknown - mpd?: unknown - torrent?: unknown - - on(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this - on(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this - on(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this - - once(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this - once(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this - once(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this - - emit(name: T, ...args: Events[T]): this - emit(name: T, ...args: SubtitleUpdateEvents[T]): this - emit(name: string, ...args: unknown[]): this - - off(name: T, callback?: (...args: Events[T]) => unknown): this - off(name: T, callback?: (...args: SubtitleUpdateEvents[T]) => unknown): this - off(name: string, callback?: (...args: unknown[]) => unknown): this - - query: Artplayer['template']['query'] - proxy: Artplayer['events']['proxy'] - video: Artplayer['template']['$video'] - - e: { [K in keyof Events]?: { fn: (...args: Events[K]) => unknown, ctx: unknown }[] } - - destroy(removeHtml?: boolean): void - reset(): void - - readonly template: { - get html(): string - query: (selector: string) => T | null - } & Template - - readonly events: { - proxy: { - (target: EventTarget, eventName: string, handler: (event: Event) => void, options?: boolean | AddEventListenerOptions): () => void - (target: EventTarget, eventName: string[], handler: (event: Event) => void, options?: boolean | AddEventListenerOptions): Array<() => void> + export interface Component { + /** + * Component self-increasing id + */ + readonly id: number + /** + * Component parent name + */ + readonly name: string | undefined + /** + * Component parent element + */ + readonly $parent: HTMLElement | undefined + /** + * Whether to show component parent + */ + get show(): boolean + /** + * Whether to show component parent + */ + set show(state: boolean) + /** + * Toggle the component parent + */ + toggle: () => void + /** + * Dynamic add a component + */ + add: { + (option: ComponentOption | ((art: Artplayer) => ComponentOption)): HTMLElement | undefined + (option: ComponentInput | ((art: Artplayer) => ComponentInput)): HTMLElement | undefined } - hover: (element: HTMLElement, mouseenter?: (event: Event) => any, mouseleave?: (event: Event) => any) => void - remove: (destroyEvent: () => void) => void - destroy: () => void - bindGlobalEvents: (source?: { window?: Window, document?: Document }) => void - } - - readonly storage: { - name: string - settings: Record - get: { - (key: string): unknown - (): Record + /** + * Dynamic remove a component by name + */ + remove: (name: string) => void + /** + * Dynamic update a component + */ + update: { + (option: ComponentOption): HTMLElement | undefined + (option: ComponentInput): HTMLElement | undefined } - set: (key: string, value: unknown) => void - del: (key: string) => void - clear: () => void } - - readonly icons: Icons - - readonly i18n: { - languages: I18n - language: Partial> - init: () => void - get: (key: string) => string - update: (language: Partial) => void + export interface ComponentOption { + /** + * Html string or html element of component + */ + html?: string | HTMLElement + /** + * Whether to disable component + */ + disable?: boolean + /** + * Unique name for component + */ + name?: string + /** + * Component sort index + */ + index?: number + /** + * Component style object + */ + style?: Partial + /** + * Component click event + */ + click?: (this: Artplayer, component: Component, event: Event) => void + /** + * When the component was mounted + */ + mounted?: (this: Artplayer, element: HTMLElement) => void + /** + * When the component was before unmount + */ + beforeUnmount?: (this: Artplayer, element: HTMLElement) => void + /** + * Component tooltip, use in controls + */ + tooltip?: string + /** + * Component position, use in controls + */ + position?: 'top' | 'left' | 'right' | (string & Record) + /** + * Custom selector list, use in controls + */ + selector?: Selector[] + /** + * When selector item click, use in controls + */ + onSelect?: (this: Artplayer, selector: Selector, element: HTMLElement, event: Event) => void } - - readonly notice: { - timer: number | null - get show(): string | Error | false | '' - set show(msg: string | Error | false | '') - destroy: () => void + export interface Config { + readonly properties: readonly [ + 'audioTracks', + 'autoplay', + 'buffered', + 'controller', + 'controls', + 'crossOrigin', + 'currentSrc', + 'currentTime', + 'defaultMuted', + 'defaultPlaybackRate', + 'duration', + 'ended', + 'error', + 'loop', + 'mediaGroup', + 'muted', + 'networkState', + 'paused', + 'playbackRate', + 'played', + 'preload', + 'readyState', + 'seekable', + 'seeking', + 'src', + 'startDate', + 'textTracks', + 'videoTracks', + 'volume', + ] + readonly methods: readonly [ + 'addTextTrack', + 'canPlayType', + 'load', + 'play', + 'pause', + ] + readonly events: readonly [ + 'abort', + 'canplay', + 'canplaythrough', + 'durationchange', + 'emptied', + 'ended', + 'error', + 'loadeddata', + 'loadedmetadata', + 'loadstart', + 'pause', + 'play', + 'playing', + 'progress', + 'ratechange', + 'seeked', + 'seeking', + 'stalled', + 'suspend', + 'timeupdate', + 'volumechange', + 'waiting', + ] + readonly prototypes: readonly [ + 'width', + 'height', + 'videoWidth', + 'videoHeight', + 'poster', + 'webkitDecodedFrameCount', + 'webkitDroppedFrameCount', + 'playsInline', + 'webkitSupportsFullscreen', + 'webkitDisplayingFullscreen', + 'onenterpictureinpicture', + 'onleavepictureinpicture', + 'disablePictureInPicture', + 'cancelVideoFrameCallback', + 'requestVideoFrameCallback', + 'getVideoPlaybackQuality', + 'requestPictureInPicture', + 'webkitEnterFullScreen', + 'webkitEnterFullscreen', + 'webkitExitFullScreen', + 'webkitExitFullscreen', + ] } - - readonly layers: Record & Component - readonly controls: Record & Component - readonly contextmenu: Record & Component - - readonly subtitle: { + /** The event bus exposed by Artplayer.Emitter; no new runtime export. */ + export interface Emitter> { + e?: { + [Name in keyof Events]?: { + fn: (...args: [ + ...Events[Name], + ]) => unknown + ctx: unknown + }[]; + } + on: (name: Name, fn: (this: Context, ...args: [ + ...Events[Name], + ]) => unknown, ctx?: Context) => this + once: (name: Name, fn: (this: Context, ...args: [ + ...Events[Name], + ]) => unknown, ctx?: Context) => this + emit: (name: Name, ...args: [ + ...Events[Name], + ]) => this + off: (name: Name, fn?: (...args: [ + ...Events[Name], + ]) => unknown) => this + } + export interface CssVar { + '--art-theme': string + '--art-font-color': string + '--art-background-color': string + '--art-text-shadow-color': string + '--art-transition-duration': string + '--art-padding': string + '--art-border-radius': string + '--art-progress-height': string + '--art-progress-color': string + '--art-progress-top-gap': string + '--art-hover-color': string + '--art-loaded-color': string + '--art-state-size': string + '--art-state-opacity': number + '--art-bottom-height': string + '--art-bottom-offset': string + '--art-bottom-gap': string + '--art-highlight-width': string + '--art-highlight-color': string + '--art-control-height': string + '--art-control-opacity': number + '--art-control-icon-size': string + '--art-control-icon-scale': number + '--art-volume-height': string + '--art-volume-handle-size': string + '--art-lock-size': string + '--art-indicator-scale': number + '--art-indicator-size': string + '--art-fullscreen-web-index': 9999 + '--art-settings-icon-size': string + '--art-settings-max-height': string + '--art-selector-max-height': string + '--art-contextmenus-min-width': string + '--art-subtitle-font-size': string + '--art-subtitle-gap': string + '--art-subtitle-bottom': string + '--art-subtitle-border': string + '--art-widget-background': string + '--art-tip-background': string + '--art-scrollbar-size': string + '--art-scrollbar-background': string + '--art-scrollbar-background-hover': string + '--art-mini-progress-height': string + } + export type I18nKeys = 'en' | 'zh-cn' | 'zh-tw' | 'pl' | 'cs' | 'es' | 'fa' | 'fr' | 'id' | 'ru' | 'tr' | 'ar' | 'vi' | (string & Record) + export interface I18nValue { + 'Video Info': string + 'Close': string + 'Video Load Failed': string + 'Volume': string + 'Play': string + 'Pause': string + 'Rate': string + 'Mute': string + 'Video Flip': string + 'Horizontal': string + 'Vertical': string + 'Reconnect': string + 'Show Setting': string + 'Hide Setting': string + 'Screenshot': string + 'Play Speed': string + 'Aspect Ratio': string + 'Default': string + 'Normal': string + 'Open': string + 'Switch Video': string + 'Switch Subtitle': string + 'Fullscreen': string + 'Exit Fullscreen': string + 'Web Fullscreen': string + 'Exit Web Fullscreen': string + 'Mini Player': string + 'PIP Mode': string + 'Exit PIP Mode': string + 'PIP Not Supported': string + 'Fullscreen Not Supported': string + 'Subtitle Offset': string + 'Last Seen': string + 'Jump Play': string + 'AirPlay': string + 'AirPlay Not Available': string + } + export type I18n = Partial>> + export interface Icons { + readonly loading: HTMLDivElement + readonly state: HTMLDivElement + readonly play: HTMLDivElement + readonly pause: HTMLDivElement + readonly check: HTMLDivElement + readonly volume: HTMLDivElement + readonly volumeClose: HTMLDivElement + readonly screenshot: HTMLDivElement + readonly setting: HTMLDivElement + readonly pip: HTMLDivElement + readonly arrowLeft: HTMLDivElement + readonly arrowRight: HTMLDivElement + readonly playbackRate: HTMLDivElement + readonly aspectRatio: HTMLDivElement + readonly config: HTMLDivElement + readonly lock: HTMLDivElement + readonly flip: HTMLDivElement + readonly unlock: HTMLDivElement + readonly fullscreenOff: HTMLDivElement + readonly fullscreenOn: HTMLDivElement + readonly fullscreenWebOff: HTMLDivElement + readonly fullscreenWebOn: HTMLDivElement + readonly switchOn: HTMLDivElement + readonly switchOff: HTMLDivElement + readonly error: HTMLDivElement + readonly close: HTMLDivElement + readonly airplay: HTMLDivElement + readonly [key: string]: HTMLDivElement + } + export type PluginFactory = (this: Host, art: Host) => Result + /** Augment this interface with installed plugin results; augmentation does not register a plugin. */ + export interface Plugins { + /** Legacy signature: synchronous factories return this registry; Promise factories return a Promise of it. */ + add: (plugin: PluginFactory) => Promise + [name: string]: unknown + } + export interface Quality { + /** + * Whether the default is selected + */ + default?: boolean + /** + * Html string of quality + */ + html: string | HTMLElement + /** + * Video quality url + */ + url: string + } + export interface SettingOption extends Omit { + html: string + icon: string | undefined + tooltip: string | undefined + $item: HTMLDivElement + $icon: HTMLDivElement | undefined + $html: HTMLDivElement + $tooltip: HTMLDivElement | undefined + $switch: HTMLDivElement | undefined + $range: HTMLInputElement | undefined + $parent: SettingOption | undefined + $parents: SettingOption[] + $option: SettingOption[] + $events: Array<() => void> + $formatted: boolean + } + export interface Setting { + /** + * Html string or html element of setting name + */ + html: string | HTMLElement + /** + * Html string or html element of setting icon + */ + icon?: string | HTMLElement + /** + * The width of setting + */ + width?: number + /** + * The tooltip of setting + */ + tooltip?: string | HTMLElement + /** + * Whether the default is selected + */ + default?: boolean + /** + * Custom selector list + */ + selector?: Setting[] + /** + * When the setting was mounted + */ + mounted?: (this: Artplayer, panel: HTMLDivElement, item: Setting) => void + /** + * When selector item click + */ + onSelect?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + /** + * Custom switch item + */ + switch?: boolean + /** + * When switch item click + */ + onSwitch?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + /** + * Custom range item + */ + range?: [ + value?: number, + min?: number, + max?: number, + step?: number, + ] + /** + * When range item change + */ + onRange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + /** + * When range item change in real time + */ + onChange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + /** + * When range item change in real time + */ + onClick?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + /** + * Allow custom properties + */ + [key: string]: any + } + export interface Subtitle { + /** + * The subtitle url + */ + url?: string + /** + * The subtitle name + */ + name?: string + /** + * The subtitle type + */ + type?: 'vtt' | 'srt' | 'ass' | (string & Record) + /** + * The subtitle style object + */ + style?: Partial + /** + * The subtitle encoding, default utf-8 + */ + encoding?: string + /** + * Whether use escape, default true + */ + escape?: boolean + /** + * Change the vtt text + */ + onVttLoad?: (vtt: string) => string + } + export type CustomType = 'flv' | 'm3u8' | 'hls' | 'ts' | 'mpd' | 'torrent' | (string & Record) + export interface Thumbnails { + /** + * The thumbnail image url + */ + url: string + /** + * The thumbnail item number + */ + number?: number + /** + * The thumbnail column size + */ + column?: number + /** + * The thumbnail width + */ + width?: number + /** + * The thumbnail height + */ + height?: number + /** + * The thumbnail scale + */ + scale?: number + } + /** Constructor input; Option retains its historical required URL/read types. */ + export interface OptionInput extends Omit { + url?: string + controls?: ComponentInput[] + layers?: ComponentInput[] + contextmenu?: ComponentInput[] + } + export interface Option$1 { + /** + * The player id + */ + id?: string + /** + * The container mounted by the player + */ + container: string | HTMLDivElement + /** + * Video url + */ + url: string + /** + * Video poster image url + */ + poster?: string + /** + * Video url type + */ + type?: CustomType + /** + * Player color theme + */ + theme?: string + /** + * Player language + */ + lang?: keyof I18n + /** + * Player default volume + */ + volume?: number + /** + * Whether live broadcast mode + */ + isLive?: boolean + /** + * Whether video muted + */ + muted?: boolean + /** + * Whether video auto play + */ + autoplay?: boolean + /** + * Whether player auto resize + */ + autoSize?: boolean + /** + * Whether player auto run mini mode + */ + autoMini?: boolean + /** + * Whether video auto loop + */ + loop?: boolean + /** + * Whether show video flip button + */ + flip?: boolean + /** + * Whether show video playback rate button + */ + playbackRate?: boolean + /** + * Whether show video aspect ratio button + */ + aspectRatio?: boolean + /** + * Whether show video screenshot button + */ + screenshot?: boolean + /** + * Whether show video setting button + */ + setting?: boolean + /** + * Whether to enable player hotkey + */ + hotkey?: boolean + /** + * Whether show video pip button + */ + pip?: boolean + /** + * Do you want to run only one player at a time + */ + mutex?: boolean + /** + * Whether use backdrop in UI + */ + backdrop?: boolean + /** + * Whether show video window fullscreen button + */ + fullscreen?: boolean + /** + * Whether show video web fullscreen button + */ + fullscreenWeb?: boolean + /** + * Whether to enable player subtitle offset + */ + subtitleOffset?: boolean + /** + * Whether to enable player mini progress bar + */ + miniProgressBar?: boolean + /** + * Whether use SSR function + */ + useSSR?: boolean + /** + * Whether use playsInline in mobile + */ + playsInline?: boolean + /** + * Whether use lock in mobile + */ + lock?: boolean + /** + * Whether use gesture in mobile + */ + gesture?: boolean + /** + * Whether use fast forward in mobile + */ + fastForward?: boolean + /** + * Whether use auto playback + */ + autoPlayback?: boolean + /** + * Whether use auto orientation in mobile + */ + autoOrientation?: boolean + /** + * Whether use airplay + */ + airplay?: boolean + /** + * Custom video proxy + */ + proxy?: (this: Artplayer, art: Artplayer) => HTMLCanvasElement | HTMLVideoElement | undefined + /** + * Custom plugin list + */ + plugins?: PluginFactory[] + /** + * Custom layer list + */ + layers?: ComponentOption[] + /** + * Custom contextmenu list + */ + contextmenu?: ComponentOption[] + /** + * Custom control list + */ + controls?: ComponentOption[] + /** + * Custom setting list + */ + settings?: Setting[] + /** + * Custom video quality list + */ + quality?: Quality[] + /** + * Custom highlight list + */ + highlight?: { + /** + * The highlight time + */ + time: number + /** + * The highlight text + */ + text: string + }[] + /** + * Custom thumbnail + */ + thumbnails?: Thumbnails + /** + * Custom subtitle option + */ + subtitle?: Subtitle + /** + * Other video attribute + */ + moreVideoAttr?: Partial unknown ? never : K]: HTMLVideoElement[K]; + }>> + /** + * Custom i18n + */ + i18n?: I18n + /** + * Custom default icons + */ + icons?: { + [key in keyof Icons]?: HTMLElement | string; + } + /** + * Custom css variables + */ + cssVar?: Partial + /** + * Custom video type function + */ + customType?: Partial unknown | Promise>> + } + export type AspectRatio = 'default' | '4:3' | '16:9' | (`${number}:${number}` & Record) + export type PlaybackRate = 0.5 | 0.75 | 1 | 1.25 | 1.5 | 1.75 | 2 | (number & Record) + export type Flip = 'normal' | 'horizontal' | 'vertical' | (string & Record) + export type State = 'standard' | 'mini' | 'pip' | 'fullscreen' | 'fullscreenWeb' + export class Player { + get aspectRatio(): AspectRatio + set aspectRatio(ratio: AspectRatio) + get state(): State + set state(state: State) + get type(): CustomType + set type(name: CustomType) + get playbackRate(): PlaybackRate + set playbackRate(rate: PlaybackRate) + get currentTime(): number + set currentTime(time: number) + get duration(): number + get played(): number + get playing(): boolean + get flip(): Flip + set flip(state: Flip) + get fullscreen(): boolean + set fullscreen(state: boolean) + get fullscreenWeb(): boolean + set fullscreenWeb(state: boolean) + get loaded(): number + get loadedTime(): number + get mini(): boolean + set mini(state: boolean) + get pip(): boolean + set pip(state: boolean) + get poster(): string + set poster(url: string) + get rect(): DOMRect + get bottom(): number + get height(): number + get left(): number + get right(): number + get top(): number + get width(): number + get x(): number + get y(): number + set seek(time: number) + get seek(): number + set forward(time: number) + get forward(): number + set backward(time: number) + get backward(): number get url(): string set url(url: string) - get textTrack(): TextTrack | undefined - get activeCues(): VTTCue[] - get cues(): VTTCue[] - style: (name: string | Partial, value?: string) => void - switch: (url: string, option?: Subtitle) => Promise - init: (subtitle: Subtitle) => Promise - } & Component - - readonly info: Component - readonly loading: Component - - readonly hotkey: { - keys: Record any)[]> - add: (key: string, callback: (this: Artplayer, event: KeyboardEvent) => any) => Artplayer['hotkey'] - remove: (key: string, callback: (event: KeyboardEvent) => any) => Artplayer['hotkey'] + get volume(): number + set volume(percentage: number) + get muted(): boolean + set muted(state: boolean) + get theme(): string + set theme(theme: string) + get subtitleOffset(): number + set subtitleOffset(time: number) + get switch(): string + set switch(url: string) + get quality(): Quality[] + set quality(quality: Quality[]) + get thumbnails(): Thumbnails + set thumbnails(thumbnails: Thumbnails) + pause(): void + play(): Promise + /** Legacy signature; runtime preserves pause's synchronous result or play's Promise. */ + toggle(): void + attr(key: string, value?: unknown): unknown + cssVar(key: T, value?: CssVar[T]): CssVar[T] + switchUrl(url: string): Promise + switchQuality(url: string): Promise + getDataURL(): Promise + getBlobUrl(): Promise + screenshot(name?: string): Promise + airplay(): void + autoSize(): void + autoHeight(): void + reset(): void } + export type Bar = 'loaded' | 'played' | 'hover' + /** Actual built-in subtitle update payloads; legacy Events keeps its scalar types. */ + export interface SubtitleUpdateEvents { + subtitleBeforeUpdate: [ + cues: VTTCue[], + ] + subtitleAfterUpdate: [ + cues: VTTCue[], + ] + } + export interface Events { + 'document:click': [ + event: Event, + ] + 'document:mouseup': [ + event: Event, + ] + 'document:keydown': [ + event: Event, + ] + 'document:touchend': [ + event: Event, + ] + 'document:touchcancel': [ + event: Event, + ] + 'document:touchmove': [ + event: Event, + ] + 'document:mousemove': [ + event: Event, + ] + 'document:pointerup': [ + event: Event, + ] + 'document:contextmenu': [ + event: Event, + ] + 'document:pointermove': [ + event: Event, + ] + 'document:visibilitychange': [ + event: Event, + ] + 'document:webkitfullscreenchange': [ + event: Event, + ] + 'window:resize': [ + event: Event, + ] + 'window:scroll': [ + event: Event, + ] + 'window:orientationchange': [ + event: Event, + ] + 'video:abort': [ + event: Event, + ] + 'video:canplay': [ + event: Event, + ] + 'video:canplaythrough': [ + event: Event, + ] + 'video:complete': [ + event: Event, + ] + 'video:durationchange': [ + event: Event, + ] + 'video:emptied': [ + event: Event, + ] + 'video:encrypted': [ + event: Event, + ] + 'video:ended': [ + event: Event, + ] + 'video:error': [ + error: Error, + ] + 'video:loadeddata': [ + event: Event, + ] + 'video:loadedmetadata': [ + event: Event, + ] + 'video:loadstart': [ + event: Event, + ] + 'video:pause': [ + event: Event, + ] + 'video:play': [ + event: Event, + ] + 'video:playing': [ + event: Event, + ] + 'video:progress': [ + event: Event, + ] + 'video:ratechange': [ + event: Event, + ] + 'video:seeked': [ + event: Event, + ] + 'video:seeking': [ + event: Event, + ] + 'video:stalled': [ + event: Event, + ] + 'video:suspend': [ + event: Event, + ] + 'video:timeupdate': [ + event: Event, + ] + 'video:volumechange': [ + event: Event, + ] + 'video:waiting': [ + event: Event, + ] + 'info': [ + state: boolean, + ] + 'layer': [ + state: boolean, + ] + 'loading': [ + state: boolean, + ] + 'mask': [ + state: boolean, + ] + 'subtitle': [ + state: boolean, + ] + 'contextmenu': [ + state: boolean, + ] + 'control': [ + state: boolean, + ] + 'setting': [ + state: boolean, + ] + 'hotkey': [ + event: KeyboardEvent, + ] + 'destroy': [ + ] + 'subtitleOffset': [ + offset: number, + ] + /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ + 'subtitleBeforeUpdate': [ + cue: VTTCue, + ] + /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ + 'subtitleAfterUpdate': [ + cue: VTTCue, + ] + 'subtitleLoad': [ + cues: VTTCue[], + option: Subtitle, + ] + 'focus': [ + event: Event, + ] + 'blur': [ + event: Event, + ] + 'dblclick': [ + event: Event, + ] + 'click': [ + event: Event, + ] + 'hover': [ + state: boolean, + event: Event, + ] + 'mousemove': [ + event: Event, + ] + 'resize': [ + ] + 'view': [ + state: boolean, + ] + 'lock': [ + state: boolean, + ] + 'aspectRatio': [ + aspectRatio: AspectRatio, + ] + 'autoHeight': [ + height: number, + ] + 'autoSize': [ + size: { + width: number + height: number + }, + ] + 'ready': [ + ] + 'airplay': [ + ] + 'raf': [ + ] + 'error': [ + error: Error, + reconnectTime: number, + ] + 'flip': [ + flip: Flip, + ] + 'fullscreen': [ + state: boolean, + ] + 'fullscreenError': [ + event: Event, + ] + 'fullscreenWeb': [ + state: boolean, + ] + 'mini': [ + state: boolean, + ] + 'pause': [ + ] + 'pip': [ + state: boolean, + ] + 'play': [ + ] + 'screenshot': [ + dataUri: string, + ] + 'seek': [ + currentTime: number, + time: number, + ] + 'restart': [ + url: string, + ] + 'muted': [ + state: boolean, + ] + 'setBar': [ + type: Bar, + percentage: number, + event?: Event | undefined, + ] + 'keydown': [ + event: KeyboardEvent, + ] + } + /** Accurate playback method view; assign an existing player without a runtime wrapper. */ + export interface PlaybackControls { + play: () => Promise + pause: () => void + toggle: () => Promise | void + } + export interface Template { + readonly html: string + readonly $container: HTMLDivElement + readonly $player: HTMLDivElement + readonly $video: HTMLVideoElement + readonly $track: HTMLTrackElement + readonly $poster: HTMLDivElement + readonly $subtitle: HTMLDivElement + readonly $danmuku: HTMLDivElement + readonly $bottom: HTMLDivElement + readonly $progress: HTMLDivElement + readonly $controls: HTMLDivElement + readonly $controlsLeft: HTMLDivElement + readonly $controlsCenter: HTMLDivElement + readonly $controlsRight: HTMLDivElement + readonly $layer: HTMLDivElement + readonly $loading: HTMLDivElement + readonly $notice: HTMLDivElement + readonly $noticeInner: HTMLDivElement + readonly $mask: HTMLDivElement + readonly $state: HTMLDivElement + readonly $setting: HTMLDivElement + readonly $info: HTMLDivElement + readonly $infoPanel: HTMLDivElement + readonly $infoClose: HTMLDivElement + readonly $contextmenu: HTMLDivElement + } + export interface Utils { + isBrowser: boolean + userAgent: string + isMobile: boolean + isSafari: boolean + isIOS: boolean + isIOS13: boolean + query: (selector: string, parent?: Document | HTMLElement) => T | null + queryAll: (selector: string, parent?: Document | HTMLElement) => T[] + addClass: (target: HTMLElement, className: string) => void + removeClass: (target: HTMLElement, className: string) => void + hasClass: (target: HTMLElement, className: string) => boolean + append: (target: HTMLElement, child: HTMLElement | string) => Element | ChildNode + remove: (target: HTMLElement) => HTMLElement + replaceElement: (newChild: HTMLElement, oldChild: HTMLElement) => HTMLElement + siblings: (target: HTMLElement) => HTMLElement[] + inverseClass: (target: HTMLElement, className: string) => void + createElement: (tag: K) => HTMLElementTagNameMap[K] + setStyle: (element: HTMLElement, key: T, value: string | CSSStyleDeclaration[T]) => HTMLElement + setStyles: (element: HTMLElement, styles: Partial) => HTMLElement + getStyle: { + (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType?: true): number + (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType: false): string + } + setStyleText: (id: string, cssText: string) => void + getRect: (el: HTMLElement) => { + top: number + left: number + width: number + height: number + } + tooltip: (target: HTMLElement, msg: string, pos?: string) => void + isInViewport: (target: HTMLElement, offset?: number) => boolean + includeFromEvent: (event: Event, target: HTMLElement) => boolean + getSafeAreaInsets: () => { + top: number + right: number + bottom: number + left: number + } + srtToVtt: (srtText: string) => string + vttToBlob: (vttText: string) => string + assToVtt: (assText: string) => string + getExt: (url: string) => string + download: (url: string, name: string) => void + loadImg: (url: string, scale?: number) => Promise + errorHandle: (condition: T, msg: string) => T extends true ? T : never + silencePromise: (value: T) => T extends Promise ? Promise : T + def: { + /** Historical string-key signature; runtime returns obj. */ + (obj: object, name: string, value: unknown): void + (obj: T, name: PropertyKey, value: PropertyDescriptor & ThisType): T + } + has: (obj: object, name: PropertyKey) => boolean + get: (obj: object, name: PropertyKey) => PropertyDescriptor | undefined + mergeDeep: (...args: T) => T[number] + sleep: (ms?: number) => Promise + /** Historical return type; runtime discards the callback result and ignores context. */ + debounce: any>(func: F, wait: number, context?: object) => (...args: Parameters) => ReturnType + /** Historical return type; runtime discards the callback result. */ + throttle: any>(func: F, wait: number) => (...args: Parameters) => ReturnType + clamp: (num: number, a: number, b: number) => number + secondToTime: (second: number) => string + escape: (str: string) => string + unescape: (str: string) => string + capitalize: (str: string) => string + ArtPlayerError: new (message?: string, context?: ((...args: never[]) => unknown) | (abstract new (...args: never[]) => object)) => Error + getIcon: (key?: string, html?: string | HTMLElement) => HTMLElement + getComposedPath: (event: Event) => EventTarget[] + supportsFlex: () => boolean + } + export class Artplayer extends Player { + constructor(option: Option$1, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) + constructor(option: OptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) + static readonly instances: Artplayer[] + static readonly version: string + static readonly env: 'development' | 'production' + static readonly build: string + static readonly config: Config + static readonly utils: Utils + static readonly scheme: Record + static readonly Emitter: new >(...args: unknown[]) => Emitter - readonly mask: Component + static readonly validator: (option: T, scheme: object) => T + static readonly kindOf: (item: unknown) => string + static readonly html: Artplayer['template']['html'] + static readonly option: Option$1 + static STYLE: string + static DEBUG: boolean + static CONTEXTMENU: boolean + static NOTICE_TIME: number + static SETTING_WIDTH: number + static SETTING_ITEM_WIDTH: number + static SETTING_ITEM_HEIGHT: number + static RESIZE_TIME: number + static SCROLL_TIME: number + static SCROLL_GAP: number + static AUTO_PLAYBACK_MAX: number + static AUTO_PLAYBACK_MIN: number + static AUTO_PLAYBACK_TIMEOUT: number + static RECONNECT_TIME_MAX: number + static RECONNECT_SLEEP_TIME: number + static CONTROL_HIDE_TIME: number + static DBCLICK_TIME: number + static DBCLICK_FULLSCREEN: boolean + static MOBILE_DBCLICK_PLAY: boolean + static MOBILE_CLICK_PLAY: boolean + static AUTO_ORIENTATION_TIME: number + static INFO_LOOP_TIME: number + static FAST_FORWARD_VALUE: number + static FAST_FORWARD_TIME: number + static TOUCH_MOVE_RATIO: number + static VOLUME_STEP: number + static SEEK_STEP: number + static PLAYBACK_RATE: number[] + static ASPECT_RATIO: string[] + static FLIP: string[] + static FULLSCREEN_WEB_IN_BODY: boolean + static LOG_VERSION: boolean + static USE_RAF: boolean + static REMOVE_SRC_WHEN_DESTROY: boolean + readonly id: number + readonly option: Option$1 + readonly isLock: boolean + readonly isReady: boolean + readonly isFocus: boolean + readonly isInput: boolean + readonly isRotate: boolean + readonly isDestroy: boolean + flv?: unknown + m3u8?: unknown + hls?: unknown + ts?: unknown + mpd?: unknown + torrent?: unknown + on(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this + on(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this + on(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this + once(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this + once(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this + once(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this + emit(name: T, ...args: Events[T]): this + emit(name: T, ...args: SubtitleUpdateEvents[T]): this + emit(name: string, ...args: unknown[]): this + off(name: T, callback?: (...args: Events[T]) => unknown): this + off(name: T, callback?: (...args: SubtitleUpdateEvents[T]) => unknown): this + off(name: string, callback?: (...args: unknown[]) => unknown): this + query: Artplayer['template']['query'] + proxy: Artplayer['events']['proxy'] + video: Artplayer['template']['$video'] + e: { + [K in keyof Events]?: { + fn: (...args: Events[K]) => unknown + ctx: unknown + }[]; + } - readonly setting: { - option: SettingOption[] - updateStyle: (width?: number) => void - /** Legacy return signature; a missing runtime entry is null. */ - find: (name: string) => SettingOption | undefined - /** Legacy return signature; runtime returns the formatted input item. */ - add: (setting: Setting) => Artplayer['setting'] - /** Legacy return signature; runtime returns the updated or added item. */ - update: (settings: Setting) => Artplayer['setting'] - /** Legacy return signature; runtime returns undefined. */ - remove: (name: string) => Artplayer['setting'] - } & Component + destroy(removeHtml?: boolean): void + reset(): void + readonly template: { + get html(): string + query: (selector: string) => T | null + } & Template - readonly plugins: Plugins + readonly events: { + proxy: { + (target: EventTarget, eventName: string, handler: (event: Event) => void, options?: boolean | AddEventListenerOptions): () => void + (target: EventTarget, eventName: string[], handler: (event: Event) => void, options?: boolean | AddEventListenerOptions): Array<() => void> + } + hover: (element: HTMLElement, mouseenter?: (event: Event) => any, mouseleave?: (event: Event) => any) => void + remove: (destroyEvent: () => void) => void + destroy: () => void + bindGlobalEvents: (source?: { + window?: Window + document?: Document + }) => void + } + + readonly storage: { + name: string + settings: Record + get: { + (key: string): unknown + (): Record + } + set: (key: string, value: unknown) => void + del: (key: string) => void + clear: () => void + } + + readonly icons: Icons + readonly i18n: { + languages: I18n + language: Partial> + init: () => void + get: (key: string) => string + update: (language: Partial) => void + } + + readonly notice: { + timer: number | null + get show(): string | Error | false | '' + set show(msg: string | Error | false | '') + destroy: () => void + } + + readonly layers: Record & Component + readonly controls: Record & Component + readonly contextmenu: Record & Component + readonly subtitle: { + get url(): string + set url(url: string) + get textTrack(): TextTrack | undefined + get activeCues(): VTTCue[] + get cues(): VTTCue[] + style: (name: string | Partial, value?: string) => void + switch: (url: string, option?: Subtitle) => Promise + init: (subtitle: Subtitle) => Promise + } & Component + + readonly info: Component + readonly loading: Component + readonly hotkey: { + keys: Record any)[]> + add: (key: string, callback: (this: Artplayer, event: KeyboardEvent) => any) => Artplayer['hotkey'] + remove: (key: string, callback: (event: KeyboardEvent) => any) => Artplayer['hotkey'] + } + + readonly mask: Component + readonly setting: { + option: SettingOption[] + updateStyle: (width?: number) => void + /** Legacy return signature; a missing runtime entry is null. */ + find: (name: string) => SettingOption | undefined + /** Legacy return signature; runtime returns the formatted input item. */ + add: (setting: Setting) => Artplayer['setting'] + /** Legacy return signature; runtime returns the updated or added item. */ + update: (settings: Setting) => Artplayer['setting'] + /** Legacy return signature; runtime returns undefined. */ + remove: (name: string) => Artplayer['setting'] + } & Component + + readonly plugins: Plugins + } +} +declare const Artplayer: typeof ArtplayerDefinitions.Artplayer +type Artplayer = ArtplayerDefinitions.Artplayer +declare namespace Artplayer { + export type Config = ArtplayerDefinitions.Config + export type Emitter> = ArtplayerDefinitions.Emitter + export type I18n = ArtplayerDefinitions.I18n + export type Icons = ArtplayerDefinitions.Icons + export type PluginFactory = ArtplayerDefinitions.PluginFactory + export type Plugins = ArtplayerDefinitions.Plugins + export type SettingOption = ArtplayerDefinitions.SettingOption + export type Setting = ArtplayerDefinitions.Setting + export type Subtitle = ArtplayerDefinitions.Subtitle + export type OptionInput = ArtplayerDefinitions.OptionInput + export type Player = ArtplayerDefinitions.Player + export type SubtitleUpdateEvents = ArtplayerDefinitions.SubtitleUpdateEvents + export type Events = ArtplayerDefinitions.Events + export type PlaybackControls = ArtplayerDefinitions.PlaybackControls + export type Template = ArtplayerDefinitions.Template + export type Utils = ArtplayerDefinitions.Utils + export type Option = ArtplayerDefinitions.Option$1 } - export = Artplayer export as namespace Artplayer; diff --git a/package.json b/package.json index f0ca0c9d9..04322b475 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "type": "module", "version": "6.1.0", "private": true, + "packageManager": "yarn@1.22.22", "description": "ArtPlayer.js is a modern and full featured HTML5 video player", "workspaces": [ "packages/*" @@ -38,15 +39,15 @@ "test:dash-control": "node --test test/dash-control.test.js", "dev": "npx cross-env NODE_ENV=development node ./scripts/dev.js", "build": "npx cross-env NODE_ENV=production node ./scripts/build.js", - "lint": "eslint \"packages/*/{src,types,package.json}\" \"scripts/*.{js,mjs}\" \"test/*\" \"docs/assets/ts/*\" \"types/*.d.ts\" playwright.config.js --no-fix", + "lint": "eslint \"packages/*/{src,public,types,package.json}\" \"scripts/*.{js,mjs}\" \"test/*\" \"docs/assets/ts/*\" \"types/*.d.ts\" playwright.config.js --no-fix", "build:all": "yarn ci:build && yarn lint", "check:toolchain": "node scripts/check-toolchain.mjs", - "lint:fix": "eslint \"packages/*/{src,types,package.json}\" \"scripts/*.{js,mjs}\" \"test/*\" \"docs/assets/ts/*\" \"types/*.d.ts\" playwright.config.js --fix", + "lint:fix": "eslint \"packages/*/{src,public,types,package.json}\" \"scripts/*.{js,mjs}\" \"test/*\" \"docs/assets/ts/*\" \"types/*.d.ts\" playwright.config.js --fix", "check:plan": "node refactor/scripts/plan.mjs --check", - "test:node": "yarn test:unit && node --test test/toolchain.test.js test/build-docs.test.js test/package-check.test.js", + "test:node": "yarn test:unit && node --test test/toolchain.test.js test/build-docs.test.js test/package-check.test.js test/declarations.test.js test/editor-types.test.js", "test:baseline": "node --test refactor/scripts/*.test.mjs", - "ci:check": "yarn check:toolchain --strict && yarn check:plan && yarn lint && yarn typecheck && yarn test", - "ci:build": "yarn build all && yarn build:i18n && yarn build:ts && yarn build:docs && yarn test:imports", + "ci:check": "yarn check:toolchain --strict && yarn check:plan && yarn lint && yarn check:types && yarn typecheck && yarn test", + "ci:build": "yarn build:types && yarn build all && yarn build:i18n && yarn build:ts && yarn build:docs && yarn test:imports", "test:imports": "node --test test/esm.test.js test/i18n.test.js test/ssr.test.js", "typecheck": "node scripts/typecheck.mjs", "test:unit": "node --test test/playback.test.js test/dash-control.test.js test/public-behavior.test.js test/helpers.test.js test/chapter.test.js test/utils.test.js test/resource-scope.test.js test/instance-lifecycle.test.js test/options.test.js test/media-hosts.test.js test/plugins.test.js test/source.test.js test/playback-properties.test.js test/media-events.test.js test/template-resources.test.js test/core-vendor.test.js test/component-resources.test.js test/setting-model.test.js test/setting-layout.test.js test/setting-resources.test.js test/subtitle.test.js test/display-native.test.js test/display-video-fullscreen.test.js test/display-pip.test.js test/display-mini.test.js test/display-sizing.test.js test/display-orientation.test.js test/hotkey.test.js test/listener-registry.test.js test/global-events.test.js test/pointer-events.test.js test/gesture.test.js test/event-scheduling.test.js test/notice.test.js test/fast-forward.test.js test/auto-playback.test.js test/builtin-layers.test.js test/prompt-components.test.js test/screenshot.test.js test/thumbnails.test.js test/progress.test.js test/environment.test.js test/storage.test.js test/facade-properties.test.js test/dom-boundaries.test.js test/initialization.test.js test/entry.test.js", @@ -55,7 +56,9 @@ "test:browser:install": "playwright install chromium firefox webkit", "test:browser:report": "playwright show-report refactor/.cache/browser/html", "test:package": "node scripts/package-check.mjs", - "test:package:release": "node scripts/package-check.mjs --release" + "test:package:release": "node scripts/package-check.mjs --release", + "build:types": "node scripts/build-types.mjs --write", + "check:types": "node scripts/build-types.mjs --check" }, "browserslist": "last 1 Chrome version", "devDependencies": { @@ -67,6 +70,7 @@ "cross-env": "10.1.0", "cross-spawn": "7.0.6", "dotenv": "17.2.4", + "dts-bundle-generator": "9.5.1", "esbuild": "0.27.7", "eslint": "9.39.2", "eslint-plugin-format": "2.0.1", @@ -79,7 +83,10 @@ "terser": "5.51.2", "typescript": "5.9.3", "typescript-compat": "npm:typescript@4.3.5", + "typescript-runtime-compat": "npm:typescript@5.1.6", "vite": "7.3.6" }, - "packageManager": "yarn@1.22.22" + "resolutions": { + "dts-bundle-generator/typescript": "5.9.3" + } } diff --git a/packages/artplayer/.npmignore b/packages/artplayer/.npmignore index 2b272d565..9ce4bd90d 100644 --- a/packages/artplayer/.npmignore +++ b/packages/artplayer/.npmignore @@ -4,3 +4,5 @@ yarn.lock package-lock.json src tsconfig.json + +/public/ diff --git a/packages/artplayer/ARCHITECTURE.md b/packages/artplayer/ARCHITECTURE.md index d3de6b753..e43d52dbe 100644 --- a/packages/artplayer/ARCHITECTURE.md +++ b/packages/artplayer/ARCHITECTURE.md @@ -4,6 +4,65 @@ ArtPlayer keeps its existing constructor, player mixins, plugins and DOM/CSS hoo The production entry is `src/index.ts`. All owned core production modules use TypeScript; libs/screenfull.js remains an audited third-party source file. +## Public declaration sources + +`public/` owns the TypeScript sources for the historical package declarations. +They deliberately form a separate dependency graph from `src/`: implementation +classes, resource ownership details and browser-only imports must not leak into +consumer declarations. `scripts/build-types.mjs` emits only declarations into +the existing `types/` paths, using the pinned compiler and preserving the shared +default/CJS/ESM/legacy/i18n identities. `public/` is excluded from npm packages. + +Run `yarn build:types` after editing public sources and `yarn check:types` to verify +generated files without writing. CI and isolated package builds use the same +generator. Read `types/COMPATIBILITY.md` before changing a public return or callback: +the historical facade retains old acceptance while the optional runtime facade +describes actual results. Runtime and public source views are checked +separately; generating a declaration does not prove runtime correspondence. + +`public/runtime/` contains the precise media/player, utility, plugin, template/icon, +subtitle/notice, event and component/setting views introduced by CORE-21. +Their generic host parameters let tests compare the public contracts with the +corresponding minimal implementation hosts. `public/runtime.ts` assembles them; +`artplayer/runtime` and `artplayer/runtime/legacy` select precise declarations +while resolving to the same JS files as the existing matching entrypoints. +`artplayer/runtime/types` is the shared type-only augmentation path. +`src/events/core-types.ts` consumes the generated +event view: custom legacy channels remain available while builtin cue/error/blur +payloads are corrected. Declaration-only imports add no runtime dependency. + +`test/types/runtime-*.ts` separates source correspondence from generated declaration +consumption. The latter runs with TypeScript 5.9.3 and the dev-only 5.1.6 alias in +four module-resolution modes; the existing root consumers still run with 4.3.5. +Keep old entry declarations independent of these modern accessor types. +Old plugin factories have explicit input overloads, and declared legacy plugin +results/custom events flow into the new view. No wrapper or runtime conversion +is introduced. A returned precise instance must not be assigned to the legacy +instance type: some legacy return assumptions intentionally remain inaccurate. +Constructor PluginFactory uses PluginHost with an optional plugins registry; +plugins.add callbacks receive the completed Artplayer view. ControlInput requires +top/left/right because Control.add validates position before component registration. +`runtime/construction.ts` describes early callback hosts. ProxyHost exposes safe +initial fields and the event bus before Template returns; it does not expose the +video/query/proxy getters. Layer/control/contextmenu hosts mark subsequent +components optional. customType and setting mounted are deferred, so they receive +the completed player. Pending views preserve Player directly because mapped types +would otherwise collapse different getter/setter types. Browser tests compare +the exact initialized fields against published and candidate construction. +The container remains an HTMLDivElement; a general HTMLElement is rejected by +the existing tag validation. TypeScript does not model arbitrary user mutations +or guarantee every subsystem remains usable after explicit destroy. + +`scripts/editor-types.mjs` bundles the historical public dependency graph with +the pinned dts-bundle-generator and TypeScript, then uses the TypeScript AST to +give the existing UMD global its constructor and named types. Definitions have a +private namespace to avoid circular aliases. Both old/current compilers validate +the standalone result before build:ts writes it; a CI test rejects drift. +The browser editor test uses the actual vendored Monaco worker and generated core +declaration to compile and execute a player example. Plugin/editor UI generation +modernization remains SITE-02; this core flow does not concatenate modern accessors +into the legacy editor or publish an additional JS implementation. + ## Entry and bootstrap (CORE-20) The typed entry checks subsystem composition. Seven leaf @@ -52,7 +111,7 @@ still propagate. Its controlled tests do not certify an actual Apple receiver. test/initialization.test.js compares frozen CORE-19 functions with the new code; test/types/core-initialization.ts checks raw storage, mutable config and nullable DOM results. Internal PiP consumers accept the native element/null/boolean getter and -boolean setter; the public declaration compatibility work remains in CORE-21. +boolean setter; the optional runtime entry exposes the same precise contract. The auto-playback consumer owns the legacy unvalidated record assumption locally; Storage does not promise that arbitrary persisted values are PlaybackTimes. @@ -87,8 +146,8 @@ as the legacy declaration class. template/types.ts names the PlayerTemplate cont canonical template nodes plus a native/media-like proxy. The entry makes one scoped assertion for caller-provided SSR/proxy inputs. This is a compatibility precondition, not runtime validation; no eager missing-node rejection or synthesized nodes are added. -Template itself and query helpers keep nullable results. Complete public declaration -generation and consumer views remain CORE-21 work. +Template itself and query helpers keep nullable results. Generated runtime declarations +retain these nullable views; the old root preserves historical consumer acceptance. events/core-types.ts names known core/native payloads while leaving extension event names open. CoreEmission narrows a module's emitted names against that shared map. @@ -205,7 +264,7 @@ overwriting newer messages. Public art/timer fields and destroy/show methods rem False/empty assignment only hides the notice; the old pending expiry still clears its text. Manual notice.destroy cancels the timer without hiding or permanently disabling a live instance. The source getter is boolean; the legacy public message -read type remains tracked by BASE-TYPE-07 for compatible coordination in CORE-21. +read type is retained at the old root; the runtime entry exposes the boolean getter. `src/plugins/fastForward.ts` wires the unchanged plugin result and input events. `src/input/long-press.ts` owns one press at a time in the current source scope, @@ -404,8 +463,9 @@ screen rotation is tested below; final installed-artifact acceptance remains a C plugins/autoOrientation.ts composes the mobile-only builtin, retaining its name/state getter and mismatch rule. It rejects unready geometry and scopes the two ArtPlayer event subscriptions. orientation-types.ts models the minimal host and optional platform lock. -The builtin registry currently bridges its generic JS host at this one assembly boundary; -the complete constructor host remains for CORE-21, without widening the implementation. +The builtin registry bridges its host at this one assembly boundary. Public construction +callbacks use the phase-specific hosts in public/runtime/construction.ts without widening +the implementation's minimal orientation host. display/orientation-web.ts owns delayed rotation and its four inline style properties. Each new fullscreen session cancels the previous timer. Repeated entry reapplies dimensions @@ -525,8 +585,8 @@ Destruction's synchronous WebKit failure follows the normal lifecycle error coll late cleanup is best effort. Platform UI remains the browser's responsibility. The internal PipProperty reflects the branch-dependent getter. Historical public boolean -declarations remain unchanged pending BASE-TYPE-10 / CORE-21; this is an explicit legacy -declaration discrepancy, not a reason to convert native JS consumers to boolean. +declarations remain unchanged at the old root; the runtime entry exposes Element|null|boolean +reads and boolean writes. Native JS return values retain their identity. Run `node --test test/display-pip.test.js` and `yarn test:browser test/browser/display-pip.spec.js test/browser/display-pip-webkit.spec.js`. The actual native test records capabilities and, when supported, a native window, media @@ -590,7 +650,8 @@ Track load errors notify only while that node is current; all owned load/error/c callbacks are cleared on replacement or destroy. HTTP errors reject before conversion. Constructor and URL-setter calls report through notice and consume their otherwise unobservable rejected promises; explicit init/switch calls keep rejection semantics. -Public cue event inference remains tracked by BASE-TYPE-07 / CORE-21. Browser-engine +The runtime entry infers cue arrays; the old root retains scalar inference and its +explicit array-listener overloads for compatibility. Browser-engine tests do not certify physical iOS/Safari fullscreen or every proxy implementation. ## Settings (CORE-14) @@ -666,9 +727,9 @@ trusted keyboard input/change ordering, pointer switch callbacks, touch selectio and actual builtin autoOrientation transforms with a local video. Mobile UA/viewport and touch emulation are not certification on physical mobile devices. -Public Setting return declaration discrepancies remain tracked by BASE-TYPE-07 for -the compatible public facade at CORE-21. The source manager has precise item/null/void -returns and does not change runtime behavior to match incorrect legacy declarations. +The runtime entry and source manager expose precise item/null/void Setting returns. +The old root retains historical return declarations for existing consumers; the manager +does not change runtime behavior to match those declarations. Tests: setting-model.test.js, setting-layout.test.js, setting-resources.test.js, types/setting-model.ts, types/setting-manager.ts and @@ -701,7 +762,7 @@ click/mounted/beforeUnmount use art as this; index 0 still follows the old index rule; equal indexes insert before their predecessor. update mutates the cached option before remove, so the newly supplied beforeUnmount runs on the old node. Component add/update may return a div; Control add/update still return undefined. Source types -model that distinction; historical public declaration conflicts remain CORE-21 work. +and the runtime entry model that distinction; historical root declarations are retained. A name of `__proto__` now creates a normal own DOM alias without replacing the registry prototype. Other historical aliases and shadowing behavior are not broadly renamed. @@ -766,7 +827,7 @@ construction still fails with the original browser-only error. `icons/defaults.ts` owns SVG inputs; `icons/index.ts` creates the per-instance registry. Each read creates a fresh i.art-icon wrapper. Custom DOM nodes move into that wrapper; they are not cloned. Public declarations historically say HTMLDivElement, while source -uses the actual HTMLElement shape. This mismatch remains tracked for CORE-21. +and the runtime entry use the actual HTMLElement shape. Custom icon keys may be absent. `i18n/index.ts` owns selected language, deep updates and key fallback. Standalone language modules keep default exports and artplayer-i18n-* aliases through publish.ts. @@ -833,7 +894,7 @@ Public PluginFactory and Plugins are type-only contracts. Augment `artplayer/typ for a common plugin-result/event interface across old TS, NodeNext CJS/ESM and Bundler; augmenting the CJS root alias directly is not equivalent. The new subpath has only a types condition and typesVersions fallback: runtime require/import must reject it. -Public add's legacy return signature remains tracked by BASE-TYPE-04/CORE-21; internal +The old root retains add's legacy return signature. Runtime-entry and internal registration types preserve known synchronous/Promise results and use a union for unknown results. The Promise distinction retains instanceof semantics: foreign Promises and ordinary thenables are stored synchronously, not assimilated. @@ -1084,8 +1145,9 @@ reads template.$video on each access, as before. The typed construction facade checks these host requirements while retaining the original staged initialization. Do not assume these types validate every third-party proxy. Public art.video remains the original object and retains its existing declaration -for consumer compatibility. A public proxy typing extension requires separate -consumer checks; internal code must not use that old declaration to hide a canvas. +at the old root for consumer compatibility. The runtime entry exposes MediaSurface +and a construction-stage ProxyHost, checked in installed consumers; internal code +must not use the old declaration to hide a canvas. `test/media-hosts.test.js` covers structural media methods, receiver/return values, event and mutex order, property descriptors and live getters. `test/types/media-hosts.ts` @@ -1103,7 +1165,8 @@ compatibility surface; see [types/README.md](./types/README.md). Public return discrepancies remain after CORE-07. It adds unescape/ArtPlayerError, optional sleep and a symbol/PropertyKey def overload; old string def and debounce/throttle return declarations remain for source compatibility. The old debounce context argument is ignored at runtime. -BASE-TYPE-05 remains open through CORE-21; use the actual source types internally. +The runtime entry exposes the actual target identity and timer void returns; +use the actual source types internally. Lifecycle-owned timer cancellation is part of CORE-04/17 and the existing BASE-PERF-01 finding, not a claim that a standalone debounce can know when its owner is destroyed. @@ -1214,5 +1277,5 @@ core files in docs/compiled when committing a shippable core change. For new utility behavior, extend the same old/new contract tests. Clearly separate intentional defect corrections from preserved behavior. For timers or Blob URLs, also identify the owner and verify cleanup in the consuming module. Remaining -public declaration convergence, accessibility and release validation are recorded +ecosystem declaration work, accessibility and release validation are recorded in refactor/tasks.json and should extend this map as they land. diff --git a/packages/artplayer/package.json b/packages/artplayer/package.json index f2971f428..01245b75f 100644 --- a/packages/artplayer/package.json +++ b/packages/artplayer/package.json @@ -31,6 +31,29 @@ "./types": { "types": "./types/artplayer.d.ts" }, + "./runtime": { + "import": { + "types": "./types/runtime.d.mts", + "default": "./dist/artplayer.mjs" + }, + "require": { + "types": "./types/runtime.d.cts", + "default": "./dist/artplayer.js" + } + }, + "./runtime/types": { + "types": "./types/runtime.d.ts" + }, + "./runtime/legacy": { + "import": { + "types": "./types/runtime.d.cts", + "default": "./dist/artplayer.legacy.js" + }, + "require": { + "types": "./types/runtime.d.cts", + "default": "./dist/artplayer.legacy.js" + } + }, "./legacy": { "import": { "types": "./types/artplayer.d.cts", @@ -60,6 +83,15 @@ "types": [ "types/artplayer.d.ts" ], + "runtime": [ + "types/runtime.d.ts" + ], + "runtime/types": [ + "types/runtime.d.ts" + ], + "runtime/legacy": [ + "types/runtime.d.ts" + ], "i18n/*": [ "types/legacy/language.d.ts" ], diff --git a/packages/artplayer/public/artplayer.cts b/packages/artplayer/public/artplayer.cts new file mode 100644 index 000000000..4693bc06d --- /dev/null +++ b/packages/artplayer/public/artplayer.cts @@ -0,0 +1,29 @@ +import type * as Definition from './artplayer.js' + +declare const Artplayer: typeof Definition.default +// eslint-disable-next-line ts/no-redeclare -- CJS constructor value and instance type share the export. +type Artplayer = Definition.default + +// eslint-disable-next-line ts/no-redeclare, ts/no-namespace -- Namespace merging carries named types on the existing CJS export. +declare namespace Artplayer { + type Config = Definition.Config + type Emitter> = Definition.Emitter + type Events = Definition.Events + type I18n = Definition.I18n + type Icons = Definition.Icons + type Option = Definition.Option + type OptionInput = Definition.OptionInput + type Player = Definition.Player + type PlaybackControls = Definition.PlaybackControls + type PluginFactory = Definition.PluginFactory + type Plugins = Definition.Plugins + type Setting = Definition.Setting + type SettingOption = Definition.SettingOption + type Subtitle = Definition.Subtitle + type SubtitleUpdateEvents = Definition.SubtitleUpdateEvents + type Template = Definition.Template + type Utils = Definition.Utils +} + +// eslint-disable-next-line no-restricted-syntax -- Preserve the real CommonJS constructor export. +export = Artplayer diff --git a/packages/artplayer/public/artplayer.mts b/packages/artplayer/public/artplayer.mts new file mode 100644 index 000000000..7400ac73a --- /dev/null +++ b/packages/artplayer/public/artplayer.mts @@ -0,0 +1,2 @@ +export { default } from './artplayer.cjs' +export type { Config, Emitter, Events, I18n, Icons, Option, OptionInput, PlaybackControls, Player, PluginFactory, Plugins, Setting, SettingOption, Subtitle, SubtitleUpdateEvents, Template, Utils } from './artplayer.js' diff --git a/packages/artplayer/public/artplayer.ts b/packages/artplayer/public/artplayer.ts new file mode 100644 index 000000000..df439aaa2 --- /dev/null +++ b/packages/artplayer/public/artplayer.ts @@ -0,0 +1,216 @@ +import type { Component } from './component' +import type { Config } from './config' +import type { Emitter } from './emitter' +import type { Events, SubtitleUpdateEvents } from './events' +import type { I18n } from './i18n' +import type { Icons } from './icons' +import type { Option, OptionInput } from './option' +import type { PlaybackControls } from './playback' +import type { Player } from './player' +import type { PluginFactory, Plugins } from './plugin' +import type { Setting, SettingOption } from './setting' +import type { Subtitle } from './subtitle' +import type { Template } from './template' +import type { Utils } from './utils' + +export type { + Config, + Emitter, + Events, + I18n, + Icons, + Option, + OptionInput, + PlaybackControls, + Player, + PluginFactory, + Plugins, + Setting, + SettingOption, + Subtitle, + SubtitleUpdateEvents, + Template, + Utils, +} + +declare class Artplayer extends Player { + constructor(option: Option, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) + constructor(option: OptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) + + static readonly instances: Artplayer[] + static readonly version: string + static readonly env: 'development' | 'production' + static readonly build: string + static readonly config: Config + static readonly utils: Utils + static readonly scheme: Record + static readonly Emitter: new >(...args: unknown[]) => Emitter + static readonly validator: (option: T, scheme: object) => T + static readonly kindOf: (item: unknown) => string + static readonly html: Artplayer['template']['html'] + static readonly option: Option + + static STYLE: string + static DEBUG: boolean + static CONTEXTMENU: boolean + static NOTICE_TIME: number + static SETTING_WIDTH: number + static SETTING_ITEM_WIDTH: number + static SETTING_ITEM_HEIGHT: number + static RESIZE_TIME: number + static SCROLL_TIME: number + static SCROLL_GAP: number + static AUTO_PLAYBACK_MAX: number + static AUTO_PLAYBACK_MIN: number + static AUTO_PLAYBACK_TIMEOUT: number + static RECONNECT_TIME_MAX: number + static RECONNECT_SLEEP_TIME: number + static CONTROL_HIDE_TIME: number + static DBCLICK_TIME: number + static DBCLICK_FULLSCREEN: boolean + static MOBILE_DBCLICK_PLAY: boolean + static MOBILE_CLICK_PLAY: boolean + static AUTO_ORIENTATION_TIME: number + static INFO_LOOP_TIME: number + static FAST_FORWARD_VALUE: number + static FAST_FORWARD_TIME: number + static TOUCH_MOVE_RATIO: number + static VOLUME_STEP: number + static SEEK_STEP: number + static PLAYBACK_RATE: number[] + static ASPECT_RATIO: string[] + static FLIP: string[] + static FULLSCREEN_WEB_IN_BODY: boolean + static LOG_VERSION: boolean + static USE_RAF: boolean + static REMOVE_SRC_WHEN_DESTROY: boolean + + readonly id: number + readonly option: Option + readonly isLock: boolean + readonly isReady: boolean + readonly isFocus: boolean + readonly isInput: boolean + readonly isRotate: boolean + readonly isDestroy: boolean + + flv?: unknown + m3u8?: unknown + hls?: unknown + ts?: unknown + mpd?: unknown + torrent?: unknown + + on(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this + on(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this + on(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this + + once(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this + once(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this + once(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this + + emit(name: T, ...args: Events[T]): this + emit(name: T, ...args: SubtitleUpdateEvents[T]): this + emit(name: string, ...args: unknown[]): this + + off(name: T, callback?: (...args: Events[T]) => unknown): this + off(name: T, callback?: (...args: SubtitleUpdateEvents[T]) => unknown): this + off(name: string, callback?: (...args: unknown[]) => unknown): this + + query: Artplayer['template']['query'] + proxy: Artplayer['events']['proxy'] + video: Artplayer['template']['$video'] + + e: { [K in keyof Events]?: { fn: (...args: Events[K]) => unknown, ctx: unknown }[] } + + destroy(removeHtml?: boolean): void + reset(): void + + readonly template: { + get html(): string + query: (selector: string) => T | null + } & Template + + readonly events: { + proxy: { + (target: EventTarget, eventName: string, handler: (event: Event) => void, options?: boolean | AddEventListenerOptions): () => void + (target: EventTarget, eventName: string[], handler: (event: Event) => void, options?: boolean | AddEventListenerOptions): Array<() => void> + } + hover: (element: HTMLElement, mouseenter?: (event: Event) => any, mouseleave?: (event: Event) => any) => void + remove: (destroyEvent: () => void) => void + destroy: () => void + bindGlobalEvents: (source?: { window?: Window, document?: Document }) => void + } + + readonly storage: { + name: string + settings: Record + get: { + (key: string): unknown + (): Record + } + set: (key: string, value: unknown) => void + del: (key: string) => void + clear: () => void + } + + readonly icons: Icons + + readonly i18n: { + languages: I18n + language: Partial> + init: () => void + get: (key: string) => string + update: (language: Partial) => void + } + + readonly notice: { + timer: number | null + get show(): string | Error | false | '' + set show(msg: string | Error | false | '') + destroy: () => void + } + + readonly layers: Record & Component + readonly controls: Record & Component + readonly contextmenu: Record & Component + + readonly subtitle: { + get url(): string + set url(url: string) + get textTrack(): TextTrack | undefined + get activeCues(): VTTCue[] + get cues(): VTTCue[] + style: (name: string | Partial, value?: string) => void + switch: (url: string, option?: Subtitle) => Promise + init: (subtitle: Subtitle) => Promise + } & Component + + readonly info: Component + readonly loading: Component + + readonly hotkey: { + keys: Record any)[]> + add: (key: string, callback: (this: Artplayer, event: KeyboardEvent) => any) => Artplayer['hotkey'] + remove: (key: string, callback: (event: KeyboardEvent) => any) => Artplayer['hotkey'] + } + + readonly mask: Component + + readonly setting: { + option: SettingOption[] + updateStyle: (width?: number) => void + /** Legacy return signature; a missing runtime entry is null. */ + find: (name: string) => SettingOption | undefined + /** Legacy return signature; runtime returns the formatted input item. */ + add: (setting: Setting) => Artplayer['setting'] + /** Legacy return signature; runtime returns the updated or added item. */ + update: (settings: Setting) => Artplayer['setting'] + /** Legacy return signature; runtime returns undefined. */ + remove: (name: string) => Artplayer['setting'] + } & Component + + readonly plugins: Plugins +} + +export default Artplayer diff --git a/packages/artplayer/public/component.ts b/packages/artplayer/public/component.ts new file mode 100644 index 000000000..7fdf4213d --- /dev/null +++ b/packages/artplayer/public/component.ts @@ -0,0 +1,143 @@ +import type Artplayer from './artplayer' + +/** Input accepted by the existing HTML renderer, including numeric content. */ +export interface ComponentInput extends Omit { + html?: string | HTMLElement | number +} + +export interface Selector { + /** + * Whether the default is selected + */ + default?: boolean + + /** + * Html string of selector + */ + html: string | HTMLElement + + /** + * Value of selector item + */ + value?: string | number + + /** + * Allow custom properties + */ + [key: string]: any +} + +export interface Component { + /** + * Component self-increasing id + */ + readonly id: number + + /** + * Component parent name + */ + readonly name: string | undefined + + /** + * Component parent element + */ + readonly $parent: HTMLElement | undefined + + /** + * Whether to show component parent + */ + get show(): boolean + + /** + * Whether to show component parent + */ + set show(state: boolean) + + /** + * Toggle the component parent + */ + toggle: () => void + + /** + * Dynamic add a component + */ + add: { + (option: ComponentOption | ((art: Artplayer) => ComponentOption)): HTMLElement | undefined + (option: ComponentInput | ((art: Artplayer) => ComponentInput)): HTMLElement | undefined + } + + /** + * Dynamic remove a component by name + */ + remove: (name: string) => void + + /** + * Dynamic update a component + */ + update: { + (option: ComponentOption): HTMLElement | undefined + (option: ComponentInput): HTMLElement | undefined + } +} + +export interface ComponentOption { + /** + * Html string or html element of component + */ + html?: string | HTMLElement + + /** + * Whether to disable component + */ + disable?: boolean + + /** + * Unique name for component + */ + name?: string + + /** + * Component sort index + */ + index?: number + + /** + * Component style object + */ + style?: Partial + + /** + * Component click event + */ + click?: (this: Artplayer, component: Component, event: Event) => void + + /** + * When the component was mounted + */ + mounted?: (this: Artplayer, element: HTMLElement) => void + + /** + * When the component was before unmount + */ + beforeUnmount?: (this: Artplayer, element: HTMLElement) => void + + /** + * Component tooltip, use in controls + */ + tooltip?: string + + /** + * Component position, use in controls + */ + position?: 'top' | 'left' | 'right' | (string & Record) + + /** + * Custom selector list, use in controls + */ + selector?: Selector[] + + /** + * When selector item click, use in controls + */ + onSelect?: (this: Artplayer, selector: Selector, element: HTMLElement, event: Event) => void +} diff --git a/packages/artplayer/public/config.ts b/packages/artplayer/public/config.ts new file mode 100644 index 000000000..11c753b4e --- /dev/null +++ b/packages/artplayer/public/config.ts @@ -0,0 +1,81 @@ +export interface Config { + readonly properties: readonly [ + 'audioTracks', + 'autoplay', + 'buffered', + 'controller', + 'controls', + 'crossOrigin', + 'currentSrc', + 'currentTime', + 'defaultMuted', + 'defaultPlaybackRate', + 'duration', + 'ended', + 'error', + 'loop', + 'mediaGroup', + 'muted', + 'networkState', + 'paused', + 'playbackRate', + 'played', + 'preload', + 'readyState', + 'seekable', + 'seeking', + 'src', + 'startDate', + 'textTracks', + 'videoTracks', + 'volume', + ] + readonly methods: readonly ['addTextTrack', 'canPlayType', 'load', 'play', 'pause'] + readonly events: readonly [ + 'abort', + 'canplay', + 'canplaythrough', + 'durationchange', + 'emptied', + 'ended', + 'error', + 'loadeddata', + 'loadedmetadata', + 'loadstart', + 'pause', + 'play', + 'playing', + 'progress', + 'ratechange', + 'seeked', + 'seeking', + 'stalled', + 'suspend', + 'timeupdate', + 'volumechange', + 'waiting', + ] + readonly prototypes: readonly [ + 'width', + 'height', + 'videoWidth', + 'videoHeight', + 'poster', + 'webkitDecodedFrameCount', + 'webkitDroppedFrameCount', + 'playsInline', + 'webkitSupportsFullscreen', + 'webkitDisplayingFullscreen', + 'onenterpictureinpicture', + 'onleavepictureinpicture', + 'disablePictureInPicture', + 'cancelVideoFrameCallback', + 'requestVideoFrameCallback', + 'getVideoPlaybackQuality', + 'requestPictureInPicture', + 'webkitEnterFullScreen', + 'webkitEnterFullscreen', + 'webkitExitFullScreen', + 'webkitExitFullscreen', + ] +} diff --git a/packages/artplayer/public/cssVar.ts b/packages/artplayer/public/cssVar.ts new file mode 100644 index 000000000..e9384c07f --- /dev/null +++ b/packages/artplayer/public/cssVar.ts @@ -0,0 +1,45 @@ +export interface CssVar { + '--art-theme': string + '--art-font-color': string + '--art-background-color': string + '--art-text-shadow-color': string + '--art-transition-duration': string + '--art-padding': string + '--art-border-radius': string + '--art-progress-height': string + '--art-progress-color': string + '--art-progress-top-gap': string + '--art-hover-color': string + '--art-loaded-color': string + '--art-state-size': string + '--art-state-opacity': number + '--art-bottom-height': string + '--art-bottom-offset': string + '--art-bottom-gap': string + '--art-highlight-width': string + '--art-highlight-color': string + '--art-control-height': string + '--art-control-opacity': number + '--art-control-icon-size': string + '--art-control-icon-scale': number + '--art-volume-height': string + '--art-volume-handle-size': string + '--art-lock-size': string + '--art-indicator-scale': number + '--art-indicator-size': string + '--art-fullscreen-web-index': 9999 + '--art-settings-icon-size': string + '--art-settings-max-height': string + '--art-selector-max-height': string + '--art-contextmenus-min-width': string + '--art-subtitle-font-size': string + '--art-subtitle-gap': string + '--art-subtitle-bottom': string + '--art-subtitle-border': string + '--art-widget-background': string + '--art-tip-background': string + '--art-scrollbar-size': string + '--art-scrollbar-background': string + '--art-scrollbar-background-hover': string + '--art-mini-progress-height': string +} diff --git a/packages/artplayer/public/emitter.ts b/packages/artplayer/public/emitter.ts new file mode 100644 index 000000000..f9bb749c1 --- /dev/null +++ b/packages/artplayer/public/emitter.ts @@ -0,0 +1,8 @@ +/** The event bus exposed by Artplayer.Emitter; no new runtime export. */ +export interface Emitter> { + e?: { [Name in keyof Events]?: { fn: (...args: [...Events[Name]]) => unknown, ctx: unknown }[] } + on: (name: Name, fn: (this: Context, ...args: [...Events[Name]]) => unknown, ctx?: Context) => this + once: (name: Name, fn: (this: Context, ...args: [...Events[Name]]) => unknown, ctx?: Context) => this + emit: (name: Name, ...args: [...Events[Name]]) => this + off: (name: Name, fn?: (...args: [...Events[Name]]) => unknown) => this +} diff --git a/packages/artplayer/public/events.ts b/packages/artplayer/public/events.ts new file mode 100644 index 000000000..624bbd55a --- /dev/null +++ b/packages/artplayer/public/events.ts @@ -0,0 +1,106 @@ +import type { AspectRatio, Flip } from './player' +import type { Subtitle } from './subtitle' + +export type Bar = 'loaded' | 'played' | 'hover' + +/** Actual built-in subtitle update payloads; legacy Events keeps its scalar types. */ +export interface SubtitleUpdateEvents { + subtitleBeforeUpdate: [cues: VTTCue[]] + subtitleAfterUpdate: [cues: VTTCue[]] +} + +export interface Events { + 'document:click': [event: Event] + 'document:mouseup': [event: Event] + 'document:keydown': [event: Event] + 'document:touchend': [event: Event] + 'document:touchcancel': [event: Event] + 'document:touchmove': [event: Event] + 'document:mousemove': [event: Event] + 'document:pointerup': [event: Event] + 'document:contextmenu': [event: Event] + 'document:pointermove': [event: Event] + 'document:visibilitychange': [event: Event] + 'document:webkitfullscreenchange': [event: Event] + + 'window:resize': [event: Event] + 'window:scroll': [event: Event] + 'window:orientationchange': [event: Event] + + 'video:abort': [event: Event] + 'video:canplay': [event: Event] + 'video:canplaythrough': [event: Event] + 'video:complete': [event: Event] + 'video:durationchange': [event: Event] + 'video:emptied': [event: Event] + 'video:encrypted': [event: Event] + 'video:ended': [event: Event] + 'video:error': [error: Error] + 'video:loadeddata': [event: Event] + 'video:loadedmetadata': [event: Event] + 'video:loadstart': [event: Event] + 'video:pause': [event: Event] + 'video:play': [event: Event] + 'video:playing': [event: Event] + 'video:progress': [event: Event] + 'video:ratechange': [event: Event] + 'video:seeked': [event: Event] + 'video:seeking': [event: Event] + 'video:stalled': [event: Event] + 'video:suspend': [event: Event] + 'video:timeupdate': [event: Event] + 'video:volumechange': [event: Event] + 'video:waiting': [event: Event] + + 'info': [state: boolean] + 'layer': [state: boolean] + 'loading': [state: boolean] + 'mask': [state: boolean] + 'subtitle': [state: boolean] + 'contextmenu': [state: boolean] + 'control': [state: boolean] + 'setting': [state: boolean] + 'hotkey': [event: KeyboardEvent] + + 'destroy': [] + + 'subtitleOffset': [offset: number] + /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ + 'subtitleBeforeUpdate': [cue: VTTCue] + /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ + 'subtitleAfterUpdate': [cue: VTTCue] + 'subtitleLoad': [cues: VTTCue[], option: Subtitle] + + 'focus': [event: Event] + 'blur': [event: Event] + 'dblclick': [event: Event] + 'click': [event: Event] + 'hover': [state: boolean, event: Event] + 'mousemove': [event: Event] + + 'resize': [] + 'view': [state: boolean] + 'lock': [state: boolean] + 'aspectRatio': [aspectRatio: AspectRatio] + 'autoHeight': [height: number] + 'autoSize': [size: { width: number, height: number }] + 'ready': [] + 'airplay': [] + 'raf': [] + + 'error': [error: Error, reconnectTime: number] + 'flip': [flip: Flip] + 'fullscreen': [state: boolean] + 'fullscreenError': [event: Event] + 'fullscreenWeb': [state: boolean] + 'mini': [state: boolean] + 'pause': [] + 'pip': [state: boolean] + 'play': [] + 'screenshot': [dataUri: string] + 'seek': [currentTime: number, time: number] + 'restart': [url: string] + 'muted': [state: boolean] + 'setBar': [type: Bar, percentage: number, event?: Event | undefined] + 'keydown': [event: KeyboardEvent] +} diff --git a/packages/artplayer/public/i18n.ts b/packages/artplayer/public/i18n.ts new file mode 100644 index 000000000..4986660c1 --- /dev/null +++ b/packages/artplayer/public/i18n.ts @@ -0,0 +1,56 @@ +type I18nKeys + = | 'en' + | 'zh-cn' + | 'zh-tw' + | 'pl' + | 'cs' + | 'es' + | 'fa' + | 'fr' + | 'id' + | 'ru' + | 'tr' + | 'ar' + | 'vi' + | (string & Record) + +interface I18nValue { + 'Video Info': string + 'Close': string + 'Video Load Failed': string + 'Volume': string + 'Play': string + 'Pause': string + 'Rate': string + 'Mute': string + 'Video Flip': string + 'Horizontal': string + 'Vertical': string + 'Reconnect': string + 'Show Setting': string + 'Hide Setting': string + 'Screenshot': string + 'Play Speed': string + 'Aspect Ratio': string + 'Default': string + 'Normal': string + 'Open': string + 'Switch Video': string + 'Switch Subtitle': string + 'Fullscreen': string + 'Exit Fullscreen': string + 'Web Fullscreen': string + 'Exit Web Fullscreen': string + 'Mini Player': string + 'PIP Mode': string + 'Exit PIP Mode': string + 'PIP Not Supported': string + 'Fullscreen Not Supported': string + 'Subtitle Offset': string + 'Last Seen': string + 'Jump Play': string + 'AirPlay': string + 'AirPlay Not Available': string +} + +export type I18n = Partial>> diff --git a/packages/artplayer/public/icons.ts b/packages/artplayer/public/icons.ts new file mode 100644 index 000000000..b97cf5662 --- /dev/null +++ b/packages/artplayer/public/icons.ts @@ -0,0 +1,30 @@ +export interface Icons { + readonly loading: HTMLDivElement + readonly state: HTMLDivElement + readonly play: HTMLDivElement + readonly pause: HTMLDivElement + readonly check: HTMLDivElement + readonly volume: HTMLDivElement + readonly volumeClose: HTMLDivElement + readonly screenshot: HTMLDivElement + readonly setting: HTMLDivElement + readonly pip: HTMLDivElement + readonly arrowLeft: HTMLDivElement + readonly arrowRight: HTMLDivElement + readonly playbackRate: HTMLDivElement + readonly aspectRatio: HTMLDivElement + readonly config: HTMLDivElement + readonly lock: HTMLDivElement + readonly flip: HTMLDivElement + readonly unlock: HTMLDivElement + readonly fullscreenOff: HTMLDivElement + readonly fullscreenOn: HTMLDivElement + readonly fullscreenWebOff: HTMLDivElement + readonly fullscreenWebOn: HTMLDivElement + readonly switchOn: HTMLDivElement + readonly switchOff: HTMLDivElement + readonly error: HTMLDivElement + readonly close: HTMLDivElement + readonly airplay: HTMLDivElement + readonly [key: string]: HTMLDivElement +} diff --git a/packages/artplayer/public/language.cts b/packages/artplayer/public/language.cts new file mode 100644 index 000000000..ab9320684 --- /dev/null +++ b/packages/artplayer/public/language.cts @@ -0,0 +1,5 @@ +import type { I18n } from './i18n.js' + +declare const language: NonNullable +// eslint-disable-next-line no-restricted-syntax -- Preserve the language object's CommonJS value export. +export = language diff --git a/packages/artplayer/public/language.mts b/packages/artplayer/public/language.mts new file mode 100644 index 000000000..3b243cb0a --- /dev/null +++ b/packages/artplayer/public/language.mts @@ -0,0 +1 @@ +export { default } from './language.cjs' diff --git a/packages/artplayer/public/legacy/language.ts b/packages/artplayer/public/legacy/language.ts new file mode 100644 index 000000000..34de69188 --- /dev/null +++ b/packages/artplayer/public/legacy/language.ts @@ -0,0 +1,4 @@ +import type { I18n } from '../i18n' + +declare const language: NonNullable +export default language diff --git a/packages/artplayer/public/option.ts b/packages/artplayer/public/option.ts new file mode 100644 index 000000000..022d146bf --- /dev/null +++ b/packages/artplayer/public/option.ts @@ -0,0 +1,331 @@ +import type Artplayer from './artplayer' +import type { ComponentInput, ComponentOption } from './component' +import type { CssVar } from './cssVar' +import type { I18n } from './i18n' +import type { Icons } from './icons' +import type { PluginFactory } from './plugin' +import type { Quality } from './quality' +import type { Setting } from './setting' +import type { Subtitle } from './subtitle' + +export type CustomType + = | 'flv' + | 'm3u8' + | 'hls' + | 'ts' + | 'mpd' + | 'torrent' + | (string & Record) + +export interface Thumbnails { + /** + * The thumbnail image url + */ + url: string + + /** + * The thumbnail item number + */ + number?: number + + /** + * The thumbnail column size + */ + column?: number + + /** + * The thumbnail width + */ + width?: number + + /** + * The thumbnail height + */ + height?: number + + /** + * The thumbnail scale + */ + scale?: number +} + +/** Constructor input; Option retains its historical required URL/read types. */ +export interface OptionInput extends Omit { + url?: string + controls?: ComponentInput[] + layers?: ComponentInput[] + contextmenu?: ComponentInput[] +} + +export interface Option { + /** + * The player id + */ + id?: string + + /** + * The container mounted by the player + */ + container: string | HTMLDivElement + + /** + * Video url + */ + url: string + + /** + * Video poster image url + */ + poster?: string + + /** + * Video url type + */ + type?: CustomType + + /** + * Player color theme + */ + theme?: string + + /** + * Player language + */ + lang?: keyof I18n + + /** + * Player default volume + */ + volume?: number + + /** + * Whether live broadcast mode + */ + isLive?: boolean + + /** + * Whether video muted + */ + muted?: boolean + + /** + * Whether video auto play + */ + autoplay?: boolean + + /** + * Whether player auto resize + */ + autoSize?: boolean + + /** + * Whether player auto run mini mode + */ + autoMini?: boolean + + /** + * Whether video auto loop + */ + loop?: boolean + + /** + * Whether show video flip button + */ + flip?: boolean + + /** + * Whether show video playback rate button + */ + playbackRate?: boolean + + /** + * Whether show video aspect ratio button + */ + aspectRatio?: boolean + + /** + * Whether show video screenshot button + */ + screenshot?: boolean + + /** + * Whether show video setting button + */ + setting?: boolean + + /** + * Whether to enable player hotkey + */ + hotkey?: boolean + + /** + * Whether show video pip button + */ + pip?: boolean + + /** + * Do you want to run only one player at a time + */ + mutex?: boolean + + /** + * Whether use backdrop in UI + */ + backdrop?: boolean + + /** + * Whether show video window fullscreen button + */ + fullscreen?: boolean + + /** + * Whether show video web fullscreen button + */ + fullscreenWeb?: boolean + + /** + * Whether to enable player subtitle offset + */ + subtitleOffset?: boolean + + /** + * Whether to enable player mini progress bar + */ + miniProgressBar?: boolean + + /** + * Whether use SSR function + */ + useSSR?: boolean + + /** + * Whether use playsInline in mobile + */ + playsInline?: boolean + + /** + * Whether use lock in mobile + */ + lock?: boolean + + /** + * Whether use gesture in mobile + */ + gesture?: boolean + + /** + * Whether use fast forward in mobile + */ + fastForward?: boolean + + /** + * Whether use auto playback + */ + autoPlayback?: boolean + + /** + * Whether use auto orientation in mobile + */ + autoOrientation?: boolean + + /** + * Whether use airplay + */ + airplay?: boolean + + /** + * Custom video proxy + */ + proxy?: (this: Artplayer, art: Artplayer) => HTMLCanvasElement | HTMLVideoElement | undefined + + /** + * Custom plugin list + */ + plugins?: PluginFactory[] + + /** + * Custom layer list + */ + layers?: ComponentOption[] + + /** + * Custom contextmenu list + */ + contextmenu?: ComponentOption[] + + /** + * Custom control list + */ + controls?: ComponentOption[] + + /** + * Custom setting list + */ + settings?: Setting[] + + /** + * Custom video quality list + */ + quality?: Quality[] + + /** + * Custom highlight list + */ + highlight?: { + /** + * The highlight time + */ + time: number + + /** + * The highlight text + */ + text: string + }[] + + /** + * Custom thumbnail + */ + thumbnails?: Thumbnails + + /** + * Custom subtitle option + */ + subtitle?: Subtitle + + /** + * Other video attribute + */ + moreVideoAttr?: Partial unknown + ? never + : K]: HTMLVideoElement[K] + }>> + + /** + * Custom i18n + */ + i18n?: I18n + + /** + * Custom default icons + */ + icons?: { + [key in keyof Icons]?: HTMLElement | string + } + + /** + * Custom css variables + */ + cssVar?: Partial + + /** + * Custom video type function + */ + customType?: Partial< + Record< + CustomType, + (this: Artplayer, video: HTMLVideoElement, url: string, art: Artplayer) => unknown | Promise + > + > +} diff --git a/packages/artplayer/public/playback.ts b/packages/artplayer/public/playback.ts new file mode 100644 index 000000000..b9452c046 --- /dev/null +++ b/packages/artplayer/public/playback.ts @@ -0,0 +1,6 @@ +/** Accurate playback method view; assign an existing player without a runtime wrapper. */ +export interface PlaybackControls { + play: () => Promise + pause: () => void + toggle: () => Promise | void +} diff --git a/packages/artplayer/public/player.ts b/packages/artplayer/public/player.ts new file mode 100644 index 000000000..14051a790 --- /dev/null +++ b/packages/artplayer/public/player.ts @@ -0,0 +1,113 @@ +import type { CssVar } from './cssVar' +import type { CustomType, Thumbnails } from './option' +import type { Quality } from './quality' + +export type AspectRatio = 'default' | '4:3' | '16:9' | (`${number}:${number}` & Record) +export type PlaybackRate = 0.5 | 0.75 | 1.0 | 1.25 | 1.5 | 1.75 | 2.0 | (number & Record) +export type Flip = 'normal' | 'horizontal' | 'vertical' | (string & Record) +export type State = 'standard' | 'mini' | 'pip' | 'fullscreen' | 'fullscreenWeb' + +export declare class Player { + get aspectRatio(): AspectRatio + set aspectRatio(ratio: AspectRatio) + + get state(): State + set state(state: State) + + get type(): CustomType + set type(name: CustomType) + + get playbackRate(): PlaybackRate + set playbackRate(rate: PlaybackRate) + + get currentTime(): number + set currentTime(time: number) + + get duration(): number + get played(): number + get playing(): boolean + + get flip(): Flip + set flip(state: Flip) + + get fullscreen(): boolean + set fullscreen(state: boolean) + + get fullscreenWeb(): boolean + set fullscreenWeb(state: boolean) + + get loaded(): number + get loadedTime(): number + + get mini(): boolean + set mini(state: boolean) + + get pip(): boolean + set pip(state: boolean) + + get poster(): string + set poster(url: string) + + get rect(): DOMRect + get bottom(): number + get height(): number + get left(): number + get right(): number + get top(): number + get width(): number + get x(): number + get y(): number + + set seek(time: number) + get seek(): number + + set forward(time: number) + get forward(): number + + set backward(time: number) + get backward(): number + + get url(): string + set url(url: string) + + get volume(): number + set volume(percentage: number) + + get muted(): boolean + set muted(state: boolean) + + get theme(): string + set theme(theme: string) + + get subtitleOffset(): number + set subtitleOffset(time: number) + + get switch(): string + set switch(url: string) + + get quality(): Quality[] + set quality(quality: Quality[]) + + get thumbnails(): Thumbnails + set thumbnails(thumbnails: Thumbnails) + + pause(): void + play(): Promise + /** Legacy signature; runtime preserves pause's synchronous result or play's Promise. */ + toggle(): void + + attr(key: string, value?: unknown): unknown + cssVar(key: T, value?: CssVar[T]): CssVar[T] + + switchUrl(url: string): Promise + switchQuality(url: string): Promise + + getDataURL(): Promise + getBlobUrl(): Promise + screenshot(name?: string): Promise + + airplay(): void + autoSize(): void + autoHeight(): void + reset(): void +} diff --git a/packages/artplayer/public/plugin.ts b/packages/artplayer/public/plugin.ts new file mode 100644 index 000000000..1f4a61ee6 --- /dev/null +++ b/packages/artplayer/public/plugin.ts @@ -0,0 +1,10 @@ +import type Artplayer from './artplayer' + +export type PluginFactory = (this: Host, art: Host) => Result + +/** Augment this interface with installed plugin results; augmentation does not register a plugin. */ +export interface Plugins { + /** Legacy signature: synchronous factories return this registry; Promise factories return a Promise of it. */ + add: (plugin: PluginFactory) => Promise + [name: string]: unknown +} diff --git a/packages/artplayer/public/quality.ts b/packages/artplayer/public/quality.ts new file mode 100644 index 000000000..04058141a --- /dev/null +++ b/packages/artplayer/public/quality.ts @@ -0,0 +1,16 @@ +export interface Quality { + /** + * Whether the default is selected + */ + default?: boolean + + /** + * Html string of quality + */ + html: string | HTMLElement + + /** + * Video quality url + */ + url: string +} diff --git a/packages/artplayer/public/runtime.cts b/packages/artplayer/public/runtime.cts new file mode 100644 index 000000000..77fa28d37 --- /dev/null +++ b/packages/artplayer/public/runtime.cts @@ -0,0 +1,54 @@ +import type * as Definition from './runtime.js' + +declare const Artplayer: typeof Definition.default +// eslint-disable-next-line ts/no-redeclare -- CJS constructor value and instance type share the export. +type Artplayer = Definition.default + +// eslint-disable-next-line ts/no-redeclare, ts/no-namespace -- Named types share the existing CommonJS export. +declare namespace Artplayer { + type ArtplayerConstructor = Definition.ArtplayerConstructor + type OptionInput = Definition.OptionInput + type Option = Definition.Option + type Events = Definition.Events + type Plugins = Definition.Plugins + type PluginFactory = Definition.PluginFactory + type PluginHost = Definition.PluginHost + type ProxyHost = Definition.ProxyHost + type CustomTypeHost = Definition.CustomTypeHost + type LayerHost = Definition.LayerHost + type ControlHost = Definition.ControlHost + type ContextmenuHost = Definition.ContextmenuHost + type PluginRegistration = Definition.PluginRegistration + type Component = Definition.Component + type Controls = Definition.Controls + type Setting = Definition.Setting + type Subtitle = Definition.Subtitle + type Notice = Definition.Notice + type Utils = Definition.Utils + type MediaSurface = Definition.MediaSurface + type NativeMedia = Definition.NativeMedia + type CanvasMedia = Definition.CanvasMedia + type Player = Definition.Player + type Template = Definition.Template + type Icons = Definition.Icons + type Config = Definition.Config + type EventRegistry = Definition.EventRegistry + type Storage = Definition.Storage + type I18n = Definition.I18n + type Hotkey = Definition.Hotkey + type Languages = Definition.Languages + type Dictionary = Definition.Dictionary + type QualityItem = Definition.QualityItem + type SettingItem = Definition.SettingItem + type ComponentInput = Definition.ComponentInput + type ComponentOption = Definition.ComponentOption + type ControlInput = Definition.ControlInput + type ControlOption = Definition.ControlOption + type SelectorItem = Definition.SelectorItem + type SubtitleCue = Definition.SubtitleCue + type SubtitleOption = Definition.SubtitleOption + type Emitter> = Definition.Emitter +} + +// eslint-disable-next-line no-restricted-syntax -- Preserve the actual CommonJS constructor export. +export = Artplayer diff --git a/packages/artplayer/public/runtime.mts b/packages/artplayer/public/runtime.mts new file mode 100644 index 000000000..afba2a834 --- /dev/null +++ b/packages/artplayer/public/runtime.mts @@ -0,0 +1,2 @@ +export { default } from './runtime.cjs' +export type * from './runtime.js' diff --git a/packages/artplayer/public/runtime.ts b/packages/artplayer/public/runtime.ts new file mode 100644 index 000000000..fe19bce2e --- /dev/null +++ b/packages/artplayer/public/runtime.ts @@ -0,0 +1,125 @@ +import type LegacyArtplayer from './artplayer' +import type { Emitter } from './emitter' +import type { OptionInput as LegacyOptionInput } from './option' +import type { PluginFactory as LegacyPluginFactory, Plugins as LegacyPlugins } from './plugin' +import type { ComponentInput, Component as ComponentView, ControlInput, Controls as ControlsView } from './runtime/component' +import type { ContextmenuHost, ControlHost, CustomTypeHost, LayerHost, PluginHost, ProxyHost } from './runtime/construction' +import type { Events } from './runtime/events' +import type { MediaSurface } from './runtime/media' +import type { OptionInput as OptionInputView, Option as OptionView } from './runtime/option' +import type { Player } from './runtime/player' +import type { PluginFactory as FactoryView, PluginRegistration, Plugins as PluginsView } from './runtime/plugin' +import type { Config, EventRegistry, Hotkey, I18n, Scheme, Storage, ValidatorPath } from './runtime/services' +import type { Setting as SettingView } from './runtime/setting' +import type { Notice as NoticeView, Subtitle as SubtitleView } from './runtime/subtitle' +import type { Icons, Template } from './runtime/template' +import type { Utils } from './runtime/utils' + +export type { Emitter } from './emitter' +export type { ComponentInput, ComponentOption, ControlInput, ControlOption, SelectorItem } from './runtime/component' +export type { ContextmenuHost, ControlHost, CustomTypeHost, LayerHost, PluginHost, ProxyHost } from './runtime/construction' +export type { Events } from './runtime/events' +export type { CanvasMedia, MediaSurface, NativeMedia } from './runtime/media' +export type { Player, QualityItem } from './runtime/player' +export type { PluginRegistration } from './runtime/plugin' +export type { Config, Dictionary, EventRegistry, Hotkey, I18n, Languages, Storage } from './runtime/services' +export type { SettingItem } from './runtime/setting' +export type { SubtitleCue, SubtitleOption } from './runtime/subtitle' +export type { Icons, Template } from './runtime/template' +export type { Utils } from './runtime/utils' + +export type PluginFactory = FactoryView +export interface OptionInput extends Omit, 'plugins' | 'proxy' | 'customType' | 'layers' | 'controls' | 'contextmenu'> { + plugins?: PluginFactory[] + proxy?: (this: ProxyHost, art: ProxyHost) => MediaSurface + customType?: Record unknown) | undefined> + layers?: ComponentInput[] + controls?: ControlInput[] + contextmenu?: ComponentInput[] +} +export interface Option extends OptionView {} +export interface Component extends ComponentView {} +export interface Controls extends ControlsView {} +export interface Setting extends SettingView {} +export interface Subtitle extends SubtitleView, Omit {} +export interface Notice extends NoticeView { art: Artplayer } + +/** Augment with installed results. Factories are not wrapped or converted. */ +export interface PluginAdd { + (plugin: FactoryView): PluginRegistration + (plugin: LegacyPluginFactory): PluginRegistration +} + +type LegacyPluginResults = { + [Name in keyof LegacyPlugins as string extends Name ? never : number extends Name ? never : Name extends keyof PluginsView ? never : Name]: LegacyPlugins[Name] +} + +export interface Plugins extends Omit, 'add'>, LegacyPluginResults { + add: PluginAdd + [name: string]: unknown +} + +/** Public view of the existing constructor; this interface emits no runtime fields. */ +interface Artplayer extends Player, Emitter { + constructor: ArtplayerConstructor + id: number + option: Option + isLock: boolean + isReady: boolean + isFocus: boolean + isInput: boolean + isRotate: boolean + isDestroy: boolean + flv?: unknown + m3u8?: unknown + hls?: unknown + ts?: unknown + mpd?: unknown + torrent?: unknown + template: Template + events: EventRegistry + storage: Storage + icons: Icons + i18n: I18n + notice: Notice + /** The descriptor installer has no public instance members. */ + player: object + layers: Component + controls: Controls + contextmenu: Component & { init: () => void } + subtitle: Subtitle + info: Component & { init: () => void } + loading: Component + hotkey: Hotkey + mask: Component + setting: Setting + plugins: Plugins + readonly query: Template['query'] + readonly proxy: EventRegistry['proxy'] + readonly video: MediaSurface + reset: () => void + destroy: (removeHtml?: boolean) => void +} + +type StaticOptions = Pick>> + +export interface ArtplayerConstructor extends StaticOptions { + new (option: OptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown): Artplayer + new (option: LegacyOptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown): Artplayer + readonly prototype: Artplayer + readonly instances: Artplayer[] + readonly version: string + readonly config: Config + readonly utils: Utils + readonly scheme: Record + readonly Emitter: new >(...args: unknown[]) => Emitter + readonly validator: (option: T, scheme: Scheme, paths?: ValidatorPath) => T + readonly kindOf: (value: unknown) => string + readonly html: string + readonly option: Option +} + +// eslint-disable-next-line ts/no-redeclare -- One existing constructor value and its instance view. +declare const Artplayer: ArtplayerConstructor + +export default Artplayer diff --git a/packages/artplayer/public/runtime/component.ts b/packages/artplayer/public/runtime/component.ts new file mode 100644 index 000000000..f23ae4b3f --- /dev/null +++ b/packages/artplayer/public/runtime/component.ts @@ -0,0 +1,65 @@ +export type EventCleanup = () => void + +export interface SelectorItem { + html: string | HTMLElement | number + value?: string | number + default?: boolean + readonly $control_option?: SelectorItem[] + readonly $control_item?: HTMLDivElement + readonly $control_value?: HTMLDivElement +} + +export interface ComponentOption { + html?: string | HTMLElement | number + disable?: boolean + name?: string + index?: number + style?: Partial + tooltip?: string | number + position?: string + selector?: SelectorItem[] + click?: (this: Host, component: Component, event: Event) => unknown + mounted?: (this: Host, element: HTMLDivElement) => unknown + beforeUnmount?: (this: Host, element: HTMLDivElement) => unknown + onSelect?: (this: Host, item: SelectorItem, element: HTMLDivElement, event: Event) => unknown +} + +export type ComponentInput = ComponentOption | ((art: Host) => ComponentOption) + +export interface ControlOption extends Omit, 'position'> { + position: 'top' | 'left' | 'right' +} + +export type ControlInput = ControlOption | ((art: Host) => ControlOption) + +export interface ComponentEntry { + $ref: HTMLDivElement + events: EventCleanup[] + option: ComponentOption +} + +export interface Component { + id: number + art: Host + name?: string + $parent?: HTMLElement + cache: Map> + show: boolean + toggle: () => void + add: (input: ComponentInput) => HTMLDivElement | undefined + remove: (name: string) => void + update: (option: ComponentOption) => ReturnType + selector?: (option: ComponentOption, element: HTMLDivElement, events: EventCleanup[]) => void +} + +export interface Controls extends Omit, 'add' | 'update' | 'selector'> { + isHover: boolean + timer: number + setting?: HTMLDivElement + thumbnails?: HTMLDivElement + init: () => void + add: (input: ControlInput) => undefined + update: (option: ComponentOption) => undefined + check: (target?: SelectorItem) => void + selector: (option: ComponentOption, element: HTMLDivElement, events: EventCleanup[]) => void +} diff --git a/packages/artplayer/public/runtime/construction.ts b/packages/artplayer/public/runtime/construction.ts new file mode 100644 index 000000000..0dc902200 --- /dev/null +++ b/packages/artplayer/public/runtime/construction.ts @@ -0,0 +1,19 @@ +import type { Emitter } from '../emitter' +import type Artplayer from '../runtime' +import type { Events } from './events' +import type { Player } from './player' + +/** Safe fields before Template returns; video/query/proxy getters are not usable yet. */ +export interface ProxyHost extends Emitter, Pick {} + +// Mapped types collapse distinct getter/setter types; preserve Player directly. +type Pending = Player & Omit & Partial> +type AfterPlayer = 'layers' | 'controls' | 'contextmenu' | 'subtitle' | 'info' | 'loading' | 'hotkey' | 'mask' | 'setting' | 'plugins' + +/** URL assignment awaits its owned delay before invoking customType. */ +export type CustomTypeHost = Artplayer +export type LayerHost = Pending +export type ControlHost = Pending> +export type ContextmenuHost = Pending> +/** Constructor factories run before the Plugins registry is assigned to the player. */ +export type PluginHost = Pending<'plugins'> diff --git a/packages/artplayer/public/runtime/events.ts b/packages/artplayer/public/runtime/events.ts new file mode 100644 index 000000000..0d5e26888 --- /dev/null +++ b/packages/artplayer/public/runtime/events.ts @@ -0,0 +1,26 @@ +import type { Events as LegacyEvents } from '../events' +import type { SubtitleCue, SubtitleOption } from './subtitle' + +type NativeEvents = { [Name in Extract]: [event: Event] } + +interface BuiltinEvents { + [name: `video:${string}`]: [event: Event] + 'document:keydown': [KeyboardEvent] + 'document:mousemove': [MouseEvent] + 'document:mouseup': [MouseEvent] + 'mousemove': [MouseEvent] + 'click': [MouseEvent] + 'blur': [Event] + 'error': [error: unknown, attempt: number] + 'fullscreenError': [error: unknown] + 'aspectRatio': [string] + 'flip': [string] + 'seek': [time: number, requestedTime: number | string] + 'setBar': [type: string, percentage: number, event?: MouseEvent | TouchEvent] + 'subtitleBeforeUpdate': [cues: SubtitleCue[]] + 'subtitleAfterUpdate': [cues: SubtitleCue[]] + 'subtitleLoad': [cues: SubtitleCue[], option: SubtitleOption | null] +} + +/** Legacy custom event augmentation is retained; builtin payload corrections take precedence. */ +export interface Events extends Omit, NativeEvents, BuiltinEvents, Record {} diff --git a/packages/artplayer/public/runtime/media.ts b/packages/artplayer/public/runtime/media.ts new file mode 100644 index 000000000..335620f65 --- /dev/null +++ b/packages/artplayer/public/runtime/media.ts @@ -0,0 +1,41 @@ +export type MediaState = Pick & { + readonly playing?: boolean +} + +export interface PlaybackMethods { + play: () => PlayResult + pause: () => PauseResult +} + +export interface OptionalMediaCapabilities { + readonly textTracks?: ArrayLike + readonly error?: unknown + requestPictureInPicture?: () => Promise + requestVideoFrameCallback?: (callback: VideoFrameRequestCallback) => number + cancelVideoFrameCallback?: (handle: number) => void + webkitEnterFullscreen?: () => void + webkitExitFullscreen?: () => void + readonly webkitSupportsFullscreen?: boolean + webkitShowPlaybackTargetPicker?: () => void + webkitSupportsPresentationMode?: (mode: string) => boolean + webkitSetPresentationMode?: (mode: string) => void + readonly webkitPresentationMode?: string + readonly webkitDisplayingFullscreen?: boolean +} + +export type NativeMedia = Omit & OptionalMediaCapabilities + +export type CanvasMedia = HTMLCanvasElement & MediaState & PlaybackMethods & OptionalMediaCapabilities & { + src: string | null + readonly currentSrc: string | null + readonly videoWidth: number + readonly videoHeight: number + readonly buffered: TimeRanges + volume: number + muted: boolean + playbackRate: number + load: () => unknown +} + +/** Check optional capabilities before calling them on a native or proxy surface. */ +export type MediaSurface = NativeMedia | CanvasMedia diff --git a/packages/artplayer/public/runtime/option.ts b/packages/artplayer/public/runtime/option.ts new file mode 100644 index 000000000..9b7f8d477 --- /dev/null +++ b/packages/artplayer/public/runtime/option.ts @@ -0,0 +1,28 @@ +import type { OptionInput as LegacyOptionInput, Thumbnails } from '../option' +import type { ComponentInput, ControlInput } from './component' +import type { MediaSurface } from './media' +import type { PluginFactory } from './plugin' +import type { Languages } from './services' +import type { SettingItem } from './setting' +import type { SubtitleOption } from './subtitle' + +/** Callback receivers are the unchanged player instance selected by this view. */ +export interface OptionInput extends Omit { + container: string | HTMLDivElement + proxy?: (this: Host, art: Host) => MediaSurface | undefined + plugins?: PluginFactory[] + layers?: ComponentInput[] + controls?: ControlInput[] + contextmenu?: ComponentInput[] + settings?: SettingItem[] + customType?: Record unknown) | undefined> + i18n?: Languages + icons?: Record +} + +/** Defaults are merged once; later setters may replace thumbnails with a partial input. */ +export interface Option extends Omit>, 'proxy' | 'subtitle' | 'thumbnails'> { + proxy: OptionInput['proxy'] + subtitle: SubtitleOption + thumbnails: Thumbnails +} diff --git a/packages/artplayer/public/runtime/player.ts b/packages/artplayer/public/runtime/player.ts new file mode 100644 index 000000000..1180dc68d --- /dev/null +++ b/packages/artplayer/public/runtime/player.ts @@ -0,0 +1,78 @@ +import type { Thumbnails } from '../option' +import type { State } from '../player' +import type { MediaSurface } from './media' + +export interface QualityItem { + html: string | HTMLElement + url: string + default?: boolean +} + +/** Player-facing descriptors; native/proxy method results retain their identity. */ +export interface Player { + get currentTime(): number + set currentTime(time: number | string) + readonly duration: number + get seek(): undefined + set seek(time: number | string) + get forward(): undefined + set forward(time: number) + get backward(): undefined + set backward(time: number) + get switch(): undefined + set switch(url: string) + get quality(): undefined + set quality(items: QualityItem[]) + get url(): string | null + set url(value: string) + get state(): State + set state(value: string) + get pip(): Element | null | boolean + set pip(value: boolean) + /** The descriptor may be absent before metadata installs the available mode. */ + fullscreen?: boolean + fullscreenWeb: boolean + mini: boolean + volume: number + muted: boolean + playbackRate: number + aspectRatio: string + flip: string + poster: string + theme: string + type: string + subtitleOffset: number + thumbnails: Thumbnails + readonly loaded: number + readonly loadedTime: number + readonly played: number + readonly playing: boolean + readonly rect: DOMRect + readonly bottom: number + readonly height: number + readonly left: number + readonly right: number + readonly top: number + readonly width: number + readonly x: number + readonly y: number + play: () => Promise>> + pause: () => ReturnType + toggle: () => Promise>> | ReturnType + switchUrl: (url: string) => Promise + switchQuality: (url: string) => Promise + autoSize: () => void + autoHeight: () => void + airplay: () => void + getDataURL: () => Promise + getBlobUrl: () => Promise + screenshot: (name?: string) => Promise + attr: { + (key: PropertyKey): unknown + (key: PropertyKey, value: unknown): unknown + } + cssVar: { + (key: string): string + (key: string, value: unknown): string | void + } +} diff --git a/packages/artplayer/public/runtime/plugin.ts b/packages/artplayer/public/runtime/plugin.ts new file mode 100644 index 000000000..3192f3c11 --- /dev/null +++ b/packages/artplayer/public/runtime/plugin.ts @@ -0,0 +1,13 @@ +export type PluginFactory = (this: Host, art: Host) => Result + +export type PluginRegistration + = unknown extends Result ? Registry | Promise + : Result extends Promise ? Promise : Registry + +/** The same registry is returned immediately or after its Promise factory settles. */ +export interface Plugins { + art: Host + id: number + add: (plugin: PluginFactory) => PluginRegistration + next: (plugin: PluginFactory, result: unknown) => this +} diff --git a/packages/artplayer/public/runtime/services.ts b/packages/artplayer/public/runtime/services.ts new file mode 100644 index 000000000..50c4f507f --- /dev/null +++ b/packages/artplayer/public/runtime/services.ts @@ -0,0 +1,57 @@ +export interface Config { + properties: string[] + methods: string[] + events: string[] + prototypes: string[] +} + +export type Disposer = () => void +export type Listener = EventListenerOrEventListenerObject | null + +export interface EventRegistry { + destroyEvents: Set + proxy: { + (target: EventTarget, name: string, callback: Listener, option?: boolean | AddEventListenerOptions | null): Disposer + (target: EventTarget, name: string[], callback: Listener, option?: boolean | AddEventListenerOptions | null): Disposer[] + (target: EventTarget, name: string | string[], callback: Listener, option?: boolean | AddEventListenerOptions | null): Disposer | Disposer[] + } + hover: (target: EventTarget, mouseenter?: (event: Event) => unknown, mouseleave?: (event: Event) => unknown) => void + remove: (dispose: Disposer) => void + destroy: () => void + bindGlobalEvents: (source?: { window?: Window, document?: Document }) => void +} + +export interface Storage { + name: string + settings: Record + get: (key?: PropertyKey) => unknown + set: (key: PropertyKey, value: unknown) => void + del: (key: PropertyKey) => void + clear: () => void +} + +export type Dictionary = Record +export type Languages = Record + +export interface I18n { + art: Host + languages: Languages + language: Dictionary + init: () => void + get: (key: string) => string + update: (value: Languages) => void +} + +export type HotkeyCallback = (this: Host, event: KeyboardEvent) => unknown + +export interface Hotkey { + art: Host + keys: Record[]> + init: () => void + add: (key: string, callback: HotkeyCallback) => this + remove: (key: string, callback: HotkeyCallback) => this +} + +export type ValidatorPath = (string | number)[] +export type Validator = (value: unknown, type: string, paths: ValidatorPath) => unknown +export type Scheme = string | Validator | Scheme[] | { [key: string]: Scheme } diff --git a/packages/artplayer/public/runtime/setting.ts b/packages/artplayer/public/runtime/setting.ts new file mode 100644 index 000000000..dda910320 --- /dev/null +++ b/packages/artplayer/public/runtime/setting.ts @@ -0,0 +1,58 @@ +export type SettingContent = string | HTMLElement | number +export type SettingRange = [value?: number, min?: number, max?: number, step?: number] +export type SettingCallback = (this: Host, item: SettingItem, element: HTMLDivElement, event: Event) => unknown + +export interface SettingItem { + name?: string + html?: SettingContent + icon?: SettingContent + tooltip?: SettingContent + width?: number + value?: string | number + default?: boolean + switch?: boolean + range?: SettingRange + selector?: SettingItem[] + mounted?: (this: Host, element: HTMLDivElement, item: SettingItem) => unknown + onClick?: SettingCallback + onSwitch?: SettingCallback + onRange?: SettingCallback + onChange?: SettingCallback + onSelect?: SettingCallback + readonly $parent?: SettingItem + readonly $parents?: SettingItem[] + readonly $option?: SettingItem[] + readonly $events?: (() => void)[] + readonly $formatted?: boolean + readonly $item?: HTMLDivElement + readonly $icon?: HTMLDivElement + readonly $html?: HTMLDivElement + readonly $tooltip?: HTMLDivElement + readonly $switch?: HTMLDivElement + readonly $range?: HTMLInputElement +} + +export interface Setting { + id: number + art: Host + name: string + $parent: HTMLElement + cache: Map[], HTMLDivElement> + active: SettingItem[] | null + option: SettingItem[] + readonly builtin: SettingItem[] + show: boolean + toggle: () => void + traverse: (callback: (item: SettingItem) => void, option?: SettingItem[]) => void + check: (target?: SettingItem | null) => void + format: (option?: SettingItem[], parent?: SettingItem, parents?: SettingItem[], names?: string[]) => void + find: (name?: string) => SettingItem | null + resize: () => void + inactivate: (item: SettingItem) => void + remove: (name: string) => void + update: (item: SettingItem) => SettingItem + add: >(item: Item, option?: SettingItem[]) => Item + createHeader: (item: SettingItem) => void + createItem: (item: SettingItem, isUpdate?: boolean) => void + render: (option?: SettingItem[]) => void +} diff --git a/packages/artplayer/public/runtime/subtitle.ts b/packages/artplayer/public/runtime/subtitle.ts new file mode 100644 index 000000000..0fe6c0350 --- /dev/null +++ b/packages/artplayer/public/runtime/subtitle.ts @@ -0,0 +1,38 @@ +import type { Subtitle as SubtitleInput } from '../subtitle' + +export type SubtitleOption = Required + +export interface SubtitleCue extends TextTrackCue { + text: string + originalStartTime?: number + originalEndTime?: number +} + +export interface SubtitleTrack extends HTMLTrackElement { offset?: number } + +export interface Subtitle { + name: string + option: SubtitleOption | null + destroyEvent: () => unknown + url: string + readonly textTrack: TextTrack | undefined + readonly activeCues: SubtitleCue[] + readonly cues: SubtitleCue[] + show: boolean + toggle: () => void + style: { + (styles: Partial): HTMLDivElement + (key: string, value: string | number): HTMLDivElement + } + update: () => void + switch: (url: string, option?: SubtitleInput) => Promise + init: (option: SubtitleOption) => Promise + createTrack: (kind: string, url: string) => void +} + +export interface Notice { + timer: number | null + get show(): boolean + set show(value: string | Error | false) + destroy: () => void +} diff --git a/packages/artplayer/public/runtime/template.ts b/packages/artplayer/public/runtime/template.ts new file mode 100644 index 000000000..0ac9b2409 --- /dev/null +++ b/packages/artplayer/public/runtime/template.ts @@ -0,0 +1,42 @@ +import type { MediaSurface } from './media' + +/** Query results remain nullable for caller-supplied SSR templates. */ +export interface Template { + art: Host + $container: HTMLDivElement + $player: HTMLDivElement | null + $video: Media + $track: HTMLTrackElement | null + $poster: HTMLDivElement | null + $subtitle: HTMLDivElement | null + $danmuku: HTMLDivElement | null + $bottom: HTMLDivElement | null + $progress: HTMLDivElement | null + $controls: HTMLDivElement | null + $controlsLeft: HTMLDivElement | null + $controlsCenter: HTMLDivElement | null + $controlsRight: HTMLDivElement | null + $layer: HTMLDivElement | null + $loading: HTMLDivElement | null + $notice: HTMLDivElement | null + $noticeInner: HTMLDivElement | null + $mask: HTMLDivElement | null + $state: HTMLDivElement | null + $setting: HTMLDivElement | null + $info: HTMLDivElement | null + $infoPanel: HTMLDivElement | null + $infoClose: HTMLDivElement | null + $contextmenu: HTMLDivElement | null + $mini?: HTMLElement + query: (selector: string) => ElementType | null + init: () => void + destroy: (removeHtml: boolean) => void +} + +export type IconName = 'loading' | 'state' | 'play' | 'pause' | 'check' | 'volume' | 'volumeClose' + | 'screenshot' | 'setting' | 'pip' | 'arrowLeft' | 'arrowRight' | 'playbackRate' | 'aspectRatio' + | 'config' | 'lock' | 'flip' | 'unlock' | 'fullscreenOff' | 'fullscreenOn' | 'fullscreenWebOff' + | 'fullscreenWebOn' | 'switchOn' | 'switchOff' | 'error' | 'close' | 'airplay' + +/** Default getters create fresh icon wrappers; unknown custom keys may be absent. */ +export type Icons = Readonly> & { readonly [name: string]: HTMLElement | undefined } diff --git a/packages/artplayer/public/runtime/utils.ts b/packages/artplayer/public/runtime/utils.ts new file mode 100644 index 000000000..50e38626f --- /dev/null +++ b/packages/artplayer/public/runtime/utils.ts @@ -0,0 +1,67 @@ +interface StyledElement { style: CSSStyleDeclaration } +interface EventPathSource { + target: EventTarget | null + composedPath?: () => EventTarget[] +} +type StackFrame = ((...args: never[]) => unknown) | (abstract new (...args: never[]) => object) + +export interface Utils { + isBrowser: boolean + userAgent: string + isMobile: boolean + isSafari: boolean + isIOS: boolean + isIOS13: boolean + query: (selector: string, parent?: ParentNode) => T | null + queryAll: (selector: string, parent?: ParentNode) => T[] + addClass: (target: Pick, className: string) => void + removeClass: (target: Pick, className: string) => void + hasClass: (target: Pick, className: string) => boolean + append: (parent: Element, child: unknown) => Element | ChildNode | null + remove: (child: T) => T + replaceElement: (newChild: T, oldChild: Node) => T + siblings: (target: Element) => Element[] + inverseClass: (target: Element, className: string) => void + createElement: { + (tag: K): HTMLElementTagNameMap[K] + (tag: string): HTMLElement + } + setStyle: (element: T, key: PropertyKey, value: unknown) => T + setStyles: (element: T, styles: object) => T + getStyle: { + (element: Element, key: string, numberType?: true): number + (element: Element, key: string, numberType: false): string + (element: Element, key: string, numberType: boolean): number | string + } + setStyleText: (id: string, cssText: string) => void + getRect: (element: Pick) => DOMRect + tooltip: (target: Element, message: string | number, position?: string) => void + isInViewport: (target: Pick, offset?: number) => boolean + includeFromEvent: (event: EventPathSource, target: EventTarget | null | undefined) => boolean + getSafeAreaInsets: () => { top: number, right: number, bottom: number, left: number } + srtToVtt: (text: string) => string + vttToBlob: (text: string) => string + assToVtt: (text: string) => string + getExt: (url: string) => string + download: (url: string, name: string) => void + loadImg: (url: string, scale?: number) => Promise + errorHandle: (condition: T, message?: string) => T + silencePromise: (value: T) => T extends Promise ? Promise : T + def: (object: T, name: PropertyKey, descriptor: PropertyDescriptor & object & ThisType) => T + has: (object: object, name: PropertyKey) => boolean + get: (object: object, name: PropertyKey) => PropertyDescriptor | undefined + mergeDeep: (...objects: T) => T[number] + sleep: (milliseconds?: number) => Promise + /** The wrapper preserves its call receiver; the old context argument is ignored. */ + debounce: (callback: (this: Receiver, ...args: Args) => unknown, duration: number, context?: object) => (this: Receiver, ...args: Args) => void + throttle: (callback: (this: Receiver, ...args: Args) => unknown, duration: number) => (this: Receiver, ...args: Args) => void + clamp: (number: number, a: number, b: number) => number + secondToTime: (second: number) => string + escape: (text: string) => string + unescape: (text: string) => string + capitalize: (text: string) => string + ArtPlayerError: new (message?: string, context?: StackFrame) => Error + getIcon: (key?: string, html?: string | HTMLElement) => HTMLElement + getComposedPath: (event: EventPathSource) => EventTarget[] + supportsFlex: () => boolean +} diff --git a/packages/artplayer/public/setting.ts b/packages/artplayer/public/setting.ts new file mode 100644 index 000000000..739dd5908 --- /dev/null +++ b/packages/artplayer/public/setting.ts @@ -0,0 +1,95 @@ +import type Artplayer from './artplayer' + +export interface SettingOption extends Omit { + html: string + icon: string | undefined + tooltip: string | undefined + $item: HTMLDivElement + $icon: HTMLDivElement | undefined + $html: HTMLDivElement + $tooltip: HTMLDivElement | undefined + $switch: HTMLDivElement | undefined + $range: HTMLInputElement | undefined + $parent: SettingOption | undefined + $parents: SettingOption[] + $option: SettingOption[] + $events: Array<() => void> + $formatted: boolean +} + +export interface Setting { + /** + * Html string or html element of setting name + */ + html: string | HTMLElement + + /** + * Html string or html element of setting icon + */ + icon?: string | HTMLElement + + /** + * The width of setting + */ + width?: number + + /** + * The tooltip of setting + */ + tooltip?: string | HTMLElement + + /** + * Whether the default is selected + */ + default?: boolean + + /** + * Custom selector list + */ + selector?: Setting[] + + /** + * When the setting was mounted + */ + mounted?: (this: Artplayer, panel: HTMLDivElement, item: Setting) => void + + /** + * When selector item click + */ + onSelect?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + + /** + * Custom switch item + */ + switch?: boolean + + /** + * When switch item click + */ + onSwitch?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + + /** + * Custom range item + */ + range?: [value?: number, min?: number, max?: number, step?: number] + + /** + * When range item change + */ + onRange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + + /** + * When range item change in real time + */ + onChange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + + /** + * When range item change in real time + */ + onClick?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void + + /** + * Allow custom properties + */ + [key: string]: any +} diff --git a/packages/artplayer/public/subtitle.ts b/packages/artplayer/public/subtitle.ts new file mode 100644 index 000000000..9783d155c --- /dev/null +++ b/packages/artplayer/public/subtitle.ts @@ -0,0 +1,36 @@ +export interface Subtitle { + /** + * The subtitle url + */ + url?: string + + /** + * The subtitle name + */ + name?: string + + /** + * The subtitle type + */ + type?: 'vtt' | 'srt' | 'ass' | (string & Record) + + /** + * The subtitle style object + */ + style?: Partial + + /** + * The subtitle encoding, default utf-8 + */ + encoding?: string + + /** + * Whether use escape, default true + */ + escape?: boolean + + /** + * Change the vtt text + */ + onVttLoad?: (vtt: string) => string +} diff --git a/packages/artplayer/public/template.ts b/packages/artplayer/public/template.ts new file mode 100644 index 000000000..50c346a65 --- /dev/null +++ b/packages/artplayer/public/template.ts @@ -0,0 +1,27 @@ +export interface Template { + readonly html: string + readonly $container: HTMLDivElement + readonly $player: HTMLDivElement + readonly $video: HTMLVideoElement + readonly $track: HTMLTrackElement + readonly $poster: HTMLDivElement + readonly $subtitle: HTMLDivElement + readonly $danmuku: HTMLDivElement + readonly $bottom: HTMLDivElement + readonly $progress: HTMLDivElement + readonly $controls: HTMLDivElement + readonly $controlsLeft: HTMLDivElement + readonly $controlsCenter: HTMLDivElement + readonly $controlsRight: HTMLDivElement + readonly $layer: HTMLDivElement + readonly $loading: HTMLDivElement + readonly $notice: HTMLDivElement + readonly $noticeInner: HTMLDivElement + readonly $mask: HTMLDivElement + readonly $state: HTMLDivElement + readonly $setting: HTMLDivElement + readonly $info: HTMLDivElement + readonly $infoPanel: HTMLDivElement + readonly $infoClose: HTMLDivElement + readonly $contextmenu: HTMLDivElement +} diff --git a/packages/artplayer/public/utils.ts b/packages/artplayer/public/utils.ts new file mode 100644 index 000000000..63229ca7f --- /dev/null +++ b/packages/artplayer/public/utils.ts @@ -0,0 +1,73 @@ +export interface Utils { + isBrowser: boolean + userAgent: string + isMobile: boolean + isSafari: boolean + isIOS: boolean + isIOS13: boolean + + query: (selector: string, parent?: Document | HTMLElement) => T | null + queryAll: (selector: string, parent?: Document | HTMLElement) => T[] + addClass: (target: HTMLElement, className: string) => void + removeClass: (target: HTMLElement, className: string) => void + hasClass: (target: HTMLElement, className: string) => boolean + append: (target: HTMLElement, child: HTMLElement | string) => Element | ChildNode + remove: (target: HTMLElement) => HTMLElement + replaceElement: (newChild: HTMLElement, oldChild: HTMLElement) => HTMLElement + siblings: (target: HTMLElement) => HTMLElement[] + inverseClass: (target: HTMLElement, className: string) => void + createElement: (tag: K) => HTMLElementTagNameMap[K] + setStyle: ( + element: HTMLElement, + key: T, + value: string | CSSStyleDeclaration[T], + ) => HTMLElement + setStyles: (element: HTMLElement, styles: Partial) => HTMLElement + getStyle: { + (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType?: true): number + (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType: false): string + } + setStyleText: (id: string, cssText: string) => void + getRect: (el: HTMLElement) => { top: number, left: number, width: number, height: number } + tooltip: (target: HTMLElement, msg: string, pos?: string) => void + isInViewport: (target: HTMLElement, offset?: number) => boolean + includeFromEvent: (event: Event, target: HTMLElement) => boolean + getSafeAreaInsets: () => { top: number, right: number, bottom: number, left: number } + + srtToVtt: (srtText: string) => string + vttToBlob: (vttText: string) => string + assToVtt: (assText: string) => string + + getExt: (url: string) => string + download: (url: string, name: string) => void + loadImg: (url: string, scale?: number) => Promise + + errorHandle: (condition: T, msg: string) => T extends true ? T : never + silencePromise: (value: T) => T extends Promise ? Promise : T + def: { + /** Historical string-key signature; runtime returns obj. */ + (obj: object, name: string, value: unknown): void + (obj: T, name: PropertyKey, value: PropertyDescriptor & ThisType): T + } + has: (obj: object, name: PropertyKey) => boolean + get: (obj: object, name: PropertyKey) => PropertyDescriptor | undefined + mergeDeep: (...args: T) => T[number] + + sleep: (ms?: number) => Promise + /** Historical return type; runtime discards the callback result and ignores context. */ + debounce: any>(func: F, wait: number, context?: object) => (...args: Parameters) => ReturnType + /** Historical return type; runtime discards the callback result. */ + throttle: any>(func: F, wait: number) => (...args: Parameters) => ReturnType + + clamp: (num: number, a: number, b: number) => number + secondToTime: (second: number) => string + escape: (str: string) => string + unescape: (str: string) => string + capitalize: (str: string) => string + + ArtPlayerError: new (message?: string, context?: ((...args: never[]) => unknown) | (abstract new (...args: never[]) => object)) => Error + + getIcon: (key?: string, html?: string | HTMLElement) => HTMLElement + getComposedPath: (event: Event) => EventTarget[] + supportsFlex: () => boolean +} diff --git a/packages/artplayer/src/control/types.ts b/packages/artplayer/src/control/types.ts index 5d16a5123..b1761d98c 100644 --- a/packages/artplayer/src/control/types.ts +++ b/packages/artplayer/src/control/types.ts @@ -24,7 +24,7 @@ export interface UIEvents { 'setting': [boolean] 'aspectRatio': [string] 'flip': [string] - 'blur': [] + 'blur': [Event] 'resize': [] } diff --git a/packages/artplayer/src/events/core-types.ts b/packages/artplayer/src/events/core-types.ts index 4fa924521..1a9dffe3f 100644 --- a/packages/artplayer/src/events/core-types.ts +++ b/packages/artplayer/src/events/core-types.ts @@ -1,29 +1,8 @@ -import type { UIEvents } from '../control/types' +import type { Events } from '../../types/runtime/events' // The emitter stays open to extension names. Known native events retain their // payloads so subsystem subscriptions are checked against the assembled player. -export interface CoreEvents extends UIEvents, Record { - [name: `video:${string}`]: [event: Event] - 'ready': [] - 'error': [error: unknown, attempt: number] - 'fullscreenError': [error: unknown] - 'destroy': [] - 'restart': [string] - 'focus': [Event] - 'lock': [boolean] - 'view': [boolean] - 'subtitleOffset': [number] - 'seek': [time: number, requestedTime: number | string] - 'document:click': [Event] - 'document:contextmenu': [Event] - 'document:keydown': [KeyboardEvent] - 'document:touchmove': [Event] - 'document:touchend': [Event] - 'document:touchcancel': [Event] - 'window:resize': [Event] - 'window:orientationchange': [Event] - 'window:scroll': [Event] -} +export interface CoreEvents extends Events {} export interface CoreEmission { emit: (name: Name, ...args: [...CoreEvents[Name]]) => unknown diff --git a/packages/artplayer/src/setting/types.ts b/packages/artplayer/src/setting/types.ts index cd93bdddb..52fd43ec7 100644 --- a/packages/artplayer/src/setting/types.ts +++ b/packages/artplayer/src/setting/types.ts @@ -34,7 +34,7 @@ export interface SettingItem extends TreeItem { } export interface SettingEvents { - 'blur': [] + 'blur': [Event] 'focus': [event: Event] 'resize': [] 'video:ratechange': [Event] diff --git a/packages/artplayer/tsconfig.json b/packages/artplayer/tsconfig.json index f856f1a8e..65fd886ae 100644 --- a/packages/artplayer/tsconfig.json +++ b/packages/artplayer/tsconfig.json @@ -9,6 +9,9 @@ "types/**/*.d.mts", "types/**/*.d.cts", "../../types/assets.d.ts", - "../../types/option-validator.d.ts" + "../../types/option-validator.d.ts", + "public/**/*.ts", + "public/**/*.mts", + "public/**/*.cts" ] } diff --git a/packages/artplayer/types/COMPATIBILITY.md b/packages/artplayer/types/COMPATIBILITY.md index e21e10693..71a959cb8 100644 --- a/packages/artplayer/types/COMPATIBILITY.md +++ b/packages/artplayer/types/COMPATIBILITY.md @@ -46,10 +46,10 @@ if (pending) The original `art.toggle(): void` declaration remains accepted by historical consumers. The optional view exposes `Promise | void`; play rejection and -the original object identity remain unchanged. BASE-TYPE-04 stays open for the -remaining plugins.add conflict and CORE-21's full facade review. +the original object identity remain unchanged. CORE-21 also provides a complete +optional precise entry for these differences, described below. -| Surface | Actual runtime | Retained historical declaration | Follow-up | +| Surface | Actual runtime | Retained historical declaration | Owning task / finding | | ------------------------------------------ | ----------------------------------------------------------------------------- | ------------------------------------------------------- | ------------------------ | | plugins.add | Registry for a synchronous factory; Promise of registry for a Promise factory | Always Promise | CORE-08/21, BASE-TYPE-04 | | toggle | Pause result or original play Promise, including rejection | void | CORE-10/21, BASE-TYPE-04 | @@ -61,9 +61,9 @@ remaining plugins.add conflict and CORE-21's full facade review. | notice.show getter | Boolean visibility | Historical message/false union | CORE-18/21, BASE-TYPE-07 | | seek/forward/backward/switch/quality reads | Undefined: these descriptors only have setters | Numeric/string/quality-array getters | CORE-21, BASE-TYPE-08 | -These remain open declaration work, not release waivers. CORE-21 must resolve the -public/generated facade strategy against both actual returns and historical source -consumers. Migrated implementation modules must use their accurate internal types. +These historical declarations remain intentionally compatible. The runtime entry +below provides their accurate counterparts; it does not change the implementation +to make historical inaccuracies true. Migrated modules use accurate internal types. For existing application code, awaiting plugins.add or toggle works for synchronous and Promise results; ignore timer results, guard setting.find with a truthiness check, and explicitly annotate cue-array listeners. Do not rely on the inaccurate @@ -74,6 +74,49 @@ these command properties returns undefined; use currentTime, option and media state for observations. Source interfaces model undefined reads independently of setter inputs. Historical public getter declarations are not removed here. +## Precise entry and compiler boundary + +Use `artplayer/runtime` for precise types on the existing modern JS constructor, +or `artplayer/runtime/legacy` for the existing legacy JS constructor. Both share +the `artplayer/runtime/types` augmentation entry and the same public TypeScript +source graph. Existing root/legacy/types/i18n imports retain their old acceptance +and TypeScript 4.3.5 support. The precise entry is tested with 5.1.6 and 5.9.3; +unrelated getter/setter types require the TypeScript 5.1 language feature. + +```ts +import Artplayer from 'artplayer/runtime' + +const art = new Artplayer({ container: '#player' }) +const registered = art.plugins.add(() => ({ name: 'example' })) // same registry +art.seek = 12 +const seekRead: undefined = art.seek +const visible: boolean = art.notice.show +const item = art.setting.find('quality') // item or null +``` + +Precise timer wrappers return void, def requires object target/descriptor and +returns the target, settings return their actual item/null/void values, and +subtitle update callbacks infer cue arrays. Media/proxy method return types are +kept distinct. Command reads are undefined; native PiP reads Element|null while +fallbacks read boolean. Template nodes may be null, icons are HTMLElement wrappers, +template.html is absent, and only the constructor exposes html. env/build are +not fabricated. Containers must be div elements and new controls need a supported +position. The old fields and wrong signatures remain available only in the legacy +type view; precise instances are not asserted assignable to that inaccurate view. + +Constructor input overloads accept old typed plugins without wrapping factories. +Named plugin result/custom event augmentation flows from the old shared types to +the new view; new augmentation should target artplayer/runtime/types. Constructor +plugin callbacks see plugins as optional until its registry is assigned. Other +early construction hosts similarly expose only initialized components; customType, +setting mounted and ready callbacks run after construction. The actual input +factory, callback receiver and player identities are unchanged. + +The docs global keeps the legacy view for its bundled Monaco compiler. build:ts +follows the public type graph and generates a standalone UMD declaration; modern +runtime declarations are not merged into it. This is independent of the npm +declaration generator and does not add runtime code. + ## Evidence and maintenance declaration-legacy.ts is a compile-only regression fixture, not recommended runtime diff --git a/packages/artplayer/types/README.md b/packages/artplayer/types/README.md index 7bbf1a9a1..8384817f1 100644 --- a/packages/artplayer/types/README.md +++ b/packages/artplayer/types/README.md @@ -1,8 +1,36 @@ # Declaration entrypoints -`artplayer.d.ts` remains the shared API definition and old TypeScript entry. Its -relative declarations describe the existing player; they are not a claim that the -runtime has already migrated to TypeScript. +The TypeScript files in `../public/` are the source for these declarations. +`yarn build:types` uses the pinned TypeScript compiler to emit the existing `.d.ts`, +`.d.mts` and `.d.cts` paths; `yarn check:types` verifies them without writing. +Do not hand-edit generated declarations. The generator rejects dependencies on +implementation files and emits no JavaScript. Public source files are excluded +from the npm package. + +`artplayer.d.ts` remains the shared API definition and old TypeScript entry. +This facade preserves historical consumer acceptance; COMPATIBILITY.md explains +the retained inaccuracies and the optional precise view. + +CORE-21 generates precise modules in `runtime/` and assembles them in runtime.d.ts. +Choose `import Artplayer from 'artplayer/runtime'` for the precise view, or +`artplayer/runtime/legacy` for the existing legacy JS build with the same precise +types. These views require the modern accessor syntax tested with TypeScript +5.1.6 and 5.9.3. Their JS targets are identical to the corresponding existing +entrypoints; no constructor or instance wrapper is created. + +Use the type-only `artplayer/runtime/types` entry to augment precise Plugins and +Events. Legacy custom event/plugin result augmentation is also retained. Existing +root entrypoints do not import the modern views, preserving TypeScript 4.3.5. +Old typed plugin factories remain accepted by explicit input overloads; precise +instances do not pretend to satisfy inaccurate legacy return declarations. +PluginFactory uses PluginHost: its plugins field is optional because constructor +factories execute before that registry is assigned. Inline plugins.add callbacks +receive the completed player. New controls require a top/left/right position; +updates may retain the existing position. ProxyHost exposes safe initial fields +before Template returns. Layer/control/contextmenu hosts mark later components +optional; customType and setting mounted run after a delay and receive the full +instance. These hosts retain distinct Player getter/setter types. Container inputs +and template.$container remain HTMLDivElement because only div is supported. Conditional exports select `artplayer.d.mts` for ESM and `artplayer.d.cts` for CJS and legacy. The CJS bridge uses `export =` for the real module.exports constructor @@ -17,15 +45,18 @@ i18n.d.ts contains dictionary definitions without suppressed module augmentation The editor's global language module is generated separately as docs/assets/ts/artplayer-i18n.d.ts so it cannot contaminate npm consumers. -Top-level types and historical .d.ts filenames remain available; runtime paths and -exports do not change. See TypeScript's declaration module format and conditional +Top-level types and historical .d.ts filenames remain available; existing runtime +paths and exports do not change. See TypeScript's declaration module format and conditional resolution rules: https://www.typescriptlang.org/docs/handbook/modules/reference.html When changing types, run `yarn typecheck`, `yarn test:baseline` and `yarn test:package:release`. They cover default/named types, core/legacy constructors, chapter/legacy factories, language data, invalid inputs, NodeNext/Bundler and old -TS 4.3.5 consumers. Run `yarn build:ts` to refresh editor declarations. Full editor -behavior and other core declaration/runtime mismatches have CORE-07/SITE tasks. +TS 4.3.5 consumers. Run `yarn build:ts` to refresh editor declarations. The core +editor bundle comes from the public dependency graph and is checked standalone +with both compilers. editor-types.test.js rejects stale or invalid output, and +editor-types.spec.js exercises the real Monaco worker and typed example playback. +Plugin/editor UI modernization remains in SITE tasks. ## Configuration migration boundary @@ -42,8 +73,8 @@ test/types/options-source.ts and declaration-inputs.ts cover those forms positiv declaration-legacy.ts preserves old reads and historically legal return assumptions. Do not change runtime validation to match a narrower declaration. The additions, retained conflicts and follow-up owners are detailed in [COMPATIBILITY.md](./COMPATIBILITY.md). -CORE-07 coordinates the differences; it does not close every conflicting old return -signature. CORE-21 remains responsible for the generated/public declaration strategy. +CORE-07 introduced compatible additions. CORE-21 supplies the generated precise +runtime entry for remaining conflicts while preserving historical root signatures. ## Internal media migration @@ -58,7 +89,7 @@ shims and minimal playback/layout dependencies. These types are not exported by the package. Public art.video keeps its historical declaration and runtime identity; do not cast an internal canvas to HTMLVideoElement merely to satisfy that public declaration. Optional capability checks belong to their consumers. Full constructor -type integration is tracked by CORE-20; proxy package migration validates each real +type integration was completed in CORE-20; proxy package migration validates each real adapter separately. Source type fixtures and real canvas integration live in test/types/media-hosts.ts and test/browser/media-hosts.spec.js. diff --git a/packages/artplayer/types/artplayer.d.cts b/packages/artplayer/types/artplayer.d.cts index d373c652c..8ee7c37eb 100644 --- a/packages/artplayer/types/artplayer.d.cts +++ b/packages/artplayer/types/artplayer.d.cts @@ -1,13 +1,14 @@ +// Generated from public/artplayer.cts by yarn build:types. Do not edit. +/* eslint-disable ts/no-redeclare -- Constructor, instance and named types share the export. */ import type * as Definition from './artplayer.js' declare const Artplayer: typeof Definition.default -// eslint-disable-next-line ts/no-redeclare -- CJS constructor value and instance type share the export. type Artplayer = Definition.default - -// eslint-disable-next-line ts/no-redeclare -- Namespace merging carries named types on export =. declare namespace Artplayer { type Config = Definition.Config - type Emitter> = Definition.Emitter + type Emitter> = Definition.Emitter type Events = Definition.Events type I18n = Definition.I18n type Icons = Definition.Icons @@ -24,5 +25,4 @@ declare namespace Artplayer { type Template = Definition.Template type Utils = Definition.Utils } - export = Artplayer diff --git a/packages/artplayer/types/artplayer.d.mts b/packages/artplayer/types/artplayer.d.mts index 7400ac73a..455741a3d 100644 --- a/packages/artplayer/types/artplayer.d.mts +++ b/packages/artplayer/types/artplayer.d.mts @@ -1,2 +1,3 @@ +// Generated from public/artplayer.mts by yarn build:types. Do not edit. export { default } from './artplayer.cjs' export type { Config, Emitter, Events, I18n, Icons, Option, OptionInput, PlaybackControls, Player, PluginFactory, Plugins, Setting, SettingOption, Subtitle, SubtitleUpdateEvents, Template, Utils } from './artplayer.js' diff --git a/packages/artplayer/types/artplayer.d.ts b/packages/artplayer/types/artplayer.d.ts index 6964bb4f8..fce69088b 100644 --- a/packages/artplayer/types/artplayer.d.ts +++ b/packages/artplayer/types/artplayer.d.ts @@ -1,3 +1,4 @@ +// Generated from public/artplayer.ts by yarn build:types. Do not edit. import type { Component } from './component' import type { Config } from './config' import type { Emitter } from './emitter' @@ -13,30 +14,10 @@ import type { Subtitle } from './subtitle' import type { Template } from './template' import type { Utils } from './utils' -export type { - Config, - Emitter, - Events, - I18n, - Icons, - Option, - OptionInput, - PlaybackControls, - Player, - PluginFactory, - Plugins, - Setting, - SettingOption, - Subtitle, - SubtitleUpdateEvents, - Template, - Utils, -} - -export default class Artplayer extends Player { +export type { Config, Emitter, Events, I18n, Icons, Option, OptionInput, PlaybackControls, Player, PluginFactory, Plugins, Setting, SettingOption, Subtitle, SubtitleUpdateEvents, Template, Utils } +declare class Artplayer extends Player { constructor(option: Option, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) constructor(option: OptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown) - static readonly instances: Artplayer[] static readonly version: string static readonly env: 'development' | 'production' @@ -44,12 +25,14 @@ export default class Artplayer extends Player { static readonly config: Config static readonly utils: Utils static readonly scheme: Record - static readonly Emitter: new >(...args: unknown[]) => Emitter + static readonly Emitter: new >(...args: unknown[]) => Emitter + static readonly validator: (option: T, scheme: object) => T static readonly kindOf: (item: unknown) => string static readonly html: Artplayer['template']['html'] static readonly option: Option - static STYLE: string static DEBUG: boolean static CONTEXTMENU: boolean @@ -84,7 +67,6 @@ export default class Artplayer extends Player { static LOG_VERSION: boolean static USE_RAF: boolean static REMOVE_SRC_WHEN_DESTROY: boolean - readonly id: number readonly option: Option readonly isLock: boolean @@ -93,39 +75,36 @@ export default class Artplayer extends Player { readonly isInput: boolean readonly isRotate: boolean readonly isDestroy: boolean - flv?: unknown m3u8?: unknown hls?: unknown ts?: unknown mpd?: unknown torrent?: unknown - on(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this on(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this on(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this - once(name: T, fn: (...args: Events[T]) => unknown, ctx?: object): this once(name: T, fn: (...args: SubtitleUpdateEvents[T]) => unknown, ctx?: object): this once(name: string, fn: (...args: unknown[]) => unknown, ctx?: object): this - emit(name: T, ...args: Events[T]): this emit(name: T, ...args: SubtitleUpdateEvents[T]): this emit(name: string, ...args: unknown[]): this - off(name: T, callback?: (...args: Events[T]) => unknown): this off(name: T, callback?: (...args: SubtitleUpdateEvents[T]) => unknown): this off(name: string, callback?: (...args: unknown[]) => unknown): this - query: Artplayer['template']['query'] proxy: Artplayer['events']['proxy'] video: Artplayer['template']['$video'] - - e: { [K in keyof Events]?: { fn: (...args: Events[K]) => unknown, ctx: unknown }[] } + e: { + [K in keyof Events]?: { + fn: (...args: Events[K]) => unknown + ctx: unknown + }[]; + } destroy(removeHtml?: boolean): void reset(): void - readonly template: { get html(): string query: (selector: string) => T | null @@ -139,7 +118,10 @@ export default class Artplayer extends Player { hover: (element: HTMLElement, mouseenter?: (event: Event) => any, mouseleave?: (event: Event) => any) => void remove: (destroyEvent: () => void) => void destroy: () => void - bindGlobalEvents: (source?: { window?: Window, document?: Document }) => void + bindGlobalEvents: (source?: { + window?: Window + document?: Document + }) => void } readonly storage: { @@ -155,7 +137,6 @@ export default class Artplayer extends Player { } readonly icons: Icons - readonly i18n: { languages: I18n language: Partial> @@ -174,7 +155,6 @@ export default class Artplayer extends Player { readonly layers: Record & Component readonly controls: Record & Component readonly contextmenu: Record & Component - readonly subtitle: { get url(): string set url(url: string) @@ -188,7 +168,6 @@ export default class Artplayer extends Player { readonly info: Component readonly loading: Component - readonly hotkey: { keys: Record any)[]> add: (key: string, callback: (this: Artplayer, event: KeyboardEvent) => any) => Artplayer['hotkey'] @@ -196,7 +175,6 @@ export default class Artplayer extends Player { } readonly mask: Component - readonly setting: { option: SettingOption[] updateStyle: (width?: number) => void @@ -212,3 +190,4 @@ export default class Artplayer extends Player { readonly plugins: Plugins } +export default Artplayer diff --git a/packages/artplayer/types/component.d.ts b/packages/artplayer/types/component.d.ts index 7fdf4213d..c130bdc18 100644 --- a/packages/artplayer/types/component.d.ts +++ b/packages/artplayer/types/component.d.ts @@ -1,63 +1,52 @@ +// Generated from public/component.ts by yarn build:types. Do not edit. import type Artplayer from './artplayer' - /** Input accepted by the existing HTML renderer, including numeric content. */ export interface ComponentInput extends Omit { html?: string | HTMLElement | number } - export interface Selector { /** * Whether the default is selected */ default?: boolean - /** * Html string of selector */ html: string | HTMLElement - /** * Value of selector item */ value?: string | number - /** * Allow custom properties */ [key: string]: any } - export interface Component { /** * Component self-increasing id */ readonly id: number - /** * Component parent name */ readonly name: string | undefined - /** * Component parent element */ readonly $parent: HTMLElement | undefined - /** * Whether to show component parent */ get show(): boolean - /** * Whether to show component parent */ set show(state: boolean) - /** * Toggle the component parent */ toggle: () => void - /** * Dynamic add a component */ @@ -65,12 +54,10 @@ export interface Component { (option: ComponentOption | ((art: Artplayer) => ComponentOption)): HTMLElement | undefined (option: ComponentInput | ((art: Artplayer) => ComponentInput)): HTMLElement | undefined } - /** * Dynamic remove a component by name */ remove: (name: string) => void - /** * Dynamic update a component */ @@ -79,63 +66,51 @@ export interface Component { (option: ComponentInput): HTMLElement | undefined } } - export interface ComponentOption { /** * Html string or html element of component */ html?: string | HTMLElement - /** * Whether to disable component */ disable?: boolean - /** * Unique name for component */ name?: string - /** * Component sort index */ index?: number - /** * Component style object */ style?: Partial - /** * Component click event */ click?: (this: Artplayer, component: Component, event: Event) => void - /** * When the component was mounted */ mounted?: (this: Artplayer, element: HTMLElement) => void - /** * When the component was before unmount */ beforeUnmount?: (this: Artplayer, element: HTMLElement) => void - /** * Component tooltip, use in controls */ tooltip?: string - /** * Component position, use in controls */ position?: 'top' | 'left' | 'right' | (string & Record) - /** * Custom selector list, use in controls */ selector?: Selector[] - /** * When selector item click, use in controls */ diff --git a/packages/artplayer/types/config.d.ts b/packages/artplayer/types/config.d.ts index 11c753b4e..e22eff3b3 100644 --- a/packages/artplayer/types/config.d.ts +++ b/packages/artplayer/types/config.d.ts @@ -1,3 +1,4 @@ +// Generated from public/config.ts by yarn build:types. Do not edit. export interface Config { readonly properties: readonly [ 'audioTracks', diff --git a/packages/artplayer/types/cssVar.d.ts b/packages/artplayer/types/cssVar.d.ts index e9384c07f..8c1738a5a 100644 --- a/packages/artplayer/types/cssVar.d.ts +++ b/packages/artplayer/types/cssVar.d.ts @@ -1,3 +1,4 @@ +// Generated from public/cssVar.ts by yarn build:types. Do not edit. export interface CssVar { '--art-theme': string '--art-font-color': string diff --git a/packages/artplayer/types/emitter.d.ts b/packages/artplayer/types/emitter.d.ts index f9bb749c1..83b243a3a 100644 --- a/packages/artplayer/types/emitter.d.ts +++ b/packages/artplayer/types/emitter.d.ts @@ -1,6 +1,14 @@ +// Generated from public/emitter.ts by yarn build:types. Do not edit. /** The event bus exposed by Artplayer.Emitter; no new runtime export. */ -export interface Emitter> { - e?: { [Name in keyof Events]?: { fn: (...args: [...Events[Name]]) => unknown, ctx: unknown }[] } +export interface Emitter> { + e?: { + [Name in keyof Events]?: { + fn: (...args: [...Events[Name]]) => unknown + ctx: unknown + }[]; + } on: (name: Name, fn: (this: Context, ...args: [...Events[Name]]) => unknown, ctx?: Context) => this once: (name: Name, fn: (this: Context, ...args: [...Events[Name]]) => unknown, ctx?: Context) => this emit: (name: Name, ...args: [...Events[Name]]) => this diff --git a/packages/artplayer/types/events.d.ts b/packages/artplayer/types/events.d.ts index 624bbd55a..54df11ecc 100644 --- a/packages/artplayer/types/events.d.ts +++ b/packages/artplayer/types/events.d.ts @@ -1,14 +1,13 @@ +// Generated from public/events.ts by yarn build:types. Do not edit. import type { AspectRatio, Flip } from './player' import type { Subtitle } from './subtitle' export type Bar = 'loaded' | 'played' | 'hover' - /** Actual built-in subtitle update payloads; legacy Events keeps its scalar types. */ export interface SubtitleUpdateEvents { subtitleBeforeUpdate: [cues: VTTCue[]] subtitleAfterUpdate: [cues: VTTCue[]] } - export interface Events { 'document:click': [event: Event] 'document:mouseup': [event: Event] @@ -22,11 +21,9 @@ export interface Events { 'document:pointermove': [event: Event] 'document:visibilitychange': [event: Event] 'document:webkitfullscreenchange': [event: Event] - 'window:resize': [event: Event] 'window:scroll': [event: Event] 'window:orientationchange': [event: Event] - 'video:abort': [event: Event] 'video:canplay': [event: Event] 'video:canplaythrough': [event: Event] @@ -51,7 +48,6 @@ export interface Events { 'video:timeupdate': [event: Event] 'video:volumechange': [event: Event] 'video:waiting': [event: Event] - 'info': [state: boolean] 'layer': [state: boolean] 'loading': [state: boolean] @@ -61,33 +57,31 @@ export interface Events { 'control': [state: boolean] 'setting': [state: boolean] 'hotkey': [event: KeyboardEvent] - 'destroy': [] - 'subtitleOffset': [offset: number] /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ 'subtitleBeforeUpdate': [cue: VTTCue] /** Legacy contextual type; annotate listeners with VTTCue[] for the runtime payload. */ 'subtitleAfterUpdate': [cue: VTTCue] 'subtitleLoad': [cues: VTTCue[], option: Subtitle] - 'focus': [event: Event] 'blur': [event: Event] 'dblclick': [event: Event] 'click': [event: Event] 'hover': [state: boolean, event: Event] 'mousemove': [event: Event] - 'resize': [] 'view': [state: boolean] 'lock': [state: boolean] 'aspectRatio': [aspectRatio: AspectRatio] 'autoHeight': [height: number] - 'autoSize': [size: { width: number, height: number }] + 'autoSize': [size: { + width: number + height: number + }] 'ready': [] 'airplay': [] 'raf': [] - 'error': [error: Error, reconnectTime: number] 'flip': [flip: Flip] 'fullscreen': [state: boolean] diff --git a/packages/artplayer/types/i18n.d.ts b/packages/artplayer/types/i18n.d.ts index 4986660c1..9cf0cb51d 100644 --- a/packages/artplayer/types/i18n.d.ts +++ b/packages/artplayer/types/i18n.d.ts @@ -1,19 +1,5 @@ -type I18nKeys - = | 'en' - | 'zh-cn' - | 'zh-tw' - | 'pl' - | 'cs' - | 'es' - | 'fa' - | 'fr' - | 'id' - | 'ru' - | 'tr' - | 'ar' - | 'vi' - | (string & Record) - +// Generated from public/i18n.ts by yarn build:types. Do not edit. +type I18nKeys = 'en' | 'zh-cn' | 'zh-tw' | 'pl' | 'cs' | 'es' | 'fa' | 'fr' | 'id' | 'ru' | 'tr' | 'ar' | 'vi' | (string & Record) interface I18nValue { 'Video Info': string 'Close': string @@ -52,5 +38,5 @@ interface I18nValue { 'AirPlay': string 'AirPlay Not Available': string } - export type I18n = Partial>> +export {} diff --git a/packages/artplayer/types/icons.d.ts b/packages/artplayer/types/icons.d.ts index b97cf5662..80569d445 100644 --- a/packages/artplayer/types/icons.d.ts +++ b/packages/artplayer/types/icons.d.ts @@ -1,3 +1,4 @@ +// Generated from public/icons.ts by yarn build:types. Do not edit. export interface Icons { readonly loading: HTMLDivElement readonly state: HTMLDivElement diff --git a/packages/artplayer/types/language.d.cts b/packages/artplayer/types/language.d.cts index fb3306c43..bd0f16270 100644 --- a/packages/artplayer/types/language.d.cts +++ b/packages/artplayer/types/language.d.cts @@ -1,3 +1,4 @@ +// Generated from public/language.cts by yarn build:types. Do not edit. import type { I18n } from './i18n.js' declare const language: NonNullable diff --git a/packages/artplayer/types/language.d.mts b/packages/artplayer/types/language.d.mts index 3b243cb0a..701e6a790 100644 --- a/packages/artplayer/types/language.d.mts +++ b/packages/artplayer/types/language.d.mts @@ -1 +1,2 @@ +// Generated from public/language.mts by yarn build:types. Do not edit. export { default } from './language.cjs' diff --git a/packages/artplayer/types/legacy/language.d.ts b/packages/artplayer/types/legacy/language.d.ts index 34de69188..42dda73fc 100644 --- a/packages/artplayer/types/legacy/language.d.ts +++ b/packages/artplayer/types/legacy/language.d.ts @@ -1,3 +1,4 @@ +// Generated from public/legacy/language.ts by yarn build:types. Do not edit. import type { I18n } from '../i18n' declare const language: NonNullable diff --git a/packages/artplayer/types/option.d.ts b/packages/artplayer/types/option.d.ts index 022d146bf..2216e79bd 100644 --- a/packages/artplayer/types/option.d.ts +++ b/packages/artplayer/types/option.d.ts @@ -1,3 +1,4 @@ +// Generated from public/option.ts by yarn build:types. Do not edit. import type Artplayer from './artplayer' import type { ComponentInput, ComponentOption } from './component' import type { CssVar } from './cssVar' @@ -8,47 +9,33 @@ import type { Quality } from './quality' import type { Setting } from './setting' import type { Subtitle } from './subtitle' -export type CustomType - = | 'flv' - | 'm3u8' - | 'hls' - | 'ts' - | 'mpd' - | 'torrent' - | (string & Record) - +export type CustomType = 'flv' | 'm3u8' | 'hls' | 'ts' | 'mpd' | 'torrent' | (string & Record) export interface Thumbnails { /** * The thumbnail image url */ url: string - /** * The thumbnail item number */ number?: number - /** * The thumbnail column size */ column?: number - /** * The thumbnail width */ width?: number - /** * The thumbnail height */ height?: number - /** * The thumbnail scale */ scale?: number } - /** Constructor input; Option retains its historical required URL/read types. */ export interface OptionInput extends Omit { url?: string @@ -56,218 +43,175 @@ export interface OptionInput extends Omit HTMLCanvasElement | HTMLVideoElement | undefined - /** * Custom plugin list */ plugins?: PluginFactory[] - /** * Custom layer list */ layers?: ComponentOption[] - /** * Custom contextmenu list */ contextmenu?: ComponentOption[] - /** * Custom control list */ controls?: ComponentOption[] - /** * Custom setting list */ settings?: Setting[] - /** * Custom video quality list */ quality?: Quality[] - /** * Custom highlight list */ @@ -276,56 +220,41 @@ export interface Option { * The highlight time */ time: number - /** * The highlight text */ text: string }[] - /** * Custom thumbnail */ thumbnails?: Thumbnails - /** * Custom subtitle option */ subtitle?: Subtitle - /** * Other video attribute */ moreVideoAttr?: Partial unknown - ? never - : K]: HTMLVideoElement[K] + [K in keyof HTMLVideoElement as HTMLVideoElement[K] extends (...args: unknown[]) => unknown ? never : K]: HTMLVideoElement[K]; }>> - /** * Custom i18n */ i18n?: I18n - /** * Custom default icons */ icons?: { - [key in keyof Icons]?: HTMLElement | string + [key in keyof Icons]?: HTMLElement | string; } - /** * Custom css variables */ cssVar?: Partial - /** * Custom video type function */ - customType?: Partial< - Record< - CustomType, - (this: Artplayer, video: HTMLVideoElement, url: string, art: Artplayer) => unknown | Promise - > - > + customType?: Partial unknown | Promise>> } diff --git a/packages/artplayer/types/playback.d.ts b/packages/artplayer/types/playback.d.ts index b9452c046..c75525804 100644 --- a/packages/artplayer/types/playback.d.ts +++ b/packages/artplayer/types/playback.d.ts @@ -1,3 +1,4 @@ +// Generated from public/playback.ts by yarn build:types. Do not edit. /** Accurate playback method view; assign an existing player without a runtime wrapper. */ export interface PlaybackControls { play: () => Promise diff --git a/packages/artplayer/types/player.d.ts b/packages/artplayer/types/player.d.ts index 14051a790..54a1f1d30 100644 --- a/packages/artplayer/types/player.d.ts +++ b/packages/artplayer/types/player.d.ts @@ -1,3 +1,4 @@ +// Generated from public/player.ts by yarn build:types. Do not edit. import type { CssVar } from './cssVar' import type { CustomType, Thumbnails } from './option' import type { Quality } from './quality' @@ -6,48 +7,34 @@ export type AspectRatio = 'default' | '4:3' | '16:9' | (`${number}:${number}` & export type PlaybackRate = 0.5 | 0.75 | 1.0 | 1.25 | 1.5 | 1.75 | 2.0 | (number & Record) export type Flip = 'normal' | 'horizontal' | 'vertical' | (string & Record) export type State = 'standard' | 'mini' | 'pip' | 'fullscreen' | 'fullscreenWeb' - export declare class Player { get aspectRatio(): AspectRatio set aspectRatio(ratio: AspectRatio) - get state(): State set state(state: State) - get type(): CustomType set type(name: CustomType) - get playbackRate(): PlaybackRate set playbackRate(rate: PlaybackRate) - get currentTime(): number set currentTime(time: number) - get duration(): number get played(): number get playing(): boolean - get flip(): Flip set flip(state: Flip) - get fullscreen(): boolean set fullscreen(state: boolean) - get fullscreenWeb(): boolean set fullscreenWeb(state: boolean) - get loaded(): number get loadedTime(): number - get mini(): boolean set mini(state: boolean) - get pip(): boolean set pip(state: boolean) - get poster(): string set poster(url: string) - get rect(): DOMRect get bottom(): number get height(): number @@ -57,55 +44,39 @@ export declare class Player { get width(): number get x(): number get y(): number - set seek(time: number) get seek(): number - set forward(time: number) get forward(): number - set backward(time: number) get backward(): number - get url(): string set url(url: string) - get volume(): number set volume(percentage: number) - get muted(): boolean set muted(state: boolean) - get theme(): string set theme(theme: string) - get subtitleOffset(): number set subtitleOffset(time: number) - get switch(): string set switch(url: string) - get quality(): Quality[] set quality(quality: Quality[]) - get thumbnails(): Thumbnails set thumbnails(thumbnails: Thumbnails) - pause(): void play(): Promise /** Legacy signature; runtime preserves pause's synchronous result or play's Promise. */ toggle(): void - attr(key: string, value?: unknown): unknown cssVar(key: T, value?: CssVar[T]): CssVar[T] - switchUrl(url: string): Promise switchQuality(url: string): Promise - getDataURL(): Promise getBlobUrl(): Promise screenshot(name?: string): Promise - airplay(): void autoSize(): void autoHeight(): void diff --git a/packages/artplayer/types/plugin.d.ts b/packages/artplayer/types/plugin.d.ts index 1f4a61ee6..a70eda02b 100644 --- a/packages/artplayer/types/plugin.d.ts +++ b/packages/artplayer/types/plugin.d.ts @@ -1,7 +1,7 @@ +// Generated from public/plugin.ts by yarn build:types. Do not edit. import type Artplayer from './artplayer' export type PluginFactory = (this: Host, art: Host) => Result - /** Augment this interface with installed plugin results; augmentation does not register a plugin. */ export interface Plugins { /** Legacy signature: synchronous factories return this registry; Promise factories return a Promise of it. */ diff --git a/packages/artplayer/types/quality.d.ts b/packages/artplayer/types/quality.d.ts index 04058141a..b6c58777d 100644 --- a/packages/artplayer/types/quality.d.ts +++ b/packages/artplayer/types/quality.d.ts @@ -1,14 +1,13 @@ +// Generated from public/quality.ts by yarn build:types. Do not edit. export interface Quality { /** * Whether the default is selected */ default?: boolean - /** * Html string of quality */ html: string | HTMLElement - /** * Video quality url */ diff --git a/packages/artplayer/types/runtime.d.cts b/packages/artplayer/types/runtime.d.cts new file mode 100644 index 000000000..d43661455 --- /dev/null +++ b/packages/artplayer/types/runtime.d.cts @@ -0,0 +1,53 @@ +// Generated from public/runtime.cts by yarn build:types. Do not edit. +/* eslint-disable ts/no-redeclare -- Constructor, instance and named types share the export. */ +import type * as Definition from './runtime.js' + +declare const Artplayer: typeof Definition.default +type Artplayer = Definition.default +declare namespace Artplayer { + type ArtplayerConstructor = Definition.ArtplayerConstructor + type OptionInput = Definition.OptionInput + type Option = Definition.Option + type Events = Definition.Events + type Plugins = Definition.Plugins + type PluginFactory = Definition.PluginFactory + type PluginHost = Definition.PluginHost + type ProxyHost = Definition.ProxyHost + type CustomTypeHost = Definition.CustomTypeHost + type LayerHost = Definition.LayerHost + type ControlHost = Definition.ControlHost + type ContextmenuHost = Definition.ContextmenuHost + type PluginRegistration = Definition.PluginRegistration + type Component = Definition.Component + type Controls = Definition.Controls + type Setting = Definition.Setting + type Subtitle = Definition.Subtitle + type Notice = Definition.Notice + type Utils = Definition.Utils + type MediaSurface = Definition.MediaSurface + type NativeMedia = Definition.NativeMedia + type CanvasMedia = Definition.CanvasMedia + type Player = Definition.Player + type Template = Definition.Template + type Icons = Definition.Icons + type Config = Definition.Config + type EventRegistry = Definition.EventRegistry + type Storage = Definition.Storage + type I18n = Definition.I18n + type Hotkey = Definition.Hotkey + type Languages = Definition.Languages + type Dictionary = Definition.Dictionary + type QualityItem = Definition.QualityItem + type SettingItem = Definition.SettingItem + type ComponentInput = Definition.ComponentInput + type ComponentOption = Definition.ComponentOption + type ControlInput = Definition.ControlInput + type ControlOption = Definition.ControlOption + type SelectorItem = Definition.SelectorItem + type SubtitleCue = Definition.SubtitleCue + type SubtitleOption = Definition.SubtitleOption + type Emitter> = Definition.Emitter +} +export = Artplayer diff --git a/packages/artplayer/types/runtime.d.mts b/packages/artplayer/types/runtime.d.mts new file mode 100644 index 000000000..5fe7333d0 --- /dev/null +++ b/packages/artplayer/types/runtime.d.mts @@ -0,0 +1,3 @@ +// Generated from public/runtime.mts by yarn build:types. Do not edit. +export { default } from './runtime.cjs' +export type * from './runtime.js' diff --git a/packages/artplayer/types/runtime.d.ts b/packages/artplayer/types/runtime.d.ts new file mode 100644 index 000000000..6f9e0ccef --- /dev/null +++ b/packages/artplayer/types/runtime.d.ts @@ -0,0 +1,130 @@ +// Generated from public/runtime.ts by yarn build:types. Do not edit. +/* eslint-disable ts/no-redeclare -- Constructor, instance and named types share the export. */ +import type LegacyArtplayer from './artplayer' +import type { Emitter } from './emitter' +import type { OptionInput as LegacyOptionInput } from './option' +import type { PluginFactory as LegacyPluginFactory, Plugins as LegacyPlugins } from './plugin' +import type { ComponentInput, Component as ComponentView, ControlInput, Controls as ControlsView } from './runtime/component' +import type { ContextmenuHost, ControlHost, CustomTypeHost, LayerHost, PluginHost, ProxyHost } from './runtime/construction' +import type { Events } from './runtime/events' +import type { MediaSurface } from './runtime/media' +import type { OptionInput as OptionInputView, Option as OptionView } from './runtime/option' +import type { Player } from './runtime/player' +import type { PluginFactory as FactoryView, PluginRegistration, Plugins as PluginsView } from './runtime/plugin' +import type { Config, EventRegistry, Hotkey, I18n, Scheme, Storage, ValidatorPath } from './runtime/services' +import type { Setting as SettingView } from './runtime/setting' +import type { Notice as NoticeView, Subtitle as SubtitleView } from './runtime/subtitle' +import type { Icons, Template } from './runtime/template' +import type { Utils } from './runtime/utils' + +export type { Emitter } from './emitter' +export type { ComponentInput, ComponentOption, ControlInput, ControlOption, SelectorItem } from './runtime/component' +export type { ContextmenuHost, ControlHost, CustomTypeHost, LayerHost, PluginHost, ProxyHost } from './runtime/construction' +export type { Events } from './runtime/events' +export type { CanvasMedia, MediaSurface, NativeMedia } from './runtime/media' +export type { Player, QualityItem } from './runtime/player' +export type { PluginRegistration } from './runtime/plugin' +export type { Config, Dictionary, EventRegistry, Hotkey, I18n, Languages, Storage } from './runtime/services' +export type { SettingItem } from './runtime/setting' +export type { SubtitleCue, SubtitleOption } from './runtime/subtitle' +export type { Icons, Template } from './runtime/template' +export type { Utils } from './runtime/utils' +export type PluginFactory = FactoryView +export interface OptionInput extends Omit, 'plugins' | 'proxy' | 'customType' | 'layers' | 'controls' | 'contextmenu'> { + plugins?: PluginFactory[] + proxy?: (this: ProxyHost, art: ProxyHost) => MediaSurface + customType?: Record unknown) | undefined> + layers?: ComponentInput[] + controls?: ControlInput[] + contextmenu?: ComponentInput[] +} +export interface Option extends OptionView { +} +export interface Component extends ComponentView { +} +export interface Controls extends ControlsView { +} +export interface Setting extends SettingView { +} +export interface Subtitle extends SubtitleView, Omit { +} +export interface Notice extends NoticeView { + art: Artplayer +} +/** Augment with installed results. Factories are not wrapped or converted. */ +export interface PluginAdd { + (plugin: FactoryView): PluginRegistration + (plugin: LegacyPluginFactory): PluginRegistration +} +type LegacyPluginResults = { + [Name in keyof LegacyPlugins as string extends Name ? never : number extends Name ? never : Name extends keyof PluginsView ? never : Name]: LegacyPlugins[Name]; +} +export interface Plugins extends Omit, 'add'>, LegacyPluginResults { + add: PluginAdd + [name: string]: unknown +} +/** Public view of the existing constructor; this interface emits no runtime fields. */ +interface Artplayer extends Player, Emitter { + constructor: ArtplayerConstructor + id: number + option: Option + isLock: boolean + isReady: boolean + isFocus: boolean + isInput: boolean + isRotate: boolean + isDestroy: boolean + flv?: unknown + m3u8?: unknown + hls?: unknown + ts?: unknown + mpd?: unknown + torrent?: unknown + template: Template + events: EventRegistry + storage: Storage + icons: Icons + i18n: I18n + notice: Notice + /** The descriptor installer has no public instance members. */ + player: object + layers: Component + controls: Controls + contextmenu: Component & { + init: () => void + } + subtitle: Subtitle + info: Component & { + init: () => void + } + loading: Component + hotkey: Hotkey + mask: Component + setting: Setting + plugins: Plugins + readonly query: Template['query'] + readonly proxy: EventRegistry['proxy'] + readonly video: MediaSurface + reset: () => void + destroy: (removeHtml?: boolean) => void +} +type StaticOptions = Pick>> +export interface ArtplayerConstructor extends StaticOptions { + new (option: OptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown): Artplayer + new (option: LegacyOptionInput, readyCallback?: (this: Artplayer, art: Artplayer) => unknown): Artplayer + readonly prototype: Artplayer + readonly instances: Artplayer[] + readonly version: string + readonly config: Config + readonly utils: Utils + readonly scheme: Record + readonly Emitter: new >(...args: unknown[]) => Emitter + readonly validator: (option: T, scheme: Scheme, paths?: ValidatorPath) => T + readonly kindOf: (value: unknown) => string + readonly html: string + readonly option: Option +} +declare const Artplayer: ArtplayerConstructor +export default Artplayer diff --git a/packages/artplayer/types/runtime/component.d.ts b/packages/artplayer/types/runtime/component.d.ts new file mode 100644 index 000000000..cf1e505f7 --- /dev/null +++ b/packages/artplayer/types/runtime/component.d.ts @@ -0,0 +1,58 @@ +// Generated from public/runtime/component.ts by yarn build:types. Do not edit. +export type EventCleanup = () => void +export interface SelectorItem { + html: string | HTMLElement | number + value?: string | number + default?: boolean + readonly $control_option?: SelectorItem[] + readonly $control_item?: HTMLDivElement + readonly $control_value?: HTMLDivElement +} +export interface ComponentOption { + html?: string | HTMLElement | number + disable?: boolean + name?: string + index?: number + style?: Partial + tooltip?: string | number + position?: string + selector?: SelectorItem[] + click?: (this: Host, component: Component, event: Event) => unknown + mounted?: (this: Host, element: HTMLDivElement) => unknown + beforeUnmount?: (this: Host, element: HTMLDivElement) => unknown + onSelect?: (this: Host, item: SelectorItem, element: HTMLDivElement, event: Event) => unknown +} +export type ComponentInput = ComponentOption | ((art: Host) => ComponentOption) +export interface ControlOption extends Omit, 'position'> { + position: 'top' | 'left' | 'right' +} +export type ControlInput = ControlOption | ((art: Host) => ControlOption) +export interface ComponentEntry { + $ref: HTMLDivElement + events: EventCleanup[] + option: ComponentOption +} +export interface Component { + id: number + art: Host + name?: string + $parent?: HTMLElement + cache: Map> + show: boolean + toggle: () => void + add: (input: ComponentInput) => HTMLDivElement | undefined + remove: (name: string) => void + update: (option: ComponentOption) => ReturnType + selector?: (option: ComponentOption, element: HTMLDivElement, events: EventCleanup[]) => void +} +export interface Controls extends Omit, 'add' | 'update' | 'selector'> { + isHover: boolean + timer: number + setting?: HTMLDivElement + thumbnails?: HTMLDivElement + init: () => void + add: (input: ControlInput) => undefined + update: (option: ComponentOption) => undefined + check: (target?: SelectorItem) => void + selector: (option: ComponentOption, element: HTMLDivElement, events: EventCleanup[]) => void +} diff --git a/packages/artplayer/types/runtime/construction.d.ts b/packages/artplayer/types/runtime/construction.d.ts new file mode 100644 index 000000000..bd3ed9e27 --- /dev/null +++ b/packages/artplayer/types/runtime/construction.d.ts @@ -0,0 +1,18 @@ +// Generated from public/runtime/construction.ts by yarn build:types. Do not edit. +import type { Emitter } from '../emitter' +import type Artplayer from '../runtime' +import type { Events } from './events' +import type { Player } from './player' +/** Safe fields before Template returns; video/query/proxy getters are not usable yet. */ +export interface ProxyHost extends Emitter, Pick { +} +type Pending = Player & Omit & Partial> +type AfterPlayer = 'layers' | 'controls' | 'contextmenu' | 'subtitle' | 'info' | 'loading' | 'hotkey' | 'mask' | 'setting' | 'plugins' +/** URL assignment awaits its owned delay before invoking customType. */ +export type CustomTypeHost = Artplayer +export type LayerHost = Pending +export type ControlHost = Pending> +export type ContextmenuHost = Pending> +/** Constructor factories run before the Plugins registry is assigned to the player. */ +export type PluginHost = Pending<'plugins'> +export {} diff --git a/packages/artplayer/types/runtime/events.d.ts b/packages/artplayer/types/runtime/events.d.ts new file mode 100644 index 000000000..eee30f22c --- /dev/null +++ b/packages/artplayer/types/runtime/events.d.ts @@ -0,0 +1,29 @@ +// Generated from public/runtime/events.ts by yarn build:types. Do not edit. +import type { Events as LegacyEvents } from '../events' +import type { SubtitleCue, SubtitleOption } from './subtitle' + +type NativeEvents = { + [Name in Extract]: [event: Event]; +} +interface BuiltinEvents { + [name: `video:${string}`]: [event: Event] + 'document:keydown': [KeyboardEvent] + 'document:mousemove': [MouseEvent] + 'document:mouseup': [MouseEvent] + 'mousemove': [MouseEvent] + 'click': [MouseEvent] + 'blur': [Event] + 'error': [error: unknown, attempt: number] + 'fullscreenError': [error: unknown] + 'aspectRatio': [string] + 'flip': [string] + 'seek': [time: number, requestedTime: number | string] + 'setBar': [type: string, percentage: number, event?: MouseEvent | TouchEvent] + 'subtitleBeforeUpdate': [cues: SubtitleCue[]] + 'subtitleAfterUpdate': [cues: SubtitleCue[]] + 'subtitleLoad': [cues: SubtitleCue[], option: SubtitleOption | null] +} +/** Legacy custom event augmentation is retained; builtin payload corrections take precedence. */ +export interface Events extends Omit, NativeEvents, BuiltinEvents, Record { +} +export {} diff --git a/packages/artplayer/types/runtime/media.d.ts b/packages/artplayer/types/runtime/media.d.ts new file mode 100644 index 000000000..2439ca959 --- /dev/null +++ b/packages/artplayer/types/runtime/media.d.ts @@ -0,0 +1,37 @@ +// Generated from public/runtime/media.ts by yarn build:types. Do not edit. +export type MediaState = Pick & { + readonly playing?: boolean +} +export interface PlaybackMethods { + play: () => PlayResult + pause: () => PauseResult +} +export interface OptionalMediaCapabilities { + readonly textTracks?: ArrayLike + readonly error?: unknown + requestPictureInPicture?: () => Promise + requestVideoFrameCallback?: (callback: VideoFrameRequestCallback) => number + cancelVideoFrameCallback?: (handle: number) => void + webkitEnterFullscreen?: () => void + webkitExitFullscreen?: () => void + readonly webkitSupportsFullscreen?: boolean + webkitShowPlaybackTargetPicker?: () => void + webkitSupportsPresentationMode?: (mode: string) => boolean + webkitSetPresentationMode?: (mode: string) => void + readonly webkitPresentationMode?: string + readonly webkitDisplayingFullscreen?: boolean +} +export type NativeMedia = Omit & OptionalMediaCapabilities +export type CanvasMedia = HTMLCanvasElement & MediaState & PlaybackMethods & OptionalMediaCapabilities & { + src: string | null + readonly currentSrc: string | null + readonly videoWidth: number + readonly videoHeight: number + readonly buffered: TimeRanges + volume: number + muted: boolean + playbackRate: number + load: () => unknown +} +/** Check optional capabilities before calling them on a native or proxy surface. */ +export type MediaSurface = NativeMedia | CanvasMedia diff --git a/packages/artplayer/types/runtime/option.d.ts b/packages/artplayer/types/runtime/option.d.ts new file mode 100644 index 000000000..834aaf382 --- /dev/null +++ b/packages/artplayer/types/runtime/option.d.ts @@ -0,0 +1,27 @@ +// Generated from public/runtime/option.ts by yarn build:types. Do not edit. +import type { OptionInput as LegacyOptionInput, Thumbnails } from '../option' +import type { ComponentInput, ControlInput } from './component' +import type { MediaSurface } from './media' +import type { PluginFactory } from './plugin' +import type { Languages } from './services' +import type { SettingItem } from './setting' +import type { SubtitleOption } from './subtitle' +/** Callback receivers are the unchanged player instance selected by this view. */ +export interface OptionInput extends Omit { + container: string | HTMLDivElement + proxy?: (this: Host, art: Host) => MediaSurface | undefined + plugins?: PluginFactory[] + layers?: ComponentInput[] + controls?: ControlInput[] + contextmenu?: ComponentInput[] + settings?: SettingItem[] + customType?: Record unknown) | undefined> + i18n?: Languages + icons?: Record +} +/** Defaults are merged once; later setters may replace thumbnails with a partial input. */ +export interface Option extends Omit>, 'proxy' | 'subtitle' | 'thumbnails'> { + proxy: OptionInput['proxy'] + subtitle: SubtitleOption + thumbnails: Thumbnails +} diff --git a/packages/artplayer/types/runtime/player.d.ts b/packages/artplayer/types/runtime/player.d.ts new file mode 100644 index 000000000..a603ebbd1 --- /dev/null +++ b/packages/artplayer/types/runtime/player.d.ts @@ -0,0 +1,78 @@ +// Generated from public/runtime/player.ts by yarn build:types. Do not edit. +import type { Thumbnails } from '../option' +import type { State } from '../player' +import type { MediaSurface } from './media' + +export interface QualityItem { + html: string | HTMLElement + url: string + default?: boolean +} +/** Player-facing descriptors; native/proxy method results retain their identity. */ +export interface Player { + get currentTime(): number + set currentTime(time: number | string) + readonly duration: number + get seek(): undefined + set seek(time: number | string) + get forward(): undefined + set forward(time: number) + get backward(): undefined + set backward(time: number) + get switch(): undefined + set switch(url: string) + get quality(): undefined + set quality(items: QualityItem[]) + get url(): string | null + set url(value: string) + get state(): State + set state(value: string) + get pip(): Element | null | boolean + set pip(value: boolean) + /** The descriptor may be absent before metadata installs the available mode. */ + fullscreen?: boolean + fullscreenWeb: boolean + mini: boolean + volume: number + muted: boolean + playbackRate: number + aspectRatio: string + flip: string + poster: string + theme: string + type: string + subtitleOffset: number + thumbnails: Thumbnails + readonly loaded: number + readonly loadedTime: number + readonly played: number + readonly playing: boolean + readonly rect: DOMRect + readonly bottom: number + readonly height: number + readonly left: number + readonly right: number + readonly top: number + readonly width: number + readonly x: number + readonly y: number + play: () => Promise>> + pause: () => ReturnType + toggle: () => Promise>> | ReturnType + switchUrl: (url: string) => Promise + switchQuality: (url: string) => Promise + autoSize: () => void + autoHeight: () => void + airplay: () => void + getDataURL: () => Promise + getBlobUrl: () => Promise + screenshot: (name?: string) => Promise + attr: { + (key: PropertyKey): unknown + (key: PropertyKey, value: unknown): unknown + } + cssVar: { + (key: string): string + (key: string, value: unknown): string | void + } +} diff --git a/packages/artplayer/types/runtime/plugin.d.ts b/packages/artplayer/types/runtime/plugin.d.ts new file mode 100644 index 000000000..df9ab630e --- /dev/null +++ b/packages/artplayer/types/runtime/plugin.d.ts @@ -0,0 +1,10 @@ +// Generated from public/runtime/plugin.ts by yarn build:types. Do not edit. +export type PluginFactory = (this: Host, art: Host) => Result +export type PluginRegistration = unknown extends Result ? Registry | Promise : Result extends Promise ? Promise : Registry +/** The same registry is returned immediately or after its Promise factory settles. */ +export interface Plugins { + art: Host + id: number + add: (plugin: PluginFactory) => PluginRegistration + next: (plugin: PluginFactory, result: unknown) => this +} diff --git a/packages/artplayer/types/runtime/services.d.ts b/packages/artplayer/types/runtime/services.d.ts new file mode 100644 index 000000000..16cbb5d99 --- /dev/null +++ b/packages/artplayer/types/runtime/services.d.ts @@ -0,0 +1,55 @@ +// Generated from public/runtime/services.ts by yarn build:types. Do not edit. +export interface Config { + properties: string[] + methods: string[] + events: string[] + prototypes: string[] +} +export type Disposer = () => void +export type Listener = EventListenerOrEventListenerObject | null +export interface EventRegistry { + destroyEvents: Set + proxy: { + (target: EventTarget, name: string, callback: Listener, option?: boolean | AddEventListenerOptions | null): Disposer + (target: EventTarget, name: string[], callback: Listener, option?: boolean | AddEventListenerOptions | null): Disposer[] + (target: EventTarget, name: string | string[], callback: Listener, option?: boolean | AddEventListenerOptions | null): Disposer | Disposer[] + } + hover: (target: EventTarget, mouseenter?: (event: Event) => unknown, mouseleave?: (event: Event) => unknown) => void + remove: (dispose: Disposer) => void + destroy: () => void + bindGlobalEvents: (source?: { + window?: Window + document?: Document + }) => void +} +export interface Storage { + name: string + settings: Record + get: (key?: PropertyKey) => unknown + set: (key: PropertyKey, value: unknown) => void + del: (key: PropertyKey) => void + clear: () => void +} +export type Dictionary = Record +export type Languages = Record +export interface I18n { + art: Host + languages: Languages + language: Dictionary + init: () => void + get: (key: string) => string + update: (value: Languages) => void +} +export type HotkeyCallback = (this: Host, event: KeyboardEvent) => unknown +export interface Hotkey { + art: Host + keys: Record[]> + init: () => void + add: (key: string, callback: HotkeyCallback) => this + remove: (key: string, callback: HotkeyCallback) => this +} +export type ValidatorPath = (string | number)[] +export type Validator = (value: unknown, type: string, paths: ValidatorPath) => unknown +export type Scheme = string | Validator | Scheme[] | { + [key: string]: Scheme +} diff --git a/packages/artplayer/types/runtime/setting.d.ts b/packages/artplayer/types/runtime/setting.d.ts new file mode 100644 index 000000000..43c63a371 --- /dev/null +++ b/packages/artplayer/types/runtime/setting.d.ts @@ -0,0 +1,57 @@ +// Generated from public/runtime/setting.ts by yarn build:types. Do not edit. +export type SettingContent = string | HTMLElement | number +export type SettingRange = [value?: number, min?: number, max?: number, step?: number] +export type SettingCallback = (this: Host, item: SettingItem, element: HTMLDivElement, event: Event) => unknown +export interface SettingItem { + name?: string + html?: SettingContent + icon?: SettingContent + tooltip?: SettingContent + width?: number + value?: string | number + default?: boolean + switch?: boolean + range?: SettingRange + selector?: SettingItem[] + mounted?: (this: Host, element: HTMLDivElement, item: SettingItem) => unknown + onClick?: SettingCallback + onSwitch?: SettingCallback + onRange?: SettingCallback + onChange?: SettingCallback + onSelect?: SettingCallback + readonly $parent?: SettingItem + readonly $parents?: SettingItem[] + readonly $option?: SettingItem[] + readonly $events?: (() => void)[] + readonly $formatted?: boolean + readonly $item?: HTMLDivElement + readonly $icon?: HTMLDivElement + readonly $html?: HTMLDivElement + readonly $tooltip?: HTMLDivElement + readonly $switch?: HTMLDivElement + readonly $range?: HTMLInputElement +} +export interface Setting { + id: number + art: Host + name: string + $parent: HTMLElement + cache: Map[], HTMLDivElement> + active: SettingItem[] | null + option: SettingItem[] + readonly builtin: SettingItem[] + show: boolean + toggle: () => void + traverse: (callback: (item: SettingItem) => void, option?: SettingItem[]) => void + check: (target?: SettingItem | null) => void + format: (option?: SettingItem[], parent?: SettingItem, parents?: SettingItem[], names?: string[]) => void + find: (name?: string) => SettingItem | null + resize: () => void + inactivate: (item: SettingItem) => void + remove: (name: string) => void + update: (item: SettingItem) => SettingItem + add: >(item: Item, option?: SettingItem[]) => Item + createHeader: (item: SettingItem) => void + createItem: (item: SettingItem, isUpdate?: boolean) => void + render: (option?: SettingItem[]) => void +} diff --git a/packages/artplayer/types/runtime/subtitle.d.ts b/packages/artplayer/types/runtime/subtitle.d.ts new file mode 100644 index 000000000..2b182a8ff --- /dev/null +++ b/packages/artplayer/types/runtime/subtitle.d.ts @@ -0,0 +1,37 @@ +// Generated from public/runtime/subtitle.ts by yarn build:types. Do not edit. +import type { Subtitle as SubtitleInput } from '../subtitle' + +export type SubtitleOption = Required +export interface SubtitleCue extends TextTrackCue { + text: string + originalStartTime?: number + originalEndTime?: number +} +export interface SubtitleTrack extends HTMLTrackElement { + offset?: number +} +export interface Subtitle { + name: string + option: SubtitleOption | null + destroyEvent: () => unknown + url: string + readonly textTrack: TextTrack | undefined + readonly activeCues: SubtitleCue[] + readonly cues: SubtitleCue[] + show: boolean + toggle: () => void + style: { + (styles: Partial): HTMLDivElement + (key: string, value: string | number): HTMLDivElement + } + update: () => void + switch: (url: string, option?: SubtitleInput) => Promise + init: (option: SubtitleOption) => Promise + createTrack: (kind: string, url: string) => void +} +export interface Notice { + timer: number | null + get show(): boolean + set show(value: string | Error | false) + destroy: () => void +} diff --git a/packages/artplayer/types/runtime/template.d.ts b/packages/artplayer/types/runtime/template.d.ts new file mode 100644 index 000000000..85018bf18 --- /dev/null +++ b/packages/artplayer/types/runtime/template.d.ts @@ -0,0 +1,39 @@ +// Generated from public/runtime/template.ts by yarn build:types. Do not edit. +import type { MediaSurface } from './media' +/** Query results remain nullable for caller-supplied SSR templates. */ +export interface Template { + art: Host + $container: HTMLDivElement + $player: HTMLDivElement | null + $video: Media + $track: HTMLTrackElement | null + $poster: HTMLDivElement | null + $subtitle: HTMLDivElement | null + $danmuku: HTMLDivElement | null + $bottom: HTMLDivElement | null + $progress: HTMLDivElement | null + $controls: HTMLDivElement | null + $controlsLeft: HTMLDivElement | null + $controlsCenter: HTMLDivElement | null + $controlsRight: HTMLDivElement | null + $layer: HTMLDivElement | null + $loading: HTMLDivElement | null + $notice: HTMLDivElement | null + $noticeInner: HTMLDivElement | null + $mask: HTMLDivElement | null + $state: HTMLDivElement | null + $setting: HTMLDivElement | null + $info: HTMLDivElement | null + $infoPanel: HTMLDivElement | null + $infoClose: HTMLDivElement | null + $contextmenu: HTMLDivElement | null + $mini?: HTMLElement + query: (selector: string) => ElementType | null + init: () => void + destroy: (removeHtml: boolean) => void +} +export type IconName = 'loading' | 'state' | 'play' | 'pause' | 'check' | 'volume' | 'volumeClose' | 'screenshot' | 'setting' | 'pip' | 'arrowLeft' | 'arrowRight' | 'playbackRate' | 'aspectRatio' | 'config' | 'lock' | 'flip' | 'unlock' | 'fullscreenOff' | 'fullscreenOn' | 'fullscreenWebOff' | 'fullscreenWebOn' | 'switchOn' | 'switchOff' | 'error' | 'close' | 'airplay' +/** Default getters create fresh icon wrappers; unknown custom keys may be absent. */ +export type Icons = Readonly> & { + readonly [name: string]: HTMLElement | undefined +} diff --git a/packages/artplayer/types/runtime/utils.d.ts b/packages/artplayer/types/runtime/utils.d.ts new file mode 100644 index 000000000..40129b635 --- /dev/null +++ b/packages/artplayer/types/runtime/utils.d.ts @@ -0,0 +1,75 @@ +// Generated from public/runtime/utils.ts by yarn build:types. Do not edit. +interface StyledElement { + style: CSSStyleDeclaration +} +interface EventPathSource { + target: EventTarget | null + composedPath?: () => EventTarget[] +} +type StackFrame = ((...args: never[]) => unknown) | (abstract new (...args: never[]) => object) +export interface Utils { + isBrowser: boolean + userAgent: string + isMobile: boolean + isSafari: boolean + isIOS: boolean + isIOS13: boolean + query: (selector: string, parent?: ParentNode) => T | null + queryAll: (selector: string, parent?: ParentNode) => T[] + addClass: (target: Pick, className: string) => void + removeClass: (target: Pick, className: string) => void + hasClass: (target: Pick, className: string) => boolean + append: (parent: Element, child: unknown) => Element | ChildNode | null + remove: (child: T) => T + replaceElement: (newChild: T, oldChild: Node) => T + siblings: (target: Element) => Element[] + inverseClass: (target: Element, className: string) => void + createElement: { + (tag: K): HTMLElementTagNameMap[K] + (tag: string): HTMLElement + } + setStyle: (element: T, key: PropertyKey, value: unknown) => T + setStyles: (element: T, styles: object) => T + getStyle: { + (element: Element, key: string, numberType?: true): number + (element: Element, key: string, numberType: false): string + (element: Element, key: string, numberType: boolean): number | string + } + setStyleText: (id: string, cssText: string) => void + getRect: (element: Pick) => DOMRect + tooltip: (target: Element, message: string | number, position?: string) => void + isInViewport: (target: Pick, offset?: number) => boolean + includeFromEvent: (event: EventPathSource, target: EventTarget | null | undefined) => boolean + getSafeAreaInsets: () => { + top: number + right: number + bottom: number + left: number + } + srtToVtt: (text: string) => string + vttToBlob: (text: string) => string + assToVtt: (text: string) => string + getExt: (url: string) => string + download: (url: string, name: string) => void + loadImg: (url: string, scale?: number) => Promise + errorHandle: (condition: T, message?: string) => T + silencePromise: (value: T) => T extends Promise ? Promise : T + def: (object: T, name: PropertyKey, descriptor: PropertyDescriptor & object & ThisType) => T + has: (object: object, name: PropertyKey) => boolean + get: (object: object, name: PropertyKey) => PropertyDescriptor | undefined + mergeDeep: (...objects: T) => T[number] + sleep: (milliseconds?: number) => Promise + /** The wrapper preserves its call receiver; the old context argument is ignored. */ + debounce: (callback: (this: Receiver, ...args: Args) => unknown, duration: number, context?: object) => (this: Receiver, ...args: Args) => void + throttle: (callback: (this: Receiver, ...args: Args) => unknown, duration: number) => (this: Receiver, ...args: Args) => void + clamp: (number: number, a: number, b: number) => number + secondToTime: (second: number) => string + escape: (text: string) => string + unescape: (text: string) => string + capitalize: (text: string) => string + ArtPlayerError: new (message?: string, context?: StackFrame) => Error + getIcon: (key?: string, html?: string | HTMLElement) => HTMLElement + getComposedPath: (event: EventPathSource) => EventTarget[] + supportsFlex: () => boolean +} +export {} diff --git a/packages/artplayer/types/setting.d.ts b/packages/artplayer/types/setting.d.ts index 739dd5908..3f621ada2 100644 --- a/packages/artplayer/types/setting.d.ts +++ b/packages/artplayer/types/setting.d.ts @@ -1,3 +1,4 @@ +// Generated from public/setting.ts by yarn build:types. Do not edit. import type Artplayer from './artplayer' export interface SettingOption extends Omit { @@ -16,78 +17,63 @@ export interface SettingOption extends Omit void> $formatted: boolean } - export interface Setting { /** * Html string or html element of setting name */ html: string | HTMLElement - /** * Html string or html element of setting icon */ icon?: string | HTMLElement - /** * The width of setting */ width?: number - /** * The tooltip of setting */ tooltip?: string | HTMLElement - /** * Whether the default is selected */ default?: boolean - /** * Custom selector list */ selector?: Setting[] - /** * When the setting was mounted */ mounted?: (this: Artplayer, panel: HTMLDivElement, item: Setting) => void - /** * When selector item click */ onSelect?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - /** * Custom switch item */ switch?: boolean - /** * When switch item click */ onSwitch?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - /** * Custom range item */ range?: [value?: number, min?: number, max?: number, step?: number] - /** * When range item change */ onRange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - /** * When range item change in real time */ onChange?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - /** * When range item change in real time */ onClick?: (this: Artplayer, item: SettingOption, element: HTMLDivElement, event: Event) => void - /** * Allow custom properties */ diff --git a/packages/artplayer/types/subtitle.d.ts b/packages/artplayer/types/subtitle.d.ts index 9783d155c..b5f84c279 100644 --- a/packages/artplayer/types/subtitle.d.ts +++ b/packages/artplayer/types/subtitle.d.ts @@ -1,34 +1,29 @@ +// Generated from public/subtitle.ts by yarn build:types. Do not edit. export interface Subtitle { /** * The subtitle url */ url?: string - /** * The subtitle name */ name?: string - /** * The subtitle type */ type?: 'vtt' | 'srt' | 'ass' | (string & Record) - /** * The subtitle style object */ style?: Partial - /** * The subtitle encoding, default utf-8 */ encoding?: string - /** * Whether use escape, default true */ escape?: boolean - /** * Change the vtt text */ diff --git a/packages/artplayer/types/template.d.ts b/packages/artplayer/types/template.d.ts index 50c346a65..a4c7b67e8 100644 --- a/packages/artplayer/types/template.d.ts +++ b/packages/artplayer/types/template.d.ts @@ -1,3 +1,4 @@ +// Generated from public/template.ts by yarn build:types. Do not edit. export interface Template { readonly html: string readonly $container: HTMLDivElement diff --git a/packages/artplayer/types/utils.d.ts b/packages/artplayer/types/utils.d.ts index 63229ca7f..b51a268f8 100644 --- a/packages/artplayer/types/utils.d.ts +++ b/packages/artplayer/types/utils.d.ts @@ -1,3 +1,4 @@ +// Generated from public/utils.ts by yarn build:types. Do not edit. export interface Utils { isBrowser: boolean userAgent: string @@ -5,7 +6,6 @@ export interface Utils { isSafari: boolean isIOS: boolean isIOS13: boolean - query: (selector: string, parent?: Document | HTMLElement) => T | null queryAll: (selector: string, parent?: Document | HTMLElement) => T[] addClass: (target: HTMLElement, className: string) => void @@ -17,31 +17,34 @@ export interface Utils { siblings: (target: HTMLElement) => HTMLElement[] inverseClass: (target: HTMLElement, className: string) => void createElement: (tag: K) => HTMLElementTagNameMap[K] - setStyle: ( - element: HTMLElement, - key: T, - value: string | CSSStyleDeclaration[T], - ) => HTMLElement + setStyle: (element: HTMLElement, key: T, value: string | CSSStyleDeclaration[T]) => HTMLElement setStyles: (element: HTMLElement, styles: Partial) => HTMLElement getStyle: { (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType?: true): number (element: HTMLElement, key: keyof CSSStyleDeclaration, numberType: false): string } setStyleText: (id: string, cssText: string) => void - getRect: (el: HTMLElement) => { top: number, left: number, width: number, height: number } + getRect: (el: HTMLElement) => { + top: number + left: number + width: number + height: number + } tooltip: (target: HTMLElement, msg: string, pos?: string) => void isInViewport: (target: HTMLElement, offset?: number) => boolean includeFromEvent: (event: Event, target: HTMLElement) => boolean - getSafeAreaInsets: () => { top: number, right: number, bottom: number, left: number } - + getSafeAreaInsets: () => { + top: number + right: number + bottom: number + left: number + } srtToVtt: (srtText: string) => string vttToBlob: (vttText: string) => string assToVtt: (assText: string) => string - getExt: (url: string) => string download: (url: string, name: string) => void loadImg: (url: string, scale?: number) => Promise - errorHandle: (condition: T, msg: string) => T extends true ? T : never silencePromise: (value: T) => T extends Promise ? Promise : T def: { @@ -52,21 +55,17 @@ export interface Utils { has: (obj: object, name: PropertyKey) => boolean get: (obj: object, name: PropertyKey) => PropertyDescriptor | undefined mergeDeep: (...args: T) => T[number] - sleep: (ms?: number) => Promise /** Historical return type; runtime discards the callback result and ignores context. */ debounce: any>(func: F, wait: number, context?: object) => (...args: Parameters) => ReturnType /** Historical return type; runtime discards the callback result. */ throttle: any>(func: F, wait: number) => (...args: Parameters) => ReturnType - clamp: (num: number, a: number, b: number) => number secondToTime: (second: number) => string escape: (str: string) => string unescape: (str: string) => string capitalize: (str: string) => string - ArtPlayerError: new (message?: string, context?: ((...args: never[]) => unknown) | (abstract new (...args: never[]) => object)) => Error - getIcon: (key?: string, html?: string | HTMLElement) => HTMLElement getComposedPath: (event: Event) => EventTarget[] supportsFlex: () => boolean diff --git a/refactor/README.md b/refactor/README.md index 7a9beb9c0..526b3f421 100644 --- a/refactor/README.md +++ b/refactor/README.md @@ -43,6 +43,7 @@ | [第三方来源清单](third-party.json) | 依赖解析、vendor 文件指纹、SDK/CDN 与许可来源缺口 | | [消费者与真实环境矩阵](environment-matrix.md) | 22 包的版本依据、能力/设备/样本、现有证据、验证任务及发布影响 | | [类型检查与迁移入口](typechecking.md) | 根/分包配置、当前/旧编译器、严格正反例和历史声明错误 | +| [核心公共类型出口设计](core-public-types.md) | CORE-21 的声明生成、旧编译器兼容、精确入口和编辑器验收 | | [JS/TS 构建与开发](build-development.md) | 非交互选包、开发重建、资源夹具和 AMD 全局修复 | | [测试目录维护说明](../test/README.md) | 统一测试命令、JS/TS loader、受控媒体及新旧公共契约 | | [真实浏览器入口](../test/browser/README.md) | 三浏览器、解码画面与媒体状态、Range/失败服务及候选文件映射 | diff --git a/refactor/baselines/core-declarations-generation.json b/refactor/baselines/core-declarations-generation.json new file mode 100644 index 000000000..bcb0211a0 --- /dev/null +++ b/refactor/baselines/core-declarations-generation.json @@ -0,0 +1,535 @@ +{ + "task": "CORE-21", + "date": "2026-09-11", + "status": "partial-generation-only", + "parentCommit": "ee895a558ff0c8a62274eb64049cedfd8409112d", + "files": { + "packages/artplayer/public/artplayer.cts": "0e91e907d021db02a68004603e6190505fdc0806d873ebb6af171aa089a81da7", + "packages/artplayer/public/artplayer.mts": "f6292596a9ccb1d43a6d6a12c35f859b1889ad15924c5ae0f9f280941aade313", + "packages/artplayer/public/artplayer.ts": "26a42ac66811e70f68a8ebe62cbf304eb1993451b3e658961be98e7106162527", + "packages/artplayer/public/component.ts": "aa1c43be67322781b4b355b143bc69d9f29d22e578e4974d6a13e957a7c0334f", + "packages/artplayer/public/config.ts": "c4fd8681bf32b10c743e3e561c532520c8f32e43fd765524850b15e55cb91c72", + "packages/artplayer/public/cssVar.ts": "e027d82fb4f01c9ce7559cf679b2d5ee1962d3f7e5b4dd64ca21f472b933efb6", + "packages/artplayer/public/emitter.ts": "9c62551cdcc6dd3966bed8a7a85dd477435db977c91a294d2ac8f162f9592537", + "packages/artplayer/public/events.ts": "af191f862af4ec8933b09113b8c074603ae254a8b70460d0f3006646cd74ae42", + "packages/artplayer/public/i18n.ts": "3e14759caf71f97f01650839248c8737c42d2c2979dabc43ad92b724da648708", + "packages/artplayer/public/icons.ts": "0d8e8e52e52130dd4a29bab551dd7a2a954797e42e92a6e068c85d583e23e6a4", + "packages/artplayer/public/language.cts": "2248040d86a8e34626755c4ecf53ea0174706c653073cf0e15884a030d173120", + "packages/artplayer/public/language.mts": "c391e863012c77769e661afbf8fa949e9373aa88d17f58cbba7f5696edb8077f", + "packages/artplayer/public/legacy/language.ts": "c452ffd764ff9b29b819b3475c42395d2ea7a33560d8c186ef5df3844b9524c3", + "packages/artplayer/public/option.ts": "850e5264219b8b438c80694402225b690b131786677a5da0d22739ec2352d263", + "packages/artplayer/public/playback.ts": "1ceaed3aa1cef511fe8b20f4874647f6065c723ad805b742a0a9247e16bb1bb5", + "packages/artplayer/public/player.ts": "f1e50257df2ea592d0a0e1f36078dda77eaf2cf3b3d795307501396562d99f28", + "packages/artplayer/public/plugin.ts": "2a57e148fda00ee687da5036b890b0f611cb94bb403a1ed52602179060259d35", + "packages/artplayer/public/quality.ts": "7ed6ed78cea52991b2f6ddd2bd3b7bd8c5146fdfff7486fe8b814c3e632f1567", + "packages/artplayer/public/setting.ts": "d12a75b656fff70cbb30be4bffec46d9c4273636e8722bce971a4d2b188712a1", + "packages/artplayer/public/subtitle.ts": "d25b470e47d6a9bd696d9c1ad8adb58e56a208f05695186d513bc8c43c2e8acf", + "packages/artplayer/public/template.ts": "68aed9e97d006d6be4fabb8504ca84dafab770b0925f4d6e7319e67c82f21b0d", + "packages/artplayer/public/utils.ts": "494ec447ab467a07ddd7a2c2abf778b3fce69fd28a09aaa8ced9759f8de2e3f6", + "packages/artplayer/types/artplayer.d.cts": "62ec73de1cdd5915760509408b384f19f37e621f7d636aa72999d44e0c69df43", + "packages/artplayer/types/artplayer.d.mts": "b664fec51ee5c5381f2ceab25d99d52aee56feab04a2ee7b4ea5b2145ea5fa0e", + "packages/artplayer/types/artplayer.d.ts": "5d0162adf7ac6d0f2bb9b5cfe361f28657c4d9c540cadbf36eba3cc954ce50f8", + "packages/artplayer/types/component.d.ts": "ae5bc1ddeaa1ee1ebbc62573e32423993727079205c64751a5a314170e588a32", + "packages/artplayer/types/config.d.ts": "36f9a84cd436f17701a0d11d3417fc1fe0414e0c52c80083b94a85dfc329e37e", + "packages/artplayer/types/cssVar.d.ts": "93217860fff2ebf750f606d95ddd22220a58837119e63bdf2f5f78fd7488458b", + "packages/artplayer/types/emitter.d.ts": "7e1f9a2a8ce65feb95734f1ed52d1334e57aa388bbef2a43d8bc53a9b6f6623c", + "packages/artplayer/types/events.d.ts": "f83624c9268a284477e8bd793fe3562a2363b72f2a44d5c64fe8c6a6cede8830", + "packages/artplayer/types/i18n.d.ts": "bebbe372d9b22443e75e0c0cea05bd52e8a44c1f82ce656d278a100a21a85b57", + "packages/artplayer/types/icons.d.ts": "326a67ba7bdcf52862c5b2a269e540140aff98d05c7b96196485a77f84fe5960", + "packages/artplayer/types/language.d.cts": "f7928e108cf7b7814c2d75cb0a525333e95873fca6cd6d89a740450656b9c1cd", + "packages/artplayer/types/language.d.mts": "6619a26d604b7cccbe2f596243d87ae37cfaae33b8b52874ec071d9787446f9e", + "packages/artplayer/types/legacy/language.d.ts": "c7abda4d506fd933c350e9030290bf9e64347a921d683a66115da1995ebe0a81", + "packages/artplayer/types/option.d.ts": "ccf2c8ddc537dc65c9682d39f044726e23bff18f476b622512d7e6a4b949b5f6", + "packages/artplayer/types/playback.d.ts": "58705c273df6e76a77a6575e769a9ec6c013785c25080f2551aa22415788d870", + "packages/artplayer/types/player.d.ts": "92b00211b70ac71336e495899df972a0519dd138111846044fe4e0f967966177", + "packages/artplayer/types/plugin.d.ts": "fc3594a41c51d8248713e33c486fb1f6a518ac5c7ce31be6988a6cd8d052c5f3", + "packages/artplayer/types/quality.d.ts": "1ac1a48b4f74ff9ba1ce60443e1463d50d1c6a2e5d87d63dc7d2a8eb7f4c2c34", + "packages/artplayer/types/setting.d.ts": "08305a75dff96f06490430e099338b463df471b550c1d0dac3abc8995b39eb09", + "packages/artplayer/types/subtitle.d.ts": "b18314e2d64efdb6045830b6e12f615ae2ed585416130e562329ad3ea337f6ce", + "packages/artplayer/types/template.d.ts": "4792bc0c2cbcb7966e4375118bd34b326166e0831862e94ace4cf6b1bbe6a8c8", + "packages/artplayer/types/utils.d.ts": "fca0d3d814df94a25f9eb067c86fa0cf272e2791bac793b91229d57680797712", + "scripts/build-types.mjs": "d3bc5fc09598c3e8772aeec9e72ea5daad5e641a786107dfa0e374d1e6f75f2a", + "scripts/package-check.mjs": "ef962a33947d113a01995731123429edc41bb88dfb5b1d68bc930c6b21827351", + "packages/artplayer/.npmignore": "ee5bface8b8b100272b150e927f059fbd106f7ece38b65125f4f9864deb979bd", + "packages/artplayer/tsconfig.json": "c074f0621b18e6f209e217a702745e4118ee7724955e8104c7e3df3a223a9921", + "package.json": "7edd6f8a0d97cf6e52238e5dbf57ae658ddb0c51bab3f80728fa6063f1a91e37", + "test/declarations.test.js": "5f7c72b23fcde96082f5e7ef639c9f85d10d186336271363d6882b50b338aee6", + "test/package-check.test.js": "daecef5ca8f436efb8a72c5e99632061aa9110d2c295cd97eeed5bc9fd0a3aa5" + }, + "ci": { + "total": 448, + "unit": 418, + "engineering": 5, + "baseline": 25, + "strictProductionTS": 229, + "logSha256": "99052a3dbaccd8d8851cff89c32eb9a5e7f5ee8e23a233fba884282d40a8e8b6", + "scope": "Generation foundation; the subsequent package-source leak assertions were separately verified." + }, + "additionalChecks": [ + { + "file": "refactor/.cache/core21-generated-typecheck.log", + "sha256": "28566c127da4d8a47f811eba48b01797de8434b554899ab849130252b6a9a05d" + }, + { + "file": "refactor/.cache/core21-generator-tests.log", + "sha256": "4dda583d13be1c6a8c9b29d337f48383dc0961cce38180b77ce5d8ba5132062f" + }, + { + "file": "refactor/.cache/core21-generated-lint.log", + "sha256": "8ac071e5fee6b40acdb65ebcb26d6ebb55aaf2736d0e718407466ec5ab1674a1" + }, + { + "file": "refactor/.cache/core21-package-source-negative.log", + "sha256": "48dc2f8a26f00e2dfbc5152b2ffb1b804a0f7a97da5bd782bea59a2e0049f22d" + } + ], + "package": { + "output": "refactor/.cache/packages/run-GY8u71", + "reportSha256": "8813ab6594cfc70cf940bd9e592549676151627889e0c7be541bccdb91dc51fb", + "runtime": [ + "DIST.cjs", + "DIST.cjs-legacy", + "DIST.esm", + "DIST.esm-default-only", + "DIST.esm-legacy", + "DIST.global-core", + "DIST.amd-core", + "DIST.global-core-legacy", + "DIST.amd-core-legacy", + "DIST.global-chapter", + "DIST.amd-chapter", + "DIST.global-chapter-legacy", + "DIST.amd-chapter-legacy", + "SSR.import-template", + "SSR.constructor-browser-only", + "SSR.custom-ua-umd-legacy", + "SSR.custom-ua-esm", + "DIST.i18n-cjs-esm-global", + "DIST.exports-boundary", + "DIST.direct-esm-file", + "EVENT.lazy-registry", + "EVENT.symbol-number-channels", + "EVENT.context-removal", + "EVENT.once-throw-consumed", + "EVENT.chain-context-arguments", + "EVENT.once-reentry", + "EVENT.dispatch-snapshot", + "EVENT.off-original-once", + "EVENT.throw-propagation" + ], + "types": [ + { + "compiler": "5.9.3", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "4.3.5", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + } + ], + "packages": [ + { + "name": "artplayer", + "sha256": "6cd924741f139b45ec3c63bbc31a3799d2813655b920ff1484a405745d2a9dd2" + }, + { + "name": "artplayer-plugin-chapter", + "sha256": "03f55c1cb940d46c7d992f860b8fd2676493070dd905e8a2bc4ba3a5fffe099b" + } + ], + "scope": "Initial generated declaration tarball. All declaration and runtime bytes still match; subsequent package documentation edits require a new final tarball." + }, + "accessorProbe": [ + { + "caseName": "accurate", + "compiler": "5.9.3", + "diagnostics": [] + }, + { + "caseName": "accurate", + "compiler": "4.3.5", + "diagnostics": [ + { + "file": "test/types/consumer.ts", + "code": 2380, + "line": 1, + "message": "The return type of a 'get' accessor must be assignable to its 'set' accessor type" + } + ] + }, + { + "caseName": "widened", + "compiler": "5.9.3", + "diagnostics": [] + }, + { + "caseName": "widened", + "compiler": "4.3.5", + "diagnostics": [] + } + ], + "officialAccessorReference": "https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-1.html", + "outstanding": [ + "Precise public entry and declaration strategy for six open CORE-21 risks", + "Old plugin and augmentation compatibility with the precise view", + "Editor declaration compatibility", + "Final package, compiler and applicable browser acceptance", + "Completed task commit" + ] +} diff --git a/refactor/baselines/core-declarations-validation.json b/refactor/baselines/core-declarations-validation.json new file mode 100644 index 000000000..2d7f6914e --- /dev/null +++ b/refactor/baselines/core-declarations-validation.json @@ -0,0 +1,23462 @@ +{ + "task": "CORE-21", + "status": "validated", + "capturedAt": "2026-09-11T09:52:58.443Z", + "parentCommit": "ee895a558ff0c8a62274eb64049cedfd8409112d", + "node": "v24.21.0", + "yarn": "1.22.22", + "compilers": { + "current": "5.9.3", + "legacy": "4.3.5", + "preciseMinimum": "5.1.6" + }, + "source": { + "packages/artplayer/src/bootstrap/browser.ts": "8d401627e8ea1c87fb44204227b04177a70cc7a0f79f95fb5dc73fe828e46a8c", + "packages/artplayer/src/capture/frame.ts": "eb25d81ec2d40a239103c63cfd80333705251291f2c2da77c740b4d413ea9cd9", + "packages/artplayer/src/component/dom.ts": "740f63e6e5942c444b9f05605880f8d56a77b066dbe5c4791da74f78cb96c668", + "packages/artplayer/src/component/resources.ts": "ff158ef0db8ba13343ff6ba329713820cfe2f5c2c446a7873a6cfff782855edf", + "packages/artplayer/src/component/selection.ts": "1f0bd089415da28db862647ffd1a0b4af752576465fb616d4b97ae4f8dcae3a7", + "packages/artplayer/src/component/types.ts": "d7b0e7008b0f6c82e3e97ac43e0188598dca4f740a860e7a60b3b38a46f4565d", + "packages/artplayer/src/config/index.ts": "a56b4d3d6942cfa3e2b47f909fc5ad87e6e3202fd61b29c7afd7649049e31d05", + "packages/artplayer/src/contextmenu/aspectRatio.ts": "a25464e14216b2be392fcb3fdda2439e6d6f98d1962f0acbba30e3bd53bcb2d4", + "packages/artplayer/src/contextmenu/close.ts": "84b7a96df910e6f38140df8b1e73519d209a7331e9be9f42d076ae791757024f", + "packages/artplayer/src/contextmenu/flip.ts": "42c192d23e347d74e0bb814697a4d59eac20afbec102a282d5aa15780cab5f72", + "packages/artplayer/src/contextmenu/index.ts": "4fd292a931b5bda9f16a1c2bedd50cd0d8c0b8fb6010ffc5faaad2c197d2d9e5", + "packages/artplayer/src/contextmenu/info.ts": "f37cf0104510c13a130d2f55114c8f7ff15cc1b51863f97e60825442bdb2bf01", + "packages/artplayer/src/contextmenu/playbackRate.ts": "e177f4017ea9291794fb4023715c81bfc01f927324ab9bd0e32c741e4a3b0ca7", + "packages/artplayer/src/contextmenu/types.ts": "a93fc90f4e17b731e8f6b486a507117810b61c1f1b0d9e775eba27dabeaeee1d", + "packages/artplayer/src/contextmenu/version.ts": "0553a716be0ba49f614059c41eef6dc694a9641fca79e6448b1b30382c6b582b", + "packages/artplayer/src/control/airplay.ts": "a02ab41654a963e06fb2eb206cfe606cebc27252ba00b3fc2116ea232c8d7d51", + "packages/artplayer/src/control/builtins.ts": "2a0e12a9741713c92938e1d2009149bbbde498284aa85c63f270d02b27dc22b1", + "packages/artplayer/src/control/fullscreen.ts": "6856d98530877b9458275d8e064a94a81b9e2a4de079cce1a83e7cbe71e5ab8b", + "packages/artplayer/src/control/fullscreenWeb.ts": "e20f8fe9788738adfccb21e7bf248e5e8068312e856bb2626d05fbb20cfdb65d", + "packages/artplayer/src/control/index.ts": "45983c760ded78f52ee04b623d742aefc3b7c60923de78f207c7ae13bb9dfcd0", + "packages/artplayer/src/control/layout.ts": "b5134a9d0cb5ad128b1fb229dce79a306b944f750d8620e224a99f5791e6cab5", + "packages/artplayer/src/control/pip.ts": "9299d785ce21b16dc9edbcb6a803f8748157ed16e1924f461bdbc4853adaa5ac", + "packages/artplayer/src/control/playAndPause.ts": "e65461f5bf29680f12b7e0efa7d44186f07bbe9936247a9a220f724c9d9774bb", + "packages/artplayer/src/control/progress.ts": "f0876ddbdc01f812a5a776bdeefdff8dc52e557aff684f99b5ea7f6bfc8c0fb3", + "packages/artplayer/src/control/progress/interactions.ts": "da03600375451ecf8c152be5afcc5f1a4f8b759e837bbd54b7faaf8f8b228497", + "packages/artplayer/src/control/progress/position.ts": "a3794ab5ac5dafa5fd61e56acb12c94998bd4b9065dbf0fa4739c6bba1094aa1", + "packages/artplayer/src/control/progress/view.ts": "60ee16d5170be81b8132bb56dd0bc0eaf23e50f5c268d0697c9187b38a14aba9", + "packages/artplayer/src/control/resources.ts": "16fd7c53ac8f47b333041c4f298313390dc102523d47767b8a16f39a2564ba74", + "packages/artplayer/src/control/screenshot.ts": "67be1306991861cb8bb0adec2b58a8468211459f9337895e611972dbb71a6ef5", + "packages/artplayer/src/control/selector.ts": "fb055097eb38ea7cc488556ea52f3d185f437eb3de4dec7e09b601b01585d7c7", + "packages/artplayer/src/control/setting.ts": "63e9824ffee2221ba82be9f2bc430b9b3133a2186905fcce2a61b8aa946a3d8a", + "packages/artplayer/src/control/time.ts": "fa572092e0848878689367fb536e9658d13888d0a0d476babc5acd165af0f8d3", + "packages/artplayer/src/control/types.ts": "40f7c8dc589d2d20a6efe2552bfec66f1a4e6fbfb997120cb607f5aaf95a4d69", + "packages/artplayer/src/control/volume.ts": "b50d1a5d2697d6440ac0f3d82634b13f7c2fff00c185a1adf4451ed8ba810709", + "packages/artplayer/src/display/fullscreen-abandoned.ts": "1715b30d336976921b4957b444418702b7d93dbf1debce47429269638d15810f", + "packages/artplayer/src/display/fullscreen-adapter.ts": "71da10ec21c7706a8264badedac9022c74b865887931e9e369168fe3233c3b2f", + "packages/artplayer/src/display/fullscreen-request.ts": "c6292ded96aab0f2dbc978af251f6cd9f5fd074819529ca498077db8d14e1bfe", + "packages/artplayer/src/display/mini-drag.ts": "73d2f48f868c0ba4d8d5e5df40cbbdb4698c26540f3973b178d9cd374008f1cb", + "packages/artplayer/src/display/mini-layout.ts": "3835fe3d314da2fc624cbeb0e79fcdfa5393f08d87dfde730d2eac4e827f405b", + "packages/artplayer/src/display/mini-view.ts": "83a6e5c6d1923332973009b7ac1561f7a55fb72e5c60e5ebc88af1fa4b641d5e", + "packages/artplayer/src/display/mini.ts": "3ffae49b1407523da2dc5f2bc687018268f6c1d1d3c71911dd4aa96d1a66c1dc", + "packages/artplayer/src/display/native-fullscreen.ts": "323401f2b3ea5186da981a1215b1b9e7dcf4ef4261a8e885fe8ff0c090de6a7a", + "packages/artplayer/src/display/native-pip.ts": "647879ae027cc0ebe684daa31d75511dd882e123e4ca8da2942e659bae3719f2", + "packages/artplayer/src/display/orientation-native.ts": "909980ba837471d9b456545a18fb0ab19f0990e8788936f0580a4b332cd4baee", + "packages/artplayer/src/display/orientation-types.ts": "0d68d2bc99d04db1e2fdf16b74e406e31f8b7e03fd9b6ea271773ed263ffa890", + "packages/artplayer/src/display/orientation-web.ts": "aea55c3b9e8c708fe5559f07cf8f0afd7ad37ac5b1a43bf519245c3072ec4129", + "packages/artplayer/src/display/placement.ts": "dbe4491ebd0f46b4efe13ac567e476fcd9ca5b84da675f19025935b5e3f8d733", + "packages/artplayer/src/display/sizing-types.ts": "da9b3d957dafaca9331f7319257dd8156b3c3e7b6db11f33f11ded48512450ad", + "packages/artplayer/src/display/sizing.ts": "c19856976320f1f35ff5a1049d19a940768300e095270b336dd12861b200da2a", + "packages/artplayer/src/display/types.ts": "6f78b34b903fb30653cc7169f43861f8be426d1f6e9669ef292e41a1606d685c", + "packages/artplayer/src/display/video-fullscreen-state.ts": "5fcb5e6b80ac45577664ef67e0460e0ceefd4022cafacdd7434c376a86d619be", + "packages/artplayer/src/display/video-fullscreen.ts": "b425bf0df462524b5d3accc9e3df383c6635676c152bf4bef09c477a90662728", + "packages/artplayer/src/display/web-fullscreen.ts": "dd2c5cf65cfe35d6b5a87d01acb28f48119b27fe6e5f0c6a8b9bab3db1a1923f", + "packages/artplayer/src/display/webkit-pip.ts": "3617927b4bb8fa46f651d0e584141f804ae438e2b4531cc2e9cf9f7eeb027550", + "packages/artplayer/src/dom/event-path.ts": "e952ea847a2e844a79c5c1b83035e03917e0294b80b1eb8af3b3bec0d2f7d333", + "packages/artplayer/src/dom/measure.ts": "84a599351d26a790c5a8f6e7d271486a0a68d5b58457d8ce754d540b54902b96", + "packages/artplayer/src/dom/presentation.ts": "500bded394579dd8194778f73cc44d0724f0a59cb5400957491928534ed091c6", + "packages/artplayer/src/dom/styles.ts": "734e0a4e04d666417a18ac09ed6271ee7630c399d52d7f510a1c19fd6e7b3493", + "packages/artplayer/src/dom/tree.ts": "3bc517ab9fa5317a1445156d53afb27182685eb3b4c0ac2ff41bbde55c9eecb6", + "packages/artplayer/src/events/clickInit.ts": "bd1ba29fe0af4332ceb19297797c4c942a3a74bfd901998d6b93293f1b309300", + "packages/artplayer/src/events/core-types.ts": "a607a3b2eea1b031f23ec0f620f1f4cd68799c4a77138a1443ecb196b00d1662", + "packages/artplayer/src/events/gestureInit.ts": "9e9d1ac0da7f87e89dd0d86fa2820b980e9cb810782d6ab30017de8686fc910b", + "packages/artplayer/src/events/global-types.ts": "3f4672d7af959cfa34ba39aa84ce614f422901437686bba98b14f578df40021c", + "packages/artplayer/src/events/globalInit.ts": "6f6ea497a20a8fd0746b1f020caff76ad6817cd70a1a90fbaea12f992b6d03a7", + "packages/artplayer/src/events/hoverInit.ts": "d1250e0dd35a8ba8067275986acbe6320c22adf1a977ec1009c0c012ed1563fe", + "packages/artplayer/src/events/index.ts": "30d2286316dbd351e93f5a2234dcca84bf68ca28c05921169cca70c2e0b1ecf9", + "packages/artplayer/src/events/listener-registry.ts": "fb062df5151c4e8e970de469f1c7d9af948f72214d32c293c81a5feeb8406124", + "packages/artplayer/src/events/moveInit.ts": "da97591723f8b94a34702559b7ee67a35f172aa696d37dfbecd472581ad3de35", + "packages/artplayer/src/events/resizeInit.ts": "719e27d11d2f93fcbe8368393c9190e251fc86dd0c3c2919f60e9b3b1edd0192", + "packages/artplayer/src/events/scheduling-types.ts": "0fd98e94397064f32cae4c004d9932c006d2db69a7d6d9374ff174d74ff93cd4", + "packages/artplayer/src/events/subscriptions.ts": "98573ed6cce73a73467c0e7fdb8ddc45e66b6bdf684c38886749453b2002a1d8", + "packages/artplayer/src/events/types.ts": "df03625039605314a96ef15b5e3777cbb9d444fd317e1a2fbeaaa0f1e83f6b0f", + "packages/artplayer/src/events/updateInit.ts": "6f174db14d20319f03a76e6ea267a3d71973faac44a92483badfa4420791817a", + "packages/artplayer/src/events/viewInit.ts": "d77b83eab802ff0046a4966e28b810a25592bcada49f526adae37556c1e4c3e9", + "packages/artplayer/src/events/viewport.ts": "6196fccb8b08ae22bde732c4389d9aceb5d727a63efd87b6d3914e338aadc46f", + "packages/artplayer/src/hotkey.ts": "d8e477bf451143e566e1f743a5f253dcf00beb23544709794779f275e11498e8", + "packages/artplayer/src/i18n/ar.ts": "c1e41787c700096ecbc91de6558353f43d8930929ee312b7aa2c7da14a07ec75", + "packages/artplayer/src/i18n/cs.ts": "62c5ffcf3ac24e0dc2d7222b7ebb2b4d3454e9c04b80930a50defb3867d645be", + "packages/artplayer/src/i18n/es.ts": "5d31184b41ef29c1544c91ff08e3bbf9fc5c5776f0af0aa0238f90a9d161b9b1", + "packages/artplayer/src/i18n/fa.ts": "1294b91178ebdc7bc26d14a6f407ba8598207ae0dc812f3b821b62b7bf0089e5", + "packages/artplayer/src/i18n/fr.ts": "7125c0011b90f507d5b5fe20afd875992b62af9cdd44f02bbabed051c4ebc107", + "packages/artplayer/src/i18n/id.ts": "0d2e79cc0118cff6be83786a3fc048461785a64bdffc6bc45ffb68cb595f6da4", + "packages/artplayer/src/i18n/index.ts": "09c6f5bce58e4118dde10e8b2a2d3808785b7fde913a54dd189e0b473e21266a", + "packages/artplayer/src/i18n/pl.ts": "f6fb58a0d3fa118e22cfa6df5edd74c7bf39dc9ff1d416fb2b01e1bb8708b06f", + "packages/artplayer/src/i18n/publish.ts": "5b216bbe313b3cda56a5da41fba4fb9d095eeec0dc903fcf284ddd8f94926e99", + "packages/artplayer/src/i18n/ru.ts": "473c43197acec10991b0f67814f79421dfe9ec4f534fb15413a32cf2a4d8ad38", + "packages/artplayer/src/i18n/tr.ts": "7b6afbbe452c4907c8bef36663bd218fd140bd1a4b3c776f31c53415e78e8f16", + "packages/artplayer/src/i18n/vi.ts": "29ea7f23d7400c847596632c86a4ca10c39cbafe1e6d723ed099b819aca7e764", + "packages/artplayer/src/i18n/zh-cn.ts": "22584521b0aa92da5278b01581e6e8e5bb3a23a2c3029e9df8642b7f0bded392", + "packages/artplayer/src/i18n/zh-tw.ts": "8da94a4fd508176bbb6b7ce2f4ba6ef6a56e7b1229bc67cc42d1a7bde70a7e9d", + "packages/artplayer/src/icons/airplay.svg": "8c75a40f1bfacee2be2a425e132ff51f3712eba60679010f7b1349d4a04374bc", + "packages/artplayer/src/icons/arrow-left.svg": "8b9d544b7bd728d01747005fc7a2d63f822eed3b605393e2435b6733861b585f", + "packages/artplayer/src/icons/arrow-right.svg": "68c63d6d5810173ec9192c9e96ee7b6aefdc3b79d3c1329fb4d6c750f859fe10", + "packages/artplayer/src/icons/aspect-ratio.svg": "987752a87701523057d8dfa7c45a6a139c4542b96fdcfaf8665722bbeb41f3b2", + "packages/artplayer/src/icons/check.svg": "963ce0aee2337fdee951aa6c917cc75ee0b4e75158887ccc16baebfd3925942b", + "packages/artplayer/src/icons/close.svg": "ebabfe8044f48d5df4d13f4f906a163fd55a4d6f1dedb3b5ba95601209bc8888", + "packages/artplayer/src/icons/config.svg": "e1884d5411296b5cd1bfec7803b558b0afa5ab64478393977b07a662e2e0f15c", + "packages/artplayer/src/icons/defaults.ts": "31df862d754922fe5d68b20911c477d7c22893a6a67b5dcb1a48d3b437a0b23a", + "packages/artplayer/src/icons/error.svg": "b40c01e511a599c9dd369aeb9a3b2a0d1a76ef3c5ede8124cbbc23f8e4e7248c", + "packages/artplayer/src/icons/fast-forward.svg": "abef6fe4d75ffa74d3a84683373b4702a4eda2a5b4045952f969ee62cc68b0be", + "packages/artplayer/src/icons/flip.svg": "474a9d53a97add71e3fb7bc6530a68580ce63a1d83f9b75d1c2908a7cf494152", + "packages/artplayer/src/icons/fullscreen-off.svg": "71125ac56586897e2c0e52035a4d65cff34cf52043a95b45d186e0d268671399", + "packages/artplayer/src/icons/fullscreen-on.svg": "d46cdf265cac729c9b7382722ebe7a4c76d71ad4e5a27c2d5ed8323fd595ebf5", + "packages/artplayer/src/icons/fullscreen-web-off.svg": "52a6862ecd7cba12ab7042de5064c498bc2e9f86b430358c912401fafe4f4a98", + "packages/artplayer/src/icons/fullscreen-web-on.svg": "5cfaae62b61456251e771bff01356fad8376ebedb10a4b8819740f60e6e5a073", + "packages/artplayer/src/icons/index.ts": "7152126328f6e485ee92b6d924c34776518b4a3925b2887867b516f7523b15cc", + "packages/artplayer/src/icons/loading.svg": "485472153890eff3ed49963f7bf7d841f66ca2f40894c01d6e8bcf1bf4ad1c58", + "packages/artplayer/src/icons/lock.svg": "431e9a25fae051016be0efa286387ec3e5f7651c3ecf569bf0ece9842f57156c", + "packages/artplayer/src/icons/pause.svg": "57405dba81dd3d9f329d957fdc704101cbb6f6654325eb0083c03324c4453a68", + "packages/artplayer/src/icons/pip.svg": "1e922140e0941e5b9ef53dc0b4776813e1c470ea229fe3ec786fd148148c3352", + "packages/artplayer/src/icons/play.svg": "41a961c629a55cb25a813e115a25204e492d4e935a0879177e65d6e1ddfd6796", + "packages/artplayer/src/icons/playback-rate.svg": "872deecac0365ab04aeb5ccb1cdd9a0c88589a1442709fdac7c0ed12a241ff2b", + "packages/artplayer/src/icons/screenshot.svg": "538b5cd0c6b20afb98bd850e15019072d652d191075c2869f2fc0f28b597b131", + "packages/artplayer/src/icons/setting.svg": "2976b00d1f03e78f28d0e55ebcb01d5a0746ec1a6ff8de97a5e8294bacdd1fad", + "packages/artplayer/src/icons/state.svg": "620a127f74bb5e249993bd7008c027373263eacb4a44af8adeaa0d7523346887", + "packages/artplayer/src/icons/switch-off.svg": "95a8d81a4a3bfcf7c016d5f71d46a72be73c5e94790c55fd1d31023416ef5deb", + "packages/artplayer/src/icons/switch-on.svg": "cccd0f9c1e54d9ac50c323360da944d8ff44633a82ff17889914b6bc8b1652ae", + "packages/artplayer/src/icons/unlock.svg": "fc058db3d99a475fb9ffbbbb6248978a95990a9c532b83d0955ac28eaa626c60", + "packages/artplayer/src/icons/volume-close.svg": "f7e100fd9e9f3f6e06afe5bc994d5d9305ee4d1ee23fae37e4108cf286dab379", + "packages/artplayer/src/icons/volume.svg": "3a78f40d8b48595e8f15d9189e4d767e0c7abbf0338d3f2db1ac810049dd3942", + "packages/artplayer/src/image/load.ts": "b4f1517243249d5fb017b89f993660e8b148906bbf28d08fe5c9f6d3a41e1e88", + "packages/artplayer/src/index.ts": "20cfe3738b3ce7e11b69721a5f0bdad9db77807417d8e421397a40dfade4c047", + "packages/artplayer/src/info.ts": "6594ff3ee5643d63fec874631865d0e35b4ebdcf8aeafdd9fd3d9c595cfa3713", + "packages/artplayer/src/info/poll.ts": "1d7a519dd1960c8cd5fb7a020d8d3dbcd2eb272b612d823f2167997751aaf663", + "packages/artplayer/src/input/gesture-controller.ts": "1ebbd18184771a623b02ec19c363f84dcc72fdb7cd82bcf2adc97f4a138cb2b4", + "packages/artplayer/src/input/gesture-direction.ts": "65737f60e177338ebb3337a13ca75aeae77d77e94bc21495ddb829cc30de33a7", + "packages/artplayer/src/input/gesture-types.ts": "5ed25db69e0d9579a2fc0ab6faadf00fa073ad73a1ea5aa48096b4430c71141a", + "packages/artplayer/src/input/hotkey-defaults.ts": "c28e14821e5c7f7ac92a302e92439ab68fe77d5ef7d90a36b147b7c979ab96c6", + "packages/artplayer/src/input/hotkey-types.ts": "c7232470d725f3700481ab98bf9203403a67f1ab82e72394baa9c3ad6f3c9a4b", + "packages/artplayer/src/input/keyboard-focus.ts": "9f49538e93c23e07a448a8f9c9773cbc2e199c6d86e7e0adb59236ce97a07fb5", + "packages/artplayer/src/input/long-press.ts": "110cf16cf9dae845597377ebbc43249e103cbc0ece56f89e44ec6ecc7f3819b0", + "packages/artplayer/src/input/pointer-focus.ts": "802087098c786135eefa6727f13177ffe4a98e2abf48fad0e356b91e26960077", + "packages/artplayer/src/input/pointer-types.ts": "63e679498f8f42f6842f63e910c38717ac3438d58df3a75ef5b77c009b7931d4", + "packages/artplayer/src/layer.ts": "4014268eed043d5dd7b925cdeef6245e357cda67192a1301c5612ef98cdbec12", + "packages/artplayer/src/libs/screenfull.js": "2332b50c0c6364d5c99080be0f5739255e4b9e465d2cca40f761adce9a1908f8", + "packages/artplayer/src/lifecycle/instance.ts": "3168f7db4271bae7a242e80798546b755ac15443e15dd9ebb7675f5a259299d8", + "packages/artplayer/src/lifecycle/resources.ts": "399ea5e84545c973f8967e8ffd7326dad7b3168ca6f96f77286995a5b62ee389", + "packages/artplayer/src/lifecycle/scope.ts": "e2188e8544b27cf8c7ac149e7146af628a2d6166c82b719a247adef5d85be5db", + "packages/artplayer/src/lifecycle/template-rollback.ts": "7a83da6739bcec1587b02f8157934988910d7f9103fe489a0d6f4f65290c3d77", + "packages/artplayer/src/loading.ts": "216fa5e2af5be5fcbf95a1578c869553a02f625683a98333d4a404f9a70df9f5", + "packages/artplayer/src/mask.ts": "500b8c2fb5ded63d5acab3c984fc9757f28a8b6cbd4d5beeac8c5a6d73ca63e4", + "packages/artplayer/src/media/events/forward.ts": "6b1b7e80036bfb523b51843dc6ec6d83c2b949cefb9cef085b2d679a444e46d8", + "packages/artplayer/src/media/events/listen.ts": "4eb7e943c1ebca77da8025d83b7d408276187cd02860b7793284344378bd0fe0", + "packages/artplayer/src/media/events/playback.ts": "2c68e4f6274a0dc65e56d42c928e500fc1d63bf3e03bbdd8a83c3f3ed7ae8ee4", + "packages/artplayer/src/media/events/readiness.ts": "3ba74f26dd9ff0729967097c2cb6f329a9cea57745bfe8173f9173e0d134476a", + "packages/artplayer/src/media/events/reconnect.ts": "876027b5116d0d3628755705682b30630f4b713199ed8015541932d81d2944be", + "packages/artplayer/src/media/events/types.ts": "02bd29ad8b158fa04ce5c1524e397260ef24b94c2cf1f053e7bd02b23e5d29dd", + "packages/artplayer/src/media/hosts.ts": "498d1cde31bf9ee12af1f13523eb0a4553adb285264529378abba5b629829e9a", + "packages/artplayer/src/media/playback.ts": "b0364027e1ea26e44e435a938e93c022836885c2622cda6bc3a7ca791d3c2964", + "packages/artplayer/src/media/position-revision.ts": "ba074cce7e7c6bda84aa234de8eb315e5ca482aa9b06250896f9ac6251192851", + "packages/artplayer/src/media/types.ts": "96d4a7f066cbb6fb9138165dd736b4ca500cb19c827bd7702134d61c44cc0e87", + "packages/artplayer/src/notice.ts": "4faa700323a8fdfd91a59491a5f57da2dee9bd1f2de0d900ed16e9809a208c94", + "packages/artplayer/src/option/defaults.ts": "f357ef80cf32085fcbc3409d92dfa27b31c13fbcf823f576052c0347911c0cca", + "packages/artplayer/src/option/resolve.ts": "53a73627cd540e3f21349c0a43beda35ea5195647a31e3f5b30ac292390b4b1b", + "packages/artplayer/src/option/runtime.ts": "d1bcc7682da05a74d7af173304e47f71ba9eb59e5351436040e9dbdef5c58fa8", + "packages/artplayer/src/option/types.ts": "f2ce01c01acf45fac6cbb34685b8e6c321bcad6b0da2526f3f189eb5962ea0e5", + "packages/artplayer/src/player/airplayMix.ts": "bfa30e1dcd7cbaef97e977344e8a35524fad6bd23089cd8e45945e3b32b4bf04", + "packages/artplayer/src/player/aspectRatioMix.ts": "9e5e7365d469aeaef65a6010cb92734702191f9086b2f21d98c9f0ad7f356898", + "packages/artplayer/src/player/attrMix.ts": "d82150611a69423ed46bf673f44c3e0f61e80425026effd486a6951b6c0dd90c", + "packages/artplayer/src/player/autoHeightMix.ts": "5848e34cd826f5d4cc81d076c83fb3bcea0aed1228cd93a1edb6b8ca402ad175", + "packages/artplayer/src/player/autoSizeMix.ts": "6373a8ea7fff4cd875d17c5d3df6dc37764055ab77850a6c6348526969071cbb", + "packages/artplayer/src/player/cssVarMix.ts": "0d023f28b7a8b4c1a5e2c4dd5672ef4294c86bce0013babd9d52efa32a443b2a", + "packages/artplayer/src/player/currentTimeMix.ts": "cc374abeb85b203b9f31c566a6b9e53a4a1723d609fccc7b0c9c210993b79e75", + "packages/artplayer/src/player/durationMix.ts": "60a9d665cf302dcb6b3e37e2f057e31720935e5e588fd7709231f691f6014191", + "packages/artplayer/src/player/eventInit.ts": "a915c5a618e70b1ab10536b1273ba0fea4ec11d3a2ca629b538e90b5ad2b55f9", + "packages/artplayer/src/player/flipMix.ts": "a1519c83f8c9437a9b7e99a59e38a3d931032c579f4085226fc0955c7c9eab67", + "packages/artplayer/src/player/fullscreenMix.ts": "b339bebb4c87f7b75232d7e0d637ebe25bd09a0a0428ba87339a16af5daa71aa", + "packages/artplayer/src/player/fullscreenWebMix.ts": "75b83a6093c7887ca8725f63c55503d0bf3aafdbbf2347b579120cb257503555", + "packages/artplayer/src/player/index.ts": "359943c88dc99863e510fc0d51f8e8ee2397217e68045f755d4e9538579bdaec", + "packages/artplayer/src/player/loadedMix.ts": "6a4c4a08ed74346dad3e138b1dda22c8c9c12f175fe6d00da41b89c78cbe2c18", + "packages/artplayer/src/player/miniMix.ts": "d68a0c4f6c6059d5831d2d1fd4823b8d3cbce95eefd6d36d38670d6d8720f44e", + "packages/artplayer/src/player/optionInit.ts": "7c1c47679ee6201d0e0d203fc7b449a09309e7b24a0a1099ad259a70fc1b1a35", + "packages/artplayer/src/player/pauseMix.ts": "5bbb68eab7dcf2170c944cabb8d4b82be4e6d7623e37ad6ea464b81c1028bc0b", + "packages/artplayer/src/player/pipMix.ts": "63dfb29ffd66ce7d081b24f8e8bf697c041675b49ab8919e206d2df5132de236", + "packages/artplayer/src/player/playMix.ts": "60249fcacdc5b1bc6f33bcd806e8a4f5472cea21d40550b042794a75027fe34a", + "packages/artplayer/src/player/playbackRateMix.ts": "e185c6ff52cd567f7fd7c30553bbd6c65517324d1d16c4948c3623ef457ef536", + "packages/artplayer/src/player/playedMix.ts": "5b6b89bf8dec1efb19cd51e46af1505bae006bdb3fb798e9dec7e3fb5cf0acaa", + "packages/artplayer/src/player/playingMix.ts": "968c9f6e6d23c233c77d62a593db64adcc6d1a2411f5f1c61a35c6996d6a54d9", + "packages/artplayer/src/player/posterMix.ts": "d569dc24e8e64efe398bd76942bfaf563ffbf64d2a7387ea2e1cb1cf511183d4", + "packages/artplayer/src/player/properties.ts": "76806d6273545ff556cf9c6d341b59b9041455a8ecbe1fd40510e841c0d5710b", + "packages/artplayer/src/player/qualityMix.ts": "980ff584c8a5793f5ec9f049f144df31d184d7c9acef49fbe9d504b7657a96bb", + "packages/artplayer/src/player/rectMix.ts": "a741ee09fa3271df84363c5d73eac1b2e5adb39491f95f8112af81f1219ffed4", + "packages/artplayer/src/player/screenshotMix.ts": "1754bbce09f713204c120cd4657b52c06eb09eb1fe3244f84474e5967cd68e50", + "packages/artplayer/src/player/seekMix.ts": "e6e1bf00e8441f1ce58d2a67a66f7e5e98c86d78620ff10a5e6268d54f13fadb", + "packages/artplayer/src/player/stateMix.ts": "e45b3209a93ab14665d19c5740d5c632187e9fe234b019a2a0263e26884ab3b2", + "packages/artplayer/src/player/subtitleOffsetMix.ts": "e7866cf3a6d9fe271a4c34973f7a961542a738e89a3647df85197cee5853ce8b", + "packages/artplayer/src/player/switchMix.ts": "b47e174ef0edb2b96ff29f2ddd3c9f2dd2a38713db2a81002b18c89ce71994e9", + "packages/artplayer/src/player/themeMix.ts": "5bf11bcf8b77cd5d5f2970bc3edcee315c693c1be3d567770d5107a5951cb48f", + "packages/artplayer/src/player/thumbnailsMix.ts": "6c097d7d00779a6d0d3d65cf9ffd126624a48c9bdb98396c84c39f4de4bdf712", + "packages/artplayer/src/player/toggleMix.ts": "a3050136248e7d0b942387484c61286ac2b33a90724b1dc3460f5061be76f247", + "packages/artplayer/src/player/typeMix.ts": "c2a234a9c09f0269a4bd0659087635995945075ac70a5cf2478c8a135fc1b2fe", + "packages/artplayer/src/player/urlMix.ts": "726a42899261879e03c8b1d4f716458bf3e6e614cecc3bb8d7a581afc2b7866d", + "packages/artplayer/src/player/volumeMix.ts": "d830bb27b984e0ab2f687943fb49abcbd0331d71fe96049fd81edbddaa64f07f", + "packages/artplayer/src/plugins/auto-playback/prompt.ts": "58c6dcaf540296ee6f6bdeeda38ee7302aca2b06ddb152b716c0c2bf9c6c96b4", + "packages/artplayer/src/plugins/auto-playback/records.ts": "133a4ba2fd2d3df724d96eb203d05cffb0b82ecb8de72403974f7979bd37ce01", + "packages/artplayer/src/plugins/autoOrientation.ts": "4a13b0c010ea7a5002e66c422260ed24bb0d18b3ed41ce10974ac7ca2804cc09", + "packages/artplayer/src/plugins/autoPlayback.ts": "e349010813bbcd53503383b707c5f6e6e60d8ade6442d020fe6ba07a128c3122", + "packages/artplayer/src/plugins/builtins.ts": "4631c9775732982dfdc87e16b1bd6b41a350be36fb27e0a9132c11a85b0c016d", + "packages/artplayer/src/plugins/fastForward.ts": "74c03e3fcfe2f87dcb0ef1a5da5410cb96322509fd07e32930128584c54f62b5", + "packages/artplayer/src/plugins/index.ts": "4c97f354769bbcb338263f321876a90745a87a9af2d267e216bd3d9d007f268a", + "packages/artplayer/src/plugins/lock.ts": "9a08cec3a92006be8a9d2dba8d850bc4f8f38d586a50de86d725d0d8929130fd", + "packages/artplayer/src/plugins/miniProgressBar.ts": "21b4850fcaf6b0e82d5e62ca7aca60c179c578f7ff6d5606e6025628ff4b1cc7", + "packages/artplayer/src/plugins/registration.ts": "9891686c32aeaa33c48ca500cf30ab24ffbb0835c6248769b4c645a5ff20129b", + "packages/artplayer/src/plugins/types.ts": "6823098d5ec1bf053f60ddfdd36bfcd3f06f3b528cc5dd30fd676a1318dac590", + "packages/artplayer/src/scheme/index.ts": "dc4a3b5e08478cf72b46b0b59c023359ad5f79b891ea8a6a119ce24a5251821a", + "packages/artplayer/src/setting/activity.ts": "699ceed4bdeddb6d48eacf79c8dbf737f5d2d8c4983be70205322b14807a91b7", + "packages/artplayer/src/setting/aspectRatio.ts": "a16eb58fadf77f0a9009cf162d957ffd59d9b8fde83cc193d510fd642e3456cb", + "packages/artplayer/src/setting/checkpoint.ts": "9d3bff311f9b15c067ca49661af4f48de939f266b8077e7c2f0d66edef22dde6", + "packages/artplayer/src/setting/events.ts": "f7a3347ca146232caf2a8c9a5a18731cf7bc91dca4cd36370e0265c6eb70df53", + "packages/artplayer/src/setting/flip.ts": "e72a4ae33300d9e48880897a4f85a04fa6d9a5fff7b06ecaf9081cfb1bb14404", + "packages/artplayer/src/setting/index.ts": "f1e8a302077a8ccfa77c17ce344bdd6816943e77b5876c7f623314ff846742f7", + "packages/artplayer/src/setting/layout.ts": "584604e8fffaeaf1d633d1ed45e64d94595c2a56976e3a3f7ede01839b83a37d", + "packages/artplayer/src/setting/model.ts": "c47348f0f9494c4ce8ea5561bcde6eb698fb11e9197ccdc1ca1359a6d5e370dd", + "packages/artplayer/src/setting/panels.ts": "64d48720971763985a2a652a18c2ed2f32300c3553d56b52049ae40c4dfceae1", + "packages/artplayer/src/setting/playbackRate.ts": "2e70e0d2a33cb0ec9fcdd6d22424979fed7b2e01f87015d6be4e520d5cf4e88a", + "packages/artplayer/src/setting/registration.ts": "c29db62b5d90e0efa4a926c753015e65e96a47add3f5b8840ee51017052edf7c", + "packages/artplayer/src/setting/render.ts": "853090bfffe579c5106124d64c8d2a646876448bcc7258740a96820d56508ad0", + "packages/artplayer/src/setting/resources.ts": "64c28cc2cb08cb87b0864ab957d7999bc94931be4788f282d6f190b8806a81fd", + "packages/artplayer/src/setting/selection.ts": "a1bc04b99bda45cc1a2afcf2dd0925c88ccb55e169b971105277883ae2ccba0c", + "packages/artplayer/src/setting/subtitleOffset.ts": "86513835d4e542ac39e9d551507473e3e14c71fd0d5ea725267008ecbff6ab83", + "packages/artplayer/src/setting/types.ts": "08298ce2c04b5c909b3cc9b1071d2e3e91a7096ba878165a55073e20c33321b0", + "packages/artplayer/src/setting/update.ts": "949c0001e9ae10c08ad9a9fce1c88603d98a9cb9b7ac5fa6620ee00a07933187", + "packages/artplayer/src/source/listen.ts": "c0596b98258c1544c8e4b762509646428450e56588da36908cb8583b8b716c37", + "packages/artplayer/src/source/operation.ts": "a6cb65594a5b28247e3a6889fe0a2f47a34aeb08cdde5f0125800a87862cd559", + "packages/artplayer/src/source/restore-position.ts": "35d3fabf5415606a0bcf4c5f6c519d8b005a63ce1f1aeef67c75d0b37925266d", + "packages/artplayer/src/source/switch.ts": "16f5418d73a1d6e89fbb797afcd79af13857861ba25cca9046c16b70ad31d431", + "packages/artplayer/src/source/types.ts": "e5fa3a9cd6b84dffbbb02f61aad966d6046204d857de3e4564c795f02a0259ff", + "packages/artplayer/src/storage.ts": "9c0a0f3d8ac18261db6e49b2ea14322d1d53bfec3531c7337b85005e708fef30", + "packages/artplayer/src/style/artplayer.less": "4e8513138d5d10c05b66986977d24ed17f1de3c0df3816dec6d90db7a97b5da3", + "packages/artplayer/src/style/aspectRatio.less": "091931a0cdc83e65a669332811ef3276b85bca9e55f7fff42aa46893d728c1ef", + "packages/artplayer/src/style/backdrop.less": "6c2cd0fa200d1f3525df98c3c56dbdc553445724aece3feb0386949245813343", + "packages/artplayer/src/style/bottom.less": "6fb307d8449fd04b804d5e72ea0f175f8aa9c9dd2bf1efbf756f800b39ac97ab", + "packages/artplayer/src/style/contextmenu.less": "70f6c7e26dc96652b659c7bf6fdad92737ed477dea69d253c57dc7266c76586d", + "packages/artplayer/src/style/controls.less": "eb6d4bf4e4ff903d724d45f3ff60f0cf10c02e622fba195555a8179100cdce87", + "packages/artplayer/src/style/danmuku.less": "e4215ee9fa2f1d0599e7311a2415cc975138265b7c6af0448d27d21b6c9e3511", + "packages/artplayer/src/style/flip.less": "5d3c7a81df9be455c2f683ebf48f39597d218dc2144addacb72ee1736bac3b7f", + "packages/artplayer/src/style/fullscreen.less": "dd350d3a0fc556d59b622a53c786b8c2a583e8fb28176e4b9e91baff90479496", + "packages/artplayer/src/style/fullscreenWeb.less": "d74e785c2fbbb2976e131620e751326f622f2916eceff9f2333059ca3296cdc9", + "packages/artplayer/src/style/hideCursor.less": "09a4607c8b0005dc199828172aa8dda395f861e407769b9696d793476c4a7823", + "packages/artplayer/src/style/hint.less": "ae9f3115dfdb1e2d7b8249497c080e6a25f9667f915f6e89820338d67bbc2d85", + "packages/artplayer/src/style/icon.less": "52d8f75c1d193e6160f57ca6997c3f9135adad8eb2338ed60c1eb8e5fe443be5", + "packages/artplayer/src/style/index.less": "ec67999b458d5545a4f17eeda922872823d655da012fa69113902629ad847548", + "packages/artplayer/src/style/index.ts": "856afc037ffcd4d18c4b54901ddbb30e310014553fe9d19560e34fb54b8378c1", + "packages/artplayer/src/style/info.less": "fa56d1b8c8936218e581b2426026e4ba85cd5fea20d045c4f69aca96be4059be", + "packages/artplayer/src/style/inject.ts": "9cddbe51b5de0da74f27c045ab982b509c3854cc6b81eeb02a6b974914760a4d", + "packages/artplayer/src/style/layers.less": "9653c581190bb22d60a706109819cd010908898740701c9526957b5682991c5f", + "packages/artplayer/src/style/loading.less": "185b0f05274196ba71fdb1d088b55af568f3342a495490c99c3f0e058a40659e", + "packages/artplayer/src/style/mask.less": "d1239a171b71ea6184cb4aee6660d74d6ffc0c48f7c47c3cf5fbe52d2e93ac92", + "packages/artplayer/src/style/mini.less": "927fd6c6c5ab440a2b25ecc43211ab89106c739385385b62de3880ed45dd7601", + "packages/artplayer/src/style/mixins.less": "c6be95aa682f266749fe37cb89796fbec6488abc537174f817da79bdac6e00b5", + "packages/artplayer/src/style/mobile.less": "ff3f64fca5d2dd7ddd50385d88d9b2fa1a645909488ab7a0978ba4f1670b7c0e", + "packages/artplayer/src/style/notice.less": "72a935c0effc557a9d7ab3baccb2c3b77fc3a1783450b4e3178a40a5325fe369", + "packages/artplayer/src/style/plugins.less": "589d05e12a62e04fe848b36ba748433d23f0b909a04e861b1d6737f2799be183", + "packages/artplayer/src/style/poster.less": "36b38fe138f8c9537ff4e93f7ec4f2dbdba1ec41d243d741ddf1da7c6581e546", + "packages/artplayer/src/style/progress.less": "59b9d95d49dbcb1be40752d7086239b6de5925b0574da231199d999e22ff4990", + "packages/artplayer/src/style/selector.less": "295012ba379a7e957a24476616a0c3623d6a06e82ebbdaa45b916dd6412d7f4f", + "packages/artplayer/src/style/setting.less": "5618eb443ab6368bc4a18e9a379ce6552629555cdca6074e753aa6fd7baf9bf9", + "packages/artplayer/src/style/subtitle.less": "273cacb63ec0214ba434dcf19a4a455dbbdd408fb2d1749de4878804c1371e41", + "packages/artplayer/src/style/variables.less": "703739b2bdfc77bfde063d8788ef6b6a55b8730764baae8e7d755b7c54d8ecc7", + "packages/artplayer/src/style/video.less": "b89c6f6e27592d49825c68c9ab98d46e81cb1e5add855863f89d19637f98e35f", + "packages/artplayer/src/style/volume.less": "a3954794a9478d3872202b90d349c873cbb51639dcd7d1e3d73a55ce635fcd99", + "packages/artplayer/src/subtitle/index.ts": "b4ead680dc82fa47c53d1ec7e5fb8bf94abbf55730d5d1130ad8d544cb42adc8", + "packages/artplayer/src/subtitle/parse.ts": "7db540c5edb1d2312eed82757fd15a7ce6a28996ba20d0087e56730f21dede74", + "packages/artplayer/src/subtitle/render.ts": "96493fc35680af635a8db225a8bf002208df79ed48b1d4ee6cc73587543add5c", + "packages/artplayer/src/subtitle/request.ts": "543c964571bd5ab984bc1adc9f64a8917dd134ed2892ad10b30ed9c859f34119", + "packages/artplayer/src/subtitle/state.ts": "9f79b982d66747170bc39bdaf99b65676310965f23da62a4dec15547c756a56b", + "packages/artplayer/src/subtitle/track.ts": "707f4c43af4ebf4b87521f6f577168460e739274d0cec28b9efe5704d2540d18", + "packages/artplayer/src/subtitle/types.ts": "615e389b4bb36196a69a059eb04cf7e519cdac13d2da15e4374fede2f3b6631b", + "packages/artplayer/src/template.ts": "0ea9155b9292d4c528a464d3c97996ee5a1c9c4aabc2959a744989085db2251b", + "packages/artplayer/src/template/html.ts": "351c472bfd01fa5ba1a4e347ed31bd5faaf823d9b4c5cab1ce8c651e3b175021", + "packages/artplayer/src/template/nodes.ts": "1572746a636647e4d313cc8752d3a110ff81fddb390ad7b0feb6a0db0d42b9d4", + "packages/artplayer/src/template/types.ts": "2bf906b4a209e17dae4d79225e758e2e53772e93f19f188d0131051ea2a0143a", + "packages/artplayer/src/thumbnails/layout.ts": "6630439242a880f53fcb374b7b15c7f486405aab8a0fad651b137f02971eeb59", + "packages/artplayer/src/utils/compatibility.ts": "1fd2a5b17ee3245712eda961d3c0a15caf3c428010112e48231890176ce1e5e2", + "packages/artplayer/src/utils/component.ts": "d04a66213406ae3223326c2d470363e197dd1540519caa632f9d06378af989cc", + "packages/artplayer/src/utils/dom.ts": "72f3539dabf296df37ab4cc7ade0c8ac9480f399987101589450c787e7d6719b", + "packages/artplayer/src/utils/emitter.ts": "26a93d3ff35b53e71a5f3bb22c252a854559d8151ede50a66a28d9eefae6c008", + "packages/artplayer/src/utils/error.ts": "ba303c7d4e4228919088f9d608fa364596f5853ee646eda2008deee354866f38", + "packages/artplayer/src/utils/file.ts": "ea71d7fc0e818d473bf5a596211ba9d571e4febdf1878014eadefa8d0a98d4cc", + "packages/artplayer/src/utils/format.ts": "891df5b7542b713aef46bf2b93924f42e68eee574afd802db3e6c62ff2655ede", + "packages/artplayer/src/utils/index.ts": "5211af833dddb2937d25dcc772740d62f9d5c5039ce5505bffff0796d4afd756", + "packages/artplayer/src/utils/property.ts": "c737d4582a4382f4038d12dafdf8b43418e508c9b8b859b2f0cc17c20f370343", + "packages/artplayer/src/utils/subtitle.ts": "f058851d11a418e321a8a498472b67fa535fec2c7b5d3df739b6b4f263d00337", + "packages/artplayer/src/utils/time.ts": "b8ce3d50865f6c343e8e3ce9f5c87de565a87b4e9fbcbccbe7030e30e80b93fe" + }, + "publicSources": { + "packages/artplayer/public/artplayer.cts": "0e91e907d021db02a68004603e6190505fdc0806d873ebb6af171aa089a81da7", + "packages/artplayer/public/artplayer.mts": "f6292596a9ccb1d43a6d6a12c35f859b1889ad15924c5ae0f9f280941aade313", + "packages/artplayer/public/artplayer.ts": "26a42ac66811e70f68a8ebe62cbf304eb1993451b3e658961be98e7106162527", + "packages/artplayer/public/component.ts": "aa1c43be67322781b4b355b143bc69d9f29d22e578e4974d6a13e957a7c0334f", + "packages/artplayer/public/config.ts": "c4fd8681bf32b10c743e3e561c532520c8f32e43fd765524850b15e55cb91c72", + "packages/artplayer/public/cssVar.ts": "e027d82fb4f01c9ce7559cf679b2d5ee1962d3f7e5b4dd64ca21f472b933efb6", + "packages/artplayer/public/emitter.ts": "9c62551cdcc6dd3966bed8a7a85dd477435db977c91a294d2ac8f162f9592537", + "packages/artplayer/public/events.ts": "af191f862af4ec8933b09113b8c074603ae254a8b70460d0f3006646cd74ae42", + "packages/artplayer/public/i18n.ts": "3e14759caf71f97f01650839248c8737c42d2c2979dabc43ad92b724da648708", + "packages/artplayer/public/icons.ts": "0d8e8e52e52130dd4a29bab551dd7a2a954797e42e92a6e068c85d583e23e6a4", + "packages/artplayer/public/language.cts": "2248040d86a8e34626755c4ecf53ea0174706c653073cf0e15884a030d173120", + "packages/artplayer/public/language.mts": "c391e863012c77769e661afbf8fa949e9373aa88d17f58cbba7f5696edb8077f", + "packages/artplayer/public/legacy/language.ts": "c452ffd764ff9b29b819b3475c42395d2ea7a33560d8c186ef5df3844b9524c3", + "packages/artplayer/public/option.ts": "850e5264219b8b438c80694402225b690b131786677a5da0d22739ec2352d263", + "packages/artplayer/public/playback.ts": "1ceaed3aa1cef511fe8b20f4874647f6065c723ad805b742a0a9247e16bb1bb5", + "packages/artplayer/public/player.ts": "f1e50257df2ea592d0a0e1f36078dda77eaf2cf3b3d795307501396562d99f28", + "packages/artplayer/public/plugin.ts": "2a57e148fda00ee687da5036b890b0f611cb94bb403a1ed52602179060259d35", + "packages/artplayer/public/quality.ts": "7ed6ed78cea52991b2f6ddd2bd3b7bd8c5146fdfff7486fe8b814c3e632f1567", + "packages/artplayer/public/runtime.cts": "52cfff1daeb6841a90212c8fa8d46ca46d6650bb7ed1b59b62115d854b8ad652", + "packages/artplayer/public/runtime.mts": "1b09bc0ee0f0ee2f788689eaff441bdeda1fab0ce783e71b61b9792d81072b03", + "packages/artplayer/public/runtime.ts": "ec4b1d56993eb482a77eb0f94b701047549d009e6ba6433f27e7d464fef30c2b", + "packages/artplayer/public/runtime/component.ts": "840213299c942fe058eb5436977ceec066b9dccda24c55ae9f464b399c979e39", + "packages/artplayer/public/runtime/construction.ts": "24cc5cda1f614314db382271a9b0d5583b781894cfdf6c548700b1b5270467ee", + "packages/artplayer/public/runtime/events.ts": "52848f57d35eb1037cf74c8877521edf99a015bcd77f30ef6bbcba1807a99bfe", + "packages/artplayer/public/runtime/media.ts": "8828f80953aec3e95328cefe691661e8897cb27cb309483cf806ec45a8549ae3", + "packages/artplayer/public/runtime/option.ts": "bb672e49ffe74a6fc78543217f6de80d7d738890146df0857c709d4dc283e4ce", + "packages/artplayer/public/runtime/player.ts": "a4a24794e26cfb9e4310bf0f459a7a407e85bf81b4f3a4feb6294331af8036fb", + "packages/artplayer/public/runtime/plugin.ts": "9ad482f2a77914a91450419680b8af6b314b926f0831c2f7f6d7c466690f95c9", + "packages/artplayer/public/runtime/services.ts": "8e4648d8c61bff47343f9e1c2b995af69fc00947264b826109ceadcbaf553254", + "packages/artplayer/public/runtime/setting.ts": "c48d20957b57f79f985ef76a2950cc8a5cfa25dafa8ec5939e562661778e6218", + "packages/artplayer/public/runtime/subtitle.ts": "13241c4f9a87517aa2cf7b3e0bb8cedaa12fa0b4d3f8934285797583b752557e", + "packages/artplayer/public/runtime/template.ts": "da9975513a1938e7f386f4f65f718f0fc595164bfeac8f0cd99a3e97a54919a1", + "packages/artplayer/public/runtime/utils.ts": "cab9916f5224a3b047812b9f759cc9cc62105662599744067a6955020ab36916", + "packages/artplayer/public/setting.ts": "d12a75b656fff70cbb30be4bffec46d9c4273636e8722bce971a4d2b188712a1", + "packages/artplayer/public/subtitle.ts": "d25b470e47d6a9bd696d9c1ad8adb58e56a208f05695186d513bc8c43c2e8acf", + "packages/artplayer/public/template.ts": "68aed9e97d006d6be4fabb8504ca84dafab770b0925f4d6e7319e67c82f21b0d", + "packages/artplayer/public/utils.ts": "494ec447ab467a07ddd7a2c2abf778b3fce69fd28a09aaa8ced9759f8de2e3f6" + }, + "declarations": { + "packages/artplayer/types/artplayer.d.cts": "3685065e4263abcfd9d953176e461d5b3eb990b0363b54689a7f55deba770fef", + "packages/artplayer/types/artplayer.d.mts": "b664fec51ee5c5381f2ceab25d99d52aee56feab04a2ee7b4ea5b2145ea5fa0e", + "packages/artplayer/types/artplayer.d.ts": "5d0162adf7ac6d0f2bb9b5cfe361f28657c4d9c540cadbf36eba3cc954ce50f8", + "packages/artplayer/types/component.d.ts": "ae5bc1ddeaa1ee1ebbc62573e32423993727079205c64751a5a314170e588a32", + "packages/artplayer/types/config.d.ts": "36f9a84cd436f17701a0d11d3417fc1fe0414e0c52c80083b94a85dfc329e37e", + "packages/artplayer/types/cssVar.d.ts": "93217860fff2ebf750f606d95ddd22220a58837119e63bdf2f5f78fd7488458b", + "packages/artplayer/types/emitter.d.ts": "7e1f9a2a8ce65feb95734f1ed52d1334e57aa388bbef2a43d8bc53a9b6f6623c", + "packages/artplayer/types/events.d.ts": "f83624c9268a284477e8bd793fe3562a2363b72f2a44d5c64fe8c6a6cede8830", + "packages/artplayer/types/i18n.d.ts": "bebbe372d9b22443e75e0c0cea05bd52e8a44c1f82ce656d278a100a21a85b57", + "packages/artplayer/types/icons.d.ts": "326a67ba7bdcf52862c5b2a269e540140aff98d05c7b96196485a77f84fe5960", + "packages/artplayer/types/language.d.cts": "f7928e108cf7b7814c2d75cb0a525333e95873fca6cd6d89a740450656b9c1cd", + "packages/artplayer/types/language.d.mts": "6619a26d604b7cccbe2f596243d87ae37cfaae33b8b52874ec071d9787446f9e", + "packages/artplayer/types/legacy/language.d.ts": "c7abda4d506fd933c350e9030290bf9e64347a921d683a66115da1995ebe0a81", + "packages/artplayer/types/option.d.ts": "ccf2c8ddc537dc65c9682d39f044726e23bff18f476b622512d7e6a4b949b5f6", + "packages/artplayer/types/playback.d.ts": "58705c273df6e76a77a6575e769a9ec6c013785c25080f2551aa22415788d870", + "packages/artplayer/types/player.d.ts": "92b00211b70ac71336e495899df972a0519dd138111846044fe4e0f967966177", + "packages/artplayer/types/plugin.d.ts": "fc3594a41c51d8248713e33c486fb1f6a518ac5c7ce31be6988a6cd8d052c5f3", + "packages/artplayer/types/quality.d.ts": "1ac1a48b4f74ff9ba1ce60443e1463d50d1c6a2e5d87d63dc7d2a8eb7f4c2c34", + "packages/artplayer/types/runtime.d.cts": "7ee988dfea9a0ac71a34a656f96f7b74e78aa92547cfdfab7ff7e1139a77d4a3", + "packages/artplayer/types/runtime.d.mts": "dcb85f59a8b7714918ced0c1d18c2bb24e8b80b56d8c594e019dcbdb5ad88b08", + "packages/artplayer/types/runtime.d.ts": "9c6ccd39a1be293f17ae46dae8ea077053e12635ee79d73a5e3b3a559230fcff", + "packages/artplayer/types/runtime/component.d.ts": "1b4c0cee44568649e80140fe778febfcae88af0ac85515f1cbeff78ab0c6d14f", + "packages/artplayer/types/runtime/construction.d.ts": "7a87bedf6f7ffff0c46078aa5f1551e0077d35574e286516121f5f935e2d9ce4", + "packages/artplayer/types/runtime/events.d.ts": "a1e2f9d387475453eaf95c2a5ee79e228636c0bb859bda3fcc46da46574a0c31", + "packages/artplayer/types/runtime/media.d.ts": "8fc89401be7fe25542c169d07dd5675f10916ed20be8493e19695966cf3864a8", + "packages/artplayer/types/runtime/option.d.ts": "6e334e1a76fdcc40b4665c02523bd31c3994d96078fadeb40e23422aa54c1a1d", + "packages/artplayer/types/runtime/player.d.ts": "8ac6383502e4872e83659838844856903031a81a0adc8e8535feb78453aa042c", + "packages/artplayer/types/runtime/plugin.d.ts": "8528f2b17843149f42f9cc16d6fd70baa238c9dc2c329b67d2c38096799c69bd", + "packages/artplayer/types/runtime/services.d.ts": "604c9f8e4b6c0da818f96576bf9f4b0e96085a9003927b2f7ba30027b1ba237e", + "packages/artplayer/types/runtime/setting.d.ts": "349c1fcb205ad312916bd3ee55e6bf241ea8a569fb2ab6c80822e69fc518f7d7", + "packages/artplayer/types/runtime/subtitle.d.ts": "269ff84678d327b3a9dc2f5bc6cc0d731d1e081b85422e474621d5d792efb153", + "packages/artplayer/types/runtime/template.d.ts": "7a62f968a38b4bf9109a4439557c02074eb1d62ba1f6e21a8eb194e91f0badfe", + "packages/artplayer/types/runtime/utils.d.ts": "6bf731705d86853e066dbaf3b8d4003b6548423fe615b7412b722bd0d3a6e48b", + "packages/artplayer/types/setting.d.ts": "08305a75dff96f06490430e099338b463df471b550c1d0dac3abc8995b39eb09", + "packages/artplayer/types/subtitle.d.ts": "b18314e2d64efdb6045830b6e12f615ae2ed585416130e562329ad3ea337f6ce", + "packages/artplayer/types/template.d.ts": "4792bc0c2cbcb7966e4375118bd34b326166e0831862e94ace4cf6b1bbe6a8c8", + "packages/artplayer/types/utils.d.ts": "fca0d3d814df94a25f9eb067c86fa0cf272e2791bac793b91229d57680797712" + }, + "tooling": { + "eslint.config.js": "2a93511fc7938d9d078016f57b938cb74ccbbed26a786e9bf64317213733ed30", + "package.json": "93fee3cb5cce9223306c592eab225783f64a10925b81c68d45d5fdb00cacc412", + "packages/artplayer/.npmignore": "ee5bface8b8b100272b150e927f059fbd106f7ece38b65125f4f9864deb979bd", + "packages/artplayer/tsconfig.json": "c074f0621b18e6f209e217a702745e4118ee7724955e8104c7e3df3a223a9921", + "playwright.config.js": "df2384f5626252ec933725867e400ec22eb92bc5e6f04873059b32decf2f2d56", + "scripts/build-ts.js": "a32e3a9e590735d8cdbf1a65964e9ff7fbef9e5f322393ad37e835742226831f", + "scripts/build-types.mjs": "9146384edca4ab6d34bac7bfe4ab1f0022432066c852f5d4c008c06093c63d43", + "scripts/editor-types.mjs": "951d3d40dc7f90034561fd1a3b3015bdb1449593121bb410e3f15e4415547b8b", + "scripts/package-check.mjs": "a6d53bd1be63f65685d2bbba9e29cd4f557d30970343635323ededf95223c652", + "scripts/package-consumer.mjs": "3c85b3d664d5cf20e593a938cc756017f55fff5a2df5304054dbaa2f65131044", + "scripts/tsconfig.editor.json": "ce57cedc75093d62f9d62efe1ff24c1d5d0fd157cbe830d082b8cebcf5f0e6a1", + "scripts/typecheck.mjs": "a397b091ece42e89275820c579fbf90778f17d4b5b4eecf4cdc8fb0c376a0520", + "test/browser/auto-playback.spec.js": "39d9258fb808ef42dfbd38836572335a5c759d99cc1b0ecc1b635a2d7cb3b0fe", + "test/browser/builtin-layers.spec.js": "4efa0ebe413cbf0ca9b06074ce73ead337136bc477c4f8fda6665be0504a31eb", + "test/browser/chapter.spec.js": "d1332c5264bea179d4fd4ec3274eb0db28340bffbda3ffd37d80fc6fb636dca2", + "test/browser/components.spec.js": "2be381b052b69baa3b4ae9cf2582593b9d611158e709e056aaa5df3cf969bef4", + "test/browser/declarations.spec.js": "7340de5f8e34f71cf8d7dbf5f428c3e1c20677a44cc5f561199c9e55d21dc44a", + "test/browser/display-mini.spec.js": "eecb351ef6c1b4d5a96c682e9d9b4507260473b10159bad0b918af277c2c58f3", + "test/browser/display-native.spec.js": "557f0613a23c8da819d55a62acd5ae47340f16cfb4f91bb9778f7984b8887e49", + "test/browser/display-orientation.spec.js": "754bb231c4ef3f634235269aed0588d118ccc9bcbb1bd734f4356cd4222119a8", + "test/browser/display-pip-webkit.spec.js": "8169cee87dad40ecc4b1c1b0dbf2a6667e0b54197f889cfb4f8b3044cdd703cf", + "test/browser/display-pip.spec.js": "562f25b2e27c4644981d5e95f54bdc1a887ec051a10fe5e91ccad3ae22c8238d", + "test/browser/display-sizing.spec.js": "04912463007d1fa53a5d5048a88e7fcb9c0238a4e20e215e11a3dfe381ad74da", + "test/browser/display-video-fullscreen.spec.js": "961b21a5965d230e8ab8d7cdf7c72914c8c5f9526408a83ff0552cc263225ccb", + "test/browser/display-web.spec.js": "50bdbbb4988e47e34a4cbb08184a68b0000e2dcf34bf60192267648045b3aca0", + "test/browser/dom-boundaries.spec.js": "3edeeaed4f642cf2efca29a7b2905dca98bfb1e6527e9053c59a0f9b374a7091", + "test/browser/editor-types.spec.js": "11303e272c1a5202ffc1c192ddc70ef3e988c9ec78b4d4dd4936c3c8a7b6636f", + "test/browser/emitter.spec.js": "abf5a850835d1a5580d611a0777c0cdf225a6aa796a63b58096f8646007e5870", + "test/browser/event-scheduling.spec.js": "4ebd5dab23ca8e49580bd1dc3234e612cbae36b735c7c9401d168059eae11c5c", + "test/browser/fast-forward.spec.js": "5b884fae1cd48cb592c2004a8149890aed4741ac0a92b1e415e47b94411bb368", + "test/browser/fixtures.js": "313414b8958eb5b03a2da8595fa0bbf6bfdc01484373898c6cb7179545df175d", + "test/browser/gesture.spec.js": "9301a91220e5cccf1023918580111bf5287f811a51c0b51e7ed71797cb018575", + "test/browser/global-events.spec.js": "67ef2bc32419f17bb10ff40f7d9e542c110f2202028e5a17d58780e2cc6cf5f3", + "test/browser/hotkey.spec.js": "a6565949f25d702aeb33ef8ebbddf2ed995d67f09a47c7bfaa20010da34dfa1c", + "test/browser/initialization.spec.js": "cf85dfc88faf2c43b885bf1438b53dbcb4116dc445fc49e8f107bd78ccaa467c", + "test/browser/input-closeout.spec.js": "6ede540965e404c58cf71a23dabb6be9ab2b107e75d5937e6d63b11dbf11cf98", + "test/browser/lifecycle.spec.js": "7726535769bdf01a57d15d562bad9b3bb2cce0d979b7b0def6cbcf77bd72f453", + "test/browser/listener-registry.spec.js": "54c40eebcd818342e92f875cb639d31d1fa0a0fc95897de2cbfbbd4df793ac94", + "test/browser/media-events.spec.js": "3f5c719facfb97498e6f254117fc4d7d2d91e7f0d53efeab6d877e107dac174b", + "test/browser/media-hosts.spec.js": "543e974f5bb89116a688defb2c1e4afdc72bb6cf4b1bf9838d0e837e661d7845", + "test/browser/notice.spec.js": "2b57c1307aace558aae0c4d8d4434a473780eb9d70c6cf62962147f476bdc94b", + "test/browser/options.spec.js": "17733db5056f04f829ecaa925b021d339d0f6f6960cfb8bd277c68cf8c4e119a", + "test/browser/playback-properties.spec.js": "14e0774bf272cca78d203fef9c343b9b2eac5c30ffbe5c354b00640e1cd9627c", + "test/browser/playback.spec.js": "5cc5df6f3968f3e834a6b2bc2c76c3c1c4ec5e7bda5ee3e99aa7394d24ac7e18", + "test/browser/plugins.spec.js": "526c58db1ae2080cf76a13b542e502b4847b23f07e8cd012f40129dda3358a00", + "test/browser/pointer-events.spec.js": "fa789898942d6eeffcb1f8867af46abcdb1dc8a515470ffdb18e89e8fafc4985", + "test/browser/progress-quality.spec.js": "824596e3f0f1a7d8304ca7fed38de4f00b2f967eb87fd48346ad714fbb2e280f", + "test/browser/prompt-components.spec.js": "2513a31306bb17b713aca2f9bc44f045ce34ac547482b4507955b0f1f14484ed", + "test/browser/resource-scope.spec.js": "0196bd9943c1ce2f6560f87156cd0de47606579c1a736bd46d4943179a121d3f", + "test/browser/runtime-types.spec.js": "7ec0442c3cd5a9cad8cc581a11038c85ef9bf85b473198dd4a94e62a77856c8e", + "test/browser/screenshot.spec.js": "a2b49fbd8616533fc351892c1f6687d588d2bc9350fda4be5475decb97d77a0e", + "test/browser/server.mjs": "f49406e30d23aca62bccbc4ea8e68e4842346d29673aba6216a05a212355714c", + "test/browser/setting-interaction.spec.js": "030266515b16e1bf8677b30e7748f6a6451b10eba541c5ead9a54b5e57bb05b6", + "test/browser/setting-ownership.spec.js": "ef345200701ef826faa7c3aca564726bc9fad6587cc0af091c579d78ee7f3b4e", + "test/browser/setting-update.spec.js": "2f61a9790ebbdb0f3d86adfc2f9bce5e789806af2517403a47d5c02f1eddd1b1", + "test/browser/setting.spec.js": "19acfd07cb6316381e3bce61e0ae284303aeafc8fca14e1657d73568553c5bb6", + "test/browser/source.spec.js": "8bbd3b0eba2dda89f8b5f484468e916a34e2e53319f3ed3106116db51436ffd1", + "test/browser/subtitle-lifecycle.spec.js": "ba91719ccdc9e539aee252d80deaba622fd6e5cb30cdd74697658af1e49dfd58", + "test/browser/template-resources.spec.js": "993ce9876ae9d49f291af4173ffa34276f9b8972828e8d42b8789c5ee512ac6d", + "test/browser/thumbnails.spec.js": "bc00e6fe6eb6987bd36193f26c69e2377249b53f41dfc1474dd44d6e833a2c09", + "test/browser/utils.spec.js": "e7f1739938791a6d19ec2cdf544f57c69ad7caaaa6f379128b3676d73d8611b1", + "test/declarations.test.js": "5f7c72b23fcde96082f5e7ef639c9f85d10d186336271363d6882b50b338aee6", + "test/editor-types.test.js": "e121aa83e75cc9487ca0accbcbb0566d0a92b9bac516d9d45dcc0cd113b4a6b8", + "test/package-check.test.js": "daecef5ca8f436efb8a72c5e99632061aa9110d2c295cd97eeed5bc9fd0a3aa5", + "test/package/runtime.cjs": "5973b860d377de22354fb597e602354cca7bff6b615a1e3a01747330a557c071", + "test/types/runtime-commonjs.cts": "66517d93d7d4b3e0770aa5a38d0a25fe34e796456426f35c0a47fdeef3ccfc11", + "test/types/runtime-components.ts": "81b2d00a92681846bd873e26ce26de09f0f61db8188e9893252bb0bc194342a1", + "test/types/runtime-construction.ts": "275d14830abf9d0c88aacadc4efbffc5995a282f39b9f86ae2d7065ee88b27c4", + "test/types/runtime-events.ts": "e4d5739bdaf4ee1d3ab6f025787661cd7f29e0601afeabb75ef0e2f4565c0ff4", + "test/types/runtime-facade.ts": "e33da4f2a2043c007ac4e1e9a48f134b2b3f7980fc71c8988e7b06f8bee465bf", + "test/types/runtime-leaf-consumer.ts": "08ad31dc7b9b3fc0e11430ca1bc3d1072e0e6f0974a8fe61341351256d565701", + "test/types/runtime-player.ts": "5dab542f969c0968b93f33d5fc565d5876d13b7dd7ac16645b1d8cba3d49a39b", + "test/types/runtime-public.ts": "32ec19042ba294d350bf4b1f5f75cc0f2ea70144fb9dcbdf6e3898d6dedf9f17", + "test/types/runtime-subsystems.ts": "e851a18f917896154e163938c9571a9b282e5616b871e685b15dc34865f61dda", + "test/types/runtime-utils.ts": "9a2ba10222de3288abdaf880386a703136333fdea77c816646be9547d9a8624d", + "yarn.lock": "b3bbf61c78e21fb80ffa53afee663a192ac8085a11359fd42dcd3e6df2f0e022" + }, + "editor": { + "declaration": { + "docs/assets/ts/artplayer.d.ts": "e71a09b0183ab9af04fc47ef75f027b213caaa283b6708103e5913293678c9f6" + }, + "assets": { + "docs/assets/js/vs/base/browser/ui/codicons/codicon/codicon.ttf": "ff6b888d65cfd8077d49c6c704c1bfc8f2ce1ed71db9c583c63e0a49f046c79c", + "docs/assets/js/vs/base/worker/workerMain.js": "3ebdb68f45f9fed1c587901c9db42dd70e8a552421e330f39116fc7b078ba67e", + "docs/assets/js/vs/basic-languages/abap/abap.js": "49638217243bab4ed7d928d194bafe334abb614777440bf46f8636b9e5dfe0a4", + "docs/assets/js/vs/basic-languages/apex/apex.js": "034f340001e4c340b80e18abe45c990564931c4a061b4e74de86c012fb7d7a21", + "docs/assets/js/vs/basic-languages/azcli/azcli.js": "be50c776891279c9717db0d48a20d6d99f07cb60d2d8d279422fa917826683cf", + "docs/assets/js/vs/basic-languages/bat/bat.js": "3ec5d66f73ee7e7dc2b43db5999a768d1a54e933de9f507015fe7709a184adee", + "docs/assets/js/vs/basic-languages/bicep/bicep.js": "59d02b8930e36e2cbc3e472e263f881a82d84da292a79faf1d379cb060a2d7e1", + "docs/assets/js/vs/basic-languages/cameligo/cameligo.js": "f93cd405c71f97f26b4739f7f917b242e82a993ad42884422a43bf27d5b413e2", + "docs/assets/js/vs/basic-languages/clojure/clojure.js": "9e99cf86bcfb25c1b33bac9e26e11e4646868fa753356c7d737cfb24b7b1e49c", + "docs/assets/js/vs/basic-languages/coffee/coffee.js": "90d6aae23c9f5e4f335df5cb57634fa0193a102629deb88b98f238b4025f0551", + "docs/assets/js/vs/basic-languages/cpp/cpp.js": "ece3d119688eaf8a37fffae388118b12f8724ac2c3c8ff10d44caf2e91026424", + "docs/assets/js/vs/basic-languages/csharp/csharp.js": "d6367d0d67c0612cf37d25319e00cda2e4e38869a3c3200b1bfcd856cfe7fb4b", + "docs/assets/js/vs/basic-languages/csp/csp.js": "01241c709a7dddc0b5cedffb6dcf913a5d95c826eb68e2c27f114640719af7df", + "docs/assets/js/vs/basic-languages/css/css.js": "1f8468a126f6bfdc43d49a75e0ae758de913ebf55e685165adb6d069a454de5c", + "docs/assets/js/vs/basic-languages/dart/dart.js": "6b410bbe17b8ebcaed969bdfcf8049df6fe863482756ae73d2aebb919630034c", + "docs/assets/js/vs/basic-languages/dockerfile/dockerfile.js": "315769a72a2877f8ddddf9497a2e7e259e8df51cc38232ddf76fbe4556c0d7cd", + "docs/assets/js/vs/basic-languages/ecl/ecl.js": "fc412fe18e564cff17e9a0bcd5674ba15c49f4739417cf589ce1c546b21033a9", + "docs/assets/js/vs/basic-languages/elixir/elixir.js": "130d310090d723f51111d573000a72aa26fe44c9d79e6d04d12524e6631cfb6b", + "docs/assets/js/vs/basic-languages/flow9/flow9.js": "fafd88d973aed314454cd7d842b270125553f7a7613bb068c3c799a21ac61b64", + "docs/assets/js/vs/basic-languages/fsharp/fsharp.js": "32027afd4be75ddeca6c7beb9b52eda07d59afe3ea39a84f0696a6b3d074dcbf", + "docs/assets/js/vs/basic-languages/go/go.js": "c93466a4479ee8aa5e3ec70a89b469db1277b801d1551d40ad700d5abd367363", + "docs/assets/js/vs/basic-languages/graphql/graphql.js": "60a8825e939ca81540eb6ac00b17867b3e55af97bff99a9fa40c422a4281bdcf", + "docs/assets/js/vs/basic-languages/handlebars/handlebars.js": "5a174247aa64c7a064fc977365bb1c7161b4c97e559a6121773188c25df9d9a2", + "docs/assets/js/vs/basic-languages/hcl/hcl.js": "6053e90b8aa918c9744f41dcb1c0e58229a4946f0968a39b00776c3893538f54", + "docs/assets/js/vs/basic-languages/html/html.js": "6e7ae0ce7f07ec01c64db1368869715c115690e40fb5c183d5ced0d2716038bd", + "docs/assets/js/vs/basic-languages/ini/ini.js": "ecdb5c36a38a8b68af6384789c380d0e28b5b3df86de9c3419d348e688b8810e", + "docs/assets/js/vs/basic-languages/java/java.js": "8fd9c491b67dfa9ab831ed71a3973cc6ffc840f438f41114a794163672f4cf9c", + "docs/assets/js/vs/basic-languages/javascript/javascript.js": "bbd7fb1b714d347704eae4c74cb36c352876864f2103a69af3965f32c1c982c6", + "docs/assets/js/vs/basic-languages/julia/julia.js": "ef3783cbb81cee25697c0bddc9476813b593fb64712c21bc60099c8109c748f0", + "docs/assets/js/vs/basic-languages/kotlin/kotlin.js": "31b082803acb08622aa2dd736dca42772f6a0d3224fdb7c0e9c3e1f17800ca32", + "docs/assets/js/vs/basic-languages/less/less.js": "5ba9296cc5c6a7699028ac6e263631eb9284f80bfbffe99a4429f6c85dfc0589", + "docs/assets/js/vs/basic-languages/lexon/lexon.js": "2be27259788a7a4a6fb94a59150b47d169ef6e04933f76977e568c4cb0227f57", + "docs/assets/js/vs/basic-languages/liquid/liquid.js": "f4454c09b7e66ab2ffd81451aef2f12c79c0011839e19bcdb0fce42928acce6b", + "docs/assets/js/vs/basic-languages/lua/lua.js": "f39154e727c8d3df5c70ecab1737c0a07df3011977288ba4adc7d25c8ef639b5", + "docs/assets/js/vs/basic-languages/m3/m3.js": "a3b616444441f34b90b4e06a6a3a845f2804da67220c19721b9461140eb7f074", + "docs/assets/js/vs/basic-languages/markdown/markdown.js": "47ae9f567af2e69e682d14703bf4ad5428708464edb3d30791f3255a2863a52e", + "docs/assets/js/vs/basic-languages/mips/mips.js": "fcc6104a8c7092794744a1472511cd348d585d1cba0421e61e5eb8e0c58af186", + "docs/assets/js/vs/basic-languages/msdax/msdax.js": "f98e43f6600e629bfc354196006a02f9f9cc26480de064cc480e3bc885beb283", + "docs/assets/js/vs/basic-languages/mysql/mysql.js": "1cafe5b6c81234fc6680a421dd6290ec590ce03b9e525eacb0936a78ab50aeae", + "docs/assets/js/vs/basic-languages/objective-c/objective-c.js": "7cfdb8b492b6f1c5a1d83fefc3bd349bb1acdd489516534aefacd553c2850e75", + "docs/assets/js/vs/basic-languages/pascal/pascal.js": "f2886264f5ad42d173ef18e8ea961f674090be7513f48af95dcef4eb1191cac3", + "docs/assets/js/vs/basic-languages/pascaligo/pascaligo.js": "3d3317429e0837f6960e33829a2c2fd62119ca1514ad735f62345da8fd1dd817", + "docs/assets/js/vs/basic-languages/perl/perl.js": "317b527f0ade315a7cb066eac72672e5f2ba6d0c02c6014be052c32fb6566aed", + "docs/assets/js/vs/basic-languages/pgsql/pgsql.js": "f58b4ab8529e311f7f98f690ed39e13de22f3ae29cc8916bf99c21ac86917970", + "docs/assets/js/vs/basic-languages/php/php.js": "3d7d187fb2e3b959adfda7b7557ccda4b6f690f838babc525cabffbe0dda7dd0", + "docs/assets/js/vs/basic-languages/pla/pla.js": "6138b0b0a1be95370c00afe6eca5022ea10e8b0f11f1db9382163f28975373e6", + "docs/assets/js/vs/basic-languages/postiats/postiats.js": "5b18eac81236e88ffca2e67e527fa1d6fb42f53a4df42c1fbeb37312a9ec2fe4", + "docs/assets/js/vs/basic-languages/powerquery/powerquery.js": "fb9705793a687b03fe08605f19c3f1019d83cf06394a8381db541bda92e230d4", + "docs/assets/js/vs/basic-languages/powershell/powershell.js": "b80339b4a8450fd3a5bb5bf3817fb1b67fe6202690fc1ce97ef22336bcd7053b", + "docs/assets/js/vs/basic-languages/protobuf/protobuf.js": "18f13fbd6b421023eec480901e48354d249bc9c3dce9d0e0cc842cbab4393fd3", + "docs/assets/js/vs/basic-languages/pug/pug.js": "dbce9bb879b84cf3bf8bd05643a4d3d2ae6ded03b4a9234a0e8d2ebfab6ade44", + "docs/assets/js/vs/basic-languages/python/python.js": "b0c9cb9c96d3b289b4ee1bb6ca921e810d87ec2967ebaf8608d5570865ac6524", + "docs/assets/js/vs/basic-languages/qsharp/qsharp.js": "6cf9e660e8082f7a8dff4e8041c58c5e9fed1e622e0301b359886a5148c15327", + "docs/assets/js/vs/basic-languages/r/r.js": "889684005db07d8b2e8c6f17d54b7bbf1bd67ad948b0b9ca411c2e55ba3433dd", + "docs/assets/js/vs/basic-languages/razor/razor.js": "da07ee116d392fbf97f5adc9d4f1fd46e5bbbe9765949c8cb9a6f6a4917ce6cb", + "docs/assets/js/vs/basic-languages/redis/redis.js": "286518ee6a7e76356149bebfbcdc19d2d30c19a5fa48d4bfcbf2f7a946783bd0", + "docs/assets/js/vs/basic-languages/redshift/redshift.js": "8b865d41e76c227f3e1eb3bc74f8e9cf24627b449cc94164c803c1e515a9bbfd", + "docs/assets/js/vs/basic-languages/restructuredtext/restructuredtext.js": "32c72e9b8fa318289b628efee24bc5b573e3f74f8ab7dd544dead1b3545fc351", + "docs/assets/js/vs/basic-languages/ruby/ruby.js": "93a9fbda62d9b4ef5537de37d7b4c77a89d8e2b0a2193dddac534ce98da47b5f", + "docs/assets/js/vs/basic-languages/rust/rust.js": "6352c16af73494a44e09b5ccad8a61c0369933d94881fcf58a7e8a75a27315cf", + "docs/assets/js/vs/basic-languages/sb/sb.js": "7323046d28f72e54b5abda684d4ec67d55b688a0b5e1d23ffe1d675c1c141b69", + "docs/assets/js/vs/basic-languages/scala/scala.js": "57309bc0e00edda2c4edb5fd255e042e1ef6ce8d51f51c7e822a74268e04f444", + "docs/assets/js/vs/basic-languages/scheme/scheme.js": "3fe89a5618aa1c4eafa5c65aad212fcf2ba34e302de73df7db0867ba01dbd866", + "docs/assets/js/vs/basic-languages/scss/scss.js": "b01dfbdbd787642ed55a3ca7b0b89b2edb80e4aa486d89fee0ba748124dad4f9", + "docs/assets/js/vs/basic-languages/shell/shell.js": "39063f662fa62eb543e5d8f9b792b31d14c484abafd9a67943dae52fc9f5ce36", + "docs/assets/js/vs/basic-languages/solidity/solidity.js": "e25859bb2a1babe193f03028489c95296b1bfe98a92dcb450d4c539661b5a86d", + "docs/assets/js/vs/basic-languages/sophia/sophia.js": "4ba061aa0beb82ba64efeb6bd1128da0d3445ac8cfc26d3f4591c66df0fa4bb0", + "docs/assets/js/vs/basic-languages/sparql/sparql.js": "162783ddf2dd67384d379ebf485f6ed0cafd820e892e4d89e82c8ba8617390c4", + "docs/assets/js/vs/basic-languages/sql/sql.js": "3b1decbf86cb0b163070cc144e826f104ba10468798b36e6d0e64257a35fd1f8", + "docs/assets/js/vs/basic-languages/st/st.js": "b3ac35684d5668c2d08105cec31f43e8d897e4ab94103d8bd64ac804d256c20c", + "docs/assets/js/vs/basic-languages/swift/swift.js": "288a0ad2974e332bb873bacbb2a284f8f39cdc7d12b1fd5e3c46699147a63633", + "docs/assets/js/vs/basic-languages/systemverilog/systemverilog.js": "40b18f15d29e3201142eb02fd5cc5ad690b32386bbe5dc0a874fd68a2f176f41", + "docs/assets/js/vs/basic-languages/tcl/tcl.js": "317b63a872ce538d4eef5dae701641670fd3f99dfc0439465d444b2992b69bea", + "docs/assets/js/vs/basic-languages/twig/twig.js": "c3442379367d5ef43f1377a14e3c6a04ec451dabb05bed200571ea6dc328dfa0", + "docs/assets/js/vs/basic-languages/typescript/typescript.js": "25dd318efd5aada375fdf391c488bd0b5ec0d665ba16e49f1e7968217ad01139", + "docs/assets/js/vs/basic-languages/vb/vb.js": "41d3d863c8b955c53eddb8724866a487d3632995114c77c0e9bc416227d148bf", + "docs/assets/js/vs/basic-languages/xml/xml.js": "95ddef452d5ff87f5c9f807d56f3f74964727677b5a55baa13a0a4870e2ae850", + "docs/assets/js/vs/basic-languages/yaml/yaml.js": "a6ffa854247873af58df3ad550bbdd474b2d8dbc1d1c730fce4e44dfcb5f9b62", + "docs/assets/js/vs/editor/editor.main.css": "165d5ada907097527448677d0d0f0213578fe5cfaffcb245d7229862e849783a", + "docs/assets/js/vs/editor/editor.main.js": "05a50ed50bb013b6e7a82d25686186aa7bdff8b8209c7badab00e046b5e99618", + "docs/assets/js/vs/editor/editor.main.nls.de.js": "e31a518baf29ffce15a27ac80a6b5406ebf21c76657f3344f46c9ac0e6d0c202", + "docs/assets/js/vs/editor/editor.main.nls.es.js": "f86887a1575bc71f035e92eb68b3d4e8c4e351d93f3b98520660933fed984007", + "docs/assets/js/vs/editor/editor.main.nls.fr.js": "673214777e1ba3518abe1bbde8b5250cb18d65257054c8adf9cb5e1e49918d27", + "docs/assets/js/vs/editor/editor.main.nls.it.js": "66df8e46d4aa40b5393489efda7e8aee5ad5589fdf68fef03832e665f0aabc9c", + "docs/assets/js/vs/editor/editor.main.nls.ja.js": "4688d4dfa1ddf91cbfa7005e1110b12f79315706e7d56463c96e8bc688a3d60d", + "docs/assets/js/vs/editor/editor.main.nls.js": "4d4915b0ff284b77938d3be70b9000911554fc451263a7baa594d199ef170a0e", + "docs/assets/js/vs/editor/editor.main.nls.ko.js": "a6d39e2202fa271bfd5e04b83a5265bbe7ef73a945471c9e9fcb65ff8f1a8663", + "docs/assets/js/vs/editor/editor.main.nls.ru.js": "345850b05cc97c0c1978df43ee996a32da7cd33ba1a85be3b6958884a8307040", + "docs/assets/js/vs/editor/editor.main.nls.zh-cn.js": "30ce784d1733d424e221009e097760b813e629d63579bddb62f7a4f229b9011f", + "docs/assets/js/vs/editor/editor.main.nls.zh-tw.js": "ab5c148283e9afd0577afb5e522e45c6c2b323a0a12215b71f92155fbf003b74", + "docs/assets/js/vs/language/css/cssMode.js": "c0f3a99395d07b421ef75f6eb78389c6ef29477f6a05556f9b94e2bb918dd6c1", + "docs/assets/js/vs/language/css/cssWorker.js": "073e09f9301dcf147e40ef675e3f18d8cc29de9f49673ec8d17711569144552d", + "docs/assets/js/vs/language/html/htmlMode.js": "91f7b295ddc3b0b679c669b84865f3ace79fdd30bfcd814f2960c06f3e24d600", + "docs/assets/js/vs/language/html/htmlWorker.js": "0b14f0af7ae7ab85732574fb384496dae3e85d28f953188cc842eec468a8a457", + "docs/assets/js/vs/language/json/jsonMode.js": "9abacb664dcd8564f28ef004465da0f4b3c551b2741424bf42e61c0a26e61adb", + "docs/assets/js/vs/language/json/jsonWorker.js": "0eb929c56d44afddb3030c011913010311ce34e5eadb1129a3ce9cbafd4c771d", + "docs/assets/js/vs/language/typescript/tsMode.js": "35d94edaf7982c8b59c95cda38c5ebffcf93479ee91a5c9820b9bf60719351c2", + "docs/assets/js/vs/language/typescript/tsWorker.js": "95d7d318d3b6076692705bda50f69ccf2981aae6b06f240de5ac642f32970bf4", + "docs/assets/js/vs/loader.js": "be92515f6d2cbfc75cd240076246e8ccf6f698269c0402e367d2ee371655bbeb" + }, + "generator": "dts-bundle-generator@9.5.1 with pinned typescript@5.9.3; private AST namespace bridge", + "semantic": "TS 4.3.5 and 5.9.3 standalone positive/negative consumers; actual vendored Monaco worker in all three browser projects", + "scope": "Core editor declarations and typed player example. Full plugin/editor UI modernization remains SITE-02." + }, + "ci": { + "passed": 449, + "productionTypeScript": 229, + "declarations": 37, + "logSha256": "90288b5ae5fb1d85748a10eca86535cce54f3d17ff692a5952d54d8dcb052dbb" + }, + "packageOutput": "refactor/.cache/packages/run-LYDR8W", + "packageReportSha256": "8b5663d4c2099eb20e6666c9a732b932230f88039784aba1755b282aea1030f0", + "packages": [ + { + "name": "artplayer", + "version": "5.4.1", + "archive": "artplayer.tgz", + "sha256": "f4da4c9df6f884cd9eb105a2a1bb39ca05d7377ee62dedf2e289b9e515355a88", + "files": { + "package/ARCHITECTURE.md": "fa1979c2939a6d50763dc7a8e886564fa318986f254dcac6077d47b122d01561", + "package/README.md": "1e185e65f67fc2081b4182bbc6c4558ea05b6e3fa3acc5dd0c3ac7df1d542b09", + "package/THIRD_PARTY_NOTICES": "b77b5b46b79fa0cda850b0781f78c3b1112c4ed9672fa291956fe8eff53098e7", + "package/dist/artplayer.cts": "0e91e907d021db02a68004603e6190505fdc0806d873ebb6af171aa089a81da7", + "package/dist/artplayer.js": "5787d082246f7adbc630a0461637d9a597394ba7cd97bcd5bf48924e9699d99f", + "package/dist/artplayer.legacy.js": "45afe957849bcc2a2b81ed3a7b55f8f16530bf9b6a719c34f67f5befea1bd7ae", + "package/dist/artplayer.mjs": "91f38811f121c244177d81e3c440b4c5f27756145f974a8e5a58e49e793370d9", + "package/dist/artplayer.mts": "f6292596a9ccb1d43a6d6a12c35f859b1889ad15924c5ae0f9f280941aade313", + "package/dist/artplayer.ts": "26a42ac66811e70f68a8ebe62cbf304eb1993451b3e658961be98e7106162527", + "package/dist/component.ts": "aa1c43be67322781b4b355b143bc69d9f29d22e578e4974d6a13e957a7c0334f", + "package/dist/config.ts": "c4fd8681bf32b10c743e3e561c532520c8f32e43fd765524850b15e55cb91c72", + "package/dist/cssVar.ts": "e027d82fb4f01c9ce7559cf679b2d5ee1962d3f7e5b4dd64ca21f472b933efb6", + "package/dist/emitter.ts": "9c62551cdcc6dd3966bed8a7a85dd477435db977c91a294d2ac8f162f9592537", + "package/dist/events.ts": "af191f862af4ec8933b09113b8c074603ae254a8b70460d0f3006646cd74ae42", + "package/dist/i18n.ts": "3e14759caf71f97f01650839248c8737c42d2c2979dabc43ad92b724da648708", + "package/dist/i18n/ar.js": "5885c469efc9f07aafd6a4aa6698edae2c2683f42497ebbe15374130f9b6e2c7", + "package/dist/i18n/ar.mjs": "a275cf39ae2317ea1cea73b65ba5451a909b34a881d35920391cef2ff0d6a86f", + "package/dist/i18n/cs.js": "5adef10fadb219948eb5e58e204207ca0afdd2dd941a08d9455fd302ef2447cc", + "package/dist/i18n/cs.mjs": "2d274b61c2be9a472a3cc19dfa775e6209867f8d1d5a9116923f075446f47969", + "package/dist/i18n/es.js": "4c6662edce1398d0fe285978df83b271cce23e4f24e0e6a9d24a5b8a6845839b", + "package/dist/i18n/es.mjs": "09c0806a979feb4ae0e3ff32dbee9fd435847d3a66f80b6768ff69ab63289696", + "package/dist/i18n/fa.js": "db37cade9454df0b829c514e088d4d9175199faaff2b4a7838e6a401741131fe", + "package/dist/i18n/fa.mjs": "83290582155ee2a7a08a8c9cf8c2903545e78260e81a2a091092f3fbe61b4dd0", + "package/dist/i18n/fr.js": "54eee11fdf245e9882cb1f440f8909ccb8112f2e10722447cb313cab4752abea", + "package/dist/i18n/fr.mjs": "621844a04365da3d9e5d225d64e233d322cb9fd9c1ffcc2db77e5d7e0e78ea8e", + "package/dist/i18n/id.js": "5d4ee91a123c417b5b2e84890d85f416444389bdcd12c40d49073e1061796463", + "package/dist/i18n/id.mjs": "ffca08de9515704ef160dd902534df4b4113ff3f62b37f70330264d27daf5c34", + "package/dist/i18n/pl.js": "47e0d39623896436722439c758488ec660752c56a0294375bf0fce4f3b2aa27b", + "package/dist/i18n/pl.mjs": "05fbb3b2d09b44b5d3a237ea35a1f6865d45c2985e32b517dec4a00670cddebc", + "package/dist/i18n/ru.js": "3af3b15b1554579352b9b1ecfc8ac27abb584a5af9bcc7a8369a813c55df8834", + "package/dist/i18n/ru.mjs": "12281df03fc45c40ab8ad2a7dd8bbbab35f086dadd7e51f35e27826fff16e1ce", + "package/dist/i18n/tr.js": "0f8da88d4f770d9ec2e83311bbd6cc6ecfc0b2bbb3997f8db8eea8b795746967", + "package/dist/i18n/tr.mjs": "ea533927a7f32b3124177e87d9d5adbd279dc80efca7b11ad94696b3b47f7e94", + "package/dist/i18n/vi.js": "e3302f5c90f3e7df4bf8667c17598d0e46b66b31aab0d94fa70f3e617b5277c0", + "package/dist/i18n/vi.mjs": "f7a0ce8d821bff93354be31922a73be854a685e14170e8875cd5375f155e8737", + "package/dist/i18n/zh-tw.js": "13446c81dccf57e6b5d2be0a55b8ef6a668c6b8005ef4a497439557d6ccb16ec", + "package/dist/i18n/zh-tw.mjs": "730ae246aef8cffb34d7ba3b48aefab38fa812cf84ea7ebbd827f8639ee7eba7", + "package/dist/icons.ts": "0d8e8e52e52130dd4a29bab551dd7a2a954797e42e92a6e068c85d583e23e6a4", + "package/dist/language.cts": "2248040d86a8e34626755c4ecf53ea0174706c653073cf0e15884a030d173120", + "package/dist/language.mts": "c391e863012c77769e661afbf8fa949e9373aa88d17f58cbba7f5696edb8077f", + "package/dist/legacy/language.ts": "c452ffd764ff9b29b819b3475c42395d2ea7a33560d8c186ef5df3844b9524c3", + "package/dist/option.ts": "850e5264219b8b438c80694402225b690b131786677a5da0d22739ec2352d263", + "package/dist/playback.ts": "1ceaed3aa1cef511fe8b20f4874647f6065c723ad805b742a0a9247e16bb1bb5", + "package/dist/player.ts": "f1e50257df2ea592d0a0e1f36078dda77eaf2cf3b3d795307501396562d99f28", + "package/dist/plugin.ts": "2a57e148fda00ee687da5036b890b0f611cb94bb403a1ed52602179060259d35", + "package/dist/quality.ts": "7ed6ed78cea52991b2f6ddd2bd3b7bd8c5146fdfff7486fe8b814c3e632f1567", + "package/dist/runtime.cts": "52cfff1daeb6841a90212c8fa8d46ca46d6650bb7ed1b59b62115d854b8ad652", + "package/dist/runtime.mts": "1b09bc0ee0f0ee2f788689eaff441bdeda1fab0ce783e71b61b9792d81072b03", + "package/dist/runtime.ts": "ec4b1d56993eb482a77eb0f94b701047549d009e6ba6433f27e7d464fef30c2b", + "package/dist/runtime/component.ts": "840213299c942fe058eb5436977ceec066b9dccda24c55ae9f464b399c979e39", + "package/dist/runtime/construction.ts": "24cc5cda1f614314db382271a9b0d5583b781894cfdf6c548700b1b5270467ee", + "package/dist/runtime/events.ts": "52848f57d35eb1037cf74c8877521edf99a015bcd77f30ef6bbcba1807a99bfe", + "package/dist/runtime/media.ts": "8828f80953aec3e95328cefe691661e8897cb27cb309483cf806ec45a8549ae3", + "package/dist/runtime/option.ts": "bb672e49ffe74a6fc78543217f6de80d7d738890146df0857c709d4dc283e4ce", + "package/dist/runtime/player.ts": "a4a24794e26cfb9e4310bf0f459a7a407e85bf81b4f3a4feb6294331af8036fb", + "package/dist/runtime/plugin.ts": "9ad482f2a77914a91450419680b8af6b314b926f0831c2f7f6d7c466690f95c9", + "package/dist/runtime/services.ts": "8e4648d8c61bff47343f9e1c2b995af69fc00947264b826109ceadcbaf553254", + "package/dist/runtime/setting.ts": "c48d20957b57f79f985ef76a2950cc8a5cfa25dafa8ec5939e562661778e6218", + "package/dist/runtime/subtitle.ts": "13241c4f9a87517aa2cf7b3e0bb8cedaa12fa0b4d3f8934285797583b752557e", + "package/dist/runtime/template.ts": "da9975513a1938e7f386f4f65f718f0fc595164bfeac8f0cd99a3e97a54919a1", + "package/dist/runtime/utils.ts": "cab9916f5224a3b047812b9f759cc9cc62105662599744067a6955020ab36916", + "package/dist/setting.ts": "d12a75b656fff70cbb30be4bffec46d9c4273636e8722bce971a4d2b188712a1", + "package/dist/subtitle.ts": "d25b470e47d6a9bd696d9c1ad8adb58e56a208f05695186d513bc8c43c2e8acf", + "package/dist/template.ts": "68aed9e97d006d6be4fabb8504ca84dafab770b0925f4d6e7319e67c82f21b0d", + "package/dist/utils.ts": "494ec447ab467a07ddd7a2c2abf778b3fce69fd28a09aaa8ced9759f8de2e3f6", + "package/package.json": "82e92699e7c29847f32ac6767ece0401290e7d7a12854722bdbcfd09b90b7954", + "package/types/COMPATIBILITY.md": "a7da9e102a116104b513df4f7451247b7759bc502d3375f30bd5b14a541826e0", + "package/types/README.md": "1bd9868e773610e6312fd48a1c5aa20772d29df0af40c3db66e75b7ab4a1aee0", + "package/types/artplayer.d.cts": "3685065e4263abcfd9d953176e461d5b3eb990b0363b54689a7f55deba770fef", + "package/types/artplayer.d.mts": "b664fec51ee5c5381f2ceab25d99d52aee56feab04a2ee7b4ea5b2145ea5fa0e", + "package/types/artplayer.d.ts": "5d0162adf7ac6d0f2bb9b5cfe361f28657c4d9c540cadbf36eba3cc954ce50f8", + "package/types/component.d.ts": "ae5bc1ddeaa1ee1ebbc62573e32423993727079205c64751a5a314170e588a32", + "package/types/config.d.ts": "36f9a84cd436f17701a0d11d3417fc1fe0414e0c52c80083b94a85dfc329e37e", + "package/types/cssVar.d.ts": "93217860fff2ebf750f606d95ddd22220a58837119e63bdf2f5f78fd7488458b", + "package/types/emitter.d.ts": "7e1f9a2a8ce65feb95734f1ed52d1334e57aa388bbef2a43d8bc53a9b6f6623c", + "package/types/events.d.ts": "f83624c9268a284477e8bd793fe3562a2363b72f2a44d5c64fe8c6a6cede8830", + "package/types/i18n.d.ts": "bebbe372d9b22443e75e0c0cea05bd52e8a44c1f82ce656d278a100a21a85b57", + "package/types/icons.d.ts": "326a67ba7bdcf52862c5b2a269e540140aff98d05c7b96196485a77f84fe5960", + "package/types/language.d.cts": "f7928e108cf7b7814c2d75cb0a525333e95873fca6cd6d89a740450656b9c1cd", + "package/types/language.d.mts": "6619a26d604b7cccbe2f596243d87ae37cfaae33b8b52874ec071d9787446f9e", + "package/types/legacy/language.d.ts": "c7abda4d506fd933c350e9030290bf9e64347a921d683a66115da1995ebe0a81", + "package/types/option.d.ts": "ccf2c8ddc537dc65c9682d39f044726e23bff18f476b622512d7e6a4b949b5f6", + "package/types/playback.d.ts": "58705c273df6e76a77a6575e769a9ec6c013785c25080f2551aa22415788d870", + "package/types/player.d.ts": "92b00211b70ac71336e495899df972a0519dd138111846044fe4e0f967966177", + "package/types/plugin.d.ts": "fc3594a41c51d8248713e33c486fb1f6a518ac5c7ce31be6988a6cd8d052c5f3", + "package/types/quality.d.ts": "1ac1a48b4f74ff9ba1ce60443e1463d50d1c6a2e5d87d63dc7d2a8eb7f4c2c34", + "package/types/runtime.d.cts": "7ee988dfea9a0ac71a34a656f96f7b74e78aa92547cfdfab7ff7e1139a77d4a3", + "package/types/runtime.d.mts": "dcb85f59a8b7714918ced0c1d18c2bb24e8b80b56d8c594e019dcbdb5ad88b08", + "package/types/runtime.d.ts": "9c6ccd39a1be293f17ae46dae8ea077053e12635ee79d73a5e3b3a559230fcff", + "package/types/runtime/component.d.ts": "1b4c0cee44568649e80140fe778febfcae88af0ac85515f1cbeff78ab0c6d14f", + "package/types/runtime/construction.d.ts": "7a87bedf6f7ffff0c46078aa5f1551e0077d35574e286516121f5f935e2d9ce4", + "package/types/runtime/events.d.ts": "a1e2f9d387475453eaf95c2a5ee79e228636c0bb859bda3fcc46da46574a0c31", + "package/types/runtime/media.d.ts": "8fc89401be7fe25542c169d07dd5675f10916ed20be8493e19695966cf3864a8", + "package/types/runtime/option.d.ts": "6e334e1a76fdcc40b4665c02523bd31c3994d96078fadeb40e23422aa54c1a1d", + "package/types/runtime/player.d.ts": "8ac6383502e4872e83659838844856903031a81a0adc8e8535feb78453aa042c", + "package/types/runtime/plugin.d.ts": "8528f2b17843149f42f9cc16d6fd70baa238c9dc2c329b67d2c38096799c69bd", + "package/types/runtime/services.d.ts": "604c9f8e4b6c0da818f96576bf9f4b0e96085a9003927b2f7ba30027b1ba237e", + "package/types/runtime/setting.d.ts": "349c1fcb205ad312916bd3ee55e6bf241ea8a569fb2ab6c80822e69fc518f7d7", + "package/types/runtime/subtitle.d.ts": "269ff84678d327b3a9dc2f5bc6cc0d731d1e081b85422e474621d5d792efb153", + "package/types/runtime/template.d.ts": "7a62f968a38b4bf9109a4439557c02074eb1d62ba1f6e21a8eb194e91f0badfe", + "package/types/runtime/utils.d.ts": "6bf731705d86853e066dbaf3b8d4003b6548423fe615b7412b722bd0d3a6e48b", + "package/types/setting.d.ts": "08305a75dff96f06490430e099338b463df471b550c1d0dac3abc8995b39eb09", + "package/types/subtitle.d.ts": "b18314e2d64efdb6045830b6e12f615ae2ed585416130e562329ad3ea337f6ce", + "package/types/template.d.ts": "4792bc0c2cbcb7966e4375118bd34b326166e0831862e94ace4cf6b1bbe6a8c8", + "package/types/utils.d.ts": "fca0d3d814df94a25f9eb067c86fa0cf272e2791bac793b91229d57680797712" + } + }, + { + "name": "artplayer-plugin-chapter", + "version": "1.1.0", + "archive": "artplayer-plugin-chapter.tgz", + "sha256": "89e57e633e593486802faba4cecf0eb0c497e72109b4e8cc7f91421eaa84aee6", + "files": { + "package/ARCHITECTURE.md": "20743bad87a174b0450e0d876b6aa6b2a9f47df296d479511ce7cc9298fdb57c", + "package/README.md": "b95400ff3d525621a15268bb56a2d353aacaaadefde7e735d7abd91a34edd96f", + "package/dist/artplayer-plugin-chapter.js": "6ac3dfe28f46084ac7caedd571b1a97dcee3cf9d708112f1b8bbd6566e1dc5c5", + "package/dist/artplayer-plugin-chapter.legacy.js": "6d9bff885412169e701670961aa00c2e46c4b42c9b9647ff4e6d198777d2a359", + "package/dist/artplayer-plugin-chapter.mjs": "26415cecab2c0198c566cef0232e20123413782d5bad7534a32939b3298617af", + "package/package.json": "24eec6907b3218439189adab6af3f932c1497c47c2d41209311c01042b07fd4f", + "package/types/artplayer-plugin-chapter.d.cts": "4f07514b37453cd6cea8e5aa28fa018ff31738e0d423c11a3b5eccd50ed30bcc", + "package/types/artplayer-plugin-chapter.d.mts": "610179754db36276e161a07bccf4eaba8b4480f053e716a2bcc5a1574871a171", + "package/types/artplayer-plugin-chapter.d.ts": "581aa2862e709601c87a23585f54a969ebd350be56a7469a31ff53f1311b578d" + } + } + ], + "browserPackageOutput": "refactor/.cache/packages/run-y0PLWJ", + "browserPackageReportSha256": "52199da74fd8470ec5c33d602f085224aabb55d6935f5a9988710fd1c259d89d", + "repackChanges": [ + { + "package": "artplayer", + "member": "package/ARCHITECTURE.md", + "before": "2153b300311597068b509fbb9e922c45b5a51ba6a232d2d4d5ff3f5baf458039", + "after": "fa1979c2939a6d50763dc7a8e886564fa318986f254dcac6077d47b122d01561" + }, + { + "package": "artplayer", + "member": "package/types/COMPATIBILITY.md", + "before": "4a3d080cdee139b746ab3804c7a05ae91d4a6245cd05217d2646c9cd46af618a", + "after": "a7da9e102a116104b513df4f7451247b7759bc502d3375f30bd5b14a541826e0" + }, + { + "package": "artplayer", + "member": "package/types/README.md", + "before": "7ee90de39c212e079015bf008e237b53488f18377bc65e25f1a247a8fb271288", + "after": "1bd9868e773610e6312fd48a1c5aa20772d29df0af40c3db66e75b7ab4a1aee0" + } + ], + "runtimeChecks": [ + "DIST.cjs", + "DIST.cjs-legacy", + "DIST.esm", + "DIST.esm-default-only", + "DIST.esm-legacy", + "DIST.runtime-cjs-identity", + "DIST.runtime-esm-identity", + "DIST.runtime-legacy-identity", + "DIST.runtime-shared-statics", + "DIST.runtime-types-only", + "DIST.global-core", + "DIST.amd-core", + "DIST.global-core-legacy", + "DIST.amd-core-legacy", + "DIST.global-chapter", + "DIST.amd-chapter", + "DIST.global-chapter-legacy", + "DIST.amd-chapter-legacy", + "SSR.import-template", + "SSR.constructor-browser-only", + "SSR.custom-ua-umd-legacy", + "SSR.custom-ua-esm", + "DIST.i18n-cjs-esm-global", + "DIST.exports-boundary", + "DIST.direct-esm-file", + "EVENT.lazy-registry", + "EVENT.symbol-number-channels", + "EVENT.context-removal", + "EVENT.once-throw-consumed", + "EVENT.chain-context-arguments", + "EVENT.once-reentry", + "EVENT.dispatch-snapshot", + "EVENT.off-original-once", + "EVENT.throw-propagation" + ], + "types": [ + { + "compiler": "5.9.3", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "4.3.5", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + } + ], + "preciseTypes": [ + { + "compiler": "5.9.3", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/construction.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + } + ], + "runtime": [ + { + "member": "package/dist/artplayer.js", + "sha256": "5787d082246f7adbc630a0461637d9a597394ba7cd97bcd5bf48924e9699d99f", + "sameAsCore20": true + }, + { + "member": "package/dist/artplayer.mjs", + "sha256": "91f38811f121c244177d81e3c440b4c5f27756145f974a8e5a58e49e793370d9", + "sameAsCore20": true + }, + { + "member": "package/dist/artplayer.legacy.js", + "sha256": "45afe957849bcc2a2b81ed3a7b55f8f16530bf9b6a719c34f67f5befea1bd7ae", + "sameAsCore20": true + } + ], + "browser": [ + { + "variant": "umd", + "stats": { + "startTime": "2026-09-11T09:40:33.426Z", + "duration": 359310.418, + "expected": 1521, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "versions": { + "chromium": "153.0.8010.12", + "firefox": "155.0", + "webkit": "26.6" + }, + "counts": { + "chromium": 507, + "firefox": 507, + "webkit": 507 + }, + "declarationCases": [ + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "webkit", + "status": "passed", + "retry": 0 + } + ], + "cases": [ + { + "file": "auto-playback.spec.js", + "title": "published: resume close and playback rejection preserve the UI contract", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume API retains storage envelope, ID lookup and deletion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume button seeks and plays actual video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: repeated restart leaves one effective click for the current resume target", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: restart below threshold invalidates the old prompt click", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume close and playback rejection preserve the UI contract", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume API retains storage envelope, ID lookup and deletion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume button seeks and plays actual video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: repeated restart leaves one effective click for the current resume target", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart below threshold invalidates the old prompt click", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: source cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: remove cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destroy cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destruction inside seek prevents resume playback continuation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume close and playback rejection preserve the UI contract", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume API retains storage envelope, ID lookup and deletion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume button seeks and plays actual video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: repeated restart leaves one effective click for the current resume target", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: restart below threshold invalidates the old prompt click", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume close and playback rejection preserve the UI contract", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume API retains storage envelope, ID lookup and deletion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume button seeks and plays actual video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: repeated restart leaves one effective click for the current resume target", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart below threshold invalidates the old prompt click", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: source cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: remove cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destroy cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destruction inside seek prevents resume playback continuation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume close and playback rejection preserve the UI contract", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume API retains storage envelope, ID lookup and deletion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume button seeks and plays actual video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: repeated restart leaves one effective click for the current resume target", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: restart below threshold invalidates the old prompt click", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume close and playback rejection preserve the UI contract", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume API retains storage envelope, ID lookup and deletion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume button seeks and plays actual video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: repeated restart leaves one effective click for the current resume target", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart below threshold invalidates the old prompt click", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: source cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: remove cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destroy cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destruction inside seek prevents resume playback continuation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: removed lock icons stop observing the still-usable plugin state API", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: miniature progress follows the control event without adding public state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: removed lock icons stop observing the still-usable plugin state API", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: miniature progress follows the control event without adding public state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: retained builtin setters and events do not mutate a destroyed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: removed lock icons stop observing the still-usable plugin state API", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: miniature progress follows the control event without adding public state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: removed lock icons stop observing the still-usable plugin state API", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: miniature progress follows the control event without adding public state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: retained builtin setters and events do not mutate a destroyed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: removed lock icons stop observing the still-usable plugin state API", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: miniature progress follows the control event without adding public state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: removed lock icons stop observing the still-usable plugin state API", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: miniature progress follows the control event without adding public state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: retained builtin setters and events do not mutate a destroyed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector background clicks and rejection ownership are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: failed mounted reentry preserves its successful replacement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: context menu builtin selection and owned updates preserve state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a prototype-named component keeps the registry prototype intact", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: removed builtin time and volume controls stop owned effects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector items can be reused by an update without changing getter flags", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: async selector results cannot overwrite a newer choice or removed entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: reentrant beforeUnmount removes only once", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: narrow controls stay inside the player without hiding buttons", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: progress markers treat text as data and removed drags cannot seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector background clicks and rejection ownership are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: failed mounted reentry preserves its successful replacement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: context menu builtin selection and owned updates preserve state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a prototype-named component keeps the registry prototype intact", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: removed builtin time and volume controls stop owned effects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector items can be reused by an update without changing getter flags", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: async selector results cannot overwrite a newer choice or removed entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: reentrant beforeUnmount removes only once", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: narrow controls stay inside the player without hiding buttons", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: progress markers treat text as data and removed drags cannot seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector background clicks and rejection ownership are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: failed mounted reentry preserves its successful replacement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: context menu builtin selection and owned updates preserve state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a prototype-named component keeps the registry prototype intact", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: removed builtin time and volume controls stop owned effects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector items can be reused by an update without changing getter flags", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: async selector results cannot overwrite a newer choice or removed entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: reentrant beforeUnmount removes only once", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: narrow controls stay inside the player without hiding buttons", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: progress markers treat text as data and removed drags cannot seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector background clicks and rejection ownership are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: failed mounted reentry preserves its successful replacement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: context menu builtin selection and owned updates preserve state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a prototype-named component keeps the registry prototype intact", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: removed builtin time and volume controls stop owned effects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector items can be reused by an update without changing getter flags", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: async selector results cannot overwrite a newer choice or removed entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: reentrant beforeUnmount removes only once", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: narrow controls stay inside the player without hiding buttons", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: progress markers treat text as data and removed drags cannot seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector background clicks and rejection ownership are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: failed mounted reentry preserves its successful replacement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: context menu builtin selection and owned updates preserve state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a prototype-named component keeps the registry prototype intact", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: removed builtin time and volume controls stop owned effects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector items can be reused by an update without changing getter flags", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: async selector results cannot overwrite a newer choice or removed entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: reentrant beforeUnmount removes only once", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: narrow controls stay inside the player without hiding buttons", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: progress markers treat text as data and removed drags cannot seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector background clicks and rejection ownership are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: failed mounted reentry preserves its successful replacement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: context menu builtin selection and owned updates preserve state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a prototype-named component keeps the registry prototype intact", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: removed builtin time and volume controls stop owned effects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector items can be reused by an update without changing getter flags", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: async selector results cannot overwrite a newer choice or removed entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: reentrant beforeUnmount removes only once", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: narrow controls stay inside the player without hiding buttons", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: progress markers treat text as data and removed drags cannot seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: plugin, toggle, setting and static runtime return contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: native subtitle update events carry cue arrays", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: plugin, toggle, setting and static runtime return contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: native subtitle update events carry cue arrays", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: plugin, toggle, setting and static runtime return contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: native subtitle update events carry cue arrays", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: plugin, toggle, setting and static runtime return contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: native subtitle update events carry cue arrays", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: plugin, toggle, setting and static runtime return contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: native subtitle update events carry cue arrays", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: plugin, toggle, setting and static runtime return contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: native subtitle update events carry cue arrays", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini retains first-entry and reuse DOM order and display", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini restores the original video parent and sibling after repeated entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=false removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=true removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini retains first-entry and reuse DOM order and display", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini restores the original video parent and sibling after repeated entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=false removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=true removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: hiding mini cancels drag and later document events cannot persist a hidden popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini remains in the viewport on small screens", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini drag stores the actual position and playback buttons remain usable", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini exit failure keeps the active video and can restore on retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini reentry during restoration retains the new placement snapshot", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction hide releases incomplete UI and restores the video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction destroy releases incomplete UI and restores the video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction fail releases incomplete UI and restores the video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini preserves a caller-owned popup on destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: reentrant mini creation allocates only one owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini switches to body web fullscreen and restores the original video placement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying a mini drag removes its document subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini retains first-entry and reuse DOM order and display", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini restores the original video parent and sibling after repeated entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=false removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=true removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini retains first-entry and reuse DOM order and display", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini restores the original video parent and sibling after repeated entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=false removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=true removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: hiding mini cancels drag and later document events cannot persist a hidden popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini remains in the viewport on small screens", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini drag stores the actual position and playback buttons remain usable", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini exit failure keeps the active video and can restore on retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini reentry during restoration retains the new placement snapshot", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction hide releases incomplete UI and restores the video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction destroy releases incomplete UI and restores the video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction fail releases incomplete UI and restores the video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini preserves a caller-owned popup on destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: reentrant mini creation allocates only one owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini switches to body web fullscreen and restores the original video placement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying a mini drag removes its document subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini retains first-entry and reuse DOM order and display", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini restores the original video parent and sibling after repeated entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=false removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=true removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini retains first-entry and reuse DOM order and display", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini restores the original video parent and sibling after repeated entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=false removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=true removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: hiding mini cancels drag and later document events cannot persist a hidden popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini remains in the viewport on small screens", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini drag stores the actual position and playback buttons remain usable", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini exit failure keeps the active video and can restore on retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini reentry during restoration retains the new placement snapshot", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction hide releases incomplete UI and restores the video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction destroy releases incomplete UI and restores the video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction fail releases incomplete UI and restores the video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini preserves a caller-owned popup on destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: reentrant mini creation allocates only one owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini switches to body web fullscreen and restores the original video placement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying a mini drag removes its document subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: void exit waits for the owned video to leave and accepts another owner as completion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: native fullscreen belongs to its player and other players cannot exit it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: destroyed players stop receiving later native fullscreen events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: rejected native fullscreen request removes its temporary change listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: native fullscreen belongs to its player and other players cannot exit it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: destroyed players stop receiving later native fullscreen events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected native fullscreen request removes its temporary change listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: fullscreen assignment rejection shows notice without an unhandled rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: reentrant entry preserves real fullscreen UI and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-exit releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-destroy releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-exit releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-destroy releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: cancelling an actual native request in the initiating click releases fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected exit retains actual fullscreen state and can be retried", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: void exit waits for the owned video to leave and accepts another owner as completion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: native fullscreen belongs to its player and other players cannot exit it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: destroyed players stop receiving later native fullscreen events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: rejected native fullscreen request removes its temporary change listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: native fullscreen belongs to its player and other players cannot exit it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: destroyed players stop receiving later native fullscreen events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected native fullscreen request removes its temporary change listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: fullscreen assignment rejection shows notice without an unhandled rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: reentrant entry preserves real fullscreen UI and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-exit releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-destroy releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-exit releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-destroy releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: cancelling an actual native request in the initiating click releases fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected exit retains actual fullscreen state and can be retried", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: void exit waits for the owned video to leave and accepts another owner as completion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: native fullscreen belongs to its player and other players cannot exit it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: destroyed players stop receiving later native fullscreen events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: rejected native fullscreen request removes its temporary change listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: native fullscreen belongs to its player and other players cannot exit it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: destroyed players stop receiving later native fullscreen events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected native fullscreen request removes its temporary change listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: fullscreen assignment rejection shows notice without an unhandled rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: reentrant entry preserves real fullscreen UI and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-exit releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-destroy releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-exit releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-destroy releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: cancelling an actual native request in the initiating click releases fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected exit retains actual fullscreen state and can be retried", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: a cancelled rotation timer cannot rotate a later fullscreen session early", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: destroying a pending rotation removes its timer and produces no late resize", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated playback supports ratio and flip changes before restoring normal layout", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: repeated web fullscreen retains rotated dimensions and final styles", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: rotated web fullscreen restores original inline geometry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated web fullscreen restores original inline geometry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: a cancelled rotation timer cannot rotate a later fullscreen session early", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: destroying a pending rotation removes its timer and produces no late resize", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated playback supports ratio and flip changes before restoring normal layout", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: repeated web fullscreen retains rotated dimensions and final styles", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: rotated web fullscreen restores original inline geometry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated web fullscreen restores original inline geometry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: a cancelled rotation timer cannot rotate a later fullscreen session early", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: destroying a pending rotation removes its timer and produces no late resize", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated playback supports ratio and flip changes before restoring normal layout", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: repeated web fullscreen retains rotated dimensions and final styles", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: rotated web fullscreen restores original inline geometry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated web fullscreen restores original inline geometry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP follows native UI transitions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: destroying WebKit PiP returns presentation to inline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP follows native UI transitions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: destroying WebKit PiP returns presentation to inline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP pending entry is cleaned up after destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP follows native UI transitions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: destroying WebKit PiP returns presentation to inline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP follows native UI transitions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: destroying WebKit PiP returns presentation to inline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP pending entry is cleaned up after destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP follows native UI transitions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: destroying WebKit PiP returns presentation to inline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP follows native UI transitions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: destroying WebKit PiP returns presentation to inline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP pending entry is cleaned up after destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: native PiP preserves element/null getter, void setter and boolean events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: a player cannot report or exit another video's PiP", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: destroy releases active PiP without a late player event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: native PiP preserves element/null getter, void setter and boolean events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: a player cannot report or exit another video's PiP", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: destroy releases active PiP without a late player event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP cancel releases late native entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP destroy releases late native entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: rejected PiP assignment shows notice without an unhandled rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: actual native PiP gesture and playback or explicit unsupported capability", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: native PiP preserves element/null getter, void setter and boolean events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: a player cannot report or exit another video's PiP", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: destroy releases active PiP without a late player event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: native PiP preserves element/null getter, void setter and boolean events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: a player cannot report or exit another video's PiP", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: destroy releases active PiP without a late player event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP cancel releases late native entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP destroy releases late native entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: rejected PiP assignment shows notice without an unhandled rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: actual native PiP gesture and playback or explicit unsupported capability", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: native PiP preserves element/null getter, void setter and boolean events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: a player cannot report or exit another video's PiP", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: destroy releases active PiP without a late player event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: native PiP preserves element/null getter, void setter and boolean events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: a player cannot report or exit another video's PiP", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: destroy releases active PiP without a late player event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP cancel releases late native entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP destroy releases late native entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: rejected PiP assignment shows notice without an unhandled rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: actual native PiP gesture and playback or explicit unsupported capability", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: hidden containers defer sizing and recover after becoming visible", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: malformed ratios preserve layout while retaining notices, datasets and events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: retained display setters and sizing methods do not write or emit after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing preserves valid geometry, return values and emitted measurements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: aspect ratio and flip preserve dataset, notices and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing preserves valid geometry, return values and emitted measurements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: aspect ratio and flip preserve dataset, notices and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: hidden containers defer sizing and recover after becoming visible", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: malformed ratios preserve layout while retaining notices, datasets and events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: retained display setters and sizing methods do not write or emit after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing preserves valid geometry, return values and emitted measurements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: aspect ratio and flip preserve dataset, notices and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing preserves valid geometry, return values and emitted measurements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: aspect ratio and flip preserve dataset, notices and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: hidden containers defer sizing and recover after becoming visible", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: malformed ratios preserve layout while retaining notices, datasets and events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: retained display setters and sizing methods do not write or emit after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing preserves valid geometry, return values and emitted measurements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: aspect ratio and flip preserve dataset, notices and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing preserves valid geometry, return values and emitted measurements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: aspect ratio and flip preserve dataset, notices and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: destroying video-only fullscreen releases native presentation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: destroying video-only fullscreen releases native presentation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: cancelled video-only entry after destroy is released without late player events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen preserves synchronous errors and supports exit retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: destroying video-only fullscreen releases native presentation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: destroying video-only fullscreen releases native presentation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: cancelled video-only entry after destroy is released without late player events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen preserves synchronous errors and supports exit retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: destroying video-only fullscreen releases native presentation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: destroying video-only fullscreen releases native presentation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: cancelled video-only entry after destroy is released without late player events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen preserves synchronous errors and supports exit retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener can exit without stale resize or overwritten restoration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener destroy restores ownership without post-destroy resize", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed body move restores style and keeps its original error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed web fullscreen exit can retry restoring the original placement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: reentry during web fullscreen restoration preserves the newer active mode", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (empty)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (empty)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener can exit without stale resize or overwritten restoration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener destroy restores ownership without post-destroy resize", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed body move restores style and keeps its original error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed web fullscreen exit can retry restoring the original placement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: reentry during web fullscreen restoration preserves the newer active mode", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (empty)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (empty)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener can exit without stale resize or overwritten restoration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener destroy restores ownership without post-destroy resize", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed body move restores style and keeps its original error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed web fullscreen exit can retry restoring the original placement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: reentry during web fullscreen restoration preserves the newer active mode", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (empty)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (empty)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "published: DOM utilities preserve native tree, style and event-path behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: DOM utilities preserve native tree, style and event-path behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: safe-area measurement releases the native probe after failure unlike the previous workspace implementation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "published: DOM utilities preserve native tree, style and event-path behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: DOM utilities preserve native tree, style and event-path behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: safe-area measurement releases the native probe after failure unlike the previous workspace implementation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "published: DOM utilities preserve native tree, style and event-path behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: DOM utilities preserve native tree, style and event-path behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: safe-area measurement releases the native probe after failure unlike the previous workspace implementation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "published: emitter event names and once across nested dispatch", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "candidate: emitter event names and once across nested dispatch", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "published: emitter event names and once across nested dispatch", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "candidate: emitter event names and once across nested dispatch", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "published: emitter event names and once across nested dispatch", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "candidate: emitter event names and once across nested dispatch", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: actual animation frames follow playback and stop after destruction inside raf", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: Events keeps its public fields, prototype and detached native methods", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: screen orientation dispatch works when onchange has no assigned handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: destruction releases the scroll throttle reset timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: view visibility uses the container's current iframe viewport", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: actual animation frames follow playback and stop after destruction inside raf", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: Events keeps its public fields, prototype and detached native methods", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: screen orientation dispatch works when onchange has no assigned handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: destruction releases the scroll throttle reset timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: view visibility uses the container's current iframe viewport", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: actual animation frames follow playback and stop after destruction inside raf", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: Events keeps its public fields, prototype and detached native methods", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: screen orientation dispatch works when onchange has no assigned handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: destruction releases the scroll throttle reset timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: view visibility uses the container's current iframe viewport", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: actual animation frames follow playback and stop after destruction inside raf", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: Events keeps its public fields, prototype and detached native methods", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: screen orientation dispatch works when onchange has no assigned handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: destruction releases the scroll throttle reset timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: view visibility uses the container's current iframe viewport", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: actual animation frames follow playback and stop after destruction inside raf", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: Events keeps its public fields, prototype and detached native methods", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: screen orientation dispatch works when onchange has no assigned handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: destruction releases the scroll throttle reset timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: view visibility uses the container's current iframe viewport", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: actual animation frames follow playback and stop after destruction inside raf", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: Events keeps its public fields, prototype and detached native methods", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: screen orientation dispatch works when onchange has no assigned handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: destruction releases the scroll throttle reset timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: view visibility uses the container's current iframe viewport", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: native source reset retains its default playback rate behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: long press accelerates real playback and restores its prior rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: touchcancel releases an active long press", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: native source reset retains its default playback rate behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: long press accelerates real playback and restores its prior rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: touchcancel releases an active long press", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: lock restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: pause restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: source restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: destroy restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: repeated pending touches own a single timer which destruction cancels", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: native source reset retains its default playback rate behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: long press accelerates real playback and restores its prior rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: touchcancel releases an active long press", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: native source reset retains its default playback rate behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: long press accelerates real playback and restores its prior rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: touchcancel releases an active long press", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: lock restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: pause restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: source restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: destroy restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: repeated pending touches own a single timer which destruction cancels", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: native source reset retains its default playback rate behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: long press accelerates real playback and restores its prior rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: touchcancel releases an active long press", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: native source reset retains its default playback rate behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: long press accelerates real playback and restores its prior rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: touchcancel releases an active long press", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: lock restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: pause restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: source restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: destroy restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: repeated pending touches own a single timer which destruction cancels", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: a gesture before first play still issues the requested seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy during absolute progress touch stops the following seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: cancel invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: lock invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: multitouch invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: identifier invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy from a touch seek callback prevents the later progress notification", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: a gesture before first play still issues the requested seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy during absolute progress touch stops the following seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: cancel invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: lock invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: multitouch invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: identifier invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy from a touch seek callback prevents the later progress notification", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: a gesture before first play still issues the requested seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy during absolute progress touch stops the following seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: cancel invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: lock invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: multitouch invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: identifier invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy from a touch seek callback prevents the later progress notification", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: a gesture before first play still issues the requested seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy during absolute progress touch stops the following seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: cancel invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: lock invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: multitouch invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: identifier invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy from a touch seek callback prevents the later progress notification", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: a gesture before first play still issues the requested seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy during absolute progress touch stops the following seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: cancel invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: lock invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: multitouch invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: identifier invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy from a touch seek callback prevents the later progress notification", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: a gesture before first play still issues the requested seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy during absolute progress touch stops the following seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: cancel invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: lock invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: multitouch invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: identifier invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy from a touch seek callback prevents the later progress notification", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: rebind during native global registration cancels the interrupted binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: destroy during native global registration cancels the interrupted binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: global rebinding forwards original events once and releases the previous document", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: global rebinding forwards original events once and releases the previous document", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: rebind during native global registration cancels the interrupted binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: destroy during native global registration cancels the interrupted binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: global rebinding forwards original events once and releases the previous document", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: global rebinding forwards original events once and releases the previous document", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: rebind during native global registration cancels the interrupted binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: destroy during native global registration cancels the interrupted binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: global rebinding forwards original events once and releases the previous document", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: global rebinding forwards original events once and releases the previous document", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: native keyboard play/pause, seek, volume and web-fullscreen Escape retain their behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: inherited editing and IME composition do not activate player shortcuts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: plaintext editing and IME composition do not activate player shortcuts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: select editing and IME composition do not activate player shortcuts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: destroying during a key callback stops remaining keys and notifications", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: hotkey registration retains chain, array identity, receiver and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: rebound document input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: shadow-root input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: repeated hotkey init does not multiply the keyboard subscription", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: hotkey registration retains chain, array identity, receiver and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: rebound document input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: shadow-root input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: repeated hotkey init does not multiply the keyboard subscription", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: native keyboard play/pause, seek, volume and web-fullscreen Escape retain their behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: inherited editing and IME composition do not activate player shortcuts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: plaintext editing and IME composition do not activate player shortcuts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: select editing and IME composition do not activate player shortcuts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: destroying during a key callback stops remaining keys and notifications", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: hotkey registration retains chain, array identity, receiver and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: rebound document input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: shadow-root input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: repeated hotkey init does not multiply the keyboard subscription", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: hotkey registration retains chain, array identity, receiver and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: rebound document input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: shadow-root input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: repeated hotkey init does not multiply the keyboard subscription", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: native keyboard play/pause, seek, volume and web-fullscreen Escape retain their behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: inherited editing and IME composition do not activate player shortcuts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: plaintext editing and IME composition do not activate player shortcuts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: select editing and IME composition do not activate player shortcuts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: destroying during a key callback stops remaining keys and notifications", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: hotkey registration retains chain, array identity, receiver and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: rebound document input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: shadow-root input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: repeated hotkey init does not multiply the keyboard subscription", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: hotkey registration retains chain, array identity, receiver and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: rebound document input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: shadow-root input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: repeated hotkey init does not multiply the keyboard subscription", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: player descriptor order and constructor/static surfaces match the published core", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy listener can mount a replacement without the old constructor overwriting it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: teardown during capability detection stops remaining player installers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: destroy during initial native volume assignment stops later construction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: teardown during capability detection stops remaining player installers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: destroy during initial native volume assignment stops later construction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: player descriptor order and constructor/static surfaces match the published core", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy listener can mount a replacement without the old constructor overwriting it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: teardown during capability detection stops remaining player installers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: destroy during initial native volume assignment stops later construction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: teardown during capability detection stops remaining player installers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: destroy during initial native volume assignment stops later construction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: player descriptor order and constructor/static surfaces match the published core", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy listener can mount a replacement without the old constructor overwriting it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: teardown during capability detection stops remaining player installers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: destroy during initial native volume assignment stops later construction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: teardown during capability detection stops remaining player installers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: destroy during initial native volume assignment stops later construction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: restoring a removed default hotkey keeps identity and real playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: a failed native removal remains retryable and releases its record", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: destruction before native add returns cannot leave a late listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: window registration failure restores the previous global binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: source changes cancel the old gesture in the installed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: rotation changes cancel the old gesture in the installed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: geometry changes cancel the old gesture in the installed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: adopted viewport retains exact gap boundaries", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: restoring a removed default hotkey keeps identity and real playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: a failed native removal remains retryable and releases its record", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: destruction before native add returns cannot leave a late listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: window registration failure restores the previous global binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: source changes cancel the old gesture in the installed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: rotation changes cancel the old gesture in the installed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: geometry changes cancel the old gesture in the installed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: adopted viewport retains exact gap boundaries", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: restoring a removed default hotkey keeps identity and real playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: a failed native removal remains retryable and releases its record", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: destruction before native add returns cannot leave a late listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: window registration failure restores the previous global binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: source changes cancel the old gesture in the installed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: rotation changes cancel the old gesture in the installed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: geometry changes cancel the old gesture in the installed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: adopted viewport retains exact gap boundaries", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "published: repeated destroy preserves other live instances", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: repeated destroy preserves other live instances", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor plugin failure restores original DOM and clears resources", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: early proxy failure restores SSR nodes, attributes and text", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: reentrant destroy keeps sequence and does not repeat callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: destroying cancels queued resize, notice, RAF, reconnect and mounted work", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor can synchronously destroy without entering the registry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: partial Events initialization releases listeners before its property is assigned", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: live resize still coalesces and destroy cancels the next burst", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: a container is reserved during reentrant initialization", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "published: repeated destroy preserves other live instances", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: repeated destroy preserves other live instances", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor plugin failure restores original DOM and clears resources", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: early proxy failure restores SSR nodes, attributes and text", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: reentrant destroy keeps sequence and does not repeat callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: destroying cancels queued resize, notice, RAF, reconnect and mounted work", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor can synchronously destroy without entering the registry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: partial Events initialization releases listeners before its property is assigned", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: live resize still coalesces and destroy cancels the next burst", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: a container is reserved during reentrant initialization", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "published: repeated destroy preserves other live instances", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: repeated destroy preserves other live instances", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor plugin failure restores original DOM and clears resources", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: early proxy failure restores SSR nodes, attributes and text", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: reentrant destroy keeps sequence and does not repeat callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: destroying cancels queued resize, notice, RAF, reconnect and mounted work", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor can synchronously destroy without entering the registry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: partial Events initialization releases listeners before its property is assigned", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: live resize still coalesces and destroy cancels the next burst", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: a container is reserved during reentrant initialization", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: null options preserve the native default and callbacks can be removed directly", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: once and abort use native event identity and permit subsequent registration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: changing capture options after registration cannot prevent cleanup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: partially failing array registration rolls back the listeners it created", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: registration throwing after native add does not leave an untracked listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: null options preserve the native default and callbacks can be removed directly", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: once and abort use native event identity and permit subsequent registration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: changing capture options after registration cannot prevent cleanup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: partially failing array registration rolls back the listeners it created", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: registration throwing after native add does not leave an untracked listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: null options preserve the native default and callbacks can be removed directly", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: once and abort use native event identity and permit subsequent registration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: changing capture options after registration cannot prevent cleanup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: partially failing array registration rolls back the listeners it created", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: registration throwing after native add does not leave an untracked listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: null options preserve the native default and callbacks can be removed directly", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: once and abort use native event identity and permit subsequent registration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: changing capture options after registration cannot prevent cleanup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: partially failing array registration rolls back the listeners it created", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: registration throwing after native add does not leave an untracked listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: null options preserve the native default and callbacks can be removed directly", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: once and abort use native event identity and permit subsequent registration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: changing capture options after registration cannot prevent cleanup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: partially failing array registration rolls back the listeners it created", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: registration throwing after native add does not leave an untracked listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: null options preserve the native default and callbacks can be removed directly", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: once and abort use native event identity and permit subsequent registration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: changing capture options after registration cannot prevent cleanup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: partially failing array registration rolls back the listeners it created", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: registration throwing after native add does not leave an untracked listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: replacing a failed source cancels candidate retries", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: replacing a failed source cancels candidate retries", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: rejected real-media switch still allows current-source reconnect", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: replacing a failed source cancels candidate retries", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: replacing a failed source cancels candidate retries", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: rejected real-media switch still allows current-source reconnect", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: replacing a failed source cancels candidate retries", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: replacing a failed source cancels candidate retries", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: rejected real-media switch still allows current-source reconnect", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: metadata emits resize before mobile visibility changes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: metadata emits resize before mobile visibility changes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: metadata emits resize before mobile visibility changes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: metadata emits resize before mobile visibility changes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: metadata emits resize before mobile visibility changes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: metadata emits resize before mobile visibility changes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "published: existing canvas proxy keeps media identity, playback and layout", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "candidate: existing canvas proxy keeps media identity, playback and layout", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "published: existing canvas proxy keeps media identity, playback and layout", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "candidate: existing canvas proxy keeps media identity, playback and layout", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "published: existing canvas proxy keeps media identity, playback and layout", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "candidate: existing canvas proxy keeps media identity, playback and layout", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice updates do not call a consumer override of destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice preserves public shape, Error text and false hide semantics", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice expires naturally during real playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: manual notice destroy permits reuse and does not hide its DOM", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: destruction during notice text assignment cannot schedule a late timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: expiry does not hide a notice installed during the clearing write", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice updates do not call a consumer override of destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice preserves public shape, Error text and false hide semantics", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice expires naturally during real playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: manual notice destroy permits reuse and does not hide its DOM", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: destruction during notice text assignment cannot schedule a late timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: expiry does not hide a notice installed during the clearing write", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: retained callbacks and assignments cannot revive destroyed notice resources", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice updates do not call a consumer override of destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice preserves public shape, Error text and false hide semantics", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice expires naturally during real playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: manual notice destroy permits reuse and does not hide its DOM", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: destruction during notice text assignment cannot schedule a late timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: expiry does not hide a notice installed during the clearing write", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice updates do not call a consumer override of destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice preserves public shape, Error text and false hide semantics", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice expires naturally during real playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: manual notice destroy permits reuse and does not hide its DOM", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: destruction during notice text assignment cannot schedule a late timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: expiry does not hide a notice installed during the clearing write", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: retained callbacks and assignments cannot revive destroyed notice resources", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice updates do not call a consumer override of destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice preserves public shape, Error text and false hide semantics", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice expires naturally during real playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: manual notice destroy permits reuse and does not hide its DOM", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: destruction during notice text assignment cannot schedule a late timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: expiry does not hide a notice installed during the clearing write", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice updates do not call a consumer override of destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice preserves public shape, Error text and false hide semantics", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice expires naturally during real playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: manual notice destroy permits reuse and does not hide its DOM", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: destruction during notice text assignment cannot schedule a late timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: expiry does not hide a notice installed during the clearing write", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: retained callbacks and assignments cannot revive destroyed notice resources", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: expanded option input preserves historical JS forms", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: configuration errors occur before mounting and preserve allocation timing", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: container identity, partial defaults, custom fields and normal callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: expanded option input preserves historical JS forms", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: configuration errors occur before mounting and preserve allocation timing", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: container identity, partial defaults, custom fields and normal callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: expanded option input preserves historical JS forms", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: configuration errors occur before mounting and preserve allocation timing", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: container identity, partial defaults, custom fields and normal callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: expanded option input preserves historical JS forms", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: configuration errors occur before mounting and preserve allocation timing", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: container identity, partial defaults, custom fields and normal callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: expanded option input preserves historical JS forms", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: configuration errors occur before mounting and preserve allocation timing", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: container identity, partial defaults, custom fields and normal callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: expanded option input preserves historical JS forms", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: configuration errors occur before mounting and preserve allocation timing", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: container identity, partial defaults, custom fields and normal callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: real media preserves timeline, volume, rate and property descriptors", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: invalid time inputs and rate no-op retain native behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: real media preserves timeline, volume, rate and property descriptors", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: invalid time inputs and rate no-op retain native behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: real media preserves timeline, volume, rate and property descriptors", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: invalid time inputs and rate no-op retain native behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: real media preserves timeline, volume, rate and property descriptors", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: invalid time inputs and rate no-op retain native behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: real media preserves timeline, volume, rate and property descriptors", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: invalid time inputs and rate no-op retain native behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: real media preserves timeline, volume, rate and property descriptors", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: invalid time inputs and rate no-op retain native behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "published: real playback, pause, seek, switch and destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "candidate: real playback, pause, seek, switch and destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "controlled HTTP media failure emits a real video error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "Range, media identity and docs candidate routes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "published: real playback, pause, seek, switch and destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "candidate: real playback, pause, seek, switch and destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "controlled HTTP media failure emits a real video error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "Range, media identity and docs candidate routes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "published: real playback, pause, seek, switch and destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "candidate: real playback, pause, seek, switch and destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "controlled HTTP media failure emits a real video error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "Range, media identity and docs candidate routes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: a plugin that closes construction prevents subsequent factories", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: constructor-owned rejection is reported once without an unhandled rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: a plugin that closes construction prevents subsequent factories", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: constructor-owned rejection is reported once without an unhandled rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: a plugin that closes construction prevents subsequent factories", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: constructor-owned rejection is reported once without an unhandled rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: builtin order and live exclusions precede user plugins", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: builtin order and live exclusions precede user plugins", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: builtin order and live exclusions precede user plugins", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: builtin order and live exclusions precede user plugins", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: builtin order and live exclusions precede user plugins", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: builtin order and live exclusions precede user plugins", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: click pairs preserve callback identity and playback ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in click stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in dblclick stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: focus, hover and move preserve flags, classes and original events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: click pairs preserve callback identity and playback ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in click stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in dblclick stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: focus, hover and move preserve flags, classes and original events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: click pairs preserve callback identity and playback ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in click stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in dblclick stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: focus, hover and move preserve flags, classes and original events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: click pairs preserve callback identity and playback ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in click stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in dblclick stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: focus, hover and move preserve flags, classes and original events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: click pairs preserve callback identity and playback ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in click stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in dblclick stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: focus, hover and move preserve flags, classes and original events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: click pairs preserve callback identity and playback ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in click stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in dblclick stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: focus, hover and move preserve flags, classes and original events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through remove cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through source cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: real progress click keeps setBar before seek and clamps the edges", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: quality selectors retain default labels, source position and empty-array behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through remove cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through source cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: real progress click keeps setBar before seek and clamps the edges", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: quality selectors retain default labels, source position and empty-array behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through remove cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through source cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: real progress click keeps setBar before seek and clamps the edges", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: quality selectors retain default labels, source position and empty-array behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through remove cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through source cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: real progress click keeps setBar before seek and clamps the edges", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: quality selectors retain default labels, source position and empty-array behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through remove cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through source cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: real progress click keeps setBar before seek and clamps the edges", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: quality selectors retain default labels, source position and empty-array behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through remove cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through source cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: real progress click keeps setBar before seek and clamps the edges", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: quality selectors retain default labels, source position and empty-array behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask preserves observations before and after its destroy handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info preserves fields, native media text and close visibility", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info retains native nullable string conversion for custom media fields", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: repeated info init owns only one new timer and close handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info mobile construction waits for an explicit init", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask click plays native video and destruction displays the terminal icon", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask preserves observations before and after its destroy handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info preserves fields, native media text and close visibility", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info retains native nullable string conversion for custom media fields", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: repeated info init owns only one new timer and close handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info mobile construction waits for an explicit init", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask click plays native video and destruction displays the terminal icon", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info destruction during a media getter prevents text writes and late init", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: reentrant info text conversion cannot write after player destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask finalization follows an earlier throwing observer without replacing its error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask preserves observations before and after its destroy handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info preserves fields, native media text and close visibility", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info retains native nullable string conversion for custom media fields", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: repeated info init owns only one new timer and close handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info mobile construction waits for an explicit init", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask click plays native video and destruction displays the terminal icon", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask preserves observations before and after its destroy handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info preserves fields, native media text and close visibility", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info retains native nullable string conversion for custom media fields", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: repeated info init owns only one new timer and close handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info mobile construction waits for an explicit init", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask click plays native video and destruction displays the terminal icon", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info destruction during a media getter prevents text writes and late init", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: reentrant info text conversion cannot write after player destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask finalization follows an earlier throwing observer without replacing its error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask preserves observations before and after its destroy handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info preserves fields, native media text and close visibility", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info retains native nullable string conversion for custom media fields", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: repeated info init owns only one new timer and close handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info mobile construction waits for an explicit init", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask click plays native video and destruction displays the terminal icon", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask preserves observations before and after its destroy handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info preserves fields, native media text and close visibility", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info retains native nullable string conversion for custom media fields", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: repeated info init owns only one new timer and close handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info mobile construction waits for an explicit init", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask click plays native video and destruction displays the terminal icon", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info destruction during a media getter prevents text writes and late init", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: reentrant info text conversion cannot write after player destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask finalization follows an earlier throwing observer without replacing its error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "resource-scope.spec.js", + "title": "internal resource scope: native DOM, RAF, timer, fetch abort and URL release", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "resource-scope.spec.js", + "title": "internal resource scope: native DOM, RAF, timer, fetch abort and URL release", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "resource-scope.spec.js", + "title": "internal resource scope: native DOM, RAF, timer, fetch abort and URL release", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot preserves download filename, event data and Promise result", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: source replacement does not download a stale captured frame", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot toolbar rejection has exact historical error accounting", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot preserves download filename, event data and Promise result", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: source replacement does not download a stale captured frame", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot toolbar rejection has exact historical error accounting", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: null toBlob callback rejects and reports without a page error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: destroy during screenshot await suppresses the queued download and event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: cross-origin screenshot toolbar handles its internal rejected Promise", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot preserves download filename, event data and Promise result", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: source replacement does not download a stale captured frame", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot toolbar rejection has exact historical error accounting", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot preserves download filename, event data and Promise result", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: source replacement does not download a stale captured frame", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot toolbar rejection has exact historical error accounting", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: null toBlob callback rejects and reports without a page error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: destroy during screenshot await suppresses the queued download and event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: cross-origin screenshot toolbar handles its internal rejected Promise", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot preserves download filename, event data and Promise result", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: source replacement does not download a stale captured frame", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot toolbar rejection has exact historical error accounting", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot preserves download filename, event data and Promise result", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: source replacement does not download a stale captured frame", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot toolbar rejection has exact historical error accounting", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: null toBlob callback rejects and reports without a page error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: destroy during screenshot await suppresses the queued download and event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: cross-origin screenshot toolbar handles its internal rejected Promise", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: long setting labels leave native controls inside the row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: long setting labels leave native controls inside the row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: long setting labels leave native controls inside the row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: long setting labels leave native controls inside the row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: long setting labels leave native controls inside the row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: long setting labels leave native controls inside the row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after navigate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after remove", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "published: sharing an active setting has an explicit ownership baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: sharing an active setting has an explicit ownership baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after remove", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after navigate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after remove", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "published: sharing an active setting has an explicit ownership baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: sharing an active setting has an explicit ownership baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after remove", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after navigate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after remove", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "published: sharing an active setting has an explicit ownership baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: sharing an active setting has an explicit ownership baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after remove", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after assign failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after format failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after item failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after render failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: failed switch updates restore the original closure and displayed icon", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant update supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant remove supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant destroy supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant child-update supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: removing an ancestor cancels its pending descendant update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant switch getter cannot replace the winning control handles", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant range getter cannot replace the winning control handles", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant add of the same object", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant update of the same object", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after assign failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after format failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after item failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after render failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: failed switch updates restore the original closure and displayed icon", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant update supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant remove supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant destroy supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant child-update supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: removing an ancestor cancels its pending descendant update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant switch getter cannot replace the winning control handles", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant range getter cannot replace the winning control handles", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant add of the same object", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant update of the same object", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after assign failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after format failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after item failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after render failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: failed switch updates restore the original closure and displayed icon", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant update supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant remove supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant destroy supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant child-update supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: removing an ancestor cancels its pending descendant update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant switch getter cannot replace the winning control handles", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant range getter cannot replace the winning control handles", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant add of the same object", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant update of the same object", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: builtin setting subscriptions are replaced and removed with their row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: deferred setting mounts belong to the rendered item generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: removed setting subtrees release child listeners and cached panels", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting button results cannot overwrite an updated or newer item", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: sibling setting selections share the parent result generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting callback rejection retains its original failure identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting registry retains item returns and hidden tree bindings", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: moved setting items bind to their current parent and panel", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: automatic setting names and explicit nested names have an explicit baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: builtin setting subscriptions are replaced and removed with their row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: deferred setting mounts belong to the rendered item generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: removed setting subtrees release child listeners and cached panels", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting button results cannot overwrite an updated or newer item", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: sibling setting selections share the parent result generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting callback rejection retains its original failure identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting registry retains item returns and hidden tree bindings", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: moved setting items bind to their current parent and panel", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: automatic setting names and explicit nested names have an explicit baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed setting additions leave existing rows usable and allow retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting removal finishes DOM cleanup when the event-removal hook throws", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed header rendering releases its panel and restores reusable inputs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed item rendering releases its panel and restores reusable inputs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed layout rendering releases its panel and restores reusable inputs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant remove", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: builtin setting subscriptions are replaced and removed with their row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: deferred setting mounts belong to the rendered item generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: removed setting subtrees release child listeners and cached panels", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting button results cannot overwrite an updated or newer item", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: sibling setting selections share the parent result generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting callback rejection retains its original failure identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting registry retains item returns and hidden tree bindings", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: moved setting items bind to their current parent and panel", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: automatic setting names and explicit nested names have an explicit baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: builtin setting subscriptions are replaced and removed with their row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: deferred setting mounts belong to the rendered item generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: removed setting subtrees release child listeners and cached panels", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting button results cannot overwrite an updated or newer item", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: sibling setting selections share the parent result generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting callback rejection retains its original failure identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting registry retains item returns and hidden tree bindings", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: moved setting items bind to their current parent and panel", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: automatic setting names and explicit nested names have an explicit baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed setting additions leave existing rows usable and allow retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting removal finishes DOM cleanup when the event-removal hook throws", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed header rendering releases its panel and restores reusable inputs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed item rendering releases its panel and restores reusable inputs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed layout rendering releases its panel and restores reusable inputs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant remove", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: builtin setting subscriptions are replaced and removed with their row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: deferred setting mounts belong to the rendered item generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: removed setting subtrees release child listeners and cached panels", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting button results cannot overwrite an updated or newer item", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: sibling setting selections share the parent result generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting callback rejection retains its original failure identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting registry retains item returns and hidden tree bindings", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: moved setting items bind to their current parent and panel", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: automatic setting names and explicit nested names have an explicit baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: builtin setting subscriptions are replaced and removed with their row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: deferred setting mounts belong to the rendered item generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: removed setting subtrees release child listeners and cached panels", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting button results cannot overwrite an updated or newer item", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: sibling setting selections share the parent result generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting callback rejection retains its original failure identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting registry retains item returns and hidden tree bindings", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: moved setting items bind to their current parent and panel", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: automatic setting names and explicit nested names have an explicit baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed setting additions leave existing rows usable and allow retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting removal finishes DOM cleanup when the event-removal hook throws", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed header rendering releases its panel and restores reusable inputs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed item rendering releases its panel and restores reusable inputs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed layout rendering releases its panel and restores reusable inputs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant remove", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: rapid real-media switches identify the last restart and settle superseded work", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: destroy settles the candidate switch without waiting for detached media", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: rapid real-media switches identify the last restart and settle superseded work", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: destroy settles the candidate switch without waiting for detached media", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: quality switch restores position/rate and preserves real customType identities", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: direct currentTime during a native quality seek is not overwritten by automatic restoration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: real switch settles when the controlled native resume rejects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: late native play completion cannot publish stale player effects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: rapid real-media switches identify the last restart and settle superseded work", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: destroy settles the candidate switch without waiting for detached media", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: rapid real-media switches identify the last restart and settle superseded work", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: destroy settles the candidate switch without waiting for detached media", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: quality switch restores position/rate and preserves real customType identities", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: direct currentTime during a native quality seek is not overwritten by automatic restoration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: real switch settles when the controlled native resume rejects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: late native play completion cannot publish stale player effects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: rapid real-media switches identify the last restart and settle superseded work", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: destroy settles the candidate switch without waiting for detached media", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: rapid real-media switches identify the last restart and settle superseded work", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: destroy settles the candidate switch without waiting for detached media", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: quality switch restores position/rate and preserves real customType identities", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: direct currentTime during a native quality seek is not overwritten by automatic restoration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: real switch settles when the controlled native resume rejects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: late native play completion cannot publish stale player effects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: srt conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: ass conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle remains visible through real native fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: native subtitle cues, offset, styles and show contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle latest request wins and cancelled calls settle", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle pending completion cannot replace track after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: srt conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: ass conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle remains visible through real native fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle cues, offset, styles and show contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle latest request wins and cancelled calls settle", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle pending completion cannot replace track after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle cancellation settles before an ignored request or body finishes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle conversion reentry preserves the newer operation and notice", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: active subtitle errors reject, preserve track and allow a later retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle HTTP failures do not become usable tracks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: disabled native tracks expose empty cue arrays without throwing", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle track failure is reported and obsolete callbacks are removed", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: constructor and URL setter failures notify without unhandled promises", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: failed track insertion restores the old live track and releases the attempted URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: cleanup failure after track commit does not revoke the committed URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: srt conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: ass conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle remains visible through real native fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: native subtitle cues, offset, styles and show contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle latest request wins and cancelled calls settle", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle pending completion cannot replace track after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: srt conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: ass conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle remains visible through real native fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle cues, offset, styles and show contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle latest request wins and cancelled calls settle", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle pending completion cannot replace track after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle cancellation settles before an ignored request or body finishes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle conversion reentry preserves the newer operation and notice", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: active subtitle errors reject, preserve track and allow a later retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle HTTP failures do not become usable tracks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: disabled native tracks expose empty cue arrays without throwing", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle track failure is reported and obsolete callbacks are removed", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: constructor and URL setter failures notify without unhandled promises", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: failed track insertion restores the old live track and releases the attempted URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: cleanup failure after track commit does not revoke the committed URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: srt conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: ass conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle remains visible through real native fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: native subtitle cues, offset, styles and show contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle latest request wins and cancelled calls settle", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle pending completion cannot replace track after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: srt conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: ass conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle remains visible through real native fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle cues, offset, styles and show contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle latest request wins and cancelled calls settle", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle pending completion cannot replace track after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle cancellation settles before an ignored request or body finishes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle conversion reentry preserves the newer operation and notice", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: active subtitle errors reject, preserve track and allow a later retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle HTTP failures do not become usable tracks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: disabled native tracks expose empty cue arrays without throwing", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle track failure is reported and obsolete callbacks are removed", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: constructor and URL setter failures notify without unhandled promises", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: failed track insertion restores the old live track and releases the attempted URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: cleanup failure after track commit does not revoke the committed URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: native fullscreen uses a real gesture when the engine supports it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: proxy replacement preserves callback and node identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: i18n prototype fallback difference and custom keys are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: native fullscreen uses a real gesture when the engine supports it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: proxy replacement preserves callback and node identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: i18n prototype fallback difference and custom keys are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: native fullscreen uses a real gesture when the engine supports it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: proxy replacement preserves callback and node identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: i18n prototype fallback difference and custom keys are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: native fullscreen uses a real gesture when the engine supports it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: proxy replacement preserves callback and node identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: i18n prototype fallback difference and custom keys are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: native fullscreen uses a real gesture when the engine supports it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: proxy replacement preserves callback and node identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: i18n prototype fallback difference and custom keys are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: native fullscreen uses a real gesture when the engine supports it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: proxy replacement preserves callback and node identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: i18n prototype fallback difference and custom keys are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: a delayed image follows the latest hover rather than the first request position", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: a delayed image follows the latest hover rather than the first request position", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: removing thumbnails revokes the scaled image and a replacement control can reload", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: image failure permits a retry through the same thumbnail configuration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: a delayed image follows the latest hover rather than the first request position", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: a delayed image follows the latest hover rather than the first request position", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: removing thumbnails revokes the scaled image and a replacement control can reload", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: image failure permits a retry through the same thumbnail configuration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: a delayed image follows the latest hover rather than the first request position", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: a delayed image follows the latest hover rather than the first request position", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: removing thumbnails revokes the scaled image and a replacement control can reload", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: image failure permits a retry through the same thumbnail configuration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: subtitle object URL contains real VTT data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: download starts and removes its temporary anchor", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: subtitle object URL contains real VTT data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: download starts and removes its temporary anchor", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate download releases the anchor even when click fails", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: subtitle object URL contains real VTT data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: download starts and removes its temporary anchor", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: subtitle object URL contains real VTT data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: download starts and removes its temporary anchor", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate download releases the anchor even when click fails", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: subtitle object URL contains real VTT data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: download starts and removes its temporary anchor", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: subtitle object URL contains real VTT data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: download starts and removes its temporary anchor", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate download releases the anchor even when click fails", + "engine": "webkit", + "status": "passed", + "retry": 0 + } + ], + "reportSha256": "3daa5af9a637aea487f780e31f05c2e3b607162c7628d03ecc05710280eb53a3", + "logSha256": "5285fd7a5269620405aa7ebd0f8a37dc206bbc9603abe86e7e8404f4f56f8b27" + }, + { + "variant": "legacy", + "stats": { + "startTime": "2026-09-11T09:46:43.557Z", + "duration": 367959.292, + "expected": 1521, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "versions": { + "chromium": "153.0.8010.12", + "firefox": "155.0", + "webkit": "26.6" + }, + "counts": { + "chromium": 507, + "firefox": 507, + "webkit": 507 + }, + "declarationCases": [ + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "webkit", + "status": "passed", + "retry": 0 + } + ], + "cases": [ + { + "file": "auto-playback.spec.js", + "title": "published: resume close and playback rejection preserve the UI contract", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume API retains storage envelope, ID lookup and deletion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume button seeks and plays actual video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: repeated restart leaves one effective click for the current resume target", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: restart below threshold invalidates the old prompt click", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume close and playback rejection preserve the UI contract", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume API retains storage envelope, ID lookup and deletion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume button seeks and plays actual video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: repeated restart leaves one effective click for the current resume target", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart below threshold invalidates the old prompt click", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: source cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: remove cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destroy cancels obsolete resume timers and subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destruction inside seek prevents resume playback continuation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume close and playback rejection preserve the UI contract", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume API retains storage envelope, ID lookup and deletion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume button seeks and plays actual video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: repeated restart leaves one effective click for the current resume target", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: restart below threshold invalidates the old prompt click", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume close and playback rejection preserve the UI contract", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume API retains storage envelope, ID lookup and deletion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume button seeks and plays actual video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: repeated restart leaves one effective click for the current resume target", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart below threshold invalidates the old prompt click", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: source cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: remove cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destroy cancels obsolete resume timers and subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destruction inside seek prevents resume playback continuation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume close and playback rejection preserve the UI contract", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume API retains storage envelope, ID lookup and deletion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: resume button seeks and plays actual video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: repeated restart leaves one effective click for the current resume target", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "published: restart below threshold invalidates the old prompt click", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume close and playback rejection preserve the UI contract", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume API retains storage envelope, ID lookup and deletion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: resume button seeks and plays actual video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: repeated restart leaves one effective click for the current resume target", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart below threshold invalidates the old prompt click", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: restart cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: source cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: remove cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destroy cancels obsolete resume timers and subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "auto-playback.spec.js", + "title": "candidate: destruction inside seek prevents resume playback continuation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: removed lock icons stop observing the still-usable plugin state API", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: miniature progress follows the control event without adding public state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=true conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=false conditions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: removed lock icons stop observing the still-usable plugin state API", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: miniature progress follows the control event without adding public state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: retained builtin setters and events do not mutate a destroyed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: removed lock icons stop observing the still-usable plugin state API", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: miniature progress follows the control event without adding public state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=true conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=false conditions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: removed lock icons stop observing the still-usable plugin state API", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: miniature progress follows the control event without adding public state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: retained builtin setters and events do not mutate a destroyed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=true live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: builtin availability keeps mobile=false live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: removed lock icons stop observing the still-usable plugin state API", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "published: miniature progress follows the control event without adding public state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=true live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=true conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: builtin availability keeps mobile=false live=false conditions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: lock keeps public state, repeated events, DOM classes and icon switching", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: removed lock icons stop observing the still-usable plugin state API", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: miniature progress follows the control event without adding public state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "builtin-layers.spec.js", + "title": "candidate: retained builtin setters and events do not mutate a destroyed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "published-only observations: blank title, NaN and once-only metadata are historical defects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate clears titles on blank chapters, zero hover and replacement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate rejects NaN and can recover after an invalid update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate releases only its listeners and DOM across multiple instances and early destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate ignores pending metadata initialization after immediate destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "candidate deduplicates stylesheet injection while the document is loading", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "factory, registration, input normalization and safe title text", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "progress bars, real hover, title edges and boundary seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "sync update, Infinity, object identity, empty lists and invalid data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "chapter.spec.js", + "title": "explicit source update and core-owned destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector background clicks and rejection ownership are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: failed mounted reentry preserves its successful replacement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: context menu builtin selection and owned updates preserve state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a prototype-named component keeps the registry prototype intact", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: removed builtin time and volume controls stop owned effects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector items can be reused by an update without changing getter flags", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: async selector results cannot overwrite a newer choice or removed entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: reentrant beforeUnmount removes only once", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: narrow controls stay inside the player without hiding buttons", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: progress markers treat text as data and removed drags cannot seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector background clicks and rejection ownership are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: failed mounted reentry preserves its successful replacement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: context menu builtin selection and owned updates preserve state", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a prototype-named component keeps the registry prototype intact", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: removed builtin time and volume controls stop owned effects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector items can be reused by an update without changing getter flags", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: async selector results cannot overwrite a newer choice or removed entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: reentrant beforeUnmount removes only once", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: narrow controls stay inside the player without hiding buttons", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: progress markers treat text as data and removed drags cannot seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector background clicks and rejection ownership are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: failed mounted reentry preserves its successful replacement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: context menu builtin selection and owned updates preserve state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a prototype-named component keeps the registry prototype intact", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: removed builtin time and volume controls stop owned effects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector items can be reused by an update without changing getter flags", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: async selector results cannot overwrite a newer choice or removed entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: reentrant beforeUnmount removes only once", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: narrow controls stay inside the player without hiding buttons", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: progress markers treat text as data and removed drags cannot seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector background clicks and rejection ownership are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: failed mounted reentry preserves its successful replacement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: context menu builtin selection and owned updates preserve state", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a prototype-named component keeps the registry prototype intact", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: removed builtin time and volume controls stop owned effects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector items can be reused by an update without changing getter flags", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: async selector results cannot overwrite a newer choice or removed entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: reentrant beforeUnmount removes only once", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: narrow controls stay inside the player without hiding buttons", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: progress markers treat text as data and removed drags cannot seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: control layout follows resize and removal with observer fallback=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector background clicks and rejection ownership are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: failed mounted reentry preserves its successful replacement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: context menu builtin selection and owned updates preserve state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a prototype-named component keeps the registry prototype intact", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: removed builtin time and volume controls stop owned effects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: selector items can be reused by an update without changing getter flags", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: async selector results cannot overwrite a newer choice or removed entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: reentrant beforeUnmount removes only once", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: narrow controls stay inside the player without hiding buttons", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "published: progress markers treat text as data and removed drags cannot seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector background clicks and rejection ownership are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: beforeUnmount errors remain retryable and detached nodes can be removed", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: failed mounted reentry preserves its successful replacement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: context menu builtin selection and owned updates preserve state", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a prototype-named component keeps the registry prototype intact", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: component factories, ordering, bound methods and update hooks retain contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: removed builtin time and volume controls stop owned effects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: selector items can be reused by an update without changing getter flags", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: async selector results cannot overwrite a newer choice or removed entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: a failed mounted hook rolls back its DOM alias and listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: reentrant beforeUnmount removes only once", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: narrow controls stay inside the player without hiding buttons", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "components.spec.js", + "title": "candidate: progress markers treat text as data and removed drags cannot seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: plugin, toggle, setting and static runtime return contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: native subtitle update events carry cue arrays", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: plugin, toggle, setting and static runtime return contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: native subtitle update events carry cue arrays", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: plugin, toggle, setting and static runtime return contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: native subtitle update events carry cue arrays", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: plugin, toggle, setting and static runtime return contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: native subtitle update events carry cue arrays", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: plugin, toggle, setting and static runtime return contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "published: native subtitle update events carry cue arrays", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: plugin, toggle, setting and static runtime return contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "declarations.spec.js", + "title": "candidate: native subtitle update events carry cue arrays", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini retains first-entry and reuse DOM order and display", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini restores the original video parent and sibling after repeated entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=false removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=true removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini retains first-entry and reuse DOM order and display", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini restores the original video parent and sibling after repeated entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=false removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=true removes the owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: hiding mini cancels drag and later document events cannot persist a hidden popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini remains in the viewport on small screens", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini drag stores the actual position and playback buttons remain usable", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini exit failure keeps the active video and can restore on retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini reentry during restoration retains the new placement snapshot", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction hide releases incomplete UI and restores the video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction destroy releases incomplete UI and restores the video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction fail releases incomplete UI and restores the video", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini preserves a caller-owned popup on destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: reentrant mini creation allocates only one owned popup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini switches to body web fullscreen and restores the original video placement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying a mini drag removes its document subscriptions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini retains first-entry and reuse DOM order and display", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini restores the original video parent and sibling after repeated entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=false removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=true removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini retains first-entry and reuse DOM order and display", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini restores the original video parent and sibling after repeated entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=false removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=true removes the owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: hiding mini cancels drag and later document events cannot persist a hidden popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini remains in the viewport on small screens", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini drag stores the actual position and playback buttons remain usable", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini exit failure keeps the active video and can restore on retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini reentry during restoration retains the new placement snapshot", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction hide releases incomplete UI and restores the video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction destroy releases incomplete UI and restores the video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction fail releases incomplete UI and restores the video", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini preserves a caller-owned popup on destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: reentrant mini creation allocates only one owned popup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini switches to body web fullscreen and restores the original video placement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying a mini drag removes its document subscriptions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini retains first-entry and reuse DOM order and display", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: mini restores the original video parent and sibling after repeated entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=false removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "published: destroying active mini removeHtml=true removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini retains first-entry and reuse DOM order and display", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini restores the original video parent and sibling after repeated entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=false removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying active mini removeHtml=true removes the owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: hiding mini cancels drag and later document events cannot persist a hidden popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini remains in the viewport on small screens", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini drag stores the actual position and playback buttons remain usable", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini exit failure keeps the active video and can restore on retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini reentry during restoration retains the new placement snapshot", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction hide releases incomplete UI and restores the video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction destroy releases incomplete UI and restores the video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini construction fail releases incomplete UI and restores the video", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini preserves a caller-owned popup on destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: reentrant mini creation allocates only one owned popup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: mini switches to body web fullscreen and restores the original video placement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-mini.spec.js", + "title": "candidate: destroying a mini drag removes its document subscriptions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: void exit waits for the owned video to leave and accepts another owner as completion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: native fullscreen belongs to its player and other players cannot exit it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: destroyed players stop receiving later native fullscreen events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: rejected native fullscreen request removes its temporary change listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: native fullscreen belongs to its player and other players cannot exit it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: destroyed players stop receiving later native fullscreen events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected native fullscreen request removes its temporary change listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: fullscreen assignment rejection shows notice without an unhandled rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: reentrant entry preserves real fullscreen UI and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-exit releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-destroy releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-exit releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-destroy releases a late own entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: cancelling an actual native request in the initiating click releases fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected exit retains actual fullscreen state and can be retried", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: void exit waits for the owned video to leave and accepts another owner as completion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: native fullscreen belongs to its player and other players cannot exit it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: destroyed players stop receiving later native fullscreen events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: rejected native fullscreen request removes its temporary change listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: native fullscreen belongs to its player and other players cannot exit it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: destroyed players stop receiving later native fullscreen events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected native fullscreen request removes its temporary change listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: fullscreen assignment rejection shows notice without an unhandled rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: reentrant entry preserves real fullscreen UI and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-exit releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-destroy releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-exit releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-destroy releases a late own entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: cancelling an actual native request in the initiating click releases fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected exit retains actual fullscreen state and can be retried", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: void exit waits for the owned video to leave and accepts another owner as completion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: native fullscreen belongs to its player and other players cannot exit it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: destroyed players stop receiving later native fullscreen events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "published: rejected native fullscreen request removes its temporary change listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: native fullscreen belongs to its player and other players cannot exit it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: destroyed players stop receiving later native fullscreen events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected native fullscreen request removes its temporary change listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: fullscreen assignment rejection shows notice without an unhandled rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: reentrant entry preserves real fullscreen UI and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-exit releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry promise-destroy releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-exit releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: pending native entry void-destroy releases a late own entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: cancelling an actual native request in the initiating click releases fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-native.spec.js", + "title": "candidate: rejected exit retains actual fullscreen state and can be retried", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: a cancelled rotation timer cannot rotate a later fullscreen session early", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: destroying a pending rotation removes its timer and produces no late resize", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated playback supports ratio and flip changes before restoring normal layout", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: repeated web fullscreen retains rotated dimensions and final styles", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: rotated web fullscreen restores original inline geometry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated web fullscreen restores original inline geometry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: a cancelled rotation timer cannot rotate a later fullscreen session early", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: destroying a pending rotation removes its timer and produces no late resize", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated playback supports ratio and flip changes before restoring normal layout", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: repeated web fullscreen retains rotated dimensions and final styles", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: rotated web fullscreen restores original inline geometry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated web fullscreen restores original inline geometry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: a cancelled rotation timer cannot rotate a later fullscreen session early", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotation destruction restores styles and cancels subscriptions removeHtml=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: destroying a pending rotation removes its timer and produces no late resize", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated playback supports ratio and flip changes before restoring normal layout", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: repeated web fullscreen retains rotated dimensions and final styles", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: rotated web fullscreen restores original inline geometry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "published: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: rotated web fullscreen restores original inline geometry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-orientation.spec.js", + "title": "candidate: late orientation lock after fullscreen exit does not reactivate the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP follows native UI transitions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: destroying WebKit PiP returns presentation to inline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP follows native UI transitions", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: destroying WebKit PiP returns presentation to inline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP pending entry is cleaned up after destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP follows native UI transitions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: destroying WebKit PiP returns presentation to inline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP follows native UI transitions", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: destroying WebKit PiP returns presentation to inline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP pending entry is cleaned up after destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: WebKit PiP follows native UI transitions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "published: destroying WebKit PiP returns presentation to inline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP keeps boolean state and repeated synchronous setter events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP follows native UI transitions", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: destroying WebKit PiP returns presentation to inline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip-webkit.spec.js", + "title": "candidate: WebKit PiP pending entry is cleaned up after destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: native PiP preserves element/null getter, void setter and boolean events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: a player cannot report or exit another video's PiP", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: destroy releases active PiP without a late player event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: native PiP preserves element/null getter, void setter and boolean events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: a player cannot report or exit another video's PiP", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: destroy releases active PiP without a late player event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP cancel releases late native entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP destroy releases late native entry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: rejected PiP assignment shows notice without an unhandled rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: actual native PiP gesture and playback or explicit unsupported capability", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: native PiP preserves element/null getter, void setter and boolean events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: a player cannot report or exit another video's PiP", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: destroy releases active PiP without a late player event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: native PiP preserves element/null getter, void setter and boolean events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: a player cannot report or exit another video's PiP", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: destroy releases active PiP without a late player event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP cancel releases late native entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP destroy releases late native entry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: rejected PiP assignment shows notice without an unhandled rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: actual native PiP gesture and playback or explicit unsupported capability", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: native PiP preserves element/null getter, void setter and boolean events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: a player cannot report or exit another video's PiP", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "published: destroy releases active PiP without a late player event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: native PiP preserves element/null getter, void setter and boolean events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: a player cannot report or exit another video's PiP", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: destroy releases active PiP without a late player event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP cancel releases late native entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: pending PiP destroy releases late native entry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: rejected PiP assignment shows notice without an unhandled rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-pip.spec.js", + "title": "candidate: actual native PiP gesture and playback or explicit unsupported capability", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: hidden containers defer sizing and recover after becoming visible", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: malformed ratios preserve layout while retaining notices, datasets and events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: retained display setters and sizing methods do not write or emit after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing preserves valid geometry, return values and emitted measurements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: aspect ratio and flip preserve dataset, notices and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing preserves valid geometry, return values and emitted measurements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: aspect ratio and flip preserve dataset, notices and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: hidden containers defer sizing and recover after becoming visible", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: malformed ratios preserve layout while retaining notices, datasets and events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: retained display setters and sizing methods do not write or emit after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing preserves valid geometry, return values and emitted measurements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: aspect ratio and flip preserve dataset, notices and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing preserves valid geometry, return values and emitted measurements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: aspect ratio and flip preserve dataset, notices and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing methods remain detachable own properties and ratio parsing retains legacy coercion", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: hidden containers defer sizing and recover after becoming visible", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: malformed ratios preserve layout while retaining notices, datasets and events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: retained display setters and sizing methods do not write or emit after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: sizing preserves valid geometry, return values and emitted measurements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: aspect ratio and flip preserve dataset, notices and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "published: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: sizing preserves valid geometry, return values and emitted measurements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: aspect ratio and flip preserve dataset, notices and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-sizing.spec.js", + "title": "candidate: unresolved media dimensions do not partially change layout or emit NaN height", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: destroying video-only fullscreen releases native presentation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: destroying video-only fullscreen releases native presentation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: cancelled video-only entry after destroy is released without late player events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen preserves synchronous errors and supports exit retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: destroying video-only fullscreen releases native presentation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: destroying video-only fullscreen releases native presentation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: cancelled video-only entry after destroy is released without late player events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen preserves synchronous errors and supports exit retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "published: destroying video-only fullscreen releases native presentation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen reads its native video state and deduplicates signals", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: destroying video-only fullscreen releases native presentation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: cancelled video-only entry after destroy is released without late player events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-video-fullscreen.spec.js", + "title": "candidate: video-only fullscreen preserves synchronous errors and supports exit retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener can exit without stale resize or overwritten restoration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener destroy restores ownership without post-destroy resize", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed body move restores style and keeps its original error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed web fullscreen exit can retry restoring the original placement", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: reentry during web fullscreen restoration preserves the newer active mode", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (empty)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (empty)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener can exit without stale resize or overwritten restoration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener destroy restores ownership without post-destroy resize", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed body move restores style and keeps its original error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed web fullscreen exit can retry restoring the original placement", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: reentry during web fullscreen restoration preserves the newer active mode", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (empty)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (empty)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=false movedBeforeThrow=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: failed destroy restoration cannot orphan the player removeHtml=true movedBeforeThrow=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener can exit without stale resize or overwritten restoration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen listener destroy restores ownership without post-destroy resize", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed body move restores style and keeps its original error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: a failed web fullscreen exit can retry restoring the original placement", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: reentry during web fullscreen restoration preserves the newer active mode", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (empty)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "published: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (empty)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: web fullscreen restores initial style after repeated entry (width: 70%; height: 80%; color: red;)", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: body fullscreen restores original parent and sibling when flag changes=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=false restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "display-web.spec.js", + "title": "candidate: destroy while web fullscreen removeHtml=true restores DOM ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "published: DOM utilities preserve native tree, style and event-path behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: DOM utilities preserve native tree, style and event-path behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: safe-area measurement releases the native probe after failure unlike the previous workspace implementation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "published: DOM utilities preserve native tree, style and event-path behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: DOM utilities preserve native tree, style and event-path behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: safe-area measurement releases the native probe after failure unlike the previous workspace implementation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "published: DOM utilities preserve native tree, style and event-path behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: DOM utilities preserve native tree, style and event-path behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "dom-boundaries.spec.js", + "title": "candidate: safe-area measurement releases the native probe after failure unlike the previous workspace implementation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "editor-types.spec.js", + "title": "docs Monaco worker consumes generated core types and runs a typed player example", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "published: emitter event names and once across nested dispatch", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "candidate: emitter event names and once across nested dispatch", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "published: emitter event names and once across nested dispatch", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "candidate: emitter event names and once across nested dispatch", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "published: emitter event names and once across nested dispatch", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "emitter.spec.js", + "title": "candidate: emitter event names and once across nested dispatch", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: actual animation frames follow playback and stop after destruction inside raf", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: Events keeps its public fields, prototype and detached native methods", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: screen orientation dispatch works when onchange has no assigned handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: destruction releases the scroll throttle reset timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: view visibility uses the container's current iframe viewport", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: actual animation frames follow playback and stop after destruction inside raf", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: Events keeps its public fields, prototype and detached native methods", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: screen orientation dispatch works when onchange has no assigned handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: destruction releases the scroll throttle reset timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: view visibility uses the container's current iframe viewport", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: actual animation frames follow playback and stop after destruction inside raf", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: Events keeps its public fields, prototype and detached native methods", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: screen orientation dispatch works when onchange has no assigned handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: destruction releases the scroll throttle reset timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: view visibility uses the container's current iframe viewport", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: actual animation frames follow playback and stop after destruction inside raf", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: Events keeps its public fields, prototype and detached native methods", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: screen orientation dispatch works when onchange has no assigned handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: destruction releases the scroll throttle reset timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: view visibility uses the container's current iframe viewport", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: actual animation frames follow playback and stop after destruction inside raf", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: Events keeps its public fields, prototype and detached native methods", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: screen orientation dispatch works when onchange has no assigned handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: destruction releases the scroll throttle reset timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "published: view visibility uses the container's current iframe viewport", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: actual animation frames follow playback and stop after destruction inside raf", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: Events keeps its public fields, prototype and detached native methods", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: screen orientation dispatch works when onchange has no assigned handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: destruction releases the scroll throttle reset timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "event-scheduling.spec.js", + "title": "candidate: view visibility uses the container's current iframe viewport", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: native source reset retains its default playback rate behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: long press accelerates real playback and restores its prior rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: touchcancel releases an active long press", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: native source reset retains its default playback rate behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: long press accelerates real playback and restores its prior rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: touchcancel releases an active long press", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: lock restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: pause restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: source restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: destroy restores the active long-press rate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: repeated pending touches own a single timer which destruction cancels", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: native source reset retains its default playback rate behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: long press accelerates real playback and restores its prior rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: touchcancel releases an active long press", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: native source reset retains its default playback rate behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: long press accelerates real playback and restores its prior rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: touchcancel releases an active long press", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: lock restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: pause restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: source restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: destroy restores the active long-press rate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: repeated pending touches own a single timer which destruction cancels", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: native source reset retains its default playback rate behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: long press accelerates real playback and restores its prior rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "published: touchcancel releases an active long press", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: native source reset retains its default playback rate behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: long press accelerates real playback and restores its prior rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: touchcancel releases an active long press", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: lock restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: pause restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: source restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: destroy restores the active long-press rate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "fast-forward.spec.js", + "title": "candidate: repeated pending touches own a single timer which destruction cancels", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: a gesture before first play still issues the requested seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy during absolute progress touch stops the following seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: cancel invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: lock invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: multitouch invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: identifier invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy from a touch seek callback prevents the later progress notification", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: a gesture before first play still issues the requested seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy during absolute progress touch stops the following seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: cancel invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: lock invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: multitouch invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: identifier invalidates an in-progress gesture", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy from a touch seek callback prevents the later progress notification", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: a gesture before first play still issues the requested seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy during absolute progress touch stops the following seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: cancel invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: lock invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: multitouch invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: identifier invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy from a touch seek callback prevents the later progress notification", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: a gesture before first play still issues the requested seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy during absolute progress touch stops the following seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: cancel invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: lock invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: multitouch invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: identifier invalidates an in-progress gesture", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy from a touch seek callback prevents the later progress notification", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: a gesture before first play still issues the requested seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy during absolute progress touch stops the following seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: cancel invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: lock invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: multitouch invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: identifier invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "published: destroy from a touch seek callback prevents the later progress notification", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: a gesture before first play still issues the requested seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: progress touch keeps absolute position and bar-before-seek ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy during absolute progress touch stops the following seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: normal touch drag keeps seek/bar ordering and original touch identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: cancel invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: lock invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: multitouch invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: identifier invalidates an in-progress gesture", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "gesture.spec.js", + "title": "candidate: destroy from a touch seek callback prevents the later progress notification", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: rebind during native global registration cancels the interrupted binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: destroy during native global registration cancels the interrupted binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: global rebinding forwards original events once and releases the previous document", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: global rebinding forwards original events once and releases the previous document", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: rebind during native global registration cancels the interrupted binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: destroy during native global registration cancels the interrupted binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: global rebinding forwards original events once and releases the previous document", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: global rebinding forwards original events once and releases the previous document", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: rebind during native global registration cancels the interrupted binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: destroy during native global registration cancels the interrupted binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: global rebinding forwards original events once and releases the previous document", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "published: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: global rebinding forwards original events once and releases the previous document", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "global-events.spec.js", + "title": "candidate: failed global rebinding keeps the previous document and removes partial new listeners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: native keyboard play/pause, seek, volume and web-fullscreen Escape retain their behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: inherited editing and IME composition do not activate player shortcuts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: plaintext editing and IME composition do not activate player shortcuts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: select editing and IME composition do not activate player shortcuts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: destroying during a key callback stops remaining keys and notifications", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: hotkey registration retains chain, array identity, receiver and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: rebound document input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: shadow-root input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: repeated hotkey init does not multiply the keyboard subscription", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: hotkey registration retains chain, array identity, receiver and event order", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: rebound document input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: shadow-root input retains typing instead of triggering a hotkey", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: repeated hotkey init does not multiply the keyboard subscription", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: native keyboard play/pause, seek, volume and web-fullscreen Escape retain their behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: inherited editing and IME composition do not activate player shortcuts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: plaintext editing and IME composition do not activate player shortcuts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: select editing and IME composition do not activate player shortcuts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: destroying during a key callback stops remaining keys and notifications", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: hotkey registration retains chain, array identity, receiver and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: rebound document input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: shadow-root input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: repeated hotkey init does not multiply the keyboard subscription", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: hotkey registration retains chain, array identity, receiver and event order", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: rebound document input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: shadow-root input retains typing instead of triggering a hotkey", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: repeated hotkey init does not multiply the keyboard subscription", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: mobile keeps keyboard initialization opt-in through the existing init method", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: prototype-named hotkeys do not crash or replace the keys prototype", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: native keyboard play/pause, seek, volume and web-fullscreen Escape retain their behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: inherited editing and IME composition do not activate player shortcuts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: plaintext editing and IME composition do not activate player shortcuts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: select editing and IME composition do not activate player shortcuts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: destroying during a key callback stops remaining keys and notifications", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: hotkey registration retains chain, array identity, receiver and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: rebound document input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: shadow-root input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "published: repeated hotkey init does not multiply the keyboard subscription", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: hotkey registration retains chain, array identity, receiver and event order", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: rebound document input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: shadow-root input retains typing instead of triggering a hotkey", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "hotkey.spec.js", + "title": "candidate: repeated hotkey init does not multiply the keyboard subscription", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: player descriptor order and constructor/static surfaces match the published core", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy listener can mount a replacement without the old constructor overwriting it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: teardown during capability detection stops remaining player installers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: destroy during initial native volume assignment stops later construction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: teardown during capability detection stops remaining player installers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: destroy during initial native volume assignment stops later construction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: player descriptor order and constructor/static surfaces match the published core", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy listener can mount a replacement without the old constructor overwriting it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: teardown during capability detection stops remaining player installers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: destroy during initial native volume assignment stops later construction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: teardown during capability detection stops remaining player installers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: destroy during initial native volume assignment stops later construction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy cleans the mounting template with removeHtml=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: player descriptor order and constructor/static surfaces match the published core", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: proxy-time destroy listener can mount a replacement without the old constructor overwriting it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: teardown during capability detection stops remaining player installers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "published: destroy during initial native volume assignment stops later construction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: subclasses retain receiver identity, initialization timing and static inheritance", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: omitted unused SSR nodes stay nullable without an eager template rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: teardown during capability detection stops remaining player installers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "initialization.spec.js", + "title": "candidate: destroy during initial native volume assignment stops later construction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: restoring a removed default hotkey keeps identity and real playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: a failed native removal remains retryable and releases its record", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: destruction before native add returns cannot leave a late listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: window registration failure restores the previous global binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: source changes cancel the old gesture in the installed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: rotation changes cancel the old gesture in the installed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: geometry changes cancel the old gesture in the installed player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: adopted viewport retains exact gap boundaries", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: restoring a removed default hotkey keeps identity and real playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: a failed native removal remains retryable and releases its record", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: destruction before native add returns cannot leave a late listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: window registration failure restores the previous global binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: source changes cancel the old gesture in the installed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: rotation changes cancel the old gesture in the installed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: geometry changes cancel the old gesture in the installed player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: adopted viewport retains exact gap boundaries", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: restoring a removed default hotkey keeps identity and real playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: a failed native removal remains retryable and releases its record", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: destruction before native add returns cannot leave a late listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: window registration failure restores the previous global binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: source changes cancel the old gesture in the installed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: rotation changes cancel the old gesture in the installed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: geometry changes cancel the old gesture in the installed player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "input-closeout.spec.js", + "title": "candidate closeout: adopted viewport retains exact gap boundaries", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "published: repeated destroy preserves other live instances", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: repeated destroy preserves other live instances", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor plugin failure restores original DOM and clears resources", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: early proxy failure restores SSR nodes, attributes and text", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: reentrant destroy keeps sequence and does not repeat callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: destroying cancels queued resize, notice, RAF, reconnect and mounted work", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor can synchronously destroy without entering the registry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: partial Events initialization releases listeners before its property is assigned", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: live resize still coalesces and destroy cancels the next burst", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: a container is reserved during reentrant initialization", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "published: repeated destroy preserves other live instances", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: repeated destroy preserves other live instances", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor plugin failure restores original DOM and clears resources", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: early proxy failure restores SSR nodes, attributes and text", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: reentrant destroy keeps sequence and does not repeat callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: destroying cancels queued resize, notice, RAF, reconnect and mounted work", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor can synchronously destroy without entering the registry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: partial Events initialization releases listeners before its property is assigned", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: live resize still coalesces and destroy cancels the next burst", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: a container is reserved during reentrant initialization", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "published: repeated destroy preserves other live instances", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: repeated destroy preserves other live instances", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor plugin failure restores original DOM and clears resources", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: early proxy failure restores SSR nodes, attributes and text", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: reentrant destroy keeps sequence and does not repeat callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: destroying cancels queued resize, notice, RAF, reconnect and mounted work", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: constructor can synchronously destroy without entering the registry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: partial Events initialization releases listeners before its property is assigned", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: live resize still coalesces and destroy cancels the next burst", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "lifecycle.spec.js", + "title": "candidate: a container is reserved during reentrant initialization", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: null options preserve the native default and callbacks can be removed directly", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: once and abort use native event identity and permit subsequent registration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: changing capture options after registration cannot prevent cleanup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: partially failing array registration rolls back the listeners it created", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: registration throwing after native add does not leave an untracked listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: null options preserve the native default and callbacks can be removed directly", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: once and abort use native event identity and permit subsequent registration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: changing capture options after registration cannot prevent cleanup", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: partially failing array registration rolls back the listeners it created", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: registration throwing after native add does not leave an untracked listener", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: null options preserve the native default and callbacks can be removed directly", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: once and abort use native event identity and permit subsequent registration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: changing capture options after registration cannot prevent cleanup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: partially failing array registration rolls back the listeners it created", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: registration throwing after native add does not leave an untracked listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: null options preserve the native default and callbacks can be removed directly", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: once and abort use native event identity and permit subsequent registration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: changing capture options after registration cannot prevent cleanup", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: partially failing array registration rolls back the listeners it created", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: registration throwing after native add does not leave an untracked listener", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: null options preserve the native default and callbacks can be removed directly", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: once and abort use native event identity and permit subsequent registration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: changing capture options after registration cannot prevent cleanup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: partially failing array registration rolls back the listeners it created", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "published: registration throwing after native add does not leave an untracked listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: null options preserve the native default and callbacks can be removed directly", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: once and abort use native event identity and permit subsequent registration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: direct event disposer preserves native callback identity and releases bookkeeping", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: changing capture options after registration cannot prevent cleanup", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: partially failing array registration rolls back the listeners it created", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "listener-registry.spec.js", + "title": "candidate: registration throwing after native add does not leave an untracked listener", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: replacing a failed source cancels candidate retries", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: replacing a failed source cancels candidate retries", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: rejected real-media switch still allows current-source reconnect", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: replacing a failed source cancels candidate retries", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: replacing a failed source cancels candidate retries", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: rejected real-media switch still allows current-source reconnect", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: replacing a failed source cancels candidate retries", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: HTTP failure retries the updated option URL with the original event and one ready", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: replacing a failed source cancels candidate retries", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: rejected real-media switch still allows current-source reconnect", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: destroying from first-ready controls prevents a candidate ghost ready event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: metadata emits resize before mobile visibility changes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: metadata emits resize before mobile visibility changes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: metadata emits resize before mobile visibility changes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: metadata emits resize before mobile visibility changes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "published: metadata emits resize before mobile visibility changes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-events.spec.js", + "title": "candidate: metadata emits resize before mobile visibility changes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "published: existing canvas proxy keeps media identity, playback and layout", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "candidate: existing canvas proxy keeps media identity, playback and layout", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "published: existing canvas proxy keeps media identity, playback and layout", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "candidate: existing canvas proxy keeps media identity, playback and layout", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "published: existing canvas proxy keeps media identity, playback and layout", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "media-hosts.spec.js", + "title": "candidate: existing canvas proxy keeps media identity, playback and layout", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice updates do not call a consumer override of destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice preserves public shape, Error text and false hide semantics", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice expires naturally during real playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: manual notice destroy permits reuse and does not hide its DOM", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: destruction during notice text assignment cannot schedule a late timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: expiry does not hide a notice installed during the clearing write", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice updates do not call a consumer override of destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice preserves public shape, Error text and false hide semantics", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice expires naturally during real playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: manual notice destroy permits reuse and does not hide its DOM", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: destruction during notice text assignment cannot schedule a late timer", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: expiry does not hide a notice installed during the clearing write", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: retained callbacks and assignments cannot revive destroyed notice resources", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice updates do not call a consumer override of destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice preserves public shape, Error text and false hide semantics", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice expires naturally during real playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: manual notice destroy permits reuse and does not hide its DOM", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: destruction during notice text assignment cannot schedule a late timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: expiry does not hide a notice installed during the clearing write", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice updates do not call a consumer override of destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice preserves public shape, Error text and false hide semantics", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice expires naturally during real playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: manual notice destroy permits reuse and does not hide its DOM", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: destruction during notice text assignment cannot schedule a late timer", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: expiry does not hide a notice installed during the clearing write", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: retained callbacks and assignments cannot revive destroyed notice resources", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice updates do not call a consumer override of destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice preserves public shape, Error text and false hide semantics", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: notice expires naturally during real playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: manual notice destroy permits reuse and does not hide its DOM", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: destruction during notice text assignment cannot schedule a late timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "published: expiry does not hide a notice installed during the clearing write", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice updates do not call a consumer override of destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice preserves public shape, Error text and false hide semantics", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: notice expires naturally during real playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: manual notice destroy permits reuse and does not hide its DOM", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: destruction during notice text assignment cannot schedule a late timer", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: expiry does not hide a notice installed during the clearing write", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "notice.spec.js", + "title": "candidate: retained callbacks and assignments cannot revive destroyed notice resources", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: expanded option input preserves historical JS forms", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: configuration errors occur before mounting and preserve allocation timing", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: container identity, partial defaults, custom fields and normal callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: expanded option input preserves historical JS forms", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: configuration errors occur before mounting and preserve allocation timing", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: container identity, partial defaults, custom fields and normal callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: expanded option input preserves historical JS forms", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: configuration errors occur before mounting and preserve allocation timing", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: container identity, partial defaults, custom fields and normal callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: expanded option input preserves historical JS forms", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: configuration errors occur before mounting and preserve allocation timing", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: container identity, partial defaults, custom fields and normal callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: expanded option input preserves historical JS forms", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: configuration errors occur before mounting and preserve allocation timing", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "published: container identity, partial defaults, custom fields and normal callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: expanded option input preserves historical JS forms", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: configuration errors occur before mounting and preserve allocation timing", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "options.spec.js", + "title": "candidate: container identity, partial defaults, custom fields and normal callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: real media preserves timeline, volume, rate and property descriptors", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: invalid time inputs and rate no-op retain native behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: real media preserves timeline, volume, rate and property descriptors", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: invalid time inputs and rate no-op retain native behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: real media preserves timeline, volume, rate and property descriptors", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: invalid time inputs and rate no-op retain native behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: real media preserves timeline, volume, rate and property descriptors", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: invalid time inputs and rate no-op retain native behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: real media preserves timeline, volume, rate and property descriptors", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "published: invalid time inputs and rate no-op retain native behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: real media preserves timeline, volume, rate and property descriptors", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback-properties.spec.js", + "title": "candidate: invalid time inputs and rate no-op retain native behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "published: real playback, pause, seek, switch and destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "candidate: real playback, pause, seek, switch and destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "controlled HTTP media failure emits a real video error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "Range, media identity and docs candidate routes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "published: real playback, pause, seek, switch and destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "candidate: real playback, pause, seek, switch and destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "controlled HTTP media failure emits a real video error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "Range, media identity and docs candidate routes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "published: real playback, pause, seek, switch and destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "candidate: real playback, pause, seek, switch and destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "controlled HTTP media failure emits a real video error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "playback.spec.js", + "title": "Range, media identity and docs candidate routes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: a plugin that closes construction prevents subsequent factories", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: constructor-owned rejection is reported once without an unhandled rejection", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: a plugin that closes construction prevents subsequent factories", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: constructor-owned rejection is reported once without an unhandled rejection", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: late plugin registration preserves fulfillment without reviving a closed candidate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: a plugin that closes construction prevents subsequent factories", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: constructor-owned rejection is reported once without an unhandled rejection", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: builtin order and live exclusions precede user plugins", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: builtin order and live exclusions precede user plugins", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: builtin order and live exclusions precede user plugins", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: builtin order and live exclusions precede user plugins", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "published: builtin order and live exclusions precede user plugins", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "plugins.spec.js", + "title": "candidate: builtin order and live exclusions precede user plugins", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: click pairs preserve callback identity and playback ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in click stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in dblclick stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: focus, hover and move preserve flags, classes and original events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: click pairs preserve callback identity and playback ordering", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in click stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in dblclick stops its subsequent default action", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: focus, hover and move preserve flags, classes and original events", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: click pairs preserve callback identity and playback ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in click stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in dblclick stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: focus, hover and move preserve flags, classes and original events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: click pairs preserve callback identity and playback ordering", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in click stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in dblclick stops its subsequent default action", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: focus, hover and move preserve flags, classes and original events", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: click pairs preserve callback identity and playback ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in click stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: destruction in dblclick stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "published: focus, hover and move preserve flags, classes and original events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: real mouse input focuses the player, hovers and toggles actual playback", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: click pairs preserve callback identity and playback ordering", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in click stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: destruction in dblclick stops its subsequent default action", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "pointer-events.spec.js", + "title": "candidate: focus, hover and move preserve flags, classes and original events", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through remove cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through source cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: real progress click keeps setBar before seek and clamps the edges", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: quality selectors retain default labels, source position and empty-array behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through remove cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through source cannot continue an obsolete seek", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: real progress click keeps setBar before seek and clamps the edges", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: quality selectors retain default labels, source position and empty-array behavior", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through remove cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through source cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: real progress click keeps setBar before seek and clamps the edges", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: quality selectors retain default labels, source position and empty-array behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through remove cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through source cannot continue an obsolete seek", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: real progress click keeps setBar before seek and clamps the edges", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: quality selectors retain default labels, source position and empty-array behavior", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through remove cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: progress click reentry through source cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: real progress click keeps setBar before seek and clamps the edges", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "published: quality selectors retain default labels, source position and empty-array behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through remove cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through destroy cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: progress click reentry through source cannot continue an obsolete seek", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: real progress click keeps setBar before seek and clamps the edges", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a progress drag ends when its source is replaced and can restart on the new source", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: a caller-owned media Blob URL remains readable after switching and destroying the player", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "progress-quality.spec.js", + "title": "candidate: quality selectors retain default labels, source position and empty-array behavior", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask preserves observations before and after its destroy handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info preserves fields, native media text and close visibility", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info retains native nullable string conversion for custom media fields", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: repeated info init owns only one new timer and close handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info mobile construction waits for an explicit init", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask click plays native video and destruction displays the terminal icon", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask preserves observations before and after its destroy handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info preserves fields, native media text and close visibility", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info retains native nullable string conversion for custom media fields", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: repeated info init owns only one new timer and close handler", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info mobile construction waits for an explicit init", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask click plays native video and destruction displays the terminal icon", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info destruction during a media getter prevents text writes and late init", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: reentrant info text conversion cannot write after player destruction", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask finalization follows an earlier throwing observer without replacing its error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask preserves observations before and after its destroy handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info preserves fields, native media text and close visibility", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info retains native nullable string conversion for custom media fields", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: repeated info init owns only one new timer and close handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info mobile construction waits for an explicit init", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask click plays native video and destruction displays the terminal icon", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask preserves observations before and after its destroy handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info preserves fields, native media text and close visibility", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info retains native nullable string conversion for custom media fields", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: repeated info init owns only one new timer and close handler", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info mobile construction waits for an explicit init", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask click plays native video and destruction displays the terminal icon", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info destruction during a media getter prevents text writes and late init", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: reentrant info text conversion cannot write after player destruction", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask finalization follows an earlier throwing observer without replacing its error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask preserves observations before and after its destroy handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info preserves fields, native media text and close visibility", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info retains native nullable string conversion for custom media fields", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: repeated info init owns only one new timer and close handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: info mobile construction waits for an explicit init", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "published: mask click plays native video and destruction displays the terminal icon", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask preserves observations before and after its destroy handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info preserves fields, native media text and close visibility", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info retains native nullable string conversion for custom media fields", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: repeated info init owns only one new timer and close handler", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info mobile construction waits for an explicit init", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask click plays native video and destruction displays the terminal icon", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: info destruction during a media getter prevents text writes and late init", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: reentrant info text conversion cannot write after player destruction", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "prompt-components.spec.js", + "title": "candidate: mask finalization follows an earlier throwing observer without replacing its error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "resource-scope.spec.js", + "title": "internal resource scope: native DOM, RAF, timer, fetch abort and URL release", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "resource-scope.spec.js", + "title": "internal resource scope: native DOM, RAF, timer, fetch abort and URL release", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "resource-scope.spec.js", + "title": "internal resource scope: native DOM, RAF, timer, fetch abort and URL release", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "published: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: constructor callback hosts expose only initialized components", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "candidate: container validation rejects non-div elements", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "runtime-types.spec.js", + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot preserves download filename, event data and Promise result", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: source replacement does not download a stale captured frame", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot toolbar rejection has exact historical error accounting", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot preserves download filename, event data and Promise result", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: source replacement does not download a stale captured frame", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot toolbar rejection has exact historical error accounting", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: null toBlob callback rejects and reports without a page error", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: destroy during screenshot await suppresses the queued download and event", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: cross-origin screenshot toolbar handles its internal rejected Promise", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot preserves download filename, event data and Promise result", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: source replacement does not download a stale captured frame", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot toolbar rejection has exact historical error accounting", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot preserves download filename, event data and Promise result", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: source replacement does not download a stale captured frame", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot toolbar rejection has exact historical error accounting", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: null toBlob callback rejects and reports without a page error", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: destroy during screenshot await suppresses the queued download and event", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: cross-origin screenshot toolbar handles its internal rejected Promise", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot preserves download filename, event data and Promise result", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: source replacement does not download a stale captured frame", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "published: screenshot toolbar rejection has exact historical error accounting", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: captures decoded PNG pixels and consumer-owned Blob URLs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot preserves download filename, event data and Promise result", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: actual cross-origin video rejects capture with SecurityError and notice", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: source replacement does not download a stale captured frame", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: screenshot toolbar rejection has exact historical error accounting", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: null toBlob callback rejects and reports without a page error", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: destroy during screenshot await suppresses the queued download and event", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "screenshot.spec.js", + "title": "candidate: cross-origin screenshot toolbar handles its internal rejected Promise", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: long setting labels leave native controls inside the row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: long setting labels leave native controls inside the row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: long setting labels leave native controls inside the row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: long setting labels leave native controls inside the row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "published: long setting labels leave native controls inside the row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: native setting keyboard and pointer actions retain range and switch callbacks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: long setting labels leave native controls inside the row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-interaction.spec.js", + "title": "candidate: nested settings remain selectable with autoOrientation=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after navigate", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after remove", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "published: sharing an active setting has an explicit ownership baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: sharing an active setting has an explicit ownership baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after remove", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after navigate", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after remove", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "published: sharing an active setting has an explicit ownership baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: sharing an active setting has an explicit ownership baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after remove", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after navigate", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after remove", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: cached panel failure preserves navigation after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "published: sharing an active setting has an explicit ownership baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: sharing an active setting has an explicit ownership baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after remove", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-ownership.spec.js", + "title": "candidate: a setting subtree can move to another instance after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after assign failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after format failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after item failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after render failure", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: failed switch updates restore the original closure and displayed icon", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant update supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant remove supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant destroy supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant child-update supersedes an unfinished setting update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: removing an ancestor cancels its pending descendant update", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant switch getter cannot replace the winning control handles", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant range getter cannot replace the winning control handles", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant add of the same object", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant update of the same object", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after assign failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after format failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after item failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after render failure", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: failed switch updates restore the original closure and displayed icon", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant update supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant remove supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant destroy supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant child-update supersedes an unfinished setting update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: removing an ancestor cancels its pending descendant update", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant switch getter cannot replace the winning control handles", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant range getter cannot replace the winning control handles", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant add of the same object", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant update of the same object", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after assign failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after format failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after item failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: setting update restores the original range row after render failure", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: failed switch updates restore the original closure and displayed icon", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant update supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant remove supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant destroy supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentrant child-update supersedes an unfinished setting update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: reentry inside a render getter retains the winning row with throwing=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: removing an ancestor cancels its pending descendant update", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant switch getter cannot replace the winning control handles", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a reentrant range getter cannot replace the winning control handles", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant add of the same object", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting-update.spec.js", + "title": "candidate: a failed outer add preserves a reentrant update of the same object", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: builtin setting subscriptions are replaced and removed with their row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: deferred setting mounts belong to the rendered item generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: removed setting subtrees release child listeners and cached panels", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting button results cannot overwrite an updated or newer item", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: sibling setting selections share the parent result generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting callback rejection retains its original failure identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting registry retains item returns and hidden tree bindings", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: moved setting items bind to their current parent and panel", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: automatic setting names and explicit nested names have an explicit baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: builtin setting subscriptions are replaced and removed with their row", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: deferred setting mounts belong to the rendered item generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: removed setting subtrees release child listeners and cached panels", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting button results cannot overwrite an updated or newer item", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: sibling setting selections share the parent result generation", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting callback rejection retains its original failure identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting registry retains item returns and hidden tree bindings", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: moved setting items bind to their current parent and panel", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: automatic setting names and explicit nested names have an explicit baseline", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed setting additions leave existing rows usable and allow retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting removal finishes DOM cleanup when the event-removal hook throws", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed header rendering releases its panel and restores reusable inputs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed item rendering releases its panel and restores reusable inputs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed layout rendering releases its panel and restores reusable inputs", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant remove", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: builtin setting subscriptions are replaced and removed with their row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: deferred setting mounts belong to the rendered item generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: removed setting subtrees release child listeners and cached panels", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting button results cannot overwrite an updated or newer item", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: sibling setting selections share the parent result generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting callback rejection retains its original failure identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting registry retains item returns and hidden tree bindings", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: moved setting items bind to their current parent and panel", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: automatic setting names and explicit nested names have an explicit baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: builtin setting subscriptions are replaced and removed with their row", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: deferred setting mounts belong to the rendered item generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: removed setting subtrees release child listeners and cached panels", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting button results cannot overwrite an updated or newer item", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: sibling setting selections share the parent result generation", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting callback rejection retains its original failure identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting registry retains item returns and hidden tree bindings", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: moved setting items bind to their current parent and panel", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: automatic setting names and explicit nested names have an explicit baseline", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed setting additions leave existing rows usable and allow retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting removal finishes DOM cleanup when the event-removal hook throws", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed header rendering releases its panel and restores reusable inputs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed item rendering releases its panel and restores reusable inputs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed layout rendering releases its panel and restores reusable inputs", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant remove", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: builtin setting subscriptions are replaced and removed with their row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: deferred setting mounts belong to the rendered item generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: removed setting subtrees release child listeners and cached panels", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting button results cannot overwrite an updated or newer item", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: sibling setting selections share the parent result generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting callback rejection retains its original failure identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: setting registry retains item returns and hidden tree bindings", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: moved setting items bind to their current parent and panel", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "published: automatic setting names and explicit nested names have an explicit baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: builtin setting subscriptions are replaced and removed with their row", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: deferred setting mounts belong to the rendered item generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: removed setting subtrees release child listeners and cached panels", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting button results cannot overwrite an updated or newer item", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: sibling setting selections share the parent result generation", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting callback rejection retains its original failure identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: a wide nested setting panel fits the narrow player and remains selectable", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting registry retains item returns and hidden tree bindings", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: moved setting items bind to their current parent and panel", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: automatic setting names and explicit nested names have an explicit baseline", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: open settings follow container and control height changes with fallback=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed setting additions leave existing rows usable and allow retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: setting removal finishes DOM cleanup when the event-removal hook throws", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed header rendering releases its panel and restores reusable inputs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed item rendering releases its panel and restores reusable inputs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: failed layout rendering releases its panel and restores reusable inputs", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant remove", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "setting.spec.js", + "title": "candidate: panel creation stops after reentrant destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: rapid real-media switches identify the last restart and settle superseded work", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: destroy settles the candidate switch without waiting for detached media", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: rapid real-media switches identify the last restart and settle superseded work", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: destroy settles the candidate switch without waiting for detached media", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: quality switch restores position/rate and preserves real customType identities", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: direct currentTime during a native quality seek is not overwritten by automatic restoration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: real switch settles when the controlled native resume rejects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: late native play completion cannot publish stale player effects", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: rapid real-media switches identify the last restart and settle superseded work", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: destroy settles the candidate switch without waiting for detached media", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: rapid real-media switches identify the last restart and settle superseded work", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: destroy settles the candidate switch without waiting for detached media", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: quality switch restores position/rate and preserves real customType identities", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: direct currentTime during a native quality seek is not overwritten by automatic restoration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: real switch settles when the controlled native resume rejects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: late native play completion cannot publish stale player effects", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: rapid real-media switches identify the last restart and settle superseded work", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "published: destroy settles the candidate switch without waiting for detached media", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: rapid real-media switches identify the last restart and settle superseded work", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: destroy settles the candidate switch without waiting for detached media", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: quality switch restores position/rate and preserves real customType identities", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: direct currentTime during a native quality seek is not overwritten by automatic restoration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: real switch settles when the controlled native resume rejects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "source.spec.js", + "title": "candidate: late native play completion cannot publish stale player effects", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: srt conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: ass conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle remains visible through real native fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: native subtitle cues, offset, styles and show contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle latest request wins and cancelled calls settle", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle pending completion cannot replace track after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: srt conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: ass conversion reaches native cues with original callback binding", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle remains visible through real native fullscreen", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle cues, offset, styles and show contracts", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle latest request wins and cancelled calls settle", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle pending completion cannot replace track after destroy", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle cancellation settles before an ignored request or body finishes", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle conversion reentry preserves the newer operation and notice", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: active subtitle errors reject, preserve track and allow a later retry", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle HTTP failures do not become usable tracks", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: disabled native tracks expose empty cue arrays without throwing", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle track failure is reported and obsolete callbacks are removed", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: constructor and URL setter failures notify without unhandled promises", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=false", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=true", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: failed track insertion restores the old live track and releases the attempted URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: cleanup failure after track commit does not revoke the committed URL", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: srt conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: ass conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle remains visible through real native fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: native subtitle cues, offset, styles and show contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle latest request wins and cancelled calls settle", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle pending completion cannot replace track after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: srt conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: ass conversion reaches native cues with original callback binding", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle remains visible through real native fullscreen", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle cues, offset, styles and show contracts", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle latest request wins and cancelled calls settle", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle pending completion cannot replace track after destroy", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle cancellation settles before an ignored request or body finishes", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle conversion reentry preserves the newer operation and notice", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: active subtitle errors reject, preserve track and allow a later retry", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle HTTP failures do not become usable tracks", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: disabled native tracks expose empty cue arrays without throwing", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle track failure is reported and obsolete callbacks are removed", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: constructor and URL setter failures notify without unhandled promises", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=false", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=true", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: failed track insertion restores the old live track and releases the attempted URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: cleanup failure after track commit does not revoke the committed URL", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: srt conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: ass conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle remains visible through real native fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: native subtitle cues, offset, styles and show contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle latest request wins and cancelled calls settle", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle pending completion cannot replace track after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "published: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: srt conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: ass conversion reaches native cues with original callback binding", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: video fullscreen signal rebuilds track kind while retaining its URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle remains visible through real native fullscreen", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle cues, offset, styles and show contracts", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle latest request wins and cancelled calls settle", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle pending completion cannot replace track after destroy", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle owns generated URLs and leaves caller URLs alive", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle cancellation settles before an ignored request or body finishes", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle conversion reentry preserves the newer operation and notice", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: active subtitle errors reject, preserve track and allow a later retry", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: subtitle HTTP failures do not become usable tracks", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: disabled native tracks expose empty cue arrays without throwing", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: native subtitle track failure is reported and obsolete callbacks are removed", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: constructor and URL setter failures notify without unhandled promises", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=false", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: reentrant track replacement keeps the winner when outer throws=true", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: failed track insertion restores the old live track and releases the attempted URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "subtitle-lifecycle.spec.js", + "title": "candidate: cleanup failure after track commit does not revoke the committed URL", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: native fullscreen uses a real gesture when the engine supports it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: proxy replacement preserves callback and node identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: i18n prototype fallback difference and custom keys are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: native fullscreen uses a real gesture when the engine supports it", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: proxy replacement preserves callback and node identity", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: i18n prototype fallback difference and custom keys are explicit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: native fullscreen uses a real gesture when the engine supports it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: proxy replacement preserves callback and node identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: i18n prototype fallback difference and custom keys are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: native fullscreen uses a real gesture when the engine supports it", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: proxy replacement preserves callback and node identity", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: i18n prototype fallback difference and custom keys are explicit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: native fullscreen uses a real gesture when the engine supports it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: proxy replacement preserves callback and node identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: i18n prototype fallback difference and custom keys are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "published: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: native fullscreen uses a real gesture when the engine supports it", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: SSR mounting preserves nodes, listeners, selectors and style ownership", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: proxy replacement preserves callback and node identity", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: icon access preserves descriptors and moves custom DOM into fresh wrappers", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: i18n prototype fallback difference and custom keys are explicit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "template-resources.spec.js", + "title": "candidate: fullscreen web retains DOM and CSS hooks through entry and exit", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: a delayed image follows the latest hover rather than the first request position", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: a delayed image follows the latest hover rather than the first request position", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: removing thumbnails revokes the scaled image and a replacement control can reload", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: image failure permits a retry through the same thumbnail configuration", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: a delayed image follows the latest hover rather than the first request position", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: a delayed image follows the latest hover rather than the first request position", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: removing thumbnails revokes the scaled image and a replacement control can reload", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: image failure permits a retry through the same thumbnail configuration", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "published: a delayed image follows the latest hover rather than the first request position", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: thumbnail cells follow the generated grid at row boundaries and on returning to the first cell", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: scaled internal thumbnails and public image results have distinct Blob URL owners", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: a delayed image follows the latest hover rather than the first request position", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: removing thumbnails revokes the scaled image and a replacement control can reload", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "thumbnails.spec.js", + "title": "candidate: image failure permits a retry through the same thumbnail configuration", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: subtitle object URL contains real VTT data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: download starts and removes its temporary anchor", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: subtitle object URL contains real VTT data", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: download starts and removes its temporary anchor", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate download releases the anchor even when click fails", + "engine": "chromium", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: subtitle object URL contains real VTT data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: download starts and removes its temporary anchor", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: subtitle object URL contains real VTT data", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: download starts and removes its temporary anchor", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate download releases the anchor even when click fails", + "engine": "firefox", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: subtitle object URL contains real VTT data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "published: download starts and removes its temporary anchor", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: subtitle object URL contains real VTT data", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate: download starts and removes its temporary anchor", + "engine": "webkit", + "status": "passed", + "retry": 0 + }, + { + "file": "utils.spec.js", + "title": "candidate download releases the anchor even when click fails", + "engine": "webkit", + "status": "passed", + "retry": 0 + } + ], + "reportSha256": "7680d91956eb325b915a97cfd1b475ccb17249139cb9711277e684cd4604848e", + "logSha256": "41c03464daad80ee49c35352d16856e70a49daa487da543c2e1e4d0f84fef651" + } + ], + "logs": { + "refactor/.cache/core21-final-editor-build.log": "74ef3d40ec0f3491718349ba61cbb71ec2190245cbe57096a393a572b7cdbd4d", + "refactor/.cache/core21-final-frozen-install.log": "6c4355aefae6e7424c2c297f62761dfc299278d0ca3e05a2196cc510d11aa1f7", + "refactor/.cache/core21-final-package-docs.log": "9a199a5f9aeecacdd7ecd45a3cb50f5550a68127a5d553e322405bdb207ae828", + "refactor/.cache/core21-final-package.log": "a82f946f21d009e52f15a2a31270af56f28234ae882fa9fe0a9e7fdfe7037f9e", + "refactor/.cache/core21-final-toolchain.log": "61e82b4af31ebf60b54a85030e46fc039b6de303f0c2ecf3308b9eb1bddd55d6" + }, + "resolvedFindings": [ + "BASE-TYPE-04", + "BASE-TYPE-05", + "BASE-TYPE-07", + "BASE-TYPE-08", + "BASE-TYPE-09", + "BASE-TYPE-10" + ], + "strategy": "Keep historical root/legacy/types/i18n consumption; optional runtime entry exposes accurate types on identical JS constructors. Source and public declarations remain separate; generated public graph contains no implementation imports.", + "limits": [ + "This is the core declaration task. Core accessibility, full core acceptance, remaining ecosystem packages and release review rounds are not completed by it.", + "Historical inaccurate type acceptance remains intentional at the old entry; precise accessor reads/writes require TypeScript 5.1.6 or the tested current compiler.", + "Constructor host types describe available fields, not arbitrary caller mutation or a usable instance after caller-triggered early destroy.", + "Windows Playwright Chromium/Firefox/WebKit are actual browser evidence, not physical Apple/AirPlay/touch/IME validation. BASE-ENV-01 and REL-03/REVIEW-02 device gates remain.", + "No remote CI, npm publication, push, tag, merge or full-goal completion is asserted." + ] +} diff --git a/refactor/baselines/runtime-entry-partial.json b/refactor/baselines/runtime-entry-partial.json new file mode 100644 index 000000000..7da6f6ef8 --- /dev/null +++ b/refactor/baselines/runtime-entry-partial.json @@ -0,0 +1,1420 @@ +{ + "task": "CORE-21", + "status": "partial-runtime-entry-validated", + "capturedAt": "2026-09-11T09:11:22.617Z", + "parentCommit": "ee895a558ff0c8a62274eb64049cedfd8409112d", + "publicSources": { + "packages/artplayer/public/artplayer.cts": "0e91e907d021db02a68004603e6190505fdc0806d873ebb6af171aa089a81da7", + "packages/artplayer/public/artplayer.mts": "f6292596a9ccb1d43a6d6a12c35f859b1889ad15924c5ae0f9f280941aade313", + "packages/artplayer/public/artplayer.ts": "26a42ac66811e70f68a8ebe62cbf304eb1993451b3e658961be98e7106162527", + "packages/artplayer/public/component.ts": "aa1c43be67322781b4b355b143bc69d9f29d22e578e4974d6a13e957a7c0334f", + "packages/artplayer/public/config.ts": "c4fd8681bf32b10c743e3e561c532520c8f32e43fd765524850b15e55cb91c72", + "packages/artplayer/public/cssVar.ts": "e027d82fb4f01c9ce7559cf679b2d5ee1962d3f7e5b4dd64ca21f472b933efb6", + "packages/artplayer/public/emitter.ts": "9c62551cdcc6dd3966bed8a7a85dd477435db977c91a294d2ac8f162f9592537", + "packages/artplayer/public/events.ts": "af191f862af4ec8933b09113b8c074603ae254a8b70460d0f3006646cd74ae42", + "packages/artplayer/public/i18n.ts": "3e14759caf71f97f01650839248c8737c42d2c2979dabc43ad92b724da648708", + "packages/artplayer/public/icons.ts": "0d8e8e52e52130dd4a29bab551dd7a2a954797e42e92a6e068c85d583e23e6a4", + "packages/artplayer/public/language.cts": "2248040d86a8e34626755c4ecf53ea0174706c653073cf0e15884a030d173120", + "packages/artplayer/public/language.mts": "c391e863012c77769e661afbf8fa949e9373aa88d17f58cbba7f5696edb8077f", + "packages/artplayer/public/legacy/language.ts": "c452ffd764ff9b29b819b3475c42395d2ea7a33560d8c186ef5df3844b9524c3", + "packages/artplayer/public/option.ts": "850e5264219b8b438c80694402225b690b131786677a5da0d22739ec2352d263", + "packages/artplayer/public/playback.ts": "1ceaed3aa1cef511fe8b20f4874647f6065c723ad805b742a0a9247e16bb1bb5", + "packages/artplayer/public/player.ts": "f1e50257df2ea592d0a0e1f36078dda77eaf2cf3b3d795307501396562d99f28", + "packages/artplayer/public/plugin.ts": "2a57e148fda00ee687da5036b890b0f611cb94bb403a1ed52602179060259d35", + "packages/artplayer/public/quality.ts": "7ed6ed78cea52991b2f6ddd2bd3b7bd8c5146fdfff7486fe8b814c3e632f1567", + "packages/artplayer/public/runtime/component.ts": "840213299c942fe058eb5436977ceec066b9dccda24c55ae9f464b399c979e39", + "packages/artplayer/public/runtime/events.ts": "52848f57d35eb1037cf74c8877521edf99a015bcd77f30ef6bbcba1807a99bfe", + "packages/artplayer/public/runtime/media.ts": "8828f80953aec3e95328cefe691661e8897cb27cb309483cf806ec45a8549ae3", + "packages/artplayer/public/runtime/option.ts": "63e17cb649c376eaa656509a43e0150ee7c761b322598c1ae3c66c35317b4ec7", + "packages/artplayer/public/runtime/player.ts": "a4a24794e26cfb9e4310bf0f459a7a407e85bf81b4f3a4feb6294331af8036fb", + "packages/artplayer/public/runtime/plugin.ts": "9ad482f2a77914a91450419680b8af6b314b926f0831c2f7f6d7c466690f95c9", + "packages/artplayer/public/runtime/services.ts": "8e4648d8c61bff47343f9e1c2b995af69fc00947264b826109ceadcbaf553254", + "packages/artplayer/public/runtime/setting.ts": "c48d20957b57f79f985ef76a2950cc8a5cfa25dafa8ec5939e562661778e6218", + "packages/artplayer/public/runtime/subtitle.ts": "13241c4f9a87517aa2cf7b3e0bb8cedaa12fa0b4d3f8934285797583b752557e", + "packages/artplayer/public/runtime/template.ts": "fc89de2168efa957cb6d592a91f0fe92d001de28adebe2f9ec8f59038c32789d", + "packages/artplayer/public/runtime/utils.ts": "eb30718e7f17b9f8806ff1718053908e8efa04c1bcf1dadb2aaebf8669093867", + "packages/artplayer/public/runtime.cts": "ed081d4c51ebffe4aa9ff5d6e4b78a344a03115df4c3bf21c7acecb06851aa9b", + "packages/artplayer/public/runtime.mts": "1b09bc0ee0f0ee2f788689eaff441bdeda1fab0ce783e71b61b9792d81072b03", + "packages/artplayer/public/runtime.ts": "73812f56a9386407b16db0a8fbaa2d655e504ef6a382636d1298c035d975aced", + "packages/artplayer/public/setting.ts": "d12a75b656fff70cbb30be4bffec46d9c4273636e8722bce971a4d2b188712a1", + "packages/artplayer/public/subtitle.ts": "d25b470e47d6a9bd696d9c1ad8adb58e56a208f05695186d513bc8c43c2e8acf", + "packages/artplayer/public/template.ts": "68aed9e97d006d6be4fabb8504ca84dafab770b0925f4d6e7319e67c82f21b0d", + "packages/artplayer/public/utils.ts": "494ec447ab467a07ddd7a2c2abf778b3fce69fd28a09aaa8ced9759f8de2e3f6" + }, + "declarations": { + "packages/artplayer/types/artplayer.d.cts": "3685065e4263abcfd9d953176e461d5b3eb990b0363b54689a7f55deba770fef", + "packages/artplayer/types/artplayer.d.mts": "b664fec51ee5c5381f2ceab25d99d52aee56feab04a2ee7b4ea5b2145ea5fa0e", + "packages/artplayer/types/artplayer.d.ts": "5d0162adf7ac6d0f2bb9b5cfe361f28657c4d9c540cadbf36eba3cc954ce50f8", + "packages/artplayer/types/component.d.ts": "ae5bc1ddeaa1ee1ebbc62573e32423993727079205c64751a5a314170e588a32", + "packages/artplayer/types/config.d.ts": "36f9a84cd436f17701a0d11d3417fc1fe0414e0c52c80083b94a85dfc329e37e", + "packages/artplayer/types/cssVar.d.ts": "93217860fff2ebf750f606d95ddd22220a58837119e63bdf2f5f78fd7488458b", + "packages/artplayer/types/emitter.d.ts": "7e1f9a2a8ce65feb95734f1ed52d1334e57aa388bbef2a43d8bc53a9b6f6623c", + "packages/artplayer/types/events.d.ts": "f83624c9268a284477e8bd793fe3562a2363b72f2a44d5c64fe8c6a6cede8830", + "packages/artplayer/types/i18n.d.ts": "bebbe372d9b22443e75e0c0cea05bd52e8a44c1f82ce656d278a100a21a85b57", + "packages/artplayer/types/icons.d.ts": "326a67ba7bdcf52862c5b2a269e540140aff98d05c7b96196485a77f84fe5960", + "packages/artplayer/types/language.d.cts": "f7928e108cf7b7814c2d75cb0a525333e95873fca6cd6d89a740450656b9c1cd", + "packages/artplayer/types/language.d.mts": "6619a26d604b7cccbe2f596243d87ae37cfaae33b8b52874ec071d9787446f9e", + "packages/artplayer/types/legacy/language.d.ts": "c7abda4d506fd933c350e9030290bf9e64347a921d683a66115da1995ebe0a81", + "packages/artplayer/types/option.d.ts": "ccf2c8ddc537dc65c9682d39f044726e23bff18f476b622512d7e6a4b949b5f6", + "packages/artplayer/types/playback.d.ts": "58705c273df6e76a77a6575e769a9ec6c013785c25080f2551aa22415788d870", + "packages/artplayer/types/player.d.ts": "92b00211b70ac71336e495899df972a0519dd138111846044fe4e0f967966177", + "packages/artplayer/types/plugin.d.ts": "fc3594a41c51d8248713e33c486fb1f6a518ac5c7ce31be6988a6cd8d052c5f3", + "packages/artplayer/types/quality.d.ts": "1ac1a48b4f74ff9ba1ce60443e1463d50d1c6a2e5d87d63dc7d2a8eb7f4c2c34", + "packages/artplayer/types/runtime/component.d.ts": "1b4c0cee44568649e80140fe778febfcae88af0ac85515f1cbeff78ab0c6d14f", + "packages/artplayer/types/runtime/events.d.ts": "a1e2f9d387475453eaf95c2a5ee79e228636c0bb859bda3fcc46da46574a0c31", + "packages/artplayer/types/runtime/media.d.ts": "8fc89401be7fe25542c169d07dd5675f10916ed20be8493e19695966cf3864a8", + "packages/artplayer/types/runtime/option.d.ts": "eb165f37a813a82a5d1b6b79ee69193d32d9f1e6f7c57477a6ecded14cdda963", + "packages/artplayer/types/runtime/player.d.ts": "8ac6383502e4872e83659838844856903031a81a0adc8e8535feb78453aa042c", + "packages/artplayer/types/runtime/plugin.d.ts": "8528f2b17843149f42f9cc16d6fd70baa238c9dc2c329b67d2c38096799c69bd", + "packages/artplayer/types/runtime/services.d.ts": "604c9f8e4b6c0da818f96576bf9f4b0e96085a9003927b2f7ba30027b1ba237e", + "packages/artplayer/types/runtime/setting.d.ts": "349c1fcb205ad312916bd3ee55e6bf241ea8a569fb2ab6c80822e69fc518f7d7", + "packages/artplayer/types/runtime/subtitle.d.ts": "269ff84678d327b3a9dc2f5bc6cc0d731d1e081b85422e474621d5d792efb153", + "packages/artplayer/types/runtime/template.d.ts": "0a50302e89c493c81eaac5229ed08a5d9be6c41a3877c7bec8885b8fbc31603c", + "packages/artplayer/types/runtime/utils.d.ts": "3bcc9f07b77e2e92f1cdcd4e0602b966d8c862d136ca1f583812435439e59f70", + "packages/artplayer/types/runtime.d.cts": "6b215d67a413e7321d7b372d6d87fb1c121598c5acebcd360630f2c4646d5113", + "packages/artplayer/types/runtime.d.mts": "dcb85f59a8b7714918ced0c1d18c2bb24e8b80b56d8c594e019dcbdb5ad88b08", + "packages/artplayer/types/runtime.d.ts": "cc8db1f24b90aff8352ef7a5713a5d64660cdc0dacbb8c2af0c671749cd3f6cd", + "packages/artplayer/types/setting.d.ts": "08305a75dff96f06490430e099338b463df471b550c1d0dac3abc8995b39eb09", + "packages/artplayer/types/subtitle.d.ts": "b18314e2d64efdb6045830b6e12f615ae2ed585416130e562329ad3ea337f6ce", + "packages/artplayer/types/template.d.ts": "4792bc0c2cbcb7966e4375118bd34b326166e0831862e94ace4cf6b1bbe6a8c8", + "packages/artplayer/types/utils.d.ts": "fca0d3d814df94a25f9eb067c86fa0cf272e2791bac793b91229d57680797712" + }, + "tooling": { + "package.json": "2c236efde35c0e087a9b68cd141758a591e274e6265ea2fcf7f686df8d36ac52", + "yarn.lock": "8409a098c8c5d8899038588241643de809716746c70388cc7477c93dbbaeb168", + "scripts/build-types.mjs": "9146384edca4ab6d34bac7bfe4ab1f0022432066c852f5d4c008c06093c63d43", + "scripts/build-ts.js": "0f118cdcaba0aea5444f1100765a934343da5f5d3a2e4a32e78f0ac77dd5973f", + "scripts/typecheck.mjs": "6ca205ea93e080db538f1f4d4ec0901069eb67ee098bc896c008cada54730ad0", + "scripts/package-consumer.mjs": "824668e6b4c1a6917bb6b6f4d0261be5b1b549f2d4e686b37cebff74de0db8f6", + "scripts/package-check.mjs": "a6d53bd1be63f65685d2bbba9e29cd4f557d30970343635323ededf95223c652", + "test/package/runtime.cjs": "5973b860d377de22354fb597e602354cca7bff6b615a1e3a01747330a557c071", + "test/browser/runtime-types.spec.js": "05a1f6fd3ed1d7f78a3a8b80e42e7bdb27211f228346f2f85cca9df8dd4b4ed6", + "test/types/runtime-public.ts": "d9f329d7e80a2569dbe59ce83a0f133d25a7ec700bba299fd1db310e169da13f", + "test/types/runtime-commonjs.cts": "66517d93d7d4b3e0770aa5a38d0a25fe34e796456426f35c0a47fdeef3ccfc11", + "test/types/runtime-facade.ts": "e33da4f2a2043c007ac4e1e9a48f134b2b3f7980fc71c8988e7b06f8bee465bf" + }, + "ci": { + "passed": 448, + "productionTypeScript": 229, + "logSha256": "46dc9259d58fce2eb55a1b2c4eedc006848df1e396d4a6fedac1b756caf53f4f" + }, + "packageOutput": "refactor/.cache/packages/run-heewv5", + "packageReportSha256": "80c56f7ea81e03b822b04389a14d67e16959f93f86bf7ad60aa388efb38a789a", + "packages": [ + { + "name": "artplayer", + "version": "5.4.1", + "archive": "artplayer.tgz", + "sha256": "23aef31f6e67c9f4750345d7ce56a8619e7656688fc0e3d370281215e74babd5", + "files": { + "package/ARCHITECTURE.md": "a98a73f68fe7b0f0b59360490208bb53dca2c9044334c6c7df9a1b5d13c9693a", + "package/README.md": "1e185e65f67fc2081b4182bbc6c4558ea05b6e3fa3acc5dd0c3ac7df1d542b09", + "package/THIRD_PARTY_NOTICES": "b77b5b46b79fa0cda850b0781f78c3b1112c4ed9672fa291956fe8eff53098e7", + "package/dist/artplayer.cts": "0e91e907d021db02a68004603e6190505fdc0806d873ebb6af171aa089a81da7", + "package/dist/artplayer.js": "5787d082246f7adbc630a0461637d9a597394ba7cd97bcd5bf48924e9699d99f", + "package/dist/artplayer.legacy.js": "45afe957849bcc2a2b81ed3a7b55f8f16530bf9b6a719c34f67f5befea1bd7ae", + "package/dist/artplayer.mjs": "91f38811f121c244177d81e3c440b4c5f27756145f974a8e5a58e49e793370d9", + "package/dist/artplayer.mts": "f6292596a9ccb1d43a6d6a12c35f859b1889ad15924c5ae0f9f280941aade313", + "package/dist/artplayer.ts": "26a42ac66811e70f68a8ebe62cbf304eb1993451b3e658961be98e7106162527", + "package/dist/component.ts": "aa1c43be67322781b4b355b143bc69d9f29d22e578e4974d6a13e957a7c0334f", + "package/dist/config.ts": "c4fd8681bf32b10c743e3e561c532520c8f32e43fd765524850b15e55cb91c72", + "package/dist/cssVar.ts": "e027d82fb4f01c9ce7559cf679b2d5ee1962d3f7e5b4dd64ca21f472b933efb6", + "package/dist/emitter.ts": "9c62551cdcc6dd3966bed8a7a85dd477435db977c91a294d2ac8f162f9592537", + "package/dist/events.ts": "af191f862af4ec8933b09113b8c074603ae254a8b70460d0f3006646cd74ae42", + "package/dist/i18n.ts": "3e14759caf71f97f01650839248c8737c42d2c2979dabc43ad92b724da648708", + "package/dist/i18n/ar.js": "5885c469efc9f07aafd6a4aa6698edae2c2683f42497ebbe15374130f9b6e2c7", + "package/dist/i18n/ar.mjs": "a275cf39ae2317ea1cea73b65ba5451a909b34a881d35920391cef2ff0d6a86f", + "package/dist/i18n/cs.js": "5adef10fadb219948eb5e58e204207ca0afdd2dd941a08d9455fd302ef2447cc", + "package/dist/i18n/cs.mjs": "2d274b61c2be9a472a3cc19dfa775e6209867f8d1d5a9116923f075446f47969", + "package/dist/i18n/es.js": "4c6662edce1398d0fe285978df83b271cce23e4f24e0e6a9d24a5b8a6845839b", + "package/dist/i18n/es.mjs": "09c0806a979feb4ae0e3ff32dbee9fd435847d3a66f80b6768ff69ab63289696", + "package/dist/i18n/fa.js": "db37cade9454df0b829c514e088d4d9175199faaff2b4a7838e6a401741131fe", + "package/dist/i18n/fa.mjs": "83290582155ee2a7a08a8c9cf8c2903545e78260e81a2a091092f3fbe61b4dd0", + "package/dist/i18n/fr.js": "54eee11fdf245e9882cb1f440f8909ccb8112f2e10722447cb313cab4752abea", + "package/dist/i18n/fr.mjs": "621844a04365da3d9e5d225d64e233d322cb9fd9c1ffcc2db77e5d7e0e78ea8e", + "package/dist/i18n/id.js": "5d4ee91a123c417b5b2e84890d85f416444389bdcd12c40d49073e1061796463", + "package/dist/i18n/id.mjs": "ffca08de9515704ef160dd902534df4b4113ff3f62b37f70330264d27daf5c34", + "package/dist/i18n/pl.js": "47e0d39623896436722439c758488ec660752c56a0294375bf0fce4f3b2aa27b", + "package/dist/i18n/pl.mjs": "05fbb3b2d09b44b5d3a237ea35a1f6865d45c2985e32b517dec4a00670cddebc", + "package/dist/i18n/ru.js": "3af3b15b1554579352b9b1ecfc8ac27abb584a5af9bcc7a8369a813c55df8834", + "package/dist/i18n/ru.mjs": "12281df03fc45c40ab8ad2a7dd8bbbab35f086dadd7e51f35e27826fff16e1ce", + "package/dist/i18n/tr.js": "0f8da88d4f770d9ec2e83311bbd6cc6ecfc0b2bbb3997f8db8eea8b795746967", + "package/dist/i18n/tr.mjs": "ea533927a7f32b3124177e87d9d5adbd279dc80efca7b11ad94696b3b47f7e94", + "package/dist/i18n/vi.js": "e3302f5c90f3e7df4bf8667c17598d0e46b66b31aab0d94fa70f3e617b5277c0", + "package/dist/i18n/vi.mjs": "f7a0ce8d821bff93354be31922a73be854a685e14170e8875cd5375f155e8737", + "package/dist/i18n/zh-tw.js": "13446c81dccf57e6b5d2be0a55b8ef6a668c6b8005ef4a497439557d6ccb16ec", + "package/dist/i18n/zh-tw.mjs": "730ae246aef8cffb34d7ba3b48aefab38fa812cf84ea7ebbd827f8639ee7eba7", + "package/dist/icons.ts": "0d8e8e52e52130dd4a29bab551dd7a2a954797e42e92a6e068c85d583e23e6a4", + "package/dist/language.cts": "2248040d86a8e34626755c4ecf53ea0174706c653073cf0e15884a030d173120", + "package/dist/language.mts": "c391e863012c77769e661afbf8fa949e9373aa88d17f58cbba7f5696edb8077f", + "package/dist/legacy/language.ts": "c452ffd764ff9b29b819b3475c42395d2ea7a33560d8c186ef5df3844b9524c3", + "package/dist/option.ts": "850e5264219b8b438c80694402225b690b131786677a5da0d22739ec2352d263", + "package/dist/playback.ts": "1ceaed3aa1cef511fe8b20f4874647f6065c723ad805b742a0a9247e16bb1bb5", + "package/dist/player.ts": "f1e50257df2ea592d0a0e1f36078dda77eaf2cf3b3d795307501396562d99f28", + "package/dist/plugin.ts": "2a57e148fda00ee687da5036b890b0f611cb94bb403a1ed52602179060259d35", + "package/dist/quality.ts": "7ed6ed78cea52991b2f6ddd2bd3b7bd8c5146fdfff7486fe8b814c3e632f1567", + "package/dist/runtime.cts": "ed081d4c51ebffe4aa9ff5d6e4b78a344a03115df4c3bf21c7acecb06851aa9b", + "package/dist/runtime.mts": "1b09bc0ee0f0ee2f788689eaff441bdeda1fab0ce783e71b61b9792d81072b03", + "package/dist/runtime.ts": "73812f56a9386407b16db0a8fbaa2d655e504ef6a382636d1298c035d975aced", + "package/dist/runtime/component.ts": "840213299c942fe058eb5436977ceec066b9dccda24c55ae9f464b399c979e39", + "package/dist/runtime/events.ts": "52848f57d35eb1037cf74c8877521edf99a015bcd77f30ef6bbcba1807a99bfe", + "package/dist/runtime/media.ts": "8828f80953aec3e95328cefe691661e8897cb27cb309483cf806ec45a8549ae3", + "package/dist/runtime/option.ts": "63e17cb649c376eaa656509a43e0150ee7c761b322598c1ae3c66c35317b4ec7", + "package/dist/runtime/player.ts": "a4a24794e26cfb9e4310bf0f459a7a407e85bf81b4f3a4feb6294331af8036fb", + "package/dist/runtime/plugin.ts": "9ad482f2a77914a91450419680b8af6b314b926f0831c2f7f6d7c466690f95c9", + "package/dist/runtime/services.ts": "8e4648d8c61bff47343f9e1c2b995af69fc00947264b826109ceadcbaf553254", + "package/dist/runtime/setting.ts": "c48d20957b57f79f985ef76a2950cc8a5cfa25dafa8ec5939e562661778e6218", + "package/dist/runtime/subtitle.ts": "13241c4f9a87517aa2cf7b3e0bb8cedaa12fa0b4d3f8934285797583b752557e", + "package/dist/runtime/template.ts": "fc89de2168efa957cb6d592a91f0fe92d001de28adebe2f9ec8f59038c32789d", + "package/dist/runtime/utils.ts": "eb30718e7f17b9f8806ff1718053908e8efa04c1bcf1dadb2aaebf8669093867", + "package/dist/setting.ts": "d12a75b656fff70cbb30be4bffec46d9c4273636e8722bce971a4d2b188712a1", + "package/dist/subtitle.ts": "d25b470e47d6a9bd696d9c1ad8adb58e56a208f05695186d513bc8c43c2e8acf", + "package/dist/template.ts": "68aed9e97d006d6be4fabb8504ca84dafab770b0925f4d6e7319e67c82f21b0d", + "package/dist/utils.ts": "494ec447ab467a07ddd7a2c2abf778b3fce69fd28a09aaa8ced9759f8de2e3f6", + "package/package.json": "82e92699e7c29847f32ac6767ece0401290e7d7a12854722bdbcfd09b90b7954", + "package/types/COMPATIBILITY.md": "72f619eb708e18040d12e0fbc5ce79f80bb22967687fa0d5afae6f2c6eae6d00", + "package/types/README.md": "9bc6610868e57210b880648b4676aed2fec56d184fefebd700711c8603679f26", + "package/types/artplayer.d.cts": "3685065e4263abcfd9d953176e461d5b3eb990b0363b54689a7f55deba770fef", + "package/types/artplayer.d.mts": "b664fec51ee5c5381f2ceab25d99d52aee56feab04a2ee7b4ea5b2145ea5fa0e", + "package/types/artplayer.d.ts": "5d0162adf7ac6d0f2bb9b5cfe361f28657c4d9c540cadbf36eba3cc954ce50f8", + "package/types/component.d.ts": "ae5bc1ddeaa1ee1ebbc62573e32423993727079205c64751a5a314170e588a32", + "package/types/config.d.ts": "36f9a84cd436f17701a0d11d3417fc1fe0414e0c52c80083b94a85dfc329e37e", + "package/types/cssVar.d.ts": "93217860fff2ebf750f606d95ddd22220a58837119e63bdf2f5f78fd7488458b", + "package/types/emitter.d.ts": "7e1f9a2a8ce65feb95734f1ed52d1334e57aa388bbef2a43d8bc53a9b6f6623c", + "package/types/events.d.ts": "f83624c9268a284477e8bd793fe3562a2363b72f2a44d5c64fe8c6a6cede8830", + "package/types/i18n.d.ts": "bebbe372d9b22443e75e0c0cea05bd52e8a44c1f82ce656d278a100a21a85b57", + "package/types/icons.d.ts": "326a67ba7bdcf52862c5b2a269e540140aff98d05c7b96196485a77f84fe5960", + "package/types/language.d.cts": "f7928e108cf7b7814c2d75cb0a525333e95873fca6cd6d89a740450656b9c1cd", + "package/types/language.d.mts": "6619a26d604b7cccbe2f596243d87ae37cfaae33b8b52874ec071d9787446f9e", + "package/types/legacy/language.d.ts": "c7abda4d506fd933c350e9030290bf9e64347a921d683a66115da1995ebe0a81", + "package/types/option.d.ts": "ccf2c8ddc537dc65c9682d39f044726e23bff18f476b622512d7e6a4b949b5f6", + "package/types/playback.d.ts": "58705c273df6e76a77a6575e769a9ec6c013785c25080f2551aa22415788d870", + "package/types/player.d.ts": "92b00211b70ac71336e495899df972a0519dd138111846044fe4e0f967966177", + "package/types/plugin.d.ts": "fc3594a41c51d8248713e33c486fb1f6a518ac5c7ce31be6988a6cd8d052c5f3", + "package/types/quality.d.ts": "1ac1a48b4f74ff9ba1ce60443e1463d50d1c6a2e5d87d63dc7d2a8eb7f4c2c34", + "package/types/runtime.d.cts": "6b215d67a413e7321d7b372d6d87fb1c121598c5acebcd360630f2c4646d5113", + "package/types/runtime.d.mts": "dcb85f59a8b7714918ced0c1d18c2bb24e8b80b56d8c594e019dcbdb5ad88b08", + "package/types/runtime.d.ts": "cc8db1f24b90aff8352ef7a5713a5d64660cdc0dacbb8c2af0c671749cd3f6cd", + "package/types/runtime/component.d.ts": "1b4c0cee44568649e80140fe778febfcae88af0ac85515f1cbeff78ab0c6d14f", + "package/types/runtime/events.d.ts": "a1e2f9d387475453eaf95c2a5ee79e228636c0bb859bda3fcc46da46574a0c31", + "package/types/runtime/media.d.ts": "8fc89401be7fe25542c169d07dd5675f10916ed20be8493e19695966cf3864a8", + "package/types/runtime/option.d.ts": "eb165f37a813a82a5d1b6b79ee69193d32d9f1e6f7c57477a6ecded14cdda963", + "package/types/runtime/player.d.ts": "8ac6383502e4872e83659838844856903031a81a0adc8e8535feb78453aa042c", + "package/types/runtime/plugin.d.ts": "8528f2b17843149f42f9cc16d6fd70baa238c9dc2c329b67d2c38096799c69bd", + "package/types/runtime/services.d.ts": "604c9f8e4b6c0da818f96576bf9f4b0e96085a9003927b2f7ba30027b1ba237e", + "package/types/runtime/setting.d.ts": "349c1fcb205ad312916bd3ee55e6bf241ea8a569fb2ab6c80822e69fc518f7d7", + "package/types/runtime/subtitle.d.ts": "269ff84678d327b3a9dc2f5bc6cc0d731d1e081b85422e474621d5d792efb153", + "package/types/runtime/template.d.ts": "0a50302e89c493c81eaac5229ed08a5d9be6c41a3877c7bec8885b8fbc31603c", + "package/types/runtime/utils.d.ts": "3bcc9f07b77e2e92f1cdcd4e0602b966d8c862d136ca1f583812435439e59f70", + "package/types/setting.d.ts": "08305a75dff96f06490430e099338b463df471b550c1d0dac3abc8995b39eb09", + "package/types/subtitle.d.ts": "b18314e2d64efdb6045830b6e12f615ae2ed585416130e562329ad3ea337f6ce", + "package/types/template.d.ts": "4792bc0c2cbcb7966e4375118bd34b326166e0831862e94ace4cf6b1bbe6a8c8", + "package/types/utils.d.ts": "fca0d3d814df94a25f9eb067c86fa0cf272e2791bac793b91229d57680797712" + } + }, + { + "name": "artplayer-plugin-chapter", + "version": "1.1.0", + "archive": "artplayer-plugin-chapter.tgz", + "sha256": "be2df1dd69a41bd322140ce7291592f844f818b5423c1ff42daf6aead7a93d01", + "files": { + "package/ARCHITECTURE.md": "20743bad87a174b0450e0d876b6aa6b2a9f47df296d479511ce7cc9298fdb57c", + "package/README.md": "b95400ff3d525621a15268bb56a2d353aacaaadefde7e735d7abd91a34edd96f", + "package/dist/artplayer-plugin-chapter.js": "6ac3dfe28f46084ac7caedd571b1a97dcee3cf9d708112f1b8bbd6566e1dc5c5", + "package/dist/artplayer-plugin-chapter.legacy.js": "6d9bff885412169e701670961aa00c2e46c4b42c9b9647ff4e6d198777d2a359", + "package/dist/artplayer-plugin-chapter.mjs": "26415cecab2c0198c566cef0232e20123413782d5bad7534a32939b3298617af", + "package/package.json": "24eec6907b3218439189adab6af3f932c1497c47c2d41209311c01042b07fd4f", + "package/types/artplayer-plugin-chapter.d.cts": "4f07514b37453cd6cea8e5aa28fa018ff31738e0d423c11a3b5eccd50ed30bcc", + "package/types/artplayer-plugin-chapter.d.mts": "610179754db36276e161a07bccf4eaba8b4480f053e716a2bcc5a1574871a171", + "package/types/artplayer-plugin-chapter.d.ts": "581aa2862e709601c87a23585f54a969ebd350be56a7469a31ff53f1311b578d" + } + } + ], + "runtimeChecks": [ + "DIST.cjs", + "DIST.cjs-legacy", + "DIST.esm", + "DIST.esm-default-only", + "DIST.esm-legacy", + "DIST.runtime-cjs-identity", + "DIST.runtime-esm-identity", + "DIST.runtime-legacy-identity", + "DIST.runtime-shared-statics", + "DIST.runtime-types-only", + "DIST.global-core", + "DIST.amd-core", + "DIST.global-core-legacy", + "DIST.amd-core-legacy", + "DIST.global-chapter", + "DIST.amd-chapter", + "DIST.global-chapter-legacy", + "DIST.amd-chapter-legacy", + "SSR.import-template", + "SSR.constructor-browser-only", + "SSR.custom-ua-umd-legacy", + "SSR.custom-ua-esm", + "DIST.i18n-cjs-esm-global", + "DIST.exports-boundary", + "DIST.direct-esm-file", + "EVENT.lazy-registry", + "EVENT.symbol-number-channels", + "EVENT.context-removal", + "EVENT.once-throw-consumed", + "EVENT.chain-context-arguments", + "EVENT.once-reentry", + "EVENT.dispatch-snapshot", + "EVENT.off-original-once", + "EVENT.throw-propagation" + ], + "types": [ + { + "compiler": "5.9.3", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "4.3.5", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/legacy/language.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/language.d.cts", + "node_modules/artplayer/types/language.d.mts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + } + ], + "preciseTypes": [ + { + "compiler": "5.9.3", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.9.3", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2016.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "node10-commonjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "nodenext-cjs", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "bundler-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + }, + { + "compiler": "5.1.6", + "mode": "nodenext-esm", + "diagnostics": [], + "declarations": [ + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.decorators.legacy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.dom.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.collection.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.core.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.generator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.iterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.proxy.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.reflect.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2015.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.array.include.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2016.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2017.typedarrays.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asyncgenerator.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.asynciterable.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2018.regexp.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.array.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.object.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2019.symbol.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.bigint.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.date.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.intl.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.number.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.promise.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.sharedmemory.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.string.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es2020.symbol.wellknown.d.ts", + "D:/github/ArtPlayer/node_modules/typescript-runtime-compat/lib/lib.es5.d.ts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.cts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.mts", + "node_modules/artplayer-plugin-chapter/types/artplayer-plugin-chapter.d.ts", + "node_modules/artplayer/types/artplayer.d.cts", + "node_modules/artplayer/types/artplayer.d.mts", + "node_modules/artplayer/types/artplayer.d.ts", + "node_modules/artplayer/types/component.d.ts", + "node_modules/artplayer/types/config.d.ts", + "node_modules/artplayer/types/cssVar.d.ts", + "node_modules/artplayer/types/emitter.d.ts", + "node_modules/artplayer/types/events.d.ts", + "node_modules/artplayer/types/i18n.d.ts", + "node_modules/artplayer/types/icons.d.ts", + "node_modules/artplayer/types/option.d.ts", + "node_modules/artplayer/types/playback.d.ts", + "node_modules/artplayer/types/player.d.ts", + "node_modules/artplayer/types/plugin.d.ts", + "node_modules/artplayer/types/quality.d.ts", + "node_modules/artplayer/types/runtime.d.cts", + "node_modules/artplayer/types/runtime.d.mts", + "node_modules/artplayer/types/runtime.d.ts", + "node_modules/artplayer/types/runtime/component.d.ts", + "node_modules/artplayer/types/runtime/events.d.ts", + "node_modules/artplayer/types/runtime/media.d.ts", + "node_modules/artplayer/types/runtime/option.d.ts", + "node_modules/artplayer/types/runtime/player.d.ts", + "node_modules/artplayer/types/runtime/plugin.d.ts", + "node_modules/artplayer/types/runtime/services.d.ts", + "node_modules/artplayer/types/runtime/setting.d.ts", + "node_modules/artplayer/types/runtime/subtitle.d.ts", + "node_modules/artplayer/types/runtime/template.d.ts", + "node_modules/artplayer/types/runtime/utils.d.ts", + "node_modules/artplayer/types/setting.d.ts", + "node_modules/artplayer/types/subtitle.d.ts", + "node_modules/artplayer/types/template.d.ts", + "node_modules/artplayer/types/utils.d.ts" + ] + } + ], + "runtime": [ + { + "member": "package/dist/artplayer.js", + "sha256": "5787d082246f7adbc630a0461637d9a597394ba7cd97bcd5bf48924e9699d99f", + "sameAsCore20": true + }, + { + "member": "package/dist/artplayer.mjs", + "sha256": "91f38811f121c244177d81e3c440b4c5f27756145f974a8e5a58e49e793370d9", + "sameAsCore20": true + }, + { + "member": "package/dist/artplayer.legacy.js", + "sha256": "45afe957849bcc2a2b81ed3a7b55f8f16530bf9b6a719c34f67f5befea1bd7ae", + "sameAsCore20": true + } + ], + "browser": [ + { + "variant": "umd", + "stats": { + "startTime": "2026-09-11T09:09:33.857Z", + "duration": 3820.7709999999997, + "expected": 3, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "project": "chromium", + "version": "153.0.8010.12", + "artifact": "5787d082246f7adbc630a0461637d9a597394ba7cd97bcd5bf48924e9699d99f", + "passed": true + }, + { + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "project": "firefox", + "version": "155.0", + "artifact": "5787d082246f7adbc630a0461637d9a597394ba7cd97bcd5bf48924e9699d99f", + "passed": true + }, + { + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "project": "webkit", + "version": "26.6", + "artifact": "5787d082246f7adbc630a0461637d9a597394ba7cd97bcd5bf48924e9699d99f", + "passed": true + } + ], + "reportSha256": "c31eeeba3dbe3d6bf9420c8938c6db7a8318b1f37b03234c57e5210507938408" + }, + { + "variant": "legacy", + "stats": { + "startTime": "2026-09-11T09:09:51.949Z", + "duration": 3750.728, + "expected": 3, + "skipped": 0, + "unexpected": 0, + "flaky": 0 + }, + "cases": [ + { + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "project": "chromium", + "version": "153.0.8010.12", + "artifact": "45afe957849bcc2a2b81ed3a7b55f8f16530bf9b6a719c34f67f5befea1bd7ae", + "passed": true + }, + { + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "project": "firefox", + "version": "155.0", + "artifact": "45afe957849bcc2a2b81ed3a7b55f8f16530bf9b6a719c34f67f5befea1bd7ae", + "passed": true + }, + { + "title": "precise declarations: actual return values and callback receivers agree with the installed view", + "project": "webkit", + "version": "26.6", + "artifact": "45afe957849bcc2a2b81ed3a7b55f8f16530bf9b6a719c34f67f5befea1bd7ae", + "passed": true + } + ], + "reportSha256": "84f062ce9c4d023e7da04c8b5abcd13652e080c06c12f15dddd464091042e78a" + } + ], + "historicalRuntimeEvidence": { + "file": "refactor/baselines/entry-validation.json", + "sha256": "aae482bd142b6964850804262fd49f5ca96d122cbf8f4d7ae70786c3724a5bd5", + "scope": "CORE-20 full browser matrix; runtime artifact bytes verified identical, not a new full matrix run" + }, + "limits": [ + "Task remains doing; six type risks remain open pending complete declaration/editor acceptance.", + "Proxy and component constructor callback hosts still require initialization-stage review.", + "build:ts excludes the new runtime facade; its existing concatenation and editor semantic validity remain unverified.", + "These browser runs cover the new precise contract only, three projects per UMD/legacy; no new full browser matrix is claimed.", + "No npm publication, push, tag, merge or completed-task commit." + ] +} diff --git a/refactor/changes/2026-09-11-CORE-21-public-declarations.md b/refactor/changes/2026-09-11-CORE-21-public-declarations.md new file mode 100644 index 000000000..cd8303421 --- /dev/null +++ b/refactor/changes/2026-09-11-CORE-21-public-declarations.md @@ -0,0 +1,97 @@ +# CORE-21 公开声明生成与兼容视图 + +从 ee895a55 接续;CORE-20 已独立提交,开始时工作区干净。下文保留各阶段当时的进展与限制,最终结果见末尾验收章节;阶段快照不替代最终证据。 + +## 范围和约束 + +既有 default/named、CJS/ESM/legacy/i18n、TS 4.3.5 和模块扩展入口必须继续有效。类型源码、生成的声明和编辑器文件应有明确来源;内部实现路径及测试文件不能进入 npm 声明依赖。CORE-20 的安装包证据固定旧声明,本任务改变包内容后必须重新验收。 + +BASE-TYPE-04/05/07/08/09/10 包括同步插件注册、timer 返回、setting 返回、cue 数组、notice、只写命令、template/icons 和 PiP 的历史声明冲突。不能把不相容返回写成交叉类型,不能用运行时包装或增加虚构 getter 迎合错误声明。先保留旧合法消费,再明确准确视图的入口与取舍;本任务完成前不能继续把这些差异推迟而不提供方案。 + +## 声明生成第一阶段 + +以 packages/artplayer/public/ 作为公开声明的 TypeScript 源。先等价迁移现有定义及 CJS/ESM/语言桥,保留共享身份和扩展位置,由固定 TypeScript 编译器输出至历史 types/ 路径。public/ 不进入发布包;实际实现仍是 src/。这只是生成与兼容基础,不代表这些旧定义已经准确描述全部运行时。 + +生成流程必须支持只读检查,禁止以一次自动重写隐藏漂移;错误源、过期产物和意外实现 import 应使检查失败。包构建/打包消费和 CI 接入同一流程;docs 编辑器声明生成需另行核实实际依赖图,不能继续依靠删除 import 后拼接字符串。 + +未新增依赖或变更版本,使用固定 Node 24.21.0、Yarn 1.22.22、TypeScript 5.9.3,旧消费者继续用 4.3.5。下一步实现生成器,验证原声明消费者,再逐项完成精确类型策略、包内容及编辑器回归。 + +## 生成基础验证 + +固定编译器已生成 22 个原路径文件,包含 CJS/ESM 桥及旧语言回退。public/artplayer.ts 使用 ambient class 和 default 标识符导出,维持同一类型身份;CJS 的值、实例别名与 namespace 合并明确保留。编译器会移除普通行注释,生成桥的必要 lint 合并说明由生成器标头提供,不关闭其他文件的规则。 + +新增 build:types/check:types;CI 只读验证生成状态,ci:build 与隔离 package 构建先生成。严格类型检查及五组旧消费者通过,CI 448 项通过(418 单元、5 工程、25 基线),229 个生产 TS 文件。生成器负例覆盖缺失/过期产物、错误源不覆盖已有文件、内部实现 import 拒绝和不生成 JS。随后追加 public/src/node_modules 包泄漏负例,两个 package-check 测试及对应 lint 通过。未删除或放宽旧消费者断言。 + +run-GY8u71 初次实际安装包通过 29 项运行时与五组类型,public/ 未进入包;此后 README/ARCHITECTURE.md 更新,所以它仅为生成基础阶段证据,不能代替最终包验收。当前没有改变播放器运行时代码。[阶段证据](../baselines/core-declarations-generation.json) 固定声明源、生成文件、脚本、日志和编译器探针;任务保持开放。 + +## 访问器约束与下一步 + +真实编译器探针确认精确 undefined getter/number setter 在 4.3.5 报 TS2380,而 5.9.3 通过;写入扩大为 number|undefined 才能通过 4.3.5,但会改变类型接受范围。详见 [公共类型出口设计](../core-public-types.md) 及其官方语言依据。下一步优先实现并检验映射到同一 JS 产物的可选精确入口,保留全部旧入口及旧编译器支持。 + +目前未实现精确入口,也未完成六项类型差异与编辑器验收;任务保持 doing,未提交完成 commit。生成流程的成功不能作为类型已准确的证明。 + +## 精确模块与源码对应检查 + +public/runtime/ 已新增九个声明源模块:media、player、utils、plugin、template、subtitle、events、component、setting。它们描述实际只写属性、原生/proxy 结果、PiP、可空模板节点、图标 wrapper、同步/异步注册、timer/def 返回、notice、字幕及设置/控件结果。声明总数现为 31;构造器/包 exports 精确入口尚未接入,不能把这些模块当作已经可用的 artplayer/runtime import。 + +新增 runtime-player/utils/subsystems/events/components 类型夹具直接将真实源码属性或对应最小 Host 的子系统赋给公开接口,没有整实例双重断言。检查全部 Player 属性和 Utils 导出覆盖、默认图标名称、输入对象身份、回调 this、Promise 分支及拒绝错误读取。原生默认播放与 canvas/proxy 的结果分别建模。此阶段将模板 container 写为 HTMLElement 的假设不准确,后续已根据真实 DIV 校验纠正,见下文。 + +源码 CoreEvents 改为引用生成的精确事件契约,保留旧 Events 的自定义扩展并覆盖已知 builtin 错误。字幕更新数组和 video:error 的 Event、blur 的原事件、seek 的数字/字符串请求值都有正反例。仅模板字面量索引不能满足现有泛型 Host 对具名媒体事件的结构检查,因此显式保留具名原生事件映射;没有改写监听器实现。control/setting 的内部 blur payload 同步为 Event。 + +def 的首个严格负例发现标准库的 PropertyDescriptor 与 ThisType 组合仍会接受 primitive;精确视图增加 object 约束,仍由真实 Object.defineProperty 实现赋值证明。没有删除这个负例或用 void/交叉返回隐藏问题。 + +## 新增编译器与阶段验收 + +新增根 devDependency:typescript-runtime-compat = npm:typescript@5.1.6。它只验证现代精确声明的最低编译器点,不进入任何播放器运行依赖;5.9.3 继续开发/生成,4.3.5 继续旧入口回归。yarn.lock 仅新增该 alias 的五行固定解析与 integrity。首次 add 使用了不必要的 engine/platform/optional 忽略选项,随后已执行正常 frozen install(只跳过生命周期脚本)恢复标准解析,并通过严格工具链检查;这些忽略选项没有进入项目脚本或 CI。 + +七模块阶段的 CI 448 项、229 个生产 TS 检查、旧入口五组消费者及精确叶层 5.9.3/5.1.6 各四组解析通过。run-SIkzMV 阶段安装包通过 29 项运行时和五组旧类型,证明当前生成链能打包,不能代表完整精确入口。随后新增 component/setting,正在复验包含九模块的新阶段。旧生成基础和七模块报告保留历史快照,不覆盖它们。 + +下一步组装 runtime 构造器、option 与静态/实例门面,处理旧插件工厂接收者、Plugins/Events 扩展、设置回调与最小内部 Host 的关系。当前模块按 Host 参数检查实际子系统;内部最小 Host 并不等于公开回调真的只收到这些字段。对无法直接由结构赋值证明的旧声明边界,必须用明确的兼容输入方案和实际回调身份/消费者验证,不制造假的实例类型关系。全部六项风险和 CORE-21 仍保持开放。 + +## 精确构造器与安装包阶段 + +新增 runtime.ts/cts/mts 门面及 runtime/services、runtime/option,共 36 个声明文件。精确门面覆盖真实实例和静态成员;缺失/虚构成员分别有 keyof 负向覆盖,服务、存储、config、validator 与非回调配置直接赋值对照源码。static env/build 不在新视图中,存储原始 JSON 为 unknown,config 数组保持可变;字幕保留实际继承的 Component 成员并覆盖不同 update 返回。 + +artplayer/runtime 和 artplayer/runtime/legacy 的 JS 条件出口分别指向现有 modern/legacy 文件,runtime/types 为共享扩展入口。CJS 构造器值/实例/namespace 和 ESM 类型共享定义;旧入口不引入现代访问器语法。新旧插件/事件模块扩展均有正负例,旧 factory 通过明确输入重载接入,内联 add 回调推断完整实例;没有伪造新实例可赋给错误旧返回视图的关系。 + +浏览器专项纠正了三个初始测试假设:构造工厂运行时 plugins 尚未赋值;controls.add 缺少 position 会抛错;pause 会再显示提示,因此 notice 隐藏状态要在 pause 前取样。前两项同时改进精确声明:PluginFactory 的 PluginHost 将 plugins 标为可选,Controls.add/OptionInput.controls 使用要求 top/left/right 的 ControlInput。加入相应类型负例,旧根声明不收窄,运行时不改。其余 proxy/层/控件/设置构造回调的阶段宿主还需审查,不能宣布整个初始化类型已经精确。 + +初次入口 run-j7FG9r 为中间快照;当前 run-heewv5 的真实 tarball 通过 34 项运行时、五组旧类型、八组精确类型(5.1.6/5.9.3 各四模式)。旧 4.3.5 消费者继续通过,实际解析全部限制在临时安装目录与编译器标准库内。验证 CJS/ESM/legacy 新旧入口模块、构造器和实例集合身份相同,type-only 入口不能在运行时导入;public 源不泄漏,36 个声明与包内字节对应。 + +当前 CI 448 项、229 个生产 TS 检查通过;新增 UMD 与 legacy 安装产物专项各在 Chromium/Firefox/WebKit 通过,使用真实媒体 ready 和已发布 chapter 工厂,核对 this/参数、保留 option 工厂身份、同步/异步注册、只写读取、控件/设置/字幕/notice 和不存在的字段。三个运行时产物 SHA 与 CORE-20 一致;历史全量浏览器证据只按相同字节引用,不冒充本轮重新全量运行。[阶段证据](../baselines/runtime-entry-partial.json) 固定当前源、工具、生成声明、包文件、类型结果和浏览器摘要。 + +build:ts 排除了新增 runtime 根声明,避免把第二份门面拼入历史全局编辑器;该旧字符串拼接器的完整语义与生成流程仍未验收。下一步继续构造回调宿主和编辑器,六项类型风险与任务保持 doing;本轮没有完成任务 commit,也没有 push/publish/tag/merge。 + +## 构造阶段回调与编辑器生成 + +新增 public/runtime/construction.ts,声明总数 37。proxy 仅暴露已初始化的基础字段和 Emitter,不暴露尚不可用的 template/video/query/proxy getter。layers、controls、contextmenu 的构造输入回调按当时赋值顺序标记未来子系统可选;PluginHost 的 plugins 可选。直接组合 Player 而非对其做 Omit/Pick,避免映射类型丢失独立读写访问器。runtime-construction.ts 在工作区和真实安装消费者中检查这些边界及 seek 写入。 + +读取 urlMix 和 setting 调度实现后确认,customType 在 await wait 后执行,setting mounted 经过定时调度,二者接收完整实例。浏览器同时检查冻结发布包和候选的阶段字段及接收者身份。模板明确只接受 DIV,故修正精确 OptionInput/container 与 template.$container 的 HTMLElement 假设;非法 section 和配置 proxy 返回 undefined 均有反例。旧类型入口接受范围和运行时构造顺序保持。 + +核心 build:ts 不再剥离 import 后拼接声明。新增 scripts/editor-types.mjs 与 tsconfig.editor.json,以 dts-bundle-generator 9.5.1 读取旧 public/artplayer.ts 依赖图,再由 TypeScript AST 生成私有 ArtplayerDefinitions 命名空间及 Artplayer 构造器/实例/命名别名。直接打包 CJS 桥的早期探针产生自引用别名,因此未采用该输出;独立语义检查拒绝别名损坏、外部依赖、私有全局泄漏及错误泛型。TS 4.3.5 和 5.9.3 都检查,不使用 skipLibCheck。原插件编辑器输出未改变,SITE-02 仍负责全站/插件生成器改造。 + +新增根 devDependency dts-bundle-generator@9.5.1。它的 TypeScript 范围首次解析到 7.0.2;随即增加 dts-bundle-generator/typescript=5.9.3 的 Yarn resolution,正常安装去掉该临时图,生成器同时核对实际编译器身份。最终 frozen install --ignore-scripts --non-interactive 和严格工具链通过:Node 24.21.0、Yarn 1.22.22、22 workspaces、23 pinned tools、1343 dependency selectors。依赖不进入播放器运行包,编译器点继续为旧 4.3.5、精确最低 5.1.6、生成/当前 5.9.3。 + +新增 editor-types 工程用例:生成输出漂移检查、独立编译、损坏声明必须报错。新增真实 Monaco worker 用例:加载 vendored editor、编译生成声明和有效/无效代码、执行编译后的播放器并等待真实媒体 ready。构造/返回/Monaco 共 18 项三浏览器专项已通过,其阶段报告使用此前安装的运行时产物,不作为最新包内容的最终证据。 + +最新 runtime-public.ts 的安装消费者进一步检查 PiP 的 Element|null|boolean 读取与 boolean 写入、图标元素/可空节点、setting 对象身份/void、字幕 style 元素、def 目标身份、debounce/throttle 的 void 返回;正反例均在 5.1.6/5.9.3 各四模式运行。完整 CI 已通过 449 项(418 单元、6 工程、25 基线),229 个生产 TS 文件,37 个生成声明无漂移。最终包与全量浏览器验收继续执行。 + +## 最终验收与交接 + +CORE-21 完成。公开接口按实际职责拆为历史兼容源、精确媒体/播放器/组件/服务模块、构造阶段宿主和 CJS/ESM 桥;内部实现保持独立,不泄漏至 npm 声明图。新增运行时入口共享既有 JS 构造器;旧入口、TS 4.3.5、语言及旧插件接受范围保留。包内 ARCHITECTURE.md 与类型维护文档已同步实际实现,旧段落中的待 CORE-21 表述已清理。 + +| 验收项 | 已取得证据 | +| --- | --- | +| 严格检查 | CI 449 项,229 个生产 TS 文件,37 个生成声明无漂移;新增类型/浏览器夹具另行显式 lint 通过 | +| 安装消费 | 最终 run-LYDR8W:34 项运行时、五组旧类型、八组精确类型,零诊断;public/src/node_modules 不泄漏 | +| 浏览器 | UMD 1521 项、legacy 1521 项;各含 18 项构造/返回/编辑器检查,无失败、重试或跳过 | +| 实际环境 | Windows Chromium 153.0.8010.12、Firefox 155.0、WebKit 26.6;使用真实媒体与已安装包 | +| 产物对应 | 三个核心 JS 与 CORE-20 字节一致;最后打包仅更新 ARCHITECTURE.md、types/README.md、types/COMPATIBILITY.md,JS/类型与浏览器使用的 run-y0PLWJ 完全一致 | +| 编辑器 | TS 4.3.5/5.9.3 独立语义、生成漂移负例、真实 Monaco worker 编译并运行类型示例;vendored 资源指纹保留 | +| 依赖复现 | Yarn frozen 安装、严格工具链、开发 bundler 的 TypeScript resolution 与实际加载身份检查通过 | + +[最终验收证据](../baselines/core-declarations-validation.json) 保存全部源/声明/工具指纹、完整包文件、类型解析图、每个浏览器用例与报告指纹,以及文档重打包的差异。此前生成基础和 36 文件阶段 JSON 保持历史原样。 + +关闭 BASE-TYPE-04/05/07/08/09/10:实际类型使用可选 runtime 入口,历史入口保留既有接受范围;没有引入虚假交叉返回、运行时 Promise 包装或不存在的 getter。浏览器受控能力测试不等于物理 Apple/AirPlay/触摸/IME 认证,BASE-ENV-01 与 REL-03/REVIEW-02 门槛继续保留。全站及插件编辑器现代化由 SITE-02 负责,其余生态包、CORE-23 和 CORE-22 尚未完成。 + +本任务独立本地提交,包含实现、测试、文档、风险和任务状态;无 push/publish/tag/merge。回退时以 CORE-20 的 ee895a55 为父状态,对本任务 commit 做整体 revert,避免只回退生成声明而留下 manifest/编辑器/消费脚本不一致。下一步 CORE-23 键盘、焦点和可访问名称,随后 CORE-22 核心完整验收。 diff --git a/refactor/core-public-types.md b/refactor/core-public-types.md new file mode 100644 index 000000000..ffda24dde --- /dev/null +++ b/refactor/core-public-types.md @@ -0,0 +1,52 @@ +# CORE-21 公共类型出口设计 + +本页记录 CORE-21 的类型出口方案及验证过程。生成声明、安装消费和核心编辑器已验收;尚未发布 npm。最终结果见 [验收证据](baselines/core-declarations-validation.json)。 + +## 已验证的约束 + +根入口历史声明必须继续接受 test/types/declaration-legacy.ts 的旧消费者,包括已知不准确的 Promise/void、setting 返回及只写属性读取。替换这些返回会破坏已有 TS 代码;在原签名上增加一个虚假的交叉类型也不能解决实际值不同的问题。 + +固定编译器探针进一步确认:同一个属性声明为 `get seek(): undefined`、`set seek(value: number)`,TS 5.9.3 通过,4.3.5 报 TS2380。把 setter 扩成 `number | undefined` 虽可通过旧编译器,却额外允许并非原声明接受的写入;不能为了让编译器通过而机械扩宽所有命令输入。探针见本任务阶段证据。 + +[TypeScript 5.1 发布说明](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-1.html) 明确从该版本起允许显式注解的读写访问器使用不相关类型。这个语言限制与 ArtPlayer 的 JS 行为无关,不应通过制造运行时 getter 来处理。 + +## 已实施方案与验证要求 + +保留现有 `artplayer`、`artplayer/legacy`、`artplayer/types` 与语言入口的历史类型接受范围和 TS 4.3.5 验证。可选择的精确声明入口 `artplayer/runtime` 映射到同一已有 JS 构造器产物:它只改变所选类型视图,不创建第二个播放器、包装实例或重跑全局初始化。独立读写访问器需要 TS 5.1 语言特性,实际最低验证点为 5.1.6,当前编译器为 5.9.3。 + +旧入口不能引用新的现代声明,否则旧编译器仍会被迫解析它。也不能在旧根入口导出一个间接引用现代声明的类型别名。新入口与旧入口的构造器及实例运行时身份需要安装包内的 CJS/ESM/legacy 对照证明;用户继续使用旧 import 时无需改动。 + +精确公开声明仍从 public/ 的 TypeScript 源生成,不能直接发布 src/ 的整个内部图。通过源类型夹具逐项检查实际实现和公开视图的对应关系,尤其注意 getter/setter、可空节点、media-like proxy、插件工厂 this 和返回、事件泛型及链式 this;不能用整个实例双重断言当对应证明。 + +本任务逐项实现并留证的边界: + +- 插件注册同步/Promise 分支与旧插件工厂接收者:保持原注册身份,验证旧插件可接入及新内联回调有正确上下文推断。 +- toggle、timer、def、setting/subtitle/notice:分别提供实际结果,旧入口的历史错误仍明确记录,不假装已变成正确返回。 +- seek/forward/backward/switch/quality:精确入口读为 undefined,写入仍按对应运行时参数建模;拒绝仅为满足旧 TS 关系而扩宽。 +- template/icons、PiP、fullscreen、URL、option 与 static:区分真实能力、可空结果、可变配置和不存在的旧声明字段,不把初始化时的默认形状当永远成立。 +- 新入口的 Events/Plugins 扩展要到达正确共享定义;旧 `artplayer/types` 的扩展能力继续回归。 +- 新声明、旧声明、文档编辑器与 npm 路径保持明确依赖关系。SITE-02 负责整个编辑器/示例生成器现代化,但本任务引入的声明布局不能破坏当前 build:ts 或编辑器消费。 + +旧插件输入重载、新旧扩展关系、真实返回和安装入口身份已分别验证。六项类型风险按最终证据关闭;旧入口历史错误接受范围是明确的兼容保留,不宣称旧声明因此变得准确。 + +## 构造器入口阶段记录(36 文件快照) + +public/runtime.ts 组合 11 个精确叶模块,生成总数为 36 个声明文件。新增 artplayer/runtime 与 artplayer/runtime/legacy 的条件类型出口,分别重用已有 modern 与 legacy JS;artplayer/runtime/types 为共享扩展入口。CJS 桥使用 export =,ESM 桥共享类型定义,不新增运行时导出。 + +首轮真实 tarball run-j7FG9r 通过 34 项运行时、五组旧类型、八组精确类型检查(5.1.6/5.9.3 各四模式),包括 require/import/legacy 模块对象和构造器身份相同。后续新增 PluginHost、ControlInput,最终证据需重新生成,不能把初次 tarball 当当前声明验收。旧工厂有显式接收重载;旧 Plugins 已声明结果和 Events 自定义载荷传递至新共享接口,内联 add 回调保持精确推断。 + +浏览器专项先暴露测试错误假设:构造插件工厂运行时 art.plugins 尚未赋值;新 PluginFactory 改用 plugins 可选的 PluginHost,并加入负例。add 的内联工厂仍接收完整 Artplayer。控件 add 的 position 在运行时必填,ControlInput 现要求 top/left/right;更新已有条目仍可沿用原位置。另一个测试顺序问题是 pause 会更新 notice,验证隐藏状态必须在 pause 前取值,不能把后续提示当 getter 错误。 + +下一步继续审查 proxy、层、控件和设置在构造期间执行的回调宿主,区分当时已赋值的子系统;完成编辑器生成/语义消费与最终浏览器复验后才考虑关闭风险。build:ts 已避免把新 runtime 根声明拼入旧编辑器,但现有字符串拼接器和编辑器完整语义仍未验收。 + +## 构造阶段与编辑器实现(当前 37 文件) + +新增 runtime/construction.ts,按实际构造顺序描述 ProxyHost、LayerHost、ControlHost、ContextmenuHost 和 PluginHost。proxy 执行时 template 尚未赋值,不能暴露依赖 template/events 的 getter;组件 mounted 执行时未来子系统可选;构造插件执行时 plugins 可选。公开实例的身份不变,类型描述当时可用的字段。Player 必须直接继承,不能经过 Omit/Pick 映射后丢失独立 getter/setter 写入类型。 + +customType 在 url setter 的 await wait 后执行,setting mounted 也经过延迟调度,二者收到完整宿主;不能误认为它们在构造中同步运行。真实发布包与候选的浏览器快照分别核对字段可用性和接收者身份。容器运行时明确验证 DIV,精确输入和 template.$container 改为 HTMLDivElement;旧入口保持原接受范围。此前阶段记录中的 HTMLElement 假设已由源码及浏览器反例纠正。 + +核心编辑器生成改用 dts-bundle-generator 9.5.1 解析旧 public/artplayer.ts 依赖图,并用 TypeScript AST 构造私有定义命名空间和 Artplayer 全局/UMD 别名。拒绝未解析 import/export、重复/未知声明;生成结果同时经过 TS 4.3.5/5.9.3 的独立语义消费,不能解析回工作区。负例验证错误别名确实报错,私有定义不泄漏全局,泛型/构造器及命名类型仍有效。生成漂移纳入 test:node。 + +新增依赖只属于根开发工具;Yarn resolution 将 bundler 的 TypeScript 固定为已有 5.9.3,生成器核实实际加载同一编译器。固定工具链与正常 frozen install 已通过。docs Monaco 的真实 worker 编译生成声明、报告非法输入,再执行编译后的播放器示例并等待真实媒体 ready。插件编辑器生成仍保留原流程,整体 SITE-02 改造另行验收。 + +构造/精确返回与 Monaco 专项共 18 项三浏览器通过,并纳入最终 UMD/legacy 各 1521 项全量回归。CI 449 项、229 个生产 TS 文件、37 个声明生成检查通过;最终 run-LYDR8W 的 34 项运行时、五组旧类型、八组精确类型全部通过。浏览器使用 run-y0PLWJ 的安装字节,最后一次重打包仅修改三个 Markdown 文档;全量文件对照证明 JS/类型完全一致,两个包及声明源/脚本/Monaco 指纹均保存在最终证据中。 diff --git a/refactor/plan.md b/refactor/plan.md index f727de00b..779c54411 100644 --- a/refactor/plan.md +++ b/refactor/plan.md @@ -4,7 +4,7 @@ 基线:`40fcda6a37d0049d42e49c1e64e70d4fd9ba5f7f`。总任务 214 项,范围 22 个包及工作区/示例。 -状态:todo 158 / doing 0 / blocked 0 / done 56 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 +状态:todo 157 / doing 0 / blocked 0 / done 57 / deferred 0。风险 L/M/H 表示兼容风险,不表示工期。 前置依赖是启动条件;验收是完成条件。任务可以继续拆分,但不能复用或悄悄删除旧 ID。 @@ -124,7 +124,7 @@ | CORE-18 | artplayer
迁移内置插件和提示模块 | CORE-14, CORE-16, CORE-17 | autoPlayback/autoOrientation/fastForward/lock/miniProgressBar 及 info/notice/loading/mask | 默认启用条件、storage 格式、定时器/动画清理通过;结合 BASE-PERF-01 防止销毁后重新安排 notice timer;接续 BASE-TYPE-07 的 notice.show boolean getter 与历史读类型冲突 | M | done | | CORE-19 | artplayer
整理进度、质量、缩略图和截图 | CORE-10, CORE-13, CORE-16 | 相关 player/control 功能与纯计算分离 | 截图跨域失败、缩略图布局、quality/进度边界保持 | M | done | | CORE-20 | artplayer
收敛核心入口与依赖方向 | CORE-14, CORE-15, CORE-18, CORE-19 | Artplayer 门面、初始化依赖与最终目录 | 所有核心自有源码迁移,公开描述符/静态接口/事件差分通过 | H | done | -| CORE-21 | artplayer
生成核心声明并校验包内容 | CORE-20, ENG-07 | 由 TS 生成的既有入口声明与三种发布产物 | 内部类型不泄漏,旧 JS/TS 消费者与 i18n 通过;逐项完成 CORE-07 留下的 BASE-TYPE-04/05/07 声明方案,旧合法消费者与实际返回分别留证;不能以虚假的交叉返回类型或改变运行时来掩盖冲突,未决项阻止核心声明出口;处理 CORE-10 / BASE-TYPE-08 的 setter-only 属性虚构 getter 声明,并复核 PlaybackControls 精确视图与旧 toggle 声明共存策略 | H | todo | +| CORE-21 | artplayer
生成核心声明并校验包内容 | CORE-20, ENG-07 | 由 TS 生成的既有入口声明与三种发布产物 | 内部类型不泄漏,旧 JS/TS 消费者与 i18n 通过;逐项完成 CORE-07 留下的 BASE-TYPE-04/05/07 声明方案,旧合法消费者与实际返回分别留证;不能以虚假的交叉返回类型或改变运行时来掩盖冲突,未决项阻止核心声明出口;处理 CORE-10 / BASE-TYPE-08 的 setter-only 属性虚构 getter 声明,并复核 PlaybackControls 精确视图与旧 toggle 声明共存策略 | H | done | | CORE-23 | artplayer
检查并补齐键盘、焦点与可访问名称 | CORE-13, CORE-14, CORE-17, ENG-05, BASE-04 | 主要控件/设置/模式退出的键盘与焦点回归、名称和字幕可用性检查及必要兼容修正 | 保持旧快捷键和 DOM/CSS 钩子;真实浏览器验证,不以静态属性检查代替交互;处理 BASE-DOM-01 的主要控件 Tab 不可达,保留既有名称与快捷键 | H | todo | | CORE-22 | artplayer
核心阶段完整验收 | CORE-21, CORE-23, PILOT-01, ENG-08, ENG-10 | 核心与旧插件的可自动化完整回归、资源/性能及明确外部验证缺口 | 核心自动化和公开差异处置通过;真实环境缺口链接包集成/REL 门槛,阶段完成不代表可公开发布 | H | todo | @@ -455,6 +455,7 @@ - CORE-18: [记录](changes/2026-09-11-CORE-18-builtins-prompts.md) [记录](baselines/builtins-prompts-validation.json) - CORE-19: [记录](changes/2026-09-11-CORE-19-capture-thumbnails.md) [记录](baselines/capture-progress-validation.json) - CORE-20: [记录](changes/2026-09-11-CORE-20-entry.md) [记录](baselines/entry-validation.json) +- CORE-21: [记录](changes/2026-09-11-CORE-21-public-declarations.md) [记录](baselines/core-declarations-validation.json) [记录](core-public-types.md) [记录](typechecking.md) - PKG-CHAPTER-01: [记录](changes/2026-09-10-PKG-CHAPTER-01-contract.md) [记录](baselines/chapter-contract.md) - PKG-CHAPTER-02: [记录](changes/2026-09-10-PKG-CHAPTER-02-tests.md) [记录](baselines/chapter-validation.json) - PKG-CHAPTER-03: [记录](changes/2026-09-10-PKG-CHAPTER-03-typescript-modules.md) [记录](baselines/chapter-migration-validation.json) diff --git a/refactor/progress.md b/refactor/progress.md index 162ca0c97..e318059a4 100644 --- a/refactor/progress.md +++ b/refactor/progress.md @@ -1,5 +1,13 @@ # 进度与证据 +## 当前实施:CORE-21 公开声明生成与兼容视图完成 + +从 ee895a55 接续。公开声明源移至 packages/artplayer/public/,生成 37 个声明文件:22 个历史文件与精确模块/入口。新增 artplayer/runtime、runtime/legacy 和共享类型扩展入口,映射原有 JS 产物;build:types/check:types 已接入 CI 和隔离构建。旧入口继续支持 4.3.5,新精确入口验证 5.1.6/5.9.3 各四模式。核心自有源码 TS 迁移已在 CORE-20 完成,本任务完成公开类型出口与核心编辑器验收。 + +CI 449 项、229 个生产 TS 检查、37 个生成声明无漂移通过。最终隔离安装 run-LYDR8W 通过 34 项运行时、五组旧类型和八组精确类型;CJS/ESM/legacy 入口身份相同。UMD 与 legacy 各 1521 项三浏览器检查通过,各含 18 项构造/返回/Monaco 专项。浏览器使用 run-y0PLWJ 的实际安装字节,最后打包仅修改三个 Markdown 文档,JS/声明逐文件一致;三个核心 JS 与 CORE-20 字节一致。见 [最终证据](baselines/core-declarations-validation.json),先前阶段快照保持历史原样。 + +已完成 proxy/组件/插件构造阶段宿主,并纠正 DIV 容器及 customType 延迟执行的假设。核心编辑器使用依赖图打包和 AST 全局桥,独立 TS 4.3.5/5.9.3 语义检查及真实 Monaco worker 运行通过;冻结 Yarn 安装与严格工具链通过。关闭 BASE-TYPE-04/05/07/08/09/10,保留旧入口历史类型接受范围。214 项:57 done、157 todo,下一步 CORE-23 键盘/焦点/名称,然后 CORE-22 核心完整验收。详见 [设计](core-public-types.md) 与 [实施记录](changes/2026-09-11-CORE-21-public-declarations.md)。本任务独立本地提交,无推送或发布;真机门槛、其余生态包和多轮复盘仍待完成。 + ## 当前实施:CORE-20 核心入口与依赖收敛完成 核心全部 224 个自有源文件已迁移 TS,唯一 JS 为登记第三方 libs/screenfull.js。拆清入口、浏览器 bootstrap、DOM 叶层、实际属性/事件与初始化依赖;保持公开形状及顺序,修复构造/配置/AirPlay 销毁后继续安装和 proxy 挂载清理。 diff --git a/refactor/risk-table.md b/refactor/risk-table.md index de4d136b9..e564ce4ed 100644 --- a/refactor/risk-table.md +++ b/refactor/risk-table.md @@ -16,7 +16,7 @@ | BASE-TYPE-01 | resolved / 已复现 | NodeNext ESM 默认导出与声明互操作失配 | ENG-04, CORE-07, PKG-CHAPTER-04 | | BASE-TYPE-02 | resolved / 已复现 | chapter 可选运行时参数被声明为必填 | PKG-CHAPTER-02 | | BASE-TYPE-03 | resolved / 已复现 | chapter legacy 缺旧模块解析的声明回退 | ENG-04, PKG-CHAPTER-04 | -| BASE-TYPE-04 | open / 已复现 | plugins.add / toggle 的旧声明返回值与运行时不同 | CORE-07, CORE-08, CORE-10, CORE-21 | +| BASE-TYPE-04 | resolved / 已复现 | plugins.add / toggle 的旧声明返回值与运行时不同 | CORE-07, CORE-08, CORE-10, CORE-21 | | BASE-DIST-01 | open / 源码/产物事实 | thumbnail tool 分发入口与类型文件缺失 | PKG-TOOL-THUMB-01, PKG-TOOL-THUMB-04 | | BASE-PERF-01 | resolved / 已复现 | 销毁后的 resize 防抖重新创建 notice timer | CORE-17, CORE-04, CORE-18 | | BASE-SOURCE-01 | open / 源码/产物事实 | 工作区 5.4.1 与采集时真实发布 5.4.0 不同 | BASE-08, REL-01 | @@ -46,16 +46,16 @@ | BUILD-AMD-01 | resolved / 已复现 | AMD 全局导出补丁误将固定参数 t 当作全局对象 | ENG-06 | | UTIL-MERGE-01 | resolved / 已复现 | mergeDeep lets a JSON __proto__ key replace the result prototype | CORE-01 | | UTIL-DOWNLOAD-01 | resolved / 源码/产物事实 | Temporary download anchor remains if click throws | CORE-01 | -| BASE-TYPE-05 | open / 源码/产物事实 | Public Utils declarations omit exports and misstate timer/descriptor signatures | CORE-07, CORE-21 | +| BASE-TYPE-05 | resolved / 源码/产物事实 | Public Utils declarations omit exports and misstate timer/descriptor signatures | CORE-07, CORE-21 | | EVENT-NAME-01 | resolved / 已复现 | Emitter event names collide with Object.prototype | CORE-02 | | EVENT-ONCE-01 | resolved / 已复现 | Nested dispatch snapshots invoke the same once registration twice | CORE-02 | | BASE-TYPE-06 | resolved / 已复现 | Public Option requires url and excludes numeric control HTML accepted by existing JS | CORE-07 | -| BASE-TYPE-07 | open / 已复现 | Setting returns, subtitle contextual payloads and notice getter conflict with historical declarations | CORE-07, CORE-14, CORE-15, CORE-18, CORE-21 | -| BASE-TYPE-08 | open / 已复现 | Write-only player commands have fictitious public getter declarations | CORE-21 | +| BASE-TYPE-07 | resolved / 已复现 | Setting returns, subtitle contextual payloads and notice getter conflict with historical declarations | CORE-07, CORE-14, CORE-15, CORE-18, CORE-21 | +| BASE-TYPE-08 | resolved / 已复现 | Write-only player commands have fictitious public getter declarations | CORE-21 | | BASE-LIFE-07 | resolved / 已复现 | Queued reconnect survives source replacement and reloads the new resource | CORE-11 | | BASE-LIFE-08 | resolved / 已复现 | Ready continues after a control callback destroys the instance | CORE-11 | | BASE-I18N-01 | resolved / 已复现 | Missing prototype-named translations return inherited functions | CORE-12 | -| BASE-TYPE-09 | open / 源码/产物事实 | Template and icon declarations claim incompatible DOM and static shapes | CORE-21 | +| BASE-TYPE-09 | resolved / 源码/产物事实 | Template and icon declarations claim incompatible DOM and static shapes | CORE-21 | | BASE-LIFE-09 | resolved / 已复现 | Removed builtin controls retain subscriptions and progress drag effects | CORE-13 | | BASE-LIFE-10 | resolved / 已复现 | Component mounting and removal failures leave partial entries or recurse | CORE-13 | | BASE-LIFE-11 | resolved / 已复现 | Selector failures are unhandled and obsolete completion overwrites current UI | CORE-13 | @@ -78,7 +78,7 @@ | BASE-LIFE-19 | resolved / 已复现 | Video-only fullscreen survives player destruction and late entry | CORE-16 | | BASE-DOM-12 | resolved / 已复现 | PiP reports another video as active and WebKit ignores native presentation transitions | CORE-16 | | BASE-LIFE-20 | resolved / 已复现 | PiP survives destruction or late entry and rejected assignments become unhandled | CORE-16 | -| BASE-TYPE-10 | open / 已复现 | PiP getter is declared boolean but native runtime returns an element or null | CORE-16, CORE-21 | +| BASE-TYPE-10 | resolved / 已复现 | PiP getter is declared boolean but native runtime returns an element or null | CORE-16, CORE-21 | | BASE-DOM-13 | resolved / 已复现 | Mini exit loses the video's original parent and sibling position | CORE-16 | | BASE-LIFE-21 | resolved / 已复现 | Mini leaves a connected popup after player destruction | CORE-16 | | BASE-DOM-14 | resolved / 已复现 | Unready media sizing partially overwrites layout and emits NaN height | CORE-16 | diff --git a/refactor/risks.json b/refactor/risks.json index b9b2c9619..4cc83b70a 100644 --- a/refactor/risks.json +++ b/refactor/risks.json @@ -276,7 +276,7 @@ "id": "BASE-TYPE-04", "title": "plugins.add / toggle 的旧声明返回值与运行时不同", "confirmation": "reproduced", - "status": "open", + "status": "resolved", "owners": [ "CORE-07", "CORE-08", @@ -293,8 +293,15 @@ ], "compatibleResolution": "保留旧声明接受范围并协调精确重载/扩展,不静默把同步注册改成 async。", "closureCriteria": "返回值类型与运行时差异逐项说明,旧合法消费和拒绝传播回归通过。", - "scopeNote": "CORE-07 retains historical legal return assignments and records actual runtime separately; incompatible return tightening remains open through CORE-21. No release waiver.", - "playbackResolution": "CORE-10 adds assignable PlaybackControls with Promise | void toggle; legacy root void remains accepted. All five installed type modes pass. The overall facade and plugins.add conflict stay open through CORE-21." + "scopeNote": "Historical root inaccuracies remain intentional compatibility behavior; the optional runtime entry provides the accurate alternative validated by CORE-21.", + "playbackResolution": "Both the existing PlaybackControls view and the new runtime entry expose accurate playback results; old root acceptance remains unchanged.", + "resolutionRationale": "The optional runtime entry models sync registration as the original registry, Promise registration as Promise, and toggle as the actual play/pause result. Old root returns remain accepted. Installed module/constructor identity, old factories, rejection tests and all five legacy/eight precise consumer modes pass without runtime wrappers.", + "resolutionEvidence": [ + "refactor/baselines/core-declarations-validation.json", + "refactor/changes/2026-09-11-CORE-21-public-declarations.md", + "packages/artplayer/types/COMPATIBILITY.md", + "test/types/runtime-public.ts" + ] }, { "id": "BASE-DIST-01", @@ -791,7 +798,7 @@ "id": "BASE-TYPE-05", "title": "Public Utils declarations omit exports and misstate timer/descriptor signatures", "confirmation": "source-observed", - "status": "open", + "status": "resolved", "owners": [ "CORE-07", "CORE-21" @@ -807,7 +814,14 @@ ], "compatibleResolution": "Coordinate compatible public overloads/exports separately; use accurate strict types in migrated source.", "closureCriteria": "Cover missing unescape/ArtPlayerError, def identity/property keys, optional sleep, timer void returns and ignored debounce context; retain legal old consumers in new/old compilers.", - "scopeNote": "CORE-07 retains historical legal return assignments and records actual runtime separately; incompatible return tightening remains open through CORE-21. No release waiver." + "scopeNote": "Historical root inaccuracies remain intentional compatibility behavior; the optional runtime entry provides the accurate alternative validated by CORE-21.", + "resolutionRationale": "Generated runtime Utils covers actual exports, object/PropertyKey def target identity, optional sleep, timer void results and preserved receivers with ignored debounce context documented. Source correspondence, installed positive/negative consumers and real utility behavior pass; historical root signatures remain accepted.", + "resolutionEvidence": [ + "refactor/baselines/core-declarations-validation.json", + "refactor/changes/2026-09-11-CORE-21-public-declarations.md", + "packages/artplayer/types/COMPATIBILITY.md", + "test/types/runtime-public.ts" + ] }, { "id": "EVENT-NAME-01", @@ -883,7 +897,7 @@ "id": "BASE-TYPE-07", "title": "Setting returns, subtitle contextual payloads and notice getter conflict with historical declarations", "confirmation": "reproduced", - "status": "open", + "status": "resolved", "owners": [ "CORE-07", "CORE-14", @@ -900,14 +914,21 @@ ], "compatibleResolution": "Keep legacy consumers; add explicit cue-array listener overloads, type internal implementations accurately, and resolve remaining generated/public facade contracts at CORE-21 without false intersections.", "closureCriteria": "Actual setting/null/void and notice boolean returns, cue array callbacks and old legal type consumers all have an explicit compatible declaration strategy and package tests.", - "scopeNote": "CORE-07 provides runtime evidence and explicit cue-array overloads; old inferred scalar event callbacks and return signatures are not claimed corrected.", - "workspaceState": "CORE-14 source models item/null/void setting returns; CORE-15 source models cue arrays and string/null/undefined subtitle results. Historical public consumers and explicit array listener overloads still compile; scalar inference and public return facade coordination remain CORE-18/21. CORE-18 notice.ts now models a boolean getter and string/Error/false writes; source and retained public consumer fixtures are in test/types/notice.ts. Public precise-view coordination remains CORE-21." + "scopeNote": "Historical root inaccuracies remain intentional compatibility behavior; the optional runtime entry provides the accurate alternative validated by CORE-21.", + "workspaceState": "Generated runtime Setting/Subtitle/Notice expose item/null/void, cue-array contextual payloads and boolean notice reads independently from message writes. Installed consumers and real browser callbacks/returns pass. The historical root retains its old inference/returns and explicit array overloads rather than using false intersections.", + "resolutionRationale": "Generated runtime Setting/Subtitle/Notice expose item/null/void, cue-array contextual payloads and boolean notice reads independently from message writes. Installed consumers and real browser callbacks/returns pass. The historical root retains its old inference/returns and explicit array overloads rather than using false intersections.", + "resolutionEvidence": [ + "refactor/baselines/core-declarations-validation.json", + "refactor/changes/2026-09-11-CORE-21-public-declarations.md", + "packages/artplayer/types/COMPATIBILITY.md", + "test/types/runtime-public.ts" + ] }, { "id": "BASE-TYPE-08", "title": "Write-only player commands have fictitious public getter declarations", "confirmation": "reproduced", - "status": "open", + "status": "resolved", "owners": [ "CORE-21" ], @@ -920,7 +941,14 @@ "test/types/declaration-legacy.ts" ], "compatibleResolution": "Keep historical consumer acceptance, model source command reads as undefined, and provide an accurate public facade without inventing runtime getters.", - "closureCriteria": "seek/forward/backward/switch/quality reads and writes have an explicit accurate compatibility strategy validated against old TypeScript consumers and real package descriptors." + "closureCriteria": "seek/forward/backward/switch/quality reads and writes have an explicit accurate compatibility strategy validated against old TypeScript consumers and real package descriptors.", + "resolutionRationale": "The optional runtime entry exposes undefined reads and the actual write types for seek/forward/backward/switch/quality; TS 5.1.6/5.9.3 consumers verify independent accessors. Published/candidate descriptors and reads pass; historical TS 4.3.5 consumers and PlaybackControls remain accepted. No runtime getter was invented.", + "resolutionEvidence": [ + "refactor/baselines/core-declarations-validation.json", + "refactor/changes/2026-09-11-CORE-21-public-declarations.md", + "packages/artplayer/types/COMPATIBILITY.md", + "test/types/runtime-public.ts" + ] }, { "id": "BASE-LIFE-07", @@ -995,7 +1023,7 @@ "id": "BASE-TYPE-09", "title": "Template and icon declarations claim incompatible DOM and static shapes", "confirmation": "source-observed", - "status": "open", + "status": "resolved", "owners": [ "CORE-21" ], @@ -1006,7 +1034,14 @@ "refactor/changes/2026-09-11-CORE-12-template-resources.md" ], "compatibleResolution": "Keep old legal declarations accepted, expose accurate template and icon views without inventing runtime properties.", - "closureCriteria": "Old consumers and accurate template/media/icon view consumers pass all supported type modes and runtime shape checks." + "closureCriteria": "Old consumers and accurate template/media/icon view consumers pass all supported type modes and runtime shape checks.", + "resolutionRationale": "Generated runtime Template/Icons/MediaSurface model nullable SSR/query nodes, real icon wrappers, div container validation and static html placement. Constructor-stage host consumers reject premature getters; installed type modes and published/candidate shape/browser checks pass while old imports remain compatible.", + "resolutionEvidence": [ + "refactor/baselines/core-declarations-validation.json", + "refactor/changes/2026-09-11-CORE-21-public-declarations.md", + "packages/artplayer/types/COMPATIBILITY.md", + "test/types/runtime-public.ts" + ] }, { "id": "BASE-LIFE-09", @@ -1532,7 +1567,7 @@ "id": "BASE-TYPE-10", "title": "PiP getter is declared boolean but native runtime returns an element or null", "confirmation": "reproduced", - "status": "open", + "status": "resolved", "owners": [ "CORE-16", "CORE-21" @@ -1544,7 +1579,14 @@ ], "compatibleResolution": "Keep old legal JS return identities and historical public consumers; model the internal branch-dependent getter accurately and coordinate a compatible public declaration strategy in CORE-21.", "closureCriteria": "Public declaration strategy and installed JS/TS consumers explicitly cover native element/null and fallback boolean without silently narrowing old legal consumption.", - "workspaceState": "CORE-16 preserves historical native Element/null and WebKit boolean runtime returns with precise internal PipProperty. The installed old public consumers still pass; public declaration coordination remains CORE-21." + "workspaceState": "Generated runtime Player exposes native Element|null or WebKit boolean PiP reads and boolean writes. Installed positive/negative type consumers and native/fallback browser behavior pass, preserving original JS return identity and historical boolean declaration acceptance at the old root. Physical Apple/AirPlay certification remains a separate release gate.", + "resolutionRationale": "Generated runtime Player exposes native Element|null or WebKit boolean PiP reads and boolean writes. Installed positive/negative type consumers and native/fallback browser behavior pass, preserving original JS return identity and historical boolean declaration acceptance at the old root. Physical Apple/AirPlay certification remains a separate release gate.", + "resolutionEvidence": [ + "refactor/baselines/core-declarations-validation.json", + "refactor/changes/2026-09-11-CORE-21-public-declarations.md", + "packages/artplayer/types/COMPATIBILITY.md", + "test/types/runtime-public.ts" + ] }, { "id": "BASE-DOM-13", diff --git a/refactor/tasks.json b/refactor/tasks.json index 55898adf9..dbe2dcbf8 100644 --- a/refactor/tasks.json +++ b/refactor/tasks.json @@ -1153,11 +1153,16 @@ "CORE-20", "ENG-07" ], - "status": "todo", + "status": "done", "risk": "H", "deliverable": "由 TS 生成的既有入口声明与三种发布产物", "acceptance": "内部类型不泄漏,旧 JS/TS 消费者与 i18n 通过;逐项完成 CORE-07 留下的 BASE-TYPE-04/05/07 声明方案,旧合法消费者与实际返回分别留证;不能以虚假的交叉返回类型或改变运行时来掩盖冲突,未决项阻止核心声明出口;处理 CORE-10 / BASE-TYPE-08 的 setter-only 属性虚构 getter 声明,并复核 PlaybackControls 精确视图与旧 toggle 声明共存策略", - "evidence": [] + "evidence": [ + "changes/2026-09-11-CORE-21-public-declarations.md", + "baselines/core-declarations-validation.json", + "core-public-types.md", + "typechecking.md" + ] }, { "scope": [ diff --git a/refactor/typechecking.md b/refactor/typechecking.md index 3a5ccdb30..a467a6bdc 100644 --- a/refactor/typechecking.md +++ b/refactor/typechecking.md @@ -1,5 +1,25 @@ # 已实现的类型检查与迁移入口 +CORE-21 已完成声明与消费者验收。核心公开声明源已迁至 packages/artplayer/public/, +使用 yarn build:types 生成历史 types/ 路径;yarn check:types 只读检查漂移、 +源错误和内部依赖,已接入 ci:check。public/ 与 src/ 分别纳入严格检查, +public/ 不打入 npm 包。当前生成 37 个声明,精确构造器及阶段回调宿主已接入。 +核心编辑器从同一旧入口依赖图生成,并有独立 TS 4.3.5/5.9.3 语义检查和真实 Monaco 验证; +CI 449 项、229 个生产 TS 文件及最终安装包五组旧/八组精确类型通过, +UMD/legacy 各 1521 项三浏览器回归通过,见 core-public-types.md。 + +精确模块额外使用根开发 alias typescript-runtime-compat(npm:typescript@5.1.6) +验证当前/最低现代编译器的 Node10、NodeNext CJS/ESM 和 Bundler 四模式。 +它不替换生成编译器或旧入口 4.3.5 回归。runtime-leaf-consumer.ts 直接消费 +生成模块;runtime-public.ts/runtime-commonjs.cts 通过真实精确入口检查默认/CJS/legacy、 +回调、返回值和新旧模块扩展。安装包检查在仓库外重复五组旧类型及八组精确类型, +并禁止解析逃回工作区。runtime-facade.ts 检查源成员覆盖和服务对应, +其余 runtime 类型夹具逐项对照实现,不使用整实例双重断言来制造对应证明。 +runtime-construction.ts 同时在仓库和安装包检查 proxy/组件/插件的阶段宿主, +保留独立访问器写入,并区分延迟执行的完整 customType/setting 宿主。 +scripts/editor-types.mjs 负责核心编辑器依赖打包、AST 全局桥和独立编译; +test/editor-types.test.js 检查漂移及损坏输出,test/browser/editor-types.spec.js 验证实际 worker。 + PKG-CHAPTER-04 已修复核心/chapter 的条件类型入口、language 与 chapter legacy 回退。 当前五组编译模式均要求零诊断,覆盖默认/命名类型、legacy、语言与 CJS require 形式; 七条历史 NodeNext 诊断和打包额外四条诊断的候选豁免已移除,冻结发布基线不变。 diff --git a/scripts/build-ts.js b/scripts/build-ts.js index cf8deff1b..38f8f3d3f 100644 --- a/scripts/build-ts.js +++ b/scripts/build-ts.js @@ -2,6 +2,7 @@ import fs from 'node:fs' import path from 'node:path' import { ESLint } from 'eslint' import { glob } from 'glob' +import { generateCoreEditorDeclaration } from './editor-types.mjs' function ensureDirExists(filePath) { const dir = path.dirname(filePath) @@ -26,17 +27,8 @@ function parsePluginInfo(pluginPath) { } const reg = /^import.*$/gim -const artplayerTS = glob.sync('packages/artplayer/types/*.d.ts') const artplayerTSoutput = path.join('docs/assets/ts/artplayer.d.ts') - -let code = '' -for (let index = 0; index < artplayerTS.length; index++) { - const type = artplayerTS[index] - code += `${String(fs.readFileSync(type)).replace(reg, '')}\n` -} - -code.replace('export default ', '') -code += `export = Artplayer;\nexport as namespace Artplayer;\n` +const code = generateCoreEditorDeclaration() ensureDirExists(artplayerTSoutput) fs.writeFileSync(artplayerTSoutput, code.trim()) console.log(`✨ Built ${artplayerTSoutput}`); diff --git a/scripts/build-types.mjs b/scripts/build-types.mjs new file mode 100644 index 000000000..6ab279715 --- /dev/null +++ b/scripts/build-types.mjs @@ -0,0 +1,90 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import path from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' +import { ESLint } from 'eslint' +import ts from 'typescript' + +const workspace = fileURLToPath(new URL('../', import.meta.url)) +const normalize = value => value.replaceAll('\\', '/') + +export async function generateCoreDeclarations({ root = workspace, write = false } = {}) { + const packageRoot = path.join(root, 'packages/artplayer') + const sourceRoot = path.join(packageRoot, 'public') + const outputRoot = path.join(packageRoot, 'types') + const files = ts.sys.readDirectory(sourceRoot, ['.ts', '.mts', '.cts']).sort() + assert(files.length > 0, 'No public TypeScript sources found') + assert(files.every(file => !/\.d\.[cm]?ts$/.test(file)), 'Public sources must be TypeScript, not copied declaration artifacts') + const options = { + strict: true, + skipLibCheck: false, + types: [], + target: ts.ScriptTarget.ES2020, + lib: ['lib.es2020.d.ts', 'lib.dom.d.ts', 'lib.dom.iterable.d.ts'], + module: ts.ModuleKind.NodeNext, + moduleResolution: ts.ModuleResolutionKind.NodeNext, + declaration: true, + emitDeclarationOnly: true, + noEmitOnError: true, + rootDir: sourceRoot, + outDir: outputRoot, + newLine: ts.NewLineKind.LineFeed, + } + const outputs = new Map() + const program = ts.createProgram(files, options) + const formatHost = { getCurrentDirectory: () => root, getCanonicalFileName: name => name, getNewLine: () => '\n' } + const errors = ts.getPreEmitDiagnostics(program) + assert.equal(errors.length, 0, ts.formatDiagnosticsWithColorAndContext(errors, formatHost)) + for (const source of program.getSourceFiles()) { + if (program.isSourceFileDefaultLibrary(source)) + continue + assert(files.includes(source.fileName), `Public declarations depend on a non-public source: ${normalize(path.relative(root, source.fileName))}`) + } + const emitted = program.emit(undefined, (file, text) => { + const relative = normalize(path.relative(outputRoot, file)) + assert(!relative.startsWith('../') && !path.isAbsolute(relative) && /\.d\.[cm]?ts$/.test(relative), `Unexpected declaration output: ${file}`) + outputs.set(relative, text) + }) + assert.equal(emitted.emitSkipped, false, ts.formatDiagnosticsWithColorAndContext(emitted.diagnostics, formatHost)) + assert.equal(outputs.size, files.length, 'Each public source must emit one declaration') + + const eslint = new ESLint({ cwd: workspace, fix: true, fixTypes: ['layout'] }) + const generated = new Map() + for (const [relative, content] of outputs) { + const source = `public/${relative.replace('.d.', '.')}` + // Declaration emit omits line comments. This bridge intentionally merges + // the constructor value, instance alias and CJS named-type namespace. + const bridge = ['artplayer.d.cts', 'runtime.d.cts', 'runtime.d.ts'].includes(relative) ? '/* eslint-disable ts/no-redeclare -- Constructor, instance and named types share the export. */\n' : '' + const code = `// Generated from ${source} by yarn build:types. Do not edit.\n${bridge}${content}` + const [result] = await eslint.lintText(code, { filePath: path.join(workspace, 'packages/artplayer/types', relative) }) + if (result.errorCount) { + const formatter = await eslint.loadFormatter('stylish') + throw new Error(formatter.format([result])) + } + generated.set(relative, result.output || code) + } + const existing = ts.sys.readDirectory(outputRoot, ['.d.ts', '.d.mts', '.d.cts']) + for (const file of existing) + assert(generated.has(normalize(path.relative(outputRoot, file))), `Declaration has no public source: ${file}`) + const changed = [] + for (const [relative, text] of generated) { + const file = path.join(outputRoot, relative) + const actual = fs.existsSync(file) ? fs.readFileSync(file, 'utf8').replaceAll('\r\n', '\n') : null + if (actual === text) + continue + changed.push(relative) + if (write) { + fs.mkdirSync(path.dirname(file), { recursive: true }) + fs.writeFileSync(file, text) + } + } + assert(write || changed.length === 0, `Generated core declarations are stale: ${changed.join(', ')}. Run yarn build:types.`) + return { files: [...generated.keys()].sort(), changed } +} + +if (process.argv[1] && path.resolve(process.argv[1]) === fileURLToPath(import.meta.url)) { + assert(process.argv.length === 3 && ['--write', '--check'].includes(process.argv[2]), 'Use build-types.mjs --write or --check') + const result = await generateCoreDeclarations({ write: process.argv[2] === '--write' }) + console.log(`Core declarations ${process.argv[2]}: ${result.files.length} files; ${result.changed.length} changed`) +} diff --git a/scripts/editor-types.mjs b/scripts/editor-types.mjs new file mode 100644 index 000000000..fc30cc8c3 --- /dev/null +++ b/scripts/editor-types.mjs @@ -0,0 +1,143 @@ +import assert from 'node:assert/strict' +import { createRequire } from 'node:module' +import path from 'node:path' +import { fileURLToPath } from 'node:url' +import { generateDtsBundle } from 'dts-bundle-generator' +import ts from 'typescript' +import compat from 'typescript-compat' + +const root = fileURLToPath(new URL('../', import.meta.url)) +const factory = ts.factory + +/** Put flattened definitions in a private scope so public aliases cannot refer to themselves. */ +export function asGlobalDeclaration(code, globalName) { + assert(/^[A-Z_$][\w$]*$/i.test(globalName), 'Invalid editor global name') + const source = ts.createSourceFile('bundle.d.ts', code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS) + const exports = new Map() + const declarations = new Map() + const definitions = [] + for (const node of source.statements) { + if (ts.isExportDeclaration(node)) { + assert(!node.moduleSpecifier && node.exportClause && ts.isNamedExports(node.exportClause), 'Editor bundle must contain no unresolved exports') + for (const item of node.exportClause.elements) + exports.set(item.name.text, (item.propertyName || item.name).text) + continue + } + assert(ts.isInterfaceDeclaration(node) || ts.isTypeAliasDeclaration(node) || ts.isClassDeclaration(node), `Unsupported editor declaration: ${ts.SyntaxKind[node.kind]}`) + assert(node.name, 'Editor definitions must be named') + const name = node.name.text + assert(!declarations.has(name), `Duplicate bundled declaration: ${name}`) + declarations.set(name, node) + if (node.modifiers?.some(modifier => modifier.kind === ts.SyntaxKind.ExportKeyword)) + exports.set(name, name) + definitions.push(factory.replaceModifiers(node, [factory.createModifier(ts.SyntaxKind.ExportKeyword)])) + } + const defaultName = exports.get('default') + assert(defaultName && ts.isClassDeclaration(declarations.get(defaultName)), 'Core editor requires the actual default constructor class') + const definitionName = `${globalName}Definitions` + assert(!declarations.has(definitionName), 'Editor definition namespace collides with source') + const qualified = name => factory.createQualifiedName(factory.createIdentifier(definitionName), factory.createIdentifier(name)) + const aliases = [] + for (const [name, local] of exports) { + if (name === 'default') + continue + const declaration = declarations.get(local) + assert(declaration, `Missing bundled export: ${local}`) + const parameters = declaration.typeParameters + aliases.push(factory.createTypeAliasDeclaration( + [factory.createModifier(ts.SyntaxKind.ExportKeyword)], + name, + parameters, + factory.createTypeReferenceNode(qualified(local), parameters?.map(parameter => factory.createTypeReferenceNode(parameter.name))), + )) + } + const namespace = (name, nodes) => factory.createModuleDeclaration( + [factory.createModifier(ts.SyntaxKind.DeclareKeyword)], + factory.createIdentifier(name), + factory.createModuleBlock(nodes), + ts.NodeFlags.Namespace, + ) + const statements = [ + namespace(definitionName, definitions), + factory.createVariableStatement([factory.createModifier(ts.SyntaxKind.DeclareKeyword)], factory.createVariableDeclarationList([ + factory.createVariableDeclaration(globalName, undefined, factory.createTypeQueryNode(qualified(defaultName))), + ], ts.NodeFlags.Const)), + factory.createTypeAliasDeclaration(undefined, globalName, undefined, factory.createTypeReferenceNode(qualified(defaultName))), + namespace(globalName, aliases), + factory.createExportAssignment(undefined, true, factory.createIdentifier(globalName)), + factory.createNamespaceExportDeclaration(factory.createIdentifier(globalName)), + ] + const printer = ts.createPrinter({ newLine: ts.NewLineKind.LineFeed }) + return `// Generated from packages/artplayer/public/artplayer.ts by yarn build:ts. Do not edit.\n/* eslint-disable ts/no-redeclare, ts/no-namespace -- UMD constructor and named types share the global export. */\n${printer.printFile(factory.updateSourceFile(source, statements))}` +} + +export function generateCoreEditorDeclaration() { + const require = createRequire(import.meta.url) + const bundlerRequire = createRequire(require.resolve('dts-bundle-generator')) + assert.equal(bundlerRequire('typescript'), ts, 'Editor bundler must use the pinned workspace compiler') + const [code] = generateDtsBundle([{ + filePath: path.join(root, 'packages/artplayer/public/artplayer.ts'), + output: { exportReferencedTypes: false, noBanner: true }, + }], { preferredConfigPath: path.join(root, 'scripts/tsconfig.editor.json') }) + const declaration = asGlobalDeclaration(code, 'Artplayer') + for (const compiler of [ts, compat]) + assert.deepEqual(checkCoreEditorDeclaration(declaration, compiler), [], `Invalid editor declaration: TS ${compiler.version}`) + return declaration +} + +export function checkCoreEditorDeclaration(code, compiler = ts) { + const folder = path.join(root, 'refactor/.cache/editor-semantic') + const declaration = path.join(folder, 'artplayer.d.ts') + const sources = new Map([ + [declaration, code], + [path.join(folder, 'global.ts'), ` +const option: Artplayer.OptionInput = { container: '#player' } +const player: Artplayer = new Artplayer(option, function (art) { + const same: Artplayer = this + const other: Artplayer = art + void [same, other] +}) +const factory: Artplayer.PluginFactory = function (art) { + return { name: String(art.id + this.id) } +} +const plugins: Promise = player.plugins.add(factory) +const emitter: Artplayer.Emitter<{ value: [number] }> = new Artplayer.Emitter() +emitter.on('value', count => count.toFixed()).emit('value', 2) +const language: NonNullable = { Play: 'Play' } +const configuration: Artplayer.Config = Artplayer.config +// @ts-expect-error Private flattened definitions must not leak into the editor global scope. +const leaked: ArtplayerDefinitions.Config = Artplayer.config +// @ts-expect-error Required container is not optional. +new Artplayer({ url: '' }) +// @ts-expect-error Named aliases must not degrade to any through circular definitions. +const invalidOption: Artplayer.Option = { container: 123, url: '' } +// @ts-expect-error Plugin callback results retain the selected result type. +const invalidFactory: Artplayer.PluginFactory = () => 'bad' +// @ts-expect-error Generic event payloads stay checked. +emitter.emit('value', 'bad') +void [plugins, language, configuration, invalidOption, invalidFactory, leaked] +`], + [path.join(folder, 'module.ts'), ` +import Player = require('./artplayer') +const player: Player = new Player({ container: '#player' }) +const option: Player.OptionInput = { container: '#player' } +// @ts-expect-error The UMD export is the constructor, not a default wrapper object. +Player.default +void [player, option] +`], + ]) + const options = { strict: true, noEmit: true, skipLibCheck: false, types: [], target: compiler.ScriptTarget.ES2020, lib: ['lib.es2020.d.ts', 'lib.dom.d.ts'], module: compiler.ModuleKind.CommonJS, moduleResolution: compiler.ModuleResolutionKind.NodeJs } + const host = compiler.createCompilerHost(options) + const getSourceFile = host.getSourceFile.bind(host) + const exists = host.fileExists.bind(host) + const directoryExists = host.directoryExists.bind(host) + host.fileExists = file => sources.has(path.resolve(file)) || exists(file) + host.directoryExists = directory => path.resolve(directory) === folder || directoryExists(directory) + host.getSourceFile = (file, version, onError, create) => sources.has(path.resolve(file)) + ? compiler.createSourceFile(file, sources.get(path.resolve(file)), version, true) + : getSourceFile(file, version, onError, create) + const program = compiler.createProgram([...sources.keys()], options, host) + for (const file of program.getSourceFiles()) + assert(sources.has(path.resolve(file.fileName)) || program.isSourceFileDefaultLibrary(file), `Editor types escaped the standalone bundle: ${file.fileName}`) + return compiler.getPreEmitDiagnostics(program).map(diagnostic => ({ code: diagnostic.code, message: compiler.flattenDiagnosticMessageText(diagnostic.messageText, '\n') })) +} diff --git a/scripts/package-check.mjs b/scripts/package-check.mjs index 7e9f017dc..85c3ff9a1 100644 --- a/scripts/package-check.mjs +++ b/scripts/package-check.mjs @@ -25,7 +25,7 @@ export function checkFiles(manifest, files, historical = []) { visit(manifest.exports) for (const file of historical.filter(file => /^package\/(?:dist|types)\//.test(file))) assert(files.includes(file), `Historical distribution file removed: ${file}`) - assert(!files.some(file => /^package\/(?:src|node_modules)\//.test(file)), 'Source/dependencies leaked into package') + assert(!files.some(file => /^package\/(?:src|public|node_modules)\//.test(file)), 'Source/dependencies leaked into package') assert(!files.includes('package/tsconfig.json'), 'Implementation tsconfig leaked into package') } @@ -75,7 +75,7 @@ export async function checkPackages({ release = false } = {}) { const output = fs.mkdtempSync(path.join(parent, 'run-')) const snapshot = path.join(output, 'build') fs.mkdirSync(snapshot) - for (const file of ['package.json', 'yarn.lock', 'tsconfig.json', 'tsconfig.base.json']) fs.copyFileSync(path.join(workspace, file), path.join(snapshot, file)) + for (const file of ['package.json', 'yarn.lock', 'tsconfig.json', 'tsconfig.base.json', 'eslint.config.js']) fs.copyFileSync(path.join(workspace, file), path.join(snapshot, file)) fs.cpSync(path.join(workspace, 'types'), path.join(snapshot, 'types'), { recursive: true }) fs.cpSync(path.join(workspace, 'scripts'), path.join(snapshot, 'scripts'), { recursive: true }) fs.symlinkSync(path.join(workspace, 'node_modules'), path.join(snapshot, 'node_modules'), process.platform === 'win32' ? 'junction' : 'dir') @@ -83,7 +83,7 @@ export async function checkPackages({ release = false } = {}) { const source = path.join(workspace, 'packages', name) fs.cpSync(source, path.join(snapshot, 'packages', name), { recursive: true, filter: file => !['dist', 'node_modules'].includes(path.basename(file)) }) } - fs.writeFileSync(path.join(output, 'build.log'), run(['scripts/build.js', ...names], snapshot) + run(['scripts/build-i18n.js'], snapshot)) + fs.writeFileSync(path.join(output, 'build.log'), run(['scripts/build-types.mjs', '--write'], snapshot) + run(['scripts/build.js', ...names], snapshot) + run(['scripts/build-i18n.js'], snapshot)) const baseline = await publishedConsumer() const installed = consumerDirectory() try { @@ -118,11 +118,12 @@ export async function checkPackages({ release = false } = {}) { const runtime = runtimeConsumer(installed) assert.deepEqual(runtime.observations.api, oldRuntime.observations.api, 'Published API shape/defaults changed') const types = typeConsumers(installed) - const report = { task: 'ENG-07', capturedAt: new Date().toISOString(), node: process.versions.node, packages, runtime, publishedRuntime: oldRuntime, types, knownTypeBlockers: types.reduce((sum, result) => sum + result.diagnostics.length, 0) } + const preciseTypes = typeConsumers(installed, { precise: true }) + const report = { task: 'ENG-07', capturedAt: new Date().toISOString(), node: process.versions.node, packages, runtime, publishedRuntime: oldRuntime, types, preciseTypes, knownTypeBlockers: [...types, ...preciseTypes].reduce((sum, result) => sum + result.diagnostics.length, 0) } writeJson(path.join(output, 'report.json'), report) writeJson(path.join(output, 'browser-artifacts.json'), artifacts) writeJson(path.join(parent, 'latest.json'), { output: path.relative(workspace, output).replaceAll('\\', '/') }) - console.log(`Installed tarball contracts passed: ${runtime.checks.length} runtime checks; ${types.filter(t => !t.diagnostics.length).length}/${types.length} type modes. Report: ${output}`) + console.log(`Installed tarball contracts passed: ${runtime.checks.length} runtime checks; ${types.filter(t => !t.diagnostics.length).length}/${types.length} legacy type modes; ${preciseTypes.filter(t => !t.diagnostics.length).length}/${preciseTypes.length} precise type modes. Report: ${output}`) if (release) assert.equal(report.knownTypeBlockers, 0, 'Known type blockers remain; this candidate is not release-ready') return report diff --git a/scripts/package-consumer.mjs b/scripts/package-consumer.mjs index 38d02f752..52eaca6cf 100644 --- a/scripts/package-consumer.mjs +++ b/scripts/package-consumer.mjs @@ -7,6 +7,7 @@ import process from 'node:process' import { fileURLToPath } from 'node:url' import ts from 'typescript' import compat from 'typescript-compat' +import runtimeCompat from 'typescript-runtime-compat' export const workspace = fileURLToPath(new URL('../', import.meta.url)) export const names = ['artplayer', 'artplayer-plugin-chapter'] @@ -33,18 +34,21 @@ export function runtimeConsumer(dir, { baseline = false } = {}) { return JSON.parse(run(['runtime.cjs'], dir)) } -export function typeConsumers(dir) { +export function typeConsumers(dir, { precise = false } = {}) { const results = [] - for (const [compiler, mode] of [[ts, 'node10-commonjs'], [ts, 'nodenext-cjs'], [ts, 'bundler-esm'], [compat, 'node10-commonjs'], [ts, 'nodenext-esm']]) { + const matrix = precise + ? [ts, runtimeCompat].flatMap(compiler => ['node10-commonjs', 'nodenext-cjs', 'bundler-esm', 'nodenext-esm'].map(mode => [compiler, mode])) + : [[ts, 'node10-commonjs'], [ts, 'nodenext-cjs'], [ts, 'bundler-esm'], [compat, 'node10-commonjs'], [ts, 'nodenext-esm']] + for (const [compiler, mode] of matrix) { const next = mode.startsWith('nodenext') const extension = next ? (mode.endsWith('-cjs') ? 'cts' : 'mts') : 'ts' - const inputs = ['public', 'declaration-inputs', 'declaration-legacy', 'plugins-public', 'playback-public', 'chapter-options', 'chapter-exports', 'language-value', 'language', 'legacy-plugin'] + const inputs = precise ? ['runtime-public', 'runtime-construction'] : ['public', 'declaration-inputs', 'declaration-legacy', 'plugins-public', 'playback-public', 'chapter-options', 'chapter-exports', 'language-value', 'language', 'legacy-plugin'] if (mode === 'nodenext-cjs') - inputs.push('commonjs') + inputs.push(precise ? 'runtime-commonjs' : 'commonjs') const files = inputs.map((name) => { const file = path.join(dir, `${name}.${extension}`) const folder = ['language', 'legacy-plugin'].includes(name) ? 'refactor/fixtures/consumers' : 'test/types' - fs.copyFileSync(path.join(workspace, folder, `${name}.${name === 'commonjs' ? 'cts' : 'ts'}`), file) + fs.copyFileSync(path.join(workspace, folder, `${name}.${name.endsWith('commonjs') ? 'cts' : 'ts'}`), file) return file }) const options = { @@ -71,10 +75,10 @@ export function typeConsumers(dir) { line: d.file && d.start !== undefined ? d.file.getLineAndCharacterOfPosition(d.start).line + 1 : null, message: compiler.flattenDiagnosticMessageText(d.messageText, '\n').replaceAll(`${dir.replaceAll('\\', '/')}/node_modules/`, '/packages/'), })) - const expected = mode === 'nodenext-esm' ? readJson(path.join(workspace, 'test/types/known-diagnostics.json')).diagnostics : [] + const expected = !precise && mode === 'nodenext-esm' ? readJson(path.join(workspace, 'test/types/known-diagnostics.json')).diagnostics : [] const historical = readJson(path.join(workspace, 'refactor/baselines/consumers.json')).types const known = readJson(path.join(workspace, 'test/package/known-types.json')).cases - for (const fixture of ['language.ts', 'legacy-plugin.ts']) { + for (const fixture of precise ? [] : ['language.ts', 'legacy-plugin.ts']) { if (!known.some(item => item.fixture === fixture && item.mode === mode)) continue const original = historical.find(result => result.mode === mode && result.fixture === fixture) diff --git a/scripts/tsconfig.editor.json b/scripts/tsconfig.editor.json new file mode 100644 index 000000000..7beff2feb --- /dev/null +++ b/scripts/tsconfig.editor.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "strict": true, + "skipLibCheck": false, + "types": [], + "declaration": true, + "target": "ES2020", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "lib": ["ES2020", "DOM"], + "esModuleInterop": true + } +} diff --git a/scripts/typecheck.mjs b/scripts/typecheck.mjs index 6b810a4ff..06b132be8 100644 --- a/scripts/typecheck.mjs +++ b/scripts/typecheck.mjs @@ -5,6 +5,7 @@ import process from 'node:process' import { fileURLToPath } from 'node:url' import ts from 'typescript' import compat from 'typescript-compat' +import runtimeCompat from 'typescript-runtime-compat' const root = fileURLToPath(new URL('../', import.meta.url)) const relative = name => path.relative(root, name).replaceAll('\\', '/') @@ -48,6 +49,7 @@ export function runTypechecks() { const dependencies = read('package.json').devDependencies assert.equal(ts.version, dependencies.typescript) assert.equal(`npm:typescript@${compat.version}`, dependencies['typescript-compat']) + assert.equal(`npm:typescript@${runtimeCompat.version}`, dependencies['typescript-runtime-compat']) const configs = [path.join(root, 'tsconfig.json')] for (const name of fs.readdirSync(path.join(root, 'packages'))) { const config = path.join(root, 'packages', name, 'tsconfig.json') @@ -78,6 +80,16 @@ export function runTypechecks() { assert.deepEqual(checkConsumer(compiler, mode, fs.readFileSync(path.join(root, 'test/types/commonjs.cts'), 'utf8')), [], 'CommonJS export assignment consumer failed') console.log(`Consumers passed: TS ${compiler.version} ${mode}`) } + const runtimeFixtures = ['test/types/runtime-leaf-consumer.ts', 'test/types/runtime-public.ts', 'test/types/runtime-construction.ts'] + for (const compiler of [ts, runtimeCompat]) { + for (const mode of ['node10-commonjs', 'nodenext-cjs', 'bundler-esm', 'nodenext-esm']) { + for (const fixture of runtimeFixtures) + assert.deepEqual(checkConsumer(compiler, mode, fs.readFileSync(path.join(root, fixture), 'utf8')), [], `Runtime declarations failed: TS ${compiler.version} ${mode} ${fixture}`) + if (mode === 'nodenext-cjs') + assert.deepEqual(checkConsumer(compiler, mode, fs.readFileSync(path.join(root, 'test/types/runtime-commonjs.cts'), 'utf8')), [], `Runtime CJS export assignment failed: TS ${compiler.version}`) + console.log(`Runtime declaration consumers passed: TS ${compiler.version} ${mode}`) + } + } console.log(`TypeScript production source files checked: ${sourceCount}; unmigrated JS is not counted`) } diff --git a/test/browser/editor-types.spec.js b/test/browser/editor-types.spec.js new file mode 100644 index 000000000..7530f3557 --- /dev/null +++ b/test/browser/editor-types.spec.js @@ -0,0 +1,57 @@ +import { expect, test } from './fixtures.js' + +test('docs Monaco worker consumes generated core types and runs a typed player example', async ({ page }) => { + await page.goto('/test/player.html?core=candidate&chapter=published') + await page.addScriptTag({ url: '/assets/js/vs/loader.js' }) + const result = await page.evaluate(async () => { + window.require.config({ paths: { vs: '/assets/js/vs' } }) + await new Promise((resolve, reject) => window.require(['vs/editor/editor.main'], resolve, reject)) + const api = window.monaco + const types = api.languages.typescript + types.typescriptDefaults.setCompilerOptions({ target: types.ScriptTarget.ES2020, strict: true, skipLibCheck: false, noEmit: false, types: [], allowNonTsExtensions: true }) + const source = await (await fetch('/assets/ts/artplayer.d.ts')).text() + const libraryUri = 'file:///artplayer.d.ts' + const library = types.typescriptDefaults.addExtraLib(source, libraryUri) + const model = api.editor.createModel(` +const editorOption: Artplayer.OptionInput = { container: '.player', url: '/test/pattern.mp4', muted: true } +const editorArt: Artplayer = new Artplayer(editorOption) +const editorEvents: Artplayer.Emitter<{ value: [number] }> = new Artplayer.Emitter() +editorEvents.emit('value', 1) +`, 'typescript', api.Uri.parse('file:///consumer.ts')) + const invalid = api.editor.createModel('new Artplayer({ container: 123, url: "" })', 'typescript', api.Uri.parse('file:///invalid.ts')) + try { + const getWorker = await types.getTypeScriptWorker() + const worker = await getWorker(model.uri, invalid.uri) + const syntax = await worker.getSyntacticDiagnostics(model.uri.toString()) + const semantic = await worker.getSemanticDiagnostics(model.uri.toString()) + const declaration = await worker.getSemanticDiagnostics(libraryUri) + const bad = await worker.getSemanticDiagnostics(invalid.uri.toString()) + const output = await worker.getEmitOutput(model.uri.toString()) + if (syntax.length || semantic.length || declaration.length) + return { syntax, semantic, declaration, invalid: bad.map(item => item.code), ready: false } + const script = output.outputFiles.find(file => file.name.endsWith('.js')) + if (!script) + throw new Error('Monaco did not emit the typed example') + // eslint-disable-next-line no-new-func -- Execute the locally compiled editor fixture, as the demo's Run action does. + const art = new Function(`${script.text}\nreturn editorArt`)() + try { + if (!art.isReady) + await new Promise(resolve => art.on('ready', resolve)) + return { syntax, semantic, declaration, invalid: bad.map(item => item.code), ready: art.isReady && art.video.videoWidth > 0 } + } + finally { + art.destroy() + } + } + finally { + model.dispose() + invalid.dispose() + library.dispose() + } + }) + expect(result.syntax).toEqual([]) + expect(result.semantic).toEqual([]) + expect(result.declaration).toEqual([]) + expect(result.invalid.length).toBeGreaterThan(0) + expect(result.ready).toBe(true) +}) diff --git a/test/browser/runtime-types.spec.js b/test/browser/runtime-types.spec.js new file mode 100644 index 000000000..4024b42d5 --- /dev/null +++ b/test/browser/runtime-types.spec.js @@ -0,0 +1,169 @@ +import { expect, test } from './fixtures.js' + +for (const core of ['published', 'candidate']) { + test(`${core}: constructor callback hosts expose only initialized components`, async ({ page }) => { + await page.goto(`/test/player.html?core=${core}&chapter=published`) + const result = await page.evaluate(async () => { + const observations = [] + const receivers = [] + const names = ['template', 'events', 'storage', 'icons', 'i18n', 'notice', 'player', 'layers', 'controls', 'contextmenu', 'subtitle', 'info', 'loading', 'hotkey', 'mask', 'setting', 'plugins'] + const record = (phase, receiver, instance) => { + receivers.push(receiver) + observations.push({ phase, receiver: receiver === instance, fields: names.filter(name => Object.hasOwn(instance, name)) }) + } + let mounted + const settingMounted = new Promise(resolve => mounted = resolve) + let ready + const loaded = new Promise(resolve => ready = resolve) + const art = new window.Artplayer({ + container: '.player', + url: '/test/pattern.mp4', + type: 'fixture', + muted: true, + setting: true, + proxy(instance) { + record('proxy', this, instance) + return document.createElement('video') + }, + layers: [{ html: 'Layer', mounted() { record('layer', this, this) } }], + controls: [{ html: 'Control', position: 'left', mounted() { record('control', this, this) } }], + contextmenu: [{ html: 'Menu', mounted() { record('contextmenu', this, this) } }], + settings: [{ html: 'Setting', mounted() { + record('setting', this, this) + mounted() + } }], + plugins: [function (instance) { + record('plugin', this, instance) + return { name: 'phases' } + }], + customType: { fixture(video, url, instance) { + record('customType', this, instance) + video.src = url + } }, + }, function (instance) { + record('ready', this, instance) + ready() + }) + try { + await Promise.all([settingMounted, loaded]) + return { names, observations, complete: window.Artplayer.instances.includes(art), receivers: receivers.every(receiver => receiver === art) } + } + finally { + art.destroy() + } + }) + expect(result.complete).toBe(true) + expect(result.receivers).toBe(true) + const expected = { proxy: 0, layer: 7, control: 8, contextmenu: 9, plugin: 16, setting: 17, customType: 17, ready: 17 } + expect(result.observations.map(item => item.phase).sort()).toEqual(Object.keys(expected).sort()) + for (const item of result.observations) { + expect(item.receiver).toBe(true) + expect(item.fields, item.phase).toEqual(result.names.slice(0, expected[item.phase])) + } + }) + + test(`${core}: container validation rejects non-div elements`, async ({ page }) => { + await page.goto(`/test/player.html?core=${core}&chapter=published`) + const result = await page.evaluate(() => { + const container = document.createElement('section') + document.body.append(container) + try { + const player = new window.Artplayer({ container, url: '' }) + player.destroy() + return 'accepted' + } + catch (error) { + return error.message + } + finally { + container.remove() + } + }) + expect(result).toBe('Unsupported container element type, only support \'div\' but got \'section\'') + }) +} + +test('precise declarations: actual return values and callback receivers agree with the installed view', async ({ page }) => { + await page.goto('/test/player.html?core=candidate&chapter=published') + const result = await page.evaluate(async () => { + const Player = window.Artplayer + const container = document.querySelector('.player') + const callbacks = [] + let ready + const loaded = new Promise(resolve => ready = resolve) + const factory = function (instance) { + callbacks.push({ same: this === instance, registryAbsent: this.plugins === undefined }) + return { name: 'precise', update(value) { + return value + } } + } + const art = new Player({ + container, + url: '/test/pattern.mp4', + muted: true, + plugins: [factory, window.artplayerPluginChapter({ chapters: [{ start: 0, end: Infinity, title: 'Existing plugin' }] })], + }, function (instance) { + ready({ same: this === instance, inInstances: Player.instances.includes(instance) }) + }) + try { + const readyResult = await loaded + const sync = art.plugins.add(function (instance) { + callbacks.push({ same: this === instance, registry: this.plugins.art === instance }) + return { name: 'sync' } + }) + const pending = art.plugins.add(async function (instance) { + callbacks.push({ same: this === instance, registry: this.plugins.art === instance }) + return { name: 'async' } + }) + const asyncResult = await pending + const item = { name: 'typed-setting', html: 'Setting' } + const added = art.setting.add(item) + const updated = art.setting.update({ name: item.name, html: 'Updated' }) + const control = art.controls.add({ name: 'typed-control', html: 'Control', position: 'left' }) + const style = art.subtitle.style({ color: 'white' }) + art.notice.show = 'Visible' + const notice = art.notice.show + art.notice.show = false + const hidden = art.notice.show + const pause = art.pause() + const removed = art.setting.remove(item.name) + return { + ready: readyResult, + callbacks, + constructor: art.constructor === Player, + optionFactory: art.option.plugins[0] === factory, + registry: sync === art.plugins && asyncResult === art.plugins, + promiseBranch: pending instanceof Promise && !(sync instanceof Promise), + commandReads: ['seek', 'forward', 'backward', 'switch', 'quality'].every(name => art[name] === undefined), + setting: added === item && updated === item && removed === undefined && art.setting.find(item.name) === null, + control: control === undefined, + subtitle: style === art.template.$subtitle && Array.isArray(art.subtitle.cues) && Array.isArray(art.subtitle.activeCues), + notice: notice === true && hidden === false, + template: art.template.$container === container && !('html' in art.template) && typeof Player.html === 'string', + pause: pause === undefined, + absentStatics: !('env' in Player) && !('build' in Player), + chapter: typeof art.plugins.artplayerPluginChapter?.update === 'function', + } + } + finally { + art.destroy() + } + }) + expect(result).toEqual({ + ready: { same: true, inInstances: true }, + callbacks: [{ same: true, registryAbsent: true }, { same: true, registry: true }, { same: true, registry: true }], + constructor: true, + optionFactory: true, + registry: true, + promiseBranch: true, + commandReads: true, + setting: true, + control: true, + subtitle: true, + notice: true, + template: true, + pause: true, + absentStatics: true, + chapter: true, + }) +}) diff --git a/test/declarations.test.js b/test/declarations.test.js new file mode 100644 index 000000000..063890457 --- /dev/null +++ b/test/declarations.test.js @@ -0,0 +1,45 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +import os from 'node:os' +import path from 'node:path' +// eslint-disable-next-line test/no-import-node-test -- Declaration generation must reject drift and invalid public sources. +import { test } from 'node:test' +import { generateCoreDeclarations } from '../scripts/build-types.mjs' + +test('declaration checks reject stale output without overwriting it and recover through explicit generation', async () => { + const root = fs.mkdtempSync(path.join(os.tmpdir(), 'artplayer-declarations-')) + const folder = path.join(root, 'packages/artplayer') + fs.mkdirSync(path.join(folder, 'public'), { recursive: true }) + fs.mkdirSync(path.join(folder, 'types'), { recursive: true }) + const source = path.join(folder, 'public/contract.ts') + const output = path.join(folder, 'types/contract.d.ts') + try { + fs.writeFileSync(source, 'export interface Contract { name: string }\n') + await assert.rejects(generateCoreDeclarations({ root }), /stale/) + assert.equal(fs.existsSync(output), false) + await generateCoreDeclarations({ root, write: true }) + const generated = fs.readFileSync(output, 'utf8') + assert.match(generated, /Generated from public\/contract.ts/) + assert.deepEqual((await generateCoreDeclarations({ root })).changed, []) + fs.writeFileSync(source, 'export interface Contract { name: string, enabled: boolean }\n') + await assert.rejects(generateCoreDeclarations({ root }), /stale/) + assert.equal(fs.readFileSync(output, 'utf8'), generated) + await generateCoreDeclarations({ root, write: true }) + assert.match(fs.readFileSync(output, 'utf8'), /enabled: boolean/) + assert.equal(fs.existsSync(path.join(folder, 'types/contract.js')), false) + fs.writeFileSync(source, 'export interface Contract { name: MissingPublicType }\n') + const valid = fs.readFileSync(output, 'utf8') + await assert.rejects(generateCoreDeclarations({ root, write: true }), /MissingPublicType/) + assert.equal(fs.readFileSync(output, 'utf8'), valid) + fs.mkdirSync(path.join(folder, 'src')) + fs.writeFileSync(path.join(folder, 'src/private.ts'), 'export interface Private { internal: boolean }\n') + fs.writeFileSync(source, 'export type { Private } from "../src/private.js"\n') + await assert.rejects(generateCoreDeclarations({ root, write: true }), /rootDir|non-public/) + assert.equal(fs.readFileSync(output, 'utf8'), valid) + } + finally { + assert.equal(path.dirname(path.resolve(root)), path.resolve(os.tmpdir())) + assert(path.basename(root).startsWith('artplayer-declarations-')) + fs.rmSync(root, { recursive: true, force: true }) + } +}) diff --git a/test/editor-types.test.js b/test/editor-types.test.js new file mode 100644 index 000000000..433e90dee --- /dev/null +++ b/test/editor-types.test.js @@ -0,0 +1,21 @@ +import assert from 'node:assert/strict' +import fs from 'node:fs' +// eslint-disable-next-line test/no-import-node-test -- Exercise the real standalone editor compiler and generator. +import { test } from 'node:test' +import { ESLint } from 'eslint' +import compat from 'typescript-compat' +import { asGlobalDeclaration, checkCoreEditorDeclaration, generateCoreEditorDeclaration } from '../scripts/editor-types.mjs' + +test('editor declarations are reproducible, standalone and preserve constructor/named types in both compilers', async () => { + const generated = generateCoreEditorDeclaration() + const file = 'docs/assets/ts/artplayer.d.ts' + const eslint = new ESLint({ fix: true, fixTypes: ['layout'] }) + const [formatted] = await eslint.lintText(generated, { filePath: file }) + assert.equal(formatted.errorCount, 0) + assert.equal(fs.readFileSync(file, 'utf8').replaceAll('\r\n', '\n'), formatted.output || generated, 'Editor declarations are stale; run yarn build:ts') + assert.deepEqual(checkCoreEditorDeclaration(formatted.output || generated, compat), []) + const corrupted = generated.replace('export type OptionInput = ArtplayerDefinitions.OptionInput;', 'export type OptionInput = MissingEditorType;') + assert.notEqual(corrupted, generated, 'Missing corruption target') + assert(checkCoreEditorDeclaration(corrupted).some(diagnostic => diagnostic.code === 2304), 'Invalid output must not be hidden by skipLibCheck') + assert.throws(() => asGlobalDeclaration('export { default } from "./missing"', 'Artplayer'), /unresolved exports/) +}) diff --git a/test/package-check.test.js b/test/package-check.test.js index c956557c0..a2ed28e11 100644 --- a/test/package-check.test.js +++ b/test/package-check.test.js @@ -14,6 +14,8 @@ test('Package checks reject missing files, missing wildcard exports and internal for (const missing of files) assert.throws(() => checkFiles(manifest, files.filter(file => file !== missing)), /Missing/) assert.throws(() => checkFiles(manifest, [...files, 'package/tsconfig.json']), /tsconfig/) + for (const source of ['src/internal.ts', 'public/artplayer.ts', 'node_modules/private/index.js']) + assert.throws(() => checkFiles(manifest, [...files, `package/${source}`]), /Source\/dependencies/) assert.throws(() => checkFiles(manifest, files, ['package/dist/old.js']), /Historical/) }) diff --git a/test/package/README.md b/test/package/README.md index 1b1a4b739..1e04e93cf 100644 --- a/test/package/README.md +++ b/test/package/README.md @@ -38,6 +38,16 @@ Remove a known case when its owning task fixes it; keep frozen release evidence `yarn test:package:release` additionally rejects any remaining known type errors. Passing this command alone is not authorization or sufficient evidence to publish. +The optional core `artplayer/runtime` entry has eight additional strict consumer +groups: TS 5.1.6 and 5.9.3 each check Node10 CommonJS, NodeNext CJS/ESM and Bundler. +These fixtures cover accurate returns and getter/setter types, construction-stage +callback hosts, both old and new module augmentations, old chapter factories and +the shared modern/legacy constructor. The old root remains isolated from modern +accessor syntax and retains its five original consumer groups. Runtime checks +verify the added entries reuse existing JS module and constructor identities; +`runtime/types` remains type-only. All generated core declarations are packaged, +while their authored `public/` source graph and internal implementation are excluded. + Reports, archives, installed artifact copies and build/install logs are under `refactor/.cache/packages/run-*`; `latest.json` points to the last successful compatibility run (a strict release rejection still leaves its report). For browser diff --git a/test/package/runtime.cjs b/test/package/runtime.cjs index 5383a6087..8af3e156f 100644 --- a/test/package/runtime.cjs +++ b/test/package/runtime.cjs @@ -27,6 +27,19 @@ const vm = require('node:vm'); const legacy = await import('artplayer/legacy') const pluginLegacy = await import('artplayer-plugin-chapter/legacy') check('DIST.esm-legacy', legacy.default.version === core.version && typeof pluginLegacy.default({}) === 'function') + if (!expected.baseline) { + const precise = require('artplayer/runtime') + const preciseEsm = await import('artplayer/runtime') + const preciseLegacy = require('artplayer/runtime/legacy') + const preciseLegacyEsm = await import('artplayer/runtime/legacy') + check('DIST.runtime-cjs-identity', precise === core && require.resolve('artplayer/runtime') === require.resolve('artplayer')) + check('DIST.runtime-esm-identity', preciseEsm === esm && preciseEsm.default === esm.default) + check('DIST.runtime-legacy-identity', preciseLegacy === require('artplayer/legacy') && preciseLegacyEsm === legacy) + check('DIST.runtime-shared-statics', precise.instances === core.instances && preciseEsm.default.instances === esm.default.instances && preciseLegacy.instances === legacy.default.instances) + assert.throws(() => require('artplayer/runtime/types'), error => error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') + await assert.rejects(import('artplayer/runtime/types'), error => error.code === 'ERR_PACKAGE_PATH_NOT_EXPORTED') + check('DIST.runtime-types-only', true) + } for (const [name, filename, globalName] of [ ['core', 'artplayer/dist/artplayer.js', 'Artplayer'], ['core-legacy', 'artplayer/dist/artplayer.legacy.js', 'Artplayer'], diff --git a/test/types/runtime-commonjs.cts b/test/types/runtime-commonjs.cts new file mode 100644 index 000000000..f31ed040a --- /dev/null +++ b/test/types/runtime-commonjs.cts @@ -0,0 +1,17 @@ +/* eslint-disable ts/no-require-imports, ts/no-this-alias -- Exercise actual CJS syntax and callback receiver types. */ +import Artplayer = require('artplayer/runtime') +import LegacyRuntime = require('artplayer/runtime/legacy') + +const option: Artplayer.OptionInput = { container: '#player' } +const art: Artplayer = new Artplayer(option) +const legacy: Artplayer = new LegacyRuntime(option) +const factory: Artplayer.PluginFactory<{ name: string }> = function (instance) { + const receiver: Artplayer.PluginHost = this + const value: undefined = instance.seek + void [receiver, value] + return { name: 'cjs' } +} +const registry: Artplayer.Plugins = art.plugins.add(factory) +// @ts-expect-error CJS must not reintroduce legacy false getter values. +const falseSeek: number = legacy.seek +void [registry, falseSeek] diff --git a/test/types/runtime-components.ts b/test/types/runtime-components.ts new file mode 100644 index 000000000..73cd4edef --- /dev/null +++ b/test/types/runtime-components.ts @@ -0,0 +1,28 @@ +import type { Component, Controls } from '../../packages/artplayer/public/runtime/component' +import type { Setting, SettingItem } from '../../packages/artplayer/public/runtime/setting' +import type Artplayer from '../../packages/artplayer/src' +import type { ControlHost } from '../../packages/artplayer/src/control/types' +import type { SettingHost } from '../../packages/artplayer/src/setting/types' + +declare const source: Artplayer +const controls: Controls = source.controls +const component: Component = source.controls +const setting: Setting = source.setting +const added: undefined = controls.add({ name: 'sample', html: 1, position: 'left' }) +const updated: undefined = controls.update({ name: 'sample', html: 2 }) +const nullable: SettingItem | null = setting.find('absent') +const item = { name: 'setting', html: 'Item', extra: 1 } +const same: typeof item = setting.add(item) +const changed: SettingItem = setting.update({ name: 'setting', html: 'Updated' }) +const removed: void = setting.remove('setting') +setting.add({ name: 'callback', html: 'Callback', onClick(entry) { + const offset: number = this.subtitleOffset + return [offset, entry.name] +} }) +// @ts-expect-error The updated item is not the whole setting registry. +const registry: Setting = setting.update({ name: 'setting' }) +// @ts-expect-error A missing setting result is null, not undefined. +const absent: undefined = setting.find('absent') +// @ts-expect-error Control add does not return a mounted element. +const element: HTMLElement = controls.add({ html: 'Button', position: 'left' }) +export { absent, added, changed, component, element, nullable, registry, removed, same, updated } diff --git a/test/types/runtime-construction.ts b/test/types/runtime-construction.ts new file mode 100644 index 000000000..c0b522774 --- /dev/null +++ b/test/types/runtime-construction.ts @@ -0,0 +1,72 @@ +/* eslint-disable ts/no-this-alias -- Assignments verify callback initialization views. */ +import type { ContextmenuHost, ControlHost, CustomTypeHost, LayerHost, OptionInput, PluginHost, ProxyHost } from 'artplayer/runtime' +import Artplayer from 'artplayer/runtime' + +const option: OptionInput = { + container: document.createElement('div'), + proxy(art) { + const host: ProxyHost = art + const id: number = host.id + art.on('ready', () => {}) + // @ts-expect-error Template has not returned during proxy construction. + void art.template + // @ts-expect-error Accessing the video getter before Template returns would throw. + void art.video + // @ts-expect-error Player descriptors have not been installed yet. + art.seek = 1 + void id + return document.createElement('video') + }, + customType: { custom(video, url, art) { + const host: CustomTypeHost = art + host.seek = '1' + const seek: undefined = host.seek + // URL assignment defers customType until construction has finished. + const player: object = art.player + art.controls.show = true + void [video, url, seek, player] + } }, + layers: [art => ({ html: String(art.id), mounted() { + const host: LayerHost = this + host.seek = 1 + // @ts-expect-error Layer has not returned when its mounted callback runs. + host.layers.show = true + } })], + controls: [{ position: 'left', mounted() { + const host: ControlHost = this + host.layers.show = true + // @ts-expect-error Control has not returned when its mounted callback runs. + host.controls.show = true + } }], + contextmenu: [{ mounted() { + const host: ContextmenuHost = this + host.controls.show = true + // @ts-expect-error Contextmenu has not returned when its mounted callback runs. + host.contextmenu.show = true + } }], + setting: true, + settings: [{ html: 'Setting', mounted() { + // Setting mounted uses a deferred callback after construction completes. + const host: Artplayer = this + host.setting.show = true + host.plugins.add(() => ({ name: 'from-setting' })) + } }], + plugins: [function (art) { + const host: PluginHost = art + host.setting.show = true + host.seek = 1 + // @ts-expect-error Registry is assigned only after constructor factories return. + host.plugins.add(() => ({ name: 'too-early' })) + return { name: 'construction' } + }], +} +const art = new Artplayer(option, function (art) { + art.seek = 2 + this.controls.show = true + this.plugins.add(() => ({ name: 'ready' })) +}) +// @ts-expect-error Only div containers satisfy the runtime element validation. +const invalidContainer: OptionInput = { container: document.createElement('section') } +// @ts-expect-error A configured proxy must return a video or media-like canvas. +const invalidProxy: OptionInput = { container: '#player', proxy: () => undefined } +void [art, invalidContainer, invalidProxy] diff --git a/test/types/runtime-events.ts b/test/types/runtime-events.ts new file mode 100644 index 000000000..c7c66c197 --- /dev/null +++ b/test/types/runtime-events.ts @@ -0,0 +1,30 @@ +import type { Emitter } from '../../packages/artplayer/public/emitter' +import type { Events } from '../../packages/artplayer/public/runtime/events' +import type { Notice, Subtitle, SubtitleCue } from '../../packages/artplayer/public/runtime/subtitle' +import type Artplayer from '../../packages/artplayer/src' + +declare const source: Artplayer +const events: Emitter = source +const subtitle: Subtitle = source.subtitle +const notice: Notice = source.notice +const visible: boolean = notice.show +notice.show = 'message' +const switched: Promise = subtitle.switch('/subtitle.vtt') +const styled: HTMLDivElement = subtitle.style('font-size', 20) +events.on('subtitleBeforeUpdate', (cues) => { + const actual: SubtitleCue[] = cues + return actual.map(cue => cue.text) +}) +events.on('blur', event => event.type) +source.on('subtitleBeforeUpdate', cues => cues.map(cue => cue.text)) +events.emit('subtitleAfterUpdate', []) +events.emit('seek', 1.5, '1.5') +// @ts-expect-error The corrected payload cannot retain historical scalar cue inference. +events.on('subtitleBeforeUpdate', (cue: VTTCue) => cue.text) +// @ts-expect-error Native focus loss carries its original Event. +events.emit('blur') +// @ts-expect-error The actual source map must also reject a scalar update payload. +source.emit('subtitleAfterUpdate', 1) +// @ts-expect-error A visibility getter does not return the last message. +const message: string = notice.show +export { events, message, styled, switched, visible } diff --git a/test/types/runtime-facade.ts b/test/types/runtime-facade.ts new file mode 100644 index 000000000..89e7e3bed --- /dev/null +++ b/test/types/runtime-facade.ts @@ -0,0 +1,31 @@ +import type SourceArtplayer from '../../packages/artplayer/src' +import type { I18nHost } from '../../packages/artplayer/src/i18n' +import type RuntimeArtplayer from '../../packages/artplayer/types/runtime' +import type { ArtplayerConstructor } from '../../packages/artplayer/types/runtime' +import type { Config, EventRegistry, Hotkey, I18n, Storage } from '../../packages/artplayer/types/runtime/services' + +declare const source: SourceArtplayer +declare const constructor: typeof SourceArtplayer +const events: EventRegistry = source.events +const storage: Storage = source.storage +const hotkey: Hotkey = source.hotkey +const language: I18n = source.i18n +const config: Config = constructor.config +const validator: ArtplayerConstructor['validator'] = constructor.validator +const kindOf: ArtplayerConstructor['kindOf'] = constructor.kindOf +const scheme: ArtplayerConstructor['scheme'] = constructor.scheme + +// The facade covers every implementation member without whole-instance assertions. +const missingInstance: Exclude extends never ? true : false = true +const extraInstance: Exclude extends never ? true : false = true +const missingStatic: Exclude extends never ? true : false = true +const extraStatic: Exclude extends never ? true : false = true + +type ValueMembers = 'id' | 'isLock' | 'isReady' | 'isFocus' | 'isInput' | 'isRotate' | 'isDestroy' | 'video' | 'player' | 'reset' | 'destroy' +const values: Pick = source +type SharedOptions = Exclude +const options: Pick = source.option +const storageValue: unknown = storage.get() +// @ts-expect-error Persisted JSON can be a primitive, not just a settings object. +const falseSettings: Record = storage.get() +void [events, storage, hotkey, language, config, validator, kindOf, scheme, missingInstance, extraInstance, missingStatic, extraStatic, values, options, storageValue, falseSettings] diff --git a/test/types/runtime-leaf-consumer.ts b/test/types/runtime-leaf-consumer.ts new file mode 100644 index 000000000..bdd40af60 --- /dev/null +++ b/test/types/runtime-leaf-consumer.ts @@ -0,0 +1,54 @@ +import type { Emitter } from 'artplayer' +import type { Controls } from '../../packages/artplayer/types/runtime/component.js' +import type { Events } from '../../packages/artplayer/types/runtime/events.js' +import type { NativeMedia } from '../../packages/artplayer/types/runtime/media.js' +import type { Player } from '../../packages/artplayer/types/runtime/player.js' +import type { Plugins } from '../../packages/artplayer/types/runtime/plugin.js' +import type { Setting, SettingItem } from '../../packages/artplayer/types/runtime/setting.js' +import type { Notice, Subtitle } from '../../packages/artplayer/types/runtime/subtitle.js' +import type { Icons, Template } from '../../packages/artplayer/types/runtime/template.js' +import type { Utils } from '../../packages/artplayer/types/runtime/utils.js' + +declare const player: Player +declare const registry: Plugins> +declare const events: Emitter +declare const notice: Notice +declare const subtitle: Subtitle +declare const template: Template, NativeMedia> +declare const icons: Icons +declare const utils: Utils +declare const controls: Controls> +declare const setting: Setting> +const read: undefined = player.seek +player.seek = '2' +const play: Promise = player.play() +const pip: Element | null | boolean = player.pip +const immediate: typeof registry = registry.add(art => ({ name: 'plain', value: art.currentTime })) +const pending: Promise = registry.add(async art => ({ name: 'async', value: art.currentTime })) +events.on('subtitleBeforeUpdate', cues => cues.map(cue => cue.text)) +events.on('video:error', event => event.type) +const visible: boolean = notice.show +notice.show = new Error('test') +const changed: Promise = subtitle.switch('/subtitle.vtt') +const native: NativeMedia = template.$video +const wrapper: HTMLElement = icons.play +const custom: HTMLElement | undefined = icons.custom +const target = { id: 1 } +const same: typeof target = utils.def(target, 'name', { value: 'name' }) +const delayed: void = utils.debounce(() => 1, 0, {})() +const mounted: undefined = controls.add({ name: 'button', html: 'Button', position: 'left' }) +const settingResult: SettingItem> | null = setting.find('entry') +const input = { name: 'entry', html: 'Entry', custom: 123 } +const settingIdentity: typeof input = setting.add(input) +const updated: SettingItem> = setting.update(input) +// @ts-expect-error Reading a setter-only command is not a numeric result. +const number: number = player.seek +// @ts-expect-error Native error forwarding preserves Event, not an Error object. +events.emit('video:error', new Error('wrong payload')) +// @ts-expect-error Update callbacks receive arrays. +events.on('subtitleBeforeUpdate', (cue: VTTCue) => cue.text) +// @ts-expect-error Deferred callbacks have no immediate numeric result. +const immediateNumber: number = utils.throttle(() => 1, 0)() +// @ts-expect-error A setting update returns the item, not the registry. +const settingRegistry: typeof setting = setting.update(input) +export { changed, custom, delayed, immediate, immediateNumber, mounted, native, number, pending, pip, play, read, same, settingIdentity, settingRegistry, settingResult, updated, visible, wrapper } diff --git a/test/types/runtime-player.ts b/test/types/runtime-player.ts new file mode 100644 index 000000000..1bf1c9764 --- /dev/null +++ b/test/types/runtime-player.ts @@ -0,0 +1,36 @@ +import type { CanvasMedia, MediaSurface, NativeMedia } from '../../packages/artplayer/public/runtime/media' +import type { Player } from '../../packages/artplayer/public/runtime/player' +import type { MediaSurface as SourceMedia } from '../../packages/artplayer/src/media/types' +import type { PlayerProperties } from '../../packages/artplayer/src/player/properties' + +declare const actual: PlayerProperties +declare const media: SourceMedia +declare const native: Player +declare const canvas: Player +const publicPlayer: Player = actual +const publicMedia: MediaSurface = media +const internalMedia: SourceMedia = publicMedia +const commands: undefined[] = [publicPlayer.seek, publicPlayer.forward, publicPlayer.backward, publicPlayer.switch, publicPlayer.quality] +const pip: Element | null | boolean = publicPlayer.pip +const url: string | null = publicPlayer.url +const nativePlay: Promise = native.play() +const nativePause: void = native.pause() +const nativeToggle: void | Promise = native.toggle() +const proxyPlay: Promise = canvas.play() +publicPlayer.seek = '1.5' +publicPlayer.forward = 2 +publicPlayer.quality = [{ html: document.createElement('span'), url: '/video.mp4' }] +publicPlayer.pip = true +// @ts-expect-error Commands do not have the historical fictitious numeric getters. +const position: number = publicPlayer.seek +// @ts-expect-error Accurate write types are not widened just to satisfy TS 4.3's accessor restriction. +publicPlayer.quality = undefined +// @ts-expect-error A native PiP element is a result, not a supported setter input. +publicPlayer.pip = document.createElement('video') +// @ts-expect-error The proxy play result cannot be assumed to be a native void result. +const proxyNative: Promise = canvas.play() +type Assert = Condition +type Complete = Assert extends never ? true : false> +type NoInventedProperties = Assert extends never ? true : false> +export type { Complete, NoInventedProperties } +export { commands, internalMedia, nativePause, nativePlay, nativeToggle, pip, position, proxyNative, proxyPlay, url } diff --git a/test/types/runtime-public.ts b/test/types/runtime-public.ts new file mode 100644 index 000000000..250434ad8 --- /dev/null +++ b/test/types/runtime-public.ts @@ -0,0 +1,165 @@ +/* eslint-disable ts/no-this-alias -- Assignments prove contextual callback receiver types. */ +import type { PluginFactory as LegacyPluginFactory } from 'artplayer' +import type { CustomTypeHost, Events, OptionInput, PluginFactory, PluginHost, Plugins } from 'artplayer/runtime' +import chapter from 'artplayer-plugin-chapter' +import Artplayer from 'artplayer/runtime' +import LegacyRuntime from 'artplayer/runtime/legacy' + +declare module 'artplayer/types' { + interface Plugins { + legacyRuntimeExtension?: { set: (count: number) => void } + } + interface Events { + 'legacy-runtime:update': [count: number] + } +} + +declare module 'artplayer/runtime/types' { + interface Plugins { + runtimeExtension?: { update: (count: number) => void } + } + interface Events { + 'runtime-extension:update': [count: number] + } +} + +const factory: PluginFactory<{ name: string, update: (count: number) => void }> = function (art) { + const seek: undefined = this.seek + void seek + // @ts-expect-error A constructor factory cannot assume the registry has been assigned. + void art.plugins.art + return { name: 'runtimeExtension', update(count) { + art.emit('runtime-extension:update', count) + } } +} + +const option: OptionInput = { + container: document.createElement('div'), + plugins: [factory, function (art) { + const receiver: PluginHost = this + const value: undefined = art.seek + void [receiver, value] + return { name: 'inline' } + }], + controls: [{ name: 'test', position: 'left', mounted(element) { + const value: undefined = this.seek + element.textContent = String(value) + } }], + settings: [{ html: 'Custom', onClick(item) { + const visible: boolean = this.notice.show + return `${item.html}: ${visible}` + } }], + customType: { hls(video, url, art) { + const receiver: CustomTypeHost = this + const value: undefined = art.forward + void [receiver, value, video, url] + } }, +} +const art = new Artplayer(option, function (instance) { + const receiver: Artplayer = this + instance.plugins.runtimeExtension?.update(1) + void receiver +}) +const sync: Plugins = art.plugins.add(factory) +const async: Promise = art.plugins.add(async () => ({ name: 'async' })) +const inline = art.plugins.add(function (instance) { + const receiver: Artplayer = this + const value: undefined = instance.backward + void [receiver, value] + return { name: 'inlineAdd' } +}) +const same: Plugins = inline +const seek: undefined = art.seek +art.seek = 2 +art.seek = '2' +art.notice.show = 'Message' +const shown: boolean = art.notice.show +const pip: Element | null | boolean = art.pip +art.pip = true +const icon: HTMLElement = art.icons.play +const customIcon: HTMLElement | undefined = art.icons.customIcon +const queried: HTMLDivElement | null = art.template.query('.optional') +const settingItem = { name: 'precise-item', html: 'Item', marker: 1 } +const added: typeof settingItem = art.setting.add(settingItem) +const removed: void = art.setting.remove(settingItem.name) +const subtitleStyle: HTMLDivElement = art.subtitle.style({ color: 'red' }) +const target = { count: 1 } +const defined: typeof target = Artplayer.utils.def(target, Symbol('count'), { + get() { return this.count }, +}) +const debounced = Artplayer.utils.debounce((value: number) => value + 1, 10) +const throttled = Artplayer.utils.throttle((value: number) => value + 1, 10) +const delayed: void = debounced(1) +const limited: void = throttled(1) +const missing = art.setting.find('missing') +if (missing) + missing.html = 'Found' +art.on('runtime-extension:update', count => count.toFixed()) +art.on('subtitleAfterUpdate', cues => cues.map(cue => cue.text)) +art.plugins.runtimeExtension?.update(2) +const payload: Events['runtime-extension:update'] = [1] +Artplayer.config.events.push('custom-event') +Artplayer.DEBUG = false +// @ts-expect-error defineProperty requires an object target in an installed consumer too. +Artplayer.utils.def(123, 'value', { value: 1 }) + +declare const legacyFactory: LegacyPluginFactory +const legacyResult: Plugins | Promise = art.plugins.add(legacyFactory) +art.plugins.add(chapter()) +art.plugins.legacyRuntimeExtension?.set(2) +art.on('legacy-runtime:update', count => count.toFixed()) +const legacyRuntime: Artplayer = new LegacyRuntime(option) +const legacyOptions = new Artplayer({ container: '#legacy', plugins: [legacyFactory] }, function (instance) { + const value: undefined = this.seek + const other: undefined = instance.seek + void [value, other] +}) + +class Derived extends Artplayer { + marker = true +} +const derived = new Derived(option) +const chained: Derived = derived.on('ready', () => {}) + +// @ts-expect-error Command properties have no getter value. +const falseSeek: number = art.seek +// @ts-expect-error New control entries require one of the three supported positions. +art.controls.add({ html: 'Missing position' }) +// @ts-expect-error Unknown control positions fail runtime validation. +art.controls.add({ html: 'Wrong position', position: 'middle' }) +// @ts-expect-error Synchronous registration is not a Promise. +const falsePromise: Promise = sync +// @ts-expect-error Getter visibility is boolean. +const falseNotice: string = art.notice.show +// @ts-expect-error Native PiP returns an element or null, while WebKit returns boolean. +const falsePip: boolean = pip +// @ts-expect-error The PiP setter takes a boolean, not the native getter's element. +art.pip = document.createElement('video') +// @ts-expect-error Icons expose wrapper elements, not their SVG input strings. +const falseIcon: string = art.icons.play +// @ts-expect-error SSR and custom query results may be absent. +const falseQuery: HTMLDivElement = art.template.query('.optional') +// @ts-expect-error A delayed wrapper does not return the callback's number. +const falseDelayed: number = debounced(1) +// @ts-expect-error A throttled wrapper does not return the callback's number. +const falseLimited: number = throttled(1) +// @ts-expect-error defineProperty returns its target, not a descriptor. +const falseDescriptor: PropertyDescriptor = defined +// @ts-expect-error Precise built-in events reject scalar subtitle payloads. +art.emit('subtitleAfterUpdate', 'bad') +// @ts-expect-error Augmented payloads stay checked. +art.emit('runtime-extension:update', 'bad') +// @ts-expect-error Augmented plugin methods stay checked. +art.plugins.runtimeExtension?.update('bad') +// @ts-expect-error Legacy plugin augmentation keeps its method types on the precise view. +art.plugins.legacyRuntimeExtension?.set('bad') +// @ts-expect-error Legacy event augmentation keeps its payload type on the precise view. +art.emit('legacy-runtime:update', 'bad') +// @ts-expect-error Static env was never exposed by the runtime. +void Artplayer.env +// @ts-expect-error Template html belongs to the constructor. +void art.template.html +// @ts-expect-error Missing setting entries are null, not undefined. +const falseMissing: undefined = art.setting.find('missing') +void [sync, async, same, seek, shown, payload, legacyResult, legacyRuntime, legacyOptions, chained, falseSeek, falsePromise, falseNotice, falseMissing] +void [pip, icon, customIcon, queried, added, removed, subtitleStyle, defined, delayed, limited, falsePip, falseIcon, falseQuery, falseDelayed, falseLimited, falseDescriptor] diff --git a/test/types/runtime-subsystems.ts b/test/types/runtime-subsystems.ts new file mode 100644 index 000000000..fd78d3bda --- /dev/null +++ b/test/types/runtime-subsystems.ts @@ -0,0 +1,34 @@ +import type { PluginFactory, Plugins } from '../../packages/artplayer/public/runtime/plugin' +import type { IconName, Icons, Template } from '../../packages/artplayer/public/runtime/template' +import type Artplayer from '../../packages/artplayer/src' +import type iconDefaults from '../../packages/artplayer/src/icons/defaults' + +declare const source: Artplayer +const plugins: Plugins = source.plugins +const sync: Plugins = plugins.add(function (art) { + // eslint-disable-next-line ts/no-this-alias -- Check the public factory's inferred receiver against the actual source instance. + const same: Artplayer = this + return { name: 'sync', same, art } +}) +const asyncRegistry: Promise> = plugins.add(async () => ({ name: 'async' })) +declare const unknownFactory: PluginFactory +const uncertain: Plugins | Promise> = plugins.add(unknownFactory) +const template: Template = source.template +const icons: Icons = source.icons +const icon: HTMLElement = icons.play +const customIcon: HTMLElement | undefined = icons.custom +const subtitle: HTMLDivElement | null = template.$subtitle +const query: HTMLVideoElement | null = template.query('video') +// @ts-expect-error Sync registration is not a Promise. +const syncPromise: Promise> = plugins.add(() => ({ name: 'plain' })) +// @ts-expect-error Template.html belongs to the constructor, not its instance. +const instanceHtml = template.html +// @ts-expect-error Icon wrappers are not promised to be div elements. +const div: HTMLDivElement = icons.play +// @ts-expect-error Missing custom icon keys require a presence guard. +const present: HTMLElement = icons.custom +type Assert = Condition +type AllIcons = Assert extends never ? true : false> +type NoInventedIcons = Assert extends never ? true : false> +export type { AllIcons, NoInventedIcons } +export { asyncRegistry, customIcon, div, icon, instanceHtml, present, query, subtitle, sync, syncPromise, uncertain } diff --git a/test/types/runtime-utils.ts b/test/types/runtime-utils.ts new file mode 100644 index 000000000..54e836306 --- /dev/null +++ b/test/types/runtime-utils.ts @@ -0,0 +1,31 @@ +import type { Utils } from '../../packages/artplayer/public/runtime/utils' +import * as source from '../../packages/artplayer/src/utils' + +const utils: Utils = source +const target = { enabled: true } +const same: typeof target = utils.def(target, 'value', { value: 1 }) +const delayed: void = utils.debounce(() => 123, 0, {})() +const throttled: void = utils.throttle(() => 456, 0)() +const receiver = { count: 0 } +const callback = utils.debounce(function (this: typeof receiver, increment: number) { + this.count += increment +}, 0) +callback.call(receiver, 2) +const append: Element | ChildNode | null = utils.append(document.createElement('div'), '') +const style: number | string = utils.getStyle(document.body, 'width', Math.random() > 0.5) +const queried: HTMLVideoElement | null = utils.query('video', document.createDocumentFragment()) +const removed: Text = utils.remove(document.createTextNode('text')) +utils.sleep() +// @ts-expect-error The callback result is not returned by the debounce wrapper. +const immediate: number = utils.debounce(() => 1, 0)() +// @ts-expect-error Native defineProperty requires a descriptor object. +utils.def(target, 'value', 123) +// @ts-expect-error Native defineProperty also requires an object target. +utils.def(123, 'value', { value: 1 }) +// @ts-expect-error Optional event targets do not make composed paths optional arrays. +const nullable: null = utils.getComposedPath({ target: null }) +type Assert = Condition +type Complete = Assert extends never ? true : false> +type NoInventedExports = Assert extends never ? true : false> +export type { Complete, NoInventedExports } +export { append, delayed, immediate, nullable, queried, removed, same, style, throttled } diff --git a/yarn.lock b/yarn.lock index b101a9841..16e7173f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3111,6 +3111,14 @@ dotenv@~16.4.5: resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz" integrity sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ== +dts-bundle-generator@9.5.1: + version "9.5.1" + resolved "https://registry.yarnpkg.com/dts-bundle-generator/-/dts-bundle-generator-9.5.1.tgz#7eac7f47a2d5b51bdaf581843e7f969b88bfc225" + integrity sha512-DxpJOb2FNnEyOzMkG11sxO2dmxPjthoVWxfKqWYJ/bI/rT1rvTMktF5EKjAYrRZu6Z6t3NhOUZ0sZ5ZXevOfbA== + dependencies: + typescript ">=5.0.2" + yargs "^17.6.0" + dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" @@ -7581,7 +7589,12 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4" integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA== -typescript@5.9.3, "typescript@>=3 < 6": +"typescript-runtime-compat@npm:typescript@5.1.6": + version "5.1.6" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274" + integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA== + +typescript@5.9.3, "typescript@>=3 < 6", typescript@>=5.0.2: version "5.9.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz" integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== @@ -8037,6 +8050,19 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.6.0: + version "17.7.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.3.tgz#779dffe6bcafec596a7172e983289a588647faaa" + integrity sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"