| 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 60618f6a7d5545e4ffe61a56f588c693ac941611..3a87870bd3d9a309b4ee7b6e6b9e6033aec11490 100644
|
| --- a/third_party/WebKit/Source/core/editing/SelectionController.cpp
|
| +++ b/third_party/WebKit/Source/core/editing/SelectionController.cpp
|
| @@ -35,6 +35,7 @@
|
| #include "core/editing/Editor.h"
|
| #include "core/editing/FrameSelection.h"
|
| #include "core/editing/RenderedPosition.h"
|
| +#include "core/editing/VisibleSelection.h"
|
| #include "core/editing/iterators/TextIterator.h"
|
| #include "core/editing/markers/DocumentMarkerController.h"
|
| #include "core/events/Event.h"
|
| @@ -78,11 +79,11 @@ DispatchEventResult DispatchSelectStart(Node* node) {
|
| Event::CreateCancelableBubble(EventTypeNames::selectstart));
|
| }
|
|
|
| -VisibleSelectionInFlatTree ExpandSelectionToRespectUserSelectAll(
|
| +SelectionInFlatTree ExpandSelectionToRespectUserSelectAll(
|
| Node* target_node,
|
| const VisibleSelectionInFlatTree& selection) {
|
| if (selection.IsNone())
|
| - return selection;
|
| + return SelectionInFlatTree();
|
| Node* const root_user_select_all =
|
| EditingInFlatTreeStrategy::RootUserSelectAllForNode(target_node);
|
| if (!root_user_select_all) {
|
| @@ -92,18 +93,17 @@ VisibleSelectionInFlatTree ExpandSelectionToRespectUserSelectAll(
|
| else
|
| builder.SetBaseAndExtent(selection.End(), selection.Start());
|
| builder.SetAffinity(selection.Affinity());
|
| - return CreateVisibleSelection(builder.Build());
|
| + return builder.Build();
|
| }
|
|
|
| - return CreateVisibleSelection(
|
| - SelectionInFlatTree::Builder(selection.AsSelection())
|
| - .Collapse(MostBackwardCaretPosition(
|
| - PositionInFlatTree::BeforeNode(*root_user_select_all),
|
| - kCanCrossEditingBoundary))
|
| - .Extend(MostForwardCaretPosition(
|
| - PositionInFlatTree::AfterNode(*root_user_select_all),
|
| - kCanCrossEditingBoundary))
|
| - .Build());
|
| + return SelectionInFlatTree::Builder(selection.AsSelection())
|
| + .Collapse(MostBackwardCaretPosition(
|
| + PositionInFlatTree::BeforeNode(*root_user_select_all),
|
| + kCanCrossEditingBoundary))
|
| + .Extend(MostForwardCaretPosition(
|
| + PositionInFlatTree::AfterNode(*root_user_select_all),
|
| + kCanCrossEditingBoundary))
|
| + .Build();
|
| }
|
|
|
| static int TextDistance(const PositionInFlatTree& start,
|
| @@ -149,12 +149,12 @@ static PositionInFlatTree AdjustPositionRespectUserSelectAll(
|
| const PositionInFlatTree& selection_end,
|
| const PositionInFlatTree& position) {
|
| const VisibleSelectionInFlatTree& selection_in_user_select_all =
|
| - ExpandSelectionToRespectUserSelectAll(
|
| - inner_node,
|
| - position.IsNull()
|
| - ? VisibleSelectionInFlatTree()
|
| - : CreateVisibleSelection(
|
| - SelectionInFlatTree::Builder().Collapse(position).Build()));
|
| + CreateVisibleSelection(ExpandSelectionToRespectUserSelectAll(
|
| + inner_node, position.IsNull() ? VisibleSelectionInFlatTree()
|
| + : CreateVisibleSelection(
|
| + SelectionInFlatTree::Builder()
|
| + .Collapse(position)
|
| + .Build())));
|
| if (!selection_in_user_select_all.IsRange())
|
| return position;
|
| if (selection_in_user_select_all.Start().CompareTo(selection_start) < 0)
|
| @@ -204,7 +204,7 @@ bool SelectionController::HandleSingleClick(
|
| if (!this->Selection().IsHandleVisible()) {
|
| const bool did_select =
|
| UpdateSelectionForMouseDownDispatchingSelectStart(
|
| - inner_node, selection, kCharacterGranularity,
|
| + inner_node, selection.AsSelection(), kCharacterGranularity,
|
| HandleVisibility::kVisible);
|
| if (did_select) {
|
| frame_->GetEventHandler().ShowNonLocatedContextMenu(nullptr,
|
| @@ -246,21 +246,21 @@ bool SelectionController::HandleSingleClick(
|
| }
|
|
|
| UpdateSelectionForMouseDownDispatchingSelectStart(
|
| - inner_node, CreateVisibleSelection(builder.Build()),
|
| - this->Selection().Granularity(), HandleVisibility::kNotVisible);
|
| + inner_node, builder.Build(), this->Selection().Granularity(),
|
| + HandleVisibility::kNotVisible);
|
| return false;
|
| }
|
|
|
| if (selection_state_ == SelectionState::kExtendedSelection) {
|
| UpdateSelectionForMouseDownDispatchingSelectStart(
|
| - inner_node, selection, kCharacterGranularity,
|
| + inner_node, selection.AsSelection(), kCharacterGranularity,
|
| HandleVisibility::kNotVisible);
|
| return false;
|
| }
|
|
|
| if (visible_pos.IsNull()) {
|
| UpdateSelectionForMouseDownDispatchingSelectStart(
|
| - inner_node, VisibleSelectionInFlatTree(), kCharacterGranularity,
|
| + inner_node, SelectionInFlatTree(), kCharacterGranularity,
|
| HandleVisibility::kNotVisible);
|
| return false;
|
| }
|
| @@ -440,13 +440,18 @@ void SelectionController::UpdateSelectionForMouseDrag(
|
|
|
| bool SelectionController::UpdateSelectionForMouseDownDispatchingSelectStart(
|
| Node* target_node,
|
| - const VisibleSelectionInFlatTree& selection,
|
| + const SelectionInFlatTree& selection,
|
| TextGranularity granularity,
|
| HandleVisibility handle_visibility) {
|
| if (target_node && target_node->GetLayoutObject() &&
|
| !target_node->GetLayoutObject()->IsSelectable())
|
| return false;
|
|
|
| + // TODO(editing-dev): We should compute visible selection after dispatching
|
| + // "selectstart", once we have |SelectionInFlatTree::IsValidFor()|.
|
| + const VisibleSelectionInFlatTree& visible_selection =
|
| + CreateVisibleSelection(selection);
|
| +
|
| if (DispatchSelectStart(target_node) != DispatchEventResult::kNotCanceled)
|
| return false;
|
|
|
| @@ -454,17 +459,17 @@ bool SelectionController::UpdateSelectionForMouseDownDispatchingSelectStart(
|
| if (!this->Selection().IsAvailable())
|
| return false;
|
|
|
| - if (!selection.IsValidFor(this->Selection().GetDocument()))
|
| + if (!visible_selection.IsValidFor(this->Selection().GetDocument()))
|
| return false;
|
|
|
| - if (selection.IsRange()) {
|
| + if (visible_selection.IsRange()) {
|
| selection_state_ = SelectionState::kExtendedSelection;
|
| } else {
|
| granularity = kCharacterGranularity;
|
| selection_state_ = SelectionState::kPlacedCaret;
|
| }
|
|
|
| - SetNonDirectionalSelectionIfNeeded(selection.AsSelection(), granularity,
|
| + SetNonDirectionalSelectionIfNeeded(selection, granularity,
|
| kDoNotAdjustEndpoints, handle_visibility);
|
|
|
| return true;
|
| @@ -543,7 +548,7 @@ void SelectionController::SelectClosestMisspellingFromHitTestResult(
|
| const VisiblePositionInFlatTree& pos = VisiblePositionOfHitTestResult(result);
|
| if (pos.IsNull()) {
|
| UpdateSelectionForMouseDownDispatchingSelectStart(
|
| - inner_node, VisibleSelectionInFlatTree(), kWordGranularity,
|
| + inner_node, SelectionInFlatTree(), kWordGranularity,
|
| HandleVisibility::kNotVisible);
|
| return;
|
| }
|
| @@ -556,7 +561,7 @@ void SelectionController::SelectClosestMisspellingFromHitTestResult(
|
| DocumentMarker::MisspellingMarkers());
|
| if (!marker) {
|
| UpdateSelectionForMouseDownDispatchingSelectStart(
|
| - inner_node, VisibleSelectionInFlatTree(), kWordGranularity,
|
| + inner_node, SelectionInFlatTree(), kWordGranularity,
|
| HandleVisibility::kNotVisible);
|
| return;
|
| }
|
| @@ -787,7 +792,7 @@ void SelectionController::SetCaretAtHitTestResult(
|
|
|
| if (visible_pos.IsNull()) {
|
| UpdateSelectionForMouseDownDispatchingSelectStart(
|
| - inner_node, VisibleSelectionInFlatTree(), kCharacterGranularity,
|
| + inner_node, SelectionInFlatTree(), kCharacterGranularity,
|
| HandleVisibility::kVisible);
|
| return;
|
| }
|
|
|