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

Side by Side Diff: third_party/WebKit/Source/core/editing/SelectionController.cpp

Issue 2785853002: Selection Action mode triggered like a context menu (Closed)
Patch Set: fix rebase Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 4 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 5 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
6 * Copyright (C) 2015 Google Inc. All rights reserved. 6 * Copyright (C) 2015 Google Inc. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
10 * are met: 10 * are met:
(...skipping 23 matching lines...) Expand all
34 #include "core/editing/EditingUtilities.h" 34 #include "core/editing/EditingUtilities.h"
35 #include "core/editing/Editor.h" 35 #include "core/editing/Editor.h"
36 #include "core/editing/FrameSelection.h" 36 #include "core/editing/FrameSelection.h"
37 #include "core/editing/RenderedPosition.h" 37 #include "core/editing/RenderedPosition.h"
38 #include "core/editing/iterators/TextIterator.h" 38 #include "core/editing/iterators/TextIterator.h"
39 #include "core/editing/markers/DocumentMarkerController.h" 39 #include "core/editing/markers/DocumentMarkerController.h"
40 #include "core/events/Event.h" 40 #include "core/events/Event.h"
41 #include "core/frame/LocalFrame.h" 41 #include "core/frame/LocalFrame.h"
42 #include "core/frame/LocalFrameView.h" 42 #include "core/frame/LocalFrameView.h"
43 #include "core/frame/Settings.h" 43 #include "core/frame/Settings.h"
44 #include "core/input/EventHandler.h"
44 #include "core/layout/LayoutView.h" 45 #include "core/layout/LayoutView.h"
45 #include "core/layout/api/LayoutViewItem.h" 46 #include "core/layout/api/LayoutViewItem.h"
46 #include "core/page/FocusController.h" 47 #include "core/page/FocusController.h"
47 #include "core/page/Page.h" 48 #include "core/page/Page.h"
48 #include "platform/RuntimeEnabledFeatures.h" 49 #include "platform/RuntimeEnabledFeatures.h"
49 #include "platform/wtf/AutoReset.h" 50 #include "platform/wtf/AutoReset.h"
51 #include "public/web/WebMenuSourceType.h"
50 52
51 namespace blink { 53 namespace blink {
52 SelectionController* SelectionController::Create(LocalFrame& frame) { 54 SelectionController* SelectionController::Create(LocalFrame& frame) {
53 return new SelectionController(frame); 55 return new SelectionController(frame);
54 } 56 }
55 57
56 SelectionController::SelectionController(LocalFrame& frame) 58 SelectionController::SelectionController(LocalFrame& frame)
57 : frame_(&frame), 59 : frame_(&frame),
58 mouse_down_may_start_select_(false), 60 mouse_down_may_start_select_(false),
59 mouse_down_was_single_click_in_selection_(false), 61 mouse_down_was_single_click_in_selection_(false),
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 // existing selection so we can allow for text dragging. 186 // existing selection so we can allow for text dragging.
185 if (LocalFrameView* view = frame_->View()) { 187 if (LocalFrameView* view = frame_->View()) {
186 const LayoutPoint v_point = view->RootFrameToContents( 188 const LayoutPoint v_point = view->RootFrameToContents(
187 FlooredIntPoint(event.Event().PositionInRootFrame())); 189 FlooredIntPoint(event.Event().PositionInRootFrame()));
188 if (!extend_selection && this->Selection().Contains(v_point)) { 190 if (!extend_selection && this->Selection().Contains(v_point)) {
189 mouse_down_was_single_click_in_selection_ = true; 191 mouse_down_was_single_click_in_selection_ = true;
190 if (!event.Event().FromTouch()) 192 if (!event.Event().FromTouch())
191 return false; 193 return false;
192 194
193 if (!this->Selection().IsHandleVisible()) { 195 if (!this->Selection().IsHandleVisible()) {
194 UpdateSelectionForMouseDownDispatchingSelectStart( 196 const bool did_select =
195 inner_node, selection, kCharacterGranularity, 197 UpdateSelectionForMouseDownDispatchingSelectStart(
196 HandleVisibility::kVisible); 198 inner_node, selection, kCharacterGranularity,
199 HandleVisibility::kVisible);
200 if (did_select) {
201 frame_->GetEventHandler().ShowNonLocatedContextMenu(nullptr,
202 kMenuSourceTouch);
203 }
197 return false; 204 return false;
198 } 205 }
199 } 206 }
200 } 207 }
201 208
202 if (extend_selection && !selection.IsNone()) { 209 if (extend_selection && !selection.IsNone()) {
203 // Note: "fast/events/shift-click-user-select-none.html" makes 210 // Note: "fast/events/shift-click-user-select-none.html" makes
204 // |pos.isNull()| true. 211 // |pos.isNull()| true.
205 const PositionInFlatTree& pos = AdjustPositionRespectUserSelectAll( 212 const PositionInFlatTree& pos = AdjustPositionRespectUserSelectAll(
206 inner_node, selection.Start(), selection.end(), 213 inner_node, selection.Start(), selection.end(),
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
544 551
545 if (append_trailing_whitespace == AppendTrailingWhitespace::kShouldAppend) 552 if (append_trailing_whitespace == AppendTrailingWhitespace::kShouldAppend)
546 new_selection.AppendTrailingWhitespace(); 553 new_selection.AppendTrailingWhitespace();
547 554
548 UpdateSelectionForMouseDownDispatchingSelectStart( 555 UpdateSelectionForMouseDownDispatchingSelectStart(
549 inner_node, 556 inner_node,
550 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection), 557 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection),
551 kWordGranularity, HandleVisibility::kNotVisible); 558 kWordGranularity, HandleVisibility::kNotVisible);
552 } 559 }
553 560
554 void SelectionController::SelectClosestWordFromMouseEvent( 561 bool SelectionController::SelectClosestWordFromMouseEvent(
555 const MouseEventWithHitTestResults& result) { 562 const MouseEventWithHitTestResults& result) {
556 if (!mouse_down_may_start_select_) 563 if (!mouse_down_may_start_select_)
557 return; 564 return false;
558 565
559 AppendTrailingWhitespace append_trailing_whitespace = 566 AppendTrailingWhitespace append_trailing_whitespace =
560 (result.Event().click_count == 2 && 567 (result.Event().click_count == 2 &&
561 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled()) 568 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled())
562 ? AppendTrailingWhitespace::kShouldAppend 569 ? AppendTrailingWhitespace::kShouldAppend
563 : AppendTrailingWhitespace::kDontAppend; 570 : AppendTrailingWhitespace::kDontAppend;
564 571
565 DCHECK(!frame_->GetDocument()->NeedsLayoutTreeUpdate()); 572 DCHECK(!frame_->GetDocument()->NeedsLayoutTreeUpdate());
566 573
567 SelectClosestWordFromHitTestResult( 574 return SelectClosestWordFromHitTestResult(
568 result.GetHitTestResult(), append_trailing_whitespace, 575 result.GetHitTestResult(), append_trailing_whitespace,
569 result.Event().FromTouch() ? SelectInputEventType::kTouch 576 result.Event().FromTouch() ? SelectInputEventType::kTouch
570 : SelectInputEventType::kMouse); 577 : SelectInputEventType::kMouse);
571 } 578 }
572 579
573 void SelectionController::SelectClosestMisspellingFromMouseEvent( 580 void SelectionController::SelectClosestMisspellingFromMouseEvent(
574 const MouseEventWithHitTestResults& result) { 581 const MouseEventWithHitTestResults& result) {
575 if (!mouse_down_may_start_select_) 582 if (!mouse_down_may_start_select_)
576 return; 583 return;
577 584
578 SelectClosestMisspellingFromHitTestResult( 585 SelectClosestMisspellingFromHitTestResult(
579 result.GetHitTestResult(), 586 result.GetHitTestResult(),
580 (result.Event().click_count == 2 && 587 (result.Event().click_count == 2 &&
581 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled()) 588 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled())
582 ? AppendTrailingWhitespace::kShouldAppend 589 ? AppendTrailingWhitespace::kShouldAppend
583 : AppendTrailingWhitespace::kDontAppend); 590 : AppendTrailingWhitespace::kDontAppend);
584 } 591 }
585 592
586 void SelectionController::SelectClosestWordOrLinkFromMouseEvent( 593 void SelectionController::SelectClosestWordOrLinkFromMouseEvent(
587 const MouseEventWithHitTestResults& result) { 594 const MouseEventWithHitTestResults& result) {
588 if (!result.GetHitTestResult().IsLiveLink()) 595 if (!result.GetHitTestResult().IsLiveLink()) {
589 return SelectClosestWordFromMouseEvent(result); 596 SelectClosestWordFromMouseEvent(result);
597 return;
598 }
590 599
591 Node* inner_node = result.InnerNode(); 600 Node* inner_node = result.InnerNode();
592 601
593 if (!inner_node || !inner_node->GetLayoutObject() || 602 if (!inner_node || !inner_node->GetLayoutObject() ||
594 !mouse_down_may_start_select_) 603 !mouse_down_may_start_select_)
595 return; 604 return;
596 605
597 VisibleSelectionInFlatTree new_selection; 606 VisibleSelectionInFlatTree new_selection;
598 Element* url_element = result.GetHitTestResult().URLElement(); 607 Element* url_element = result.GetHitTestResult().URLElement();
599 const VisiblePositionInFlatTree pos = 608 const VisiblePositionInFlatTree pos =
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
764 return false; 773 return false;
765 774
766 if (Selection().ComputeVisibleSelectionInDOMTreeDeprecated().IsRange()) { 775 if (Selection().ComputeVisibleSelectionInDOMTreeDeprecated().IsRange()) {
767 // A double-click when range is already selected 776 // A double-click when range is already selected
768 // should not change the selection. So, do not call 777 // should not change the selection. So, do not call
769 // selectClosestWordFromMouseEvent, but do set 778 // selectClosestWordFromMouseEvent, but do set
770 // m_beganSelectingText to prevent handleMouseReleaseEvent 779 // m_beganSelectingText to prevent handleMouseReleaseEvent
771 // from setting caret selection. 780 // from setting caret selection.
772 selection_state_ = SelectionState::kExtendedSelection; 781 selection_state_ = SelectionState::kExtendedSelection;
773 } else { 782 } else {
774 SelectClosestWordFromMouseEvent(event); 783 const bool did_select = SelectClosestWordFromMouseEvent(event);
784 if (did_select && Selection().IsHandleVisible()) {
785 frame_->GetEventHandler().ShowNonLocatedContextMenu(nullptr,
786 kMenuSourceTouch);
787 }
775 } 788 }
776 return true; 789 return true;
777 } 790 }
778 791
779 bool SelectionController::HandleTripleClick( 792 bool SelectionController::HandleTripleClick(
780 const MouseEventWithHitTestResults& event) { 793 const MouseEventWithHitTestResults& event) {
781 TRACE_EVENT0("blink", 794 TRACE_EVENT0("blink",
782 "SelectionController::handleMousePressEventTripleClick"); 795 "SelectionController::handleMousePressEventTripleClick");
783 796
784 if (!Selection().IsAvailable()) { 797 if (!Selection().IsAvailable()) {
(...skipping 19 matching lines...) Expand all
804 new_selection = 817 new_selection =
805 CreateVisibleSelection(SelectionInFlatTree::Builder() 818 CreateVisibleSelection(SelectionInFlatTree::Builder()
806 .Collapse(pos.ToPositionWithAffinity()) 819 .Collapse(pos.ToPositionWithAffinity())
807 .SetGranularity(kParagraphGranularity) 820 .SetGranularity(kParagraphGranularity)
808 .Build()); 821 .Build());
809 } 822 }
810 823
811 const bool is_handle_visible = 824 const bool is_handle_visible =
812 event.Event().FromTouch() && new_selection.IsRange(); 825 event.Event().FromTouch() && new_selection.IsRange();
813 826
814 return UpdateSelectionForMouseDownDispatchingSelectStart( 827 const bool did_select = UpdateSelectionForMouseDownDispatchingSelectStart(
815 inner_node, 828 inner_node,
816 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection), 829 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection),
817 kParagraphGranularity, 830 kParagraphGranularity,
818 is_handle_visible ? HandleVisibility::kVisible 831 is_handle_visible ? HandleVisibility::kVisible
819 : HandleVisibility::kNotVisible); 832 : HandleVisibility::kNotVisible);
833 if (!did_select)
834 return false;
835
836 if (Selection().IsHandleVisible()) {
837 frame_->GetEventHandler().ShowNonLocatedContextMenu(nullptr,
838 kMenuSourceTouch);
839 }
840 return true;
820 } 841 }
821 842
822 bool SelectionController::HandleMousePressEvent( 843 bool SelectionController::HandleMousePressEvent(
823 const MouseEventWithHitTestResults& event) { 844 const MouseEventWithHitTestResults& event) {
824 TRACE_EVENT0("blink", "SelectionController::handleMousePressEvent"); 845 TRACE_EVENT0("blink", "SelectionController::handleMousePressEvent");
825 846
826 // If we got the event back, that must mean it wasn't prevented, 847 // If we got the event back, that must mean it wasn't prevented,
827 // so it's allowed to start a drag or selection if it wasn't in a scrollbar. 848 // so it's allowed to start a drag or selection if it wasn't in a scrollbar.
828 mouse_down_may_start_select_ = 849 mouse_down_may_start_select_ =
829 (CanMouseDownStartSelect(event.InnerNode()) || IsLinkSelection(event)) && 850 (CanMouseDownStartSelect(event.InnerNode()) || IsLinkSelection(event)) &&
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 1163
1143 bool IsExtendingSelection(const MouseEventWithHitTestResults& event) { 1164 bool IsExtendingSelection(const MouseEventWithHitTestResults& event) {
1144 bool is_mouse_down_on_link_or_image = 1165 bool is_mouse_down_on_link_or_image =
1145 event.IsOverLink() || event.GetHitTestResult().GetImage(); 1166 event.IsOverLink() || event.GetHitTestResult().GetImage();
1146 return (event.Event().GetModifiers() & WebInputEvent::Modifiers::kShiftKey) != 1167 return (event.Event().GetModifiers() & WebInputEvent::Modifiers::kShiftKey) !=
1147 0 && 1168 0 &&
1148 !is_mouse_down_on_link_or_image; 1169 !is_mouse_down_on_link_or_image;
1149 } 1170 }
1150 1171
1151 } // namespace blink 1172 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/editing/SelectionController.h ('k') | third_party/WebKit/Source/core/input/EventHandler.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698