48 lines
1.5 KiB
Java
48 lines
1.5 KiB
Java
![]() |
import {Map} from './shims/es6-collections.js';
|
||
|
import ResizeObserverController from './ResizeObserverController.js';
|
||
|
import ResizeObserverSPI from './ResizeObserverSPI.js';
|
||
|
|
||
|
// Registry of internal observers. If WeakMap is not available use current shim
|
||
|
// for the Map collection as it has all required methods and because WeakMap
|
||
|
// can't be fully polyfilled anyway.
|
||
|
const observers = typeof WeakMap !== 'undefined' ? new WeakMap() : new Map();
|
||
|
|
||
|
/**
|
||
|
* ResizeObserver API. Encapsulates the ResizeObserver SPI implementation
|
||
|
* exposing only those methods and properties that are defined in the spec.
|
||
|
*/
|
||
|
class ResizeObserver {
|
||
|
/**
|
||
|
* Creates a new instance of ResizeObserver.
|
||
|
*
|
||
|
* @param {ResizeObserverCallback} callback - Callback that is invoked when
|
||
|
* dimensions of the observed elements change.
|
||
|
*/
|
||
|
constructor(callback) {
|
||
|
if (!(this instanceof ResizeObserver)) {
|
||
|
throw new TypeError('Cannot call a class as a function.');
|
||
|
}
|
||
|
if (!arguments.length) {
|
||
|
throw new TypeError('1 argument required, but only 0 present.');
|
||
|
}
|
||
|
|
||
|
const controller = ResizeObserverController.getInstance();
|
||
|
const observer = new ResizeObserverSPI(callback, controller, this);
|
||
|
|
||
|
observers.set(this, observer);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Expose public methods of ResizeObserver.
|
||
|
[
|
||
|
'observe',
|
||
|
'unobserve',
|
||
|
'disconnect'
|
||
|
].forEach(method => {
|
||
|
ResizeObserver.prototype[method] = function () {
|
||
|
return observers.get(this)[method](...arguments);
|
||
|
};
|
||
|
});
|
||
|
|
||
|
export default ResizeObserver;
|