Title: [294621] trunk
Revision
294621
Author
pan...@apple.com
Date
2022-05-22 11:00:55 -0700 (Sun, 22 May 2022)

Log Message

Unreviewed, reverting r249538 & r249598.
https://bugs.webkit.org/show_bug.cgi?id=240769

Introduced inconsistencies between backend and frontend DOM tree state.

Reverted changesets:

"Web Inspector: preserve DOM.NodeId if a node is removed and re-added"
https://bugs.webkit.org/show_bug.cgi?id=189687
https://commits.webkit.org/249538

"Web Inspector: Clean up `WI.DOMNode` to no longer require the shared `WI.DOMManager` be passed during construction"
https://bugs.webkit.org/show_bug.cgi?id=239129
https://commits.webkit.org/249598

Canonical link: https://commits.webkit.org/250847@main

Modified Paths

Diff

Modified: trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-ancestor-expected.txt (294620 => 294621)


--- trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-ancestor-expected.txt	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-ancestor-expected.txt	2022-05-22 18:00:55 UTC (rev 294621)
@@ -16,8 +16,6 @@
 CALL STACK:
 0: [F] testNodeRemovedAncestor
 1: [P] Global Code
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 -- Running test teardown.
 
 -- Running test case: DOMBreakpoint.NodeRemoved.Ancestor.BreakpointDisabled
@@ -24,8 +22,6 @@
 Adding "node-removed:1,HTML,1,BODY,1,DIV,0,DIV,0,DIV" DOM Breakpoint...
 Disabling breakpoint...
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should not pause for disabled breakpoint.
 -- Running test teardown.
 
@@ -33,8 +29,6 @@
 Adding "node-removed:1,HTML,1,BODY,1,DIV,0,DIV,0,DIV" DOM Breakpoint...
 Disabling all breakpoints...
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 Enabling all breakpoints...
 PASS: Should not pause when all breakpoints disabled.
 -- Running test teardown.
@@ -52,25 +46,17 @@
 Setting condition to 'false'...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should not pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should not pause.
 
 Setting condition to 'true'...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should pause.
 
 -- Running test case: DOMBreakpoint.NodeRemoved.Ancestor.Options.Condition.ConsoleCommandLineAPI
@@ -80,13 +66,9 @@
 Setting condition to saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should not pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should not pause.
 
 Adding saved console value 'true'...
@@ -93,13 +75,9 @@
 Setting condition to saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should pause.
 
 -- Running test case: DOMBreakpoint.NodeRemoved.Ancestor.Options.Action.Log
@@ -108,8 +86,6 @@
 Adding log action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -116,8 +92,6 @@
 Editing log action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -125,8 +99,6 @@
 Enabling auto-continue...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -133,8 +105,6 @@
 Editing log action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -144,8 +114,6 @@
 Adding evaluate action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -152,8 +120,6 @@
 Editing evaluate action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -161,8 +127,6 @@
 Enabling auto-continue...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -169,8 +133,6 @@
 Editing evaluate action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -181,8 +143,6 @@
 Adding evaluate action using saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -190,8 +150,6 @@
 Editing evaluate action using saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -200,8 +158,6 @@
 Enabling auto-continue...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -209,8 +165,6 @@
 Editing evaluate action using saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-ancestor-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 

Modified: trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-ancestor.html (294620 => 294621)


--- trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-ancestor.html	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-ancestor.html	2022-05-22 18:00:55 UTC (rev 294621)
@@ -46,6 +46,8 @@
 
             await InspectorTest.evaluateInPage(`testNodeRemovedAncestor()`);
 
+            InspectorTest.assert(!breakpoint.domNode, "Should not have domNode.");
+
             InspectorTest.assert(paused, "Should pause.");
             WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, pausedListener);
         },
@@ -70,9 +72,13 @@
             InspectorTest.log("Disabling breakpoint...");
             breakpoint.disabled = true;
 
+            InspectorTest.assert(breakpoint.domNode === node, "Should have domNode.");
+
             InspectorTest.log("Triggering breakpoint...");
             await InspectorTest.evaluateInPage(`testNodeRemovedAncestor()`);
 
