<!DOCTYPE html>
<!--
Copyright (c) 2015 The Chromium Authors. All rights reserved.
Use of this source code is governed by a BSD-style license that can be
found in the LICENSE file.
-->
<link rel="import" href="/base/base.html">
<script>

'use strict';

tr.exportTo('tr.b', function() {
  function _iterateElementDeeplyImpl(element, cb, thisArg, includeElement) {
    if (includeElement) {
      if (cb.call(thisArg, element))
        return true;
    }

    if (element.shadowRoot) {
      if (_iterateElementDeeplyImpl(element.shadowRoot, cb, thisArg, false))
        return true;
    }
    for (var i = 0; i < element.children.length; i++) {
      if (_iterateElementDeeplyImpl(element.children[i], cb, thisArg, true))
        return true;
    }
  }
  function iterateElementDeeply(element, cb, thisArg) {
    _iterateElementDeeplyImpl(element, cb, thisArg, false);
  }

  function findDeepElementMatchingPredicate(element, predicate) {
    var foundElement = undefined;
    function matches(element) {
      var match = predicate(element);
      if (!match)
        return false;
      foundElement = element;
      return true;
    }
    iterateElementDeeply(element, matches);
    return foundElement;
  }

  function findDeepElementsMatchingPredicate(element, predicate) {
    var foundElements = [];
    function matches(element) {
      var match = predicate(element);
      if (match) {
        foundElements.push(element);
      }
      return false;
    }
    iterateElementDeeply(element, matches);
    return foundElements;
  }

  function findDeepElementMatching(element, selector) {
    return findDeepElementMatchingPredicate(element, function(element) {
      return element.matches(selector);
    });
  }
  function findDeepElementsMatching(element, selector) {
    return findDeepElementsMatchingPredicate(element, function(element) {
      return element.matches(selector);
    });
  }
  function findDeepElementWithTextContent(element, re) {
    return findDeepElementMatchingPredicate(element, function(element) {
      if (element.children.length !== 0)
        return false;
      return re.test(element.textContent);
    });
  }
  return {
    iterateElementDeeply: iterateElementDeeply,
    findDeepElementMatching: findDeepElementMatching,
    findDeepElementsMatching: findDeepElementsMatching,
    findDeepElementMatchingPredicate: findDeepElementMatchingPredicate,
    findDeepElementsMatchingPredicate: findDeepElementsMatchingPredicate,
    findDeepElementWithTextContent: findDeepElementWithTextContent
  };
});
</script>
