Index: chrome/resources/inspector/EventListenersSidebarPane.js |
=================================================================== |
--- chrome/resources/inspector/EventListenersSidebarPane.js (revision 0) |
+++ chrome/resources/inspector/EventListenersSidebarPane.js (revision 0) |
@@ -0,0 +1,218 @@ |
+/* |
+ * Copyright (C) 2007 Apple Inc. All rights reserved. |
+ * Copyright (C) 2009 Joseph Pecoraro |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions |
+ * are met: |
+ * |
+ * 1. Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * 2. Redistributions in binary form must reproduce the above copyright |
+ * notice, this list of conditions and the following disclaimer in the |
+ * documentation and/or other materials provided with the distribution. |
+ * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
+ * its contributors may be used to endorse or promote products derived |
+ * from this software without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
+ * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ */ |
+ |
+WebInspector.EventListenersSidebarPane = function() |
+{ |
+ WebInspector.SidebarPane.call(this, WebInspector.UIString("Event Listeners")); |
+ this.bodyElement.addStyleClass("events-pane"); |
+ |
+ this.sections = []; |
+ |
+ this.settingsSelectElement = document.createElement("select"); |
+ |
+ var option = document.createElement("option"); |
+ option.value = "all"; |
+ if (Preferences.eventListenersFilter === "all") |
+ option.selected = true; |
+ option.label = WebInspector.UIString("All Nodes"); |
+ this.settingsSelectElement.appendChild(option); |
+ |
+ option = document.createElement("option"); |
+ option.value = "selected"; |
+ if (Preferences.eventListenersFilter === "selected") |
+ option.selected = true; |
+ option.label = WebInspector.UIString("Selected Node Only"); |
+ this.settingsSelectElement.appendChild(option); |
+ |
+ this.settingsSelectElement.addEventListener("click", function(event) { event.stopPropagation() }, false); |
+ this.settingsSelectElement.addEventListener("change", this._changeSetting.bind(this), false); |
+ |
+ this.titleElement.appendChild(this.settingsSelectElement); |
+} |
+ |
+WebInspector.EventListenersSidebarPane.prototype = { |
+ update: function(node) |
+ { |
+ var body = this.bodyElement; |
+ body.removeChildren(); |
+ this.sections = []; |
+ |
+ var self = this; |
+ function callback(nodeId, eventListeners) { |
+ var sectionNames = []; |
+ var sectionMap = {}; |
+ for (var i = 0; i < eventListeners.length; ++i) { |
+ var eventListener = eventListeners[i]; |
+ eventListener.node = WebInspector.domAgent.nodeForId(eventListener.nodeId); |
+ delete eventListener.nodeId; // no longer needed |
+ if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listener.toString())) |
+ continue; // ignore event listeners generated by monitorEvent |
+ var type = eventListener.type; |
+ var section = sectionMap[type]; |
+ if (!section) { |
+ section = new WebInspector.EventListenersSection(type, nodeId); |
+ sectionMap[type] = section; |
+ sectionNames.push(type); |
+ self.sections.push(section); |
+ } |
+ section.addListener(eventListener); |
+ } |
+ |
+ if (sectionNames.length === 0) { |
+ var div = document.createElement("div"); |
+ div.className = "info"; |
+ div.textContent = WebInspector.UIString("No Event Listeners"); |
+ body.appendChild(div); |
+ return; |
+ } |
+ |
+ sectionNames.sort(); |
+ for (var i = 0; i < sectionNames.length; ++i) { |
+ var section = sectionMap[sectionNames[i]]; |
+ section.update(); |
+ body.appendChild(section.element); |
+ } |
+ } |
+ |
+ WebInspector.EventListeners.getEventListenersForNodeAsync(node, callback); |
+ }, |
+ |
+ _changeSetting: function(event) |
+ { |
+ var selectedOption = this.settingsSelectElement[this.settingsSelectElement.selectedIndex]; |
+ Preferences.eventListenersFilter = selectedOption.value; |
+ |
+ InspectorController.setSetting("event-listeners-filter", Preferences.eventListenersFilter); |
+ |
+ for (var i = 0; i < this.sections.length; ++i) |
+ this.sections[i].update(); |
+ } |
+} |
+ |
+WebInspector.EventListenersSidebarPane.prototype.__proto__ = WebInspector.SidebarPane.prototype; |
+ |
+WebInspector.EventListenersSection = function(title, nodeId) |
+{ |
+ this.eventListeners = []; |
+ this._nodeId = nodeId; |
+ WebInspector.PropertiesSection.call(this, title); |
+ |
+ // Changed from a Properties List |
+ this.propertiesElement.parentNode.removeChild(this.propertiesElement); |
+ delete this.propertiesElement; |
+ delete this.propertiesTreeOutline; |
+ |
+ this.eventBars = document.createElement("div"); |
+ this.eventBars.className = "event-bars"; |
+ this.element.appendChild(this.eventBars); |
+} |
+ |
+WebInspector.EventListenersSection.prototype = { |
+ update: function() |
+ { |
+ // A Filtered Array simplifies when to create connectors |
+ var filteredEventListeners = this.eventListeners; |
+ if (Preferences.eventListenersFilter === "selected") { |
+ filteredEventListeners = []; |
+ for (var i = 0; i < this.eventListeners.length; ++i) { |
+ var eventListener = this.eventListeners[i]; |
+ if (eventListener.node.id === this._nodeId) |
+ filteredEventListeners.push(eventListener); |
+ } |
+ } |
+ |
+ this.eventBars.removeChildren(); |
+ var length = filteredEventListeners.length; |
+ for (var i = 0; i < length; ++i) { |
+ var eventListener = filteredEventListeners[i]; |
+ var eventListenerBar = new WebInspector.EventListenerBar(eventListener); |
+ if (i < length - 1) { |
+ var connector = document.createElement("div"); |
+ connector.className = "event-bar-connector"; |
+ eventListenerBar.element.appendChild(connector); |
+ } |
+ |
+ this.eventBars.appendChild(eventListenerBar.element); |
+ } |
+ }, |
+ |
+ addListener: function(eventListener) |
+ { |
+ this.eventListeners.push(eventListener); |
+ } |
+} |
+ |
+WebInspector.EventListenersSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype; |
+ |
+WebInspector.EventListenerBar = function(eventListener) |
+{ |
+ this.eventListener = eventListener; |
+ WebInspector.ObjectPropertiesSection.call(this, null, this._getFunctionDisplayName(), this._getNodeDisplayName()); |
+ this.editable = false; |
+ this.element.className = "event-bar"; /* Changed from "section" */ |
+ this.propertiesElement.className = "event-properties"; /* Changed from "properties" */ |
+} |
+ |
+WebInspector.EventListenerBar.prototype = { |
+ update: function() |
+ { |
+ var properties = []; |
+ for (var propertyName in this.eventListener) { |
+ // Just build properties in place - no need to reach out for injected script. |
+ var value = this.eventListener[propertyName]; |
+ if (value instanceof WebInspector.DOMNode) |
+ value = new WebInspector.ObjectProxy(value.id, [], 0, appropriateSelectorForNode(value), true); |
+ else |
+ value = WebInspector.ObjectProxy.wrapPrimitiveValue(value); |
+ properties.push(new WebInspector.ObjectPropertyProxy(propertyName, value)); |
+ } |
+ this.updateProperties(properties); |
+ }, |
+ |
+ _getNodeDisplayName: function() |
+ { |
+ var node = this.eventListener.node; |
+ if (!node) |
+ return ""; |
+ |
+ if (node.nodeType === Node.DOCUMENT_NODE) |
+ return "document"; |
+ |
+ return appropriateSelectorForNode(node); |
+ }, |
+ |
+ _getFunctionDisplayName: function() |
+ { |
+ // Requires that Function.toString() return at least the function's signature. |
+ var match = this.eventListener.listener.toString().match(/function ([^\(]+?)\(/); |
+ return (match ? match[1] : WebInspector.UIString("(anonymous function)")); |
+ } |
+} |
+ |
+WebInspector.EventListenerBar.prototype.__proto__ = WebInspector.ObjectPropertiesSection.prototype; |
Property changes on: chrome/resources/inspector/EventListenersSidebarPane.js |
___________________________________________________________________ |
Added: svn:executable |
+ * |