+            InspectorTest.assert(!breakpoint.domNode, "Should not have domNode.");
+
             InspectorTest.expectFalse(paused, "Should not pause for disabled breakpoint.");
             WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, pausedListener);
         },
@@ -100,6 +106,8 @@
             InspectorTest.log("Triggering breakpoint...");
             await InspectorTest.evaluateInPage(`testNodeRemovedAncestor()`);
 
+            InspectorTest.assert(!breakpoint.domNode, "Should not have domNode.");
+
             InspectorTest.log("Enabling all breakpoints...");
             await DebuggerAgent.setBreakpointsActive(true);
 
@@ -127,9 +135,13 @@
             InspectorTest.log("Removing breakpoint...");
             WI.domDebuggerManager.removeDOMBreakpoint(breakpoint);
 
+            InspectorTest.assert(!breakpoint.domNode, "Should not have domNode.");
+
             InspectorTest.log("Triggering breakpoint...");
             await InspectorTest.evaluateInPage(`testNodeRemovedAncestor()`);
 
+            InspectorTest.assert(!breakpoint.domNode, "Should not have domNode.");
+
             InspectorTest.expectFalse(paused, "Should not pause for removed breakpoint.");
             WI.debuggerManager.removeEventListener(WI.DebuggerManager.Event.Paused, pausedListener);
         },

Modified: trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-direct-expected.txt (294620 => 294621)


--- trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-direct-expected.txt	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/LayoutTests/inspector/dom-debugger/dom-breakpoint-node-removed-direct-expected.txt	2022-05-22 18:00:55 UTC (rev 294621)
@@ -15,8 +15,6 @@
 CALL STACK:
 0: [F] testNodeRemovedDirect
 1: [P] Global Code
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 -- Running test teardown.
 
 -- Running test case: DOMBreakpoint.NodeRemoved.Direct.BreakpointDisabled
@@ -23,8 +21,6 @@
 Adding "node-removed:1,HTML,1,BODY,1,DIV,0,DIV" DOM Breakpoint...
 Disabling breakpoint...
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should not pause for disabled breakpoint.
 -- Running test teardown.
 
@@ -32,8 +28,6 @@
 Adding "node-removed:1,HTML,1,BODY,1,DIV,0,DIV" DOM Breakpoint...
 Disabling all breakpoints...
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 Enabling all breakpoints...
 PASS: Should not pause when all breakpoints disabled.
 -- Running test teardown.
@@ -51,25 +45,17 @@
 Setting condition to 'false'...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should not pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should not pause.
 
 Setting condition to 'true'...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should pause.
 
 -- Running test case: DOMBreakpoint.NodeRemoved.Direct.Options.Condition.ConsoleCommandLineAPI
@@ -79,13 +65,9 @@
 Setting condition to saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should not pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should not pause.
 
 Adding saved console value 'true'...
@@ -92,13 +74,9 @@
 Setting condition to saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should pause.
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should pause.
 
 -- Running test case: DOMBreakpoint.NodeRemoved.Direct.Options.Action.Log
@@ -107,8 +85,6 @@
 Adding log action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -115,8 +91,6 @@
 Editing log action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -124,8 +98,6 @@
 Enabling auto-continue...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -132,8 +104,6 @@
 Editing log action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -143,8 +113,6 @@
 Adding evaluate action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -151,8 +119,6 @@
 Editing evaluate action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -160,8 +126,6 @@
 Enabling auto-continue...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -168,8 +132,6 @@
 Editing evaluate action...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -180,8 +142,6 @@
 Adding evaluate action using saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -189,8 +149,6 @@
 Editing evaluate action using saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should pause.
 
@@ -199,8 +157,6 @@
 Enabling auto-continue...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 
@@ -208,8 +164,6 @@
 Editing evaluate action using saved console value...
 
 Triggering breakpoint...
-Breakpoint "domNode" set to "null".
-Breakpoint "domNode" set to "div#node-removed-direct-test".
 PASS: Should execute breakpoint action.
 PASS: Should not pause.
 

