All files / runtime-dom/src nodeOps.ts

97.14% Statements 34/35
100% Branches 32/32
91.66% Functions 11/12
97.05% Lines 33/34

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93    49x   49x   49x   49x   513x       77x 77x 77x         291x       291x 6x     291x     184x   34x     28x       125x     290x   404x   9x                       14x       14x   7x 15x 15x       7x 7x 7x   2x 2x 4x   2x   7x   14x                
import { RendererOptions } from '@vue/runtime-core'
 
export const svgNS = 'http://www.w3.org/2000/svg'
 
const doc = (typeof document !== 'undefined' ? document : null) as Document
 
const templateContainer = doc && /*#__PURE__*/ doc.createElement('template')
 
export const nodeOps: Omit<RendererOptions<Node, Element>, 'patchProp'> = {
  insert: (child, parent, anchor) => {
    parent.insertBefore(child, anchor || null)
  },
 
  remove: child => {
    const parent = child.parentNode
    if (parent) {
      parent.removeChild(child)
    }
  },
 
  createElement: (tag, isSVG, is, props): Element => {
    const el = isSVG
      ? doc.createElementNS(svgNS, tag)
      : doc.createElement(tag, is ? { is } : undefined)
 
    if (tag === 'select' && props && props.multiple != null) {
      ;(el as HTMLSelectElement).setAttribute('multiple', props.multiple)
    }
 
    return el
  },
 
  createText: text => doc.createTextNode(text),
 
  createComment: text => doc.createComment(text),
 
  setText: (node, text) => {
    node.nodeValue = text
  },
 
  setElementText: (el, text) => {
    el.textContent = text
  },
 
  parentNode: node => node.parentNode as Element | null,
 
  nextSibling: node => node.nextSibling,
 
  querySelector: selector => doc.querySelector(selector),
 
  setScopeId(el, id) {
    el.setAttribute(id, '')
  },
 
  // __UNSAFE__
  // Reason: innerHTML.
  // Static content here can only come from compiled templates.
  // As long as the user only uses trusted templates, this is safe.
  insertStaticContent(content, parent, anchor, isSVG, start, end) {
    // <parent> before | first ... last | anchor </parent>
    const before = anchor ? anchor.previousSibling : parent.lastChild
    // #5308 can only take cached path if:
    // - has a single root node
    // - nextSibling info is still available
    if (start && (start === end || start.nextSibling)) {
      // cached
      while (true) {
        parent.insertBefore(start!.cloneNode(true), anchor)
        if (start === end || !(start = start!.nextSibling)) break
      }
    } else {
      // fresh insert
      templateContainer.innerHTML = isSVG ? `<svg>${content}</svg>` : content
      const template = templateContainer.content
      if (isSVG) {
        // remove outer svg wrapper
        const wrapper = template.firstChild!
        while (wrapper.firstChild) {
          template.appendChild(wrapper.firstChild)
        }
        template.removeChild(wrapper)
      }
      parent.insertBefore(template, anchor)
    }
    return [
      // first
      before ? before.nextSibling! : parent.firstChild!,
      // last
      anchor ? anchor.previousSibling! : parent.lastChild!
    ]
  }
}