UNPKG

@xo-union/event-target-shim

Version:

An implementation of WHATWG EventTarget interface.

1 lines 38.7 kB
{"version":3,"file":"event-target-shim.mjs","sources":["../src/event.mjs","../src/event-target.mjs"],"sourcesContent":["/**\n * @typedef {object} PrivateData\n * @property {EventTarget} eventTarget The event target.\n * @property {{type:string}} event The original event object.\n * @property {number} eventPhase The current event phase.\n * @property {EventTarget|null} currentTarget The current event target.\n * @property {boolean} canceled The flag to prevent default.\n * @property {boolean} stopped The flag to stop propagation.\n * @property {boolean} immediateStopped The flag to stop propagation immediately.\n * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null.\n * @property {number} timeStamp The unix time.\n * @private\n */\n\n/**\n * Private data for event wrappers.\n * @type {WeakMap<Event, PrivateData>}\n * @private\n */\nconst privateData = new WeakMap()\n\n/**\n * Cache for wrapper classes.\n * @type {WeakMap<Object, Function>}\n * @private\n */\nconst wrappers = new WeakMap()\n\n/**\n * Get private data.\n * @param {Event} event The event object to get private data.\n * @returns {PrivateData} The private data of the event.\n * @private\n */\nfunction pd(event) {\n const retv = privateData.get(event)\n console.assert(\n retv != null,\n \"'this' is expected an Event object, but got\",\n event\n )\n return retv\n}\n\n/**\n * https://dom.spec.whatwg.org/#set-the-canceled-flag\n * @param data {PrivateData} private data.\n */\nfunction setCancelFlag(data) {\n if (data.passiveListener != null) {\n if (\n typeof console !== \"undefined\" &&\n typeof console.error === \"function\"\n ) {\n console.error(\n \"Unable to preventDefault inside passive event listener invocation.\",\n data.passiveListener\n )\n }\n return\n }\n if (!data.event.cancelable) {\n return\n }\n\n data.canceled = true\n if (typeof data.event.preventDefault === \"function\") {\n data.event.preventDefault()\n }\n}\n\n/**\n * @see https://dom.spec.whatwg.org/#interface-event\n * @private\n */\n/**\n * The event wrapper.\n * @constructor\n * @param {EventTarget} eventTarget The event target of this dispatching.\n * @param {Event|{type:string}} event The original event to wrap.\n */\nfunction Event(eventTarget, event) {\n privateData.set(this, {\n eventTarget,\n event,\n eventPhase: 2,\n currentTarget: eventTarget,\n canceled: false,\n stopped: false,\n immediateStopped: false,\n passiveListener: null,\n timeStamp: event.timeStamp || Date.now(),\n })\n\n // https://heycam.github.io/webidl/#Unforgeable\n Object.defineProperty(this, \"isTrusted\", { value: false, enumerable: true })\n\n // Define accessors\n const keys = Object.keys(event)\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i]\n if (!(key in this)) {\n Object.defineProperty(this, key, defineRedirectDescriptor(key))\n }\n }\n}\n\n// Should be enumerable, but class methods are not enumerable.\nEvent.prototype = {\n /**\n * The type of this event.\n * @type {string}\n */\n get type() {\n return pd(this).event.type\n },\n\n /**\n * The target of this event.\n * @type {EventTarget}\n */\n get target() {\n return pd(this).eventTarget\n },\n\n /**\n * The target of this event.\n * @type {EventTarget}\n */\n get currentTarget() {\n return pd(this).currentTarget\n },\n\n /**\n * @returns {EventTarget[]} The composed path of this event.\n */\n composedPath() {\n const currentTarget = pd(this).currentTarget\n if (currentTarget == null) {\n return []\n }\n return [currentTarget]\n },\n\n /**\n * Constant of NONE.\n * @type {number}\n */\n get NONE() {\n return 0\n },\n\n /**\n * Constant of CAPTURING_PHASE.\n * @type {number}\n */\n get CAPTURING_PHASE() {\n return 1\n },\n\n /**\n * Constant of AT_TARGET.\n * @type {number}\n */\n get AT_TARGET() {\n return 2\n },\n\n /**\n * Constant of BUBBLING_PHASE.\n * @type {number}\n */\n get BUBBLING_PHASE() {\n return 3\n },\n\n /**\n * The target of this event.\n * @type {number}\n */\n get eventPhase() {\n return pd(this).eventPhase\n },\n\n /**\n * Stop event bubbling.\n * @returns {void}\n */\n stopPropagation() {\n const data = pd(this)\n\n data.stopped = true\n if (typeof data.event.stopPropagation === \"function\") {\n data.event.stopPropagation()\n }\n },\n\n /**\n * Stop event bubbling.\n * @returns {void}\n */\n stopImmediatePropagation() {\n const data = pd(this)\n\n data.stopped = true\n data.immediateStopped = true\n if (typeof data.event.stopImmediatePropagation === \"function\") {\n data.event.stopImmediatePropagation()\n }\n },\n\n /**\n * The flag to be bubbling.\n * @type {boolean}\n */\n get bubbles() {\n return Boolean(pd(this).event.bubbles)\n },\n\n /**\n * The flag to be cancelable.\n * @type {boolean}\n */\n get cancelable() {\n return Boolean(pd(this).event.cancelable)\n },\n\n /**\n * Cancel this event.\n * @returns {void}\n */\n preventDefault() {\n setCancelFlag(pd(this))\n },\n\n /**\n * The flag to indicate cancellation state.\n * @type {boolean}\n */\n get defaultPrevented() {\n return pd(this).canceled\n },\n\n /**\n * The flag to be composed.\n * @type {boolean}\n */\n get composed() {\n return Boolean(pd(this).event.composed)\n },\n\n /**\n * The unix time of this event.\n * @type {number}\n */\n get timeStamp() {\n return pd(this).timeStamp\n },\n\n /**\n * The target of this event.\n * @type {EventTarget}\n * @deprecated\n */\n get srcElement() {\n return pd(this).eventTarget\n },\n\n /**\n * The flag to stop event bubbling.\n * @type {boolean}\n * @deprecated\n */\n get cancelBubble() {\n return pd(this).stopped\n },\n set cancelBubble(value) {\n if (!value) {\n return\n }\n const data = pd(this)\n\n data.stopped = true\n if (typeof data.event.cancelBubble === \"boolean\") {\n data.event.cancelBubble = true\n }\n },\n\n /**\n * The flag to indicate cancellation state.\n * @type {boolean}\n * @deprecated\n */\n get returnValue() {\n return !pd(this).canceled\n },\n set returnValue(value) {\n if (!value) {\n setCancelFlag(pd(this))\n }\n },\n\n /**\n * Initialize this event object. But do nothing under event dispatching.\n * @param {string} type The event type.\n * @param {boolean} [bubbles=false] The flag to be possible to bubble up.\n * @param {boolean} [cancelable=false] The flag to be possible to cancel.\n * @deprecated\n */\n initEvent() {\n // Do nothing.\n },\n}\n\n// `constructor` is not enumerable.\nObject.defineProperty(Event.prototype, \"constructor\", {\n value: Event,\n configurable: true,\n writable: true,\n})\n\n// Ensure `event instanceof window.Event` is `true`.\nif (typeof window !== \"undefined\" && typeof window.Event !== \"undefined\") {\n Object.setPrototypeOf(Event.prototype, window.Event.prototype)\n\n // Make association for wrappers.\n wrappers.set(window.Event.prototype, Event)\n}\n\n/**\n * Get the property descriptor to redirect a given property.\n * @param {string} key Property name to define property descriptor.\n * @returns {PropertyDescriptor} The property descriptor to redirect the property.\n * @private\n */\nfunction defineRedirectDescriptor(key) {\n return {\n get() {\n return pd(this).event[key]\n },\n set(value) {\n pd(this).event[key] = value\n },\n configurable: true,\n enumerable: true,\n }\n}\n\n/**\n * Get the property descriptor to call a given method property.\n * @param {string} key Property name to define property descriptor.\n * @returns {PropertyDescriptor} The property descriptor to call the method property.\n * @private\n */\nfunction defineCallDescriptor(key) {\n return {\n value() {\n const event = pd(this).event\n return event[key].apply(event, arguments)\n },\n configurable: true,\n enumerable: true,\n }\n}\n\n/**\n * Define new wrapper class.\n * @param {Function} BaseEvent The base wrapper class.\n * @param {Object} proto The prototype of the original event.\n * @returns {Function} The defined wrapper class.\n * @private\n */\nfunction defineWrapper(BaseEvent, proto) {\n const keys = Object.keys(proto)\n if (keys.length === 0) {\n return BaseEvent\n }\n\n /** CustomEvent */\n function CustomEvent(eventTarget, event) {\n BaseEvent.call(this, eventTarget, event)\n }\n\n CustomEvent.prototype = Object.create(BaseEvent.prototype, {\n constructor: { value: CustomEvent, configurable: true, writable: true },\n })\n\n // Define accessors.\n for (let i = 0; i < keys.length; ++i) {\n const key = keys[i]\n if (!(key in BaseEvent.prototype)) {\n const descriptor = Object.getOwnPropertyDescriptor(proto, key)\n const isFunc = typeof descriptor.value === \"function\"\n Object.defineProperty(\n CustomEvent.prototype,\n key,\n isFunc\n ? defineCallDescriptor(key)\n : defineRedirectDescriptor(key)\n )\n }\n }\n\n return CustomEvent\n}\n\n/**\n * Get the wrapper class of a given prototype.\n * @param {Object} proto The prototype of the original event to get its wrapper.\n * @returns {Function} The wrapper class.\n * @private\n */\nfunction getWrapper(proto) {\n if (proto == null || proto === Object.prototype) {\n return Event\n }\n\n let wrapper = wrappers.get(proto)\n if (wrapper == null) {\n wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto)\n wrappers.set(proto, wrapper)\n }\n return wrapper\n}\n\n/**\n * Wrap a given event to management a dispatching.\n * @param {EventTarget} eventTarget The event target of this dispatching.\n * @param {Object} event The event to wrap.\n * @returns {Event} The wrapper instance.\n * @private\n */\nexport function wrapEvent(eventTarget, event) {\n const Wrapper = getWrapper(Object.getPrototypeOf(event))\n return new Wrapper(eventTarget, event)\n}\n\n/**\n * Get the immediateStopped flag of a given event.\n * @param {Event} event The event to get.\n * @returns {boolean} The flag to stop propagation immediately.\n * @private\n */\nexport function isStopped(event) {\n return pd(event).immediateStopped\n}\n\n/**\n * Set the current event phase of a given event.\n * @param {Event} event The event to set current target.\n * @param {number} eventPhase New event phase.\n * @returns {void}\n * @private\n */\nexport function setEventPhase(event, eventPhase) {\n pd(event).eventPhase = eventPhase\n}\n\n/**\n * Set the current target of a given event.\n * @param {Event} event The event to set current target.\n * @param {EventTarget|null} currentTarget New current target.\n * @returns {void}\n * @private\n */\nexport function setCurrentTarget(event, currentTarget) {\n pd(event).currentTarget = currentTarget\n}\n\n/**\n * Set a passive listener of a given event.\n * @param {Event} event The event to set current target.\n * @param {Function|null} passiveListener New passive listener.\n * @returns {void}\n * @private\n */\nexport function setPassiveListener(event, passiveListener) {\n pd(event).passiveListener = passiveListener\n}\n","import {\n isStopped,\n setCurrentTarget,\n setEventPhase,\n setPassiveListener,\n wrapEvent,\n} from \"./event.mjs\"\n\n/**\n * @typedef {object} ListenerNode\n * @property {Function} listener\n * @property {1|2|3} listenerType\n * @property {boolean} passive\n * @property {boolean} once\n * @property {ListenerNode|null} next\n * @private\n */\n\n/**\n * @type {WeakMap<object, Map<string, ListenerNode>>}\n * @private\n */\nconst listenersMap = new WeakMap()\n\n// Listener types\nconst CAPTURE = 1\nconst BUBBLE = 2\nconst ATTRIBUTE = 3\n\n/**\n * Check whether a given value is an object or not.\n * @param {any} x The value to check.\n * @returns {boolean} `true` if the value is an object.\n */\nfunction isObject(x) {\n return x !== null && typeof x === \"object\" //eslint-disable-line no-restricted-syntax\n}\n\n/**\n * Get listeners.\n * @param {EventTarget} eventTarget The event target to get.\n * @returns {Map<string, ListenerNode>} The listeners.\n * @private\n */\nfunction getListeners(eventTarget) {\n const listeners = listenersMap.get(eventTarget)\n if (listeners == null) {\n throw new TypeError(\n \"'this' is expected an EventTarget object, but got another value.\"\n )\n }\n return listeners\n}\n\n/**\n * Get the property descriptor for the event attribute of a given event.\n * @param {string} eventName The event name to get property descriptor.\n * @returns {PropertyDescriptor} The property descriptor.\n * @private\n */\nfunction defineEventAttributeDescriptor(eventName) {\n return {\n get() {\n const listeners = getListeners(this)\n let node = listeners.get(eventName)\n while (node != null) {\n if (node.listenerType === ATTRIBUTE) {\n return node.listener\n }\n node = node.next\n }\n return null\n },\n\n set(listener) {\n if (typeof listener !== \"function\" && !isObject(listener)) {\n listener = null // eslint-disable-line no-param-reassign\n }\n const listeners = getListeners(this)\n\n // Traverse to the tail while removing old value.\n let prev = null\n let node = listeners.get(eventName)\n while (node != null) {\n if (node.listenerType === ATTRIBUTE) {\n // Remove old value.\n if (prev !== null) {\n prev.next = node.next\n } else if (node.next !== null) {\n listeners.set(eventName, node.next)\n } else {\n listeners.delete(eventName)\n }\n } else {\n prev = node\n }\n\n node = node.next\n }\n\n // Add new value.\n if (listener !== null) {\n const newNode = {\n listener,\n listenerType: ATTRIBUTE,\n passive: false,\n once: false,\n next: null,\n }\n if (prev === null) {\n listeners.set(eventName, newNode)\n } else {\n prev.next = newNode\n }\n }\n },\n configurable: true,\n enumerable: true,\n }\n}\n\n/**\n * Define an event attribute (e.g. `eventTarget.onclick`).\n * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite.\n * @param {string} eventName The event name to define.\n * @returns {void}\n */\nfunction defineEventAttribute(eventTargetPrototype, eventName) {\n Object.defineProperty(\n eventTargetPrototype,\n `on${eventName}`,\n defineEventAttributeDescriptor(eventName)\n )\n}\n\n/**\n * Define a custom EventTarget with event attributes.\n * @param {string[]} eventNames Event names for event attributes.\n * @returns {EventTarget} The custom EventTarget.\n * @private\n */\nfunction defineCustomEventTarget(eventNames) {\n /** CustomEventTarget */\n function CustomEventTarget() {\n EventTarget.call(this)\n }\n\n CustomEventTarget.prototype = Object.create(EventTarget.prototype, {\n constructor: {\n value: CustomEventTarget,\n configurable: true,\n writable: true,\n },\n })\n\n for (let i = 0; i < eventNames.length; ++i) {\n defineEventAttribute(CustomEventTarget.prototype, eventNames[i])\n }\n\n return CustomEventTarget\n}\n\n/**\n * EventTarget.\n *\n * - This is constructor if no arguments.\n * - This is a function which returns a CustomEventTarget constructor if there are arguments.\n *\n * For example:\n *\n * class A extends EventTarget {}\n * class B extends EventTarget(\"message\") {}\n * class C extends EventTarget(\"message\", \"error\") {}\n * class D extends EventTarget([\"message\", \"error\"]) {}\n */\nfunction EventTarget() {\n /*eslint-disable consistent-return */\n if (this instanceof EventTarget) {\n listenersMap.set(this, new Map())\n return\n }\n if (arguments.length === 1 && Array.isArray(arguments[0])) {\n return defineCustomEventTarget(arguments[0])\n }\n if (arguments.length > 0) {\n const types = new Array(arguments.length)\n for (let i = 0; i < arguments.length; ++i) {\n types[i] = arguments[i]\n }\n return defineCustomEventTarget(types)\n }\n throw new TypeError(\"Cannot call a class as a function\")\n /*eslint-enable consistent-return */\n}\n\n// Should be enumerable, but class methods are not enumerable.\nEventTarget.prototype = {\n /**\n * Add a given listener to this event target.\n * @param {string} eventName The event name to add.\n * @param {Function} listener The listener to add.\n * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.\n * @returns {void}\n */\n addEventListener(eventName, listener, options) {\n if (listener == null) {\n return\n }\n if (typeof listener !== \"function\" && !isObject(listener)) {\n throw new TypeError(\"'listener' should be a function or an object.\")\n }\n\n const listeners = getListeners(this)\n const optionsIsObj = isObject(options)\n const capture = optionsIsObj\n ? Boolean(options.capture)\n : Boolean(options)\n const listenerType = capture ? CAPTURE : BUBBLE\n const newNode = {\n listener,\n listenerType,\n passive: optionsIsObj && Boolean(options.passive),\n once: optionsIsObj && Boolean(options.once),\n next: null,\n }\n\n // Set it as the first node if the first node is null.\n let node = listeners.get(eventName)\n if (node === undefined) {\n listeners.set(eventName, newNode)\n return\n }\n\n // Traverse to the tail while checking duplication..\n let prev = null\n while (node != null) {\n if (\n node.listener === listener &&\n node.listenerType === listenerType\n ) {\n // Should ignore duplication.\n return\n }\n prev = node\n node = node.next\n }\n\n // Add it.\n prev.next = newNode\n },\n\n /**\n * Remove a given listener from this event target.\n * @param {string} eventName The event name to remove.\n * @param {Function} listener The listener to remove.\n * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener.\n * @returns {void}\n */\n removeEventListener(eventName, listener, options) {\n if (listener == null) {\n return\n }\n\n const listeners = getListeners(this)\n const capture = isObject(options)\n ? Boolean(options.capture)\n : Boolean(options)\n const listenerType = capture ? CAPTURE : BUBBLE\n\n let prev = null\n let node = listeners.get(eventName)\n while (node != null) {\n if (\n node.listener === listener &&\n node.listenerType === listenerType\n ) {\n if (prev !== null) {\n prev.next = node.next\n } else if (node.next !== null) {\n listeners.set(eventName, node.next)\n } else {\n listeners.delete(eventName)\n }\n return\n }\n\n prev = node\n node = node.next\n }\n },\n\n /**\n * Dispatch a given event.\n * @param {Event|{type:string}} event The event to dispatch.\n * @returns {boolean} `false` if canceled.\n */\n dispatchEvent(event) {\n if (event == null || typeof event.type !== \"string\") {\n throw new TypeError('\"event.type\" should be a string.')\n }\n\n // If listeners aren't registered, terminate.\n const listeners = getListeners(this)\n const eventName = event.type\n let node = listeners.get(eventName)\n if (node == null) {\n return true\n }\n\n // Since we cannot rewrite several properties, so wrap object.\n const wrappedEvent = wrapEvent(this, event)\n\n // This doesn't process capturing phase and bubbling phase.\n // This isn't participating in a tree.\n let prev = null\n while (node != null) {\n // Remove this listener if it's once\n if (node.once) {\n if (prev !== null) {\n prev.next = node.next\n } else if (node.next !== null) {\n listeners.set(eventName, node.next)\n } else {\n listeners.delete(eventName)\n }\n } else {\n prev = node\n }\n\n // Call this listener\n setPassiveListener(\n wrappedEvent,\n node.passive ? node.listener : null\n )\n if (typeof node.listener === \"function\") {\n try {\n node.listener.call(this, wrappedEvent)\n } catch (err) {\n if (\n typeof console !== \"undefined\" &&\n typeof console.error === \"function\"\n ) {\n console.error(err)\n }\n }\n } else if (\n node.listenerType !== ATTRIBUTE &&\n typeof node.listener.handleEvent === \"function\"\n ) {\n node.listener.handleEvent(wrappedEvent)\n }\n\n // Break if `event.stopImmediatePropagation` was called.\n if (isStopped(wrappedEvent)) {\n break\n }\n\n node = node.next\n }\n setPassiveListener(wrappedEvent, null)\n setEventPhase(wrappedEvent, 0)\n setCurrentTarget(wrappedEvent, null)\n\n return !wrappedEvent.defaultPrevented\n },\n}\n\n// `constructor` is not enumerable.\nObject.defineProperty(EventTarget.prototype, \"constructor\", {\n value: EventTarget,\n configurable: true,\n writable: true,\n})\n\n// Ensure `eventTarget instanceof window.EventTarget` is `true`.\nif (\n typeof window !== \"undefined\" &&\n typeof window.EventTarget !== \"undefined\"\n) {\n Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype)\n}\n\nexport { defineEventAttribute, EventTarget }\nexport default EventTarget\n"],"names":["privateData","WeakMap","wrappers","pd","event","retv","get","console","assert","setCancelFlag","data","passiveListener","error","cancelable","canceled","preventDefault","Event","eventTarget","set","eventPhase","currentTarget","stopped","immediateStopped","timeStamp","Date","now","Object","defineProperty","value","enumerable","keys","i","length","key","defineRedirectDescriptor","prototype","type","target","composedPath","NONE","CAPTURING_PHASE","AT_TARGET","BUBBLING_PHASE","stopPropagation","stopImmediatePropagation","bubbles","Boolean","defaultPrevented","composed","srcElement","cancelBubble","returnValue","initEvent","configurable","writable","window","setPrototypeOf","defineCallDescriptor","apply","arguments","defineWrapper","BaseEvent","proto","CustomEvent","call","create","constructor","descriptor","getOwnPropertyDescriptor","isFunc","getWrapper","wrapper","getPrototypeOf","wrapEvent","Wrapper","isStopped","setEventPhase","setCurrentTarget","setPassiveListener","listenersMap","CAPTURE","BUBBLE","ATTRIBUTE","isObject","x","getListeners","listeners","TypeError","defineEventAttributeDescriptor","eventName","node","listenerType","listener","next","prev","delete","newNode","passive","once","defineEventAttribute","eventTargetPrototype","defineCustomEventTarget","eventNames","CustomEventTarget","EventTarget","Map","Array","isArray","types","addEventListener","options","optionsIsObj","capture","undefined","removeEventListener","dispatchEvent","wrappedEvent","err","handleEvent"],"mappings":"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"}