diff options
Diffstat (limited to 'alarm/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js')
-rw-r--r-- | alarm/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js | 403 |
1 files changed, 0 insertions, 403 deletions
diff --git a/alarm/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js b/alarm/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js deleted file mode 100644 index 15152fd..0000000 --- a/alarm/node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js +++ /dev/null @@ -1,403 +0,0 @@ -"use strict"; -const DOMException = require("domexception/webidl2js-wrapper"); - -const reportException = require("../helpers/runtime-script-errors"); -const idlUtils = require("../generated/utils"); -const { nodeRoot } = require("../helpers/node"); -const { - isNode, isShadowRoot, isSlotable, getEventTargetParent, - isShadowInclusiveAncestor, retarget -} = require("../helpers/shadow-dom"); - -const MouseEvent = require("../generated/MouseEvent"); - -const EVENT_PHASE = { - NONE: 0, - CAPTURING_PHASE: 1, - AT_TARGET: 2, - BUBBLING_PHASE: 3 -}; - -class EventTargetImpl { - constructor(globalObject) { - this._globalObject = globalObject; - this._eventListeners = Object.create(null); - } - - addEventListener(type, callback, options) { - options = normalizeEventHandlerOptions(options, ["capture", "once", "passive"]); - - if (callback === null) { - return; - } - - if (!this._eventListeners[type]) { - this._eventListeners[type] = []; - } - - for (let i = 0; i < this._eventListeners[type].length; ++i) { - const listener = this._eventListeners[type][i]; - if ( - listener.callback.objectReference === callback.objectReference && - listener.options.capture === options.capture - ) { - return; - } - } - - this._eventListeners[type].push({ - callback, - options - }); - } - - removeEventListener(type, callback, options) { - options = normalizeEventHandlerOptions(options, ["capture"]); - - if (callback === null) { - // Optimization, not in the spec. - return; - } - - if (!this._eventListeners[type]) { - return; - } - - for (let i = 0; i < this._eventListeners[type].length; ++i) { - const listener = this._eventListeners[type][i]; - if ( - listener.callback.objectReference === callback.objectReference && - listener.options.capture === options.capture - ) { - this._eventListeners[type].splice(i, 1); - break; - } - } - } - - dispatchEvent(eventImpl) { - if (eventImpl._dispatchFlag || !eventImpl._initializedFlag) { - throw DOMException.create(this._globalObject, [ - "Tried to dispatch an uninitialized event", - "InvalidStateError" - ]); - } - if (eventImpl.eventPhase !== EVENT_PHASE.NONE) { - throw DOMException.create(this._globalObject, [ - "Tried to dispatch a dispatching event", - "InvalidStateError" - ]); - } - - eventImpl.isTrusted = false; - - return this._dispatch(eventImpl); - } - - // https://dom.spec.whatwg.org/#get-the-parent - _getTheParent() { - return null; - } - - // https://dom.spec.whatwg.org/#concept-event-dispatch - // legacyOutputDidListenersThrowFlag optional parameter is not necessary here since it is only used by indexDB. - _dispatch(eventImpl, targetOverride /* , legacyOutputDidListenersThrowFlag */) { - let targetImpl = this; - let clearTargets = false; - let activationTarget = null; - - eventImpl._dispatchFlag = true; - - targetOverride = targetOverride || targetImpl; - let relatedTarget = retarget(eventImpl.relatedTarget, targetImpl); - - if (targetImpl !== relatedTarget || targetImpl === eventImpl.relatedTarget) { - const touchTargets = []; - - appendToEventPath(eventImpl, targetImpl, targetOverride, relatedTarget, touchTargets, false); - - const isActivationEvent = MouseEvent.isImpl(eventImpl) && eventImpl.type === "click"; - - if (isActivationEvent && targetImpl._hasActivationBehavior) { - activationTarget = targetImpl; - } - - let slotInClosedTree = false; - let slotable = isSlotable(targetImpl) && targetImpl._assignedSlot ? targetImpl : null; - let parent = getEventTargetParent(targetImpl, eventImpl); - - // Populate event path - // https://dom.spec.whatwg.org/#event-path - while (parent !== null) { - if (slotable !== null) { - if (parent.localName !== "slot") { - throw new Error(`JSDOM Internal Error: Expected parent to be a Slot`); - } - - slotable = null; - - const parentRoot = nodeRoot(parent); - if (isShadowRoot(parentRoot) && parentRoot.mode === "closed") { - slotInClosedTree = true; - } - } - - if (isSlotable(parent) && parent._assignedSlot) { - slotable = parent; - } - - relatedTarget = retarget(eventImpl.relatedTarget, parent); - - if ( - (isNode(parent) && isShadowInclusiveAncestor(nodeRoot(targetImpl), parent)) || - idlUtils.wrapperForImpl(parent).constructor.name === "Window" - ) { - if (isActivationEvent && eventImpl.bubbles && activationTarget === null && - parent._hasActivationBehavior) { - activationTarget = parent; - } - - appendToEventPath(eventImpl, parent, null, relatedTarget, touchTargets, slotInClosedTree); - } else if (parent === relatedTarget) { - parent = null; - } else { - targetImpl = parent; - - if (isActivationEvent && activationTarget === null && targetImpl._hasActivationBehavior) { - activationTarget = targetImpl; - } - - appendToEventPath(eventImpl, parent, targetImpl, relatedTarget, touchTargets, slotInClosedTree); - } - - if (parent !== null) { - parent = getEventTargetParent(parent, eventImpl); - } - - slotInClosedTree = false; - } - - let clearTargetsStructIndex = -1; - for (let i = eventImpl._path.length - 1; i >= 0 && clearTargetsStructIndex === -1; i--) { - if (eventImpl._path[i].target !== null) { - clearTargetsStructIndex = i; - } - } - const clearTargetsStruct = eventImpl._path[clearTargetsStructIndex]; - - clearTargets = - (isNode(clearTargetsStruct.target) && isShadowRoot(nodeRoot(clearTargetsStruct.target))) || - (isNode(clearTargetsStruct.relatedTarget) && isShadowRoot(nodeRoot(clearTargetsStruct.relatedTarget))); - - if (activationTarget !== null && activationTarget._legacyPreActivationBehavior) { - activationTarget._legacyPreActivationBehavior(); - } - - for (let i = eventImpl._path.length - 1; i >= 0; --i) { - const struct = eventImpl._path[i]; - - if (struct.target !== null) { - eventImpl.eventPhase = EVENT_PHASE.AT_TARGET; - } else { - eventImpl.eventPhase = EVENT_PHASE.CAPTURING_PHASE; - } - - invokeEventListeners(struct, eventImpl, "capturing"); - } - - for (let i = 0; i < eventImpl._path.length; i++) { - const struct = eventImpl._path[i]; - - if (struct.target !== null) { - eventImpl.eventPhase = EVENT_PHASE.AT_TARGET; - } else { - if (!eventImpl.bubbles) { - continue; - } - - eventImpl.eventPhase = EVENT_PHASE.BUBBLING_PHASE; - } - - invokeEventListeners(struct, eventImpl, "bubbling"); - } - } - - eventImpl.eventPhase = EVENT_PHASE.NONE; - - eventImpl.currentTarget = null; - eventImpl._path = []; - eventImpl._dispatchFlag = false; - eventImpl._stopPropagationFlag = false; - eventImpl._stopImmediatePropagationFlag = false; - - if (clearTargets) { - eventImpl.target = null; - eventImpl.relatedTarget = null; - } - - if (activationTarget !== null) { - if (!eventImpl._canceledFlag) { - activationTarget._activationBehavior(eventImpl); - } else if (activationTarget._legacyCanceledActivationBehavior) { - activationTarget._legacyCanceledActivationBehavior(); - } - } - - return !eventImpl._canceledFlag; - } -} - -module.exports = { - implementation: EventTargetImpl -}; - -// https://dom.spec.whatwg.org/#concept-event-listener-invoke -function invokeEventListeners(struct, eventImpl, phase) { - const structIndex = eventImpl._path.indexOf(struct); - for (let i = structIndex; i >= 0; i--) { - const t = eventImpl._path[i]; - if (t.target) { - eventImpl.target = t.target; - break; - } - } - - eventImpl.relatedTarget = idlUtils.wrapperForImpl(struct.relatedTarget); - - if (eventImpl._stopPropagationFlag) { - return; - } - - eventImpl.currentTarget = idlUtils.wrapperForImpl(struct.item); - - const listeners = struct.item._eventListeners; - innerInvokeEventListeners(eventImpl, listeners, phase, struct.itemInShadowTree); -} - -// https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke -function innerInvokeEventListeners(eventImpl, listeners, phase, itemInShadowTree) { - let found = false; - - const { type, target } = eventImpl; - const wrapper = idlUtils.wrapperForImpl(target); - - if (!listeners || !listeners[type]) { - return found; - } - - // Copy event listeners before iterating since the list can be modified during the iteration. - const handlers = listeners[type].slice(); - - for (let i = 0; i < handlers.length; i++) { - const listener = handlers[i]; - const { capture, once, passive } = listener.options; - - // Check if the event listener has been removed since the listeners has been cloned. - if (!listeners[type].includes(listener)) { - continue; - } - - found = true; - - if ( - (phase === "capturing" && !capture) || - (phase === "bubbling" && capture) - ) { - continue; - } - - if (once) { - listeners[type].splice(listeners[type].indexOf(listener), 1); - } - - let window = null; - if (wrapper && wrapper._document) { - // Triggered by Window - window = wrapper; - } else if (target._ownerDocument) { - // Triggered by most webidl2js'ed instances - window = target._ownerDocument._defaultView; - } else if (wrapper._ownerDocument) { - // Currently triggered by some non-webidl2js things - window = wrapper._ownerDocument._defaultView; - } - - let currentEvent; - if (window) { - currentEvent = window._currentEvent; - if (!itemInShadowTree) { - window._currentEvent = eventImpl; - } - } - - if (passive) { - eventImpl._inPassiveListenerFlag = true; - } - - try { - listener.callback.call(eventImpl.currentTarget, eventImpl); - } catch (e) { - if (window) { - reportException(window, e); - } - // Errors in window-less documents just get swallowed... can you think of anything better? - } - - eventImpl._inPassiveListenerFlag = false; - - if (window) { - window._currentEvent = currentEvent; - } - - if (eventImpl._stopImmediatePropagationFlag) { - return found; - } - } - - return found; -} - -/** - * Normalize the event listeners options argument in order to get always a valid options object - * @param {Object} options - user defined options - * @param {Array} defaultBoolKeys - boolean properties that should belong to the options object - * @returns {Object} object containing at least the "defaultBoolKeys" - */ -function normalizeEventHandlerOptions(options, defaultBoolKeys) { - const returnValue = {}; - - // no need to go further here - if (typeof options === "boolean" || options === null || typeof options === "undefined") { - returnValue.capture = Boolean(options); - return returnValue; - } - - // non objects options so we typecast its value as "capture" value - if (typeof options !== "object") { - returnValue.capture = Boolean(options); - // at this point we don't need to loop the "capture" key anymore - defaultBoolKeys = defaultBoolKeys.filter(k => k !== "capture"); - } - - for (const key of defaultBoolKeys) { - returnValue[key] = Boolean(options[key]); - } - - return returnValue; -} - -// https://dom.spec.whatwg.org/#concept-event-path-append -function appendToEventPath(eventImpl, target, targetOverride, relatedTarget, touchTargets, slotInClosedTree) { - const itemInShadowTree = isNode(target) && isShadowRoot(nodeRoot(target)); - const rootOfClosedTree = isShadowRoot(target) && target.mode === "closed"; - - eventImpl._path.push({ - item: target, - itemInShadowTree, - target: targetOverride, - relatedTarget, - touchTargets, - rootOfClosedTree, - slotInClosedTree - }); -} |