<!DOCTYPE html>
<html>
<head>
  <style>
    /*
     * The list of selectors that are to be tested. The javascript code will
     * fill and clear the style declaration on each rule to demonstrate the
     * result.
     */
    div {}
    span {}
    .foo {}
    #title {}
    :empty {}
    :focus {}
    div:not(.foo) {}
    q:before { content: '\"';}
    q:after { content: '\"';}
    span.bar {}
    .foo.bar {}
    .foo .foo {}
    .bar > .bar {}
    .foo + .bar {}
    .foo ~ .bar {}
    .bar > .foo + .bar {}
    div, .foo {}
    div, span {}
  </style>

  <style>
    body {
      background-color: rgb(255, 255, 255);
      color: #0047ab;
      font-family: Roboto;
      font-size: 30px;
      margin-top:50px;
    }

    markup {
      color: #666;
      font-size: 20px;
    }

    .selected {
      background: #00a882;
    }
  </style>

  <script>
    var SELECTED_COLOR = '#00a882';
    var SELECTED_CLASS = 'selected';
    var SELECTOR_LIST_ID = 'selector-list';
    var FOCUS_ID = 'focus';

    var currentRule = 0;
    var numberOfRules = 0;
    var selectors;
    var cssRules;

    // Calculates the next rule, removes the style on the current rule and
    // sets it on the next rule.
    function moveRuleHighlightBy(delta) {
      if (numberOfRules == 0) {
        return;
      }
      nextRule = (currentRule + delta + numberOfRules) % numberOfRules;
      selectors[currentRule].className = '';
      selectors[nextRule].className = SELECTED_CLASS;
      cssRules[currentRule].style.backgroundColor = '';
      cssRules[nextRule].style.backgroundColor = SELECTED_COLOR;
      currentRule = nextRule;
    }

    window.addEventListener('load', function() {
      document.getElementById(FOCUS_ID).focus();
      selectors = document.getElementById(SELECTOR_LIST_ID).children;
      cssRules = document.styleSheets[0].cssRules;
      numberOfRules = cssRules.length;
      moveRuleHighlightBy(0);
    });

    document.addEventListener('keydown', function(event) {
      if (event.keyCode == 38) {  // Arrow up
        moveRuleHighlightBy(-1);
      } else if (event.keyCode == 40) {  // Arrow down
        moveRuleHighlightBy(1);
      }
    });
  </script>
</head>

<body>
  <my-div style="position:absolute; left: 5%; width: 40%;" id="selector-list">
    <p>div</p>
    <p>span</p>
    <p>.foo</p>
    <p>#title</p>
    <p>:empty</p>
    <p>:focus</p>
    <p>div:not(.foo)</p>
    <p>q:before</p>
    <p>q:after</p>
    <p>span.bar</p>
    <p>.foo.bar</p>
    <p>.foo .foo</p>
    <p>.bar > .bar</p>
    <p>.foo + .bar</p>
    <p>.foo ~ .bar</p>
    <p>.bar > .foo + .bar</p>
    <p>div, .foo</p>
    <p>div, span</p>
  </my-div>

  <my-div style="position:absolute; left: 50%; width: 40%;">
    <div id="title">
    <markup>&lt;div id="title"&gt;</markup>
      Hello, Cobalt!
    <markup>&lt;/div&gt;</markup>
    </div>

    <div>
    <markup>&lt;div&gt;</markup>
      div
    <markup>&lt;/div&gt;</markup>
    </div>

    <div tabIndex="-1" id="focus">
    <markup>&lt;div tabIndex="-1" id="focus"&gt;</markup>
      div that has focus
    <markup>&lt;/div&gt;</markup>
    </div>

    <span>
    <markup>&lt;span&gt;</markup>
      span
    <markup>&lt;/span&gt;</markup>
    </span>

    <div class="foo">
    <markup>&lt;div class="foo"&gt;</markup>
      foo div
    <markup>&lt;/div&gt;</markup>
    </div>

    <span class="foo">
    <markup>&lt;span class="foo"&gt;</markup>
      foo span
    <markup>&lt;/span&gt;</markup>
    </span>

    <div class="bar">
    <markup>&lt;div class="bar"&gt;</markup>
      bar div
    <markup>&lt;/div&gt;</markup>
    </div>

    <span class="bar">
    <markup>&lt;span class="bar"&gt;</markup>
      bar span
    <markup>&lt;/span&gt;</markup>
    </span>

    <div class="foo bar">
    <markup>&lt;div class="foo bar"&gt;</markup>
      foo bar div
    <markup>&lt;/div&gt;</markup>
    </div>

    <q>
    <markup>&lt;q&gt;</markup>
      q
    <markup>&lt;/q&gt;</markup>
    </q>

    <div class="foo">
    <markup>&lt;div class="foo"&gt;</markup>
      outer foo div
      <div class="bar" style="padding-left: 30px;">
      <markup>&lt;div class="bar"&gt;</markup>
        middle bar div
        <div class="foo" style="padding-left: 30px;">
        <markup>&lt;div class="foo"&gt;</markup>
          inner foo div
        <markup>&lt;/div&gt;</markup>
        </div>

        <div class="bar" style="padding-left: 30px;">
        <markup>&lt;div class="bar"&gt;</markup>
          inner bar div
        <markup>&lt;/div&gt;</markup>
        </div>

        <span class="bar" style="padding-left: 30px;">
        <markup>&lt;span class="bar"&gt;</markup>
          inner bar span
        <markup>&lt;/span&gt;</markup>
        </span>
      <p/>
      <markup>&lt;/div&gt;</markup>
      </div>
    <markup>&lt;/div&gt;</markup>
    </div>

    <div style="height: 20px; width: 20px;"><!--comment--></div>
    <markup>&lt;div&gt;&lt;!--The empty div above--&gt;&lt;/div&gt;</markup>

  </my-div>
</body>
</html>
