<html>
<head>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script>

function testLtrCaretPosition(elementId, caretPosition) {
  test(() => {
    assert_own_property(window, 'textInputController');
    e = document.getElementById(elementId);
    e.focus();
    var caretRect = textInputController.firstRectForCharacterRange(0, 0);
    assert_equals(caretRect[0], caretPosition);
  }, `${elementId} ${caretPosition}`);
}

function testRtlCaretPosition(elementId, caretPosition) {
  test(() => {
    assert_own_property(window, 'textInputController');
    e = document.getElementById(elementId);
    e.focus();
    // Asserts the visual location of the text's right edge, whose logical
    // offset differs with the bidi caret affinity flag.
    var caretOffset = internals.runtimeFlags.bidiCaretAffinityEnabled ? 1 : 0;
    var caretRect = textInputController.firstRectForCharacterRange(caretOffset, 0);
    assert_equals(caretRect[0], caretPosition);
  }, `${elementId} ${caretPosition}`);
}

function runTest() {
  test(() => {
    assert_own_property(window, 'textInputController');
    var e = document.getElementById("right-align-div");
    e.focus();
    document.execCommand('selectAll');
    document.execCommand('insertText', false, 'x');
    var caretRect = textInputController.firstRectForCharacterRange(1, 0);
    assert_equals(caretRect[0], 208);
  }, 'right-align-div 208 after typing');

  testRtlCaretPosition("rtl-div", 208);
  testRtlCaretPosition("0-right-padding-rtl-textarea", 206);
  testLtrCaretPosition("ltr-div", 9);
  testLtrCaretPosition("ltr-textarea", 10);
  testLtrCaretPosition("no-wrapping-right-align-div", 208);
  testRtlCaretPosition("no-wrapping-rtl-div", 208);
  testRtlCaretPosition("no-wrapping-0-right-padding-rtl-textarea", 206);
  testLtrCaretPosition("no-wrapping-ltr-div", 9);
  testLtrCaretPosition("no-wrapping-ltr-textarea", 10);
}

</script>
</head>
<body>
<br>
Right aligned div.
<br>
<div CONTENTEDITABLE id="right-align-div" style="text-align: right; width:200px; border: solid thin;"></div> 
<br>
RTL div.
<br>
<div CONTENTEDITABLE id="rtl-div" style="direction: rtl; width:200px; border: solid thin; ">a</div> 
<br>
0px right padding RTL textarea.
<br>
<textarea id="0-right-padding-rtl-textarea" style="direction:rtl; padding: 1px 0px 1px 1px; width:200px">a</textarea>
<br>
LTR div and textarea.
<br>
<div CONTENTEDITABLE id="ltr-div" style="width:200px; border: solid thin; ">a</div> 
<br>
<textarea id="ltr-textarea" style="padding: 1px 0px 1px 1px; width:200px">a</textarea>
<br>
NO WRAPPING
<br>
No wrapping right aligned div.
<br>
<div CONTENTEDITABLE id="no-wrapping-right-align-div" style="white-space:nowrap; text-align: right; width:200px; border: solid thin;"></div> 
<br>
No wrapping RTL div.
<br>
<div CONTENTEDITABLE id="no-wrapping-rtl-div" style="white-space:nowrap; direction: rtl; width:200px; border: solid thin; ">a</div> 
<br>
No wrapping 0px right padding RTL textarea.
<br>
<textarea id="no-wrapping-0-right-padding-rtl-textarea" style="white-space:nowrap; direction:rtl; padding: 1px 0px 1px 1px; width:200px">a</textarea>
<br>
No wrapping LTR div and textarea.
<br>
<div CONTENTEDITABLE id="no-wrapping-ltr-div" style="white-space:nowrap; width:200px; border: solid thin; ">a</div> 
<br>
<textarea id="no-wrapping-ltr-textarea" style="white-space:nowrap; padding: 1px 0px 1px 1px; width:200px">a</textarea>
<br>
<ul id="console"></ul>
</body>
<script> runTest(); </script>
</html>
