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

Side by Side Diff: Source/core/page/EventHandler.cpp

Issue 507533002: Fix to keep the selection of the text field in input element after setSelectionRange is called by d… (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 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 reserv ed. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv ed.
3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org)
4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 1. Redistributions of source code must retain the above copyright 9 * 1. Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer. 10 * notice, this list of conditions and the following disclaimer.
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 , m_mouseDownTimestamp(0) 221 , m_mouseDownTimestamp(0)
222 , m_widgetIsLatched(false) 222 , m_widgetIsLatched(false)
223 , m_touchPressed(false) 223 , m_touchPressed(false)
224 , m_scrollGestureHandlingNode(nullptr) 224 , m_scrollGestureHandlingNode(nullptr)
225 , m_lastGestureScrollOverWidget(false) 225 , m_lastGestureScrollOverWidget(false)
226 , m_maxMouseMovedDuration(0) 226 , m_maxMouseMovedDuration(0)
227 , m_didStartDrag(false) 227 , m_didStartDrag(false)
228 , m_longTapShouldInvokeContextMenu(false) 228 , m_longTapShouldInvokeContextMenu(false)
229 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) 229 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired)
230 , m_lastShowPressTimestamp(0) 230 , m_lastShowPressTimestamp(0)
231 , m_selectionChanged(false)
231 { 232 {
232 } 233 }
233 234
234 EventHandler::~EventHandler() 235 EventHandler::~EventHandler()
235 { 236 {
236 ASSERT(!m_fakeMouseMoveEventTimer.isActive()); 237 ASSERT(!m_fakeMouseMoveEventTimer.isActive());
237 } 238 }
238 239
239 void EventHandler::trace(Visitor* visitor) 240 void EventHandler::trace(Visitor* visitor)
240 { 241 {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
295 m_lastGestureScrollOverWidget = false; 296 m_lastGestureScrollOverWidget = false;
296 m_previousGestureScrolledNode = nullptr; 297 m_previousGestureScrolledNode = nullptr;
297 m_scrollbarHandlingScrollGesture = nullptr; 298 m_scrollbarHandlingScrollGesture = nullptr;
298 m_maxMouseMovedDuration = 0; 299 m_maxMouseMovedDuration = 0;
299 m_didStartDrag = false; 300 m_didStartDrag = false;
300 m_touchPressed = false; 301 m_touchPressed = false;
301 m_mouseDownMayStartSelect = false; 302 m_mouseDownMayStartSelect = false;
302 m_mouseDownMayStartDrag = false; 303 m_mouseDownMayStartDrag = false;
303 m_lastShowPressTimestamp = 0; 304 m_lastShowPressTimestamp = 0;
304 m_lastDeferredTapElement = nullptr; 305 m_lastDeferredTapElement = nullptr;
306 m_selectionChanged = false;
305 } 307 }
306 308
307 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved) 309 void EventHandler::nodeWillBeRemoved(Node& nodeToBeRemoved)
308 { 310 {
309 if (!nodeToBeRemoved.containsIncludingShadowDOM(m_clickNode.get())) 311 if (!nodeToBeRemoved.containsIncludingShadowDOM(m_clickNode.get()))
310 return; 312 return;
311 if (nodeToBeRemoved.isInShadowTree()) { 313 if (nodeToBeRemoved.isInShadowTree()) {
312 m_clickNode = nodeToBeRemoved.parentOrShadowHostNode(); 314 m_clickNode = nodeToBeRemoved.parentOrShadowHostNode();
313 } else { 315 } else {
314 // We don't dispatch click events if the mousedown node is removed 316 // We don't dispatch click events if the mousedown node is removed
(...skipping 453 matching lines...) Expand 10 before | Expand all | Expand 10 after
768 // the mouse is pressed again. 770 // the mouse is pressed again.
769 m_mousePressed = false; 771 m_mousePressed = false;
770 m_capturesDragging = false; 772 m_capturesDragging = false;
771 m_mouseDownMayStartDrag = false; 773 m_mouseDownMayStartDrag = false;
772 m_mouseDownMayStartSelect = false; 774 m_mouseDownMayStartSelect = false;
773 m_mouseDownMayStartAutoscroll = false; 775 m_mouseDownMayStartAutoscroll = false;
774 m_mouseDownWasInSubframe = false; 776 m_mouseDownWasInSubframe = false;
775 777
776 bool handled = false; 778 bool handled = false;
777 779
780 bool isSelectionChanged = m_selectionChanged;
781 m_selectionChanged = false;
782
778 // Clear the selection if the mouse didn't move after the last mouse 783 // Clear the selection if the mouse didn't move after the last mouse
779 // press and it's not a context menu click. We do this so when clicking 784 // press and it's not a context menu click and it's not set by setSelectionR ange during handling mouse event.
780 // on the selection, the selection goes away. However, if we are 785 // We do this so when clicking on the selection, the selection goes away. Ho wever, if we are
781 // editing, place the caret. 786 // editing, place the caret.
782 if (m_mouseDownWasSingleClickInSelection && m_selectionInitiationState != Ex tendedSelection 787 if (m_mouseDownWasSingleClickInSelection && m_selectionInitiationState != Ex tendedSelection
783 && m_dragStartPos == event.event().position() 788 && m_dragStartPos == event.event().position()
784 && m_frame->selection().isRange() 789 && m_frame->selection().isRange()
785 && event.event().button() != RightButton) { 790 && event.event().button() != RightButton
791 && !isSelectionChanged) {
786 VisibleSelection newSelection; 792 VisibleSelection newSelection;
787 Node* node = event.targetNode(); 793 Node* node = event.targetNode();
788 bool caretBrowsing = m_frame->settings() && m_frame->settings()->caretBr owsingEnabled(); 794 bool caretBrowsing = m_frame->settings() && m_frame->settings()->caretBr owsingEnabled();
789 if (node && node->renderer() && (caretBrowsing || node->hasEditableStyle ())) { 795 if (node && node->renderer() && (caretBrowsing || node->hasEditableStyle ())) {
790 VisiblePosition pos = VisiblePosition(node->renderer()->positionForP oint(event.localPoint())); 796 VisiblePosition pos = VisiblePosition(node->renderer()->positionForP oint(event.localPoint()));
791 newSelection = VisibleSelection(pos); 797 newSelection = VisibleSelection(pos);
792 } 798 }
793 799
794 setSelectionIfNeeded(m_frame->selection(), newSelection); 800 setSelectionIfNeeded(m_frame->selection(), newSelection);
795 801
(...skipping 482 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 m_resizeScrollableArea->setInResizeMode(true); 1284 m_resizeScrollableArea->setInResizeMode(true);
1279 m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeC orner(p); 1285 m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeC orner(p);
1280 invalidateClick(); 1286 invalidateClick();
1281 return true; 1287 return true;
1282 } 1288 }
1283 } 1289 }
1284 1290
1285 m_frame->selection().setCaretBlinkingSuspended(true); 1291 m_frame->selection().setCaretBlinkingSuspended(true);
1286 1292
1287 bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.targe tNode(), m_clickCount, mouseEvent, true); 1293 bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.targe tNode(), m_clickCount, mouseEvent, true);
1294 m_selectionChanged = false;
1288 swallowEvent = swallowEvent || handleMouseFocus(mouseEvent); 1295 swallowEvent = swallowEvent || handleMouseFocus(mouseEvent);
1289 m_capturesDragging = !swallowEvent || mev.scrollbar(); 1296 m_capturesDragging = !swallowEvent || mev.scrollbar();
1290 1297
1291 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults 1298 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults
1292 // in case the scrollbar widget was destroyed when the mouse event was handl ed. 1299 // in case the scrollbar widget was destroyed when the mouse event was handl ed.
1293 if (mev.scrollbar()) { 1300 if (mev.scrollbar()) {
1294 const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMou se.get(); 1301 const bool wasLastScrollBar = mev.scrollbar() == m_lastScrollbarUnderMou se.get();
1295 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active ); 1302 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active );
1296 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mou seEvent); 1303 mev = m_frame->document()->prepareMouseEvent(request, documentPoint, mou seEvent);
1297 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get ()) 1304 if (wasLastScrollBar && mev.scrollbar() != m_lastScrollbarUnderMouse.get ())
(...skipping 1646 matching lines...) Expand 10 before | Expand all | Expand 10 after
2944 } 2951 }
2945 2952
2946 void EventHandler::notifyElementActivated() 2953 void EventHandler::notifyElementActivated()
2947 { 2954 {
2948 // Since another element has been set to active, stop current timer and clea r reference. 2955 // Since another element has been set to active, stop current timer and clea r reference.
2949 if (m_activeIntervalTimer.isActive()) 2956 if (m_activeIntervalTimer.isActive())
2950 m_activeIntervalTimer.stop(); 2957 m_activeIntervalTimer.stop();
2951 m_lastDeferredTapElement = nullptr; 2958 m_lastDeferredTapElement = nullptr;
2952 } 2959 }
2953 2960
2961 void EventHandler::notifySelectionChanged()
2962 {
2963 m_selectionChanged = true;
Rick Byers 2014/08/28 18:16:41 It looks to me like m_selectionInitiationState is
Miyoung Shin(g) 2014/08/29 14:18:52 Ok, I think I can use m_selectionInitiationState
2964 }
2965
2954 bool EventHandler::handleAccessKey(const PlatformKeyboardEvent& evt) 2966 bool EventHandler::handleAccessKey(const PlatformKeyboardEvent& evt)
2955 { 2967 {
2956 // FIXME: Ignoring the state of Shift key is what neither IE nor Firefox do. 2968 // FIXME: Ignoring the state of Shift key is what neither IE nor Firefox do.
2957 // IE matches lower and upper case access keys regardless of Shift key state - but if both upper and 2969 // IE matches lower and upper case access keys regardless of Shift key state - but if both upper and
2958 // lower case variants are present in a document, the correct element is mat ched based on Shift key state. 2970 // lower case variants are present in a document, the correct element is mat ched based on Shift key state.
2959 // Firefox only matches an access key if Shift is not pressed, and does that case-insensitively. 2971 // Firefox only matches an access key if Shift is not pressed, and does that case-insensitively.
2960 ASSERT(!(accessKeyModifiers() & PlatformEvent::ShiftKey)); 2972 ASSERT(!(accessKeyModifiers() & PlatformEvent::ShiftKey));
2961 if ((evt.modifiers() & ~PlatformEvent::ShiftKey) != accessKeyModifiers()) 2973 if ((evt.modifiers() & ~PlatformEvent::ShiftKey) != accessKeyModifiers())
2962 return false; 2974 return false;
2963 String key = evt.unmodifiedText(); 2975 String key = evt.unmodifiedText();
(...skipping 917 matching lines...) Expand 10 before | Expand all | Expand 10 after
3881 unsigned EventHandler::accessKeyModifiers() 3893 unsigned EventHandler::accessKeyModifiers()
3882 { 3894 {
3883 #if OS(MACOSX) 3895 #if OS(MACOSX)
3884 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 3896 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
3885 #else 3897 #else
3886 return PlatformEvent::AltKey; 3898 return PlatformEvent::AltKey;
3887 #endif 3899 #endif
3888 } 3900 }
3889 3901
3890 } // namespace blink 3902 } // namespace blink
OLDNEW
« LayoutTests/fast/forms/setrangetext-within-events.html ('K') | « Source/core/page/EventHandler.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698