| Index: Source/core/page/EventHandler.cpp
|
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
|
| index dba4986351d23eef481ba5f3effc6195aa5d98aa..bf07582afbfe5282235fa24334cd2538e3aaa9ae 100644
|
| --- a/Source/core/page/EventHandler.cpp
|
| +++ b/Source/core/page/EventHandler.cpp
|
| @@ -3425,22 +3425,29 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
|
| m_touchSequenceDocument.clear();
|
| }
|
|
|
| + ASSERT(m_frame->view());
|
| + if (m_touchSequenceDocument && (!m_touchSequenceDocument->frame() || !m_touchSequenceDocument->frame()->view())) {
|
| + // If the active touch document has no frame or view, it's probably being destroyed
|
| + // so we can't dispatch events.
|
| + return false;
|
| + }
|
| +
|
| // First do hit tests for any new touch points.
|
| for (i = 0; i < points.size(); ++i) {
|
| const PlatformTouchPoint& point = points[i];
|
| - LayoutPoint pagePoint = documentPointForWindowPoint(m_frame, point.pos());
|
|
|
| // Touch events implicitly capture to the touched node, and don't change
|
| // active/hover states themselves (Gesture events do). So we only need
|
| // to hit-test on touchstart, and it can be read-only.
|
| if (point.state() == PlatformTouchPoint::TouchPressed) {
|
| HitTestRequest::HitTestRequestType hitType = HitTestRequest::TouchEvent | HitTestRequest::ReadOnly | HitTestRequest::Active;
|
| + LayoutPoint pagePoint = roundedLayoutPoint(m_frame->view()->windowToContents(point.pos()));
|
| HitTestResult result;
|
| if (!m_touchSequenceDocument) {
|
| result = hitTestResultAtPoint(pagePoint, hitType);
|
| } else if (m_touchSequenceDocument->frame()) {
|
| - LayoutPoint pagePointInOriginatingDocument = documentPointForWindowPoint(m_touchSequenceDocument->frame(), point.pos());
|
| - result = hitTestResultInFrame(m_touchSequenceDocument->frame(), pagePointInOriginatingDocument, hitType);
|
| + LayoutPoint framePoint = roundedLayoutPoint(m_touchSequenceDocument->frame()->view()->windowToContents(point.pos()));
|
| + result = hitTestResultInFrame(m_touchSequenceDocument->frame(), framePoint, hitType);
|
| } else
|
| continue;
|
|
|
| @@ -3457,6 +3464,7 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
|
| // in the active sequence. This must be a single document to
|
| // ensure we don't leak Nodes between documents.
|
| m_touchSequenceDocument = &(result.innerNode()->document());
|
| + ASSERT(m_touchSequenceDocument->frame()->view());
|
| }
|
|
|
| // Ideally we'd ASSERT(!m_targetForTouchID.contains(point.id())
|
| @@ -3509,7 +3517,6 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
|
|
|
| for (i = 0; i < points.size(); ++i) {
|
| const PlatformTouchPoint& point = points[i];
|
| - LayoutPoint pagePoint = documentPointForWindowPoint(m_frame, point.pos());
|
| PlatformTouchPoint::State pointState = point.state();
|
| RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr;
|
|
|
| @@ -3553,24 +3560,17 @@ bool EventHandler::handleTouchEvent(const PlatformTouchEvent& event)
|
| }
|
| ASSERT(targetFrame);
|
|
|
| - if (m_frame != targetFrame) {
|
| - // pagePoint should always be relative to the target elements
|
| - // containing frame.
|
| - pagePoint = documentPointForWindowPoint(targetFrame, point.pos());
|
| - }
|
| + // pagePoint should always be relative to the target elements
|
| + // containing frame.
|
| + FloatPoint pagePoint = targetFrame->view()->windowToContents(point.pos());
|
|
|
| - float scaleFactor = targetFrame->pageZoomFactor();
|
| + float scaleFactor = 1.0f / targetFrame->pageZoomFactor();
|
|
|
| - int adjustedPageX = lroundf(pagePoint.x() / scaleFactor);
|
| - int adjustedPageY = lroundf(pagePoint.y() / scaleFactor);
|
| - int adjustedRadiusX = lroundf(point.radiusX() / scaleFactor);
|
| - int adjustedRadiusY = lroundf(point.radiusY() / scaleFactor);
|
| + FloatPoint adjustedPagePoint = pagePoint.scaledBy(scaleFactor);
|
| + FloatSize adjustedRadius = point.radius().scaledBy(scaleFactor);
|
|
|
| - RefPtrWillBeRawPtr<Touch> touch = Touch::create(targetFrame, touchTarget.get(), point.id(),
|
| - point.screenPos().x(), point.screenPos().y(),
|
| - adjustedPageX, adjustedPageY,
|
| - adjustedRadiusX, adjustedRadiusY,
|
| - point.rotationAngle(), point.force());
|
| + RefPtrWillBeRawPtr<Touch> touch = Touch::create(
|
| + targetFrame, touchTarget.get(), point.id(), point.screenPos(), adjustedPagePoint, adjustedRadius, point.rotationAngle(), point.force());
|
|
|
| // Ensure this target's touch list exists, even if it ends up empty, so
|
| // it can always be passed to TouchEvent::Create below.
|
|
|