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

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

Issue 298133003: Expose fractional TouchEvent coordinates (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Make layout test output stable across platforms Created 6 years, 6 months 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/inspector/InspectorInputAgent.cpp ('k') | Source/platform/PlatformTouchPoint.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 3407 matching lines...) Expand 10 before | Expand all | Expand 10 after
3418 } 3418 }
3419 if (freshTouchEvents) { 3419 if (freshTouchEvents) {
3420 // Ideally we'd ASSERT !m_touchSequenceDocument here since we should 3420 // Ideally we'd ASSERT !m_touchSequenceDocument here since we should
3421 // have cleared the active document when we saw the last release. But we 3421 // have cleared the active document when we saw the last release. But we
3422 // have some tests that violate this, ClusterFuzz could trigger it, and 3422 // have some tests that violate this, ClusterFuzz could trigger it, and
3423 // there may be cases where the browser doesn't reliably release all 3423 // there may be cases where the browser doesn't reliably release all
3424 // touches. http://crbug.com/345372 tracks this. 3424 // touches. http://crbug.com/345372 tracks this.
3425 m_touchSequenceDocument.clear(); 3425 m_touchSequenceDocument.clear();
3426 } 3426 }
3427 3427
3428 ASSERT(m_frame->view());
3429 if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touc hSequenceDocument->frame()->view())) {
3430 // If the active touch document has no frame or view, it's probably bein g destroyed
3431 // so we can't dispatch events.
3432 return false;
3433 }
3434
3428 // First do hit tests for any new touch points. 3435 // First do hit tests for any new touch points.
3429 for (i = 0; i < points.size(); ++i) { 3436 for (i = 0; i < points.size(); ++i) {
3430 const PlatformTouchPoint& point = points[i]; 3437 const PlatformTouchPoint& point = points[i];
3431 LayoutPoint pagePoint = documentPointForWindowPoint(m_frame, point.pos() );
3432 3438
3433 // Touch events implicitly capture to the touched node, and don't change 3439 // Touch events implicitly capture to the touched node, and don't change
3434 // active/hover states themselves (Gesture events do). So we only need 3440 // active/hover states themselves (Gesture events do). So we only need
3435 // to hit-test on touchstart, and it can be read-only. 3441 // to hit-test on touchstart, and it can be read-only.
3436 if (point.state() == PlatformTouchPoint::TouchPressed) { 3442 if (point.state() == PlatformTouchPoint::TouchPressed) {
3437 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEv ent | HitTestRequest::ReadOnly | HitTestRequest::Active; 3443 HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEv ent | HitTestRequest::ReadOnly | HitTestRequest::Active;
3444 LayoutPoint pagePoint = roundedLayoutPoint(m_frame->view()->windowTo Contents(point.pos()));
3438 HitTestResult result; 3445 HitTestResult result;
3439 if (!m_touchSequenceDocument) { 3446 if (!m_touchSequenceDocument) {
3440 result = hitTestResultAtPoint(pagePoint, hitType); 3447 result = hitTestResultAtPoint(pagePoint, hitType);
3441 } else if (m_touchSequenceDocument->frame()) { 3448 } else if (m_touchSequenceDocument->frame()) {
3442 LayoutPoint pagePointInOriginatingDocument = documentPointForWin dowPoint(m_touchSequenceDocument->frame(), point.pos()); 3449 LayoutPoint framePoint = roundedLayoutPoint(m_touchSequenceDocum ent->frame()->view()->windowToContents(point.pos()));
3443 result = hitTestResultInFrame(m_touchSequenceDocument->frame(), pagePointInOriginatingDocument, hitType); 3450 result = hitTestResultInFrame(m_touchSequenceDocument->frame(), framePoint, hitType);
3444 } else 3451 } else
3445 continue; 3452 continue;
3446 3453
3447 Node* node = result.innerNode(); 3454 Node* node = result.innerNode();
3448 if (!node) 3455 if (!node)
3449 continue; 3456 continue;
3450 3457
3451 // Touch events should not go to text nodes 3458 // Touch events should not go to text nodes
3452 if (node->isTextNode()) 3459 if (node->isTextNode())
3453 node = NodeRenderingTraversal::parent(node); 3460 node = NodeRenderingTraversal::parent(node);
3454 3461
3455 if (!m_touchSequenceDocument) { 3462 if (!m_touchSequenceDocument) {
3456 // Keep track of which document should receive all touch events 3463 // Keep track of which document should receive all touch events
3457 // in the active sequence. This must be a single document to 3464 // in the active sequence. This must be a single document to
3458 // ensure we don't leak Nodes between documents. 3465 // ensure we don't leak Nodes between documents.
3459 m_touchSequenceDocument = &(result.innerNode()->document()); 3466 m_touchSequenceDocument = &(result.innerNode()->document());
3467 ASSERT(m_touchSequenceDocument->frame()->view());
3460 } 3468 }
3461 3469
3462 // Ideally we'd ASSERT(!m_targetForTouchID.contains(point.id()) 3470 // Ideally we'd ASSERT(!m_targetForTouchID.contains(point.id())
3463 // since we shouldn't get a touchstart for a touch that's already 3471 // since we shouldn't get a touchstart for a touch that's already
3464 // down. However EventSender allows this to be violated and there's 3472 // down. However EventSender allows this to be violated and there's
3465 // some tests that take advantage of it. There may also be edge 3473 // some tests that take advantage of it. There may also be edge
3466 // cases in the browser where this happens. 3474 // cases in the browser where this happens.
3467 // See http://crbug.com/345372. 3475 // See http://crbug.com/345372.
3468 m_targetForTouchID.set(point.id(), node); 3476 m_targetForTouchID.set(point.id(), node);
3469 3477
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
3502 struct { 3510 struct {
3503 // The touches corresponding to the particular change state this struct 3511 // The touches corresponding to the particular change state this struct
3504 // instance represents. 3512 // instance represents.
3505 RefPtrWillBeMember<TouchList> m_touches; 3513 RefPtrWillBeMember<TouchList> m_touches;
3506 // Set of targets involved in m_touches. 3514 // Set of targets involved in m_touches.
3507 EventTargetSet m_targets; 3515 EventTargetSet m_targets;
3508 } changedTouches[PlatformTouchPoint::TouchStateEnd]; 3516 } changedTouches[PlatformTouchPoint::TouchStateEnd];
3509 3517
3510 for (i = 0; i < points.size(); ++i) { 3518 for (i = 0; i < points.size(); ++i) {
3511 const PlatformTouchPoint& point = points[i]; 3519 const PlatformTouchPoint& point = points[i];
3512 LayoutPoint pagePoint = documentPointForWindowPoint(m_frame, point.pos() );
3513 PlatformTouchPoint::State pointState = point.state(); 3520 PlatformTouchPoint::State pointState = point.state();
3514 RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr; 3521 RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr;
3515 3522
3516 if (pointState == PlatformTouchPoint::TouchReleased || pointState == Pla tformTouchPoint::TouchCancelled) { 3523 if (pointState == PlatformTouchPoint::TouchReleased || pointState == Pla tformTouchPoint::TouchCancelled) {
3517 // The target should be the original target for this touch, so get 3524 // The target should be the original target for this touch, so get
3518 // it from the hashmap. As it's a release or cancel we also remove 3525 // it from the hashmap. As it's a release or cancel we also remove
3519 // it from the map. 3526 // it from the map.
3520 touchTarget = m_targetForTouchID.take(point.id()); 3527 touchTarget = m_targetForTouchID.take(point.id());
3521 } else { 3528 } else {
3522 // No hittest is performed on move or stationary, since the target 3529 // No hittest is performed on move or stationary, since the target
(...skipping 23 matching lines...) Expand all
3546 // Since we know there was no handler invoked, the specific target 3553 // Since we know there was no handler invoked, the specific target
3547 // should be completely irrelevant to the application. 3554 // should be completely irrelevant to the application.
3548 // FIXME: Oilpan: We can remove the following .get() if EventTarget 3555 // FIXME: Oilpan: We can remove the following .get() if EventTarget
3549 // is on-heap. 3556 // is on-heap.
3550 touchTarget = m_touchSequenceDocument.get(); 3557 touchTarget = m_touchSequenceDocument.get();
3551 targetFrame = m_touchSequenceDocument->frame(); 3558 targetFrame = m_touchSequenceDocument->frame();
3552 knownTarget = false; 3559 knownTarget = false;
3553 } 3560 }
3554 ASSERT(targetFrame); 3561 ASSERT(targetFrame);
3555 3562
3556 if (m_frame != targetFrame) { 3563 // pagePoint should always be relative to the target elements
3557 // pagePoint should always be relative to the target elements 3564 // containing frame.
3558 // containing frame. 3565 FloatPoint pagePoint = targetFrame->view()->windowToContents(point.pos() );
3559 pagePoint = documentPointForWindowPoint(targetFrame, point.pos());
3560 }
3561 3566
3562 float scaleFactor = targetFrame->pageZoomFactor(); 3567 float scaleFactor = 1.0f / targetFrame->pageZoomFactor();
3563 3568
3564 int adjustedPageX = lroundf(pagePoint.x() / scaleFactor); 3569 FloatPoint adjustedPagePoint = pagePoint.scaledBy(scaleFactor);
3565 int adjustedPageY = lroundf(pagePoint.y() / scaleFactor); 3570 FloatSize adjustedRadius = point.radius().scaledBy(scaleFactor);
3566 int adjustedRadiusX = lroundf(point.radiusX() / scaleFactor);
3567 int adjustedRadiusY = lroundf(point.radiusY() / scaleFactor);
3568 3571
3569 RefPtrWillBeRawPtr<Touch> touch = Touch::create(targetFrame, touchTarget .get(), point.id(), 3572 RefPtrWillBeRawPtr<Touch> touch = Touch::create(
3570 point.screenPos().x(), point.screenP os().y(), 3573 targetFrame, touchTarget.get(), point.id(), point.screenPos(), adjus tedPagePoint, adjustedRadius, point.rotationAngle(), point.force());
3571 adjustedPageX, adjustedPageY,
3572 adjustedRadiusX, adjustedRadiusY,
3573 point.rotationAngle(), point.force() );
3574 3574
3575 // Ensure this target's touch list exists, even if it ends up empty, so 3575 // Ensure this target's touch list exists, even if it ends up empty, so
3576 // it can always be passed to TouchEvent::Create below. 3576 // it can always be passed to TouchEvent::Create below.
3577 TargetTouchesHeapMap::iterator targetTouchesIterator = touchesByTarget.f ind(touchTarget.get()); 3577 TargetTouchesHeapMap::iterator targetTouchesIterator = touchesByTarget.f ind(touchTarget.get());
3578 if (targetTouchesIterator == touchesByTarget.end()) { 3578 if (targetTouchesIterator == touchesByTarget.end()) {
3579 touchesByTarget.set(touchTarget.get(), TouchList::create()); 3579 touchesByTarget.set(touchTarget.get(), TouchList::create());
3580 targetTouchesIterator = touchesByTarget.find(touchTarget.get()); 3580 targetTouchesIterator = touchesByTarget.find(touchTarget.get());
3581 } 3581 }
3582 3582
3583 // touches and targetTouches should only contain information about 3583 // touches and targetTouches should only contain information about
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
3752 unsigned EventHandler::accessKeyModifiers() 3752 unsigned EventHandler::accessKeyModifiers()
3753 { 3753 {
3754 #if OS(MACOSX) 3754 #if OS(MACOSX)
3755 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; 3755 return PlatformEvent::CtrlKey | PlatformEvent::AltKey;
3756 #else 3756 #else
3757 return PlatformEvent::AltKey; 3757 return PlatformEvent::AltKey;
3758 #endif 3758 #endif
3759 } 3759 }
3760 3760
3761 } // namespace WebCore 3761 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/inspector/InspectorInputAgent.cpp ('k') | Source/platform/PlatformTouchPoint.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698