50 lines
2.2 KiB
JavaScript
50 lines
2.2 KiB
JavaScript
|
import { scheduler, updateCount } from './utils/scheduler';
|
||
|
import { ResizeObservation } from './ResizeObservation';
|
||
|
import { ResizeObserverDetail } from './ResizeObserverDetail';
|
||
|
import { resizeObservers } from './utils/resizeObservers';
|
||
|
var observerMap = new WeakMap();
|
||
|
var getObservationIndex = function (observationTargets, target) {
|
||
|
for (var i = 0; i < observationTargets.length; i += 1) {
|
||
|
if (observationTargets[i].target === target) {
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
};
|
||
|
var ResizeObserverController = (function () {
|
||
|
function ResizeObserverController() {
|
||
|
}
|
||
|
ResizeObserverController.connect = function (resizeObserver, callback) {
|
||
|
var detail = new ResizeObserverDetail(resizeObserver, callback);
|
||
|
observerMap.set(resizeObserver, detail);
|
||
|
};
|
||
|
ResizeObserverController.observe = function (resizeObserver, target, options) {
|
||
|
var detail = observerMap.get(resizeObserver);
|
||
|
var firstObservation = detail.observationTargets.length === 0;
|
||
|
if (getObservationIndex(detail.observationTargets, target) < 0) {
|
||
|
firstObservation && resizeObservers.push(detail);
|
||
|
detail.observationTargets.push(new ResizeObservation(target, options && options.box));
|
||
|
updateCount(1);
|
||
|
scheduler.schedule();
|
||
|
}
|
||
|
};
|
||
|
ResizeObserverController.unobserve = function (resizeObserver, target) {
|
||
|
var detail = observerMap.get(resizeObserver);
|
||
|
var index = getObservationIndex(detail.observationTargets, target);
|
||
|
var lastObservation = detail.observationTargets.length === 1;
|
||
|
if (index >= 0) {
|
||
|
lastObservation && resizeObservers.splice(resizeObservers.indexOf(detail), 1);
|
||
|
detail.observationTargets.splice(index, 1);
|
||
|
updateCount(-1);
|
||
|
}
|
||
|
};
|
||
|
ResizeObserverController.disconnect = function (resizeObserver) {
|
||
|
var _this = this;
|
||
|
var detail = observerMap.get(resizeObserver);
|
||
|
detail.observationTargets.slice().forEach(function (ot) { return _this.unobserve(resizeObserver, ot.target); });
|
||
|
detail.activeTargets.splice(0, detail.activeTargets.length);
|
||
|
};
|
||
|
return ResizeObserverController;
|
||
|
}());
|
||
|
export { ResizeObserverController };
|