insertAdjacentNode method
void
insertAdjacentNode(
- Pointer<
NativeBindingObject> selfPointer, - String position,
- 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();
}
}