[DevTools] Route synthetic gestures to OOPIF's widget hosts

This follows mouse and touch events in input handler.

Bug: 746266
Change-Id: I10e08dbc6af952e240e6426a145bf1257ccd93ae
Reviewed-on: https://chromium-review.googlesource.com/947470
Commit-Queue: Dmitry Gozman <dgozman@chromium.org>
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
Cr-Commit-Position: refs/heads/master@{#541019}
diff --git a/content/browser/devtools/protocol/input_handler.cc b/content/browser/devtools/protocol/input_handler.cc
index cda79f3..689dc38 100644
--- a/content/browser/devtools/protocol/input_handler.cc
+++ b/content/browser/devtools/protocol/input_handler.cc
@@ -889,7 +889,16 @@
     return;
   }
 
-  host_->GetRenderWidgetHost()->QueueSyntheticGesture(
+  gfx::PointF transformed;
+  RenderWidgetHostImpl* widget_host =
+      FindTargetWidgetHost(gesture_params.anchor, &transformed);
+  gesture_params.anchor = transformed;
+  if (!widget_host) {
+    callback->sendFailure(Response::InternalError());
+    return;
+  }
+
+  widget_host->QueueSyntheticGesture(
       SyntheticGesture::Create(gesture_params),
       base::BindOnce(&SendSynthesizePinchGestureResponse, std::move(callback)));
 }
@@ -947,34 +956,50 @@
     return;
   }
 
+  gfx::PointF transformed;
+  RenderWidgetHostImpl* widget_host =
+      FindTargetWidgetHost(gesture_params.anchor, &transformed);
+  gesture_params.anchor = transformed;
+  if (!widget_host) {
+    callback->sendFailure(Response::InternalError());
+    return;
+  }
+
   SynthesizeRepeatingScroll(
-      gesture_params, repeat_count.fromMaybe(0),
+      widget_host->GetWeakPtr(), gesture_params, repeat_count.fromMaybe(0),
       base::TimeDelta::FromMilliseconds(repeat_delay_ms.fromMaybe(250)),
       interaction_marker_name.fromMaybe(""), ++last_id_, std::move(callback));
 }
 
 void InputHandler::SynthesizeRepeatingScroll(
+    base::WeakPtr<RenderWidgetHostImpl> widget_host,
     SyntheticSmoothScrollGestureParams gesture_params,
     int repeat_count,
     base::TimeDelta repeat_delay,
     std::string interaction_marker_name,
     int id,
     std::unique_ptr<SynthesizeScrollGestureCallback> callback) {
+  if (!widget_host) {
+    callback->sendFailure(Response::Error("Frame was detached"));
+    return;
+  }
+
   if (!interaction_marker_name.empty()) {
     // TODO(alexclarke): Can we move this elsewhere? It doesn't really fit here.
     TRACE_EVENT_COPY_ASYNC_BEGIN0("benchmark", interaction_marker_name.c_str(),
                                   id);
   }
 
-  host_->GetRenderWidgetHost()->QueueSyntheticGesture(
+  widget_host->QueueSyntheticGesture(
       SyntheticGesture::Create(gesture_params),
       base::BindOnce(&InputHandler::OnScrollFinished,
-                     weak_factory_.GetWeakPtr(), gesture_params, repeat_count,
-                     repeat_delay, interaction_marker_name, id,
+                     weak_factory_.GetWeakPtr(), widget_host, gesture_params,
+                     repeat_count, repeat_delay, interaction_marker_name, id,
                      std::move(callback)));
 }
 
 void InputHandler::OnScrollFinished(
+    base::WeakPtr<RenderWidgetHostImpl> widget_host,
     SyntheticSmoothScrollGestureParams gesture_params,
     int repeat_count,
     base::TimeDelta repeat_delay,
@@ -991,7 +1016,7 @@
     base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
         FROM_HERE,
         base::BindOnce(&InputHandler::SynthesizeRepeatingScroll,
-                       weak_factory_.GetWeakPtr(), gesture_params,
+                       weak_factory_.GetWeakPtr(), widget_host, gesture_params,
                        repeat_count - 1, repeat_delay, interaction_marker_name,
                        id, std::move(callback)),
         repeat_delay);
@@ -1038,10 +1063,19 @@
     return;
   }
 
+  gfx::PointF transformed;
+  RenderWidgetHostImpl* widget_host =
+      FindTargetWidgetHost(gesture_params.position, &transformed);
+  gesture_params.position = transformed;
+  if (!widget_host) {
+    callback->sendFailure(Response::InternalError());
+    return;
+  }
+
   TapGestureResponse* response =
       new TapGestureResponse(std::move(callback), count);
   for (int i = 0; i < count; i++) {
-    host_->GetRenderWidgetHost()->QueueSyntheticGesture(
+    widget_host->QueueSyntheticGesture(
         SyntheticGesture::Create(gesture_params),
         base::BindOnce(&TapGestureResponse::OnGestureResult,
                        base::Unretained(response)));
diff --git a/content/browser/devtools/protocol/input_handler.h b/content/browser/devtools/protocol/input_handler.h
index 2cdebb42..9dce4844 100644
--- a/content/browser/devtools/protocol/input_handler.h
+++ b/content/browser/devtools/protocol/input_handler.h
@@ -127,6 +127,7 @@
   class InputInjector;
 
   void SynthesizeRepeatingScroll(
+      base::WeakPtr<RenderWidgetHostImpl> widget_host,
       SyntheticSmoothScrollGestureParams gesture_params,
       int repeat_count,
       base::TimeDelta repeat_delay,
@@ -135,6 +136,7 @@
       std::unique_ptr<SynthesizeScrollGestureCallback> callback);
 
   void OnScrollFinished(
+      base::WeakPtr<RenderWidgetHostImpl> widget_host,
       SyntheticSmoothScrollGestureParams gesture_params,
       int repeat_count,
       base::TimeDelta repeat_delay,