Index: third_party/WebKit/Source/core/editing/FrameSelection.cpp |
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp |
index 7ad67e21b4bffa488464c508307e4cbcd7b57954..389c25019fea18a48b7cca0dc5471a83f455001f 100644 |
--- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp |
+++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp |
@@ -167,7 +167,8 @@ void FrameSelection::moveCaretSelection(const IntPoint& point) { |
builder.setIsDirectional(selection().isDirectional()); |
if (position.isNotNull()) |
builder.collapse(position.toPositionWithAffinity()); |
- setSelection(builder.build(), CloseTyping | ClearTypingStyle | UserTriggered); |
+ setSelection(builder.build(), |
+ CloseTyping | ClearTypingStyle | UserTriggered | HandleVisible); |
} |
// TODO(xiaochengh): We should not use reference to return value. |
@@ -228,7 +229,8 @@ static void adjustEndpointsAtBidiBoundary( |
void SelectionController::setNonDirectionalSelectionIfNeeded( |
const VisibleSelectionInFlatTree& passedNewSelection, |
TextGranularity granularity, |
- EndPointsAdjustmentMode endpointsAdjustmentMode) { |
+ EndPointsAdjustmentMode endpointsAdjustmentMode, |
+ HandleVisibility handleVisibility) { |
VisibleSelectionInFlatTree newSelection = passedNewSelection; |
bool isDirectional = shouldAlwaysUseDirectionalSelection(m_frame) || |
newSelection.isDirectional(); |
@@ -266,11 +268,16 @@ void SelectionController::setNonDirectionalSelectionIfNeeded( |
// Adjusting base and extent will make newSelection always directional |
newSelection.setIsDirectional(isDirectional); |
- if (selection().visibleSelection<EditingInFlatTreeStrategy>() == newSelection) |
+ const bool isHandleVisible = handleVisibility == HandleVisibility::Visible; |
+ if (selection().visibleSelection<EditingInFlatTreeStrategy>() == |
+ newSelection && |
+ selection().isHandleVisible() == isHandleVisible) |
return; |
- const FrameSelection::SetSelectionOptions options = |
+ FrameSelection::SetSelectionOptions options = |
FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle; |
+ if (isHandleVisible) |
+ options |= FrameSelection::HandleVisible; |
selection().setSelection(newSelection, options, CursorAlignOnScroll::IfNeeded, |
granularity); |
} |
@@ -289,6 +296,9 @@ void FrameSelection::setSelectionAlgorithm( |
m_granularityStrategy->Clear(); |
bool closeTyping = options & CloseTyping; |
bool shouldClearTypingStyle = options & ClearTypingStyle; |
+ const HandleVisibility handleVisibility = options & HandleVisible |
+ ? HandleVisibility::Visible |
+ : HandleVisibility::NotVisible; |
EUserTriggered userTriggered = selectionOptionsToUserTriggered(options); |
// TODO(editing-dev): We should rename variable |s| to another name to avoid |
@@ -307,7 +317,8 @@ void FrameSelection::setSelectionAlgorithm( |
if (shouldClearTypingStyle) |
clearTypingStyle(); |
- if (m_selectionEditor->visibleSelection<Strategy>() == s) { |
+ if (m_selectionEditor->visibleSelection<Strategy>() == s && |
+ m_handleVisibility == handleVisibility) { |
// Even if selection was not changed, selection offsets may have been |
// changed. |
m_frame->inputMethodController().cancelCompositionIfSelectionIsInvalid(); |
@@ -319,6 +330,7 @@ void FrameSelection::setSelectionAlgorithm( |
visibleSelection<Strategy>(); |
const Position& oldSelectionStart = selection().start(); |
+ m_handleVisibility = handleVisibility; |
m_selectionEditor->setVisibleSelection(s, options); |
m_frameCaret->setCaretRectNeedsUpdate(); |
@@ -806,6 +818,11 @@ void FrameSelection::clear() { |
setSelection(VisibleSelection()); |
} |
+void FrameSelection::clearHandles() { |
+ m_handleVisibility = HandleVisibility::NotVisible; |
+ notifyCompositorForSelectionChange(); |
+} |
+ |
void FrameSelection::documentAttached(Document* document) { |
DCHECK(document); |
DCHECK(!m_document) << "FrameSelection is already attached to " << m_document; |
@@ -853,19 +870,13 @@ void FrameSelection::paintCaret(GraphicsContext& context, |
m_frameCaret->paintCaret(context, paintOffset); |
} |
-bool FrameSelection::contains(const LayoutPoint& point) { |
- if (document().layoutViewItem().isNull()) |
- return false; |
- |
+bool FrameSelection::contains(const HitTestResult& result) { |
// Treat a collapsed selection like no selection. |
const VisibleSelectionInFlatTree& visibleSelection = |
this->visibleSelection<EditingInFlatTreeStrategy>(); |
if (!visibleSelection.isRange()) |
return false; |
- HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); |
- HitTestResult result(request, point); |
- document().layoutViewItem().hitTest(result); |
Node* innerNode = result.innerNode(); |
if (!innerNode || !innerNode->layoutObject()) |
return false; |
@@ -888,6 +899,17 @@ bool FrameSelection::contains(const LayoutPoint& point) { |
return start.compareTo(pos) <= 0 && pos.compareTo(end) <= 0; |
} |
+bool FrameSelection::contains(const LayoutPoint& point) { |
bokan
2016/10/26 16:17:23
Please rename point to pointInContent
amaralp
2017/01/13 23:52:51
Done.
|
+ if (document().layoutViewItem().isNull()) |
+ return false; |
+ |
+ HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); |
+ HitTestResult result(request, point); |
+ document().layoutViewItem().hitTest(result); |
+ |
+ return contains(result); |
+} |
+ |
// Workaround for the fact that it's hard to delete a frame. |
// Call this after doing user-triggered selections to make it easy to delete the |
// frame you entirely selected. Can't do this implicitly as part of every |
@@ -1436,7 +1458,8 @@ void FrameSelection::moveRangeSelectionExtent(const IntPoint& contentsPoint) { |
granularityStrategy()->updateExtent(contentsPoint, m_frame); |
setSelection(newSelection, |
FrameSelection::CloseTyping | FrameSelection::ClearTypingStyle | |
- FrameSelection::DoNotClearStrategy | UserTriggered, |
+ FrameSelection::DoNotClearStrategy | UserTriggered | |
+ FrameSelection::HandleVisible, |
CursorAlignOnScroll::IfNeeded, CharacterGranularity); |
} |
@@ -1457,8 +1480,11 @@ void FrameSelection::moveRangeSelection(const VisiblePosition& basePosition, |
if (newSelection.isNone()) |
return; |
- setSelection(newSelection, CloseTyping | ClearTypingStyle, |
- CursorAlignOnScroll::IfNeeded, granularity); |
+ SetSelectionOptions options = CloseTyping | ClearTypingStyle; |
+ if (isHandleVisible()) |
+ options |= HandleVisible; |
+ setSelection(newSelection, options, CursorAlignOnScroll::IfNeeded, |
+ granularity); |
} |
void FrameSelection::updateIfNeeded() { |