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();
}