Add more test cases of left/right caret movements into inline blocks

This patch adds some more test cases where left/right visual caret
movement moves into an inline block. This is a preparation for
implementing the behavior in BidiCaretAffinity.

Bug: 894651
Change-Id: Ice1fa7a4f27bf7e394627fe5d509369a56a6f71a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1519127
Reviewed-by: Emil A Eklund <eae@chromium.org>
Commit-Queue: Xiaocheng Hu <xiaochengh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#640421}
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 13afba7..a166778 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -1786,6 +1786,9 @@
 crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_forward_line_br.html [ Failure ]
 crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_forward_line_range.html [ Failure ]
 crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_forward_line_small_line.html [ Failure ]
+crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_into_inline_block_multiline.html [ Failure ]
+crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_into_inline_block_nested.html [ Failure ]
+crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_into_inline_block_one_line.html [ Failure ]
 crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_left_character_23_ltr.html [ Failure ]
 crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_left_character_23_rtl.html [ Failure ]
 crbug.com/894651 virtual/bidi-caret-affinity/editing/selection/modify_move/move_left_character_24_ltr.html [ Failure ]
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_multiline.html b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_multiline.html
new file mode 100644
index 0000000..585ce4f
--- /dev/null
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_multiline.html
@@ -0,0 +1,109 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script src="../../assert_selection.js"></script>
+<script>
+// Variations:
+// 1. Entering the inline block from left or right side
+// 2. Resolved direction of the inline block in the parent context
+// 3. Direction of the first line text inside the inline block
+// 4. Direction of the last line text inside the inline block
+
+const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
+
+selection_test(
+  '<div contenteditable>foo|<span style="display:inline-block">bar<br>qux</span>baz</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">b|ar<br>qux</span>baz</div>',
+  'Move right, LTR resolved direction, LTR/LTR text inside');
+
+selection_test(
+  '<div contenteditable>foo<span style="display:inline-block">bar<br>qux</span>|baz</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">bar<br>qu|x</span>baz</div>',
+  'Move left, LTR resolved direction, LTR/LTR text inside');
+
+selection_test(
+  '<div contenteditable>foo|<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qux</span>baz</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>qux</span>baz</div>',
+  'Move right, LTR resolved direction, RTL/LTR text inside');
+
+selection_test(
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qux</span>|baz</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qu|x</span>baz</div>',
+  'Move left, LTR resolved direction, RTL/LTR text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">bar<br>qux</span>\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar<br>qux</span>\u05D6\u05D7\u05D8</div>',
+  'Move left, RTL resolved direction, LTR/LTR text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>qux</span>|\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>q|ux</span>\u05D6\u05D7\u05D8</div>',
+  'Move right, RTL resolved direction, LTR/LTR text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qux</span>\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>qux</span>\u05D6\u05D7\u05D8</div>',
+  'Move left, RTL resolved direction, RTL/LTR text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2<br>qux</span>|\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2<br>q|ux</span>\u05D6\u05D7\u05D8</div>',
+  'Move right, RTL resolved direction, RTL/LTR text inside');
+
+selection_test(
+  '<div contenteditable>foo|<span style="display:inline-block">bar<br>\u05D9\u05DA\u05DB</span>baz</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">b|ar<br>\u05D9\u05DA\u05DB</span>baz</div>',
+  'Move right, LTR resolved direction, LTR/RTL text inside');
+
+selection_test(
+  '<div contenteditable>foo<span style="display:inline-block">bar<br>\u05D9\u05DA\u05DB</span>|baz</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">bar<br>\u05D9|\u05DA\u05DB</span>baz</div>',
+  'Move left, LTR resolved direction, LTR/RTL text inside');
+
+selection_test(
+  '<div contenteditable>foo|<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>baz</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>baz</div>',
+  'Move right, LTR resolved direction, RTL/RTL text inside');
+
+selection_test(
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>|baz</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9|\u05DA\u05DB</span>baz</div>',
+  'Move left, LTR resolved direction, RTL/RTL text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">bar<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>',
+  'Move left, RTL resolved direction, LTR/RTL text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>\u05D9\u05DA\u05DB</span>|\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar<br>\u05D9\u05DA|\u05DB</span>\u05D6\u05D7\u05D8</div>',
+  'Move right, RTL resolved direction, LTR/RTL text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0|\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>\u05D6\u05D7\u05D8</div>',
+  'Move left, RTL resolved direction, RTL/RTL text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA\u05DB</span>|\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2<br>\u05D9\u05DA|\u05DB</span>\u05D6\u05D7\u05D8</div>',
+  'Move right, RTL resolved direction, RTL/RTL text inside');
+</script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_nested.html b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_nested.html
new file mode 100644
index 0000000..36741be
--- /dev/null
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_nested.html
@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script src="../../assert_selection.js"></script>
+<script>
+selection_test(
+  [
+    '<div contenteditable>foo|',
+    '<span style="display:inline-block">',
+    '<div>bar</div><div>baz</div>',
+    '</span>qux</div>'
+  ].join(''),
+  selection => selection.modify('move', 'right', 'character'),
+  [
+    '<div contenteditable>foo',
+    '<span style="display:inline-block">',
+    '<div>|bar</div><div>baz</div>',
+    '</span>qux</div>'
+  ].join(''),
+  'Move right into inline block with child blocks');
+
+selection_test(
+  [
+    '<div contenteditable>foo',
+    '<span style="display:inline-block">',
+    '<div>bar</div><div>baz</div>',
+    '</span>|qux</div>'
+  ].join(''),
+  selection => selection.modify('move', 'left', 'character'),
+  [
+    '<div contenteditable>foo',
+    '<span style="display:inline-block">',
+    '<div>bar</div><div>baz|</div>',
+    '</span>qux</div>'
+  ].join(''),
+  'Move left into inline block with child blocks');
+
+selection_test(
+  [
+    '<div contenteditable>foo|',
+    '<table style="display:inline"><tbody>',
+    '<tr><td>bar</td></tr><tr><td>baz</td></tr>',
+    '</tbody></table>qux</div>'
+  ].join(''),
+  selection => selection.modify('move', 'right', 'character'),
+  [
+    '<div contenteditable>foo',
+    '<table style="display:inline"><tbody>',
+    '<tr><td>|bar</td></tr><tr><td>baz</td></tr>',
+    '</tbody></table>qux</div>'
+  ].join(''),
+  'Move right into inline table');
+
+selection_test(
+  [
+    '<div contenteditable>foo',
+    '<table style="display:inline"><tbody>',
+    '<tr><td>bar</td></tr><tr><td>baz</td></tr>',
+    '</tbody></table>|qux</div>'
+  ].join(''),
+  selection => selection.modify('move', 'left', 'character'),
+  [
+    '<div contenteditable>foo',
+    '<table style="display:inline"><tbody>',
+    '<tr><td>bar</td></tr><tr><td>baz|</td></tr>',
+    '</tbody></table>qux</div>'
+  ].join(''),
+  'Move left into inline table');
+
+selection_test(
+  [
+    '<div contenteditable>foo|',
+    '<div style="display:inline-flex">',
+    '<div>bar</div><div>baz</div>',
+    '</div>qux</div>'
+  ].join(''),
+  selection => selection.modify('move', 'right', 'character'),
+  [
+    '<div contenteditable>foo',
+    '<div style="display:inline-flex">',
+    '<div>|bar</div><div>baz</div>',
+    '</div>qux</div>'
+  ].join(''),
+  'Move right into inline flex');
+
+selection_test(
+  [
+    '<div contenteditable>foo',
+    '<div style="display:inline-flex">',
+    '<div>bar</div><div>baz</div>',
+    '</div>|qux</div>'
+  ].join(''),
+  selection => selection.modify('move', 'left', 'character'),
+  [
+    '<div contenteditable>foo',
+    '<div style="display:inline-flex">',
+    '<div>bar</div><div>baz|</div>',
+    '</div>qux</div>'
+  ].join(''),
+  'Move left into inline flex');
+</script>
diff --git a/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_one_line.html b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_one_line.html
new file mode 100644
index 0000000..de16a97
--- /dev/null
+++ b/third_party/blink/web_tests/editing/selection/modify_move/move_into_inline_block_one_line.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<script src="../../../resources/testharness.js"></script>
+<script src="../../../resources/testharnessreport.js"></script>
+<script src="../../assert_selection.js"></script>
+<script>
+// Variations:
+// 1. Entering the inline block from left or right side
+// 2. Resolved direction of the inline block in the parent context
+// 3. Direction of text inside the inline block
+
+const usesBidiAffinity = window.internals && internals.runtimeFlags.bidiCaretAffinityEnabled;
+
+selection_test(
+  '<div contenteditable>foo|<span style="display:inline-block">bar</span>baz</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">b|ar</span>baz</div>',
+  'Move right, LTR resolved direction, LTR text inside');
+
+selection_test(
+  '<div contenteditable>foo<span style="display:inline-block">bar</span>|baz</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">ba|r</span>baz</div>',
+  'Move left, LTR resolved direction, LTR text inside');
+
+selection_test(
+  '<div contenteditable>foo|<span style="display:inline-block">\u05D0\u05D1\u05D2</span>baz</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2</span>baz</div>',
+  'Move right, LTR resolved direction, RTL text inside');
+
+selection_test(
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0\u05D1\u05D2</span>|baz</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable>foo<span style="display:inline-block">\u05D0|\u05D1\u05D2</span>baz</div>',
+  'Move left, LTR resolved direction, RTL text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">bar</span>\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar</span>\u05D6\u05D7\u05D8</div>',
+  'Move left, RTL resolved direction, LTR text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">bar</span>|\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">b|ar</span>\u05D6\u05D7\u05D8</div>',
+  'Move right, RTL resolved direction, LTR text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5|<span style="display:inline-block">\u05D0\u05D1\u05D2</span>\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'left', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0|\u05D1\u05D2</span>\u05D6\u05D7\u05D8</div>',
+  'Move left, RTL resolved direction, RTL text inside');
+
+selection_test(
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1\u05D2</span>|\u05D6\u05D7\u05D8</div>',
+  selection => selection.modify('move', 'right', 'character'),
+  '<div contenteditable dir="rtl">\u05D3\u05D4\u05D5<span style="display:inline-block">\u05D0\u05D1|\u05D2</span>\u05D6\u05D7\u05D8</div>',
+  'Move right, RTL resolved direction, RTL text inside');
+</script>