summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/page/touch_disambiguation.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/blink/renderer/core/page/touch_disambiguation.cc')
-rw-r--r--chromium/third_party/blink/renderer/core/page/touch_disambiguation.cc41
1 files changed, 15 insertions, 26 deletions
diff --git a/chromium/third_party/blink/renderer/core/page/touch_disambiguation.cc b/chromium/third_party/blink/renderer/core/page/touch_disambiguation.cc
index 9306fccd74c..f6678b7b9b8 100644
--- a/chromium/third_party/blink/renderer/core/page/touch_disambiguation.cc
+++ b/chromium/third_party/blink/renderer/core/page/touch_disambiguation.cc
@@ -59,23 +59,20 @@ static IntRect BoundingBoxForEventNodes(Node* event_node) {
result.Unite(node->PixelSnappedBoundingBox());
node = NodeTraversal::Next(*node, event_node);
}
- return event_node->GetDocument().View()->ContentsToRootFrame(result);
+ return event_node->GetDocument().View()->ConvertToRootFrame(result);
}
-static float ScoreTouchTarget(IntPoint touch_point,
- int padding,
- IntRect bounding_box) {
+static float ScoreTouchTarget(const IntRect& touch_rect, IntRect bounding_box) {
if (bounding_box.IsEmpty())
return 0;
- float reciprocal_padding = 1.f / padding;
+ float touch_radius =
+ ceil(std::max(touch_rect.Width(), touch_rect.Height()) * 0.5f);
float score = 1;
- IntSize distance = bounding_box.DifferenceToPoint(touch_point);
- score *=
- std::max((padding - abs(distance.Width())) * reciprocal_padding, 0.f);
- score *=
- std::max((padding - abs(distance.Height())) * reciprocal_padding, 0.f);
+ IntSize distance = bounding_box.DifferenceToPoint(touch_rect.Center());
+ score *= std::max(1 - (abs(distance.Width()) / touch_radius), 0.f);
+ score *= std::max(1 - (abs(distance.Height()) / touch_radius), 0.f);
return score;
}
@@ -90,21 +87,13 @@ void FindGoodTouchTargets(const IntRect& touch_box_in_root_frame,
Vector<IntRect>& good_targets,
HeapVector<Member<Node>>& highlight_nodes) {
good_targets.clear();
-
- int touch_point_padding = ceil(std::max(touch_box_in_root_frame.Width(),
- touch_box_in_root_frame.Height()) *
- 0.5);
-
- IntPoint touch_point = touch_box_in_root_frame.Center();
- IntPoint contents_point =
- main_frame->View()->RootFrameToContents(touch_point);
-
- HitTestResult result = main_frame->GetEventHandler().HitTestResultAtPoint(
- contents_point,
- HitTestRequest::kReadOnly | HitTestRequest::kActive |
- HitTestRequest::kListBased,
- LayoutRectOutsets(touch_point_padding, touch_point_padding,
- touch_point_padding, touch_point_padding));
+ LayoutPoint hit_point(main_frame->View()->ConvertFromRootFrame(
+ touch_box_in_root_frame.Location()));
+ HitTestLocation location(
+ LayoutRect(hit_point, LayoutSize(touch_box_in_root_frame.Size())));
+ HitTestResult result = main_frame->GetEventHandler().HitTestResultAtLocation(
+ location, HitTestRequest::kReadOnly | HitTestRequest::kActive |
+ HitTestRequest::kListBased);
const HeapListHashSet<Member<Node>>& hit_results =
result.ListBasedTestResult();
@@ -144,7 +133,7 @@ void FindGoodTouchTargets(const IntRect& touch_box_in_root_frame,
TouchTargetData& target_data =
touch_targets.insert(&node, TouchTargetData()).stored_value->value;
target_data.window_bounding_box = BoundingBoxForEventNodes(&node);
- target_data.score = ScoreTouchTarget(touch_point, touch_point_padding,
+ target_data.score = ScoreTouchTarget(touch_box_in_root_frame,
target_data.window_bounding_box);
best_score = std::max(best_score, target_data.score);
break;