From b9e5cce27fcd4734c61cf60f493241e1a78ccb68 Mon Sep 17 00:00:00 2001 From: Steven Orvell Date: Thu, 14 Jan 2016 15:39:00 -0800 Subject: [PATCH] Ensure querySelector always returns `null` when a node is not found. Also optimize querySelector such that the matcher halts on the first result. --- src/lib/dom-api-shady.html | 8 +++++++- src/lib/dom-api.html | 22 +++++++++++++++------- test/unit/polymer-dom.js | 2 +- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/lib/dom-api-shady.html b/src/lib/dom-api-shady.html index 3e4a216e62..46d445ce89 100644 --- a/src/lib/dom-api-shady.html +++ b/src/lib/dom-api-shady.html @@ -352,7 +352,13 @@ // TODO(sorvell): consider doing native QSA and filtering results. querySelector: function(selector) { - return this.querySelectorAll(selector)[0]; + // match selector and halt on first result. + var result = this._query(function(n) { + return DomApi.matchesSelector.call(n, selector); + }, this.node, function(n) { + return Boolean(n); + })[0]; + return result || null; }, querySelectorAll: function(selector) { diff --git a/src/lib/dom-api.html b/src/lib/dom-api.html index caa0ca2b55..8cd9e9e99d 100644 --- a/src/lib/dom-api.html +++ b/src/lib/dom-api.html @@ -139,26 +139,34 @@ // NOTE: `_query` is used primarily for ShadyDOM's querySelector impl, // but it's also generally useful to recurse through the element tree // and is used by Polymer's styling system. - _query: function(matcher, node) { + _query: function(matcher, node, halter) { node = node || this.node; var list = []; - this._queryElements(TreeApi.Logical.getChildNodes(node), matcher, list); + this._queryElements(TreeApi.Logical.getChildNodes(node), matcher, + halter, list); return list; }, - _queryElements: function(elements, matcher, list) { + _queryElements: function(elements, matcher, halter, list) { for (var i=0, l=elements.length, c; (i