From 3f5569843921a957e1a57c8e0603ac58d6f4e7c1 Mon Sep 17 00:00:00 2001 From: Jason Miller Date: Tue, 3 Apr 2018 17:00:26 -0400 Subject: [PATCH] Switch to recursive getElementsByTagName implementation. --- config/critters-webpack-plugin.js | 24 ++++++++---------------- 1 file changed, 8 insertions(+), 16 deletions(-) diff --git a/config/critters-webpack-plugin.js b/config/critters-webpack-plugin.js index 50068238..fbfe4f96 100644 --- a/config/critters-webpack-plugin.js +++ b/config/critters-webpack-plugin.js @@ -212,22 +212,14 @@ function defineProperties(obj, properties) { /** {document,Element}.getElementsByTagName() is the only traversal method required by nwmatcher. */ function getElementsByTagName(tagName) { - const stack = [this]; - const matches = []; - const isWildCard = tagName === '*'; - const tagNameUpper = tagName.toUpperCase(); - while (stack.length !== 0) { - const el = stack.pop(); - let child = el.lastChild; - while (child) { - if (child.nodeType === 1) stack.push(child); - child = child.previousSibling; - } - if (isWildCard || (el.tagName != null && (el.tagName === tagNameUpper || el.tagName.toUpperCase() === tagNameUpper))) { - matches.push(el); - } - } - return matches; + // Only return Element/Document nodes + if (this.nodeType!==1 && this.nodeType!==9 || this.type==='directive') return []; + return Array.prototype.concat.apply( + // Add current element if it matches tag + (tagName === '*' || (this.tagName && (this.tagName == tagName || this.nodeName === tagName.toUpperCase()))) ? [this] : [], + // Check children recursively + this.children.map(child => getElementsByTagName.call(child, tagName)) + ); }