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

Unified Diff: content/browser/pointer_lock_browsertest.cc

Issue 2765903002: Fix routing of mouse wheel events while pointer is locked. (Closed)
Patch Set: rebase Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/browser/renderer_host/render_widget_host_input_event_router.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « no previous file | content/browser/renderer_host/render_widget_host_input_event_router.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698