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

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

Issue 2201853002: Blink handle selection handle visibility (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: try running even rebaseline tests Created 4 years, 2 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/SelectionController.cpp
diff --git a/third_party/WebKit/Source/core/editing/SelectionController.cpp b/third_party/WebKit/Source/core/editing/SelectionController.cpp
index b6c80b53489d732acb45ea5dec59c1417ab72efc..be6aa2733de162b878087f6c4edde2a10a8b9984 100644
--- a/third_party/WebKit/Source/core/editing/SelectionController.cpp
+++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp
@@ -137,14 +137,15 @@ bool SelectionController::handleMousePressEventSingleClick(
// link or image.
bool extendSelection = isExtendingSelection(event);
+ VisibleSelectionInFlatTree newSelection =
+ selection().visibleSelection<EditingInFlatTreeStrategy>();
+
// Don't restart the selection when the mouse is pressed on an
// existing selection so we can allow for text dragging.
- if (FrameView* view = m_frame->view()) {
- LayoutPoint vPoint = view->rootFrameToContents(event.event().position());
- if (!extendSelection && selection().contains(vPoint)) {
- m_mouseDownWasSingleClickInSelection = true;
+ if (!extendSelection && selection().contains(event.hitTestResult())) {
+ m_mouseDownWasSingleClickInSelection = true;
+ if (!event.event().fromTouch())
return false;
- }
}
VisiblePositionInFlatTree visiblePos =
@@ -154,11 +155,11 @@ bool SelectionController::handleMousePressEventSingleClick(
PositionInFlatTree::firstPositionInOrBeforeNode(innerNode));
PositionInFlatTree pos = visiblePos.deepEquivalent();
- VisibleSelectionInFlatTree newSelection =
- selection().visibleSelection<EditingInFlatTreeStrategy>();
TextGranularity granularity = CharacterGranularity;
- if (extendSelection && !newSelection.isNone()) {
+ if (mouseDownWasSingleClickInSelection() && !newSelection.isHandleVisible()) {
+ newSelection.setIsHandleVisible(true);
+ } else if (extendSelection && !newSelection.isNone()) {
const VisibleSelectionInFlatTree selectionInUserSelectAll(
expandSelectionToRespectUserSelectAll(innerNode,
createVisibleSelection(pos)));
@@ -193,6 +194,14 @@ bool SelectionController::handleMousePressEventSingleClick(
} else if (m_selectionState != SelectionState::ExtendedSelection) {
newSelection = expandSelectionToRespectUserSelectAll(
innerNode, createVisibleSelection(visiblePos));
+ if (newSelection.isContentEditable()) {
+ bool isTextBoxEmpty =
+ VisibleSelection::selectionFromContentsOfNode(innerNode).isCaret();
+ bool notLeftClick = event.event().pointerProperties().button !=
+ WebPointerProperties::Button::Left;
+ if (!isTextBoxEmpty || notLeftClick)
+ newSelection.setIsHandleVisible(event.event().fromTouch());
aelias_OOO_until_Jul13 2016/10/07 02:40:20 Can you add a test that handles are *not* created
amaralp 2016/10/14 00:53:07 Added to EventHandlerTest.cpp
+ }
}
// Updating the selection is considered side-effect of the event and so it
@@ -396,6 +405,7 @@ void SelectionController::selectClosestWordFromHitTestResult(
newSelection.rootEditableElement())
.deepEquivalent())
return;
+ newSelection.setIsHandleVisible(true);
}
if (appendTrailingWhitespace == AppendTrailingWhitespace::ShouldAppend &&
@@ -554,6 +564,9 @@ bool SelectionController::handleMousePressEventTripleClick(
newSelection.expandUsingGranularity(ParagraphGranularity);
}
+ newSelection.setIsHandleVisible(event.event().fromTouch() &&
+ newSelection.isRange());
+
return updateSelectionForMouseDownDispatchingSelectStart(
innerNode, expandSelectionToRespectUserSelectAll(innerNode, newSelection),
ParagraphGranularity);
@@ -720,6 +733,17 @@ bool SelectionController::handleGestureLongPress(
if (!innerNodeIsSelectable)
return false;
+ // If longpress occurs inside of a selection that doesn't have handles
+ // then we want to show the handes on the entire selection.
+ VisibleSelectionInFlatTree newSelection =
+ selection().visibleSelection<EditingInFlatTreeStrategy>();
+ if (selection().contains(hitTestResult) && !newSelection.isHandleVisible()) {
+ newSelection.setIsHandleVisible(true);
+ selection().setNonDirectionalSelectionIfNeeded(newSelection,
+ selection().granularity());
+ return true;
+ }
+
selectClosestWordFromHitTestResult(hitTestResult,
AppendTrailingWhitespace::DontAppend,
SelectInputEventType::Touch);
@@ -753,7 +777,7 @@ void SelectionController::sendContextMenuEvent(
const LayoutPoint& position) {
if (!selection().isAvailable())
return;
- if (selection().contains(position) || mev.scrollbar() ||
+ if (selection().contains(mev.hitTestResult()) || mev.scrollbar() ||
// FIXME: In the editable case, word selection sometimes selects content
// that isn't underneath the mouse.
// If the selection is non-editable, we do word selection to make it
@@ -782,8 +806,7 @@ void SelectionController::passMousePressEventToSubframe(
// greyed out even though we're clicking on the selection. This looks
// really strange (having the whole frame be greyed out), so we deselect the
// selection.
- IntPoint p = m_frame->view()->rootFrameToContents(mev.event().position());
- if (!selection().contains(p))
+ if (!selection().contains(mev.hitTestResult()))
return;
// TODO(xiaochengh): The use of updateStyleAndLayoutIgnorePendingStylesheets

Powered by Google App Engine
This is Rietveld 408576698