old_contents: // Copyright 2013 The Polymer Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  (function(scope) {
    'use strict';
  
    function findOne(node, selector) {
      var m, el = node.firstElementChild;
      while (el) {
        if (el.matches(selector))
          return el;
        m = findOne(el, selector);
        if (m)
          return m;
        el = el.nextElementSibling;
      }
      return null;
    }
  
    function findAll(node, selector, results) {
      var el = node.firstElementChild;
      while (el) {
        if (el.matches(selector))
          results[results.length++] = el;
        findAll(el, selector, results);
        el = el.nextElementSibling;
      }
      return results;
    }
  
    // find and findAll will only match Simple Selectors,
    // Structural Pseudo Classes are not guarenteed to be correct
    // http://www.w3.org/TR/css3-selectors/#simple-selectors
  
    var SelectorsInterface = {
      querySelector: function(selector) {
        return findOne(this, selector);
      },
      querySelectorAll: function(selector) {
        return findAll(this, selector, new NodeList())
      }
    };
  
    var GetElementsByInterface = {
      getElementsByTagName: function(tagName) {
        // TODO(arv): Check tagName?
        return this.querySelectorAll(tagName);
      },
      getElementsByClassName: function(className) {
        // TODO(arv): Check className?
        return this.querySelectorAll('.' + className);
      },
      getElementsByTagNameNS: function(ns, tagName) {
        if (ns === '*')
          return this.getElementsByTagName(tagName);
  
        // TODO(arv): Check tagName?
        var result = new NodeList;
        var els = this.getElementsByTagName(tagName);
        for (var i = 0, j = 0; i < els.length; i++) {
          if (els[i].namespaceURI === ns)
            result[j++] = els[i];
        }
        result.length = j;
        return result;
      }
    };
  
    scope.GetElementsByInterface = GetElementsByInterface;
    scope.SelectorsInterface = SelectorsInterface;
  
  })(window.ShadowDOMPolyfill);
  
new_contents: // Copyright 2013 The Polymer Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style
  // license that can be found in the LICENSE file.
  
  (function(scope) {
    'use strict';
  
    var NodeList = scope.wrappers.NodeList;
  
    function findOne(node, selector) {
      var m, el = node.firstElementChild;
      while (el) {
        if (el.matches(selector))
          return el;
        m = findOne(el, selector);
        if (m)
          return m;
        el = el.nextElementSibling;
      }
      return null;
    }
  
    function findAll(node, selector, results) {
      var el = node.firstElementChild;
      while (el) {
        if (el.matches(selector))
          results[results.length++] = el;
        findAll(el, selector, results);
        el = el.nextElementSibling;
      }
      return results;
    }
  
    // find and findAll will only match Simple Selectors,
    // Structural Pseudo Classes are not guarenteed to be correct
    // http://www.w3.org/TR/css3-selectors/#simple-selectors
  
    var SelectorsInterface = {
      querySelector: function(selector) {
        return findOne(this, selector);
      },
      querySelectorAll: function(selector) {
        return findAll(this, selector, new NodeList())
      }
    };
  
    var GetElementsByInterface = {
      getElementsByTagName: function(tagName) {
        // TODO(arv): Check tagName?
        return this.querySelectorAll(tagName);
      },
      getElementsByClassName: function(className) {
        // TODO(arv): Check className?
        return this.querySelectorAll('.' + className);
      },
      getElementsByTagNameNS: function(ns, tagName) {
        if (ns === '*')
          return this.getElementsByTagName(tagName);
  
        // TODO(arv): Check tagName?
        var result = new NodeList;
        var els = this.getElementsByTagName(tagName);
        for (var i = 0, j = 0; i < els.length; i++) {
          if (els[i].namespaceURI === ns)
            result[j++] = els[i];
        }
        result.length = j;
        return result;
      }
    };
  
    scope.GetElementsByInterface = GetElementsByInterface;
    scope.SelectorsInterface = SelectorsInterface;
  
  })(window.ShadowDOMPolyfill);
  
subject: Make sure we use the wrapper NodeList in querySelector.js