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