UNPKG

saij

Version:
197 lines (157 loc) 16.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _Disposable = _interopRequireDefault(require("./Disposable.js")); var _Event = _interopRequireDefault(require("./Event.js")); var _events = require("./utils/events.js"); var _functions = require("./utils/functions.js"); /** * @module saij/core/Target */ /* eslint max-len: 0 */ /** * @typedef {EventTarget|module:saij/core/Target} EventTargetLike */ /** * @classdesc * A simplified implementation of the W3C DOM Level 2 EventTarget interface. * See https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventTarget. * * There are two important simplifications compared to the specification: * * 1. The handling of `useCapture` in `addEventListener` and * `removeEventListener`. There is no real capture model. * 2. The handling of `stopPropagation` and `preventDefault` on `dispatchEvent`. * There is no event target hierarchy. When a listener calls * `stopPropagation` or `preventDefault` on an event object, it means that no * more listeners after this one will be called. Same as when the listener * returns false. */ class Target extends _Disposable.default { constructor() { super(); /** * @private * @type {!Object<string, number>} */ this.pendingRemovals_ = {}; /** * @private * @type {!Object<string, number>} */ this.dispatching_ = {}; /** * @private * @type {!Object<string, Array<module:saij/core/utils/events~ListenerFunction>>} */ this.listeners_ = {}; } /** * @param {string} type Type. * @param {module:saij/core/utils/events~ListenerFunction} listener Listener. */ addEventListener(type, listener) { let listeners = this.listeners_[type]; if (!listeners) { listeners = this.listeners_[type] = []; } if (listeners.indexOf(listener) === -1) { listeners.push(listener); } } /** * Dispatches an event and calls all listeners listening for events * of this type. The event parameter can either be a string or an * Object with a `type` property. * * @param {{type: string, * target: (module:saij/core/Target~EventTargetLike|undefined)}| * module:saij/core/Event|string} event Event object. * @return {boolean|undefined} `false` if anyone called preventDefault on the * event object or if any of the listeners returned false. * @function * @api */ // eslint-disable-next-line max-statements, complexity dispatchEvent(event) { const evt = typeof event === 'string' ? new _Event.default(event) : event; const type = evt.type; evt.target = this; const listeners = this.listeners_[type]; let propagate = null; if (listeners) { if (!(type in this.dispatching_)) { this.dispatching_[type] = 0; this.pendingRemovals_[type] = 0; } this.dispatching_[type] += 1; for (let i = 0, ii = listeners.length; i < ii; i += 1) { // eslint-disable-next-line if (listeners[i].call(this, evt) === false || evt.propagationStopped) { propagate = false; break; } } this.dispatching_[type] -= 1; if (this.dispatching_[type] === 0) { let pendingRemovals = this.pendingRemovals_[type]; Reflect.deleteProperty(this.pendingRemovals_, type); // eslint-disable-next-line while (pendingRemovals--) { this.removeEventListener(type, _functions.VOID); } Reflect.deleteProperty(this.dispatching_, type); } return propagate; } } /** * @inheritDoc */ disposeInternal() { (0, _events.unlistenAll)(this); } /** * Get the listeners for a specified event type. Listeners are returned in the * order that they will be called in. * * @param {string} type Type. * @return {Array<module:saij/core/utils/events~ListenerFunction>} Listeners. */ getListeners(type) { return this.listeners_[type]; } /** * @param {string=} opt_type Type. If not provided, * `true` will be returned if this event target has any listeners. * @return {boolean} Has listeners. */ hasListener(opt_type) { return opt_type ? opt_type in this.listeners_ : Object.keys(this.listeners_).length > 0; } /** * @param {string} type Type. * @param {module:saij/core/utils/events~ListenerFunction} listener Listener. */ removeEventListener(type, listener) { const listeners = this.listeners_[type]; if (listeners) { const index = listeners.indexOf(listener); if (type in this.pendingRemovals_) { // make listener a no-op, and remove later in #dispatchEvent() listeners[index] = _functions.VOID; this.pendingRemovals_[type] += 1; } else { listeners.splice(index, 1); if (listeners.length === 0) { Reflect.deleteProperty(this.listeners_, type); } } } } } var _default = Target; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zYWlqL2NvcmUvVGFyZ2V0LmpzIl0sIm5hbWVzIjpbIlRhcmdldCIsIkRpc3Bvc2FibGUiLCJjb25zdHJ1Y3RvciIsInBlbmRpbmdSZW1vdmFsc18iLCJkaXNwYXRjaGluZ18iLCJsaXN0ZW5lcnNfIiwiYWRkRXZlbnRMaXN0ZW5lciIsInR5cGUiLCJsaXN0ZW5lciIsImxpc3RlbmVycyIsImluZGV4T2YiLCJwdXNoIiwiZGlzcGF0Y2hFdmVudCIsImV2ZW50IiwiZXZ0IiwiRXZlbnQiLCJ0YXJnZXQiLCJwcm9wYWdhdGUiLCJpIiwiaWkiLCJsZW5ndGgiLCJjYWxsIiwicHJvcGFnYXRpb25TdG9wcGVkIiwicGVuZGluZ1JlbW92YWxzIiwiUmVmbGVjdCIsImRlbGV0ZVByb3BlcnR5IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIlZPSUQiLCJkaXNwb3NlSW50ZXJuYWwiLCJnZXRMaXN0ZW5lcnMiLCJoYXNMaXN0ZW5lciIsIm9wdF90eXBlIiwiT2JqZWN0Iiwia2V5cyIsImluZGV4Iiwic3BsaWNlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFHQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFOQTs7OztBQVFBOztBQUdBOzs7O0FBS0E7Ozs7Ozs7Ozs7Ozs7OztBQWVBLE1BQU1BLE1BQU4sU0FBcUJDLG1CQUFyQixDQUFnQztBQUM5QkMsRUFBQUEsV0FBVyxHQUFHO0FBRVo7QUFFQTs7Ozs7QUFJQSxTQUFLQyxnQkFBTCxHQUF3QixFQUF4QjtBQUVBOzs7OztBQUlBLFNBQUtDLFlBQUwsR0FBb0IsRUFBcEI7QUFFQTs7Ozs7QUFJQSxTQUFLQyxVQUFMLEdBQWtCLEVBQWxCO0FBRUQ7QUFFRDs7Ozs7O0FBSUFDLEVBQUFBLGdCQUFnQixDQUFDQyxJQUFELEVBQU9DLFFBQVAsRUFBaUI7QUFDL0IsUUFBSUMsU0FBUyxHQUFHLEtBQUtKLFVBQUwsQ0FBZ0JFLElBQWhCLENBQWhCOztBQUNBLFFBQUksQ0FBQ0UsU0FBTCxFQUFnQjtBQUNkQSxN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QixLQUFLLEdBQUd6QixTQUFTLENBQUNDLE9BQVYsQ0FBa0JGLFFBQWxCLENBQWQ7O0FBQ0EsVUFBSUQsSUFBSSxJQUFJLEtBQUtKLGdCQUFqQixFQUFtQztBQUNqQztBQUNBTSxRQUFBQSxTQUFTLENBQUN5QixLQUFELENBQVQsR0FBbUJQLGVBQW5CO0FBQ0EsYUFBS3hCLGdCQUFMLENBQXNCSSxJQUF0QixLQUErQixDQUEvQjtBQUNELE9BSkQsTUFJTztBQUNMRSxRQUFBQSxTQUFTLENBQUMwQixNQUFWLENBQWlCRCxLQUFqQixFQUF3QixDQUF4Qjs7QUFDQSxZQUFJekIsU0FBUyxDQUFDVyxNQUFWLEtBQXFCLENBQXpCLEVBQTRCO0FBQzFCSSxVQUFBQSxPQUFPLENBQUNDLGNBQVIsQ0FBdUIsS0FBS3BCLFVBQTVCLEVBQXdDRSxJQUF4QztBQUNEO0FBQ0Y7QUFDRjtBQUNGOztBQXRJNkI7O2VBMElqQlAsTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQG1vZHVsZSBzYWlqL2NvcmUvVGFyZ2V0XG4gKi9cbmltcG9ydCBEaXNwb3NhYmxlIGZyb20gJy4vRGlzcG9zYWJsZS5qcyc7XG5pbXBvcnQgRXZlbnQgZnJvbSAnLi9FdmVudC5qcyc7XG5pbXBvcnQge3VubGlzdGVuQWxsfSBmcm9tICcuL3V0aWxzL2V2ZW50cy5qcyc7XG5pbXBvcnQge1ZPSUR9IGZyb20gJy4vdXRpbHMvZnVuY3Rpb25zLmpzJztcblxuLyogZXNsaW50IG1heC1sZW46IDAgKi9cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtFdmVudFRhcmdldHxtb2R1bGU6c2Fpai9jb3JlL1RhcmdldH0gRXZlbnRUYXJnZXRMaWtlXG4gKi9cblxuXG4vKipcbiAqIEBjbGFzc2Rlc2NcbiAqIEEgc2ltcGxpZmllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgVzNDIERPTSBMZXZlbCAyIEV2ZW50VGFyZ2V0IGludGVyZmFjZS5cbiAqIFNlZSBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItRXZlbnRzLTIwMDAxMTEzL2V2ZW50cy5odG1sI0V2ZW50cy1FdmVudFRhcmdldC5cbiAqXG4gKiBUaGVyZSBhcmUgdHdvIGltcG9ydGFudCBzaW1wbGlmaWNhdGlvbnMgY29tcGFyZWQgdG8gdGhlIHNwZWNpZmljYXRpb246XG4gKlxuICogMS4gVGhlIGhhbmRsaW5nIG9mIGB1c2VDYXB0dXJlYCBpbiBgYWRkRXZlbnRMaXN0ZW5lcmAgYW5kXG4gKiAgICBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuIFRoZXJlIGlzIG5vIHJlYWwgY2FwdHVyZSBtb2RlbC5cbiAqIDIuIFRoZSBoYW5kbGluZyBvZiBgc3RvcFByb3BhZ2F0aW9uYCBhbmQgYHByZXZlbnREZWZhdWx0YCBvbiBgZGlzcGF0Y2hFdmVudGAuXG4gKiAgICBUaGVyZSBpcyBubyBldmVudCB0YXJnZXQgaGllcmFyY2h5LiBXaGVuIGEgbGlzdGVuZXIgY2FsbHNcbiAqICAgIGBzdG9wUHJvcGFnYXRpb25gIG9yIGBwcmV2ZW50RGVmYXVsdGAgb24gYW4gZXZlbnQgb2JqZWN0LCBpdCBtZWFucyB0aGF0IG5vXG4gKiAgICBtb3JlIGxpc3RlbmVycyBhZnRlciB0aGlzIG9uZSB3aWxsIGJlIGNhbGxlZC4gU2FtZSBhcyB3aGVuIHRoZSBsaXN0ZW5lclxuICogICAgcmV0dXJucyBmYWxzZS5cbiAqL1xuY2xhc3MgVGFyZ2V0IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgc3VwZXIoKTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUgeyFPYmplY3Q8c3RyaW5nLCBudW1iZXI+fVxuICAgICAqL1xuICAgIHRoaXMucGVuZGluZ1JlbW92YWxzXyA9IHt9O1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsIG51bWJlcj59XG4gICAgICovXG4gICAgdGhpcy5kaXNwYXRjaGluZ18gPSB7fTtcblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlXG4gICAgICogQHR5cGUgeyFPYmplY3Q8c3RyaW5nLCBBcnJheTxtb2R1bGU6c2Fpai9jb3JlL3V0aWxzL2V2ZW50c35MaXN0ZW5lckZ1bmN0aW9uPj59XG4gICAgICovXG4gICAgdGhpcy5saXN0ZW5lcnNfID0ge307XG5cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUeXBlLlxuICAgKiBAcGFyYW0ge21vZHVsZTpzYWlqL2NvcmUvdXRpbHMvZXZlbnRzfkxpc3RlbmVyRnVuY3Rpb259IGxpc3RlbmVyIExpc3RlbmVyLlxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGxldCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc19bdHlwZV07XG4gICAgaWYgKCFsaXN0ZW5lcnMpIHtcbiAgICAgIGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzX1t0eXBlXSA9IFtdO1xuICAgIH1cbiAgICBpZiAobGlzdGVuZXJzLmluZGV4T2YobGlzdGVuZXIpID09PSAtMSkge1xuICAgICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IGFuZCBjYWxscyBhbGwgbGlzdGVuZXJzIGxpc3RlbmluZyBmb3IgZXZlbnRzXG4gICAqIG9mIHRoaXMgdHlwZS4gVGhlIGV2ZW50IHBhcmFtZXRlciBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIG9yIGFuXG4gICAqIE9iamVjdCB3aXRoIGEgYHR5cGVgIHByb3BlcnR5LlxuICAgKlxuICAgKiBAcGFyYW0ge3t0eXBlOiBzdHJpbmcsXG4gICAqICAgICB0YXJnZXQ6IChtb2R1bGU6c2Fpai9jb3JlL1RhcmdldH5FdmVudFRhcmdldExpa2V8dW5kZWZpbmVkKX18XG4gICAqICAgICBtb2R1bGU6c2Fpai9jb3JlL0V2ZW50fHN0cmluZ30gZXZlbnQgRXZlbnQgb2JqZWN0LlxuICAgKiBAcmV0dXJuIHtib29sZWFufHVuZGVmaW5lZH0gYGZhbHNlYCBpZiBhbnlvbmUgY2FsbGVkIHByZXZlbnREZWZhdWx0IG9uIHRoZVxuICAgKiAgICAgZXZlbnQgb2JqZWN0IG9yIGlmIGFueSBvZiB0aGUgbGlzdGVuZXJzIHJldHVybmVkIGZhbHNlLlxuICAgKiBAZnVuY3Rpb25cbiAgICogQGFwaVxuICAgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzLCBjb21wbGV4aXR5XG4gIGRpc3BhdGNoRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCBldnQgPSB0eXBlb2YgZXZlbnQgPT09ICdzdHJpbmcnID8gbmV3IEV2ZW50KGV2ZW50KSA6IGV2ZW50O1xuICAgIGNvbnN0IHR5cGUgPSBldnQudHlwZTtcbiAgICBldnQudGFyZ2V0ID0gdGhpcztcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVyc19bdHlwZV07XG4gICAgbGV0IHByb3BhZ2F0ZSA9IG51bGw7XG4gICAgaWYgKGxpc3RlbmVycykge1xuICAgICAgaWYgKCEodHlwZSBpbiB0aGlzLmRpc3BhdGNoaW5nXykpIHtcbiAgICAgICAgdGhpcy5kaXNwYXRjaGluZ19bdHlwZV0gPSAwO1xuICAgICAgICB0aGlzLnBlbmRpbmdSZW1vdmFsc19bdHlwZV0gPSAwO1xuICAgICAgfVxuICAgICAgdGhpcy5kaXNwYXRjaGluZ19bdHlwZV0gKz0gMTtcbiAgICAgIGZvciAobGV0IGkgPSAwLCBpaSA9IGxpc3RlbmVycy5sZW5ndGg7IGkgPCBpaTsgaSArPSAxKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZVxuICAgICAgICBpZiAobGlzdGVuZXJzW2ldLmNhbGwodGhpcywgZXZ0KSA9PT0gZmFsc2UgfHwgZXZ0LnByb3BhZ2F0aW9uU3RvcHBlZCkge1xuICAgICAgICAgIHByb3BhZ2F0ZSA9IGZhbHNlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aGlzLmRpc3BhdGNoaW5nX1t0eXBlXSAtPSAxO1xuICAgICAgaWYgKHRoaXMuZGlzcGF0Y2hpbmdfW3R5cGVdID09PSAwKSB7XG4gICAgICAgIGxldCBwZW5kaW5nUmVtb3ZhbHMgPSB0aGlzLnBlbmRpbmdSZW1vdmFsc19bdHlwZV07XG4gICAgICAgIFJlZmxlY3QuZGVsZXRlUHJvcGVydHkodGhpcy5wZW5kaW5nUmVtb3ZhbHNfLCB0eXBlKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgICAgIHdoaWxlIChwZW5kaW5nUmVtb3ZhbHMtLSkge1xuICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBWT0lEKTtcbiAgICAgICAgfVxuICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRoaXMuZGlzcGF0Y2hpbmdfLCB0eXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wYWdhdGU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBpbmhlcml0RG9jXG4gICAqL1xuICBkaXNwb3NlSW50ZXJuYWwoKSB7XG4gICAgdW5saXN0ZW5BbGwodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBsaXN0ZW5lcnMgZm9yIGEgc3BlY2lmaWVkIGV2ZW50IHR5cGUuIExpc3RlbmVycyBhcmUgcmV0dXJuZWQgaW4gdGhlXG4gICAqIG9yZGVyIHRoYXQgdGhleSB3aWxsIGJlIGNhbGxlZCBpbi5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZS5cbiAgICogQHJldHVybiB7QXJyYXk8bW9kdWxlOnNhaWovY29yZS91dGlscy9ldmVudHN+TGlzdGVuZXJGdW5jdGlvbj59IExpc3RlbmVycy5cbiAgICovXG4gIGdldExpc3RlbmVycyh0eXBlKSB7XG4gICAgcmV0dXJuIHRoaXMubGlzdGVuZXJzX1t0eXBlXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF90eXBlIFR5cGUuIElmIG5vdCBwcm92aWRlZCxcbiAgICogICAgIGB0cnVlYCB3aWxsIGJlIHJldHVybmVkIGlmIHRoaXMgZXZlbnQgdGFyZ2V0IGhhcyBhbnkgbGlzdGVuZXJzLlxuICAgKiBAcmV0dXJuIHtib29sZWFufSBIYXMgbGlzdGVuZXJzLlxuICAgKi9cbiAgaGFzTGlzdGVuZXIob3B0X3R5cGUpIHtcbiAgICByZXR1cm4gb3B0X3R5cGUgP1xuICAgICAgb3B0X3R5cGUgaW4gdGhpcy5saXN0ZW5lcnNfIDpcbiAgICAgIE9iamVjdC5rZXlzKHRoaXMubGlzdGVuZXJzXykubGVuZ3RoID4gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUeXBlLlxuICAgKiBAcGFyYW0ge21vZHVsZTpzYWlqL2NvcmUvdXRpbHMvZXZlbnRzfkxpc3RlbmVyRnVuY3Rpb259IGxpc3RlbmVyIExpc3RlbmVyLlxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcikge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubGlzdGVuZXJzX1t0eXBlXTtcbiAgICBpZiAobGlzdGVuZXJzKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIGlmICh0eXBlIGluIHRoaXMucGVuZGluZ1JlbW92YWxzXykge1xuICAgICAgICAvLyBtYWtlIGxpc3RlbmVyIGEgbm8tb3AsIGFuZCByZW1vdmUgbGF0ZXIgaW4gI2Rpc3BhdGNoRXZlbnQoKVxuICAgICAgICBsaXN0ZW5lcnNbaW5kZXhdID0gVk9JRDtcbiAgICAgICAgdGhpcy5wZW5kaW5nUmVtb3ZhbHNfW3R5cGVdICs9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgaWYgKGxpc3RlbmVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRoaXMubGlzdGVuZXJzXywgdHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgZGVmYXVsdCBUYXJnZXQ7XG4iXX0=