From c61df6f4228b693adad07a9d54534db2c12fa309 Mon Sep 17 00:00:00 2001 From: Kevin Schaaf Date: Tue, 23 Oct 2018 15:06:51 -0700 Subject: [PATCH] Use TreeWalker for template-stamp. --- lib/mixins/template-stamp.html | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/mixins/template-stamp.html b/lib/mixins/template-stamp.html index 622356b80a..808a9820f2 100644 --- a/lib/mixins/template-stamp.html +++ b/lib/mixins/template-stamp.html @@ -16,6 +16,8 @@ 'use strict'; + const walker = document.createTreeWalker(document); + // 1.x backwards-compatible auto-wrapper for template type extensions // This is a clear layering violation and gives favored-nation status to // dom-if and dom-repeat templates. This is a conceit we're choosing to keep @@ -50,7 +52,8 @@ if (parent) { // note: marginally faster than indexing via childNodes // (http://jsperf.com/childnodes-lookup) - for (let n=parent.firstChild, i=0; n; n=n.nextSibling) { + walker.currentNode = parent; + for (let n=walker.firstChild(), i=0; n; n=walker.nextSibling()) { if (nodeInfo.parentIndex === i++) { return n; } @@ -234,7 +237,8 @@ // For ShadyDom optimization, indicating there is an insertion point templateInfo.hasInsertionPoint = true; } - if (element.firstChild) { + walker.currentNode = element; + if (walker.firstChild()) { noted = this._parseTemplateChildNodes(element, templateInfo, nodeInfo) || noted; } if (element.hasAttributes && element.hasAttributes()) { @@ -260,7 +264,8 @@ if (root.localName === 'script' || root.localName === 'style') { return; } - for (let node=root.firstChild, parentIndex=0, next; node; node=next) { + walker.currentNode = root; + for (let node=walker.firstChild(), parentIndex=0, next; node; node=next) { // Wrap templates if (node.localName == 'template') { node = wrapTemplateExtension(node); @@ -269,12 +274,13 @@ // text nodes to be inexplicably split =( // note that root.normalize() should work but does not so we do this // manually. - next = node.nextSibling; + walker.currentNode = node; + next = walker.nextSibling(); if (node.nodeType === Node.TEXT_NODE) { let /** Node */ n = next; while (n && (n.nodeType === Node.TEXT_NODE)) { node.textContent += n.textContent; - next = n.nextSibling; + next = walker.nextSibling(); root.removeChild(n); n = next; } @@ -289,7 +295,8 @@ childInfo.infoIndex = templateInfo.nodeInfoList.push(/** @type {!NodeInfo} */(childInfo)) - 1; } // Increment if not removed - if (node.parentNode) { + walker.currentNode = node; + if (walker.parentNode()) { parentIndex++; } }