Chromium Code Reviews| Index: content/browser/site_per_process_browsertest.cc |
| diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc |
| index c91e6b1592c5ed9150be7eb3b562882b55a28d60..c4b78ef2bc45aa555823309b5fd341cbfecbe5e6 100644 |
| --- a/content/browser/site_per_process_browsertest.cc |
| +++ b/content/browser/site_per_process_browsertest.cc |
| @@ -740,6 +740,82 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessHighDPIBrowserTest, |
| SurfaceHitTestTestHelper(shell(), embedded_test_server()); |
| } |
| +// Test that mouse events are being routed to the correct RenderWidgetHostView |
| +// when there are nested out-of-process iframes. |
| +#if defined(OS_ANDROID) |
| +// Browser process hit testing is not implemented on Android. |
| +// https://crbug.com/491334 |
| +#define MAYBE_NestedSurfaceHitTestTest DISABLED_NestedSurfaceHitTestTest |
| +#else |
| +#define MAYBE_NestedSurfaceHitTestTest NestedSurfaceHitTestTest |
| +#endif |
| +IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
| + MAYBE_NestedSurfaceHitTestTest) { |
| + GURL main_url(embedded_test_server()->GetURL( |
| + "/frame_tree/page_with_positioned_nested_frames.html")); |
|
lfg
2016/02/29 18:25:11
This is fine, but if you use cross_site_iframe_fac
kenrb
2016/02/29 19:59:54
It looks like it would be a similar amount of code
nasko
2016/02/29 22:15:37
Can't we define some positioning algorithm for the
kenrb
2016/03/01 15:50:30
I will take a todo on that, since I would need to
|
| + NavigateToURL(shell(), main_url); |
| + |
| + // It is safe to obtain the root frame tree node here, as it doesn't change. |
| + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
| + ->GetFrameTree() |
| + ->root(); |
| + ASSERT_EQ(1U, root->child_count()); |
| + |
| + FrameTreeNode* parent_iframe_node = root->child_at(0); |
| + GURL site_url(embedded_test_server()->GetURL( |
| + "a.com", "/frame_tree/page_with_positioned_frame.html")); |
| + EXPECT_EQ(site_url, parent_iframe_node->current_url()); |
| + EXPECT_NE(shell()->web_contents()->GetSiteInstance(), |
| + parent_iframe_node->current_frame_host()->GetSiteInstance()); |
| + |
| + FrameTreeNode* nested_iframe_node = parent_iframe_node->child_at(0); |
| + GURL nested_site_url( |
| + embedded_test_server()->GetURL("baz.com", "/title1.html")); |
| + EXPECT_EQ(nested_site_url, nested_iframe_node->current_url()); |
| + EXPECT_NE(shell()->web_contents()->GetSiteInstance(), |
| + nested_iframe_node->current_frame_host()->GetSiteInstance()); |
| + EXPECT_NE(parent_iframe_node->current_frame_host()->GetSiteInstance(), |
| + nested_iframe_node->current_frame_host()->GetSiteInstance()); |
| + |
| + // Create listeners for mouse events. |
| + RenderWidgetHostMouseEventMonitor main_frame_monitor( |
| + root->current_frame_host()->GetRenderWidgetHost()); |
| + RenderWidgetHostMouseEventMonitor child_frame_monitor( |
|
nasko
2016/02/29 22:15:37
nit: nested_frame_monitor?
kenrb
2016/03/01 15:50:30
Done.
|
| + nested_iframe_node->current_frame_host()->GetRenderWidgetHost()); |
| + |
| + RenderWidgetHostInputEventRouter* router = |
| + static_cast<WebContentsImpl*>(shell()->web_contents()) |
| + ->GetInputEventRouter(); |
| + |
| + RenderWidgetHostViewBase* root_view = static_cast<RenderWidgetHostViewBase*>( |
| + root->current_frame_host()->GetRenderWidgetHost()->GetView()); |
| + RenderWidgetHostViewBase* rwhv_nested = |
| + static_cast<RenderWidgetHostViewBase*>( |
| + nested_iframe_node->current_frame_host() |
| + ->GetRenderWidgetHost() |
| + ->GetView()); |
| + |
| + SurfaceHitTestReadyNotifier notifier( |
| + static_cast<RenderWidgetHostViewChildFrame*>(rwhv_nested)); |
| + notifier.WaitForSurfaceReady(); |
| + |
| + // Target input event to nested frame. |
| + blink::WebMouseEvent child_event; |
| + child_event.type = blink::WebInputEvent::MouseDown; |
| + child_event.button = blink::WebPointerProperties::ButtonLeft; |
| + child_event.x = 125; |
| + child_event.y = 125; |
| + child_event.clickCount = 1; |
| + main_frame_monitor.ResetEventReceived(); |
| + child_frame_monitor.ResetEventReceived(); |
| + router->RouteMouseEvent(root_view, &child_event); |
| + |
| + EXPECT_TRUE(child_frame_monitor.EventWasReceived()); |
| + EXPECT_EQ(21, child_frame_monitor.event().x); |
| + EXPECT_EQ(21, child_frame_monitor.event().y); |
| + EXPECT_FALSE(main_frame_monitor.EventWasReceived()); |
| +} |
| + |
| // This test tests that browser process hittesting ignores frames with |
| // pointer-events: none. |
| #if defined(OS_ANDROID) |