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

Side by Side Diff: sky/engine/core/page/EventHandler.cpp

Issue 646273006: Get rid of ScrollView. (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: merge to ToT Created 6 years, 1 month 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 425 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 436 m_frame->document()->updateLayoutIgnorePendingStylesheets();
437 Node* innerNode = event.targetNode(); 437 Node* innerNode = event.targetNode();
438 if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect)) 438 if (!(innerNode && innerNode->renderer() && m_mouseDownMayStartSelect))
439 return false; 439 return false;
440 440
441 // Extend the selection if the Shift key is down, unless the click is in a l ink. 441 // Extend the selection if the Shift key is down, unless the click is in a l ink.
442 bool extendSelection = event.event().shiftKey() && !event.isOverLink(); 442 bool extendSelection = event.event().shiftKey() && !event.isOverLink();
443 443
444 // Don't restart the selection when the mouse is pressed on an 444 // Don't restart the selection when the mouse is pressed on an
445 // existing selection so we can allow for text dragging. 445 // existing selection so we can allow for text dragging.
446 if (FrameView* view = m_frame->view()) { 446 LayoutPoint vPoint = event.event().position();
447 LayoutPoint vPoint = view->windowToContents(event.event().position()); 447 if (!extendSelection && m_frame->selection().contains(vPoint)) {
448 if (!extendSelection && m_frame->selection().contains(vPoint)) { 448 m_mouseDownWasSingleClickInSelection = true;
449 m_mouseDownWasSingleClickInSelection = true; 449 return false;
450 return false;
451 }
452 } 450 }
453 451
454 VisiblePosition visiblePos(innerNode->renderer()->positionForPoint(event.loc alPoint())); 452 VisiblePosition visiblePos(innerNode->renderer()->positionForPoint(event.loc alPoint()));
455 if (visiblePos.isNull()) 453 if (visiblePos.isNull())
456 visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOW NSTREAM); 454 visiblePos = VisiblePosition(firstPositionInOrBeforeNode(innerNode), DOW NSTREAM);
457 Position pos = visiblePos.deepEquivalent(); 455 Position pos = visiblePos.deepEquivalent();
458 456
459 VisibleSelection newSelection = m_frame->selection().selection(); 457 VisibleSelection newSelection = m_frame->selection().selection();
460 TextGranularity granularity = CharacterGranularity; 458 TextGranularity granularity = CharacterGranularity;
461 459
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 } 507 }
510 508
511 bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& eve nt) 509 bool EventHandler::handleMousePressEvent(const MouseEventWithHitTestResults& eve nt)
512 { 510 {
513 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); 511 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent");
514 512
515 cancelFakeMouseMoveEvent(); 513 cancelFakeMouseMoveEvent();
516 514
517 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 515 m_frame->document()->updateLayoutIgnorePendingStylesheets();
518 516
519 if (ScrollView* scrollView = m_frame->view()) {
520 if (scrollView->isPointInScrollbarCorner(event.event().position()))
521 return false;
522 }
523
524 bool singleClick = event.event().clickCount() <= 1; 517 bool singleClick = event.event().clickCount() <= 1;
525 518
526 // If we got the event back, that must mean it wasn't prevented, 519 // If we got the event back, that must mean it wasn't prevented,
527 // so it's allowed to start a drag or selection if it wasn't in a scrollbar. 520 // so it's allowed to start a drag or selection if it wasn't in a scrollbar.
528 m_mouseDownMayStartSelect = canMouseDownStartSelect(event.targetNode()) && ! event.scrollbar(); 521 m_mouseDownMayStartSelect = canMouseDownStartSelect(event.targetNode()) && ! event.scrollbar();
529 522
530 m_mouseDownMayStartDrag = singleClick; 523 m_mouseDownMayStartDrag = singleClick;
531 524
532 m_mouseDownWasSingleClickInSelection = false; 525 m_mouseDownWasSingleClickInSelection = false;
533 526
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 void EventHandler::updateSelectionForMouseDrag() 601 void EventHandler::updateSelectionForMouseDrag()
609 { 602 {
610 FrameView* view = m_frame->view(); 603 FrameView* view = m_frame->view();
611 if (!view) 604 if (!view)
612 return; 605 return;
613 RenderView* renderer = m_frame->contentRenderer(); 606 RenderView* renderer = m_frame->contentRenderer();
614 if (!renderer) 607 if (!renderer)
615 return; 608 return;
616 609
617 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | H itTestRequest::Move); 610 HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | H itTestRequest::Move);
618 HitTestResult result(view->windowToContents(m_lastKnownMousePosition)); 611 HitTestResult result(m_lastKnownMousePosition);
619 renderer->hitTest(request, result); 612 renderer->hitTest(request, result);
620 updateSelectionForMouseDrag(result); 613 updateSelectionForMouseDrag(result);
621 } 614 }
622 615
623 void EventHandler::updateSelectionForMouseDrag(const HitTestResult& hitTestResul t) 616 void EventHandler::updateSelectionForMouseDrag(const HitTestResult& hitTestResul t)
624 { 617 {
625 if (!m_mouseDownMayStartSelect) 618 if (!m_mouseDownMayStartSelect)
626 return; 619 return;
627 620
628 Node* target = hitTestResult.targetNode(); 621 Node* target = hitTestResult.targetNode();
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 return false; 796 return false;
804 } 797 }
805 798
806 bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode) 799 bool EventHandler::bubblingScroll(ScrollDirection direction, ScrollGranularity g ranularity, Node* startingNode)
807 { 800 {
808 // The layout needs to be up to date to determine if we can scroll. We may b e 801 // The layout needs to be up to date to determine if we can scroll. We may b e
809 // here because of an onLoad event, in which case the final layout hasn't be en performed yet. 802 // here because of an onLoad event, in which case the final layout hasn't be en performed yet.
810 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 803 m_frame->document()->updateLayoutIgnorePendingStylesheets();
811 if (scroll(direction, granularity, startingNode)) 804 if (scroll(direction, granularity, startingNode))
812 return true; 805 return true;
813 LocalFrame* frame = m_frame;
814 FrameView* view = frame->view();
815 if (view && view->scroll(direction, granularity))
816 return true;
817 return false; 806 return false;
818 } 807 }
819 808
820 IntPoint EventHandler::lastKnownMousePosition() const 809 IntPoint EventHandler::lastKnownMousePosition() const
821 { 810 {
822 return m_lastKnownMousePosition; 811 return m_lastKnownMousePosition;
823 } 812 }
824 813
825 bool EventHandler::useHandCursor(Node* node, bool isOverLink) 814 bool EventHandler::useHandCursor(Node* node, bool isOverLink)
826 { 815 {
(...skipping 20 matching lines...) Expand all
847 if (!view || !view->shouldSetCursor()) 836 if (!view || !view->shouldSetCursor())
848 return; 837 return;
849 838
850 RenderView* renderView = view->renderView(); 839 RenderView* renderView = view->renderView();
851 if (!renderView) 840 if (!renderView)
852 return; 841 return;
853 842
854 m_frame->document()->updateLayout(); 843 m_frame->document()->updateLayout();
855 844
856 HitTestRequest request(HitTestRequest::ReadOnly); 845 HitTestRequest request(HitTestRequest::ReadOnly);
857 HitTestResult result(view->windowToContents(m_lastKnownMousePosition)); 846 HitTestResult result(m_lastKnownMousePosition);
858 renderView->hitTest(request, result); 847 renderView->hitTest(request, result);
859 848
860 OptionalCursor optionalCursor = selectCursor(result); 849 OptionalCursor optionalCursor = selectCursor(result);
861 if (optionalCursor.isCursorChange()) { 850 if (optionalCursor.isCursorChange()) {
862 m_currentMouseCursor = optionalCursor.cursor(); 851 m_currentMouseCursor = optionalCursor.cursor();
863 view->setCursor(m_currentMouseCursor); 852 view->setCursor(m_currentMouseCursor);
864 } 853 }
865 } 854 }
866 855
867 OptionalCursor EventHandler::selectCursor(const HitTestResult& result) 856 OptionalCursor EventHandler::selectCursor(const HitTestResult& result)
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1025 return iBeam; 1014 return iBeam;
1026 } 1015 }
1027 1016
1028 if ((editable || (renderer && renderer->isText() && node->canStartSelection( ))) && !inResizer && !result.scrollbar()) 1017 if ((editable || (renderer && renderer->isText() && node->canStartSelection( ))) && !inResizer && !result.scrollbar())
1029 return iBeam; 1018 return iBeam;
1030 return pointerCursor(); 1019 return pointerCursor();
1031 } 1020 }
1032 1021
1033 static LayoutPoint documentPointForWindowPoint(LocalFrame* frame, const IntPoint & windowPoint) 1022 static LayoutPoint documentPointForWindowPoint(LocalFrame* frame, const IntPoint & windowPoint)
1034 { 1023 {
1035 FrameView* view = frame->view(); 1024 // FIXME(sky): remove
1036 // FIXME: Is it really OK to use the wrong coordinates here when view is 0? 1025 return windowPoint;
1037 // Historically the code would just crash; this is clearly no worse than tha t.
1038 return view ? view->windowToContents(windowPoint) : windowPoint;
1039 } 1026 }
1040 1027
1041 bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent) 1028 bool EventHandler::handleMousePressEvent(const PlatformMouseEvent& mouseEvent)
1042 { 1029 {
1043 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); 1030 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent");
1044 1031
1045 RefPtr<FrameView> protector(m_frame->view()); 1032 RefPtr<FrameView> protector(m_frame->view());
1046 1033
1047 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); 1034 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture);
1048 m_frame->eventHandler().m_lastMouseDownUserGestureToken = gestureIndicator.c urrentToken(); 1035 m_frame->eventHandler().m_lastMouseDownUserGestureToken = gestureIndicator.c urrentToken();
1049 1036
1050 cancelFakeMouseMoveEvent(); 1037 cancelFakeMouseMoveEvent();
1051 if (m_eventHandlerWillResetCapturingMouseEventsNode) 1038 if (m_eventHandlerWillResetCapturingMouseEventsNode)
1052 m_capturingMouseEventsNode = nullptr; 1039 m_capturingMouseEventsNode = nullptr;
1053 m_mousePressed = true; 1040 m_mousePressed = true;
1054 m_capturesDragging = true; 1041 m_capturesDragging = true;
1055 setLastKnownMousePosition(mouseEvent); 1042 setLastKnownMousePosition(mouseEvent);
1056 m_mouseDownTimestamp = mouseEvent.timestamp(); 1043 m_mouseDownTimestamp = mouseEvent.timestamp();
1057 m_mouseDownMayStartDrag = false; 1044 m_mouseDownMayStartDrag = false;
1058 m_mouseDownMayStartSelect = false; 1045 m_mouseDownMayStartSelect = false;
1059 m_mouseDownMayStartAutoscroll = false; 1046 m_mouseDownMayStartAutoscroll = false;
1060 if (FrameView* view = m_frame->view()) 1047 if (m_frame->view())
1061 m_mouseDownPos = view->windowToContents(mouseEvent.position()); 1048 m_mouseDownPos = mouseEvent.position();
1062 else { 1049 else {
1050 // FIXME(sky): Why do we have this else block at all?
1063 invalidateClick(); 1051 invalidateClick();
1064 return false; 1052 return false;
1065 } 1053 }
1066 1054
1067 // Mouse events simulated from touch should not hit-test again. 1055 // Mouse events simulated from touch should not hit-test again.
1068 ASSERT(!mouseEvent.fromTouch()); 1056 ASSERT(!mouseEvent.fromTouch());
1069 1057
1070 HitTestRequest request(HitTestRequest::Active); 1058 HitTestRequest request(HitTestRequest::Active);
1071 // Save the document point we generate in case the window coordinate is inva lidated by what happens 1059 // Save the document point we generate in case the window coordinate is inva lidated by what happens
1072 // when we dispatch the event. 1060 // when we dispatch the event.
1073 LayoutPoint documentPoint = documentPointForWindowPoint(m_frame, mouseEvent. position()); 1061 LayoutPoint documentPoint = documentPointForWindowPoint(m_frame, mouseEvent. position());
1074 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, documentPoint, mouseEvent); 1062 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, documentPoint, mouseEvent);
1075 1063
1076 if (!mev.targetNode()) { 1064 if (!mev.targetNode()) {
1077 invalidateClick(); 1065 invalidateClick();
1078 return false; 1066 return false;
1079 } 1067 }
1080 1068
1081 m_mousePressNode = mev.targetNode(); 1069 m_mousePressNode = mev.targetNode();
1082 1070
1083 m_clickCount = mouseEvent.clickCount(); 1071 m_clickCount = mouseEvent.clickCount();
1084 m_clickNode = mev.targetNode()->isTextNode() ? NodeRenderingTraversal::pare nt(mev.targetNode()) : mev.targetNode(); 1072 m_clickNode = mev.targetNode()->isTextNode() ? NodeRenderingTraversal::pare nt(mev.targetNode()) : mev.targetNode();
1085 1073
1086 if (FrameView* view = m_frame->view()) { 1074 RenderLayer* layer = mev.targetNode()->renderer() ? mev.targetNode()->render er()->enclosingLayer() : 0;
1087 RenderLayer* layer = mev.targetNode()->renderer() ? mev.targetNode()->re nderer()->enclosingLayer() : 0; 1075 IntPoint p = mouseEvent.position();
1088 IntPoint p = view->windowToContents(mouseEvent.position()); 1076 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPointInRe sizeControl(p, ResizerForPointer)) {
1089 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint InResizeControl(p, ResizerForPointer)) { 1077 m_resizeScrollableArea = layer->scrollableArea();
1090 m_resizeScrollableArea = layer->scrollableArea(); 1078 m_resizeScrollableArea->setInResizeMode(true);
1091 m_resizeScrollableArea->setInResizeMode(true); 1079 m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeCorne r(p);
1092 m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeC orner(p); 1080 invalidateClick();
1093 invalidateClick(); 1081 return true;
1094 return true;
1095 }
1096 } 1082 }
1097 1083
1098 m_frame->selection().setCaretBlinkingSuspended(true); 1084 m_frame->selection().setCaretBlinkingSuspended(true);
1099 1085
1100 bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.targe tNode(), m_clickCount, mouseEvent, true); 1086 bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.targe tNode(), m_clickCount, mouseEvent, true);
1101 swallowEvent = swallowEvent || handleMouseFocus(mouseEvent); 1087 swallowEvent = swallowEvent || handleMouseFocus(mouseEvent);
1102 m_capturesDragging = !swallowEvent || mev.scrollbar(); 1088 m_capturesDragging = !swallowEvent || mev.scrollbar();
1103 1089
1104 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults 1090 // If the hit testing originally determined the event was in a scrollbar, re fetch the MouseEventWithHitTestResults
1105 // in case the scrollbar widget was destroyed when the mouse event was handl ed. 1091 // in case the scrollbar widget was destroyed when the mouse event was handl ed.
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1162 1148
1163 Page* page = m_frame->page(); 1149 Page* page = m_frame->page();
1164 if (!page) 1150 if (!page)
1165 return result; 1151 return result;
1166 1152
1167 if (RenderLayer* layer = layerForNode(hoveredNode.innerNode())) { 1153 if (RenderLayer* layer = layerForNode(hoveredNode.innerNode())) {
1168 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer )) 1154 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer ))
1169 layerScrollableArea->mouseMovedInContentArea(); 1155 layerScrollableArea->mouseMovedInContentArea();
1170 } 1156 }
1171 1157
1172 if (FrameView* frameView = m_frame->view())
1173 frameView->mouseMovedInContentArea();
1174
1175 page->chrome().mouseDidMoveOverElement(hoveredNode, event.modifierFlags()); 1158 page->chrome().mouseDidMoveOverElement(hoveredNode, event.modifierFlags());
1176 page->chrome().setToolTip(hoveredNode); 1159 page->chrome().setToolTip(hoveredNode);
1177 1160
1178 return result; 1161 return result;
1179 } 1162 }
1180 1163
1181 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event) 1164 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event)
1182 { 1165 {
1183 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); 1166 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent");
1184 1167
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1226 HitTestRequest request(hitType); 1209 HitTestRequest request(hitType);
1227 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); 1210 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent);
1228 if (hoveredNode) 1211 if (hoveredNode)
1229 *hoveredNode = mev.hitTestResult(); 1212 *hoveredNode = mev.hitTestResult();
1230 1213
1231 Scrollbar* scrollbar = 0; 1214 Scrollbar* scrollbar = 0;
1232 1215
1233 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) 1216 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode())
1234 m_resizeScrollableArea->resize(mouseEvent, m_offsetFromResizeCorner); 1217 m_resizeScrollableArea->resize(mouseEvent, m_offsetFromResizeCorner);
1235 else { 1218 else {
1236 if (FrameView* view = m_frame->view()) 1219 scrollbar = mev.scrollbar();
1237 scrollbar = view->scrollbarAtPoint(mouseEvent.position());
1238
1239 if (!scrollbar)
1240 scrollbar = mev.scrollbar();
1241
1242 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed); 1220 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed);
1243 if (onlyUpdateScrollbars) 1221 if (onlyUpdateScrollbars)
1244 return true; 1222 return true;
1245 } 1223 }
1246 1224
1247 bool swallowEvent = false; 1225 bool swallowEvent = false;
1248 1226
1249 if (scrollbar && !m_mousePressed) 1227 if (scrollbar && !m_mousePressed)
1250 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platforms that support visual feedback on scrollbar hovering. 1228 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platforms that support visual feedback on scrollbar hovering.
1251 if (FrameView* view = m_frame->view()) { 1229 if (FrameView* view = m_frame->view()) {
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
1395 result = NodeRenderingTraversal::parent(result); 1373 result = NodeRenderingTraversal::parent(result);
1396 } 1374 }
1397 m_nodeUnderMouse = result; 1375 m_nodeUnderMouse = result;
1398 1376
1399 // Fire mouseout/mouseover if the mouse has shifted to a different node. 1377 // Fire mouseout/mouseover if the mouse has shifted to a different node.
1400 if (fireMouseOverOut) { 1378 if (fireMouseOverOut) {
1401 RenderLayer* layerForLastNode = layerForNode(m_lastNodeUnderMouse.get()) ; 1379 RenderLayer* layerForLastNode = layerForNode(m_lastNodeUnderMouse.get()) ;
1402 RenderLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get( )); 1380 RenderLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get( ));
1403 Page* page = m_frame->page(); 1381 Page* page = m_frame->page();
1404 1382
1405 if (m_lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->docu ment() != m_frame->document())) { 1383 if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerForNod eUnderMouse != layerForLastNode))) {
1406 // The mouse has moved between frames.
1407 if (LocalFrame* frame = m_lastNodeUnderMouse->document().frame()) {
1408 if (FrameView* frameView = frame->view())
1409 frameView->mouseExitedContentArea();
1410 }
1411 } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || laye rForNodeUnderMouse != layerForLastNode))) {
1412 // The mouse has moved between layers. 1384 // The mouse has moved between layers.
1413 if (ScrollableArea* scrollableAreaForLastNode = associatedScrollable Area(layerForLastNode)) 1385 if (ScrollableArea* scrollableAreaForLastNode = associatedScrollable Area(layerForLastNode))
1414 scrollableAreaForLastNode->mouseExitedContentArea(); 1386 scrollableAreaForLastNode->mouseExitedContentArea();
1415 } 1387 }
1416 1388
1417 if (m_nodeUnderMouse && (!m_lastNodeUnderMouse || m_lastNodeUnderMouse-> document() != m_frame->document())) { 1389 if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerForNod eUnderMouse != layerForLastNode))) {
1418 // The mouse has moved between frames.
1419 if (LocalFrame* frame = m_nodeUnderMouse->document().frame()) {
1420 if (FrameView* frameView = frame->view())
1421 frameView->mouseEnteredContentArea();
1422 }
1423 } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || laye rForNodeUnderMouse != layerForLastNode))) {
1424 // The mouse has moved between layers. 1390 // The mouse has moved between layers.
1425 if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScro llableArea(layerForNodeUnderMouse)) 1391 if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScro llableArea(layerForNodeUnderMouse))
1426 scrollableAreaForNodeUnderMouse->mouseEnteredContentArea(); 1392 scrollableAreaForNodeUnderMouse->mouseEnteredContentArea();
1427 } 1393 }
1428 1394
1429 if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame- >document()) { 1395 if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame- >document()) {
1430 m_lastNodeUnderMouse = nullptr; 1396 m_lastNodeUnderMouse = nullptr;
1431 m_lastScrollbarUnderMouse = nullptr; 1397 m_lastScrollbarUnderMouse = nullptr;
1432 } 1398 }
1433 1399
(...skipping 12 matching lines...) Expand all
1446 // The return value means 'continue default handling.' 1412 // The return value means 'continue default handling.'
1447 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targe tNode, int clickCount, const PlatformMouseEvent& mouseEvent, bool setUnder) 1413 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targe tNode, int clickCount, const PlatformMouseEvent& mouseEvent, bool setUnder)
1448 { 1414 {
1449 updateMouseEventTargetNode(targetNode, mouseEvent, setUnder); 1415 updateMouseEventTargetNode(targetNode, mouseEvent, setUnder);
1450 return !m_nodeUnderMouse || m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount); 1416 return !m_nodeUnderMouse || m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount);
1451 } 1417 }
1452 1418
1453 // The return value means 'swallow event' (was handled), as for other handle* fu nctions. 1419 // The return value means 'swallow event' (was handled), as for other handle* fu nctions.
1454 bool EventHandler::handleMouseFocus(const PlatformMouseEvent& mouseEvent) 1420 bool EventHandler::handleMouseFocus(const PlatformMouseEvent& mouseEvent)
1455 { 1421 {
1456 // If clicking on a frame scrollbar, do not mess up with content focus.
1457 if (FrameView* view = m_frame->view()) {
1458 if (view->scrollbarAtPoint(mouseEvent.position()))
1459 return false;
1460 }
1461
1462 // The layout needs to be up to date to determine if an element is focusable . 1422 // The layout needs to be up to date to determine if an element is focusable .
1463 m_frame->document()->updateLayoutIgnorePendingStylesheets(); 1423 m_frame->document()->updateLayoutIgnorePendingStylesheets();
1464 1424
1465 Element* element = 0; 1425 Element* element = 0;
1466 if (m_nodeUnderMouse) 1426 if (m_nodeUnderMouse)
1467 element = m_nodeUnderMouse->isElementNode() ? toElement(m_nodeUnderMouse ) : m_nodeUnderMouse->parentOrShadowHostElement(); 1427 element = m_nodeUnderMouse->isElementNode() ? toElement(m_nodeUnderMouse ) : m_nodeUnderMouse->parentOrShadowHostElement();
1468 for (; element; element = element->parentOrShadowHostElement()) { 1428 for (; element; element = element->parentOrShadowHostElement()) {
1469 if (element->isFocusable() && element->focused()) 1429 if (element->isFocusable() && element->focused())
1470 return false; 1430 return false;
1471 if (element->isMouseFocusable()) 1431 if (element->isMouseFocusable())
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1533 1493
1534 if (!doc->renderView()) 1494 if (!doc->renderView())
1535 return false; 1495 return false;
1536 1496
1537 RefPtr<FrameView> protector(m_frame->view()); 1497 RefPtr<FrameView> protector(m_frame->view());
1538 1498
1539 FrameView* view = m_frame->view(); 1499 FrameView* view = m_frame->view();
1540 if (!view) 1500 if (!view)
1541 return false; 1501 return false;
1542 1502
1543 LayoutPoint vPoint = view->windowToContents(event.position()); 1503 LayoutPoint vPoint = event.position();
1544 1504
1545 HitTestRequest request(HitTestRequest::ReadOnly); 1505 HitTestRequest request(HitTestRequest::ReadOnly);
1546 HitTestResult result(vPoint); 1506 HitTestResult result(vPoint);
1547 doc->renderView()->hitTest(request, result); 1507 doc->renderView()->hitTest(request, result);
1548 1508
1549 Node* node = result.innerNode(); 1509 Node* node = result.innerNode();
1550 // Wheel events should not dispatch to text nodes. 1510 // Wheel events should not dispatch to text nodes.
1551 if (node && node->isTextNode()) 1511 if (node && node->isTextNode())
1552 node = NodeRenderingTraversal::parent(node); 1512 node = NodeRenderingTraversal::parent(node);
1553 1513
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
1617 m_previousWheelScrolledNode = stopNode; 1577 m_previousWheelScrolledNode = stopNode;
1618 } 1578 }
1619 1579
1620 bool EventHandler::handleGestureShowPress() 1580 bool EventHandler::handleGestureShowPress()
1621 { 1581 {
1622 m_lastShowPressTimestamp = WTF::currentTime(); 1582 m_lastShowPressTimestamp = WTF::currentTime();
1623 1583
1624 FrameView* view = m_frame->view(); 1584 FrameView* view = m_frame->view();
1625 if (!view) 1585 if (!view)
1626 return false; 1586 return false;
1627 if (ScrollAnimator* scrollAnimator = view->existingScrollAnimator())
1628 scrollAnimator->cancelAnimations();
1629 const FrameView::ScrollableAreaSet* areas = view->scrollableAreas(); 1587 const FrameView::ScrollableAreaSet* areas = view->scrollableAreas();
1630 if (!areas) 1588 if (!areas)
1631 return false; 1589 return false;
1632 for (FrameView::ScrollableAreaSet::const_iterator it = areas->begin(); it != areas->end(); ++it) { 1590 for (FrameView::ScrollableAreaSet::const_iterator it = areas->begin(); it != areas->end(); ++it) {
1633 ScrollableArea* sa = *it; 1591 ScrollableArea* sa = *it;
1634 ScrollAnimator* animator = sa->existingScrollAnimator(); 1592 ScrollAnimator* animator = sa->existingScrollAnimator();
1635 if (animator) 1593 if (animator)
1636 animator->cancelAnimations(); 1594 animator->cancelAnimations();
1637 } 1595 }
1638 return false; 1596 return false;
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1713 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) { 1671 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) {
1714 scrollbar = m_scrollbarHandlingScrollGesture.get(); 1672 scrollbar = m_scrollbarHandlingScrollGesture.get();
1715 eventTarget = m_scrollGestureHandlingNode.get(); 1673 eventTarget = m_scrollGestureHandlingNode.get();
1716 } 1674 }
1717 1675
1718 if (!eventTarget) { 1676 if (!eventTarget) {
1719 Document* document = m_frame->document(); 1677 Document* document = m_frame->document();
1720 if (!document->renderView()) 1678 if (!document->renderView())
1721 return false; 1679 return false;
1722 1680
1723 FrameView* view = m_frame->view(); 1681 LayoutPoint viewPoint = gestureEvent.position();
1724 LayoutPoint viewPoint = view->windowToContents(gestureEvent.position());
1725 HitTestRequest request(HitTestRequest::ReadOnly); 1682 HitTestRequest request(HitTestRequest::ReadOnly);
1726 HitTestResult result(viewPoint); 1683 HitTestResult result(viewPoint);
1727 document->renderView()->hitTest(request, result); 1684 document->renderView()->hitTest(request, result);
1728 1685
1729 eventTarget = result.innerNode(); 1686 eventTarget = result.innerNode();
1730 1687
1731 m_lastGestureScrollOverWidget = result.isOverWidget(); 1688 m_lastGestureScrollOverWidget = result.isOverWidget();
1732 m_scrollGestureHandlingNode = eventTarget; 1689 m_scrollGestureHandlingNode = eventTarget;
1733 m_previousGestureScrolledNode = nullptr; 1690 m_previousGestureScrolledNode = nullptr;
1734 1691
1735 if (!scrollbar) 1692 if (!scrollbar)
1736 scrollbar = view->scrollbarAtPoint(gestureEvent.position());
1737 if (!scrollbar)
1738 scrollbar = result.scrollbar(); 1693 scrollbar = result.scrollbar();
1739 } 1694 }
1740 1695
1741 if (scrollbar) { 1696 if (scrollbar) {
1742 bool eventSwallowed = scrollbar->gestureEvent(gestureEvent); 1697 bool eventSwallowed = scrollbar->gestureEvent(gestureEvent);
1743 if (gestureEvent.type() == PlatformEvent::GestureScrollEnd 1698 if (gestureEvent.type() == PlatformEvent::GestureScrollEnd
1744 || gestureEvent.type() == PlatformEvent::GestureFlingStart 1699 || gestureEvent.type() == PlatformEvent::GestureFlingStart
1745 || !eventSwallowed) { 1700 || !eventSwallowed) {
1746 m_scrollbarHandlingScrollGesture = nullptr; 1701 m_scrollbarHandlingScrollGesture = nullptr;
1747 } 1702 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 if (gestureEvent.metaKey()) 1746 if (gestureEvent.metaKey())
1792 modifierFlags |= PlatformEvent::MetaKey; 1747 modifierFlags |= PlatformEvent::MetaKey;
1793 if (gestureEvent.shiftKey()) 1748 if (gestureEvent.shiftKey())
1794 modifierFlags |= PlatformEvent::ShiftKey; 1749 modifierFlags |= PlatformEvent::ShiftKey;
1795 PlatformEvent::Modifiers modifiers = static_cast<PlatformEvent::Modifiers>(m odifierFlags); 1750 PlatformEvent::Modifiers modifiers = static_cast<PlatformEvent::Modifiers>(m odifierFlags);
1796 1751
1797 HitTestResult currentHitTest = targetedEvent.hitTestResult(); 1752 HitTestResult currentHitTest = targetedEvent.hitTestResult();
1798 1753
1799 // We use the adjusted position so the application isn't surprised to see a event with 1754 // We use the adjusted position so the application isn't surprised to see a event with
1800 // co-ordinates outside the target's bounds. 1755 // co-ordinates outside the target's bounds.
1801 IntPoint adjustedPoint = m_frame->view()->windowToContents(gestureEvent.posi tion()); 1756 IntPoint adjustedPoint = gestureEvent.position();
1802 1757
1803 PlatformMouseEvent fakeMouseMove(adjustedPoint, gestureEvent.globalPosition( ), 1758 PlatformMouseEvent fakeMouseMove(adjustedPoint, gestureEvent.globalPosition( ),
1804 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, 1759 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0,
1805 modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); 1760 modifiers, PlatformMouseEvent::FromTouch, gestureEvent.timestamp());
1806 dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0, fakeMouseMove, true); 1761 dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0, fakeMouseMove, true);
1807 1762
1808 // Do a new hit-test in case the mousemove event changed the DOM. 1763 // Do a new hit-test in case the mousemove event changed the DOM.
1809 // Note that if the original hit test wasn't over an element (eg. was over a scrollbar) we 1764 // Note that if the original hit test wasn't over an element (eg. was over a scrollbar) we
1810 // don't want to re-hit-test because it may be in the wrong frame (and there 's no way the page 1765 // don't want to re-hit-test because it may be in the wrong frame (and there 's no way the page
1811 // could have seen the event anyway). 1766 // could have seen the event anyway).
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1855 // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests here (re-using the 1810 // FIXME: Ideally we should try to remove the extra mouse-specific hit-tests here (re-using the
1856 // supplied HitTestResult), but that will require some overhaul of the touch drag-and-drop code 1811 // supplied HitTestResult), but that will require some overhaul of the touch drag-and-drop code
1857 // and LongPress is such a special scenario that it's unlikely to matter muc h in practice. 1812 // and LongPress is such a special scenario that it's unlikely to matter muc h in practice.
1858 1813
1859 #if OS(ANDROID) 1814 #if OS(ANDROID)
1860 bool shouldLongPressSelectWord = true; 1815 bool shouldLongPressSelectWord = true;
1861 #else 1816 #else
1862 bool shouldLongPressSelectWord = m_frame->settings() && m_frame->settings()- >touchEditingEnabled(); 1817 bool shouldLongPressSelectWord = m_frame->settings() && m_frame->settings()- >touchEditingEnabled();
1863 #endif 1818 #endif
1864 if (shouldLongPressSelectWord) { 1819 if (shouldLongPressSelectWord) {
1865 IntPoint hitTestPoint = m_frame->view()->windowToContents(gestureEvent.p osition()); 1820 IntPoint hitTestPoint = gestureEvent.position();
1866 HitTestResult result = hitTestResultAtPoint(hitTestPoint); 1821 HitTestResult result = hitTestResultAtPoint(hitTestPoint);
1867 Node* innerNode = result.targetNode(); 1822 Node* innerNode = result.targetNode();
1868 if (!result.isLiveLink() && innerNode && (innerNode->isContentEditable() || innerNode->isTextNode())) { 1823 if (!result.isLiveLink() && innerNode && (innerNode->isContentEditable() || innerNode->isTextNode())) {
1869 selectClosestWordFromHitTestResult(result, DontAppendTrailingWhitesp ace); 1824 selectClosestWordFromHitTestResult(result, DontAppendTrailingWhitesp ace);
1870 if (m_frame->selection().isRange()) { 1825 if (m_frame->selection().isRange()) {
1871 focusDocumentView(); 1826 focusDocumentView();
1872 return true; 1827 return true;
1873 } 1828 }
1874 } 1829 }
1875 } 1830 }
1876 return true; 1831 return true;
1877 } 1832 }
1878 1833
1879 bool EventHandler::handleGestureLongTap(const GestureEventWithHitTestResults& ta rgetedEvent) 1834 bool EventHandler::handleGestureLongTap(const GestureEventWithHitTestResults& ta rgetedEvent)
1880 { 1835 {
1881 return false; 1836 return false;
1882 } 1837 }
1883 1838
1884 bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const Platfor mGestureEvent& gestureEvent) { 1839 bool EventHandler::handleScrollGestureOnResizer(Node* eventTarget, const Platfor mGestureEvent& gestureEvent) {
1885 if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) { 1840 if (gestureEvent.type() == PlatformEvent::GestureScrollBegin) {
1886 RenderLayer* layer = eventTarget->renderer() ? eventTarget->renderer()-> enclosingLayer() : 0; 1841 RenderLayer* layer = eventTarget->renderer() ? eventTarget->renderer()-> enclosingLayer() : 0;
1887 IntPoint p = m_frame->view()->windowToContents(gestureEvent.position()); 1842 IntPoint p = gestureEvent.position();
1888 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint InResizeControl(p, ResizerForTouch)) { 1843 if (layer && layer->scrollableArea() && layer->scrollableArea()->isPoint InResizeControl(p, ResizerForTouch)) {
1889 m_resizeScrollableArea = layer->scrollableArea(); 1844 m_resizeScrollableArea = layer->scrollableArea();
1890 m_resizeScrollableArea->setInResizeMode(true); 1845 m_resizeScrollableArea->setInResizeMode(true);
1891 m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeC orner(p); 1846 m_offsetFromResizeCorner = m_resizeScrollableArea->offsetFromResizeC orner(p);
1892 return true; 1847 return true;
1893 } 1848 }
1894 } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate || 1849 } else if (gestureEvent.type() == PlatformEvent::GestureScrollUpdate ||
1895 gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutP ropagation) { 1850 gestureEvent.type() == PlatformEvent::GestureScrollUpdateWithoutP ropagation) {
1896 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) { 1851 if (m_resizeScrollableArea && m_resizeScrollableArea->inResizeMode()) {
1897 m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorne r); 1852 m_resizeScrollableArea->resize(gestureEvent, m_offsetFromResizeCorne r);
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
2069 2024
2070 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; 2025 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes;
2071 copyToVector(result.rectBasedTestResult(), nodes); 2026 copyToVector(result.rectBasedTestResult(), nodes);
2072 2027
2073 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful. 2028 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful.
2074 return findBestClickableCandidate(targetNode, targetPoint, touchCenter, touc hRect, WillBeHeapVector<RefPtrWillBeMember<Node> > (nodes)); 2029 return findBestClickableCandidate(targetNode, targetPoint, touchCenter, touc hRect, WillBeHeapVector<RefPtrWillBeMember<Node> > (nodes));
2075 } 2030 }
2076 2031
2077 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, co nst IntSize& touchRadius, IntRect& targetArea, Node*& targetNode) 2032 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, co nst IntSize& touchRadius, IntRect& targetArea, Node*& targetNode)
2078 { 2033 {
2079 IntPoint hitTestPoint = m_frame->view()->windowToContents(touchCenter); 2034 HitTestResult result = hitTestResultAtPoint(touchCenter, HitTestRequest::Rea dOnly | HitTestRequest::Active, touchRadius);
2080 HitTestResult result = hitTestResultAtPoint(hitTestPoint, HitTestRequest::Re adOnly | HitTestRequest::Active, touchRadius);
2081 2035
2082 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius); 2036 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius);
2083 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; 2037 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes;
2084 copyToVector(result.rectBasedTestResult(), nodes); 2038 copyToVector(result.rectBasedTestResult(), nodes);
2085 2039
2086 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful. 2040 // FIXME: the explicit Vector conversion copies into a temporary and is wast eful.
2087 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect, WillBeHeapVector<RefPtrWillBeMember<Node> >(nodes)); 2041 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect, WillBeHeapVector<RefPtrWillBeMember<Node> >(nodes));
2088 } 2042 }
2089 2043
2090 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe stureEvent& gestureEvent, bool readOnly) 2044 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe stureEvent& gestureEvent, bool readOnly)
(...skipping 12 matching lines...) Expand all
2103 // for at least a couple of frames. 2057 // for at least a couple of frames.
2104 activeInterval = WTF::currentTime() - m_lastShowPressTimestamp; 2058 activeInterval = WTF::currentTime() - m_lastShowPressTimestamp;
2105 shouldKeepActiveForMinInterval = m_lastShowPressTimestamp && activeInter val < minimumActiveInterval; 2059 shouldKeepActiveForMinInterval = m_lastShowPressTimestamp && activeInter val < minimumActiveInterval;
2106 if (shouldKeepActiveForMinInterval) 2060 if (shouldKeepActiveForMinInterval)
2107 hitType |= HitTestRequest::ReadOnly; 2061 hitType |= HitTestRequest::ReadOnly;
2108 } 2062 }
2109 2063
2110 // Perform the rect-based hit-test. Note that we don't yet apply hover/activ e state here 2064 // Perform the rect-based hit-test. Note that we don't yet apply hover/activ e state here
2111 // because we need to resolve touch adjustment first so that we apply hover/ active it to 2065 // because we need to resolve touch adjustment first so that we apply hover/ active it to
2112 // the final adjusted node. 2066 // the final adjusted node.
2113 IntPoint hitTestPoint = m_frame->view()->windowToContents(gestureEvent.posit ion()); 2067 IntPoint hitTestPoint = gestureEvent.position();
2114 IntSize touchRadius = gestureEvent.area(); 2068 IntSize touchRadius = gestureEvent.area();
2115 touchRadius.scale(1.f / 2); 2069 touchRadius.scale(1.f / 2);
2116 // FIXME: We should not do a rect-based hit-test if touch adjustment is disa bled. 2070 // FIXME: We should not do a rect-based hit-test if touch adjustment is disa bled.
2117 HitTestResult hitTestResult = hitTestResultAtPoint(hitTestPoint, hitType | H itTestRequest::ReadOnly, touchRadius); 2071 HitTestResult hitTestResult = hitTestResultAtPoint(hitTestPoint, hitType | H itTestRequest::ReadOnly, touchRadius);
2118 2072
2119 // Hit-test the main frame scrollbars (in addition to the child-frame and Re nderLayer
2120 // scroll bars checked by the hit-test code.
2121 if (!hitTestResult.scrollbar()) {
2122 if (FrameView* view = m_frame->view()) {
2123 hitTestResult.setScrollbar(view->scrollbarAtPoint(gestureEvent.posit ion()));
2124 }
2125 }
2126
2127 // Adjust the location of the gesture to the most likely nearby node, as app ropriate for the 2073 // Adjust the location of the gesture to the most likely nearby node, as app ropriate for the
2128 // type of event. 2074 // type of event.
2129 PlatformGestureEvent adjustedEvent = gestureEvent; 2075 PlatformGestureEvent adjustedEvent = gestureEvent;
2130 applyTouchAdjustment(&adjustedEvent, &hitTestResult); 2076 applyTouchAdjustment(&adjustedEvent, &hitTestResult);
2131 2077
2132 // Do a new hit-test at the (adjusted) gesture co-ordinates. This is necessa ry because 2078 // Do a new hit-test at the (adjusted) gesture co-ordinates. This is necessa ry because
2133 // rect-based hit testing and touch adjustment sometimes return a different node than 2079 // rect-based hit testing and touch adjustment sometimes return a different node than
2134 // what a point-based hit test would return for the same point. 2080 // what a point-based hit test would return for the same point.
2135 // FIXME: Fix touch adjustment to avoid the need for a redundant hit test. h ttp://crbug.com/398914 2081 // FIXME: Fix touch adjustment to avoid the need for a redundant hit test. h ttp://crbug.com/398914
2136 if (shouldApplyTouchAdjustment(gestureEvent)) { 2082 if (shouldApplyTouchAdjustment(gestureEvent)) {
2137 LocalFrame* hitFrame = hitTestResult.innerNodeFrame(); 2083 LocalFrame* hitFrame = hitTestResult.innerNodeFrame();
2138 if (!hitFrame) 2084 if (!hitFrame)
2139 hitFrame = m_frame; 2085 hitFrame = m_frame;
2140 hitTestResult = hitTestResultInFrame(hitFrame, hitFrame->view()->windowT oContents(adjustedEvent.position()), hitType | HitTestRequest::ReadOnly); 2086 hitTestResult = hitTestResultInFrame(hitFrame, adjustedEvent.position(), hitType | HitTestRequest::ReadOnly);
2141 // FIXME: HitTest entry points should really check for main frame scroll bars themselves.
2142 if (!hitTestResult.scrollbar()) {
2143 if (FrameView* view = m_frame->view()) {
2144 hitTestResult.setScrollbar(view->scrollbarAtPoint(gestureEvent.p osition()));
2145 }
2146 }
2147 } 2087 }
2148 2088
2149 // Now apply hover/active state to the final target. 2089 // Now apply hover/active state to the final target.
2150 // FIXME: This is supposed to send mouseenter/mouseleave events, but doesn't because we 2090 // FIXME: This is supposed to send mouseenter/mouseleave events, but doesn't because we
2151 // aren't passing a PlatformMouseEvent. 2091 // aren't passing a PlatformMouseEvent.
2152 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent); 2092 HitTestRequest request(hitType | HitTestRequest::AllowChildFrameContent);
2153 if (!request.readOnly()) 2093 if (!request.readOnly())
2154 m_frame->document()->updateHoverActiveState(request, hitTestResult.inner Element()); 2094 m_frame->document()->updateHoverActiveState(request, hitTestResult.inner Element());
2155 2095
2156 if (shouldKeepActiveForMinInterval) { 2096 if (shouldKeepActiveForMinInterval) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2207 case PlatformEvent::GestureTwoFingerTap: 2147 case PlatformEvent::GestureTwoFingerTap:
2208 adjusted = bestClickableNodeForHitTestResult(*hitTestResult, adjustedPoi nt, adjustedNode); 2148 adjusted = bestClickableNodeForHitTestResult(*hitTestResult, adjustedPoi nt, adjustedNode);
2209 break; 2149 break;
2210 default: 2150 default:
2211 ASSERT_NOT_REACHED(); 2151 ASSERT_NOT_REACHED();
2212 } 2152 }
2213 2153
2214 // Update the hit-test result to be a point-based result instead of a rect-b ased result. 2154 // Update the hit-test result to be a point-based result instead of a rect-b ased result.
2215 // FIXME: We should do this even when no candidate matches the node filter. crbug.com/398914 2155 // FIXME: We should do this even when no candidate matches the node filter. crbug.com/398914
2216 if (adjusted) { 2156 if (adjusted) {
2217 hitTestResult->resolveRectBasedTest(adjustedNode, m_frame->view()->windo wToContents(adjustedPoint)); 2157 hitTestResult->resolveRectBasedTest(adjustedNode, adjustedPoint);
2218 gestureEvent->applyTouchAdjustment(adjustedPoint); 2158 gestureEvent->applyTouchAdjustment(adjustedPoint);
2219 } 2159 }
2220 } 2160 }
2221 2161
2222 void EventHandler::scheduleHoverStateUpdate() 2162 void EventHandler::scheduleHoverStateUpdate()
2223 { 2163 {
2224 if (!m_hoverTimer.isActive()) 2164 if (!m_hoverTimer.isActive())
2225 m_hoverTimer.startOneShot(0, FROM_HERE); 2165 m_hoverTimer.startOneShot(0, FROM_HERE);
2226 } 2166 }
2227 2167
(...skipping 28 matching lines...) Expand all
2256 m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveShortInterval, F ROM_HERE); 2196 m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveShortInterval, F ROM_HERE);
2257 } 2197 }
2258 } 2198 }
2259 2199
2260 void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad) 2200 void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad)
2261 { 2201 {
2262 FrameView* view = m_frame->view(); 2202 FrameView* view = m_frame->view();
2263 if (!view) 2203 if (!view)
2264 return; 2204 return;
2265 2205
2266 if (!quad.containsPoint(view->windowToContents(m_lastKnownMousePosition))) 2206 if (!quad.containsPoint(m_lastKnownMousePosition))
2267 return; 2207 return;
2268 2208
2269 dispatchFakeMouseMoveEventSoon(); 2209 dispatchFakeMouseMoveEventSoon();
2270 } 2210 }
2271 2211
2272 void EventHandler::fakeMouseMoveEventTimerFired(Timer<EventHandler>* timer) 2212 void EventHandler::fakeMouseMoveEventTimerFired(Timer<EventHandler>* timer)
2273 { 2213 {
2274 ASSERT_UNUSED(timer, timer == &m_fakeMouseMoveEventTimer); 2214 ASSERT_UNUSED(timer, timer == &m_fakeMouseMoveEventTimer);
2275 ASSERT(!m_mousePressed); 2215 ASSERT(!m_mousePressed);
2276 2216
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2315 } 2255 }
2316 2256
2317 void EventHandler::hoverTimerFired(Timer<EventHandler>*) 2257 void EventHandler::hoverTimerFired(Timer<EventHandler>*)
2318 { 2258 {
2319 m_hoverTimer.stop(); 2259 m_hoverTimer.stop();
2320 2260
2321 ASSERT(m_frame); 2261 ASSERT(m_frame);
2322 ASSERT(m_frame->document()); 2262 ASSERT(m_frame->document());
2323 2263
2324 if (RenderView* renderer = m_frame->contentRenderer()) { 2264 if (RenderView* renderer = m_frame->contentRenderer()) {
2325 if (FrameView* view = m_frame->view()) { 2265 HitTestRequest request(HitTestRequest::Move);
2326 HitTestRequest request(HitTestRequest::Move); 2266 HitTestResult result(m_lastKnownMousePosition);
2327 HitTestResult result(view->windowToContents(m_lastKnownMousePosition )); 2267 renderer->hitTest(request, result);
2328 renderer->hitTest(request, result); 2268 m_frame->document()->updateHoverActiveState(request, result.innerElement ());
2329 m_frame->document()->updateHoverActiveState(request, result.innerEle ment());
2330 }
2331 } 2269 }
2332 } 2270 }
2333 2271
2334 void EventHandler::activeIntervalTimerFired(Timer<EventHandler>*) 2272 void EventHandler::activeIntervalTimerFired(Timer<EventHandler>*)
2335 { 2273 {
2336 m_activeIntervalTimer.stop(); 2274 m_activeIntervalTimer.stop();
2337 2275
2338 if (m_frame 2276 if (m_frame
2339 && m_frame->document() 2277 && m_frame->document()
2340 && m_lastDeferredTapElement) { 2278 && m_lastDeferredTapElement) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
2464 bool EventHandler::dragHysteresisExceeded(const FloatPoint& floatDragViewportLoc ation) const 2402 bool EventHandler::dragHysteresisExceeded(const FloatPoint& floatDragViewportLoc ation) const
2465 { 2403 {
2466 return dragHysteresisExceeded(flooredIntPoint(floatDragViewportLocation)); 2404 return dragHysteresisExceeded(flooredIntPoint(floatDragViewportLocation));
2467 } 2405 }
2468 2406
2469 bool EventHandler::dragHysteresisExceeded(const IntPoint& dragViewportLocation) const 2407 bool EventHandler::dragHysteresisExceeded(const IntPoint& dragViewportLocation) const
2470 { 2408 {
2471 FrameView* view = m_frame->view(); 2409 FrameView* view = m_frame->view();
2472 if (!view) 2410 if (!view)
2473 return false; 2411 return false;
2474 IntPoint dragLocation = view->windowToContents(dragViewportLocation); 2412 IntPoint dragLocation = dragViewportLocation;
2475 IntSize delta = dragLocation - m_mouseDownPos; 2413 IntSize delta = dragLocation - m_mouseDownPos;
2476 2414
2477 int threshold = 3; 2415 int threshold = 3;
2478 2416
2479 return abs(delta.width()) >= threshold || abs(delta.height()) >= threshold; 2417 return abs(delta.width()) >= threshold || abs(delta.height()) >= threshold;
2480 } 2418 }
2481 2419
2482 bool EventHandler::handleTextInputEvent(const String& text, Event* underlyingEve nt, TextEventInputType inputType) 2420 bool EventHandler::handleTextInputEvent(const String& text, Event* underlyingEve nt, TextEventInputType inputType)
2483 { 2421 {
2484 // Platforms should differentiate real commands like selectAll from text inp ut in disguise (like insertNewline), 2422 // Platforms should differentiate real commands like selectAll from text inp ut in disguise (like insertNewline),
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2534 } 2472 }
2535 2473
2536 void EventHandler::setFrameWasScrolledByUser() 2474 void EventHandler::setFrameWasScrolledByUser()
2537 { 2475 {
2538 if (FrameView* view = m_frame->view()) 2476 if (FrameView* view = m_frame->view())
2539 view->setWasScrolledByUser(true); 2477 view->setWasScrolledByUser(true);
2540 } 2478 }
2541 2479
2542 bool EventHandler::passMousePressEventToScrollbar(MouseEventWithHitTestResults& mev) 2480 bool EventHandler::passMousePressEventToScrollbar(MouseEventWithHitTestResults& mev)
2543 { 2481 {
2544 // First try to use the frame scrollbar. 2482 // FIXME(sky): Remove
2545 FrameView* view = m_frame->view(); 2483 return false;
2546 Scrollbar* scrollbar = view ? view->scrollbarAtPoint(mev.event().position()) : 0;
2547
2548 // Then try the scrollbar in the hit test.
2549 if (!scrollbar)
2550 scrollbar = mev.scrollbar();
2551
2552 updateLastScrollbarUnderMouse(scrollbar, true);
2553
2554 if (!scrollbar || !scrollbar->enabled())
2555 return false;
2556 setFrameWasScrolledByUser();
2557 scrollbar->mouseDown(mev.event());
2558 return true;
2559 } 2484 }
2560 2485
2561 // If scrollbar (under mouse) is different from last, send a mouse exited. Set 2486 // If scrollbar (under mouse) is different from last, send a mouse exited. Set
2562 // last to scrollbar if setLast is true; else set last to 0. 2487 // last to scrollbar if setLast is true; else set last to 0.
2563 void EventHandler::updateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool setL ast) 2488 void EventHandler::updateLastScrollbarUnderMouse(Scrollbar* scrollbar, bool setL ast)
2564 { 2489 {
2565 if (m_lastScrollbarUnderMouse != scrollbar) { 2490 if (m_lastScrollbarUnderMouse != scrollbar) {
2566 // Send mouse exited to the old scrollbar. 2491 // Send mouse exited to the old scrollbar.
2567 if (m_lastScrollbarUnderMouse) 2492 if (m_lastScrollbarUnderMouse)
2568 m_lastScrollbarUnderMouse->mouseExited(); 2493 m_lastScrollbarUnderMouse->mouseExited();
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
2653 2578
2654 // First do hit tests for any new touch points. 2579 // First do hit tests for any new touch points.
2655 for (i = 0; i < points.size(); ++i) { 2580 for (i = 0; i < points.size(); ++i) {
2656 const PlatformTouchPoint& point = points[i]; 2581 const PlatformTouchPoint& point = points[i];
2657 2582
2658 // Touch events implicitly capture to the touched node, and don't change 2583 // Touch events implicitly capture to the touched node, and don't change
2659 // active/hover states themselves (Gesture events do). So we only need 2584 // active/hover states themselves (Gesture events do). So we only need
2660 // to hit-test on touchstart, and it can be read-only. 2585 // to hit-test on touchstart, and it can be read-only.
2661 if (point.state() == PlatformTouchPoint::TouchPressed) { 2586 if (point.state() == PlatformTouchPoint::TouchPressed) {
2662 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEv ent | HitTestRequest::ReadOnly | HitTestRequest::Active; 2587 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEv ent | HitTestRequest::ReadOnly | HitTestRequest::Active;
2663 LayoutPoint pagePoint = roundedLayoutPoint(m_frame->view()->windowTo Contents(point.pos())); 2588 LayoutPoint pagePoint = roundedLayoutPoint(point.pos());
2664 HitTestResult result; 2589 HitTestResult result;
2665 if (!m_touchSequenceDocument) { 2590 if (!m_touchSequenceDocument) {
2666 result = hitTestResultAtPoint(pagePoint, hitType); 2591 result = hitTestResultAtPoint(pagePoint, hitType);
2667 } else if (m_touchSequenceDocument->frame()) { 2592 } else if (m_touchSequenceDocument->frame()) {
2668 LayoutPoint framePoint = roundedLayoutPoint(m_touchSequenceDocum ent->frame()->view()->windowToContents(point.pos())); 2593 LayoutPoint framePoint = roundedLayoutPoint(point.pos());
2669 result = hitTestResultInFrame(m_touchSequenceDocument->frame(), framePoint, hitType); 2594 result = hitTestResultInFrame(m_touchSequenceDocument->frame(), framePoint, hitType);
2670 } else 2595 } else
2671 continue; 2596 continue;
2672 2597
2673 Node* node = result.innerNode(); 2598 Node* node = result.innerNode();
2674 if (!node) 2599 if (!node)
2675 continue; 2600 continue;
2676 2601
2677 // Touch events should not go to text nodes 2602 // Touch events should not go to text nodes
2678 if (node->isTextNode()) 2603 if (node->isTextNode())
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
2776 // Document so that there's some valid node here. Perhaps this 2701 // Document so that there's some valid node here. Perhaps this
2777 // should really be LocalDOMWindow, but in all other cases the targe t of 2702 // should really be LocalDOMWindow, but in all other cases the targe t of
2778 // a Touch is a Node so using the window could be a breaking change. 2703 // a Touch is a Node so using the window could be a breaking change.
2779 // Since we know there was no handler invoked, the specific target 2704 // Since we know there was no handler invoked, the specific target
2780 // should be completely irrelevant to the application. 2705 // should be completely irrelevant to the application.
2781 touchTarget = m_touchSequenceDocument; 2706 touchTarget = m_touchSequenceDocument;
2782 targetFrame = m_touchSequenceDocument->frame(); 2707 targetFrame = m_touchSequenceDocument->frame();
2783 } 2708 }
2784 ASSERT(targetFrame); 2709 ASSERT(targetFrame);
2785 2710
2786 // pagePoint should always be relative to the target elements 2711 FloatPoint pagePoint = point.pos();
2787 // containing frame.
2788 FloatPoint pagePoint = targetFrame->view()->windowToContents(point.pos() );
2789 2712
2790 float scaleFactor = 1.0f / targetFrame->pageZoomFactor(); 2713 float scaleFactor = 1.0f / targetFrame->pageZoomFactor();
2791 2714
2792 FloatPoint adjustedPagePoint = pagePoint.scaledBy(scaleFactor); 2715 FloatPoint adjustedPagePoint = pagePoint.scaledBy(scaleFactor);
2793 FloatSize adjustedRadius = point.radius().scaledBy(scaleFactor); 2716 FloatSize adjustedRadius = point.radius().scaledBy(scaleFactor);
2794 2717
2795 RefPtrWillBeRawPtr<Touch> touch = Touch::create( 2718 RefPtrWillBeRawPtr<Touch> touch = Touch::create(
2796 targetFrame, touchTarget.get(), point.id(), point.screenPos(), adjus tedPagePoint, adjustedRadius, point.rotationAngle(), point.force()); 2719 targetFrame, touchTarget.get(), point.id(), point.screenPos(), adjus tedPagePoint, adjustedRadius, point.rotationAngle(), point.force());
2797 2720
2798 // Ensure this target's touch list exists, even if it ends up empty, so 2721 // Ensure this target's touch list exists, even if it ends up empty, so
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
2930 unsigned EventHandler::accessKeyModifiers() 2853 unsigned EventHandler::accessKeyModifiers()
2931 { 2854 {
2932 #if OS(MACOSX) 2855 #if OS(MACOSX)
2933 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 2856 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
2934 #else 2857 #else
2935 return PlatformEvent::AltKey; 2858 return PlatformEvent::AltKey;
2936 #endif 2859 #endif
2937 } 2860 }
2938 2861
2939 } // namespace blink 2862 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698