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

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

Issue 16507017: Initial touch-action main thread implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: esprehn CR tweaks Created 7 years 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
« no previous file with comments | « Source/core/page/EventHandler.h ('k') | Source/core/rendering/style/RenderStyleConstants.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 18 matching lines...) Expand all
29 #include "core/page/EventHandler.h" 29 #include "core/page/EventHandler.h"
30 30
31 #include "HTMLNames.h" 31 #include "HTMLNames.h"
32 #include "RuntimeEnabledFeatures.h" 32 #include "RuntimeEnabledFeatures.h"
33 #include "SVGNames.h" 33 #include "SVGNames.h"
34 #include "bindings/v8/ExceptionStatePlaceholder.h" 34 #include "bindings/v8/ExceptionStatePlaceholder.h"
35 #include "core/dom/Clipboard.h" 35 #include "core/dom/Clipboard.h"
36 #include "core/dom/Document.h" 36 #include "core/dom/Document.h"
37 #include "core/dom/DocumentMarkerController.h" 37 #include "core/dom/DocumentMarkerController.h"
38 #include "core/dom/FullscreenElementStack.h" 38 #include "core/dom/FullscreenElementStack.h"
39 #include "core/dom/NodeRenderingTraversal.h"
39 #include "core/dom/TouchList.h" 40 #include "core/dom/TouchList.h"
40 #include "core/dom/shadow/ShadowRoot.h" 41 #include "core/dom/shadow/ShadowRoot.h"
41 #include "core/editing/Editor.h" 42 #include "core/editing/Editor.h"
42 #include "core/editing/FrameSelection.h" 43 #include "core/editing/FrameSelection.h"
43 #include "core/editing/TextIterator.h" 44 #include "core/editing/TextIterator.h"
44 #include "core/editing/htmlediting.h" 45 #include "core/editing/htmlediting.h"
45 #include "core/events/DOMWindowEventQueue.h" 46 #include "core/events/DOMWindowEventQueue.h"
46 #include "core/events/EventPath.h" 47 #include "core/events/EventPath.h"
47 #include "core/events/KeyboardEvent.h" 48 #include "core/events/KeyboardEvent.h"
48 #include "core/events/MouseEvent.h" 49 #include "core/events/MouseEvent.h"
49 #include "core/events/TextEvent.h" 50 #include "core/events/TextEvent.h"
50 #include "core/events/ThreadLocalEventNames.h" 51 #include "core/events/ThreadLocalEventNames.h"
51 #include "core/events/TouchEvent.h" 52 #include "core/events/TouchEvent.h"
52 #include "core/events/WheelEvent.h" 53 #include "core/events/WheelEvent.h"
53 #include "core/fetch/ImageResource.h" 54 #include "core/fetch/ImageResource.h"
54 #include "core/html/HTMLDialogElement.h" 55 #include "core/html/HTMLDialogElement.h"
55 #include "core/html/HTMLFrameElementBase.h" 56 #include "core/html/HTMLFrameElementBase.h"
56 #include "core/html/HTMLFrameSetElement.h" 57 #include "core/html/HTMLFrameSetElement.h"
57 #include "core/html/HTMLInputElement.h" 58 #include "core/html/HTMLInputElement.h"
58 #include "core/loader/FrameLoader.h" 59 #include "core/loader/FrameLoader.h"
59 #include "core/loader/FrameLoaderClient.h" 60 #include "core/loader/FrameLoaderClient.h"
60 #include "core/page/AutoscrollController.h" 61 #include "core/page/AutoscrollController.h"
61 #include "core/page/BackForwardClient.h" 62 #include "core/page/BackForwardClient.h"
62 #include "core/page/Chrome.h" 63 #include "core/page/Chrome.h"
64 #include "core/page/ChromeClient.h"
63 #include "core/page/DragController.h" 65 #include "core/page/DragController.h"
64 #include "core/page/DragState.h" 66 #include "core/page/DragState.h"
65 #include "core/page/EditorClient.h" 67 #include "core/page/EditorClient.h"
66 #include "core/page/FocusController.h" 68 #include "core/page/FocusController.h"
67 #include "core/frame/Frame.h" 69 #include "core/frame/Frame.h"
68 #include "core/page/FrameTree.h" 70 #include "core/page/FrameTree.h"
69 #include "core/frame/FrameView.h" 71 #include "core/frame/FrameView.h"
70 #include "core/inspector/InspectorController.h" 72 #include "core/inspector/InspectorController.h"
71 #include "core/page/MouseEventWithHitTestResults.h" 73 #include "core/page/MouseEventWithHitTestResults.h"
72 #include "core/page/Page.h" 74 #include "core/page/Page.h"
73 #include "core/page/Settings.h" 75 #include "core/page/Settings.h"
74 #include "core/page/SpatialNavigation.h" 76 #include "core/page/SpatialNavigation.h"
75 #include "core/page/TouchAdjustment.h" 77 #include "core/page/TouchAdjustment.h"
76 #include "core/platform/ScrollAnimator.h" 78 #include "core/platform/ScrollAnimator.h"
77 #include "core/platform/Scrollbar.h" 79 #include "core/platform/Scrollbar.h"
78 #include "core/platform/chromium/ChromiumDataObject.h" 80 #include "core/platform/chromium/ChromiumDataObject.h"
79 #include "core/platform/graphics/Image.h" 81 #include "core/platform/graphics/Image.h"
80 #include "core/rendering/HitTestResult.h" 82 #include "core/rendering/HitTestResult.h"
81 #include "core/rendering/RenderLayer.h" 83 #include "core/rendering/RenderLayer.h"
82 #include "core/rendering/RenderTextControlSingleLine.h" 84 #include "core/rendering/RenderTextControlSingleLine.h"
83 #include "core/rendering/RenderView.h" 85 #include "core/rendering/RenderView.h"
84 #include "core/rendering/RenderWidget.h" 86 #include "core/rendering/RenderWidget.h"
85 #include "core/rendering/style/CursorList.h" 87 #include "core/rendering/style/CursorList.h"
88 #include "core/rendering/style/RenderStyle.h"
86 #include "core/svg/SVGDocument.h" 89 #include "core/svg/SVGDocument.h"
87 #include "core/svg/SVGElementInstance.h" 90 #include "core/svg/SVGElementInstance.h"
88 #include "core/svg/SVGUseElement.h" 91 #include "core/svg/SVGUseElement.h"
89 #include "platform/PlatformGestureEvent.h" 92 #include "platform/PlatformGestureEvent.h"
90 #include "platform/PlatformKeyboardEvent.h" 93 #include "platform/PlatformKeyboardEvent.h"
91 #include "platform/PlatformTouchEvent.h" 94 #include "platform/PlatformTouchEvent.h"
92 #include "platform/PlatformWheelEvent.h" 95 #include "platform/PlatformWheelEvent.h"
93 #include "platform/WindowsKeyboardCodes.h" 96 #include "platform/WindowsKeyboardCodes.h"
94 #include "platform/geometry/FloatPoint.h" 97 #include "platform/geometry/FloatPoint.h"
95 #include "wtf/Assertions.h" 98 #include "wtf/Assertions.h"
(...skipping 3581 matching lines...) Expand 10 before | Expand all | Expand 10 after
3677 Document& doc = node->document(); 3680 Document& doc = node->document();
3678 // Record the originating touch document even if it does not have a touch listener. 3681 // Record the originating touch document even if it does not have a touch listener.
3679 if (freshTouchEvents) { 3682 if (freshTouchEvents) {
3680 m_originatingTouchPointDocument = &doc; 3683 m_originatingTouchPointDocument = &doc;
3681 freshTouchEvents = false; 3684 freshTouchEvents = false;
3682 } 3685 }
3683 if (!doc.hasTouchEventHandlers()) 3686 if (!doc.hasTouchEventHandlers())
3684 continue; 3687 continue;
3685 m_originatingTouchPointTargets.set(touchPointTargetKey, node); 3688 m_originatingTouchPointTargets.set(touchPointTargetKey, node);
3686 touchTarget = node; 3689 touchTarget = node;
3690
3691 // FIXME(rbyers): Should really be doing a second hit test that igno res inline elements - crbug.com/319479.
3692 TouchAction effectiveTouchAction = computeEffectiveTouchAction(*node );
3693 if (effectiveTouchAction != TouchActionAuto)
3694 m_frame->page()->chrome().client().setTouchAction(effectiveTouch Action);
3695
3687 } else if (pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled) { 3696 } else if (pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled) {
3688 // The target should be the original target for this touch, so get i t from the hashmap. As it's a release or cancel 3697 // The target should be the original target for this touch, so get i t from the hashmap. As it's a release or cancel
3689 // we also remove it from the map. 3698 // we also remove it from the map.
3690 touchTarget = m_originatingTouchPointTargets.take(touchPointTargetKe y); 3699 touchTarget = m_originatingTouchPointTargets.take(touchPointTargetKe y);
3691 } else 3700 } else
3692 // No hittest is performed on move or stationary, since the target i s not allowed to change anyway. 3701 // No hittest is performed on move or stationary, since the target i s not allowed to change anyway.
3693 touchTarget = m_originatingTouchPointTargets.get(touchPointTargetKey ); 3702 touchTarget = m_originatingTouchPointTargets.get(touchPointTargetKey );
3694 3703
3695 if (!touchTarget.get()) 3704 if (!touchTarget.get())
3696 continue; 3705 continue;
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
3888 3897
3889 float magnifyDelta = exp(event.deltaY() * 0.002f); 3898 float magnifyDelta = exp(event.deltaY() * 0.002f);
3890 float newPageScaleFactor = pageScaleFactor * magnifyDelta; 3899 float newPageScaleFactor = pageScaleFactor * magnifyDelta;
3891 3900
3892 IntPoint anchorAfterCss(anchorBeforeDip); 3901 IntPoint anchorAfterCss(anchorBeforeDip);
3893 anchorAfterCss.scale(1.f / newPageScaleFactor, 1.f / newPageScaleFactor); 3902 anchorAfterCss.scale(1.f / newPageScaleFactor, 1.f / newPageScaleFactor);
3894 page->inspectorController().requestPageScaleFactor(newPageScaleFactor, ancho rBeforeCss - toIntSize(anchorAfterCss)); 3903 page->inspectorController().requestPageScaleFactor(newPageScaleFactor, ancho rBeforeCss - toIntSize(anchorAfterCss));
3895 return true; 3904 return true;
3896 } 3905 }
3897 3906
3907 TouchAction EventHandler::computeEffectiveTouchAction(const Node& node)
3908 {
3909 // Optimization to minimize risk of this new feature (behavior should be ide ntical
3910 // since there's no way to get non-default touch-action values).
3911 if (!RuntimeEnabledFeatures::cssTouchActionEnabled())
3912 return TouchActionAuto;
3913
3914 // Start by permitting all actions, then walk the block level elements from
3915 // the target node up to the nearest scrollable ancestor and exclude any
3916 // prohibited actions. For now this is trivial, but when we add more types
3917 // of actions it'll get a little more complex.
3918 for (const Node* curNode = &node; curNode; curNode = NodeRenderingTraversal: :parent(curNode)) {
3919 // The spec says only block and SVG elements get touch-action.
3920 // FIXME(rbyers): Add correct support for SVG, crbug.com/247396.
3921 if (RenderObject* renderer = curNode->renderer()) {
3922 if (renderer->isRenderBlockFlow()) {
3923 if (renderer->style()->touchAction() == TouchActionNone)
3924 return TouchActionNone;
3925 }
3926
3927 // If we've reached an ancestor that supports a touch action, search no further.
3928 if (renderer->isBox() && toRenderBox(renderer)->scrollsOverflow())
3929 break;
3930 }
3931 }
3932 return TouchActionAuto;
3933 }
3934
3898 void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event) 3935 void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event)
3899 { 3936 {
3900 m_mousePositionIsUnknown = false; 3937 m_mousePositionIsUnknown = false;
3901 m_lastKnownMousePosition = event.position(); 3938 m_lastKnownMousePosition = event.position();
3902 m_lastKnownMouseGlobalPosition = event.globalPosition(); 3939 m_lastKnownMouseGlobalPosition = event.globalPosition();
3903 } 3940 }
3904 3941
3905 bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& m ev, Frame* subframe) 3942 bool EventHandler::passMousePressEventToSubframe(MouseEventWithHitTestResults& m ev, Frame* subframe)
3906 { 3943 {
3907 // If we're clicking into a frame that is selected, the frame will appear 3944 // If we're clicking into a frame that is selected, the frame will appear
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
3973 unsigned EventHandler::accessKeyModifiers() 4010 unsigned EventHandler::accessKeyModifiers()
3974 { 4011 {
3975 #if OS(MACOSX) 4012 #if OS(MACOSX)
3976 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 4013 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
3977 #else 4014 #else
3978 return PlatformEvent::AltKey; 4015 return PlatformEvent::AltKey;
3979 #endif 4016 #endif
3980 } 4017 }
3981 4018
3982 } // namespace WebCore 4019 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/page/EventHandler.h ('k') | Source/core/rendering/style/RenderStyleConstants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698