Changeset 147428 in webkit


Ignore:
Timestamp:
Apr 2, 2013 7:28:48 AM (11 years ago)
Author:
commit-queue@webkit.org
Message:

Web Inspector: allow referencing of nodes that have not been pushed to the front-end
https://bugs.webkit.org/show_bug.cgi?id=110921

Patch by Dmitry Gozman <dgozman@chromium.org> on 2013-04-02
Reviewed by Pavel Feldman.

Nodes not yet pushed to front-end are referenced by BackendNodeId and retained.
One can group nodes when generating BackendNodeIds to release them all together later.

To resolve node references by BackendNodeId, frontend should use new pushNodeByBackendIdToFrontend method.
This will invalidate the generated BackendNodeId.

  • inspector/Inspector.json:
  • inspector/InspectorDOMAgent.cpp:

(WebCore::InspectorDOMAgent::discardBindings):
(WebCore::InspectorDOMAgent::backendNodeIdForNode):
(WebCore::InspectorDOMAgent::releaseBackendNodeIds):
(WebCore::InspectorDOMAgent::pushNodeByBackendIdToFrontend):

  • inspector/InspectorDOMAgent.h:

(WebCore):
(InspectorDOMAgent):

Location:
trunk/Source/WebCore
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r147426 r147428  
     12013-04-02  Dmitry Gozman  <dgozman@chromium.org>
     2
     3        Web Inspector: allow referencing of nodes that have not been pushed to the front-end
     4        https://bugs.webkit.org/show_bug.cgi?id=110921
     5
     6        Reviewed by Pavel Feldman.
     7
     8        Nodes not yet pushed to front-end are referenced by BackendNodeId and retained.
     9        One can group nodes when generating BackendNodeIds to release them all together later.
     10
     11        To resolve node references by BackendNodeId, frontend should use new pushNodeByBackendIdToFrontend method.
     12        This will invalidate the generated BackendNodeId.
     13
     14        * inspector/Inspector.json:
     15        * inspector/InspectorDOMAgent.cpp:
     16        (WebCore::InspectorDOMAgent::discardBindings):
     17        (WebCore::InspectorDOMAgent::backendNodeIdForNode):
     18        (WebCore::InspectorDOMAgent::releaseBackendNodeIds):
     19        (WebCore::InspectorDOMAgent::pushNodeByBackendIdToFrontend):
     20        * inspector/InspectorDOMAgent.h:
     21        (WebCore):
     22        (InspectorDOMAgent):
     23
    1242013-04-02  Andrei Bucur  <abucur@adobe.com>
    225
  • trunk/Source/WebCore/inspector/Inspector.json

    r147202 r147428  
    17141714                "type": "integer",
    17151715                "description": "Unique DOM node identifier."
     1716            },
     1717            {
     1718                "id": "BackendNodeId",
     1719                "type": "integer",
     1720                "description": "Unique DOM node identifier used to reference a node that may not have been pushed to the front-end.",
     1721                "hidden": true
    17161722            },
    17171723            {
     
    20152021                ],
    20162022                "description": "Requests that the node is sent to the caller given its path. // FIXME, use XPath",
     2023                "hidden": true
     2024            },
     2025            {
     2026                "name": "pushNodeByBackendIdToFrontend",
     2027                "parameters": [
     2028                    { "name": "backendNodeId", "$ref": "BackendNodeId", "description": "The backend node id of the node." }
     2029                ],
     2030                "returns": [
     2031                    { "name": "nodeId", "$ref": "NodeId", "description": "The pushed node's id." }
     2032                ],
     2033                "description": "Requests that the node is sent to the caller given its backend node id.",
     2034                "hidden": true
     2035            },
     2036            {
     2037                "name": "releaseBackendNodeIds",
     2038                "parameters": [
     2039                    { "name": "nodeGroup", "type": "string", "description": "The backend node ids group name." }
     2040                ],
     2041                "description": "Requests that group of <code>BackendNodeIds</code> is released.",
    20172042                "hidden": true
    20182043            },
  • trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp

    r147202 r147428  
    228228    , m_domListener(0)
    229229    , m_lastNodeId(1)
     230    , m_lastBackendNodeId(-1)
    230231    , m_searchingForNode(false)
    231232    , m_suppressAttributeModifiedEvent(false)
     
    492493    releaseDanglingNodes();
    493494    m_childrenRequested.clear();
     495    m_backendIdToNode.clear();
     496    m_nodeGroupToBackendIdMap.clear();
    494497}
    495498
     
    623626{
    624627    return m_documentNodeToIdMap.get(node);
     628}
     629
     630BackendNodeId InspectorDOMAgent::backendNodeIdForNode(Node* node, const String& nodeGroup)
     631{
     632    if (!node)
     633        return 0;
     634
     635    if (!m_nodeGroupToBackendIdMap.contains(nodeGroup))
     636        m_nodeGroupToBackendIdMap.set(nodeGroup, NodeToBackendIdMap());
     637
     638    NodeToBackendIdMap& map = m_nodeGroupToBackendIdMap.find(nodeGroup)->value;
     639    BackendNodeId id = map.get(node);
     640    if (!id) {
     641        id = --m_lastBackendNodeId;
     642        map.set(node, id);
     643        m_backendIdToNode.set(id, std::make_pair(node, nodeGroup));
     644    }
     645
     646    return id;
     647}
     648
     649void InspectorDOMAgent::releaseBackendNodeIds(ErrorString* errorString, const String& nodeGroup)
     650{
     651    if (m_nodeGroupToBackendIdMap.contains(nodeGroup)) {
     652        NodeToBackendIdMap& map = m_nodeGroupToBackendIdMap.find(nodeGroup)->value;
     653        for (NodeToBackendIdMap::iterator it = map.begin(); it != map.end(); ++it)
     654            m_backendIdToNode.remove(it->value);
     655        m_nodeGroupToBackendIdMap.remove(nodeGroup);
     656        return;
     657    }
     658    *errorString = "Group name not found";
    625659}
    626660
     
    17681802}
    17691803
     1804void InspectorDOMAgent::pushNodeByBackendIdToFrontend(ErrorString* errorString, BackendNodeId backendNodeId, int* nodeId)
     1805{
     1806    if (!m_backendIdToNode.contains(backendNodeId)) {
     1807        *errorString = "No node with given backend id found";
     1808        return;
     1809    }
     1810
     1811    Node* node = m_backendIdToNode.get(backendNodeId).first;
     1812    String nodeGroup = m_backendIdToNode.get(backendNodeId).second;
     1813    *nodeId = pushNodePathToFrontend(node);
     1814
     1815    if (nodeGroup == "") {
     1816        m_backendIdToNode.remove(backendNodeId);
     1817        m_nodeGroupToBackendIdMap.find(nodeGroup)->value.remove(node);
     1818    }
     1819}
     1820
    17701821PassRefPtr<TypeBuilder::Runtime::RemoteObject> InspectorDOMAgent::resolveNode(Node* node, const String& objectGroup)
    17711822{
  • trunk/Source/WebCore/inspector/InspectorDOMAgent.h

    r147202 r147428  
    7676
    7777typedef String ErrorString;
     78typedef int BackendNodeId;
    7879
    7980#if ENABLE(INSPECTOR)
     
    142143    virtual void requestNode(ErrorString*, const String& objectId, int* nodeId);
    143144    virtual void pushNodeByPathToFrontend(ErrorString*, const String& path, int* nodeId);
     145    virtual void pushNodeByBackendIdToFrontend(ErrorString*, BackendNodeId, int* nodeId);
     146    virtual void releaseBackendNodeIds(ErrorString*, const String& nodeGroup);
    144147    virtual void hideHighlight(ErrorString*);
    145148    virtual void highlightRect(ErrorString*, int x, int y, int width, int height, const RefPtr<InspectorObject>* color, const RefPtr<InspectorObject>* outlineColor);
     
    180183    int boundNodeId(Node*);
    181184    void setDOMListener(DOMListener*);
     185    BackendNodeId backendNodeIdForNode(Node*, const String& nodeGroup);
    182186
    183187    static String documentURLString(Document*);
     
    247251    DOMListener* m_domListener;
    248252    NodeToIdMap m_documentNodeToIdMap;
     253    typedef HashMap<RefPtr<Node>, BackendNodeId> NodeToBackendIdMap;
     254    HashMap<String, NodeToBackendIdMap> m_nodeGroupToBackendIdMap;
    249255    // Owns node mappings for dangling nodes.
    250256    Vector<OwnPtr<NodeToIdMap> > m_danglingNodeToIdMaps;
     
    252258    HashMap<int, NodeToIdMap*> m_idToNodesMap;
    253259    HashSet<int> m_childrenRequested;
     260    HashMap<BackendNodeId, std::pair<Node*, String> > m_backendIdToNode;
    254261    int m_lastNodeId;
     262    BackendNodeId m_lastBackendNodeId;
    255263    RefPtr<Document> m_document;
    256264    typedef HashMap<String, Vector<RefPtr<Node> > > SearchResults;
Note: See TracChangeset for help on using the changeset viewer.