| 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 e26e1732d57ef92bb4111b2507ed4856c894f2d5..baefa5f78888ec35caafd0334d0bd4f3a1eb44e5 100644
|
| --- a/third_party/WebKit/Source/core/editing/SelectionController.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp
|
| @@ -287,7 +287,7 @@ bool SelectionController::updateSelectionForMouseDownDispatchingSelectStart(Node
|
| return true;
|
| }
|
|
|
| -void SelectionController::selectClosestWordFromHitTestResult(const HitTestResult& result, AppendTrailingWhitespace appendTrailingWhitespace)
|
| +void SelectionController::selectClosestWordFromHitTestResult(const HitTestResult& result, AppendTrailingWhitespace appendTrailingWhitespace, SelectInputEventType selectInputEventType)
|
| {
|
| Node* innerNode = result.innerNode();
|
| VisibleSelectionInFlatTree newSelection;
|
| @@ -295,20 +295,28 @@ void SelectionController::selectClosestWordFromHitTestResult(const HitTestResult
|
| if (!innerNode || !innerNode->layoutObject())
|
| return;
|
|
|
| - const VisiblePositionInFlatTree& pos = visiblePositionOfHitTestResult(result);
|
| + // Special-case image local offset to always be zero, to avoid triggering
|
| + // LayoutReplaced::positionFromPoint's advancement of the position at the
|
| + // mid-point of the the image (which was intended for mouse-drag selection
|
| + // and isn't desirable for long-press).
|
| + HitTestResult adjustedHitTestResult = result;
|
| + if (selectInputEventType == SelectInputEventType::GestureLongPress && result.image())
|
| + adjustedHitTestResult.setNodeAndPosition(result.innerNode(), LayoutPoint(0, 0));
|
| +
|
| + const VisiblePositionInFlatTree& pos = visiblePositionOfHitTestResult(adjustedHitTestResult);
|
| if (pos.isNotNull()) {
|
| newSelection = VisibleSelectionInFlatTree(pos);
|
| newSelection.expandUsingGranularity(WordGranularity);
|
| }
|
|
|
| -#if OS(ANDROID)
|
| - // If node doesn't have text except space, tab or line break, do not
|
| - // select that 'empty' area.
|
| - EphemeralRangeInFlatTree range = EphemeralRangeInFlatTree(newSelection.start(), newSelection.end());
|
| - const String& str = plainText(range, TextIteratorDefaultBehavior);
|
| - if (str.isEmpty() || str.simplifyWhiteSpace().containsOnlyWhitespace())
|
| - return;
|
| -#endif
|
| + if (selectInputEventType == SelectInputEventType::GestureLongPress) {
|
| + // If node doesn't have text except space, tab or line break, do not
|
| + // select that 'empty' area.
|
| + EphemeralRangeInFlatTree range(newSelection.start(), newSelection.end());
|
| + const String& str = plainText(range, TextIteratorEmitsObjectReplacementCharacter);
|
| + if (str.isEmpty() || str.simplifyWhiteSpace().containsOnlyWhitespace())
|
| + return;
|
| + }
|
|
|
| if (appendTrailingWhitespace == AppendTrailingWhitespace::ShouldAppend && newSelection.isRange())
|
| newSelection.appendTrailingWhitespace();
|
| @@ -349,7 +357,7 @@ void SelectionController::selectClosestWordFromMouseEvent(const MouseEventWithHi
|
|
|
| AppendTrailingWhitespace appendTrailingWhitespace = (result.event().clickCount() == 2 && m_frame->editor().isSelectTrailingWhitespaceEnabled()) ? AppendTrailingWhitespace::ShouldAppend : AppendTrailingWhitespace::DontAppend;
|
|
|
| - return selectClosestWordFromHitTestResult(result.hitTestResult(), appendTrailingWhitespace);
|
| + return selectClosestWordFromHitTestResult(result.hitTestResult(), appendTrailingWhitespace, SelectInputEventType::Mouse);
|
| }
|
|
|
| void SelectionController::selectClosestMisspellingFromMouseEvent(const MouseEventWithHitTestResults& result)
|
| @@ -540,15 +548,11 @@ bool SelectionController::handleGestureLongPress(const PlatformGestureEvent& ges
|
| return false;
|
|
|
| Node* innerNode = hitTestResult.innerNode();
|
| -#if OS(ANDROID)
|
| bool innerNodeIsSelectable = innerNode && (innerNode->isContentEditable() || innerNode->isTextNode() || innerNode->canStartSelection());
|
| -#else
|
| - bool innerNodeIsSelectable = innerNode && (innerNode->isContentEditable() || innerNode->isTextNode());
|
| -#endif
|
| if (!innerNodeIsSelectable)
|
| return false;
|
|
|
| - selectClosestWordFromHitTestResult(hitTestResult, AppendTrailingWhitespace::DontAppend);
|
| + selectClosestWordFromHitTestResult(hitTestResult, AppendTrailingWhitespace::DontAppend, SelectInputEventType::GestureLongPress);
|
| return selection().isRange();
|
| }
|
|
|
|
|