Modified: trunk/LayoutTests/inspector/dom-debugger/resources/dom-breakpoint-utilities.js (294620 => 294621)


--- trunk/LayoutTests/inspector/dom-debugger/resources/dom-breakpoint-utilities.js	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/LayoutTests/inspector/dom-debugger/resources/dom-breakpoint-utilities.js	2022-05-22 18:00:55 UTC (rev 294621)
@@ -1,12 +1,4 @@
 TestPage.registerInitializer(() => {
-    function handleDOMNodeDidChange(event) {
-        let breakpoint = event.target;
-        if (breakpoint.domNode)
-            InspectorTest.log(`Breakpoint "domNode" set to "${breakpoint.domNode.displayName}".`);
-        else
-            InspectorTest.log(`Breakpoint "domNode" set to "null".`);
-    };
-
     InspectorTest.DOMBreakpoint = {};
 
     InspectorTest.DOMBreakpoint.teardown = function(resolve, reject) {
@@ -17,10 +9,7 @@
     };
 
     InspectorTest.DOMBreakpoint.createBreakpoint = function(domNode, type) {
-        let breakpoint = new WI.DOMBreakpoint(domNode, type);
-        breakpoint.addEventListener(WI.DOMBreakpoint.Event.DOMNodeDidChange, handleDOMNodeDidChange);
-
-        return InspectorTest.DOMBreakpoint.addBreakpoint(breakpoint);
+        return InspectorTest.DOMBreakpoint.addBreakpoint(new WI.DOMBreakpoint(domNode, type));
     };
 
     InspectorTest.DOMBreakpoint.addBreakpoint = function(breakpoint) {
@@ -66,10 +55,4 @@
             });
         });
     };
-
-    // To prevent spurious `Breakpoint "domNode" set to "null".` logging upon removing breakpoints, we should remove the
-    // event listener before the breakpoint has removed its DOM node.
-    WI.domDebuggerManager.addEventListener(WI.DOMDebuggerManager.Event.DOMBreakpointRemoved, (event) => {
-        event.data.breakpoint.removeEventListener(WI.DOMBreakpoint.Event.DOMNodeDidChange, handleDOMNodeDidChange);
-    });
 });

Modified: trunk/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp (294620 => 294621)


--- trunk/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/Source/WebCore/inspector/agents/InspectorCSSAgent.cpp	2022-05-22 18:00:55 UTC (rev 294621)
@@ -993,9 +993,10 @@
         return;
 
     auto nodeId = domAgent->boundNodeId(&node);
-    if (!nodeId && m_layoutContextTypeChangedMode == Protocol::CSS::LayoutContextTypeChangedMode::All)
+    if (!nodeId && m_layoutContextTypeChangedMode == Protocol::CSS::LayoutContextTypeChangedMode::All) {
+        // FIXME: <https://webkit.org/b/189687> Preserve DOM.NodeId if a node is removed and re-added
         nodeId = domAgent->identifierForNode(node);
-
+    }
     if (!nodeId)
         return;
 

Modified: trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp (294620 => 294621)


--- trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.cpp	2022-05-22 18:00:55 UTC (rev 294621)
@@ -362,7 +362,8 @@
         m_revalidateStyleAttrTask->reset();
     m_document = nullptr;
 
-    m_destroyedNodeIdentifiers.clear();
+    m_destroyedDetachedNodeIdentifiers.clear();
+    m_destroyedAttachedNodeIdentifiers.clear();
     if (m_destroyedNodesTimer.isActive())
         m_destroyedNodesTimer.stop();
 }
@@ -399,7 +400,6 @@
 
 Protocol::DOM::NodeId InspectorDOMAgent::bind(Node& node)
 {
-    // Node binding is later balanced in `willDestroyDOMNode` which will remove the binding upon destruction.
     return m_nodeToId.ensure(node, [&] {
         auto id = m_lastNodeId++;
         m_idToNode.set(id, node);
@@ -407,6 +407,40 @@
     }).iterator->value;
 }
 
