insertAdjacentNode method

void insertAdjacentNode(
  1. Pointer<NativeBindingObject> selfPointer,
  2. String position,
  3. Pointer<NativeBindingObject> newPointer
)

foo

Implementation

void insertAdjacentNode(Pointer<NativeBindingObject> selfPointer,
    String position, Pointer<NativeBindingObject> newPointer) {
  Node? target = getBindingObject<Node>(selfPointer);
  Node? newNode = getBindingObject<Node>(newPointer);

  if (target == null || newNode == null) {
    return;
  }

  // In Blink mode, style-sync UICommands may arrive a frame later than DOM
  // insertion commands. Hide newly inserted elements until their first style
  // sync starts to avoid a 1-frame unstyled flash.
  final bool shouldDeferBlinkFirstPaint =
      enableBlink && (document.documentElement?.renderStyle.hasRenderBox() ?? false);
  if (shouldDeferBlinkFirstPaint) {
    if (newNode is Element) {
      newNode.markBlinkDeferFirstPaint();
    } else if (newNode is DocumentFragment) {
      for (final Node child in newNode.childNodes) {
        if (child is Element) {
          child.markBlinkDeferFirstPaint();
        }
      }
    }
  }

  Node? targetParentNode = target.parentNode;

  switch (position) {
    case 'beforebegin':
      Node? previousSibling = target.previousSibling;
      targetParentNode!.insertBefore(newNode, target);
      final cb = devtoolsChildNodeInserted;
      if (cb != null) cb(targetParentNode, newNode, previousSibling);
      break;
    case 'afterbegin':
      Node? previousSibling;
      target.insertBefore(newNode, target.firstChild!);
      final cb = devtoolsChildNodeInserted;
      if (cb != null) cb(target, newNode, previousSibling);
      break;
    case 'beforeend':
      Node? previousSibling = target.lastChild;
      target.appendChild(newNode);
      final cb = devtoolsChildNodeInserted;
      if (cb != null) cb(target, newNode, previousSibling);
      break;
    case 'afterend':
      if (targetParentNode!.lastChild == target) {
        Node? previousSibling = target;
        targetParentNode.appendChild(newNode);
        final cb = devtoolsChildNodeInserted;
        if (cb != null) cb(targetParentNode, newNode, previousSibling);
      } else {
        Node? previousSibling = target;
        targetParentNode.insertBefore(newNode, target.nextSibling!);
        final cb = devtoolsChildNodeInserted;
        if (cb != null) cb(targetParentNode, newNode, previousSibling);
      }
      break;
  }

  if (devtoolsChildNodeInserted == null) {
    _debugDOMTreeChanged();
  }
}