| Index: content/browser/renderer_host/render_widget_host_input_event_router.cc
 | 
| diff --git a/content/browser/renderer_host/render_widget_host_input_event_router.cc b/content/browser/renderer_host/render_widget_host_input_event_router.cc
 | 
| index 92b07666a80d3b3c46a51db126c86faad0e43ccb..c00ceabf5e0a00599a591f0359640fad24b67583 100644
 | 
| --- a/content/browser/renderer_host/render_widget_host_input_event_router.cc
 | 
| +++ b/content/browser/renderer_host/render_widget_host_input_event_router.cc
 | 
| @@ -11,6 +11,18 @@
 | 
|  #include "content/common/frame_messages.h"
 | 
|  #include "third_party/WebKit/public/web/WebInputEvent.h"
 | 
|  
 | 
| +namespace {
 | 
| +
 | 
| +void TransformEventTouchPositions(blink::WebTouchEvent* event,
 | 
| +                                  const gfx::Vector2d& delta) {
 | 
| +  for (unsigned i = 0; i < event->touchesLength; ++i) {
 | 
| +     event->touches[i].position.x += delta.x();
 | 
| +     event->touches[i].position.y += delta.y();
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +}  // anonymous namespace
 | 
| +
 | 
|  namespace content {
 | 
|  
 | 
|  RenderWidgetHostInputEventRouter::HittestDelegate::HittestDelegate(
 | 
| @@ -127,27 +139,42 @@ void RenderWidgetHostInputEventRouter::RouteTouchEvent(
 | 
|          if (!target)
 | 
|            return;
 | 
|  
 | 
| +        // TODO(wjmaclean): Instead of just computing a delta, we should extract
 | 
| +        // the complete transform. We assume it doesn't change for the duration
 | 
| +        // of the touch sequence, though this could be wrong; a better approach
 | 
| +        // might be to always transform each point to the current_touch_target_
 | 
| +        // for the duration of the sequence.
 | 
| +        touch_delta_ = transformed_point - original_point;
 | 
| +
 | 
|          // Store the weak-ptr to the target, since it could disappear in the
 | 
|          // middle of a touch sequence.
 | 
|          current_touch_target_ = target->GetWeakPtr();
 | 
|        }
 | 
|        ++active_touches_;
 | 
| -      if (current_touch_target_)
 | 
| +      if (current_touch_target_) {
 | 
| +        TransformEventTouchPositions(event, touch_delta_);
 | 
|          current_touch_target_->ProcessTouchEvent(*event, latency);
 | 
| +      }
 | 
|        break;
 | 
|      }
 | 
|      case blink::WebInputEvent::TouchMove:
 | 
| -      if (current_touch_target_)
 | 
| +      if (current_touch_target_) {
 | 
| +        TransformEventTouchPositions(event, touch_delta_);
 | 
|          current_touch_target_->ProcessTouchEvent(*event, latency);
 | 
| +      }
 | 
|        break;
 | 
|      case blink::WebInputEvent::TouchEnd:
 | 
|      case blink::WebInputEvent::TouchCancel:
 | 
|        DCHECK(active_touches_);
 | 
| -      if (current_touch_target_)
 | 
| +      if (current_touch_target_) {
 | 
| +        TransformEventTouchPositions(event, touch_delta_);
 | 
|          current_touch_target_->ProcessTouchEvent(*event, latency);
 | 
| +      }
 | 
|        --active_touches_;
 | 
| -      if (!active_touches_)
 | 
| +      if (!active_touches_) {
 | 
|          current_touch_target_ = WeakTarget();
 | 
| +        touch_delta_ = gfx::Vector2d();
 | 
| +      }
 | 
|        break;
 | 
|      default:
 | 
|        NOTREACHED();
 | 
| 
 |