+void InspectorDOMAgent::unbind(Node& node)
+{
+    auto id = m_nodeToId.take(node);
+    if (!id)
+        return;
+
+    m_idToNode.remove(id);
+
+    if (node.isFrameOwnerElement()) {
+        const HTMLFrameOwnerElement* frameOwner = static_cast<const HTMLFrameOwnerElement*>(&node);
+        if (Document* contentDocument = frameOwner->contentDocument())
+            unbind(*contentDocument);
+    }
+
+    if (is<Element>(node)) {
+        Element& element = downcast<Element>(node);
+        if (ShadowRoot* root = element.shadowRoot())
+            unbind(*root);
+        if (PseudoElement* beforeElement = element.beforePseudoElement())
+            unbind(*beforeElement);
+        if (PseudoElement* afterElement = element.afterPseudoElement())
+            unbind(*afterElement);
+    }
+
+    if (auto* cssAgent = m_instrumentingAgents.enabledCSSAgent())
+        cssAgent->didRemoveDOMNode(node, id);
+
+    if (m_childrenRequested.remove(id)) {
+        // FIXME: Would be better to do this iteratively rather than recursively.
+        for (Node* child = innerFirstChild(&node); child; child = innerNextSibling(child))
+            unbind(*child);
+    }
+}
+
 Node* InspectorDOMAgent::assertNode(Protocol::ErrorString& errorString, Protocol::DOM::NodeId nodeId)
 {
     Node* node = nodeForId(nodeId);
@@ -2418,6 +2452,7 @@
     // Re-add frame owner element together with its new children.
     auto parentId = boundNodeId(innerParentNode(frameOwner.get()));
     m_frontendDispatcher->childNodeRemoved(parentId, frameOwnerId);
+    unbind(*frameOwner);
 
     auto value = buildObjectForNode(frameOwner.get(), 0);
     Node* previousSibling = innerPreviousSibling(frameOwner.get());
@@ -2475,6 +2510,9 @@
     if (containsOnlyHTMLWhitespace(&node))
         return;
 
+    // We could be attaching existing subtree. Forget the bindings.
+    unbind(node);
+
     ContainerNode* parent = node.parentNode();
 
     auto parentId = boundNodeId(parent);
@@ -2506,6 +2544,7 @@
     if (!parentId)
         return;
 
+    // FIXME: <webkit.org/b/189687> Preserve DOM.NodeId if a node is removed and re-added
     if (!m_childrenRequested.contains(parentId)) {
         // No children are mapped yet -> only notify on changes of hasChildren.
         if (innerChildNodeCount(parent) == 1)
@@ -2512,6 +2551,7 @@
             m_frontendDispatcher->childNodeCountUpdated(parentId, 0);
     } else
         m_frontendDispatcher->childNodeRemoved(parentId, boundNodeId(&node));
+    unbind(node);
 }
 
 void InspectorDOMAgent::willDestroyDOMNode(Node& node)
@@ -2532,8 +2572,13 @@
     // This can be called in response to GC. Due to the single-process model used in WebKit1, the
     // event must be dispatched from a timer to prevent the frontend from making JS allocations
     // while the GC is still active.
-    m_destroyedNodeIdentifiers.append(nodeId);
 
+    // FIXME: <webkit.org/b/189687> Unify m_destroyedAttachedNodeIdentifiers and m_destroyedDetachedNodeIdentifiers.
+    if (auto parentId = boundNodeId(node.parentNode()))
+        m_destroyedAttachedNodeIdentifiers.append({ parentId, nodeId });
+    else
+        m_destroyedDetachedNodeIdentifiers.append(nodeId);
+
     if (!m_destroyedNodesTimer.isActive())
         m_destroyedNodesTimer.startOneShot(0_s);
 }
