Index: chrome/browser/apps/guest_view/web_view_browsertest.cc |
diff --git a/chrome/browser/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc |
index 5cd24d4cde654f215d2607f88e736b488591f8a7..b7a9c9fcb3a14bc66fb753ed3d561f129ed51104 100644 |
--- a/chrome/browser/apps/guest_view/web_view_browsertest.cc |
+++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc |
@@ -3340,6 +3340,95 @@ INSTANTIATE_TEST_CASE_P(WebViewScrollBubbling, |
WebViewGuestScrollTouchTest, |
testing::Combine(testing::Bool(), testing::Bool())); |
+#if defined(USE_AURA) |
+class WebViewGuestTouchFocusTest : public WebViewTestBase { |
+ public: |
+ WebViewGuestTouchFocusTest() {} |
+ void SetUpCommandLine(base::CommandLine* command_line) override { |
+ WebViewTestBase::SetUpCommandLine(command_line); |
+ |
+ command_line->AppendSwitchASCII(switches::kTouchEvents, |
+ switches::kTouchEventsEnabled); |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(WebViewGuestTouchFocusTest); |
+}; |
+ |
+class FocusChangeWaiter { |
+ public: |
+ explicit FocusChangeWaiter(content::WebContents* web_contents, |
+ bool expected_focus) |
+ : web_contents_(web_contents), expected_focus_(expected_focus) {} |
+ ~FocusChangeWaiter() {} |
+ |
+ void WaitForFocusChange() { |
+ while (expected_focus_ != |
+ IsWebContentsBrowserPluginFocused(web_contents_)) { |
+ base::RunLoop().RunUntilIdle(); |
+ } |
+ } |
+ |
+ private: |
+ content::WebContents* web_contents_; |
+ bool expected_focus_; |
+}; |
+ |
+IN_PROC_BROWSER_TEST_F(WebViewGuestTouchFocusTest, |
+ TouchFocusesBrowserPluginInEmbedder) { |
+ // This test is only relevant for non-OOPIF WebView. |
+ if (content::BrowserPluginGuestMode::UseCrossProcessFramesForGuests()) |
+ return; |
+ |
+ LoadAppWithGuest("web_view/guest_focus_test"); |
+ |
+ // Lookup relevant information about guest and embedder. |
+ content::WebContents* embedder_contents = GetEmbedderWebContents(); |
+ |
+ std::vector<content::WebContents*> guest_web_contents_list; |
+ GetGuestViewManager()->WaitForNumGuestsCreated(1u); |
+ GetGuestViewManager()->GetGuestWebContentsList(&guest_web_contents_list); |
+ ASSERT_EQ(1u, guest_web_contents_list.size()); |
+ |
+ content::WebContents* guest_contents = guest_web_contents_list[0]; |
+ |
+ gfx::Rect embedder_rect = embedder_contents->GetContainerBounds(); |
+ gfx::Rect guest_rect = guest_contents->GetContainerBounds(); |
+ |
+ guest_rect.set_x(guest_rect.x() - embedder_rect.x()); |
+ guest_rect.set_y(guest_rect.y() - embedder_rect.y()); |
+ embedder_rect.set_x(0); |
+ embedder_rect.set_y(0); |
+ |
+ // Don't send events that need to be routed until we know the child's surface |
+ // is ready for hit testing. |
+ WaitForGuestSurfaceReady(guest_contents); |
+ |
+ // 1) BrowserPlugin should not be focused at start. |
+ EXPECT_FALSE(IsWebContentsBrowserPluginFocused(guest_contents)); |
+ |
+ // 2) Send touch event to guest, now BrowserPlugin should get focus. |
+ { |
+ gfx::Point point = guest_rect.CenterPoint(); |
+ FocusChangeWaiter focus_waiter(guest_contents, true); |
+ SendRoutedTouchTapSequence(embedder_contents, point); |
+ SendRoutedGestureTapSequence(embedder_contents, point); |
+ focus_waiter.WaitForFocusChange(); |
+ EXPECT_TRUE(IsWebContentsBrowserPluginFocused(guest_contents)); |
+ } |
+ |
+ // 3) Send touch start to embedder, now BrowserPlugin should lose focus. |
+ { |
+ gfx::Point point(10, 10); |
+ FocusChangeWaiter focus_waiter(guest_contents, false); |
+ SendRoutedTouchTapSequence(embedder_contents, point); |
+ SendRoutedGestureTapSequence(embedder_contents,point); |
+ focus_waiter.WaitForFocusChange(); |
+ EXPECT_FALSE(IsWebContentsBrowserPluginFocused(guest_contents)); |
+ } |
+} |
+#endif |
+ |
IN_PROC_BROWSER_TEST_P(WebViewGuestScrollTouchTest, |
TestGuestGestureScrollsBubble) { |
// Just in case we're running ChromeOS tests, we need to make sure the |