| WI.Object = class WebInspectorObject |
| { |
| constructor() |
| { |
| this._listeners = null; |
| } |
| static addEventListener(eventType, listener, thisObject) |
| { |
| thisObject = thisObject || null; |
| if (!eventType) |
| return; |
| if (!listener) |
| return; |
| if (!this._listeners) |
| this._listeners = new Map(); |
| let listenersTable = this._listeners.get(eventType); |
| if (!listenersTable) { |
| listenersTable = new ListMultimap(); |
| this._listeners.set(eventType, listenersTable); |
| } |
| listenersTable.add(thisObject, listener); |
| } |
| static singleFireEventListener(eventType, listener, thisObject) |
| { |
| let wrappedCallback = function() { |
| this.removeEventListener(eventType, wrappedCallback, null); |
| listener.apply(thisObject, arguments); |
| }.bind(this); |
| this.addEventListener(eventType, wrappedCallback, null); |
| return wrappedCallback; |
| } |
| static removeEventListener(eventType, listener, thisObject) |
| { |
| eventType = eventType || null; |
| listener = listener || null; |
| thisObject = thisObject || null; |
| if (!this._listeners) |
| return; |
| if (thisObject && !eventType) { |
| this._listeners.forEach(function(listenersTable) { |
| let listenerPairs = listenersTable.toArray(); |
| for (let i = 0, length = listenerPairs.length; i < length; ++i) { |
| let existingThisObject = listenerPairs[i][0]; |
| if (existingThisObject === thisObject) |
| listenersTable.deleteAll(existingThisObject); |
| } |
| }); |
| return; |
| } |
| let listenersTable = this._listeners.get(eventType); |
| if (!listenersTable || listenersTable.size === 0) |
| return; |
| let didDelete = listenersTable.delete(thisObject, listener); |
| } |
| static hasEventListeners(eventType) |
| { |
| if (!this._listeners) |
| return false; |
| let listenersTable = this._listeners.get(eventType); |
| return listenersTable && listenersTable.size > 0; |
| } |
| static retainedObjectsWithPrototype(proto) |
| { |
| let results = new Set; |
| if (this._listeners) { |
| this._listeners.forEach(function(listenersTable, eventType) { |
| listenersTable.forEach(function(pair) { |
| let thisObject = pair[0]; |
| if (thisObject instanceof proto) |
| results.add(thisObject); |
| }); |
| }); |
| } |
| return results; |
| } |
| addEventListener() |
| { |
| return WI.Object.addEventListener.apply(this, arguments); |
| } |
| singleFireEventListener() |
| { |
| return WI.Object.singleFireEventListener.apply(this, arguments); |
| } |
| removeEventListener() |
| { |
| return WI.Object.removeEventListener.apply(this, arguments); |
| } |
| hasEventListeners() |
| { |
| return WI.Object.hasEventListeners.apply(this, arguments); |
| } |
| retainedObjectsWithPrototype() |
| { |
| return WI.Object.retainedObjectsWithPrototype.apply(this, arguments); |
| } |
| dispatchEventToListeners(eventType, eventData) |
| { |
| let event = new WI.Event(this, eventType, eventData); |
| function dispatch(object) |
| { |
| if (!object || event._stoppedPropagation) |
| return; |
| let listenerTypesMap = object._listeners; |
| if (!listenerTypesMap || !object.hasOwnProperty("_listeners")) |
| return; |
| let listenersTable = listenerTypesMap.get(eventType); |
| if (!listenersTable) |
| return; |
| let listeners = listenersTable.toArray(); |
| for (let i = 0, length = listeners.length; i < length; ++i) { |
| let [thisObject, listener] = listeners[i]; |
| listener.call(thisObject, event); |
| if (event._stoppedPropagation) |
| break; |
| } |
| } |
| dispatch(this); |
| event._stoppedPropagation = false; |
| let constructor = this.constructor; |
| while (constructor) { |
| dispatch(constructor); |
| if (!constructor.prototype.__proto__) |
| break; |
| constructor = constructor.prototype.__proto__.constructor; |
| } |
| return event.defaultPrevented; |
| } |
| } |
| ; |
| WI.Event = class Event |
| { |
| constructor(target, type, data) |
| { |
| this.target = target; |
| this.type = type; |
| this.data = data; |
| this.defaultPrevented = false; |
| this._stoppedPropagation = false; |
| } |
| stopPropagation() |
| { |
| this._stoppedPropagation = true; |
| } |
| preventDefault() |
| { |
| this.defaultPrevented = true; |
| } |
| } |
| ; |
| WI.notifications = new WI.Object; |
| WI.Notification = { |
| GlobalModifierKeysDidChange: "global-modifiers-did-change", |
| PageArchiveStarted: "page-archive-started", |
| PageArchiveEnded: "page-archive-ended", |
| ExtraDomainsActivated: "extra-domains-activated", |
| TabTypesChanged: "tab-types-changed", |
| DebugUIEnabledDidChange: "debug-ui-enabled-did-change", |
| }; |