Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 64 #include "core/loader/DocumentLoader.h" | 64 #include "core/loader/DocumentLoader.h" |
| 65 #include "core/loader/FrameLoader.h" | 65 #include "core/loader/FrameLoader.h" |
| 66 #include "core/loader/UniqueIdentifier.h" | 66 #include "core/loader/UniqueIdentifier.h" |
| 67 #include "core/page/Chrome.h" | 67 #include "core/page/Chrome.h" |
| 68 #include "core/page/ContextMenuController.h" | 68 #include "core/page/ContextMenuController.h" |
| 69 #include "core/page/ContextMenuProvider.h" | 69 #include "core/page/ContextMenuProvider.h" |
| 70 #include "core/page/DragController.h" | 70 #include "core/page/DragController.h" |
| 71 #include "core/page/DragData.h" | 71 #include "core/page/DragData.h" |
| 72 #include "core/page/DragSession.h" | 72 #include "core/page/DragSession.h" |
| 73 #include "core/page/EventHandler.h" | 73 #include "core/page/EventHandler.h" |
| 74 #include "core/page/EventWithHitTestResults.h" | |
| 75 #include "core/page/FocusController.h" | 74 #include "core/page/FocusController.h" |
| 76 #include "core/page/FrameTree.h" | 75 #include "core/page/FrameTree.h" |
| 77 #include "core/page/InjectedStyleSheets.h" | 76 #include "core/page/InjectedStyleSheets.h" |
| 78 #include "core/page/Page.h" | 77 #include "core/page/Page.h" |
| 79 #include "core/page/PagePopupClient.h" | 78 #include "core/page/PagePopupClient.h" |
| 80 #include "core/page/PointerLockController.h" | 79 #include "core/page/PointerLockController.h" |
| 81 #include "core/page/ScopedPageLoadDeferrer.h" | 80 #include "core/page/ScopedPageLoadDeferrer.h" |
| 82 #include "core/page/TouchDisambiguation.h" | 81 #include "core/page/TouchDisambiguation.h" |
| 83 #include "core/rendering/RenderView.h" | 82 #include "core/rendering/RenderView.h" |
| 84 #include "core/rendering/RenderWidget.h" | 83 #include "core/rendering/RenderWidget.h" |
| (...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 651 eventSwallowed = true; | 650 eventSwallowed = true; |
| 652 | 651 |
| 653 m_client->didHandleGestureEvent(event, eventCancelled); | 652 m_client->didHandleGestureEvent(event, eventCancelled); |
| 654 return eventSwallowed; | 653 return eventSwallowed; |
| 655 default: | 654 default: |
| 656 break; | 655 break; |
| 657 } | 656 } |
| 658 | 657 |
| 659 PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), even t); | 658 PlatformGestureEventBuilder platformEvent(mainFrameImpl()->frameView(), even t); |
| 660 | 659 |
| 661 // FIXME: Remove redundant hit tests by pushing the call to EventHandler::ta rgetGestureEvent | 660 HitTestResult emptyResult; |
|
Rick Byers
2014/08/20 23:59:33
As discussed, having this "sometimes targetted but
Zeeshan Qureshi
2014/08/21 04:59:25
Done.
| |
| 662 // up to this point and pass GestureEventWithHitTestResults around. | 661 GestureEventWithHitTestResults targetedEvent(platformEvent, emptyResult); |
| 662 // Hit test across all frames and do touch adjustment as necessary for the e vent type. | |
| 663 if (!platformEvent.isScrollEvent()) | |
| 664 targetedEvent = m_page->deprecatedLocalMainFrame()->eventHandler().targe tGestureEvent(platformEvent); | |
| 663 | 665 |
| 664 // Handle link highlighting outside the main switch to avoid getting lost in the | 666 // Handle link highlighting outside the main switch to avoid getting lost in the |
| 665 // complicated set of cases handled below. | 667 // complicated set of cases handled below. |
| 666 switch (event.type) { | 668 switch (event.type) { |
| 667 case WebInputEvent::GestureShowPress: | 669 case WebInputEvent::GestureShowPress: |
| 668 // Queue a highlight animation, then hand off to regular handler. | 670 // Queue a highlight animation, then hand off to regular handler. |
| 669 enableTapHighlightAtPoint(platformEvent); | 671 enableTapHighlightAtPoint(targetedEvent); |
| 670 break; | 672 break; |
| 671 case WebInputEvent::GestureTapCancel: | 673 case WebInputEvent::GestureTapCancel: |
| 672 case WebInputEvent::GestureTap: | 674 case WebInputEvent::GestureTap: |
| 673 case WebInputEvent::GestureLongPress: | 675 case WebInputEvent::GestureLongPress: |
| 674 for (size_t i = 0; i < m_linkHighlights.size(); ++i) | 676 for (size_t i = 0; i < m_linkHighlights.size(); ++i) |
| 675 m_linkHighlights[i]->startHighlightAnimationIfNeeded(); | 677 m_linkHighlights[i]->startHighlightAnimationIfNeeded(); |
| 676 break; | 678 break; |
| 677 default: | 679 default: |
| 678 break; | 680 break; |
| 679 } | 681 } |
| 680 | 682 |
| 681 switch (event.type) { | 683 switch (event.type) { |
| 682 case WebInputEvent::GestureTap: { | 684 case WebInputEvent::GestureTap: { |
| 683 m_client->cancelScheduledContentIntents(); | 685 m_client->cancelScheduledContentIntents(); |
| 684 if (detectContentOnTouch(platformEvent.position())) { | 686 if (detectContentOnTouch(targetedEvent.event().position())) { |
|
Rick Byers
2014/08/20 23:59:32
Add FIXME to use the targeted event here.
Zeeshan Qureshi
2014/08/21 04:59:25
Done.
| |
| 685 eventSwallowed = true; | 687 eventSwallowed = true; |
| 686 break; | 688 break; |
| 687 } | 689 } |
| 688 | 690 |
| 689 RefPtr<PopupContainer> selectPopup; | 691 RefPtr<PopupContainer> selectPopup; |
| 690 selectPopup = m_selectPopup; | 692 selectPopup = m_selectPopup; |
| 691 hideSelectPopup(); | 693 hideSelectPopup(); |
| 692 ASSERT(!m_selectPopup); | 694 ASSERT(!m_selectPopup); |
| 693 | 695 |
| 694 // Don't trigger a disambiguation popup on sites designed for mobile dev ices. | 696 // Don't trigger a disambiguation popup on sites designed for mobile dev ices. |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 710 if (goodTargets.size() >= 2 && m_client && m_client->didTapMultipleT argets(scaledEvent, goodTargets)) { | 712 if (goodTargets.size() >= 2 && m_client && m_client->didTapMultipleT argets(scaledEvent, goodTargets)) { |
| 711 enableTapHighlights(highlightNodes); | 713 enableTapHighlights(highlightNodes); |
| 712 for (size_t i = 0; i < m_linkHighlights.size(); ++i) | 714 for (size_t i = 0; i < m_linkHighlights.size(); ++i) |
| 713 m_linkHighlights[i]->startHighlightAnimationIfNeeded(); | 715 m_linkHighlights[i]->startHighlightAnimationIfNeeded(); |
| 714 eventSwallowed = true; | 716 eventSwallowed = true; |
| 715 eventCancelled = true; | 717 eventCancelled = true; |
| 716 break; | 718 break; |
| 717 } | 719 } |
| 718 } | 720 } |
| 719 | 721 |
| 720 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(platformEvent); | 722 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(targetedEvent); |
| 721 | 723 |
| 722 if (m_selectPopup && m_selectPopup == selectPopup) { | 724 if (m_selectPopup && m_selectPopup == selectPopup) { |
| 723 // That tap triggered a select popup which is the same as the one th at | 725 // That tap triggered a select popup which is the same as the one th at |
| 724 // was showing before the tap. It means the user tapped the select | 726 // was showing before the tap. It means the user tapped the select |
| 725 // while the popup was showing, and as a result we first closed then | 727 // while the popup was showing, and as a result we first closed then |
| 726 // immediately reopened the select popup. It needs to be closed. | 728 // immediately reopened the select popup. It needs to be closed. |
| 727 hideSelectPopup(); | 729 hideSelectPopup(); |
| 728 } | 730 } |
| 729 | 731 |
| 730 break; | 732 break; |
| 731 } | 733 } |
| 732 case WebInputEvent::GestureTwoFingerTap: | 734 case WebInputEvent::GestureTwoFingerTap: |
| 733 case WebInputEvent::GestureLongPress: | 735 case WebInputEvent::GestureLongPress: |
| 734 case WebInputEvent::GestureLongTap: { | 736 case WebInputEvent::GestureLongTap: { |
| 735 if (!mainFrameImpl() || !mainFrameImpl()->frameView()) | 737 if (!mainFrameImpl() || !mainFrameImpl()->frameView()) |
| 736 break; | 738 break; |
| 737 | 739 |
| 738 m_client->cancelScheduledContentIntents(); | 740 m_client->cancelScheduledContentIntents(); |
| 739 m_page->contextMenuController().clearContextMenu(); | 741 m_page->contextMenuController().clearContextMenu(); |
| 740 m_contextMenuAllowed = true; | 742 m_contextMenuAllowed = true; |
| 741 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(platformEvent); | 743 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(targetedEvent); |
| 742 m_contextMenuAllowed = false; | 744 m_contextMenuAllowed = false; |
| 743 | 745 |
| 744 break; | 746 break; |
| 745 } | 747 } |
| 746 case WebInputEvent::GestureShowPress: { | 748 case WebInputEvent::GestureShowPress: { |
| 747 m_client->cancelScheduledContentIntents(); | 749 m_client->cancelScheduledContentIntents(); |
| 748 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(platformEvent); | 750 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(targetedEvent); |
| 749 break; | 751 break; |
| 750 } | 752 } |
| 751 case WebInputEvent::GestureDoubleTap: | 753 case WebInputEvent::GestureDoubleTap: |
| 752 if (m_webSettings->doubleTapToZoomEnabled() && minimumPageScaleFactor() != maximumPageScaleFactor()) { | 754 if (m_webSettings->doubleTapToZoomEnabled() && minimumPageScaleFactor() != maximumPageScaleFactor()) { |
| 753 m_client->cancelScheduledContentIntents(); | 755 m_client->cancelScheduledContentIntents(); |
| 754 animateDoubleTapZoom(platformEvent.position()); | 756 animateDoubleTapZoom(targetedEvent.event().position()); |
| 755 } | 757 } |
| 756 // GestureDoubleTap is currently only used by Android for zooming. For W ebCore, | 758 // GestureDoubleTap is currently only used by Android for zooming. For W ebCore, |
| 757 // GestureTap with tap count = 2 is used instead. So we drop GestureDoub leTap here. | 759 // GestureTap with tap count = 2 is used instead. So we drop GestureDoub leTap here. |
| 758 eventSwallowed = true; | 760 eventSwallowed = true; |
| 759 break; | 761 break; |
| 760 case WebInputEvent::GestureScrollBegin: | 762 case WebInputEvent::GestureScrollBegin: |
| 761 case WebInputEvent::GesturePinchBegin: | 763 case WebInputEvent::GesturePinchBegin: |
| 762 m_client->cancelScheduledContentIntents(); | 764 m_client->cancelScheduledContentIntents(); |
| 763 case WebInputEvent::GestureTapDown: | 765 case WebInputEvent::GestureTapDown: |
| 764 case WebInputEvent::GestureScrollEnd: | 766 case WebInputEvent::GestureScrollEnd: |
| 765 case WebInputEvent::GestureScrollUpdate: | 767 case WebInputEvent::GestureScrollUpdate: |
| 766 case WebInputEvent::GestureScrollUpdateWithoutPropagation: | 768 case WebInputEvent::GestureScrollUpdateWithoutPropagation: |
| 767 case WebInputEvent::GestureTapCancel: | 769 case WebInputEvent::GestureTapCancel: |
| 768 case WebInputEvent::GestureTapUnconfirmed: | 770 case WebInputEvent::GestureTapUnconfirmed: |
| 769 case WebInputEvent::GesturePinchEnd: | 771 case WebInputEvent::GesturePinchEnd: |
| 770 case WebInputEvent::GesturePinchUpdate: | 772 case WebInputEvent::GesturePinchUpdate: |
| 771 case WebInputEvent::GestureFlingStart: { | 773 case WebInputEvent::GestureFlingStart: { |
| 772 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(platformEvent); | 774 eventSwallowed = mainFrameImpl()->frame()->eventHandler().handleGestureE vent(targetedEvent); |
| 773 break; | 775 break; |
| 774 } | 776 } |
| 775 default: | 777 default: |
| 776 ASSERT_NOT_REACHED(); | 778 ASSERT_NOT_REACHED(); |
| 777 } | 779 } |
| 778 m_client->didHandleGestureEvent(event, eventCancelled); | 780 m_client->didHandleGestureEvent(event, eventCancelled); |
| 779 return eventSwallowed; | 781 return eventSwallowed; |
| 780 } | 782 } |
| 781 | 783 |
| 782 void WebViewImpl::transferActiveWheelFlingAnimation(const WebActiveWheelFlingPar ameters& parameters) | 784 void WebViewImpl::transferActiveWheelFlingAnimation(const WebActiveWheelFlingPar ameters& parameters) |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1182 static bool showsHandCursor(Node* node, LocalFrame* frame) | 1184 static bool showsHandCursor(Node* node, LocalFrame* frame) |
| 1183 { | 1185 { |
| 1184 if (!node || !node->renderer()) | 1186 if (!node || !node->renderer()) |
| 1185 return false; | 1187 return false; |
| 1186 | 1188 |
| 1187 ECursor cursor = node->renderer()->style()->cursor(); | 1189 ECursor cursor = node->renderer()->style()->cursor(); |
| 1188 return cursor == CURSOR_POINTER | 1190 return cursor == CURSOR_POINTER |
| 1189 || (cursor == CURSOR_AUTO && frame->eventHandler().useHandCursor(node, n ode->isLink())); | 1191 || (cursor == CURSOR_AUTO && frame->eventHandler().useHandCursor(node, n ode->isLink())); |
| 1190 } | 1192 } |
| 1191 | 1193 |
| 1192 Node* WebViewImpl::bestTapNode(const PlatformGestureEvent& tapEvent) | 1194 Node* WebViewImpl::bestTapNode(const GestureEventWithHitTestResults& targetedTap Event) |
| 1193 { | 1195 { |
| 1194 TRACE_EVENT0("input", "WebViewImpl::bestTapNode"); | 1196 TRACE_EVENT0("input", "WebViewImpl::bestTapNode"); |
| 1195 | 1197 |
| 1196 if (!m_page || !m_page->mainFrame()) | 1198 if (!m_page || !m_page->mainFrame()) |
| 1197 return 0; | 1199 return 0; |
| 1198 | 1200 |
| 1199 // FIXME: Rely on earlier hit test instead of hit testing again. | 1201 Node* bestTouchNode = targetedTapEvent.hitTestResult().targetNode(); |
| 1200 GestureEventWithHitTestResults targetedEvent = | |
| 1201 m_page->deprecatedLocalMainFrame()->eventHandler().targetGestureEvent(ta pEvent, true); | |
| 1202 Node* bestTouchNode = targetedEvent.hitTestResult().targetNode(); | |
| 1203 | 1202 |
| 1204 // We might hit something like an image map that has no renderer on it | 1203 // We might hit something like an image map that has no renderer on it |
| 1205 // Walk up the tree until we have a node with an attached renderer | 1204 // Walk up the tree until we have a node with an attached renderer |
| 1206 while (bestTouchNode && !bestTouchNode->renderer()) | 1205 while (bestTouchNode && !bestTouchNode->renderer()) |
| 1207 bestTouchNode = bestTouchNode->parentNode(); | 1206 bestTouchNode = bestTouchNode->parentNode(); |
| 1208 | 1207 |
| 1209 Node* cursorDefiningAncestor = | 1208 Node* cursorDefiningAncestor = |
| 1210 findCursorDefiningAncestor(bestTouchNode, m_page->deprecatedLocalMainFra me()); | 1209 findCursorDefiningAncestor(bestTouchNode, m_page->deprecatedLocalMainFra me()); |
| 1211 // We show a highlight on tap only when the current node shows a hand cursor | 1210 // We show a highlight on tap only when the current node shows a hand cursor |
| 1212 if (!cursorDefiningAncestor || !showsHandCursor(cursorDefiningAncestor, m_pa ge->deprecatedLocalMainFrame())) { | 1211 if (!cursorDefiningAncestor || !showsHandCursor(cursorDefiningAncestor, m_pa ge->deprecatedLocalMainFrame())) { |
| 1213 return 0; | 1212 return 0; |
| 1214 } | 1213 } |
| 1215 | 1214 |
| 1216 // We should pick the largest enclosing node with hand cursor set. We do thi s by first jumping | 1215 // We should pick the largest enclosing node with hand cursor set. We do thi s by first jumping |
| 1217 // up to cursorDefiningAncestor (which is already known to have hand cursor set). Then we locate | 1216 // up to cursorDefiningAncestor (which is already known to have hand cursor set). Then we locate |
| 1218 // the next cursor-defining ancestor up in the the tree and repeat the jumps as long as the node | 1217 // the next cursor-defining ancestor up in the the tree and repeat the jumps as long as the node |
| 1219 // has hand cursor set. | 1218 // has hand cursor set. |
| 1220 do { | 1219 do { |
| 1221 bestTouchNode = cursorDefiningAncestor; | 1220 bestTouchNode = cursorDefiningAncestor; |
| 1222 cursorDefiningAncestor = findCursorDefiningAncestor(bestTouchNode->paren tNode(), m_page->deprecatedLocalMainFrame()); | 1221 cursorDefiningAncestor = findCursorDefiningAncestor(bestTouchNode->paren tNode(), m_page->deprecatedLocalMainFrame()); |
| 1223 } while (cursorDefiningAncestor && showsHandCursor(cursorDefiningAncestor, m _page->deprecatedLocalMainFrame())); | 1222 } while (cursorDefiningAncestor && showsHandCursor(cursorDefiningAncestor, m _page->deprecatedLocalMainFrame())); |
| 1224 | 1223 |
| 1225 return bestTouchNode; | 1224 return bestTouchNode; |
| 1226 } | 1225 } |
| 1227 | 1226 |
| 1228 void WebViewImpl::enableTapHighlightAtPoint(const PlatformGestureEvent& tapEvent ) | 1227 void WebViewImpl::enableTapHighlightAtPoint(const GestureEventWithHitTestResults & targetedTapEvent) |
| 1229 { | 1228 { |
| 1230 Node* touchNode = bestTapNode(tapEvent); | 1229 Node* touchNode = bestTapNode(targetedTapEvent); |
| 1231 | 1230 |
| 1232 WillBeHeapVector<RawPtrWillBeMember<Node> > highlightNodes; | 1231 WillBeHeapVector<RawPtrWillBeMember<Node> > highlightNodes; |
| 1233 highlightNodes.append(touchNode); | 1232 highlightNodes.append(touchNode); |
| 1234 | 1233 |
| 1235 enableTapHighlights(highlightNodes); | 1234 enableTapHighlights(highlightNodes); |
| 1236 } | 1235 } |
| 1237 | 1236 |
| 1238 void WebViewImpl::enableTapHighlights(WillBeHeapVector<RawPtrWillBeMember<Node> >& highlightNodes) | 1237 void WebViewImpl::enableTapHighlights(WillBeHeapVector<RawPtrWillBeMember<Node> >& highlightNodes) |
| 1239 { | 1238 { |
| 1240 if (highlightNodes.isEmpty()) | 1239 if (highlightNodes.isEmpty()) |
| (...skipping 3017 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4258 const PageScaleConstraints& constraints = m_pageScaleConstraintsSet.pageDefi nedConstraints(); | 4257 const PageScaleConstraints& constraints = m_pageScaleConstraintsSet.pageDefi nedConstraints(); |
| 4259 | 4258 |
| 4260 if (!mainFrameImpl() || !mainFrameImpl()->frameView()) | 4259 if (!mainFrameImpl() || !mainFrameImpl()->frameView()) |
| 4261 return false; | 4260 return false; |
| 4262 | 4261 |
| 4263 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width | 4262 return mainFrameImpl()->frameView()->layoutSize().width() == m_size.width |
| 4264 || (constraints.minimumScale == constraints.maximumScale && constraints. minimumScale != -1); | 4263 || (constraints.minimumScale == constraints.maximumScale && constraints. minimumScale != -1); |
| 4265 } | 4264 } |
| 4266 | 4265 |
| 4267 } // namespace blink | 4266 } // namespace blink |
| OLD | NEW |