@@ -2540,7 +2585,16 @@
 
 void InspectorDOMAgent::destroyedNodesTimerFired()
 {
-    for (auto nodeId : std::exchange(m_destroyedNodeIdentifiers, { }))
+    for (auto& [parentId, nodeId] : std::exchange(m_destroyedAttachedNodeIdentifiers, { })) {
+        if (!m_childrenRequested.contains(parentId)) {
+            auto* parent = nodeForId(parentId);
+            if (parent && innerChildNodeCount(parent) == 1)
+                m_frontendDispatcher->childNodeCountUpdated(parentId, 0);
+        } else
+            m_frontendDispatcher->childNodeRemoved(parentId, nodeId);
+    }
+    
+    for (auto nodeId : std::exchange(m_destroyedDetachedNodeIdentifiers, { }))
         m_frontendDispatcher->willDestroyDOMNode(nodeId);
 }
 
@@ -2680,6 +2734,7 @@
     auto parentId = boundNodeId(parent);
     ASSERT(parentId);
 
+    unbind(pseudoElement);
     m_frontendDispatcher->pseudoElementRemoved(parentId, pseudoElementId);
 }
 

Modified: trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.h (294620 => 294621)


--- trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.h	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/Source/WebCore/inspector/agents/InspectorDOMAgent.h	2022-05-22 18:00:55 UTC (rev 294621)
@@ -230,6 +230,7 @@
 
     // Node-related methods.
     Inspector::Protocol::DOM::NodeId bind(Node&);
+    void unbind(Node&);
 
     Node* assertEditableNode(Inspector::Protocol::ErrorString&, Inspector::Protocol::DOM::NodeId);
     Element* assertEditableElement(Inspector::Protocol::ErrorString&, Inspector::Protocol::DOM::NodeId);
@@ -276,7 +277,8 @@
     std::unique_ptr<DOMEditor> m_domEditor;
     WeakHashMap<RenderObject, Vector<size_t>> m_flexibleBoxRendererCachedItemsAtStartOfLine;
 
-    Vector<Inspector::Protocol::DOM::NodeId> m_destroyedNodeIdentifiers;
+    Vector<Inspector::Protocol::DOM::NodeId> m_destroyedDetachedNodeIdentifiers;
+    Vector<std::pair<Inspector::Protocol::DOM::NodeId, Inspector::Protocol::DOM::NodeId>> m_destroyedAttachedNodeIdentifiers;
     Timer m_destroyedNodesTimer;
 
 #if ENABLE(VIDEO)

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js (294620 => 294621)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMDebuggerManager.js	2022-05-22 18:00:55 UTC (rev 294621)
@@ -63,8 +63,6 @@
         WI.URLBreakpoint.addEventListener(WI.Breakpoint.Event.ActionsDidChange, this._handleURLBreakpointActionsChanged, this);
 
         WI.domManager.addEventListener(WI.DOMManager.Event.NodeRemoved, this._nodeRemoved, this);
-        WI.domManager.addEventListener(WI.DOMManager.Event.NodeDestroyed, this._nodeRemoved, this);
-        
         WI.domManager.addEventListener(WI.DOMManager.Event.NodeInserted, this._nodeInserted, this);
 
         WI.networkManager.addEventListener(WI.NetworkManager.Event.MainFrameDidChange, this._mainFrameDidChange, this);

Modified: trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js (294620 => 294621)


--- trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/Source/WebInspectorUI/UserInterface/Controllers/DOMManager.js	2022-05-22 18:00:55 UTC (rev 294621)
@@ -188,12 +188,10 @@
     willDestroyDOMNode(nodeId)
     {
         let node = this._idToDOMNode[nodeId];
-        console.assert(!node.parentNode, "Node should have been removed from its parent before `willDestroyDOMNode` is invoked.", node);
-
         node.markDestroyed();
         delete this._idToDOMNode[nodeId];
 
-        this.dispatchEventToListeners(WI.DOMManager.Event.NodeDestroyed, {node});
+        this.dispatchEventToListeners(WI.DOMManager.Event.NodeRemoved, {node});
     }
 
     didAddEventListener(nodeId)
@@ -406,7 +404,7 @@
 
         let newDocument = null;
         if (payload && "nodeId" in payload)
