Title: [147428] trunk/Source/WebCore
Revision
147428
Author
[email protected]
Date
2013-04-02 07:28:48 -0700 (Tue, 02 Apr 2013)

Log 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 <[email protected]> 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):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (147427 => 147428)


--- trunk/Source/WebCore/ChangeLog	2013-04-02 14:28:23 UTC (rev 147427)
+++ trunk/Source/WebCore/ChangeLog	2013-04-02 14:28:48 UTC (rev 147428)
@@ -1,3 +1,26 @@
+2013-04-02  Dmitry Gozman  <[email protected]>
+
+        Web Inspector: allow referencing of nodes that have not been pushed to the front-end
+        https://bugs.webkit.org/show_bug.cgi?id=110921
+
+        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):
+
 2013-04-02  Andrei Bucur  <[email protected]>
 
         [CSS Regions] Nested auto-height regions don't layout correctly

Modified: trunk/Source/WebCore/inspector/Inspector.json (147427 => 147428)


--- trunk/Source/WebCore/inspector/Inspector.json	2013-04-02 14:28:23 UTC (rev 147427)
+++ trunk/Source/WebCore/inspector/Inspector.json	2013-04-02 14:28:48 UTC (rev 147428)
@@ -1715,6 +1715,12 @@
                 "description": "Unique DOM node identifier."
             },
             {
+                "id": "BackendNodeId",
+                "type": "integer",
+                "description": "Unique DOM node identifier used to reference a node that may not have been pushed to the front-end.",
+                "hidden": true
+            },
+            {
                 "id": "Node",
                 "type": "object",
                 "properties": [
@@ -2017,6 +2023,25 @@
                 "hidden": true
             },
             {
+                "name": "pushNodeByBackendIdToFrontend",
+                "parameters": [
+                    { "name": "backendNodeId", "$ref": "BackendNodeId", "description": "The backend node id of the node." }
+                ],
+                "returns": [
+                    { "name": "nodeId", "$ref": "NodeId", "description": "The pushed node's id." }
+                ],
+                "description": "Requests that the node is sent to the caller given its backend node id.",
+                "hidden": true
+            },
+            {
+                "name": "releaseBackendNodeIds",
+                "parameters": [
+                    { "name": "nodeGroup", "type": "string", "description": "The backend node ids group name." }
+                ],
+                "description": "Requests that group of <code>BackendNodeIds</code> is released.",
+                "hidden": true
+            },
+            {
                 "name": "resolveNode",
                 "parameters": [
                     { "name": "nodeId", "$ref": "NodeId", "description": "Id of the node to resolve." },

Modified: trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp (147427 => 147428)


--- trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp	2013-04-02 14:28:23 UTC (rev 147427)
+++ trunk/Source/WebCore/inspector/InspectorDOMAgent.cpp	2013-04-02 14:28:48 UTC (rev 147428)
@@ -227,6 +227,7 @@
     , m_frontend(0)
     , m_domListener(0)
     , m_lastNodeId(1)
+    , m_lastBackendNodeId(-1)
     , m_searchingForNode(false)
     , m_suppressAttributeModifiedEvent(false)
 {
@@ -491,6 +492,8 @@
     m_idToNode.clear();
     releaseDanglingNodes();
     m_childrenRequested.clear();
+    m_backendIdToNode.clear();
+    m_nodeGroupToBackendIdMap.clear();
 }
 
 int InspectorDOMAgent::pushNodeToFrontend(ErrorString* errorString, int documentNodeId, Node* nodeToPush)
@@ -624,6 +627,37 @@
     return m_documentNodeToIdMap.get(node);
 }
 
+BackendNodeId InspectorDOMAgent::backendNodeIdForNode(Node* node, const String& nodeGroup)
+{
+    if (!node)
+        return 0;
+
+    if (!m_nodeGroupToBackendIdMap.contains(nodeGroup))
+        m_nodeGroupToBackendIdMap.set(nodeGroup, NodeToBackendIdMap());
+
+    NodeToBackendIdMap& map = m_nodeGroupToBackendIdMap.find(nodeGroup)->value;
+    BackendNodeId id = map.get(node);
+    if (!id) {
+        id = --m_lastBackendNodeId;
+        map.set(node, id);
+        m_backendIdToNode.set(id, std::make_pair(node, nodeGroup));
+    }
+
+    return id;
+}
+
+void InspectorDOMAgent::releaseBackendNodeIds(ErrorString* errorString, const String& nodeGroup)
+{
+    if (m_nodeGroupToBackendIdMap.contains(nodeGroup)) {
+        NodeToBackendIdMap& map = m_nodeGroupToBackendIdMap.find(nodeGroup)->value;
+        for (NodeToBackendIdMap::iterator it = map.begin(); it != map.end(); ++it)
+            m_backendIdToNode.remove(it->value);
+        m_nodeGroupToBackendIdMap.remove(nodeGroup);
+        return;
+    }
+    *errorString = "Group name not found";
+}
+
 void InspectorDOMAgent::setAttributeValue(ErrorString* errorString, int elementId, const String& name, const String& value)
 {
     Element* element = assertEditableElement(errorString, elementId);
@@ -1767,6 +1801,23 @@
         *errorString = "No node with given path found";
 }
 
+void InspectorDOMAgent::pushNodeByBackendIdToFrontend(ErrorString* errorString, BackendNodeId backendNodeId, int* nodeId)
+{
+    if (!m_backendIdToNode.contains(backendNodeId)) {
+        *errorString = "No node with given backend id found";
+        return;
+    }
+
+    Node* node = m_backendIdToNode.get(backendNodeId).first;
+    String nodeGroup = m_backendIdToNode.get(backendNodeId).second;
+    *nodeId = pushNodePathToFrontend(node);
+
+    if (nodeGroup == "") {
+        m_backendIdToNode.remove(backendNodeId);
+        m_nodeGroupToBackendIdMap.find(nodeGroup)->value.remove(node);
+    }
+}
+
 PassRefPtr<TypeBuilder::Runtime::RemoteObject> InspectorDOMAgent::resolveNode(Node* node, const String& objectGroup)
 {
     Document* document = node->isDocumentNode() ? node->document() : node->ownerDocument();

Modified: trunk/Source/WebCore/inspector/InspectorDOMAgent.h (147427 => 147428)


--- trunk/Source/WebCore/inspector/InspectorDOMAgent.h	2013-04-02 14:28:23 UTC (rev 147427)
+++ trunk/Source/WebCore/inspector/InspectorDOMAgent.h	2013-04-02 14:28:48 UTC (rev 147428)
@@ -75,6 +75,7 @@
 struct HighlightConfig;
 
 typedef String ErrorString;
+typedef int BackendNodeId;
 
 #if ENABLE(INSPECTOR)
 
@@ -141,6 +142,8 @@
     virtual void setInspectModeEnabled(ErrorString*, bool enabled, const RefPtr<InspectorObject>* highlightConfig);
     virtual void requestNode(ErrorString*, const String& objectId, int* nodeId);
     virtual void pushNodeByPathToFrontend(ErrorString*, const String& path, int* nodeId);
+    virtual void pushNodeByBackendIdToFrontend(ErrorString*, BackendNodeId, int* nodeId);
+    virtual void releaseBackendNodeIds(ErrorString*, const String& nodeGroup);
     virtual void hideHighlight(ErrorString*);
     virtual void highlightRect(ErrorString*, int x, int y, int width, int height, const RefPtr<InspectorObject>* color, const RefPtr<InspectorObject>* outlineColor);
     virtual void highlightQuad(ErrorString*, const RefPtr<InspectorArray>& quad, const RefPtr<InspectorObject>* color, const RefPtr<InspectorObject>* outlineColor);
@@ -179,6 +182,7 @@
     Node* nodeForId(int nodeId);
     int boundNodeId(Node*);
     void setDOMListener(DOMListener*);
+    BackendNodeId backendNodeIdForNode(Node*, const String& nodeGroup);
 
     static String documentURLString(Document*);
 
@@ -246,12 +250,16 @@
     InspectorFrontend::DOM* m_frontend;
     DOMListener* m_domListener;
     NodeToIdMap m_documentNodeToIdMap;
+    typedef HashMap<RefPtr<Node>, BackendNodeId> NodeToBackendIdMap;
+    HashMap<String, NodeToBackendIdMap> m_nodeGroupToBackendIdMap;
     // Owns node mappings for dangling nodes.
     Vector<OwnPtr<NodeToIdMap> > m_danglingNodeToIdMaps;
     HashMap<int, Node*> m_idToNode;
     HashMap<int, NodeToIdMap*> m_idToNodesMap;
     HashSet<int> m_childrenRequested;
+    HashMap<BackendNodeId, std::pair<Node*, String> > m_backendIdToNode;
     int m_lastNodeId;
+    BackendNodeId m_lastBackendNodeId;
     RefPtr<Document> m_document;
     typedef HashMap<String, Vector<RefPtr<Node> > > SearchResults;
     SearchResults m_searchResults;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to