<!DOCTYPE html>
<meta charset="UTF-8">
<title>Selectors-API Test Suite: HTML</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="selectors.js"></script>
<script src="ParentNode-querySelector-All.js"></script>
<style>iframe { visibility: hidden; position: absolute; }</style>

<div id="log">This test requires JavaScript.</div>

<script>
async_test(function() {
  var frame = document.createElement("iframe");
  frame.onload = this.step_func_done(init);
  frame.src = "ParentNode-querySelector-All-content.html#target";
  document.body.appendChild(frame);
});

function init(e) {
  /*
   * This test suite tests Selectors API methods in 4 different contexts:
   * 1. Document node
   * 2. In-document Element node
   * 3. Detached Element node (an element with no parent, not in the document)
   * 4. Document Fragment node
   *
   * For each context, the following tests are run:
   *
   * The interface check tests ensure that each type of node exposes the Selectors API methods
   *
   * The special selector tests verify the result of passing special values for the selector parameter,
   * to ensure that the correct WebIDL processing is performed, such as stringification of null and
   * undefined and missing parameter. The universal selector is also tested here, rather than with the
   * rest of ordinary selectors for practical reasons.
   *
   * The static list verification tests ensure that the node lists returned by the method remain unchanged
   * due to subsequent document modication, and that a new list is generated each time the method is
   * invoked based on the current state of the document.
   *
   * The invalid selector tests ensure that SyntaxError is thrown for invalid forms of selectors
   *
   * The valid selector tests check the result from querying many different types of selectors, with a
   * list of expected elements. This checks that querySelector() always returns the first result from
   * querySelectorAll(), and that all matching elements are correctly returned in tree-order. The tests
   * can be limited by specifying the test types to run, using the testType variable. The constants for this
   * can be found in selectors.js.
   *
   * All the selectors tested for both the valid and invalid selector tests are found in selectors.js.
   * See comments in that file for documentation of the format used.
   *
   * The ParentNode-querySelector-All.js file contains all the common test functions for running each of the aforementioned tests
   */

  var testType = TEST_QSA;
  var docType  = "html"; // Only run tests suitable for HTML

  // Prepare the nodes for testing
  var doc = e.target.contentDocument;                 // Document Node tests

  var element = doc.getElementById("root");   // In-document Element Node tests

  //Setup the namespace tests
  setupSpecialElements(doc, element);

  var outOfScope = element.cloneNode(true);   // Append this to the body before running the in-document
                                               // Element tests, but after running the Document tests. This
                                               // tests that no elements that are not descendants of element
                                               // are selected.

  traverse(outOfScope, function(elem) {        // Annotate each element as being a clone; used for verifying
    elem.setAttribute("data-clone", "");     // that none of these elements ever match.
  });


  var detached = element.cloneNode(true);     // Detached Element Node tests

  var fragment = doc.createDocumentFragment(); // Fragment Node tests
  fragment.appendChild(element.cloneNode(true));

  // Setup Tests
  interfaceCheck("Document", doc);
  interfaceCheck("Detached Element", detached);
  interfaceCheck("Fragment", fragment);
  interfaceCheck("In-document Element", element);

  runSpecialSelectorTests("Document", doc);
  runSpecialSelectorTests("Detached Element", detached);
  runSpecialSelectorTests("Fragment", fragment);
  runSpecialSelectorTests("In-document Element", element);

  verifyStaticList("Document", doc, doc);
  verifyStaticList("Detached Element", doc, detached);
  verifyStaticList("Fragment", doc, fragment);
  verifyStaticList("In-document Element", doc, element);

  runInvalidSelectorTest("Document", doc, invalidSelectors);
  runInvalidSelectorTest("Detached Element", detached, invalidSelectors);
  runInvalidSelectorTest("Fragment", fragment, invalidSelectors);
  runInvalidSelectorTest("In-document Element", element, invalidSelectors);

  runValidSelectorTest("Document", doc, validSelectors, testType, docType);
  runValidSelectorTest("Detached Element", detached, validSelectors, testType, docType);
  runValidSelectorTest("Fragment", fragment, validSelectors, testType, docType);

  doc.body.appendChild(outOfScope); // Append before in-document Element tests.
                                    // None of these elements should match
  runValidSelectorTest("In-document Element", element, validSelectors, testType, docType);
}
</script>
