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

Unified 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 side-by-side diff with in-line comments
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 »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/page/EventHandler.cpp
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
index 9a7a8bcb36c5e0f83a7f949f878953f303e0eab3..51f4881e59da2a3190b0a04c8cd30db26c46166c 100644
--- a/Source/core/page/EventHandler.cpp
+++ b/Source/core/page/EventHandler.cpp
@@ -36,6 +36,7 @@
#include "core/dom/Document.h"
#include "core/dom/DocumentMarkerController.h"
#include "core/dom/FullscreenElementStack.h"
+#include "core/dom/NodeRenderingTraversal.h"
#include "core/dom/TouchList.h"
#include "core/dom/shadow/ShadowRoot.h"
#include "core/editing/Editor.h"
@@ -60,6 +61,7 @@
#include "core/page/AutoscrollController.h"
#include "core/page/BackForwardClient.h"
#include "core/page/Chrome.h"
+#include "core/page/ChromeClient.h"
#include "core/page/DragController.h"
#include "core/page/DragState.h"
#include "core/page/EditorClient.h"
@@ -83,6 +85,7 @@
#include "core/rendering/RenderView.h"
#include "core/rendering/RenderWidget.h"
#include "core/rendering/style/CursorList.h"
+#include "core/rendering/style/RenderStyle.h"
#include "core/svg/SVGDocument.h"
#include "core/svg/SVGElementInstance.h"
#include "core/svg/SVGUseElement.h"
@@ -3684,6 +3687,12 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
continue;
m_originatingTouchPointTargets.set(touchPointTargetKey, node);
touchTarget = node;
+
+ // FIXME(rbyers): Should really be doing a second hit test that ignores inline elements - crbug.com/319479.
+ TouchAction effectiveTouchAction = computeEffectiveTouchAction(*node);
+ if (effectiveTouchAction != TouchActionAuto)
+ m_frame->page()->chrome().client().setTouchAction(effectiveTouchAction);
+
} else if (pointState == PlatformTouchPoint::TouchReleased || pointState == PlatformTouchPoint::TouchCancelled) {
// The target should be the original target for this touch, so get it from the hashmap. As it's a release or cancel
// we also remove it from the map.
@@ -3895,6 +3904,34 @@ bool EventHandler::handleWheelEventAsEmulatedGesture(const PlatformWheelEvent& e
return true;
}
+TouchAction EventHandler::computeEffectiveTouchAction(const Node& node)
+{
+ // Optimization to minimize risk of this new feature (behavior should be identical
+ // since there's no way to get non-default touch-action values).
+ if (!RuntimeEnabledFeatures::cssTouchActionEnabled())
+ return TouchActionAuto;
+
+ // Start by permitting all actions, then walk the block level elements from
+ // the target node up to the nearest scrollable ancestor and exclude any
+ // prohibited actions. For now this is trivial, but when we add more types
+ // of actions it'll get a little more complex.
+ for (const Node* curNode = &node; curNode; curNode = NodeRenderingTraversal::parent(curNode)) {
+ // The spec says only block and SVG elements get touch-action.
+ // FIXME(rbyers): Add correct support for SVG, crbug.com/247396.
+ if (RenderObject* renderer = curNode->renderer()) {
+ if (renderer->isRenderBlockFlow()) {
+ if (renderer->style()->touchAction() == TouchActionNone)
+ return TouchActionNone;
+ }
+
+ // If we've reached an ancestor that supports a touch action, search no further.
+ if (renderer->isBox() && toRenderBox(renderer)->scrollsOverflow())
+ break;
+ }
+ }
+ return TouchActionAuto;
+}
+
void EventHandler::setLastKnownMousePosition(const PlatformMouseEvent& event)
{
m_mousePositionIsUnknown = false;
« 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