<!DOCTYPE html>
<title>CSSOM View - scrollIntoView considers horizontal-tb writing mode</title>
<meta charset="utf-8">
<link rel="author" title="Cathie Chen" href="mailto:cathiechen@igalia.com">
<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-scrollintoview">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<style>
.box {
  float: left;
  width: 200px;
  height: 200px;
}
#scroller {
  overflow: scroll;
  width: 300px;
  height: 300px;
}
#container{
  width: 600px;
  height: 600px;
}
#target {
  background-color: #ff0;
}
</style>
<body>
<div id="scroller">
  <div id="container">
    <!--  ROW-1  -->
    <div class="row">
      <div class="box"></div>
      <div class="box"></div>
      <div class="box"></div>
    </div>

    <!--  ROW-2  -->
    <div class="row">
      <div class="box"></div>
      <div class="box" id="target"></div>
      <div class="box"></div>
    </div>

    <!--  ROW-3  -->
    <div class="row">
      <div class="box"></div>
      <div class="box"></div>
      <div class="box"></div>
    </div>
  </div>
</div>

<script>
// In horizontal-tb mode, X corresponds to the inline axis and is oriented
// rightward. Y corresponds to the block axis and is oriented downward.
// So the beginning edges are the top and left edges and the ending
// edges are the bottom and right edges.

// This assumes that the horizontal scrollbar is on the bottom side and
// the vertical scrollbar is on the right side.

var target = document.getElementById("target");
var scroller = document.getElementById("scroller");
var scrollbar_width = scroller.offsetWidth - scroller.clientWidth;

var scroller_width = scroller.offsetWidth;
var scroller_height = scroller.offsetHeight;
var box_width = target.offsetWidth;
var box_height = target.offsetHeight;

var expectedX = {
    inlineStart: box_width,
    inlineCenter: (3*box_width - scroller_width)/2 + scrollbar_width/2,
    inlineEnd: 2*box_width - scroller_width + scrollbar_width,
  };

var expectedY = {
  blockStart: box_height,
  blockCenter: (3*box_height - scroller_height)/2 + scrollbar_width/2,
  blockEnd: 2*box_height - scroller_height + scrollbar_width,
};

[
  [{block: "start", inline: "start"}, expectedX.inlineStart, expectedY.blockStart],
  [{block: "start", inline: "center"}, expectedX.inlineCenter, expectedY.blockStart],
  [{block: "start", inline: "end"}, expectedX.inlineEnd, expectedY.blockStart],
  [{block: "center", inline: "start"}, expectedX.inlineStart, expectedY.blockCenter],
  [{block: "center", inline: "center"}, expectedX.inlineCenter, expectedY.blockCenter],
  [{block: "center", inline: "end"}, expectedX.inlineEnd, expectedY.blockCenter],
  [{block: "end", inline: "start"}, expectedX.inlineStart, expectedY.blockEnd],
  [{block: "end", inline: "center"}, expectedX.inlineCenter, expectedY.blockEnd],
  [{block: "end", inline: "end"}, expectedX.inlineEnd, expectedY.blockEnd],
].forEach(([input, expectedX, expectedY]) => {
  test(() => {
    scroller.scrollTo(0, 0);
    target.scrollIntoView(input);
    assert_approx_equals(scroller.scrollLeft, expectedX, 0.5, "scrollX");
    assert_approx_equals(scroller.scrollTop, expectedY, 0.5, "scrollY");
  }, `scrollIntoView(${JSON.stringify(input)})`);
})

</script>

</body>
</html>
