onSetNodeName method
https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-setNodeName Renames a node (typically an element) to the provided tag name, returning the new nodeId.
Implementation
void onSetNodeName(int? id, Map<String, dynamic> params) {
final ctx = dbgContext;
if (ctx == null) {
sendToFrontend(id, null);
return;
}
final int? nodeId = params['nodeId'];
final String? name = params['name'];
if (nodeId == null || name == null || name.isEmpty) {
sendToFrontend(id, null);
return;
}
final targetId = ctx.getTargetIdByNodeId(nodeId);
if (targetId == null || targetId == 0) {
sendToFrontend(id, null);
return;
}
final Node? node = ctx.getBindingObject(Pointer.fromAddress(targetId)) as Node?;
if (node is! Element) {
// Only elements can be renamed by tag
sendToFrontend(id, JSONEncodableMap({'nodeId': nodeId}));
return;
}
final controller = ctx.getController() ?? devtoolsService.controller;
if (controller == null) {
sendToFrontend(id, JSONEncodableMap({'nodeId': nodeId}));
return;
}
// Create new native element for the new tag name
final newPtr = allocateNewBindingObject();
try {
controller.view.createElement(newPtr, name);
} catch (e) {
sendToFrontend(id, JSONEncodableMap({'nodeId': nodeId}));
return;
}
// Copy attributes/inline styles/id/class via clone helper
try {
controller.view.cloneNode(node.pointer!, newPtr);
} catch (_) {}
// Move children to the new element (DOM-level; will be included in inserted node payload)
final Element? newEl = ctx.getBindingObject(newPtr) as Element?;
if (newEl != null) {
while (node.firstChild != null) {
newEl.appendChild(node.firstChild!);
}
// Insert new element after the original, then remove original to trigger CDP events
try {
controller.view.insertAdjacentNode(node.pointer!, 'afterend', newPtr);
} catch (_) {}
try {
controller.view.removeNode(node.pointer!);
} catch (_) {
node.parentNode?.removeChild(node);
}
final newId = ctx.forDevtoolsNodeId(newEl);
sendToFrontend(id, JSONEncodableMap({'nodeId': newId}));
return;
}
// Fallback
sendToFrontend(id, JSONEncodableMap({'nodeId': nodeId}));
}