Changeset 58412 in webkit


Ignore:
Timestamp:
Apr 28, 2010 10:10:01 AM (14 years ago)
Author:
pfeldman@chromium.org
Message:

2010-04-28 Pavel Feldman <pfeldman@chromium.org>

Reviewed by Timothy Hatcher.

Web Inspector: Linkify node and function in the event listeners panel.

https://bugs.webkit.org/show_bug.cgi?id=38251

  • bindings/js/ScriptEventListener.cpp: (WebCore::eventListenerHandlerBody): (WebCore::eventListenerHandlerLocation):
  • bindings/js/ScriptEventListener.h:
  • bindings/v8/ScriptEventListener.cpp: (WebCore::eventListenerHandlerBody): (WebCore::eventListenerHandlerLocation):
  • bindings/v8/ScriptEventListener.h:
  • inspector/InspectorDOMAgent.cpp: (WebCore::InspectorDOMAgent::buildObjectForEventListener):
  • inspector/front-end/ElementsPanel.js: (WebInspector.ElementsPanel.prototype.linkifyNodeReference): (WebInspector.ElementsPanel.prototype.linkifyNodeReference.preventDefault):
  • inspector/front-end/EventListenersSidebarPane.js: (WebInspector.EventListenersSidebarPane.prototype.update.callback): (WebInspector.EventListenersSidebarPane.prototype.update): ():
  • inspector/front-end/StylesSidebarPane.js: (WebInspector.StylesSidebarPane.prototype._rebuildSectionsForStyleRules):
  • inspector/front-end/inspector.css: (.node-link):
