UNPKG

projen

Version:

CDK for software projects

995 lines 39.5 kB
"use strict"; var __values = (this && this.__values) || function(o) { var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0; if (m) return m.call(o); if (o && typeof o.length === "number") return { next: function () { if (o && i >= o.length) o = void 0; return { value: o && o[i++], done: !o }; } }; throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined."); }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __spread = (this && this.__spread) || function () { for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i])); return ar; }; Object.defineProperty(exports, "__esModule", { value: true }); var DOMImpl_1 = require("../dom/DOMImpl"); var interfaces_1 = require("../dom/interfaces"); var util_1 = require("../util"); var CustomEventImpl_1 = require("../dom/CustomEventImpl"); var EventImpl_1 = require("../dom/EventImpl"); var DOMException_1 = require("../dom/DOMException"); var TreeAlgorithm_1 = require("./TreeAlgorithm"); var ShadowTreeAlgorithm_1 = require("./ShadowTreeAlgorithm"); var DOMAlgorithm_1 = require("./DOMAlgorithm"); /** * Sets the canceled flag of an event. * * @param event - an event */ function event_setTheCanceledFlag(event) { if (event._cancelable && !event._inPassiveListenerFlag) { event._canceledFlag = true; } } exports.event_setTheCanceledFlag = event_setTheCanceledFlag; /** * Initializes the value of an event. * * @param event - an event to initialize * @param type - the type of event * @param bubbles - whether the event propagates in reverse * @param cancelable - whether the event can be cancelled */ function event_initialize(event, type, bubbles, cancelable) { event._initializedFlag = true; event._stopPropagationFlag = false; event._stopImmediatePropagationFlag = false; event._canceledFlag = false; event._isTrusted = false; event._target = null; event._type = type; event._bubbles = bubbles; event._cancelable = cancelable; } exports.event_initialize = event_initialize; /** * Creates a new event. * * @param eventInterface - event interface * @param realm - realm */ function event_createAnEvent(eventInterface, realm) { if (realm === void 0) { realm = undefined; } /** * 1. If realm is not given, then set it to null. * 2. Let dictionary be the result of converting the JavaScript value * undefined to the dictionary type accepted by eventInterface’s * constructor. (This dictionary type will either be EventInit or a * dictionary that inherits from it.) * 3. Let event be the result of running the inner event creation steps with * eventInterface, realm, the time of the occurrence that the event is * signaling, and dictionary. * 4. Initialize event’s isTrusted attribute to true. * 5. Return event. */ if (realm === undefined) realm = null; var dictionary = {}; var event = event_innerEventCreationSteps(eventInterface, realm, new Date(), dictionary); event._isTrusted = true; return event; } exports.event_createAnEvent = event_createAnEvent; /** * Performs event creation steps. * * @param eventInterface - event interface * @param realm - realm * @param time - time of occurrance * @param dictionary - event attributes * */ function event_innerEventCreationSteps(eventInterface, realm, time, dictionary) { /** * 1. Let event be the result of creating a new object using eventInterface. * TODO: Implement realms * If realm is non-null, then use that Realm; otherwise, use the default * behavior defined in Web IDL. */ var event = new eventInterface(""); /** * 2. Set event’s initialized flag. * 3. Initialize event’s timeStamp attribute to a DOMHighResTimeStamp * representing the high resolution time from the time origin to time. * 4. For each member → value in dictionary, if event has an attribute * whose identifier is member, then initialize that attribute to value. * 5. Run the event constructing steps with event. * 6. Return event. */ event._initializedFlag = true; event._timeStamp = time.getTime(); Object.assign(event, dictionary); if (DOMImpl_1.dom.features.steps) { DOMAlgorithm_1.dom_runEventConstructingSteps(event); } return event; } exports.event_innerEventCreationSteps = event_innerEventCreationSteps; /** * Dispatches an event to an event target. * * @param event - the event to dispatch * @param target - event target * @param legacyTargetOverrideFlag - legacy target override flag * @param legacyOutputDidListenersThrowFlag - legacy output flag that returns * whether the event listener's callback threw an exception */ function event_dispatch(event, target, legacyTargetOverrideFlag, legacyOutputDidListenersThrowFlag) { var e_1, _a, e_2, _b; if (legacyTargetOverrideFlag === void 0) { legacyTargetOverrideFlag = false; } if (legacyOutputDidListenersThrowFlag === void 0) { legacyOutputDidListenersThrowFlag = { value: false }; } var clearTargets = false; /** * 1. Set event's dispatch flag. */ event._dispatchFlag = true; /** * 2. Let targetOverride be target, if legacy target override flag is not * given, and target's associated Document otherwise. * * _Note:_ legacy target override flag is only used by HTML and only when * target is a Window object. */ var targetOverride = target; if (legacyTargetOverrideFlag) { var doc = target._associatedDocument; if (util_1.Guard.isDocumentNode(doc)) { targetOverride = doc; } } /** * 3. Let activationTarget be null. * 4. Let relatedTarget be the result of retargeting event's relatedTarget * against target. * 5. If target is not relatedTarget or target is event's relatedTarget, * then: */ var activationTarget = null; var relatedTarget = TreeAlgorithm_1.tree_retarget(event._relatedTarget, target); if (target !== relatedTarget || target === event._relatedTarget) { /** * 5.1. Let touchTargets be a new list. * 5.2. For each touchTarget of event's touch target list, append the * result of retargeting touchTarget against target to touchTargets. * 5.3. Append to an event path with event, target, targetOverride, * relatedTarget, touchTargets, and false. * 5.4. Let isActivationEvent be true, if event is a MouseEvent object * and event's type attribute is "click", and false otherwise. * 5.5. If isActivationEvent is true and target has activation behavior, * then set activationTarget to target. * 5.6. Let slotable be target, if target is a slotable and is assigned, * and null otherwise. * 5.7. Let slot-in-closed-tree be false. * 5.8. Let parent be the result of invoking target's get the parent with * event. */ var touchTargets = []; try { for (var _c = __values(event._touchTargetList), _d = _c.next(); !_d.done; _d = _c.next()) { var touchTarget = _d.value; touchTargets.push(TreeAlgorithm_1.tree_retarget(touchTarget, target)); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_d && !_d.done && (_a = _c.return)) _a.call(_c); } finally { if (e_1) throw e_1.error; } } event_appendToAnEventPath(event, target, targetOverride, relatedTarget, touchTargets, false); var isActivationEvent = (util_1.Guard.isMouseEvent(event) && event._type === "click"); if (isActivationEvent && target._activationBehavior !== undefined) { activationTarget = target; } var slotable = (util_1.Guard.isSlotable(target) && ShadowTreeAlgorithm_1.shadowTree_isAssigned(target)) ? target : null; var slotInClosedTree = false; var parent = target._getTheParent(event); /** * 5.9. While parent is non-null: */ while (parent !== null && util_1.Guard.isNode(parent)) { /** * 5.9.1 If slotable is non-null: * 5.9.1.1. Assert: parent is a slot. * 5.9.1.2. Set slotable to null. * 5.9.1.3. If parent's root is a shadow root whose mode is "closed", * then set slot-in-closed-tree to true. */ if (slotable !== null) { if (!util_1.Guard.isSlot(parent)) { throw new Error("Parent node of a slotable should be a slot."); } slotable = null; var root = TreeAlgorithm_1.tree_rootNode(parent, true); if (util_1.Guard.isShadowRoot(root) && root._mode === "closed") { slotInClosedTree = true; } } /** * 5.9.2 If parent is a slotable and is assigned, then set slotable to * parent. * 5.9.3. Let relatedTarget be the result of retargeting event's * relatedTarget against parent. * 5.9.4. Let touchTargets be a new list. * 5.9.4. For each touchTarget of event's touch target list, append the * result of retargeting touchTarget against parent to touchTargets. */ if (util_1.Guard.isSlotable(parent) && ShadowTreeAlgorithm_1.shadowTree_isAssigned(parent)) { slotable = parent; } relatedTarget = TreeAlgorithm_1.tree_retarget(event._relatedTarget, parent); touchTargets = []; try { for (var _e = (e_2 = void 0, __values(event._touchTargetList)), _f = _e.next(); !_f.done; _f = _e.next()) { var touchTarget = _f.value; touchTargets.push(TreeAlgorithm_1.tree_retarget(touchTarget, parent)); } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_f && !_f.done && (_b = _e.return)) _b.call(_e); } finally { if (e_2) throw e_2.error; } } /** * 5.9.6. If parent is a Window object, or parent is a node and target's * root is a shadow-including inclusive ancestor of parent, then: */ if (util_1.Guard.isWindow(parent) || (util_1.Guard.isNode(parent) && util_1.Guard.isNode(target) && TreeAlgorithm_1.tree_isAncestorOf(TreeAlgorithm_1.tree_rootNode(target, true), parent, true, true))) { /** * 5.9.6.1. If isActivationEvent is true, event's bubbles attribute * is true, activationTarget is null, and parent has activation * behavior, then set activationTarget to parent. * 5.9.6.2. Append to an event path with event, parent, null, * relatedTarget, touchTargets, and slot-in-closed-tree. */ if (isActivationEvent && event._bubbles && activationTarget === null && parent._activationBehavior) { activationTarget = parent; } event_appendToAnEventPath(event, parent, null, relatedTarget, touchTargets, slotInClosedTree); } else if (parent === relatedTarget) { /** * 5.9.7. Otherwise, if parent is relatedTarget, * then set parent to null. */ parent = null; } else { /** * 5.9.8. Otherwise, set target to parent and then: * 5.9.8.1. If isActivationEvent is true, activationTarget is null, * and target has activation behavior, then set activationTarget * to target. * 5.9.8.2. Append to an event path with event, parent, target, * relatedTarget, touchTargets, and slot-in-closed-tree. */ target = parent; if (isActivationEvent && activationTarget === null && target._activationBehavior) { activationTarget = target; } event_appendToAnEventPath(event, parent, target, relatedTarget, touchTargets, slotInClosedTree); } /** * 5.9.9. If parent is non-null, then set parent to the result of * invoking parent's get the parent with event. * 5.9.10. Set slot-in-closed-tree to false. */ if (parent !== null) { parent = parent._getTheParent(event); } slotInClosedTree = false; } /** * 5.10. Let clearTargetsStruct be the last struct in event's path whose * shadow-adjusted target is non-null. */ var clearTargetsStruct = null; var path = event._path; for (var i = path.length - 1; i >= 0; i--) { var struct = path[i]; if (struct.shadowAdjustedTarget !== null) { clearTargetsStruct = struct; break; } } /** * 5.11. Let clearTargets be true if clearTargetsStruct's shadow-adjusted * target, clearTargetsStruct's relatedTarget, or an EventTarget object * in clearTargetsStruct's touch target list is a node and its root is * a shadow root, and false otherwise. */ if (clearTargetsStruct !== null) { if (util_1.Guard.isNode(clearTargetsStruct.shadowAdjustedTarget) && util_1.Guard.isShadowRoot(TreeAlgorithm_1.tree_rootNode(clearTargetsStruct.shadowAdjustedTarget, true))) { clearTargets = true; } else if (util_1.Guard.isNode(clearTargetsStruct.relatedTarget) && util_1.Guard.isShadowRoot(TreeAlgorithm_1.tree_rootNode(clearTargetsStruct.relatedTarget, true))) { clearTargets = true; } else { for (var j = 0; j < clearTargetsStruct.touchTargetList.length; j++) { var struct = clearTargetsStruct.touchTargetList[j]; if (util_1.Guard.isNode(struct) && util_1.Guard.isShadowRoot(TreeAlgorithm_1.tree_rootNode(struct, true))) { clearTargets = true; break; } } } } /** * 5.12. If activationTarget is non-null and activationTarget has * legacy-pre-activation behavior, then run activationTarget's * legacy-pre-activation behavior. */ if (activationTarget !== null && activationTarget._legacyPreActivationBehavior !== undefined) { activationTarget._legacyPreActivationBehavior(event); } /** * 5.13. For each struct in event's path, in reverse order: */ for (var i = path.length - 1; i >= 0; i--) { var struct = path[i]; /** * 5.13.1. If struct's shadow-adjusted target is non-null, then set * event's eventPhase attribute to AT_TARGET. * 5.13.2. Otherwise, set event's eventPhase attribute to * CAPTURING_PHASE. * 5.13.3. Invoke with struct, event, "capturing", and * legacyOutputDidListenersThrowFlag if given. */ if (struct.shadowAdjustedTarget !== null) { event._eventPhase = interfaces_1.EventPhase.AtTarget; } else { event._eventPhase = interfaces_1.EventPhase.Capturing; } event_invoke(struct, event, "capturing", legacyOutputDidListenersThrowFlag); } /** * 5.14. For each struct in event's path */ for (var i = 0; i < path.length; i++) { var struct = path[i]; /** * 5.14.1. If struct's shadow-adjusted target is non-null, then set * event's eventPhase attribute to AT_TARGET. * 5.14.2. Otherwise: * 5.14.2.1. If event's bubbles attribute is false, then continue. * 5.14.2.2. Set event's eventPhase attribute to BUBBLING_PHASE. * 5.14.3. Invoke with struct, event, "bubbling", and * legacyOutputDidListenersThrowFlag if given. */ if (struct.shadowAdjustedTarget !== null) { event._eventPhase = interfaces_1.EventPhase.AtTarget; } else { if (!event._bubbles) continue; event._eventPhase = interfaces_1.EventPhase.Bubbling; } event_invoke(struct, event, "bubbling", legacyOutputDidListenersThrowFlag); } } /** * 6. Set event's eventPhase attribute to NONE. * 7. Set event's currentTarget attribute to null. * 8. Set event's path to the empty list. * 9. Unset event's dispatch flag, stop propagation flag, and stop * immediate propagation flag. */ event._eventPhase = interfaces_1.EventPhase.None; event._currentTarget = null; event._path = []; event._dispatchFlag = false; event._stopPropagationFlag = false; event._stopImmediatePropagationFlag = false; /** * 10. If clearTargets, then: * 10.1. Set event's target to null. * 10.2. Set event's relatedTarget to null. * 10.3. Set event's touch target list to the empty list. */ if (clearTargets) { event._target = null; event._relatedTarget = null; event._touchTargetList = []; } /** * 11. If activationTarget is non-null, then: * 11.1. If event's canceled flag is unset, then run activationTarget's * activation behavior with event. * 11.2. Otherwise, if activationTarget has legacy-canceled-activation * behavior, then run activationTarget's legacy-canceled-activation * behavior. */ if (activationTarget !== null) { if (!event._canceledFlag && activationTarget._activationBehavior !== undefined) { activationTarget._activationBehavior(event); } else if (activationTarget._legacyCanceledActivationBehavior !== undefined) { activationTarget._legacyCanceledActivationBehavior(event); } } /** * 12. Return false if event's canceled flag is set, and true otherwise. */ return !event._canceledFlag; } exports.event_dispatch = event_dispatch; /** * Appends a new struct to an event's path. * * @param event - an event * @param invocationTarget - the target of the invocation * @param shadowAdjustedTarget - shadow-root adjusted event target * @param relatedTarget - related event target * @param touchTargets - a list of touch targets * @param slotInClosedTree - if the target's parent is a closed shadow root */ function event_appendToAnEventPath(event, invocationTarget, shadowAdjustedTarget, relatedTarget, touchTargets, slotInClosedTree) { /** * 1. Let invocationTargetInShadowTree be false. * 2. If invocationTarget is a node and its root is a shadow root, then * set invocationTargetInShadowTree to true. */ var invocationTargetInShadowTree = false; if (util_1.Guard.isNode(invocationTarget) && util_1.Guard.isShadowRoot(TreeAlgorithm_1.tree_rootNode(invocationTarget))) { invocationTargetInShadowTree = true; } /** * 3. Let root-of-closed-tree be false. * 4. If invocationTarget is a shadow root whose mode is "closed", then * set root-of-closed-tree to true. */ var rootOfClosedTree = false; if (util_1.Guard.isShadowRoot(invocationTarget) && invocationTarget._mode === "closed") { rootOfClosedTree = true; } /** * 5. Append a new struct to event's path whose invocation target is * invocationTarget, invocation-target-in-shadow-tree is * invocationTargetInShadowTree, shadow-adjusted target is * shadowAdjustedTarget, relatedTarget is relatedTarget, * touch target list is touchTargets, root-of-closed-tree is * root-of-closed-tree, and slot-in-closed-tree is slot-in-closed-tree. */ event._path.push({ invocationTarget: invocationTarget, invocationTargetInShadowTree: invocationTargetInShadowTree, shadowAdjustedTarget: shadowAdjustedTarget, relatedTarget: relatedTarget, touchTargetList: touchTargets, rootOfClosedTree: rootOfClosedTree, slotInClosedTree: slotInClosedTree }); } exports.event_appendToAnEventPath = event_appendToAnEventPath; /** * Invokes an event. * * @param struct - a struct defining event's path * @param event - the event to invoke * @param phase - event phase * @param legacyOutputDidListenersThrowFlag - legacy output flag that returns * whether the event listener's callback threw an exception */ function event_invoke(struct, event, phase, legacyOutputDidListenersThrowFlag) { if (legacyOutputDidListenersThrowFlag === void 0) { legacyOutputDidListenersThrowFlag = { value: false }; } /** * 1. Set event's target to the shadow-adjusted target of the last struct * in event's path, that is either struct or preceding struct, whose * shadow-adjusted target is non-null. */ var path = event._path; var index = -1; for (var i = 0; i < path.length; i++) { if (path[i] === struct) { index = i; break; } } if (index !== -1) { var item = path[index]; if (item.shadowAdjustedTarget !== null) { event._target = item.shadowAdjustedTarget; } else if (index > 0) { item = path[index - 1]; if (item.shadowAdjustedTarget !== null) { event._target = item.shadowAdjustedTarget; } } } /** * 2. Set event's relatedTarget to struct's relatedTarget. * 3. Set event's touch target list to struct's touch target list. * 4. If event's stop propagation flag is set, then return. * 5. Initialize event's currentTarget attribute to struct's invocation * target. * 6. Let listeners be a clone of event's currentTarget attribute value's * event listener list. * * _Note:_ This avoids event listeners added after this point from being * run. Note that removal still has an effect due to the removed field. */ event._relatedTarget = struct.relatedTarget; event._touchTargetList = struct.touchTargetList; if (event._stopPropagationFlag) return; event._currentTarget = struct.invocationTarget; var currentTarget = event._currentTarget; var targetListeners = currentTarget._eventListenerList; var listeners = new (Array.bind.apply(Array, __spread([void 0], targetListeners)))(); /** * 7. Let found be the result of running inner invoke with event, listeners, * phase, and legacyOutputDidListenersThrowFlag if given. */ var found = event_innerInvoke(event, listeners, phase, struct, legacyOutputDidListenersThrowFlag); /** * 8. If found is false and event's isTrusted attribute is true, then: */ if (!found && event._isTrusted) { /** * 8.1. Let originalEventType be event's type attribute value. * 8.2. If event's type attribute value is a match for any of the strings * in the first column in the following table, set event's type attribute * value to the string in the second column on the same row as the matching * string, and return otherwise. * * Event type | Legacy event type * ------------------------------------------------- * "animationend" | "webkitAnimationEnd" * "animationiteration" | "webkitAnimationIteration" * "animationstart" | "webkitAnimationStart" * "transitionend" | "webkitTransitionEnd" */ var originalEventType = event._type; if (originalEventType === "animationend") { event._type = "webkitAnimationEnd"; } else if (originalEventType === "animationiteration") { event._type = "webkitAnimationIteration"; } else if (originalEventType === "animationstart") { event._type = "webkitAnimationStart"; } else if (originalEventType === "transitionend") { event._type = "webkitTransitionEnd"; } /** * 8.3. Inner invoke with event, listeners, phase, and * legacyOutputDidListenersThrowFlag if given. * 8.4. Set event's type attribute value to originalEventType. */ event_innerInvoke(event, listeners, phase, struct, legacyOutputDidListenersThrowFlag); event._type = originalEventType; } } exports.event_invoke = event_invoke; /** * Invokes an event. * * @param event - the event to invoke * @param listeners - event listeners * @param phase - event phase * @param struct - a struct defining event's path * @param legacyOutputDidListenersThrowFlag - legacy output flag that returns * whether the event listener's callback threw an exception */ function event_innerInvoke(event, listeners, phase, struct, legacyOutputDidListenersThrowFlag) { if (legacyOutputDidListenersThrowFlag === void 0) { legacyOutputDidListenersThrowFlag = { value: false }; } /** * 1. Let found be false. * 2. For each listener in listeners, whose removed is false: */ var found = false; for (var i = 0; i < listeners.length; i++) { var listener = listeners[i]; if (!listener.removed) { /** * 2.1. If event's type attribute value is not listener's type, then * continue. * 2.2. Set found to true. * 2.3. If phase is "capturing" and listener's capture is false, then * continue. * 2.4. If phase is "bubbling" and listener's capture is true, then * continue. */ if (event._type !== listener.type) continue; found = true; if (phase === "capturing" && !listener.capture) continue; if (phase === "bubbling" && listener.capture) continue; /** * 2.5. If listener's once is true, then remove listener from event's * currentTarget attribute value's event listener list. */ if (listener.once && event._currentTarget !== null) { var impl = event._currentTarget; var index = -1; for (var i_1 = 0; i_1 < impl._eventListenerList.length; i_1++) { if (impl._eventListenerList[i_1] === listener) { index = i_1; break; } } if (index !== -1) { impl._eventListenerList.splice(index, 1); } } /** * TODO: Implement realms * * 2.6. Let global be listener callback's associated Realm's global * object. */ var globalObject = undefined; /** * 2.7. Let currentEvent be undefined. * 2.8. If global is a Window object, then: * 2.8.1. Set currentEvent to global's current event. * 2.8.2. If struct's invocation-target-in-shadow-tree is false, then * set global's current event to event. */ var currentEvent = undefined; if (util_1.Guard.isWindow(globalObject)) { currentEvent = globalObject._currentEvent; if (struct.invocationTargetInShadowTree === false) { globalObject._currentEvent = event; } } /** * 2.9. If listener's passive is true, then set event's in passive * listener flag. * 2.10. Call a user object's operation with listener's callback, * "handleEvent", « event », and event's currentTarget attribute value. */ if (listener.passive) event._inPassiveListenerFlag = true; try { listener.callback.handleEvent.call(event._currentTarget, event); } catch (err) { /** * If this throws an exception, then: * 2.10.1. Report the exception. * 2.10.2. Set legacyOutputDidListenersThrowFlag if given. * * _Note:_ The legacyOutputDidListenersThrowFlag is only used by * Indexed Database API. * TODO: Report the exception * See: https://html.spec.whatwg.org/multipage/webappapis.html#runtime-script-errors-in-documents */ legacyOutputDidListenersThrowFlag.value = true; } /** * 2.11. Unset event's in passive listener flag. */ if (listener.passive) event._inPassiveListenerFlag = false; /** * 2.12. If global is a Window object, then set global's current event * to currentEvent. */ if (util_1.Guard.isWindow(globalObject)) { globalObject._currentEvent = currentEvent; } /** * 2.13. If event's stop immediate propagation flag is set, then return * found. */ if (event._stopImmediatePropagationFlag) return found; } } /** * 3. Return found. */ return found; } exports.event_innerInvoke = event_innerInvoke; /** * Fires an event at target. * @param e - event name * @param target - event target * @param eventConstructor - an event constructor, with a description of how * IDL attributes are to be initialized * @param idlAttributes - a dictionary describing how IDL attributes are * to be initialized * @param legacyTargetOverrideFlag - legacy target override flag */ function event_fireAnEvent(e, target, eventConstructor, idlAttributes, legacyTargetOverrideFlag) { /** * 1. If eventConstructor is not given, then let eventConstructor be Event. */ if (eventConstructor === undefined) { eventConstructor = EventImpl_1.EventImpl; } /** * 2. Let event be the result of creating an event given eventConstructor, * in the relevant Realm of target. */ var event = event_createAnEvent(eventConstructor); /** * 3. Initialize event’s type attribute to e. */ event._type = e; /** * 4. Initialize any other IDL attributes of event as described in the * invocation of this algorithm. * _Note:_ This also allows for the isTrusted attribute to be set to false. */ if (idlAttributes) { for (var key in idlAttributes) { var idlObj = event; idlObj[key] = idlAttributes[key]; } } /** * 5. Return the result of dispatching event at target, with legacy target * override flag set if set. */ return event_dispatch(event, target, legacyTargetOverrideFlag); } exports.event_fireAnEvent = event_fireAnEvent; /** * Creates an event. * * @param eventInterface - the name of the event interface */ function event_createLegacyEvent(eventInterface) { /** * 1. Let constructor be null. */ var constructor = null; /** * TODO: Implement in HTML DOM * 2. If interface is an ASCII case-insensitive match for any of the strings * in the first column in the following table, then set constructor to the * interface in the second column on the same row as the matching string: * * String | Interface * -------|---------- * "beforeunloadevent" | BeforeUnloadEvent * "compositionevent" | CompositionEvent * "customevent" | CustomEvent * "devicemotionevent" | DeviceMotionEvent * "deviceorientationevent" | DeviceOrientationEvent * "dragevent" | DragEvent * "event" | Event * "events" | Event * "focusevent" | FocusEvent * "hashchangeevent" | HashChangeEvent * "htmlevents" | Event * "keyboardevent" | KeyboardEvent * "messageevent" | MessageEvent * "mouseevent" | MouseEvent * "mouseevents" | * "storageevent" | StorageEvent * "svgevents" | Event * "textevent" | CompositionEvent * "touchevent" | TouchEvent * "uievent" | UIEvent * "uievents" | UIEvent */ switch (eventInterface.toLowerCase()) { case "beforeunloadevent": break; case "compositionevent": break; case "customevent": constructor = CustomEventImpl_1.CustomEventImpl; break; case "devicemotionevent": break; case "deviceorientationevent": break; case "dragevent": break; case "event": case "events": constructor = EventImpl_1.EventImpl; break; case "focusevent": break; case "hashchangeevent": break; case "htmlevents": break; case "keyboardevent": break; case "messageevent": break; case "mouseevent": break; case "mouseevents": break; case "storageevent": break; case "svgevents": break; case "textevent": break; case "touchevent": break; case "uievent": break; case "uievents": break; } /** * 3. If constructor is null, then throw a "NotSupportedError" DOMException. */ if (constructor === null) { throw new DOMException_1.NotSupportedError("Event constructor not found for interface " + eventInterface + "."); } /** * 4. If the interface indicated by constructor is not exposed on the * relevant global object of the context object, then throw a * "NotSupportedError" DOMException. * _Note:_ Typically user agents disable support for touch events in some * configurations, in which case this clause would be triggered for the * interface TouchEvent. */ // TODO: Implement realms /** * 5. Let event be the result of creating an event given constructor. * 6. Initialize event’s type attribute to the empty string. * 7. Initialize event’s timeStamp attribute to a DOMHighResTimeStamp * representing the high resolution time from the time origin to now. * 8. Initialize event’s isTrusted attribute to false. * 9. Unset event’s initialized flag. */ var event = new constructor(""); event._type = ""; event._timeStamp = new Date().getTime(); event._isTrusted = false; event._initializedFlag = false; /** * 10. Return event. */ return event; } exports.event_createLegacyEvent = event_createLegacyEvent; /** * Getter of an event handler IDL attribute. * * @param eventTarget - event target * @param name - event name */ function event_getterEventHandlerIDLAttribute(thisObj, name) { /** * 1. Let eventTarget be the result of determining the target of an event * handler given this object and name. * 2. If eventTarget is null, then return null. * 3. Return the result of getting the current value of the event handler * given eventTarget and name. */ var eventTarget = event_determineTheTargetOfAnEventHandler(thisObj, name); if (eventTarget === null) return null; return event_getTheCurrentValueOfAnEventHandler(eventTarget, name); } exports.event_getterEventHandlerIDLAttribute = event_getterEventHandlerIDLAttribute; /** * Setter of an event handler IDL attribute. * * @param eventTarget - event target * @param name - event name * @param value - event handler */ function event_setterEventHandlerIDLAttribute(thisObj, name, value) { /** * 1. Let eventTarget be the result of determining the target of an event * handler given this object and name. * 2. If eventTarget is null, then return. * 3. If the given value is null, then deactivate an event handler given * eventTarget and name. * 4. Otherwise: * 4.1. Let handlerMap be eventTarget's event handler map. * 4.2. Let eventHandler be handlerMap[name]. * 4.3. Set eventHandler's value to the given value. * 4.4. Activate an event handler given eventTarget and name. */ var eventTarget = event_determineTheTargetOfAnEventHandler(thisObj, name); if (eventTarget === null) return; if (value === null) { event_deactivateAnEventHandler(eventTarget, name); } else { var handlerMap = eventTarget._eventHandlerMap; var eventHandler = handlerMap["onabort"]; if (eventHandler !== undefined) { eventHandler.value = value; } event_activateAnEventHandler(eventTarget, name); } } exports.event_setterEventHandlerIDLAttribute = event_setterEventHandlerIDLAttribute; /** * Determines the target of an event handler. * * @param eventTarget - event target * @param name - event name */ function event_determineTheTargetOfAnEventHandler(eventTarget, name) { // TODO: Implement in HTML DOM return null; } exports.event_determineTheTargetOfAnEventHandler = event_determineTheTargetOfAnEventHandler; /** * Gets the current value of an event handler. * * @param eventTarget - event target * @param name - event name */ function event_getTheCurrentValueOfAnEventHandler(eventTarget, name) { // TODO: Implement in HTML DOM return null; } exports.event_getTheCurrentValueOfAnEventHandler = event_getTheCurrentValueOfAnEventHandler; /** * Activates an event handler. * * @param eventTarget - event target * @param name - event name */ function event_activateAnEventHandler(eventTarget, name) { // TODO: Implement in HTML DOM } exports.event_activateAnEventHandler = event_activateAnEventHandler; /** * Deactivates an event handler. * * @param eventTarget - event target * @param name - event name */ function event_deactivateAnEventHandler(eventTarget, name) { // TODO: Implement in HTML DOM } exports.event_deactivateAnEventHandler = event_deactivateAnEventHandler; //# sourceMappingURL=EventAlgorithm.js.map