-            newDocument = new WI.DOMNode(payload);
+            newDocument = new WI.DOMNode(this, null, false, payload);
 
         if (this._document === newDocument)
             return;
@@ -422,12 +420,15 @@
         this.dispatchEventToListeners(WI.DOMManager.Event.DocumentUpdated, {document: this._document});
     }
 
+    _setDetachedRoot(payload)
+    {
+        new WI.DOMNode(this, null, false, payload);
+    }
+
     _setChildNodes(parentId, payloads)
     {
         if (!parentId && payloads.length) {
-            // `InspectorDOMAgent::pushNodePathToFrontend` can provide a single child as a detached root node.
-            let node = WI.DOMNode.newOrExistingFromPayload(payloads[0]);
-            console.assert(!node.parentNode);
+            this._setDetachedRoot(payloads[0]);
             return;
         }
 
@@ -456,6 +457,7 @@
         var parent = this._idToDOMNode[parentId];
         var prev = this._idToDOMNode[prevId];
         var node = parent._insertChild(prev, payload);
+        this._idToDOMNode[node.id] = node;
         this.dispatchEventToListeners(WI.DOMManager.Event.NodeInserted, {node, parent});
     }
 
@@ -481,8 +483,9 @@
         if (!parent)
             return;
 
-        let node = WI.DOMNode.newOrExistingFromPayload(pseudoElement, {ownerDocument: parent.ownerDocument});
+        var node = new WI.DOMNode(this, parent.ownerDocument, false, pseudoElement);
         node.parentNode = parent;
+        this._idToDOMNode[node.id] = node;
         console.assert(!parent.pseudoElements().get(node.pseudoType()));
         parent.pseudoElements().set(node.pseudoType(), node);
         this.dispatchEventToListeners(WI.DOMManager.Event.NodeInserted, {node, parent});
@@ -507,13 +510,6 @@
 
     _unbind(node)
     {
-        // COMPATIBILITY (iOS 15.4): After iOS 15.4, the backend no longer unbinds nodes from their IDs until the node
-        // is destroyed. Because there are no protocol changes associated with this change, check for flexbox overlay
-        // support, which was also new after iOS 15.4.
-        // FIXME: <https://webkit.org/b/148680> Use explicit version checking.
-        if (WI.assumingMainTarget().hasCommand("DOM.showFlexOverlay"))
-            return;
-
         node.markDestroyed();
 
         delete this._idToDOMNode[node.id];
@@ -880,5 +876,4 @@
     DOMNodeWasInspected: "dom-manager-dom-node-was-inspected",
     InspectModeStateChanged: "dom-manager-inspect-mode-state-changed",
     InspectedNodeChanged: "dom-manager-inspected-node-changed",
-    NodeDestroyed: "dom-manager-node-destroyed",
 };

Modified: trunk/Source/WebInspectorUI/UserInterface/Models/DOMNode.js (294620 => 294621)


