Chromium Code Reviews| Index: chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc |
| diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc |
| index 2a7094e3c82898e2e33b0e7db4cb8c9f83352e14..f64804ac6f3d335e5aca7d0e65e96acd2d936ea2 100644 |
| --- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc |
| +++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc |
| @@ -9,6 +9,7 @@ |
| #include "base/single_thread_task_runner.h" |
| #include "base/strings/stringprintf.h" |
| #include "base/strings/utf_string_conversions.h" |
| +#include "base/test/test_timeouts.h" |
| #include "base/threading/thread_task_runner_handle.h" |
| #include "build/build_config.h" |
| #include "chrome/app/chrome_command_ids.h" |
| @@ -56,6 +57,60 @@ using guest_view::GuestViewManager; |
| using guest_view::TestGuestViewManager; |
| using guest_view::TestGuestViewManagerFactory; |
| +#if defined(OS_MACOSX) |
| +// The original TextInputClientMessageFilter is added during the initialization |
| +// phase of RenderProcessHost. The only chance we have to add the test filter |
| +// (so that it can receive the TextInputClientMac incoming IPC messages) is |
| +// during the call to RenderProcessWillLaunch() on ContentBrowserClient. This |
| +// class provides that for testing. |
| +class BrowserClientForTextInputClientMac : public ChromeContentBrowserClient { |
| + public: |
| + BrowserClientForTextInputClientMac() {} |
| + ~BrowserClientForTextInputClientMac() override {} |
| + |
| + // ContentBrowserClient overrides. |
| + void RenderProcessWillLaunch( |
| + content::RenderProcessHost* process_host) override { |
| + ChromeContentBrowserClient::RenderProcessWillLaunch(process_host); |
| + filters_.push_back( |
| + new content::TestTextInputClientMessageFilter(process_host)); |
| + } |
| + |
| + // Retrieves the registered filter for the given RenderProcessHost. It will |
| + // return false if the RenderProcessHost was initialized while a different |
| + // instance of ContentBrowserClient was in action. |
| + scoped_refptr<content::TestTextInputClientMessageFilter> |
| + GetTextInputClientMessageFilterForProcess( |
| + content::RenderProcessHost* process_host) const { |
| + for (auto filter : filters_) { |
| + if (filter->process() == process_host) |
| + return filter; |
| + } |
| + return nullptr; |
| + } |
| + |
| + private: |
| + std::vector<scoped_refptr<content::TestTextInputClientMessageFilter>> |
| + filters_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(BrowserClientForTextInputClientMac); |
| +}; |
| + |
| +// Helper class to temporarily replace the ContentBrowserClient with the one |
| +// provided. |
| +class ScopedBrowserClient { |
| + public: |
| + explicit ScopedBrowserClient(content::ContentBrowserClient* client) |
| + : old_client_(content::SetBrowserClientForTesting(client)) {} |
| + ~ScopedBrowserClient() { content::SetBrowserClientForTesting(old_client_); } |
| + |
| + private: |
| + content::ContentBrowserClient* old_client_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(ScopedBrowserClient); |
| +}; |
| +#endif // OS_MACOSX |
| + |
| class WebViewInteractiveTestBase : public extensions::PlatformAppBrowserTest { |
| public: |
| WebViewInteractiveTestBase() |
| @@ -1362,6 +1417,38 @@ IN_PROC_BROWSER_TEST_P(WebViewInteractiveTest, TextSelection) { |
| ASSERT_TRUE(selected_text.size() >= 10u); |
| ASSERT_EQ("AAAAAAAAAA", selected_text.substr(0, 10)); |
| } |
| + |
| +// Verifies that asking for a word lookup from a guest will lead to a returned |
| +// IPC from the renderer containing the right selected word. |
| +IN_PROC_BROWSER_TEST_P(WebViewInteractiveTest, WordLookup) { |
| + // BrowserClientForTextInputClientMac needs to replace the |
| + // ChromeContentBrowserClient after most things are initialized but before the |
| + // WebContents is created. |
| + BrowserClientForTextInputClientMac browser_client; |
|
lazyboy
2017/04/13 18:08:18
optional: You could actually put the scoping logic
|
| + ScopedBrowserClient scoped_client(&browser_client); |
| + |
| + SetupTest("web_view/text_selection", |
| + "/extensions/platform_apps/web_view/text_selection/guest.html"); |
| + ASSERT_TRUE(guest_web_contents()); |
| + ASSERT_TRUE(ui_test_utils::ShowAndFocusNativeWindow(GetPlatformAppWindow())); |
| + |
| + auto guest_message_filter = |
| + browser_client.GetTextInputClientMessageFilterForProcess( |
| + guest_web_contents()->GetRenderProcessHost()); |
| + ASSERT_TRUE(guest_message_filter); |
| + |
| + // Lookup some string through context menu. |
| + ContextMenuNotificationObserver menu_observer(IDC_CONTENT_CONTEXT_LOOK_UP); |
| + // Simulating a mouse click at a position to highlight text in guest and |
| + // showing the context menu. |
| + SimulateRWHMouseClick(guest_web_contents()->GetRenderViewHost()->GetWidget(), |
| + blink::WebMouseEvent::Button::kRight, 20, 20); |
| + // Wait for the response form the guest renderer. |
| + guest_message_filter->WaitForStringFromRange(); |
| + |
| + // Sanity check. |
| + ASSERT_EQ("AAAA", guest_message_filter->string_from_range().substr(0, 4)); |
| +} |
| #endif |
| IN_PROC_BROWSER_TEST_P(WebViewFocusInteractiveTest, FocusAndVisibility) { |