Location:
trunk/WebCore
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebCore/ChangeLog

    r58409 r58412  
     12010-04-28  Pavel Feldman  <pfeldman@chromium.org>
     2
     3        Reviewed by Timothy Hatcher.
     4
     5        Web Inspector: Linkify node and function in the event listeners panel.
     6
     7        https://bugs.webkit.org/show_bug.cgi?id=38251
     8
     9        * bindings/js/ScriptEventListener.cpp:
     10        (WebCore::eventListenerHandlerBody):
     11        (WebCore::eventListenerHandlerLocation):
     12        * bindings/js/ScriptEventListener.h:
     13        * bindings/v8/ScriptEventListener.cpp:
     14        (WebCore::eventListenerHandlerBody):
     15        (WebCore::eventListenerHandlerLocation):
     16        * bindings/v8/ScriptEventListener.h:
     17        * inspector/InspectorDOMAgent.cpp:
     18        (WebCore::InspectorDOMAgent::buildObjectForEventListener):
     19        * inspector/front-end/ElementsPanel.js:
     20        (WebInspector.ElementsPanel.prototype.linkifyNodeReference):
     21        (WebInspector.ElementsPanel.prototype.linkifyNodeReference.preventDefault):
     22        * inspector/front-end/EventListenersSidebarPane.js:
     23        (WebInspector.EventListenersSidebarPane.prototype.update.callback):
     24        (WebInspector.EventListenersSidebarPane.prototype.update):
     25        ():
     26        * inspector/front-end/StylesSidebarPane.js:
     27        (WebInspector.StylesSidebarPane.prototype._rebuildSectionsForStyleRules):
     28        * inspector/front-end/inspector.css:
     29        (.node-link):
     30
    1312010-04-28  Julien Chaffraix  <jchaffraix@webkit.org>
    232
  • trunk/WebCore/bindings/js/ScriptEventListener.cpp

    r57738 r58412  
    106106}
    107107
    108 String getEventListenerHandlerBody(ScriptExecutionContext* context, ScriptState* scriptState, EventListener* eventListener)
     108String eventListenerHandlerBody(ScriptExecutionContext* context, ScriptState* scriptState, EventListener* eventListener)
    109109{
    110110    const JSEventListener* jsListener = JSEventListener::cast(eventListener);
     
    117117}
    118118
     119bool eventListenerHandlerLocation(ScriptExecutionContext*, ScriptState*, EventListener*, String&, int&)
     120{
     121    return false;
     122}
     123
    119124} // namespace WebCore
  • trunk/WebCore/bindings/js/ScriptEventListener.h

    r48887 r58412  
    4646    PassRefPtr<JSLazyEventListener> createAttributeEventListener(Node*, Attribute*);
    4747    PassRefPtr<JSLazyEventListener> createAttributeEventListener(Frame*, Attribute*);
    48     String getEventListenerHandlerBody(ScriptExecutionContext*, ScriptState*, EventListener*);
    49 
     48    String eventListenerHandlerBody(ScriptExecutionContext*, ScriptState*, EventListener*);
     49    bool eventListenerHandlerLocation(ScriptExecutionContext*, ScriptState*, EventListener*, String& sourceName, int& lineNumber);
    5050} // namespace WebCore
    5151
  • trunk/WebCore/bindings/v8/ScriptEventListener.cpp

    r55207 r58412  
    107107}
    108108
    109 String getEventListenerHandlerBody(ScriptExecutionContext* context, ScriptState* scriptState, EventListener* listener)
     109String eventListenerHandlerBody(ScriptExecutionContext* context, ScriptState* scriptState, EventListener* listener)
    110110{
    111111    if (listener->type() != EventListener::JSEventListenerType)
     
    121121}
    122122
     123bool eventListenerHandlerLocation(ScriptExecutionContext* context, ScriptState* scriptState, EventListener* listener, String& sourceName, int& lineNumber)
     124{
     125    if (listener->type() != EventListener::JSEventListenerType)
     126        return false;
     127
     128    ScriptScope scope(scriptState);
     129    V8AbstractEventListener* v8Listener = static_cast<V8AbstractEventListener*>(listener);
     130    v8::Handle<v8::Object> object = v8Listener->getListenerObject(context);
     131    if (object.IsEmpty() || !object->IsFunction())
     132        return false;
     133
     134    v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(object);
     135    v8::ScriptOrigin origin = function->GetScriptOrigin();
     136    sourceName = "";
     137    lineNumber = 1;
     138    if (!origin.ResourceName().IsEmpty()) {
     139        sourceName = toWebCoreString(origin.ResourceName());
     140        lineNumber = function->GetScriptLineNumber() + 1;
     141        return true;
     142    }
     143    return false;
     144}
     145
    123146} // namespace WebCore
  • trunk/WebCore/bindings/v8/ScriptEventListener.h

    r48887 r58412  
    4646    PassRefPtr<V8LazyEventListener> createAttributeEventListener(Node*, Attribute*);
    4747    PassRefPtr<V8LazyEventListener> createAttributeEventListener(Frame*, Attribute*);
    48     String getEventListenerHandlerBody(ScriptExecutionContext*, ScriptState*, EventListener*);
     48    String eventListenerHandlerBody(ScriptExecutionContext*, ScriptState*, EventListener*);
     49    bool eventListenerHandlerLocation(ScriptExecutionContext*, ScriptState*, EventListener*, String& sourceName, int& lineNumber);
    4950
    5051} // namespace WebCore
  • trunk/WebCore/inspector/InspectorDOMAgent.cpp

    r57514 r58412  
    629629    value.set("isAttribute", eventListener->isAttribute());
    630630    value.set("nodeId", pushNodePathToFrontend(node));
    631     value.set("listener", getEventListenerHandlerBody(node->document(), m_frontend->scriptState(), eventListener.get()));
     631    value.set("listenerBody", eventListenerHandlerBody(node->document(), m_frontend->scriptState(), eventListener.get()));
     632    String sourceName;
     633    int lineNumber;
     634    if (eventListenerHandlerLocation(node->document(), m_frontend->scriptState(), eventListener.get(), sourceName, lineNumber)) {
     635        value.set("sourceName", sourceName);
     636        value.set("lineNumber", lineNumber);
     637    }
    632638    return value;
    633639}
  • trunk/WebCore/inspector/front-end/ElementsPanel.js

    r56446 r58412  
    764764    },
    765765
     766    linkifyNodeReference: function(node)
     767    {
     768        function selectNode(e)
     769        {
     770            WebInspector.updateFocusedNode(node.id);
     771        }
     772
     773        var link = document.createElement("span");
     774        link.className = "node-link";
     775        link.addEventListener("click", selectNode, false);
     776        this.decorateNodeLabel(node, link);
     777        return link;
     778    },
     779
    766780    updateBreadcrumbSizes: function(focusedCrumb)
    767781    {
  • trunk/WebCore/inspector/front-end/EventListenersSidebarPane.js

    r54973 r58412  
    7878                eventListener.node = WebInspector.domAgent.nodeForId(eventListener.nodeId);
    7979                delete eventListener.nodeId; // no longer needed
    80                 if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listener.toString()))
     80                if (/^function _inspectorCommandLineAPI_logEvent\(/.test(eventListener.listenerBody.toString()))
    8181                    continue; // ignore event listeners generated by monitorEvent
    8282                var type = eventListener.type;
     
    156156        for (var i = 0; i < length; ++i) {
    157157            var eventListener = filteredEventListeners[i];
    158             var eventListenerBar = new WebInspector.EventListenerBar(eventListener);
     158            var eventListenerBar = new WebInspector.EventListenerBar(eventListener, this._nodeId);
    159159            if (i < length - 1) {
    160160                var connector = document.createElement("div");
     
    175175WebInspector.EventListenersSection.prototype.__proto__ = WebInspector.PropertiesSection.prototype;
    176176
    177 WebInspector.EventListenerBar = function(eventListener)
     177WebInspector.EventListenerBar = function(eventListener, nodeId)
    178178{
    179179    this.eventListener = eventListener;
    180     WebInspector.ObjectPropertiesSection.call(this, null, this._getFunctionDisplayName(), this._getNodeDisplayName());
     180    this._nodeId = nodeId;
     181    WebInspector.ObjectPropertiesSection.call(this);
     182    this._setNodeTitle();
     183    this._setFunctionSubtitle();
    181184    this.editable = false;
    182185    this.element.className = "event-bar"; /* Changed from "section" */
     
    200203    },
    201204
    202     _getNodeDisplayName: function()
     205    _setNodeTitle: function()
    203206    {
    204207        var node = this.eventListener.node;
    205208        if (!node)
    206             return "";
    207 
    208         if (node.nodeType === Node.DOCUMENT_NODE)
    209             return "document";
    210 
    211         return appropriateSelectorForNode(node);
    212     },
    213 
    214     _getFunctionDisplayName: function()
     209            return;
     210
     211        if (node.nodeType === Node.DOCUMENT_NODE) {
     212            this.titleElement.textContent = "document";
     213            return;
     214        }
     215
     216        if (node.id === this._nodeId) {
     217            this.titleElement.textContent = appropriateSelectorForNode(node);
     218            return;
     219        }
     220
     221        this.titleElement.removeChildren();
     222        this.titleElement.appendChild(WebInspector.panels.elements.linkifyNodeReference(this.eventListener.node));
     223    },
     224
     225    _setFunctionSubtitle: function()
    215226    {
    216227        // Requires that Function.toString() return at least the function's signature.
    217         var match = this.eventListener.listener.toString().match(/function ([^\(]+?)\(/);
    218         return (match ? match[1] : WebInspector.UIString("(anonymous function)"));
     228        var subtitle = "";
     229        var payload = this.eventListener;
     230        if (this.eventListener.sourceName) {
     231            this.subtitleElement.removeChildren();
     232            this.subtitleElement.appendChild(WebInspector.linkifyResourceAsNode(this.eventListener.sourceName, "scripts", this.eventListener.lineNumber));
     233        } else {
     234            var match = this.eventListener.listenerBody.match(/function ([^\(]+?)\(/);
     235            if (match)
     236                this.subtitleElement.textContent = match[1];
     237            else
     238                this.subtitleElement.textContent = WebInspector.UIString("(anonymous function)");
     239        }
    219240    }
    220241}
  • trunk/WebCore/inspector/front-end/StylesSidebarPane.js

    r57060 r58412  
    410410                separatorElement.className = "styles-sidebar-separator";
    411411                if (styleRule.node) {
    412                     var link = document.createElement("a");
    413                     link.href = "";
    414                     link.addEventListener("mousedown", this._selectNode.bind(this, styleRule.node.id), false);
    415                     WebInspector.panels.elements.decorateNodeLabel(styleRule.node, link);
     412                    var link = WebInspector.panels.elements.linkifyNodeReference(styleRule.node);
    416413                    separatorElement.appendChild(document.createTextNode(WebInspector.UIString("Inherited from") + " "));
    417414                    separatorElement.appendChild(link);
     
    453450        }
    454451        return sections;
    455     },
    456 
    457     _selectNode: function(nodeId, e)
    458     {
    459         WebInspector.updateFocusedNode(nodeId);
    460         e.preventDefault();
    461452    },
    462453
  • trunk/WebCore/inspector/front-end/inspector.css

    r58406 r58412  
    40314031    padding: 32px;
    40324032}
     4033
     4034.node-link {
     4035    text-decoration: underline;
     4036    cursor: pointer;
     4037}
Note: See TracChangeset for help on using the changeset viewer.