| Index: content/browser/pointer_lock_browsertest.cc
|
| diff --git a/content/browser/pointer_lock_browsertest.cc b/content/browser/pointer_lock_browsertest.cc
|
| index 46fde73b719a92cd480fac0f78ab92d58b611237..ad5e90c7b3a720ff629a6462df413cad796b30d7 100644
|
| --- a/content/browser/pointer_lock_browsertest.cc
|
| +++ b/content/browser/pointer_lock_browsertest.cc
|
| @@ -307,4 +307,115 @@ IN_PROC_BROWSER_TEST_F(PointerLockBrowserTest, PointerLockChildFrameDetached) {
|
| web_contents()->GetMouseLockWidget());
|
| }
|
|
|
| +IN_PROC_BROWSER_TEST_F(PointerLockBrowserTest, PointerLockWheelEventRouting) {
|
| + GURL main_url(embedded_test_server()->GetURL(
|
| + "a.com", "/cross_site_iframe_factory.html?a(b)"));
|
| + EXPECT_TRUE(NavigateToURL(shell(), main_url));
|
| +
|
| + FrameTreeNode* root = web_contents()->GetFrameTree()->root();
|
| + FrameTreeNode* child = root->child_at(0);
|
| + RenderWidgetHostInputEventRouter* router =
|
| + web_contents()->GetInputEventRouter();
|
| + RenderWidgetHostViewBase* root_view = static_cast<RenderWidgetHostViewBase*>(
|
| + root->current_frame_host()->GetView());
|
| + RenderWidgetHostViewBase* child_view = static_cast<RenderWidgetHostViewBase*>(
|
| + child->current_frame_host()->GetView());
|
| +
|
| + // Request a pointer lock on the root frame's body.
|
| + EXPECT_TRUE(ExecuteScript(root, "document.body.requestPointerLock()"));
|
| +
|
| + // Root frame should have been granted pointer lock.
|
| + bool locked = false;
|
| + EXPECT_TRUE(ExecuteScriptAndExtractBool(root,
|
| + "window.domAutomationController.send("
|
| + "document.pointerLockElement == "
|
| + "document.body);",
|
| + &locked));
|
| + EXPECT_TRUE(locked);
|
| +
|
| + // Add a mouse move wheel event listener to the root frame.
|
| + EXPECT_TRUE(ExecuteScript(
|
| + root,
|
| + "var x; var y; var mX; var mY; document.addEventListener('mousewheel', "
|
| + "function(e) {x = e.x; y = e.y; dX = e.deltaX; dY = e.deltaY;});"));
|
| + MainThreadFrameObserver root_observer(root_view->GetRenderWidgetHost());
|
| + root_observer.Wait();
|
| +
|
| + blink::WebMouseWheelEvent wheel_event(
|
| + blink::WebInputEvent::MouseWheel, blink::WebInputEvent::NoModifiers,
|
| + blink::WebInputEvent::TimeStampForTesting);
|
| + wheel_event.x = 10;
|
| + wheel_event.y = 11;
|
| + wheel_event.deltaX = -12;
|
| + wheel_event.deltaY = -13;
|
| + router->RouteMouseWheelEvent(root_view, &wheel_event, ui::LatencyInfo());
|
| +
|
| + // Make sure that the renderer handled the input event.
|
| + root_observer.Wait();
|
| +
|
| + int x, y, deltaX, deltaY;
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + root, "window.domAutomationController.send(x);", &x));
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + root, "window.domAutomationController.send(y);", &y));
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + root, "window.domAutomationController.send(dX);", &deltaX));
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + root, "window.domAutomationController.send(dY);", &deltaY));
|
| + EXPECT_EQ(10, x);
|
| + EXPECT_EQ(11, y);
|
| + EXPECT_EQ(12, deltaX);
|
| + EXPECT_EQ(13, deltaY);
|
| +
|
| + // Release pointer lock on root frame.
|
| + EXPECT_TRUE(ExecuteScript(root, "document.exitPointerLock()"));
|
| +
|
| + // Request a pointer lock on the child frame's body.
|
| + EXPECT_TRUE(ExecuteScript(child, "document.body.requestPointerLock()"));
|
| +
|
| + // Child frame should have been granted pointer lock.
|
| + EXPECT_TRUE(ExecuteScriptAndExtractBool(child,
|
| + "window.domAutomationController.send("
|
| + "document.pointerLockElement == "
|
| + "document.body);",
|
| + &locked));
|
| + EXPECT_TRUE(locked);
|
| +
|
| + // Add a mouse move event listener to the child frame.
|
| + EXPECT_TRUE(ExecuteScript(
|
| + child,
|
| + "var x; var y; var mX; var mY; document.addEventListener('mousewheel', "
|
| + "function(e) {x = e.x; y = e.y; dX = e.deltaX; dY = e.deltaY;});"));
|
| + MainThreadFrameObserver child_observer(child_view->GetRenderWidgetHost());
|
| + child_observer.Wait();
|
| +
|
| + gfx::Point transformed_point;
|
| + root_view->TransformPointToCoordSpaceForView(gfx::Point(0, 0), child_view,
|
| + &transformed_point);
|
| +
|
| + wheel_event.x = -transformed_point.x() + 14;
|
| + wheel_event.y = -transformed_point.y() + 15;
|
| + wheel_event.deltaX = -16;
|
| + wheel_event.deltaY = -17;
|
| + // We use root_view intentionally as the RenderWidgetHostInputEventRouter is
|
| + // responsible for correctly routing the event to the child frame.
|
| + router->RouteMouseWheelEvent(root_view, &wheel_event, ui::LatencyInfo());
|
| +
|
| + // Make sure that the renderer handled the input event.
|
| + child_observer.Wait();
|
| +
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + child, "window.domAutomationController.send(x);", &x));
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + child, "window.domAutomationController.send(y);", &y));
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + child, "window.domAutomationController.send(dX);", &deltaX));
|
| + EXPECT_TRUE(ExecuteScriptAndExtractInt(
|
| + child, "window.domAutomationController.send(dY);", &deltaY));
|
| + EXPECT_EQ(14, x);
|
| + EXPECT_EQ(15, y);
|
| + EXPECT_EQ(16, deltaX);
|
| + EXPECT_EQ(17, deltaY);
|
| +}
|
| +
|
| } // namespace content
|
|
|