| 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 2a232579a9fbf7fa76ec529a5a137089d2f64a54..254937a016c3d0220168b96205de165844efb33a 100644
|
| --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc
|
| +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
|
| @@ -355,6 +355,38 @@ class MockDownloadWebContentsDelegate : public content::WebContentsDelegate {
|
| DISALLOW_COPY_AND_ASSIGN(MockDownloadWebContentsDelegate);
|
| };
|
|
|
| +class TextInputStateHelper {
|
| + public:
|
| + using Predicate =
|
| + base::Callback<bool(const content::TextInputStateTestExport&)>;
|
| +
|
| + static void WaitForDesiredState(content::WebContents* web_contents,
|
| + const Predicate& predicate) {
|
| + content::TextInputStateTestExport state =
|
| + content::TextInputStateTestExport::FromWebContents(web_contents);
|
| + while (!predicate.Run(state)) {
|
| + scoped_refptr<content::MessageLoopRunner> loop =
|
| + new content::MessageLoopRunner();
|
| + content::BrowserThread::PostDelayedTask(
|
| + content::BrowserThread::UI, FROM_HERE, loop->QuitClosure(),
|
| + base::TimeDelta::FromMilliseconds(1LL));
|
| + loop->Run();
|
| + state = content::TextInputStateTestExport::FromWebContents(web_contents);
|
| + }
|
| + }
|
| +
|
| + static bool IsStateOfGivenType(
|
| + ui::TextInputType type,
|
| + const content::TextInputStateTestExport& state) {
|
| + return type == state.type();
|
| + }
|
| +
|
| + static bool HasGivenValue(const std::string& value,
|
| + const content::TextInputStateTestExport& state) {
|
| + return value == state.value();
|
| + }
|
| +};
|
| +
|
| // TODO(wjmaclean): Fix this test class at some point so it can be re-enabled on
|
| // the site isolation bots, and then look at re-enabling WebViewFocusTest when
|
| // that happens.
|
| @@ -783,6 +815,12 @@ class WebViewWithZoomForDSFTest : public WebViewTest {
|
| static float scale() { return 2.0f; }
|
| };
|
|
|
| +// TODO(ekaramad): Enable this test for OOPIF.
|
| +class WebViewTextInputStateTest : public WebViewTest {};
|
| +INSTANTIATE_TEST_CASE_P(WebViewTests,
|
| + WebViewTextInputStateTest,
|
| + testing::Bool());
|
| +
|
| class WebContentsAudioMutedObserver : public content::WebContentsObserver {
|
| public:
|
| explicit WebContentsAudioMutedObserver(content::WebContents* web_contents)
|
| @@ -3113,3 +3151,79 @@ IN_PROC_BROWSER_TEST_P(WebViewTest, TaskManagementPostExistingWebViews) {
|
| }
|
|
|
| #endif // defined(ENABLE_TASK_MANAGER)
|
| +
|
| +// TODO(ekaramad): Activate this test for OOPIF when input event routing for
|
| +// OOPIF-<webview> is fixed.
|
| +IN_PROC_BROWSER_TEST_P(WebViewTextInputStateTest,
|
| + TopLevelWebContentsTracksCorrectly) {
|
| + if (content::BrowserPluginGuestMode::UseCrossProcessFramesForGuests())
|
| + return;
|
| +
|
| + ASSERT_TRUE(StartEmbeddedTestServer());
|
| +
|
| + EXPECT_TRUE(!!LoadGuest(
|
| + "/extensions/platform_apps/web_view/text_input_state/guest.html",
|
| + "web_view/text_input_state"));
|
| +
|
| + auto press_tab = [](content::WebContents* web_contents) {
|
| + content::SimulateKeyPress(web_contents, ui::VKEY_TAB, false, false, false,
|
| + false);
|
| + };
|
| +
|
| + auto get_type_checker = [](ui::TextInputType target) {
|
| + return base::Bind(&TextInputStateHelper::IsStateOfGivenType, target);
|
| + };
|
| +
|
| + content::WebContents* embedder_webcontents = GetEmbedderWebContents();
|
| +
|
| + // Press the tab key. The <input> in the embedder should get focused.
|
| + // Top level state type should be number.
|
| + press_tab(embedder_webcontents);
|
| + TextInputStateHelper::WaitForDesiredState(
|
| + GetEmbedderWebContents(), get_type_checker(ui::TEXT_INPUT_TYPE_NUMBER));
|
| +
|
| + // Press the tab key again and the <input> inside <webview> gets focused. The
|
| + // input type should text now.
|
| + press_tab(embedder_webcontents);
|
| + TextInputStateHelper::WaitForDesiredState(
|
| + GetEmbedderWebContents(), get_type_checker(ui::TEXT_INPUT_TYPE_TEXT));
|
| +
|
| + // Press the tab key one more time to get back to embedder's second <input>.
|
| + // The value should be "last one".
|
| + press_tab(embedder_webcontents);
|
| + TextInputStateHelper::WaitForDesiredState(
|
| + GetEmbedderWebContents(),
|
| + base::Bind(&TextInputStateHelper::HasGivenValue, "last one"));
|
| +}
|
| +
|
| +// TODO(ekaramad): Activate this test for OOPIF when input event routing for
|
| +// OOPIF-<webview> is fixed.
|
| +IN_PROC_BROWSER_TEST_P(WebViewTextInputStateTest, CrashingWebViewResetsState) {
|
| + if (content::BrowserPluginGuestMode::UseCrossProcessFramesForGuests())
|
| + return;
|
| +
|
| + ASSERT_TRUE(StartEmbeddedTestServer());
|
| +
|
| + content::WebContents* guest_contents = LoadGuest(
|
| + "/extensions/platform_apps/web_view/text_input_state/guest.html",
|
| + "web_view/text_input_state");
|
| +
|
| + // Press tab key twice to end up in the <input> of the <webview>,
|
| + for (size_t i = 0; i < 2; ++i) {
|
| + content::SimulateKeyPress(GetEmbedderWebContents(), ui::VKEY_TAB, false,
|
| + false, false, false);
|
| + };
|
| +
|
| + TextInputStateHelper::WaitForDesiredState(
|
| + GetEmbedderWebContents(),
|
| + base::Bind(&TextInputStateHelper::HasGivenValue, "guest"));
|
| +
|
| + // Now crash the <webview>.
|
| + guest_contents->GetRenderProcessHost()->Shutdown(false, 0);
|
| +
|
| + // State should reset to none.
|
| + TextInputStateHelper::WaitForDesiredState(
|
| + GetEmbedderWebContents(),
|
| + base::Bind(&TextInputStateHelper::IsStateOfGivenType,
|
| + ui::TEXT_INPUT_TYPE_NONE));
|
| +}
|
|
|