diff --git a/src/runtime/internal/ResizeObserverSingleton.ts b/src/runtime/internal/ResizeObserverSingleton.ts index 2fe4ebf4d8..485eed786c 100644 --- a/src/runtime/internal/ResizeObserverSingleton.ts +++ b/src/runtime/internal/ResizeObserverSingleton.ts @@ -1,73 +1,66 @@ import { globals } from './globals'; - /** * Resize observer singleton. * One listener per element only! * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ */ export class ResizeObserverSingleton { - constructor(readonly options?: ResizeObserverOptions) {} - - observe(element: Element, listener: Listener) { - this._listeners.set(element, listener); - this._getObserver().observe(element, this.options); - return () => { - this._listeners.delete(element); - this._observer.unobserve(element); // this line can probably be removed - }; - } - - private readonly _listeners: WeakMap = - 'WeakMap' in globals ? new WeakMap() : undefined; - private _observer?: ResizeObserver; - private _getObserver() { - return ( - this._observer ?? - (this._observer = new ResizeObserver((entries) => { - for (const entry of entries) { - (ResizeObserverSingleton as any).entries.set(entry.target, entry); - this._listeners.get(entry.target)?.(entry); - } - })) - ); - } + options; + constructor(options) { + this.options = options; + } + /** @param {Element} element + * @param {Listener} listener + * @returns {() => void} + */ + observe(element, listener) { + this._listeners.set(element, listener); + this._getObserver().observe(element, this.options); + return () => { + this._listeners.delete(element); + this._observer.unobserve(element); // this line can probably be removed + }; + } + /** @private + * @readonly + * @default 'WeakMap' in globals ? new WeakMap() : undefined + */ + _listeners = 'WeakMap' in globals ? new WeakMap() : undefined; + /** @private */ + _observer = undefined; + /** @private + * @returns {ResizeObserver} + */ + _getObserver() { + return (this._observer ?? + (this._observer = new ResizeObserver((entries) => { + for (const entry of entries) { + ResizeObserverSingleton.entries.set(entry.target, entry); + this._listeners.get(entry.target)?.(entry); + } + }))); + } } // Needs to be written like this to pass the tree-shake-test -(ResizeObserverSingleton as any).entries = 'WeakMap' in globals ? new WeakMap() : undefined; - -type Listener = (entry: ResizeObserverEntry) => any; - -// TODO: Remove this -interface ResizeObserverSize { - readonly blockSize: number; - readonly inlineSize: number; -} - -interface ResizeObserverEntry { - readonly borderBoxSize: readonly ResizeObserverSize[]; - readonly contentBoxSize: readonly ResizeObserverSize[]; - readonly contentRect: DOMRectReadOnly; - readonly devicePixelContentBoxSize: readonly ResizeObserverSize[]; - readonly target: Element; -} +ResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined; -type ResizeObserverBoxOptions = 'border-box' | 'content-box' | 'device-pixel-content-box'; -interface ResizeObserverOptions { - box?: ResizeObserverBoxOptions; -} - -interface ResizeObserver { - disconnect(): void; - observe(target: Element, options?: ResizeObserverOptions): void; - unobserve(target: Element): void; -} - -interface ResizeObserverCallback { - (entries: ResizeObserverEntry[], observer: ResizeObserver): void; -} +/** @typedef {(entry: ResizeObserverEntry) => any} Listener */ +/** @typedef {'border-box' | 'content-box' | 'device-pixel-content-box'} ResizeObserverBoxOptions */ -declare let ResizeObserver: { - prototype: ResizeObserver; - new (callback: ResizeObserverCallback): ResizeObserver; -}; +/** @typedef {Object} ResizeObserverSize + * @property {number} blockSize + * @property {number} inlineSize + */ +/** @typedef {Object} ResizeObserverEntry + * @property {readonlyResizeObserverSize[]} borderBoxSize + * @property {readonlyResizeObserverSize[]} contentBoxSize + * @property {DOMRectReadOnly} contentRect + * @property {readonlyResizeObserverSize[]} devicePixelContentBoxSize + * @property {Element} target + */ +/** @typedef {Object} ResizeObserverOptions + * @property {ResizeObserverBoxOptions} [box] + */ +/** @typedef {Object} ResizeObserver */ +/** @typedef {Object} ResizeObserverCallback */ \ No newline at end of file