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;