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

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: fixing tests Created 3 years, 7 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/FrameView.h" 41 #include "core/frame/FrameView.h"
42 #include "core/frame/LocalFrame.h" 42 #include "core/frame/LocalFrame.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 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
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 UpdateSelectionForMouseDownDispatchingSelectStart(
195 inner_node, selection, kCharacterGranularity, 197 inner_node, selection, kCharacterGranularity,
196 HandleVisibility::kVisible); 198 HandleVisibility::kVisible);
199 frame_->GetEventHandler().ShowNonLocatedContextMenu(nullptr,
yosin_UTC9 2017/05/25 04:47:20 Since "selectionstart" event is cancelalbe, we sho
amaralp1 2017/05/25 07:11:56 Changed to only show context menu if |UpdateSelect
200 kMenuSourceTouch);
yosin_UTC9 2017/05/25 04:47:21 Could you tell me why we use |kMenuSourceTouch| ev
amaralp1 2017/05/25 07:11:56 |event.FromTouch()| has to be true or else we woul
197 return false; 201 return false;
198 } 202 }
199 } 203 }
200 } 204 }
201 205
202 if (extend_selection && !selection.IsNone()) { 206 if (extend_selection && !selection.IsNone()) {
203 // Note: "fast/events/shift-click-user-select-none.html" makes 207 // Note: "fast/events/shift-click-user-select-none.html" makes
204 // |pos.isNull()| true. 208 // |pos.isNull()| true.
205 const PositionInFlatTree& pos = AdjustPositionRespectUserSelectAll( 209 const PositionInFlatTree& pos = AdjustPositionRespectUserSelectAll(
206 inner_node, selection.Start(), selection.end(), 210 inner_node, selection.Start(), selection.end(),
(...skipping 329 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 540
537 if (append_trailing_whitespace == AppendTrailingWhitespace::kShouldAppend) 541 if (append_trailing_whitespace == AppendTrailingWhitespace::kShouldAppend)
538 new_selection.AppendTrailingWhitespace(); 542 new_selection.AppendTrailingWhitespace();
539 543
540 UpdateSelectionForMouseDownDispatchingSelectStart( 544 UpdateSelectionForMouseDownDispatchingSelectStart(
541 inner_node, 545 inner_node,
542 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection), 546 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection),
543 kWordGranularity, HandleVisibility::kNotVisible); 547 kWordGranularity, HandleVisibility::kNotVisible);
544 } 548 }
545 549
546 void SelectionController::SelectClosestWordFromMouseEvent( 550 bool SelectionController::SelectClosestWordFromMouseEvent(
547 const MouseEventWithHitTestResults& result) { 551 const MouseEventWithHitTestResults& result) {
548 if (!mouse_down_may_start_select_) 552 if (!mouse_down_may_start_select_)
549 return; 553 return false;
550 554
551 AppendTrailingWhitespace append_trailing_whitespace = 555 AppendTrailingWhitespace append_trailing_whitespace =
552 (result.Event().click_count == 2 && 556 (result.Event().click_count == 2 &&
553 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled()) 557 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled())
554 ? AppendTrailingWhitespace::kShouldAppend 558 ? AppendTrailingWhitespace::kShouldAppend
555 : AppendTrailingWhitespace::kDontAppend; 559 : AppendTrailingWhitespace::kDontAppend;
556 560
557 DCHECK(!frame_->GetDocument()->NeedsLayoutTreeUpdate()); 561 DCHECK(!frame_->GetDocument()->NeedsLayoutTreeUpdate());
558 562
559 SelectClosestWordFromHitTestResult( 563 return SelectClosestWordFromHitTestResult(
560 result.GetHitTestResult(), append_trailing_whitespace, 564 result.GetHitTestResult(), append_trailing_whitespace,
561 result.Event().FromTouch() ? SelectInputEventType::kTouch 565 result.Event().FromTouch() ? SelectInputEventType::kTouch
562 : SelectInputEventType::kMouse); 566 : SelectInputEventType::kMouse);
563 } 567 }
564 568
565 void SelectionController::SelectClosestMisspellingFromMouseEvent( 569 void SelectionController::SelectClosestMisspellingFromMouseEvent(
566 const MouseEventWithHitTestResults& result) { 570 const MouseEventWithHitTestResults& result) {
567 if (!mouse_down_may_start_select_) 571 if (!mouse_down_may_start_select_)
568 return; 572 return;
569 573
570 SelectClosestMisspellingFromHitTestResult( 574 SelectClosestMisspellingFromHitTestResult(
571 result.GetHitTestResult(), 575 result.GetHitTestResult(),
572 (result.Event().click_count == 2 && 576 (result.Event().click_count == 2 &&
573 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled()) 577 frame_->GetEditor().IsSelectTrailingWhitespaceEnabled())
574 ? AppendTrailingWhitespace::kShouldAppend 578 ? AppendTrailingWhitespace::kShouldAppend
575 : AppendTrailingWhitespace::kDontAppend); 579 : AppendTrailingWhitespace::kDontAppend);
576 } 580 }
577 581
578 void SelectionController::SelectClosestWordOrLinkFromMouseEvent( 582 void SelectionController::SelectClosestWordOrLinkFromMouseEvent(
579 const MouseEventWithHitTestResults& result) { 583 const MouseEventWithHitTestResults& result) {
580 if (!result.GetHitTestResult().IsLiveLink()) 584 if (!result.GetHitTestResult().IsLiveLink()) {
581 return SelectClosestWordFromMouseEvent(result); 585 SelectClosestWordFromMouseEvent(result);
586 return;
587 }
582 588
583 Node* inner_node = result.InnerNode(); 589 Node* inner_node = result.InnerNode();
584 590
585 if (!inner_node || !inner_node->GetLayoutObject() || 591 if (!inner_node || !inner_node->GetLayoutObject() ||
586 !mouse_down_may_start_select_) 592 !mouse_down_may_start_select_)
587 return; 593 return;
588 594
589 VisibleSelectionInFlatTree new_selection; 595 VisibleSelectionInFlatTree new_selection;
590 Element* url_element = result.GetHitTestResult().URLElement(); 596 Element* url_element = result.GetHitTestResult().URLElement();
591 const VisiblePositionInFlatTree pos = 597 const VisiblePositionInFlatTree pos =
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 return false; 762 return false;
757 763
758 if (Selection().ComputeVisibleSelectionInDOMTreeDeprecated().IsRange()) { 764 if (Selection().ComputeVisibleSelectionInDOMTreeDeprecated().IsRange()) {
759 // A double-click when range is already selected 765 // A double-click when range is already selected
760 // should not change the selection. So, do not call 766 // should not change the selection. So, do not call
761 // selectClosestWordFromMouseEvent, but do set 767 // selectClosestWordFromMouseEvent, but do set
762 // m_beganSelectingText to prevent handleMouseReleaseEvent 768 // m_beganSelectingText to prevent handleMouseReleaseEvent
763 // from setting caret selection. 769 // from setting caret selection.
764 selection_state_ = SelectionState::kExtendedSelection; 770 selection_state_ = SelectionState::kExtendedSelection;
765 } else { 771 } else {
766 SelectClosestWordFromMouseEvent(event); 772 const bool did_select = SelectClosestWordFromMouseEvent(event);
773 if (did_select && Selection().IsHandleVisible()) {
774 frame_->GetEventHandler().ShowNonLocatedContextMenu(nullptr,
775 kMenuSourceTouch);
776 }
767 } 777 }
768 return true; 778 return true;
769 } 779 }
770 780
771 bool SelectionController::HandleTripleClick( 781 bool SelectionController::HandleTripleClick(
772 const MouseEventWithHitTestResults& event) { 782 const MouseEventWithHitTestResults& event) {
773 TRACE_EVENT0("blink", 783 TRACE_EVENT0("blink",
774 "SelectionController::handleMousePressEventTripleClick"); 784 "SelectionController::handleMousePressEventTripleClick");
775 785
776 if (!Selection().IsAvailable()) { 786 if (!Selection().IsAvailable()) {
(...skipping 19 matching lines...) Expand all
796 new_selection = 806 new_selection =
797 CreateVisibleSelection(SelectionInFlatTree::Builder() 807 CreateVisibleSelection(SelectionInFlatTree::Builder()
798 .Collapse(pos.ToPositionWithAffinity()) 808 .Collapse(pos.ToPositionWithAffinity())
799 .SetGranularity(kParagraphGranularity) 809 .SetGranularity(kParagraphGranularity)
800 .Build()); 810 .Build());
801 } 811 }
802 812
803 const bool is_handle_visible = 813 const bool is_handle_visible =
804 event.Event().FromTouch() && new_selection.IsRange(); 814 event.Event().FromTouch() && new_selection.IsRange();
805 815
806 return UpdateSelectionForMouseDownDispatchingSelectStart( 816 const bool did_select = UpdateSelectionForMouseDownDispatchingSelectStart(
807 inner_node, 817 inner_node,
808 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection), 818 ExpandSelectionToRespectUserSelectAll(inner_node, new_selection),
809 kParagraphGranularity, 819 kParagraphGranularity,
810 is_handle_visible ? HandleVisibility::kVisible 820 is_handle_visible ? HandleVisibility::kVisible
811 : HandleVisibility::kNotVisible); 821 : HandleVisibility::kNotVisible);
822 if (did_select && Selection().IsHandleVisible()) {
yosin_UTC9 2017/05/25 04:47:20 early-return style is better. if (!did_selection)
amaralp1 2017/05/25 07:11:56 Done.
823 frame_->GetEventHandler().ShowNonLocatedContextMenu(nullptr,
824 kMenuSourceTouch);
825 }
826 return did_select;
812 } 827 }
813 828
814 bool SelectionController::HandleMousePressEvent( 829 bool SelectionController::HandleMousePressEvent(
815 const MouseEventWithHitTestResults& event) { 830 const MouseEventWithHitTestResults& event) {
816 TRACE_EVENT0("blink", "SelectionController::handleMousePressEvent"); 831 TRACE_EVENT0("blink", "SelectionController::handleMousePressEvent");
817 832
818 // If we got the event back, that must mean it wasn't prevented, 833 // If we got the event back, that must mean it wasn't prevented,
819 // so it's allowed to start a drag or selection if it wasn't in a scrollbar. 834 // so it's allowed to start a drag or selection if it wasn't in a scrollbar.
820 mouse_down_may_start_select_ = 835 mouse_down_may_start_select_ =
821 (CanMouseDownStartSelect(event.InnerNode()) || IsLinkSelection(event)) && 836 (CanMouseDownStartSelect(event.InnerNode()) || IsLinkSelection(event)) &&
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
1134 1149
1135 bool IsExtendingSelection(const MouseEventWithHitTestResults& event) { 1150 bool IsExtendingSelection(const MouseEventWithHitTestResults& event) {
1136 bool is_mouse_down_on_link_or_image = 1151 bool is_mouse_down_on_link_or_image =
1137 event.IsOverLink() || event.GetHitTestResult().GetImage(); 1152 event.IsOverLink() || event.GetHitTestResult().GetImage();
1138 return (event.Event().GetModifiers() & WebInputEvent::Modifiers::kShiftKey) != 1153 return (event.Event().GetModifiers() & WebInputEvent::Modifiers::kShiftKey) !=
1139 0 && 1154 0 &&
1140 !is_mouse_down_on_link_or_image; 1155 !is_mouse_down_on_link_or_image;
1141 } 1156 }
1142 1157
1143 } // namespace blink 1158 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698