Index: chrome/browser/ui/webui/options/language_options_interactive_uitest.cc |
diff --git a/chrome/browser/ui/webui/options/language_options_interactive_uitest.cc b/chrome/browser/ui/webui/options/language_options_interactive_uitest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bd7342720fe2de2203fb79db366bd10dc3a1efec |
--- /dev/null |
+++ b/chrome/browser/ui/webui/options/language_options_interactive_uitest.cc |
@@ -0,0 +1,183 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/prefs/pref_service.h" |
+#include "chrome/browser/ui/browser_window.h" |
+#include "chrome/browser/ui/chrome_pages.h" |
+#include "chrome/browser/ui/tabs/tab_strip_model.h" |
+#include "chrome/common/url_constants.h" |
+#include "chrome/test/base/in_process_browser_test.h" |
+#include "chrome/test/base/ui_test_utils.h" |
+#include "content/public/browser/render_frame_host.h" |
+#include "content/public/browser/web_contents.h" |
+#include "content/public/test/browser_test_utils.h" |
+#include "grit/generated_resources.h" |
+#include "ui/base/l10n/l10n_util.h" |
+#include "ui/events/test/event_generator.h" |
+ |
+namespace language_options_ui_test { |
+ |
+namespace { |
+ |
+// TODO(hcarmona): Figure out a better way of getting this constant. |
+const char kAcceptLanguages[] = "intl.accept_languages"; |
+ |
+// This class will test the language options settings. |
+// We need to emulate button pushing because we are testing accessibility, |
+// this means that this is part of interactive_ui_tests. |
+class LanguageOptionsInteractiveTest : public InProcessBrowserTest { |
+ public: |
+ LanguageOptionsInteractiveTest() {} |
+ |
+ protected: |
+ // This method will navigate to the language settings page and show |
+ // a subset of languages from the list of available languages that is not |
+ // the default. |
+ bool NavigateToLanguagePage() { |
+ const GURL& url = chrome::GetSettingsUrl(chrome::kLanguageOptionsSubPage); |
groby-ooo-7-16
2014/08/12 23:57:27
Make this non-ref. GetSettingsUrl returns an objec
hcarmona
2014/08/13 20:24:39
Done.
|
+ ui_test_utils::NavigateToURL(browser(), url); |
+ browser()->profile()->GetPrefs()->SetString( |
+ kAcceptLanguages, "en-US,es,fr"); |
+ return true; |
+ } |
+ |
+ bool GetActiveElementId(std::string *element_id) { |
+ content::RenderFrameHost* active_frame = NULL; |
+ if (!GetActiveFrame(active_frame)) |
+ return false; |
+ |
+ return content::ExecuteScriptAndExtractString( |
+ active_frame, |
+ "domAutomationController.send(document.activeElement.id);", |
+ element_id); |
+ } |
+ |
+ // Will get the active frame. Returns false on error. |
+ bool GetActiveFrame(content::RenderFrameHost* &active_frame) { |
groby-ooo-7-16
2014/08/12 23:57:27
No outparams via ref, sorry :( - Here and elsewhe
hcarmona
2014/08/13 20:24:39
Done.
|
+ content::WebContents* web_contents = NULL; |
+ if (GetActiveWebContents(web_contents)) { |
groby-ooo-7-16
2014/08/12 23:57:27
If this "should never happen", it's OK to just get
hcarmona
2014/08/13 20:24:39
Done.
|
+ active_frame = web_contents->GetFocusedFrame(); |
+ return active_frame; |
+ } |
+ |
+ return false; |
+ } |
+ |
+ // Will get the active web contents. Returns false on error. |
+ bool GetActiveWebContents(content::WebContents* &web_contents) { |
+ if (browser()) { |
+ if (TabStripModel* tab_strip_model = browser()->tab_strip_model()) { |
+ web_contents = tab_strip_model->GetActiveWebContents(); |
+ return web_contents; |
+ } |
+ } |
+ |
+ return false; |
+ } |
+ |
+ // Press and release a key in a particular window. Returns false on error. |
+ bool PressKey(ui::KeyboardCode key_code) { |
+ gfx::NativeWindow native_window = NULL; |
+ if (!GetNativeWindow(native_window)) |
groby-ooo-7-16
2014/08/12 23:57:27
NULL check not needed if this should always be not
hcarmona
2014/08/13 20:24:39
Done.
|
+ return false; |
+ |
+ ui::test::EventGenerator eventGen(native_window); |
+ eventGen.PressKey(key_code, ui::EF_NONE); |
+ eventGen.ReleaseKey(key_code, ui::EF_NONE); |
+ return true; |
+ } |
+ |
+ protected: |
+ // Will get the native window. Returns false on error. |
+ bool GetNativeWindow(gfx::NativeWindow &native_window) { |
groby-ooo-7-16
2014/08/12 23:57:27
Chrome's code standard doesn't allow out parameter
hcarmona
2014/08/13 20:24:39
Done.
|
+ if (browser()) { |
+ if (BrowserWindow* window = browser()->window()) { |
+ native_window = window->GetNativeWindow(); |
+ return true; |
+ } |
+ } |
+ |
+ return false; |
+ } |
+ |
+ private: |
+ DISALLOW_COPY_AND_ASSIGN(LanguageOptionsInteractiveTest); |
+}; |
+ |
+} // namespace |
+ |
+// This test will verify that after calling NavigateToLanguagePage |
+// we are in the correct page. |
+// TODO(hcarmona): |
+// Is this test necessary? All other tests will fail if this one fails. |
groby-ooo-7-16
2014/08/12 23:57:28
If this is a precondition, I'd handle this in the
hcarmona
2014/08/13 20:24:39
Done.
|
+// How to handle change in title format? (that would break this test) |
groby-ooo-7-16
2014/08/12 23:57:27
Don't worry about that - it's up to the person cha
hcarmona
2014/08/13 20:24:39
Acknowledged.
|
+IN_PROC_BROWSER_TEST_F(LanguageOptionsInteractiveTest, TestNavigateToLanguage) { |
+ ASSERT_TRUE(NavigateToLanguagePage()); |
+ |
+ content::WebContents* web_contents = NULL; |
+ ASSERT_TRUE(GetActiveWebContents(web_contents)); |
+ |
+ base::string16 expected_title = l10n_util::GetStringFUTF16( |
+ IDS_OPTIONS_TAB_TITLE, |
+ l10n_util::GetStringUTF16(IDS_SETTINGS_TITLE), |
+ l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_LANGUAGES_DIALOG_TITLE)); |
+ |
+ EXPECT_EQ(expected_title, web_contents->GetTitle()); |
+} |
+ |
+// This test will verify that the appropriate languages are available. |
+IN_PROC_BROWSER_TEST_F(LanguageOptionsInteractiveTest, TestMockLanguages) { |
+ ASSERT_TRUE(NavigateToLanguagePage()); |
+ |
+ content::RenderFrameHost* active_frame = NULL; |
+ ASSERT_TRUE(GetActiveFrame(active_frame)); |
+ |
+ int language_count = 0; |
+ EXPECT_TRUE(content::ExecuteScriptAndExtractInt( |
+ active_frame, |
+ "var count = 0;" |
+ "for (var i = 0; i < document.activeElement.childElementCount; ++i) {" |
+ " if (document.activeElement.children[i].className == 'deletable-item')" |
+ " ++count;" |
+ "}" |
+ "domAutomationController.send(count);", |
+ &language_count)); |
+ |
+ // this test will fail until I can add languages |
+ EXPECT_EQ(3, language_count); |
+ |
+ std::string languages = ""; |
+ EXPECT_TRUE(content::ExecuteScriptAndExtractString( |
+ active_frame, |
+ "domAutomationController.send(document.activeElement.textContent);", |
+ &languages)); |
+ |
+ // this test will fail until I can add languages |
+ EXPECT_EQ("English (United States)SpanishFrench", languages); |
+} |
+ |
+// TODO(hcarmona): There is an error that needs to be addressed: |
+// Cannot get a GdkWindow for a key event. |
+// Cannot translate a XKeyEvent to a GdkEvent. |
groby-ooo-7-16
2014/08/12 23:57:27
Might want to ping yukishiino@ about this.
hcarmona
2014/08/13 20:24:39
Found another way to send keyboard events that get
|
+// Test appearst to work even though there are these errors |
+// This test will validate that the language webui is accessible through |
+// the keyboard. |
+IN_PROC_BROWSER_TEST_F(LanguageOptionsInteractiveTest, HOCTestAccessibility) { |
+ ASSERT_TRUE(NavigateToLanguagePage()); |
+ |
+ // verify that the list is focused by default |
+ std::string original_id; |
+ ASSERT_TRUE(GetActiveElementId(&original_id)); |
+ EXPECT_EQ("language-options-list", original_id); |
+ |
+ // press tab to select the next element |
+ ASSERT_TRUE(PressKey(ui::VKEY_TAB)); |
+ |
+ // make sure that the next element is the button that is next in the tab order |
groby-ooo-7-16
2014/08/12 23:57:27
Can you instead just test that it's moved on to a
hcarmona
2014/08/13 20:24:39
Kept this expectation the same because we want to
|
+ std::string new_id; |
+ ASSERT_TRUE(GetActiveElementId(&new_id)); |
+ EXPECT_EQ("language-options-add-button", new_id); |
+} |
+ |
+} // namespace language_options_ui_test |