--- trunk/Source/WebInspectorUI/UserInterface/Models/DOMNode.js	2022-05-22 14:36:15 UTC (rev 294620)
+++ trunk/Source/WebInspectorUI/UserInterface/Models/DOMNode.js	2022-05-22 18:00:55 UTC (rev 294621)
@@ -32,19 +32,18 @@
 
 WI.DOMNode = class DOMNode extends WI.Object
 {
-    constructor(payload, {ownerDocument, isInShadowTree} = {})
+    constructor(domManager, doc, isInShadowTree, payload)
     {
         super();
 
         this._destroyed = false;
 
-        this._isInShadowTree = !!isInShadowTree;
+        this._domManager = domManager;
+        this._isInShadowTree = isInShadowTree;
 
         this.id = payload.nodeId;
+        this._domManager._idToDOMNode[this.id] = this;
 
-        console.assert(!(this.id in WI.domManager._idToDOMNode), this);
-        WI.domManager._idToDOMNode[this.id] = this;
-
         this._nodeType = payload.nodeType;
         this._nodeName = payload.nodeName;
         this._localName = payload.localName;
@@ -57,8 +56,10 @@
         this._layoutOverlayShowing = false;
         this._layoutOverlayColorSetting = null;
 
-        this.ownerDocument = this._nodeType === Node.DOCUMENT_NODE ? this : ownerDocument;
-        console.assert(this.ownerDocument, this);
+        if (this._nodeType === Node.DOCUMENT_NODE)
+            this.ownerDocument = this;
+        else
+            this.ownerDocument = doc;
 
         this._frame = null;
 
@@ -93,8 +94,9 @@
         // we have both shadowRoots and child nodes.
         this._shadowRoots = [];
         if (payload.shadowRoots) {
-            for (let shadowRootPayload of payload.shadowRoots) {
-                let node = WI.DOMNode.newOrExistingFromPayload(shadowRootPayload, {ownerDocument: this.ownerDocument, isInShadowTree: true});
+            for (var i = 0; i < payload.shadowRoots.length; ++i) {
+                var root = payload.shadowRoots[i];
+                var node = new WI.DOMNode(this._domManager, this.ownerDocument, true, root);
                 node.parentNode = this;
                 this._shadowRoots.push(node);
             }
@@ -111,14 +113,14 @@
             this._customElementState = null;
 
         if (payload.templateContent) {
-            this._templateContent = WI.DOMNode.newOrExistingFromPayload(payload.templateContent, {ownerDocument: this.ownerDocument});
+            this._templateContent = new WI.DOMNode(this._domManager, this.ownerDocument, false, payload.templateContent);
             this._templateContent.parentNode = this;
         }
 
         this._pseudoElements = new Map;
         if (payload.pseudoElements) {
-            for (let pseudoElementPayload of payload.pseudoElements) {
-                let node = WI.DOMNode.newOrExistingFromPayload(pseudoElementPayload, {ownerDocument: this.ownerDocument, isInShadowTree: this._isInShadowTree});
+            for (var i = 0; i < payload.pseudoElements.length; ++i) {
+                var node = new WI.DOMNode(this._domManager, this.ownerDocument, this._isInShadowTree, payload.pseudoElements[i]);
                 node.parentNode = this;
                 this._pseudoElements.set(node.pseudoType(), node);
             }
@@ -125,7 +127,7 @@
         }
 
         if (payload.contentDocument) {
-            this._contentDocument = WI.DOMNode.newOrExistingFromPayload(payload.contentDocument);
+            this._contentDocument = new WI.DOMNode(this._domManager, null, false, payload.contentDocument);
             this._children = [this._contentDocument];
             this._renumber();
         }
@@ -161,12 +163,6 @@
 
     // Static
 
-    static newOrExistingFromPayload(payload, {ownerDocument, isInShadowTree} = {})
-    {
-        // FIXME: <webkit.org/b/238947> Don't send node payloads to the frontend for already-bound nodes.
-        return WI.domManager.nodeForId(payload.nodeId) || new WI.DOMNode(payload, {ownerDocument, isInShadowTree});
-    }
-
     static resetDefaultLayoutOverlayConfiguration()
     {
         let configuration = WI.DOMNode._defaultLayoutOverlayConfiguration;
@@ -1072,7 +1068,7 @@
 
     _insertChild(prev, payload)
     {
-        let node = WI.DOMNode.newOrExistingFromPayload(payload, {ownerDocument: this.ownerDocument, isInShadowTree: this._isInShadowTree});
+        var node = new WI.DOMNode(this._domManager, this.ownerDocument, this._isInShadowTree, payload);
         if (!prev) {
             if (!this._children) {
                 // First node
@@ -1105,9 +1101,10 @@
             return;
 
         this._children = this._shadowRoots.slice();
-        for (let payload of payloads)
-            this._children.push(WI.DOMNode.newOrExistingFromPayload(payload, {ownerDocument: this.ownerDocument, isInShadowTree: this._isInShadowTree}));
-
+        for (var i = 0; i < payloads.length; ++i) {
+            var node = new WI.DOMNode(this._domManager, this.ownerDocument, this._isInShadowTree, payloads[i]);
+            this._children.push(node);
+        }
         this._renumber();
     }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to