Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1120)

Unified Diff: third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp

Issue 2841093002: Algorithm for deciding if a frame's selection should be hidden (Closed)
Patch Set: More robust logic (no need to modify LayoutTests?) and new C++ unit tests Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
diff --git a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
index ac920de651555b0554d9aaf68e52e5aadec8cbe6..8d536f1db546c3f34de12220991a8eb8e81441cd 100644
--- a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
+++ b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
@@ -328,4 +328,176 @@ TEST_F(FrameSelectionTest, SetSelectedRangePreservesHandle) {
"selectSetSelectedRange they should be present after it.";
}
+TEST_F(FrameSelectionTest, CaretInFocusedShadowTree) {
+ SetBodyContent("<input id='field'>"); // <input> hosts a shadow tree.
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const field = GetDocument().GetElementById("field");
+ field->focus();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+ EXPECT_FALSE(Selection().IsHidden());
+
+ field->blur(); // Move focus to document body.
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+ EXPECT_TRUE(Selection().IsHidden()); // Caret is now hidden.
+}
+
+TEST_F(FrameSelectionTest, CaretInFocusedEditableDiv) {
+ SetBodyContent("<div contenteditable id='ce'>blabla</div>");
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const ce = GetDocument().GetElementById("ce");
+ ce->focus();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+ EXPECT_FALSE(Selection().IsHidden());
+
+ ce->blur(); // Move focus to document body.
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+ EXPECT_TRUE(Selection().IsHidden()); // Caret is now hidden.
+}
+
+TEST_F(FrameSelectionTest, SelectionInFocusedEditableDiv) {
+ SetBodyContent("<div contenteditable id='ce'>blabla</div>");
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const ce = GetDocument().GetElementById("ce");
+ ce->focus();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+ EXPECT_FALSE(Selection().IsHidden());
+
+ Selection().SelectAll();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+ EXPECT_FALSE(Selection().IsHidden());
+
+ ce->blur(); // Move focus to document body.
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+ EXPECT_FALSE(Selection().IsHidden()); // Range is still visible.
+}
+
+// crbug.com/692898
+TEST_F(FrameSelectionTest, FocusingLinkHidesCaretInTextControl) {
+ SetBodyContent("<input id='field'><a href='www' id='alink'>link</a>");
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const field = GetDocument().GetElementById("field");
+ field->focus();
+ EXPECT_FALSE(Selection().IsHidden());
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+
+ Element* const alink = GetDocument().GetElementById("alink");
+ alink->focus();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+ EXPECT_TRUE(Selection().IsHidden());
+}
+
+// crbug.com/692898
+TEST_F(FrameSelectionTest, FocusingLinkHidesSelectionInTextControl) {
+ SetBodyContent("<input id='field'><a href='www' id='alink'>link</a>");
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const field = GetDocument().GetElementById("field");
+ field->focus();
+ EXPECT_FALSE(Selection().IsHidden());
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+
+ Selection().SelectAll();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+ EXPECT_FALSE(Selection().IsHidden());
+
+ Element* const alink = GetDocument().GetElementById("alink");
+ alink->focus();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+ EXPECT_TRUE(Selection().IsHidden());
+}
+
+// crbug.com/713051
+TEST_F(FrameSelectionTest, FocusedNonEditableParent) {
+ SetBodyContent("<div tabindex='-1' id='parent'><input id='field'></div>");
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const field = GetDocument().GetElementById("field");
+ field->focus();
+ EXPECT_FALSE(Selection().IsHidden());
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+
+ // Here the selection belongs to <input>'s shadow tree and that tree has a
+ // non-editable parent that is is focused.
+ Element* const parent = GetDocument().GetElementById("parent");
+ parent->focus();
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsCaret());
+ EXPECT_TRUE(Selection().IsHidden()); // Focus is outside editing boundary.
+}
+
+// crbug.com/707143
+TEST_F(FrameSelectionTest, RangeContainsFocus) {
+ SetBodyContent(
+ "<div id='outer'>"
+ " <div>"
+ " <span id='start'>start</span>"
+ " </div>"
+ " <a href='www' id='alink'>link</a>"
+ " <div>line 1</div>"
+ " <div id='middle'>line 2</div>"
+ " <div>line 3</div>"
+ " <div>line 4</div>"
+ " <span id='end'>end</span>"
+ " <div></div>"
+ "</div>");
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const start = GetDocument().GetElementById("start");
+ Element* const end = GetDocument().GetElementById("end");
+ Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(start, 0), Position(end, 0))
+ .Build());
+ EXPECT_FALSE(Selection().IsHidden());
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+
+ Element* const alink = GetDocument().GetElementById("alink");
+ alink->focus();
+ EXPECT_FALSE(Selection().IsHidden()); // Range still visible.
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+}
+
+// crbug.com/707143
+TEST_F(FrameSelectionTest, RangeOutsideFocus) {
+ SetBodyContent(
+ "<a href='www' id='alink'>link</a>"
+ "<div id='outer'>"
+ " <div>"
+ " <span id='start'>start</span>"
+ " </div>"
+ " <div>line 1</div>"
+ " <div id='middle'>line 2</div>"
+ " <div>line 3</div>"
+ " <div>line 4</div>"
+ " <span id='end'>end</span>"
+ " <div></div>"
+ "</div>");
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsNone());
+ EXPECT_TRUE(Selection().IsHidden());
+
+ Element* const start = GetDocument().GetElementById("start");
+ Element* const end = GetDocument().GetElementById("end");
+ Selection().SetSelection(
+ SelectionInDOMTree::Builder()
+ .SetBaseAndExtent(Position(start, 0), Position(end, 0))
+ .Build());
+ EXPECT_FALSE(Selection().IsHidden());
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+
+ Element* const alink = GetDocument().GetElementById("alink");
+ alink->focus();
+ EXPECT_FALSE(Selection().IsHidden()); // Range still visible.
+ EXPECT_TRUE(Selection().GetSelectionInDOMTree().IsRange());
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698