onMoveTo method

void onMoveTo(
  1. int? id,
  2. Map<String, dynamic> params
)

https://chromedevtools.github.io/devtools-protocol/tot/DOM/#method-moveTo Moves the node identified by nodeId into the new container (targetNodeId), optionally before insertBeforeNodeId when provided. Returns the nodeId.

Implementation

void onMoveTo(int? id, Map<String, dynamic> params) {
  final ctx = dbgContext;
  if (ctx == null) {
    sendToFrontend(id, null);
    return;
  }

  final int? nodeId = params['nodeId'];
  final int? targetNodeId = params['targetNodeId'];
  // Spec uses insertBeforeNodeId; accept alternative keys for compatibility.
  final int? insertBeforeNodeId = params['insertBeforeNodeId'] ?? params['anchorNodeId'];

  if (nodeId == null || targetNodeId == null) {
    sendToFrontend(id, null);
    return;
  }

  final nodePtrAddr = ctx.getTargetIdByNodeId(nodeId);
  final targetPtrAddr = ctx.getTargetIdByNodeId(targetNodeId);
  final beforePtrAddr = insertBeforeNodeId != null ? ctx.getTargetIdByNodeId(insertBeforeNodeId) : null;

  if (nodePtrAddr == null || targetPtrAddr == null) {
    sendToFrontend(id, null);
    return;
  }

  final node = ctx.getBindingObject(Pointer.fromAddress(nodePtrAddr)) as Node?;
  final target = ctx.getBindingObject(Pointer.fromAddress(targetPtrAddr)) as Node?;
  final before = (beforePtrAddr != null && beforePtrAddr != 0)
      ? ctx.getBindingObject(Pointer.fromAddress(beforePtrAddr)) as Node?
      : null;

  if (node == null || target == null) {
    sendToFrontend(id, null);
    return;
  }

  // Use controller view bridge to ensure DevTools incremental callbacks fire.
  final controller = ctx.getController() ?? devtoolsService.controller;
  if (controller == null) {
    // Fallback to raw DOM operations if controller not present
    try {
      // Remove from old parent
      node.parentNode?.removeChild(node);
      // Insert before anchor if provided else append
      if (before != null && before.parentNode == target) {
        target.insertBefore(node, before);
      } else if (target is ContainerNode) {
        target.appendChild(node);
      }
    } catch (_) {}
  } else {
    final view = controller.view;
    try {
      // Emit removal from old parent
      if (node.parentNode != null) {
        view.removeNode(node.pointer!);
      }
      // Insert before anchor or append to target
      if (before != null) {
        // Insert before the given reference node
        view.insertAdjacentNode(before.pointer!, 'beforebegin', node.pointer!);
      } else {
        // Append as last child of target
        view.insertAdjacentNode(target.pointer!, 'beforeend', node.pointer!);
      }
    } catch (_) {}
  }

  sendToFrontend(id, JSONEncodableMap({'nodeId': nodeId}));
}