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

Unified Diff: chrome/browser/apps/guest_view/web_view_browsertest.cc

Issue 1652483002: Browser Side Text Input State Tracking for OOPIF. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 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
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 3def5c52abf3b19cee0ccee6af4dcb5eb5dba753..5a5c41f247af0b232c761c2e126c3b31ab9f2ab7 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.
@@ -781,6 +813,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)
@@ -3116,3 +3154,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(
lazyboy 2016/04/04 19:17:59 Generally, queuing tasks to wait for a change is d
EhsanK 2016/04/06 00:37:58 (As discussed offline) I now listen to 'onfocus()'
+ 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));
+}

Powered by Google App Engine
This is Rietveld 408576698