UNPKG

lisn.js

Version:

Simply handle user gestures and actions. Includes widgets.

148 lines (143 loc) 7.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.XResizeObserver = void 0; var MH = _interopRequireWildcard(require("../globals/minification-helpers.cjs")); var _log = require("../utils/log.cjs"); var _debug = _interopRequireDefault(require("../debug/debug.cjs")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } /** * @module Modules/XResizeObserver */ /** * {@link XResizeObserver} is an extension of * {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver | ResizeObserver} * - observes both border box and content box size changes * - can skip the initial callback that happens shortly after setting up via * {@link observeLater} * - can debounce the callback */ class XResizeObserver { /** * @param debounceWindow Debounce the handler so that it's called at most * every `debounceWindow` ms. */ constructor(callback, debounceWindow) { /** * Like {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/observe | ResizeObserver:observe} except it accepts multiple targets. */ _defineProperty(this, "observe", void 0); /** * Like {@link observe} but it ignores the initial almost immediate callback * and only calls the callback on a subsequent resize. * * If the target is already being observed, nothing is done. */ _defineProperty(this, "observeLater", void 0); /** * Like {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/unobserve | ResizeObserver:unobserve} except it accepts multiple targets. */ _defineProperty(this, "unobserve", void 0); /** * Like {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver/disconnect | ResizeObserver:disconnect}. */ _defineProperty(this, "disconnect", void 0); const logger = _debug.default ? new _debug.default.Logger({ name: "XResizeObserver" }) : null; // Keep the latest ResizeObserverEntry for each target during the // debounceWindow. Short-lived, so ok to use a Map. const buffer = MH.newMap(); // Since internally we have two observers, one for border box, one for // content box, we will get called initially twice for a target. So we keep // a counter of 1 or 2 for how many more calls to ignore. const targetsToSkip = MH.newWeakMap(); let observedTargets = MH.newWeakSet(); debounceWindow !== null && debounceWindow !== void 0 ? debounceWindow : debounceWindow = 0; let timer = null; const resizeHandler = entries => { // Override entries for previous targets, but keep entries whose targets // were not resized in this round for (const entry of entries) { const target = MH.targetOf(entry); const skipNum = targetsToSkip.get(target); if (skipNum !== undefined) { if (skipNum === 2) { // expect one more call targetsToSkip.set(target, 1); } else { // done /* istanbul ignore next */ if (skipNum !== 1) { (0, _log.logError)(MH.bugError(`# targetsToSkip is ${skipNum}`)); } MH.deleteKey(targetsToSkip, target); } continue; } buffer.set(target, entry); } debug: logger === null || logger === void 0 || logger.debug9(`Got ${entries.length} new entries. ` + `Have ${buffer.size} unique-target entries`, entries); if (!timer && MH.sizeOf(buffer)) { timer = MH.setTimer(() => { if (MH.sizeOf(buffer)) { callback([...buffer.values()], this); buffer.clear(); } timer = null; }, debounceWindow); } }; const borderObserver = MH.newResizeObserver(resizeHandler); const contentObserver = MH.newResizeObserver(resizeHandler); if (!borderObserver || !contentObserver) { (0, _log.logWarn)("This browser does not support ResizeObserver. Some features won't work."); } const observeTarget = target => { observedTargets.add(target); borderObserver === null || borderObserver === void 0 || borderObserver.observe(target, { box: "border-box" }); contentObserver === null || contentObserver === void 0 || contentObserver.observe(target); }; // -------------------- this.observe = (...targets) => { debug: logger === null || logger === void 0 || logger.debug10("Observing targets", targets); for (const target of targets) { observeTarget(target); } }; this.observeLater = (...targets) => { debug: logger === null || logger === void 0 || logger.debug10("Observing targets (later)", targets); for (const target of targets) { // Only skip them if not already observed, otherwise the initial // (almost) immediate callback won't happen anyway. if (observedTargets.has(target)) { continue; } targetsToSkip.set(target, 2); observeTarget(target); } }; this.unobserve = (...targets) => { debug: logger === null || logger === void 0 || logger.debug10("Unobserving targets", targets); for (const target of targets) { MH.deleteKey(observedTargets, target); borderObserver === null || borderObserver === void 0 || borderObserver.unobserve(target); contentObserver === null || contentObserver === void 0 || contentObserver.unobserve(target); } }; this.disconnect = () => { debug: logger === null || logger === void 0 || logger.debug10("Disconnecting"); observedTargets = MH.newWeakSet(); borderObserver === null || borderObserver === void 0 || borderObserver.disconnect(); contentObserver === null || contentObserver === void 0 || contentObserver.disconnect(); }; } } exports.XResizeObserver = XResizeObserver; //# sourceMappingURL=x-resize-observer.cjs.map