Commit b6c82020 authored by Oriol Brufau's avatar Oriol Brufau Committed by Chromium LUCI CQ

[editing] Don't go into UA shadow in Find{For,Back}wardInlineContents

Before this patch, for HTML like "<select></select>foo",

  Element* select = GetDocument().QuerySelector("select");
  TextOffsetMapping::FindForwardInlineContents(
      PositionInFlatTree::BeforeNode(*select)));

would go into the shadow root of the <select>, and return

  TextOffsetMapping::InlineContents(To<LayoutBlockFlow>(
      *select->GetShadowRoot()->firstChild()->GetLayoutObject()));

This patch changes FindForwardInlineContents so that it instead returns

  TextOffsetMapping::InlineContents(
      To<LayoutBlockFlow>(*GetDocument().body()->GetLayoutObject()),
      *select->GetLayoutObject(), *select->GetLayoutObject())

just like it already happens for PositionInFlatTree::AfterNode(*select).

And analogous for FindBackwardInlineContents.

Bug: 1154430

TEST=All/ParameterizedTextOffsetMappingTest.RangeWithSelect1/0
TEST=All/ParameterizedTextOffsetMappingTest.RangeWithSelect1/1
TEST=All/ParameterizedTextOffsetMappingTest.RangeWithSelect2/0
TEST=All/ParameterizedTextOffsetMappingTest.RangeWithSelect2/1

Change-Id: Ib894e8d691f99189fc5f35f1bfa18365f4b59e4d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2566939
Commit-Queue: Yoshifumi Inoue <yosin@chromium.org>
Reviewed-by: default avatarYoshifumi Inoue <yosin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#832658}
parent a268c521
......@@ -290,11 +290,17 @@ TextOffsetMapping::InlineContents TextOffsetMapping::FindBackwardInlineContents(
auto previous_skipping_text_control = [](const Node& node) -> const Node* {
DCHECK(!EnclosingTextControl(&node));
const Node* previous = PreviousNodeSkippingAncestors(node);
if (!previous)
return previous;
const TextControlElement* previous_text_control =
EnclosingTextControl(previous);
if (!previous_text_control)
return previous;
return previous_text_control;
if (previous_text_control)
return previous_text_control;
if (ShadowRoot* root = previous->ContainingShadowRoot()) {
if (root->IsUserAgent())
return root->OwnerShadowHost();
}
return previous;
};
if (const TextControlElement* last_enclosing_text_control =
......@@ -334,6 +340,10 @@ TextOffsetMapping::InlineContents TextOffsetMapping::FindForwardInlineContents(
DCHECK(!EnclosingTextControl(&node));
if (IsTextControl(node))
return FlatTreeTraversal::NextSkippingChildren(node);
if (ShadowRoot* root = node.GetShadowRoot()) {
if (root->IsUserAgent())
return FlatTreeTraversal::NextSkippingChildren(node);
}
return FlatTreeTraversal::Next(node);
};
DCHECK(!EnclosingTextControl(next_node));
......
......@@ -38,8 +38,11 @@ class ParameterizedTextOffsetMappingTest
}
std::string GetRange(const std::string& selection_text) {
const PositionInFlatTree position =
ToPositionInFlatTree(SetSelectionTextToBody(selection_text).Base());
return GetRange(
ToPositionInFlatTree(SetSelectionTextToBody(selection_text).Base()));
}
std::string GetRange(const PositionInFlatTree& position) {
return GetRange(GetInlineContents(position));
}
......@@ -421,13 +424,41 @@ TEST_P(ParameterizedTextOffsetMappingTest, RangeWithNestedPosition) {
}
// http://crbug.com//834623
TEST_P(ParameterizedTextOffsetMappingTest, RangeWithSelect) {
EXPECT_EQ(
TEST_P(ParameterizedTextOffsetMappingTest, RangeWithSelect1) {
SetBodyContent("<select></select>foo");
Element* select = GetDocument().QuerySelector("select");
const auto& expected_outer =
"^<select>"
"<div aria-hidden=\"true\"></div>"
"<slot name=\"user-agent-custom-assign-slot\"></slot>"
"</select>foo|",
GetRange("<select>|</select>foo"));
"</select>foo|";
const auto& expected_inner =
"<select>"
"<div aria-hidden=\"true\">^|</div>"
"<slot name=\"user-agent-custom-assign-slot\"></slot>"
"</select>foo";
EXPECT_EQ(expected_outer, GetRange(PositionInFlatTree::BeforeNode(*select)));
EXPECT_EQ(expected_inner, GetRange(PositionInFlatTree(select, 0)));
EXPECT_EQ(expected_outer, GetRange(PositionInFlatTree::AfterNode(*select)));
}
TEST_P(ParameterizedTextOffsetMappingTest, RangeWithSelect2) {
SetBodyContent("<select>bar</select>foo");
Element* select = GetDocument().QuerySelector("select");
const auto& expected_outer =
"^<select>"
"<div aria-hidden=\"true\"></div>"
"<slot name=\"user-agent-custom-assign-slot\"></slot>"
"</select>foo|";
const auto& expected_inner =
"<select>"
"<div aria-hidden=\"true\">^|</div>"
"<slot name=\"user-agent-custom-assign-slot\"></slot>"
"</select>foo";
EXPECT_EQ(expected_outer, GetRange(PositionInFlatTree::BeforeNode(*select)));
EXPECT_EQ(expected_inner, GetRange(PositionInFlatTree(select, 0)));
EXPECT_EQ(expected_outer, GetRange(PositionInFlatTree(select, 1)));
EXPECT_EQ(expected_outer, GetRange(PositionInFlatTree::AfterNode(*select)));
}
// http://crbug.com//832350
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment