// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/editing/ephemeral_range.h" #include "third_party/blink/renderer/core/editing/position_with_affinity.h" #include "third_party/blink/renderer/core/editing/testing/editing_test_base.h" #include "third_party/blink/renderer/core/editing/text_affinity.h" #include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" namespace blink { class HitTestingBidiTest : public EditingTestBase {}; // Helper class to run the same test code with and without LayoutNG class ParameterizedHitTestingBidiTest : public testing::WithParamInterface, private ScopedLayoutNGForTest, public HitTestingBidiTest { public: ParameterizedHitTestingBidiTest() : ScopedLayoutNGForTest(GetParam()) {} protected: bool LayoutNGEnabled() const { return GetParam(); } }; INSTANTIATE_TEST_CASE_P(All, ParameterizedHitTestingBidiTest, testing::Bool()); // This file contains script-generated tests for PositionForPoint() // that are related to bidirectional text. The test cases are only for // behavior recording purposes, and do not necessarily reflect the // correct/desired behavior. TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: |C B A d e f // Bidi: 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: |C B A d e f // Bidi: 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: d e f C B A| // Bidi: 0 0 0 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
defABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
defABC|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: d e f C B A| // Bidi: 0 0 0 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
defABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
defABC|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOfOneRun) { // Visual: |C B A // Bidi: 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOfOneRun) { // Visual: |C B A // Bidi: 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOfOneRun) { // Visual: C B A| // Bidi: 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
ABC|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOfOneRun) { // Visual: C B A| // Bidi: 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
ABC|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: d e f|C B A g h i // Bidi: 0 0 0 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
defABCghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
def|ABCghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: d e f|C B A g h i // Bidi: 0 0 0 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
defABCghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
def|ABCghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: g h i C B A|d e f // Bidi: 0 0 0 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ghiABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
ghiABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: g h i C B A|d e f // Bidi: 0 0 0 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ghiABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
ghiABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOfOneRun) { // Visual: d e f|C B A // Bidi: 0 0 0 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
defABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
def|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOfOneRun) { // Visual: d e f|C B A // Bidi: 0 0 0 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
defABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
def|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOfOneRun) { // Visual: C B A|d e f // Bidi: 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
ABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOfOneRun) { // Visual: C B A|d e f // Bidi: 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent("
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ("
ABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: F E D|a b c I H G // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: F E D|a b c I H G // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: I H G a b c|F E D // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: I H G a b c|F E D // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOfOneRun) { // Visual: F E D|a b c // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOfOneRun) { // Visual: F E D|a b c // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOfOneRun) { // Visual: a b c|F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOfOneRun) { // Visual: a b c|F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: |a b c F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: |a b c F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: F E D a b c| // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: F E D a b c| // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOfOneRun) { // Visual: |a b c // Bidi: 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOfOneRun) { // Visual: |a b c // Bidi: 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOfOneRun) { // Visual: a b c| // Bidi: 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOfOneRun) { // Visual: a b c| // Bidi: 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: d e f|C B A g h i // Bidi: 2 2 2 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: d e f|C B A g h i // Bidi: 2 2 2 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: g h i C B A|d e f // Bidi: 2 2 2 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: g h i C B A|d e f // Bidi: 2 2 2 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOfOneRun) { // Visual: d e f|C B A // Bidi: 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABC
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOfOneRun) { // Visual: d e f|C B A // Bidi: 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABC
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOfOneRun) { // Visual: C B A|d e f // Bidi: 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOfOneRun) { // Visual: C B A|d e f // Bidi: 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: F E D|a b c I H G // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIabc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOfOneRunWithBaseRunEnd) { // Visual: F E D|a b c I H G // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIabc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: I H G a b c|F E D // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abcGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOfOneRunWithBaseRunEnd) { // Visual: I H G a b c|F E D // Bidi: 1 1 1 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abcGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOfOneRun) { // Visual: F E D|a b c // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOfOneRun) { // Visual: F E D|a b c // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOfOneRun) { // Visual: a b c|F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOfOneRun) { // Visual: a b c|F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: |a b c F E D g h i // Bidi: 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abcghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: |a b c F E D g h i // Bidi: 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abcghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: g h i F E D a b c| // Bidi: 0 0 0 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiabc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: g h i F E D a b c| // Bidi: 0 0 0 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiabc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOftwoNestedRuns) { // Visual: |a b c F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOftwoNestedRuns) { // Visual: |a b c F E D // Bidi: 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabc
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOftwoNestedRuns) { // Visual: F E D a b c| // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOftwoNestedRuns) { // Visual: F E D a b c| // Bidi: 1 1 1 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: g h i|a b c F E D j k l // Bidi: 0 0 0 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabcjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|DEFabcjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: g h i|a b c F E D j k l // Bidi: 0 0 0 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabcjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiDEF|abcjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: j k l F E D a b c|g h i // Bidi: 0 0 0 1 1 1 2 2 2 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklabcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklabc|DEFghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: j k l F E D a b c|g h i // Bidi: 0 0 0 1 1 1 2 2 2 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklabcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklabcDEF|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOftwoNestedRuns) { // Visual: g h i|a b c F E D // Bidi: 0 0 0 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabc
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|DEFabc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOftwoNestedRuns) { // Visual: g h i|a b c F E D // Bidi: 0 0 0 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabc
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiDEF|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOftwoNestedRuns) { // Visual: F E D a b c|g h i // Bidi: 1 1 1 2 2 2 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|DEFghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOftwoNestedRuns) { // Visual: F E D a b c|g h i // Bidi: 1 1 1 2 2 2 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abcDEF|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: I H G|C B A d e f L K J // Bidi: 1 1 1 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLABC|defGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: I H G|C B A d e f L K J // Bidi: 1 1 1 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKL|ABCdefGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: L K J d e f C B A|I H G // Bidi: 1 1 1 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABCJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIdefABC|JKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: L K J d e f C B A|I H G // Bidi: 1 1 1 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABCJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIdef|ABCJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOftwoNestedRuns) { // Visual: I H G|C B A d e f // Bidi: 1 1 1 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ABC|defGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOftwoNestedRuns) { // Visual: I H G|C B A d e f // Bidi: 1 1 1 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|ABCdefGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOftwoNestedRuns) { // Visual: d e f C B A|I H G // Bidi: 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIdefABC|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOftwoNestedRuns) { // Visual: d e f C B A|I H G // Bidi: 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABC
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIdef|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: |C B A d e f I H G // Bidi: 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: |C B A d e f I H G // Bidi: 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: I H G d e f C B A| // Bidi: 1 1 1 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
def|ABCGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: I H G d e f C B A| // Bidi: 1 1 1 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
def|ABCGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOftwoNestedRuns) { // Visual: |C B A d e f // Bidi: 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOftwoNestedRuns) { // Visual: |C B A d e f // Bidi: 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOftwoNestedRuns) { // Visual: d e f C B A| // Bidi: 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABC
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
def|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOftwoNestedRuns) { // Visual: d e f C B A| // Bidi: 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABC
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
def|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: g h i|a b c F E D j k l // Bidi: 2 2 2 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabcjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiDEF|abcjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: g h i|a b c F E D j k l // Bidi: 2 2 2 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabcjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiDEFabc|jkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: j k l F E D a b c|g h i // Bidi: 2 2 2 3 3 3 4 4 4 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklabcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkl|abcDEFghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: j k l F E D a b c|g h i // Bidi: 2 2 2 3 3 3 4 4 4 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklabcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklabc|DEFghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOftwoNestedRuns) { // Visual: g h i|a b c F E D // Bidi: 2 2 2 4 4 4 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiDEF|abc
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOftwoNestedRuns) { // Visual: g h i|a b c F E D // Bidi: 2 2 2 4 4 4 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiDEFabc
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiDEFabc|
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOftwoNestedRuns) { // Visual: F E D a b c|g h i // Bidi: 3 3 3 4 4 4 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
|abcDEFghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOftwoNestedRuns) { // Visual: F E D a b c|g h i // Bidi: 3 3 3 4 4 4 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
abcDEFghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
abc|DEFghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: I H G|C B A d e f L K J // Bidi: 1 1 1 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLABCdef|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: I H G|C B A d e f L K J // Bidi: 1 1 1 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLABC|defGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: L K J d e f C B A|I H G // Bidi: 1 1 1 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABCJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIdef|ABCJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOftwoNestedRunsWithBaseRunEnd) { // Visual: L K J d e f C B A|I H G // Bidi: 1 1 1 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABCJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|defABCJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOftwoNestedRuns) { // Visual: I H G|C B A d e f // Bidi: 1 1 1 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ABCdef|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOftwoNestedRuns) { // Visual: I H G|C B A d e f // Bidi: 1 1 1 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ABCdefGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ABC|defGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOftwoNestedRuns) { // Visual: d e f C B A|I H G // Bidi: 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABC
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 57; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIdef|ABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOftwoNestedRuns) { // Visual: d e f C B A|I H G // Bidi: 2 2 2 3 3 3 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIdefABC
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 63; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|defABC
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: |C B A d e f I H G j k l // Bidi: 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|ABCdefjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: |C B A d e f I H G j k l // Bidi: 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|ABCdefjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: j k l I H G d e f C B A| // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkldefABC|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: j k l I H G d e f C B A| // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkldefABC|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOfthreeNestedRuns) { // Visual: |C B A d e f I H G // Bidi: 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOfthreeNestedRuns) { // Visual: |C B A d e f I H G // Bidi: 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOfthreeNestedRuns) { // Visual: I H G d e f C B A| // Bidi: 1 1 1 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOfthreeNestedRuns) { // Visual: I H G d e f C B A| // Bidi: 1 1 1 2 2 2 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: j k l|C B A d e f I H G m n o // Bidi: 0 0 0 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdefmno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkl|GHIABCdefmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: j k l|C B A d e f I H G m n o // Bidi: 0 0 0 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdefmno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklGHI|ABCdefmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: m n o I H G d e f C B A|j k l // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnodefABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnodefABC|GHIjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: m n o I H G d e f C B A|j k l // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnodefABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnodefABCGHI|jkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOfthreeNestedRuns) { // Visual: j k l|C B A d e f I H G // Bidi: 0 0 0 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkl|GHIABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOfthreeNestedRuns) { // Visual: j k l|C B A d e f I H G // Bidi: 0 0 0 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklGHI|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOfthreeNestedRuns) { // Visual: I H G d e f C B A|j k l // Bidi: 1 1 1 2 2 2 3 3 3 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|GHIjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOfthreeNestedRuns) { // Visual: I H G d e f C B A|j k l // Bidi: 1 1 1 2 2 2 3 3 3 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABCGHI|jkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: L K J|a b c F E D g h i O N M // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNODEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNODEFabc|ghiJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: L K J|a b c F E D g h i O N M // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNODEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNODEF|abcghiJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: O N M g h i F E D a b c|L K J // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEFMNO
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLghiabc|DEFMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: O N M g h i F E D a b c|L K J // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEFMNO
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLghi|abcDEFMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOfthreeNestedRuns) { // Visual: L K J|a b c F E D g h i // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|ghiJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOfthreeNestedRuns) { // Visual: L K J|a b c F E D g h i // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEF|abcghiJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOfthreeNestedRuns) { // Visual: g h i F E D a b c|L K J // Bidi: 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLghiabc|DEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOfthreeNestedRuns) { // Visual: g h i F E D a b c|L K J // Bidi: 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLghi|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: |a b c F E D g h i L K J // Bidi: 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLDEFabc|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: |a b c F E D g h i L K J // Bidi: 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLDEFabc|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: L K J g h i F E D a b c| // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|abcDEFJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: L K J g h i F E D a b c| // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|abcDEFJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOfthreeNestedRuns) { // Visual: |a b c F E D g h i // Bidi: 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOfthreeNestedRuns) { // Visual: |a b c F E D g h i // Bidi: 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOfthreeNestedRuns) { // Visual: g h i F E D a b c| // Bidi: 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOfthreeNestedRuns) { // Visual: g h i F E D a b c| // Bidi: 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: j k l|C B A d e f I H G m n o // Bidi: 2 2 2 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdefmno
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklGHI|ABCdefmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: j k l|C B A d e f I H G m n o // Bidi: 2 2 2 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdefmno
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklGHIABC|defmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: m n o I H G d e f C B A|j k l // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnodefABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnodef|ABCGHIjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: m n o I H G d e f C B A|j k l // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnodefABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnodefABC|GHIjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOfthreeNestedRuns) { // Visual: j k l|C B A d e f I H G // Bidi: 2 2 2 5 5 5 4 4 4 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklGHI|ABCdef
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOfthreeNestedRuns) { // Visual: j k l|C B A d e f I H G // Bidi: 2 2 2 5 5 5 4 4 4 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jklGHIABCdef
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jklGHIABC|def
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOfthreeNestedRuns) { // Visual: I H G d e f C B A|j k l // Bidi: 3 3 3 4 4 4 5 5 5 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
def|ABCGHIjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOfthreeNestedRuns) { // Visual: I H G d e f C B A|j k l // Bidi: 3 3 3 4 4 4 5 5 5 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
defABCGHIjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
defABC|GHIjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: L K J|a b c F E D g h i O N M // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNODEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNODEFabcghi|JKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: L K J|a b c F E D g h i O N M // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNODEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNODEFabc|ghiJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: O N M g h i F E D a b c|L K J // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEFMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLghi|abcDEFMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOfthreeNestedRunsWithBaseRunEnd) { // Visual: O N M g h i F E D a b c|L K J // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEFMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKL|ghiabcDEFMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOfthreeNestedRuns) { // Visual: L K J|a b c F E D g h i // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabcghi|JKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOfthreeNestedRuns) { // Visual: L K J|a b c F E D g h i // Bidi: 1 1 1 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
DEFabcghiJKL
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
DEFabc|ghiJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOfthreeNestedRuns) { // Visual: g h i F E D a b c|L K J // Bidi: 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 87; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLghi|abcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOfthreeNestedRuns) { // Visual: g h i F E D a b c|L K J // Bidi: 2 2 2 3 3 3 4 4 4 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLghiabcDEF
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 93; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKL|ghiabcDEF
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: |a b c F E D g h i L K J m n o // Bidi: 4 4 4 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLDEFabcghimno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLDEF|abcghimno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: |a b c F E D g h i L K J m n o // Bidi: 4 4 4 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLDEFabcghimno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLDEF|abcghimno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: m n o L K J g h i F E D a b c| // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoghiabcDEFJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 147; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoghiabc|DEFJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: m n o L K J g h i F E D a b c| // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoghiabcDEFJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 153; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoghiabc|DEFJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfLeftEdgeOffourNestedRuns) { // Visual: |a b c F E D g h i L K J // Bidi: 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLDEF|abcghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfLeftEdgeOffourNestedRuns) { // Visual: |a b c F E D g h i L K J // Bidi: 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
JKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
JKLDEF|abcghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryLeftSideOfRightEdgeOffourNestedRuns) { // Visual: L K J g h i F E D a b c| // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiabc|DEFJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockAtLineBoundaryRightSideOfRightEdgeOffourNestedRuns) { // Visual: L K J g h i F E D a b c| // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKL
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiabc|DEFJKL
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: m n o|a b c F E D g h i L K J p q r // Bidi: 0 0 0 4 4 4 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghipqr
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mno|JKLDEFabcghipqr
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: m n o|a b c F E D g h i L K J p q r // Bidi: 0 0 0 4 4 4 3 3 3 2 2 2 1 1 1 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghipqr
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoJKLDEF|abcghipqr
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: p q r L K J g h i F E D a b c|m n o // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
pqrghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 147; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
pqrghiabc|DEFJKLmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: p q r L K J g h i F E D a b c|m n o // Bidi: 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
pqrghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 153; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
pqrghiabcDEFJKL|mno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfLeftEdgeOffourNestedRuns) { // Visual: m n o|a b c F E D g h i L K J // Bidi: 0 0 0 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mno|JKLDEFabcghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfLeftEdgeOffourNestedRuns) { // Visual: m n o|a b c F E D g h i L K J // Bidi: 0 0 0 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoJKLDEF|abcghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunLeftSideOfRightEdgeOffourNestedRuns) { // Visual: L K J g h i F E D a b c|m n o // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiabc|DEFJKLmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockLtrBaseRunRightSideOfRightEdgeOffourNestedRuns) { // Visual: L K J g h i F E D a b c|m n o // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 0 0 0 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiabcDEFJKL|mno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: O N M|C B A d e f I H G j k l R Q P // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
PQRGHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
PQRGHIABCdef|jklMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: O N M|C B A d e f I H G j k l R Q P // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
PQRGHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
PQRGHI|ABCdefjklMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: R Q P j k l I H G d e f C B A|O N M // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHIPQR
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 147; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOjkldefABC|GHIPQR
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: R Q P j k l I H G d e f C B A|O N M // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHIPQR
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 153; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOjkl|defABCGHIPQR
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfLeftEdgeOffourNestedRuns) { // Visual: O N M|C B A d e f I H G j k l // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIABCdef|jklMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfLeftEdgeOffourNestedRuns) { // Visual: O N M|C B A d e f I H G j k l // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHI|ABCdefjklMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunLeftSideOfRightEdgeOffourNestedRuns) { // Visual: j k l I H G d e f C B A|O N M // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOjkldefABC|GHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InLtrBlockRtlBaseRunRightSideOfRightEdgeOffourNestedRuns) { // Visual: j k l I H G d e f C B A|O N M // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int x = div->OffsetLeft() + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOjkl|defABCGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: |C B A d e f I H G j k l O N M // Bidi: 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOGHIABCdefjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOGHIABC|defjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: |C B A d e f I H G j k l O N M // Bidi: 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOGHIABCdefjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOGHIABC|defjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: O N M j k l I H G d e f C B A| // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jkldefABCGHIMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 147; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkldef|ABCGHIMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P( ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: O N M j k l I H G d e f C B A| // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jkldefABCGHIMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 153; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkldef|ABCGHIMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfLeftEdgeOffourNestedRuns) { // Visual: |C B A d e f I H G j k l // Bidi: 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left - 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIABC|defjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfLeftEdgeOffourNestedRuns) { // Visual: |C B A d e f I H G j k l // Bidi: 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjkl
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 3; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIABC|defjkl
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryLeftSideOfRightEdgeOffourNestedRuns) { // Visual: j k l I H G d e f C B A| // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkldef|ABCGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockAtLineBoundaryRightSideOfRightEdgeOffourNestedRuns) { // Visual: j k l I H G d e f C B A| // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
jkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
jkldef|ABCGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: m n o|a b c F E D g h i L K J p q r // Bidi: 2 2 2 6 6 6 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghipqr
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoJKL|DEFabcghipqr
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: m n o|a b c F E D g h i L K J p q r // Bidi: 2 2 2 6 6 6 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghipqr
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoJKLDEFabc|ghipqr
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: p q r L K J g h i F E D a b c|m n o // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
pqrghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 147; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
pqrghi|abcDEFJKLmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: p q r L K J g h i F E D a b c|m n o // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
pqrghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 153; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
pqrghiabcDEF|JKLmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfLeftEdgeOffourNestedRuns) { // Visual: m n o|a b c F E D g h i L K J // Bidi: 2 2 2 6 6 6 5 5 5 4 4 4 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoJKL|DEFabcghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfLeftEdgeOffourNestedRuns) { // Visual: m n o|a b c F E D g h i L K J // Bidi: 2 2 2 6 6 6 5 5 5 4 4 4 3 3 3 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
mnoJKLDEFabcghi
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
mnoJKLDEFabc|ghi
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunLeftSideOfRightEdgeOffourNestedRuns) { // Visual: L K J g h i F E D a b c|m n o // Bidi: 3 3 3 4 4 4 5 5 5 6 6 6 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghi|abcDEFJKLmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockLtrBaseRunRightSideOfRightEdgeOffourNestedRuns) { // Visual: L K J g h i F E D a b c|m n o // Bidi: 3 3 3 4 4 4 5 5 5 6 6 6 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
ghiabcDEFJKLmno
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
ghiabcDEF|JKLmno
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: O N M|C B A d e f I H G j k l R Q P // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
PQRGHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
PQRGHIABCdefjkl|MNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: O N M|C B A d e f I H G j k l R Q P // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
PQRGHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
PQRGHIABC|defjklMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: R Q P j k l I H G d e f C B A|O N M // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHIPQR
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 147; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOjkldef|ABCGHIPQR
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOffourNestedRunsWithBaseRunEnd) { // Visual: R Q P j k l I H G d e f C B A|O N M // Bidi: 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHIPQR
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 153; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNO|jkldefABCGHIPQR
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfLeftEdgeOffourNestedRuns) { // Visual: O N M|C B A d e f I H G j k l // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 27; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIABCdefjkl|MNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfLeftEdgeOffourNestedRuns) { // Visual: O N M|C B A d e f I H G j k l // Bidi: 1 1 1 5 5 5 4 4 4 3 3 3 2 2 2 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
GHIABCdefjklMNO
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 33; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
GHIABC|defjklMNO
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunLeftSideOfRightEdgeOffourNestedRuns) { // Visual: j k l I H G d e f C B A|O N M // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 117; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNOjkldef|ABCGHI
", GetCaretTextFromBody(result.StartPosition())); } TEST_P(ParameterizedHitTestingBidiTest, InRtlBlockRtlBaseRunRightSideOfRightEdgeOffourNestedRuns) { // Visual: j k l I H G d e f C B A|O N M // Bidi: 2 2 2 3 3 3 4 4 4 5 5 5 1 1 1 LoadAhem(); InsertStyleElement("div {font: 10px/10px Ahem; width: 300px}"); SetBodyContent( "
MNOjkldefABCGHI
"); Element* div = GetDocument().QuerySelector("div"); int text_left = div->OffsetLeft() + 300 - div->textContent().length() * 10; int x = text_left + 123; int y = div->OffsetTop() + 5; const EphemeralRange result(GetDocument().caretRangeFromPoint(x, y)); EXPECT_TRUE(result.IsNotNull()); EXPECT_TRUE(result.IsCollapsed()); EXPECT_EQ( "
MNO|jkldefABCGHI
", GetCaretTextFromBody(result.StartPosition())); } } // namespace blink