Convert src/runtime/internal/ResizeObserverSingleton.ts to JavaScript

pull/8569/head
S. Elliott Johnson 3 years ago
parent 7c7773fb39
commit 64048e5884

@ -1,14 +1,19 @@
import { globals } from './globals'; import { globals } from './globals';
/** /**
* Resize observer singleton. * Resize observer singleton.
* One listener per element only! * One listener per element only!
* https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ
*/ */
export class ResizeObserverSingleton { export class ResizeObserverSingleton {
constructor(readonly options?: ResizeObserverOptions) {} options;
constructor(options) {
observe(element: Element, listener: Listener) { this.options = options;
}
/** @param {Element} element
* @param {Listener} listener
* @returns {() => void}
*/
observe(element, listener) {
this._listeners.set(element, listener); this._listeners.set(element, listener);
this._getObserver().observe(element, this.options); this._getObserver().observe(element, this.options);
return () => { return () => {
@ -16,58 +21,46 @@ export class ResizeObserverSingleton {
this._observer.unobserve(element); // this line can probably be removed this._observer.unobserve(element); // this line can probably be removed
}; };
} }
/** @private
private readonly _listeners: WeakMap<Element, Listener> = * @readonly
'WeakMap' in globals ? new WeakMap() : undefined; * @default 'WeakMap' in globals ? new WeakMap() : undefined
private _observer?: ResizeObserver; */
private _getObserver() { _listeners = 'WeakMap' in globals ? new WeakMap() : undefined;
return ( /** @private */
this._observer ?? _observer = undefined;
/** @private
* @returns {ResizeObserver}
*/
_getObserver() {
return (this._observer ??
(this._observer = new ResizeObserver((entries) => { (this._observer = new ResizeObserver((entries) => {
for (const entry of entries) { for (const entry of entries) {
(ResizeObserverSingleton as any).entries.set(entry.target, entry); ResizeObserverSingleton.entries.set(entry.target, entry);
this._listeners.get(entry.target)?.(entry); this._listeners.get(entry.target)?.(entry);
} }
})) })));
);
} }
} }
// Needs to be written like this to pass the tree-shake-test // Needs to be written like this to pass the tree-shake-test
(ResizeObserverSingleton as any).entries = 'WeakMap' in globals ? new WeakMap() : undefined; ResizeObserverSingleton.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;
}
type ResizeObserverBoxOptions = 'border-box' | 'content-box' | 'device-pixel-content-box'; /** @typedef {(entry: ResizeObserverEntry) => any} Listener */
/** @typedef {'border-box' | 'content-box' | 'device-pixel-content-box'} ResizeObserverBoxOptions */
interface ResizeObserverOptions { /** @typedef {Object} ResizeObserverSize
box?: ResizeObserverBoxOptions; * @property {number} blockSize
} * @property {number} inlineSize
*/
interface ResizeObserver { /** @typedef {Object} ResizeObserverEntry
disconnect(): void; * @property {readonlyResizeObserverSize[]} borderBoxSize
observe(target: Element, options?: ResizeObserverOptions): void; * @property {readonlyResizeObserverSize[]} contentBoxSize
unobserve(target: Element): void; * @property {DOMRectReadOnly} contentRect
} * @property {readonlyResizeObserverSize[]} devicePixelContentBoxSize
* @property {Element} target
interface ResizeObserverCallback { */
(entries: ResizeObserverEntry[], observer: ResizeObserver): void; /** @typedef {Object} ResizeObserverOptions
} * @property {ResizeObserverBoxOptions} [box]
*/
declare let ResizeObserver: { /** @typedef {Object} ResizeObserver */
prototype: ResizeObserver; /** @typedef {Object} ResizeObserverCallback */
new (callback: ResizeObserverCallback): ResizeObserver;
};
Loading…
Cancel
Save