<!DOCTYPE html>
<html>
  <head>
    <title>Test for WebKit bug 78595: CollectingRules and QueryingRules modes of SelectorChecker miss some complex selectors with pseudo elements</title>
    <style type="text/css">
      .parent.secondParent .firstChild:before {
          color: brown;
          content: "brown";
      }

      .topParent.topmost .parent.secondParent .secondChild:before {
          color: cyan;
          content: "cyan";
      }

      .parent.secondParent > .thirdChild:before {
          color: red;
          content: "red";
      }

      .topParent.topmost > .parent.secondParent > .fourthChild:before {
          color: magenta;
          content: "magenta";
      }

      .parent.predecessor + .parent.firstParent:before {
          color: green;
          content: "green";
      }

      .parent.firstParent ~ .secondParent:before {
          color: lime;
          content: "lime";
      }

      .parent.firstParent + .parent.secondParent + .thirdParent:before {
          color: blue;
          content: "blue";
      }

      .parent.predecessor ~ .parent.secondParent ~ .fourthParent:before {
          color: crimson;
          content: "crimson";
      }

      .pass {
          color: green;
      }

      .fail {
          color: red;
      }

    </style>
    <script type="text/javascript">
      if (window.testRunner)
          testRunner.dumpAsText();

      var tests = [
        { 'elementId' : 'firstChild', 'expectedValue' : 'brown' },
        { 'elementId' : 'secondChild', 'expectedValue' : 'cyan' },
        { 'elementId' : 'thirdChild', 'expectedValue' : 'red' },
        { 'elementId' : 'fourthChild', 'expectedValue' : 'magenta' },
        { 'elementId' : 'firstParent', 'expectedValue' : 'green' },
        { 'elementId' : 'secondParent', 'expectedValue' : 'lime' },
        { 'elementId' : 'thirdParent', 'expectedValue' : 'blue' },
        { 'elementId' : 'fourthParent', 'expectedValue' : 'crimson' },
      ];

      function runTests()
      {
        var resultsElement = document.getElementById('results');

        tests.forEach(function(curTest) {
          var msg = document.createElement('div');
          var element = document.querySelector("#" + curTest.elementId);

          var mainMessage;
          var matchedRules;
          if (!element)
              mainMessage = "Element with id #" + curTest.elementId + " not found";
          else {
              matchedRules = window.getMatchedCSSRules(element, "before");
              if (!matchedRules || matchedRules.length !== 1)
                  mainMessage = " Matching rules for #" + curTest.elementId + ":before do not contain a single rule";
          }
          if (mainMessage) {
              msg.innerHTML = "<span class='fail'>FAIL</span>" + mainMessage;
              resultsElement.appendChild(msg);
              return;
          }
          var value = matchedRules[0].style.color;
          mainMessage = " Expected '" + curTest.expectedValue + "' for color in the matched CSS rule for element with id " +
              curTest.elementId + " and pseudo-element :before";
          if (value == curTest.expectedValue)
              msg.innerHTML = "<span class='pass'>PASS</span>" + mainMessage + " and got '" + value + "'";
          else
              msg.innerHTML = "<span class='fail'>FAIL</span>" + mainMessage + " but instead got '" + value + "'";
          resultsElement.appendChild(msg);
        });

        if (window.testRunner)
            testRunner.notifyDone();
      }
    </script>
  </head>
  <body onload="runTests();">
    <h3>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=24021">WebKit bug 78595</a>: CollectingRules and QueryingRules modes of SelectorChecker miss some complex selectors with pseudo elements</h3>
    <br />
    <div class="topParent topmost">
      <div class="parent predecessor"></div>
      <div class="parent firstParent" id="firstParent"></div>
      <div class="parent secondParent" id="secondParent">
        <div class="firstChild" id="firstChild"></div>
        <div class="secondChild" id="secondChild"></div>
        <div class="thirdChild" id="thirdChild"></div>
        <div class="fourthChild" id="fourthChild"></div>
      </div>
      <div class="parent thirdParent" id="thirdParent"></div>
      <div class="parent fourthParent" id="fourthParent"></div>
    </div>
    <br />
    <div id="results"></div>
  </body>
</html>
