<!DOCTYPE html>
<link rel="help" href="https://drafts.csswg.org/cssom-view-1/#dom-element-getclientrects">
<link rel="author" title="Koji Ishii" href="mailto:kojii@chromium.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
  <div>
    <span>test</span>
    <span id="vertical-align-sub-as-grand-child"
          title="sub element in a child inline box should not be included">
      <span>
        <sub class="not-include" style="vertical-align: sub">subscript</sub>
      </span>
    </span>
    <span>test</span>
  </div>
<script>
testTargetDoesNotInclude('vertical-align-sub-as-grand-child');

function testTargetDoesNotInclude(target) {
  target = document.getElementById(target);
  test(() => {
    let target_rects = target.getClientRects();

    let not_include_rects = [];
    for (let element of target.querySelectorAll('.not-include')) {
      for (let rect of element.getClientRects())
        not_include_rects.push(rect);
    }
    for (let rect of target_rects) {
      for (let not_include_rect of not_include_rects) {
        assert_rect_not_equals(rect, not_include_rect);
      }
    }
  }, target.title);
}

function assert_rect_not_equals(rect1, rect2) {
  assert_false(rectEquals(rect1, rect2),
               `${rectToString(rect1)} and ${rectToString(rect2)} are not equal`);
}

function rectEquals(rect1, rect2) {
  return rect1.x === rect2.x && rect1.y === rect2.y &&
         rect1.width === rect2.width && rect1.height === rect2.height;
}

function rectToString(rect) {
  return `{${rect.x}, ${rect.y} ${rect.width}x${rect.height}}`;
}
</script>
</body>
