Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright 2013 The Chromium Authors. All rights reserved. | 2 * Copyright 2013 The Chromium Authors. All rights reserved. |
| 3 * Use of this source code is governed by a BSD-style license that can be | 3 * Use of this source code is governed by a BSD-style license that can be |
| 4 * found in the LICENSE file. | 4 * found in the LICENSE file. |
| 5 */ | 5 */ |
| 6 #include "chrome/browser/chromeos/extensions/virtual_keyboard_browsertest.h" | |
| 6 | 7 |
| 7 #include <vector> | 8 #include <vector> |
| 8 | 9 |
| 9 #include "ash/shell.h" | 10 #include "ash/shell.h" |
| 10 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 11 #include "chrome/browser/ui/browser.h" | 12 #include "chrome/browser/ui/browser.h" |
| 12 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 13 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 13 #include "chrome/test/base/in_process_browser_test.h" | 14 #include "chrome/test/base/in_process_browser_test.h" |
| 14 #include "chrome/test/base/ui_test_utils.h" | 15 #include "chrome/test/base/ui_test_utils.h" |
| 15 #include "content/public/browser/render_view_host.h" | 16 #include "content/public/browser/render_view_host.h" |
| 16 #include "content/public/browser/render_widget_host_iterator.h" | 17 #include "content/public/browser/render_widget_host_iterator.h" |
| 17 #include "content/public/browser/site_instance.h" | 18 #include "content/public/browser/site_instance.h" |
| 18 #include "content/public/browser/web_contents.h" | 19 #include "content/public/browser/web_contents.h" |
| 19 #include "content/public/test/browser_test_utils.h" | 20 #include "content/public/test/browser_test_utils.h" |
| 20 #include "ui/aura/client/aura_constants.h" | 21 #include "ui/aura/client/aura_constants.h" |
| 21 #include "ui/base/ime/input_method.h" | 22 #include "ui/base/ime/input_method.h" |
| 22 #include "ui/keyboard/keyboard_controller.h" | 23 #include "ui/keyboard/keyboard_controller.h" |
| 23 #include "ui/keyboard/keyboard_switches.h" | 24 #include "ui/keyboard/keyboard_switches.h" |
| 24 | 25 |
| 25 namespace { | 26 namespace { |
| 27 const base::FilePath::CharType kWebuiTestDir[] = FILE_PATH_LITERAL("webui"); | |
| 26 | 28 |
| 27 const base::FilePath kWebuiTestDir = | 29 const base::FilePath::CharType kMockController[] = |
| 28 base::FilePath(FILE_PATH_LITERAL("webui")); | 30 FILE_PATH_LITERAL("mock_controller.js"); |
| 29 | 31 |
| 30 const base::FilePath kVirtualKeyboardTestDir = | 32 const base::FilePath::CharType kMockTimer[] = |
| 31 base::FilePath(FILE_PATH_LITERAL("chromeos/virtual_keyboard")); | 33 FILE_PATH_LITERAL("mock_timer.js"); |
| 32 | 34 |
| 33 const base::FilePath kMockController = | 35 const std::string kVirtualKeyboardTestDir = "chromeos/virtual_keyboard"; |
| 34 base::FilePath(FILE_PATH_LITERAL("mock_controller.js")); | |
| 35 | 36 |
| 36 const base::FilePath kMockTimer = | 37 const std::string kBaseKeyboardTestFramework = "virtual_keyboard_test_base.js"; |
| 37 base::FilePath(FILE_PATH_LITERAL("mock_timer.js")); | |
| 38 | 38 |
| 39 const base::FilePath kBaseKeyboardTestFramework = | 39 const std::string kExtensionId = "mppnpdlheglhdfmldimlhpnegondlapf"; |
| 40 base::FilePath(FILE_PATH_LITERAL("virtual_keyboard_test_base.js")); | 40 |
| 41 const std::string kVirtualKeyboardURL = "chrome://keyboard"; | |
| 41 | 42 |
| 42 } // namespace | 43 } // namespace |
| 43 | 44 |
| 44 class VirtualKeyboardBrowserTest : public InProcessBrowserTest { | 45 VirtualKeyboardBrowserTestHelper::VirtualKeyboardBrowserTestHelper() |
|
Jeffrey Yasskin
2014/05/02 22:09:37
The header file should mention the default values,
rsadam
2014/05/05 17:44:42
Done.
| |
| 45 public: | 46 : base_framework_(kBaseKeyboardTestFramework), |
| 47 extension_id_(kExtensionId), | |
| 48 test_dir_(kVirtualKeyboardTestDir), | |
| 49 url_(kVirtualKeyboardURL) { | |
| 50 } | |
| 46 | 51 |
| 47 // Ensure that the virtual keyboard is enabled. | 52 VirtualKeyboardBrowserTestHelper::~VirtualKeyboardBrowserTestHelper() {}; |
| 48 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { | |
| 49 command_line->AppendSwitch( | |
| 50 keyboard::switches::kEnableVirtualKeyboard); | |
| 51 } | |
| 52 | 53 |
| 53 // Injects javascript in |file| into the keyboard page and runs test methods. | 54 void VirtualKeyboardBrowserTest::SetUpCommandLine(CommandLine* command_line) { |
| 54 void RunTest(const base::FilePath& file) { | 55 command_line->AppendSwitch(keyboard::switches::kEnableVirtualKeyboard); |
| 55 ui_test_utils::NavigateToURL(browser(), GURL("chrome://keyboard")); | 56 } |
| 56 | 57 |
| 57 content::WebContents* web_contents = | 58 void VirtualKeyboardBrowserTest::RunTest( |
| 58 browser()->tab_strip_model()->GetActiveWebContents(); | 59 const base::FilePath& file, |
| 59 ASSERT_TRUE(web_contents); | 60 const VirtualKeyboardBrowserTestHelper& helper) { |
| 61 ui_test_utils::NavigateToURL(browser(), GURL(helper.url())); | |
| 62 content::WebContents* web_contents = | |
| 63 browser()->tab_strip_model()->GetActiveWebContents(); | |
| 64 content::WaitForLoadStop(web_contents); | |
| 65 ASSERT_TRUE(web_contents); | |
| 60 | 66 |
| 61 // Inject testing scripts. | 67 // Inject testing scripts. |
| 62 InjectJavascript(kWebuiTestDir, kMockController); | 68 InjectJavascript(base::FilePath(kWebuiTestDir), |
| 63 InjectJavascript(kWebuiTestDir, kMockTimer); | 69 base::FilePath(kMockController)); |
| 64 InjectJavascript(kVirtualKeyboardTestDir, kBaseKeyboardTestFramework); | 70 InjectJavascript(base::FilePath(kWebuiTestDir), base::FilePath(kMockTimer)); |
| 65 InjectJavascript(kVirtualKeyboardTestDir, file); | 71 InjectJavascript(base::FilePath(FILE_PATH_LITERAL(helper.test_dir())), |
| 72 base::FilePath(FILE_PATH_LITERAL(helper.base_framework()))); | |
| 73 InjectJavascript(base::FilePath(FILE_PATH_LITERAL(helper.test_dir())), file); | |
| 66 | 74 |
| 67 ASSERT_TRUE(content::ExecuteScript(web_contents, utf8_content_)); | 75 ASSERT_TRUE(content::ExecuteScript(web_contents, utf8_content_)); |
| 68 | 76 |
| 69 // Inject DOM-automation test harness and run tests. | 77 // Inject DOM-automation test harness and run tests. |
| 70 std::vector<int> resource_ids; | 78 std::vector<int> resource_ids; |
| 71 EXPECT_TRUE(ExecuteWebUIResourceTest(web_contents, resource_ids)); | 79 EXPECT_TRUE(ExecuteWebUIResourceTest(web_contents, resource_ids)); |
| 72 } | 80 } |
| 73 | 81 |
| 74 void showVirtualKeyboard() { | 82 void VirtualKeyboardBrowserTest::ShowVirtualKeyboard() { |
| 75 aura::Window *window = ash::Shell::GetPrimaryRootWindow(); | 83 aura::Window* window = ash::Shell::GetPrimaryRootWindow(); |
| 76 ui::InputMethod* input_method = window->GetProperty( | 84 ui::InputMethod* input_method = |
| 77 aura::client::kRootWindowInputMethodKey); | 85 window->GetProperty(aura::client::kRootWindowInputMethodKey); |
| 78 ASSERT_TRUE(input_method); | 86 ASSERT_TRUE(input_method); |
| 79 input_method->ShowImeIfNeeded(); | 87 input_method->ShowImeIfNeeded(); |
| 80 } | 88 } |
| 81 | 89 |
| 82 content::RenderViewHost* GetKeyboardRenderViewHost() { | 90 content::RenderViewHost* VirtualKeyboardBrowserTest::GetKeyboardRenderViewHost( |
| 83 showVirtualKeyboard(); | 91 const std::string id) { |
|
Jeffrey Yasskin
2014/05/02 22:09:37
Take std::strings as "const std::string&", unless
rsadam
2014/05/05 17:44:42
Done.
| |
| 84 std::string kVirtualKeyboardURL = | 92 ShowVirtualKeyboard(); |
| 85 "chrome-extension://mppnpdlheglhdfmldimlhpnegondlapf/"; | 93 std::string url = "chrome-extension://" + id + "/"; |
|
Jeffrey Yasskin
2014/05/02 22:09:37
This should probably be "Extension::GetBaseURLFrom
rsadam
2014/05/05 17:44:42
Done.
| |
| 86 scoped_ptr<content::RenderWidgetHostIterator> widgets( | 94 scoped_ptr<content::RenderWidgetHostIterator> widgets( |
| 87 content::RenderWidgetHost::GetRenderWidgetHosts()); | 95 content::RenderWidgetHost::GetRenderWidgetHosts()); |
| 88 while (content::RenderWidgetHost* widget = widgets->GetNextHost()) { | 96 while (content::RenderWidgetHost* widget = widgets->GetNextHost()) { |
| 89 if (widget->IsRenderView()) { | 97 if (widget->IsRenderView()) { |
| 90 content::RenderViewHost* view = content::RenderViewHost::From(widget); | 98 content::RenderViewHost* view = content::RenderViewHost::From(widget); |
| 91 std::string url = view->GetSiteInstance()->GetSiteURL().spec(); | 99 if (url == view->GetSiteInstance()->GetSiteURL().spec()) { |
| 92 if (url == kVirtualKeyboardURL) { | 100 content::WebContents* wc = |
| 93 content::WebContents* wc = | 101 content::WebContents::FromRenderViewHost(view); |
| 94 content::WebContents::FromRenderViewHost(view); | 102 // Waits for Polymer to load. |
| 95 // Waits for Polymer to load. | 103 content::WaitForLoadStop(wc); |
| 96 content::WaitForLoadStop(wc); | 104 return view; |
| 97 return view; | |
| 98 } | |
| 99 } | 105 } |
| 100 } | 106 } |
| 101 return NULL; | |
| 102 } | 107 } |
| 108 LOG(ERROR) << "Extension not found:" << url; | |
| 109 return NULL; | |
| 110 } | |
| 103 | 111 |
| 104 private: | 112 void VirtualKeyboardBrowserTest::InjectJavascript(const base::FilePath& dir, |
| 105 | 113 const base::FilePath& file) { |
| 106 // Injects javascript into the keyboard page. The test |file| is in | 114 base::FilePath path = ui_test_utils::GetTestFilePath(dir, file); |
| 107 // directory |dir| relative to the root testing directory. | 115 std::string library_content; |
| 108 void InjectJavascript(const base::FilePath& dir, | 116 ASSERT_TRUE(base::ReadFileToString(path, &library_content)) << path.value(); |
| 109 const base::FilePath& file) { | 117 utf8_content_.append(library_content); |
| 110 base::FilePath path = ui_test_utils::GetTestFilePath(dir, file); | 118 utf8_content_.append(";\n"); |
| 111 std::string library_content; | 119 } |
| 112 ASSERT_TRUE(base::ReadFileToString(path, &library_content)) | |
| 113 << path.value(); | |
| 114 utf8_content_.append(library_content); | |
| 115 utf8_content_.append(";\n"); | |
| 116 } | |
| 117 | |
| 118 std::string utf8_content_; | |
| 119 }; | |
| 120 | 120 |
| 121 // crbug.com/367817. Either this feature or just the test are depending | 121 // crbug.com/367817. Either this feature or just the test are depending |
| 122 // on the presense of Object.observe which is presently disabled by default. | 122 // on the presense of Object.observe which is presently disabled by default. |
| 123 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, DISABLED_AttributesTest) { | 123 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, DISABLED_AttributesTest) { |
| 124 RunTest(base::FilePath(FILE_PATH_LITERAL("attributes_test.js"))); | 124 RunTest(base::FilePath(FILE_PATH_LITERAL("attributes_test.js")), |
| 125 VirtualKeyboardBrowserTestHelper()); | |
| 125 } | 126 } |
| 126 | 127 |
| 127 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, TypingTest) { | 128 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, TypingTest) { |
| 128 RunTest(base::FilePath(FILE_PATH_LITERAL("typing_test.js"))); | 129 RunTest(base::FilePath(FILE_PATH_LITERAL("typing_test.js")), |
| 130 VirtualKeyboardBrowserTestHelper()); | |
| 129 } | 131 } |
| 130 | 132 |
| 131 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, ControlKeysTest) { | 133 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, ControlKeysTest) { |
| 132 RunTest(base::FilePath(FILE_PATH_LITERAL("control_keys_test.js"))); | 134 RunTest(base::FilePath(FILE_PATH_LITERAL("control_keys_test.js")), |
| 135 VirtualKeyboardBrowserTestHelper()); | |
| 133 } | 136 } |
| 134 | 137 |
| 135 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, HideKeyboardKeyTest) { | 138 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, HideKeyboardKeyTest) { |
| 136 RunTest(base::FilePath(FILE_PATH_LITERAL("hide_keyboard_key_test.js"))); | 139 RunTest(base::FilePath(FILE_PATH_LITERAL("hide_keyboard_key_test.js")), |
| 140 VirtualKeyboardBrowserTestHelper()); | |
| 137 } | 141 } |
| 138 | 142 |
| 139 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, KeysetTransitionTest) { | 143 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, KeysetTransitionTest) { |
| 140 RunTest(base::FilePath(FILE_PATH_LITERAL("keyset_transition_test.js"))); | 144 RunTest(base::FilePath(FILE_PATH_LITERAL("keyset_transition_test.js")), |
| 145 VirtualKeyboardBrowserTestHelper()); | |
| 141 } | 146 } |
| 142 | 147 |
| 143 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, IsKeyboardLoaded) { | 148 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, IsKeyboardLoaded) { |
| 144 content::RenderViewHost* keyboard_rvh = GetKeyboardRenderViewHost(); | 149 content::RenderViewHost* keyboard_rvh = |
| 150 GetKeyboardRenderViewHost(kExtensionId); | |
| 145 ASSERT_TRUE(keyboard_rvh); | 151 ASSERT_TRUE(keyboard_rvh); |
| 146 bool loaded = false; | 152 bool loaded = false; |
| 147 std::string script = "!!chrome.virtualKeyboardPrivate"; | 153 std::string script = "!!chrome.virtualKeyboardPrivate"; |
| 148 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | 154 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
| 149 keyboard_rvh, | 155 keyboard_rvh, |
| 150 "window.domAutomationController.send(" + script + ");", | 156 "window.domAutomationController.send(" + script + ");", |
| 151 &loaded)); | 157 &loaded)); |
| 152 // Catches the regression in crbug.com/308653. | 158 // Catches the regression in crbug.com/308653. |
| 153 ASSERT_TRUE(loaded); | 159 ASSERT_TRUE(loaded); |
| 154 } | 160 } |
| 155 | 161 |
| 156 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, EndToEndTest) { | 162 IN_PROC_BROWSER_TEST_F(VirtualKeyboardBrowserTest, EndToEndTest) { |
| 157 // Get the virtual keyboard's render view host. | 163 // Get the virtual keyboard's render view host. |
| 158 content::RenderViewHost* keyboard_rvh = GetKeyboardRenderViewHost(); | 164 content::RenderViewHost* keyboard_rvh = |
| 165 GetKeyboardRenderViewHost(kExtensionId); | |
| 159 ASSERT_TRUE(keyboard_rvh); | 166 ASSERT_TRUE(keyboard_rvh); |
| 160 | 167 |
| 161 // Get the test page's render view host. | 168 // Get the test page's render view host. |
| 162 content::RenderViewHost* browser_rvh = browser()->tab_strip_model()-> | 169 content::RenderViewHost* browser_rvh = browser()->tab_strip_model()-> |
| 163 GetActiveWebContents()->GetRenderViewHost(); | 170 GetActiveWebContents()->GetRenderViewHost(); |
| 164 ASSERT_TRUE(browser_rvh); | 171 ASSERT_TRUE(browser_rvh); |
| 165 | 172 |
| 166 // Set up the test page. | 173 // Set up the test page. |
| 167 GURL url = ui_test_utils::GetTestUrl( | 174 GURL url = ui_test_utils::GetTestUrl( |
| 168 base::FilePath(), | 175 base::FilePath(), |
| 169 base::FilePath(FILE_PATH_LITERAL( | 176 base::FilePath(FILE_PATH_LITERAL( |
| 170 "chromeos/virtual_keyboard/end_to_end_test.html"))); | 177 "chromeos/virtual_keyboard/end_to_end_test.html"))); |
| 171 ui_test_utils::NavigateToURL(browser(), url); | 178 ui_test_utils::NavigateToURL(browser(), url); |
| 172 | 179 |
| 173 // Press 'a' on keyboard. | 180 // Press 'a' on keyboard. |
| 174 base::FilePath path = ui_test_utils::GetTestFilePath( | 181 base::FilePath path = ui_test_utils::GetTestFilePath( |
| 175 kVirtualKeyboardTestDir, | 182 base::FilePath(FILE_PATH_LITERAL(kVirtualKeyboardTestDir)), |
| 176 base::FilePath(FILE_PATH_LITERAL("end_to_end_test.js"))); | 183 base::FilePath(FILE_PATH_LITERAL("end_to_end_test.js"))); |
| 177 std::string script; | 184 std::string script; |
| 178 ASSERT_TRUE(base::ReadFileToString(path, &script)); | 185 ASSERT_TRUE(base::ReadFileToString(path, &script)); |
| 179 EXPECT_TRUE(content::ExecuteScript(keyboard_rvh, script)); | 186 EXPECT_TRUE(content::ExecuteScript(keyboard_rvh, script)); |
| 180 // Verify 'a' appeared on test page. | 187 // Verify 'a' appeared on test page. |
| 181 bool success = false; | 188 bool success = false; |
| 182 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( | 189 EXPECT_TRUE(content::ExecuteScriptAndExtractBool( |
| 183 browser_rvh, | 190 browser_rvh, |
| 184 "success ? verifyInput('a') : waitForInput('a');", | 191 "success ? verifyInput('a') : waitForInput('a');", |
| 185 &success)); | 192 &success)); |
| 186 ASSERT_TRUE(success); | 193 ASSERT_TRUE(success); |
| 187 } | 194 } |
| 188 | 195 |
| 189 // TODO(kevers|rsadam|bshe): Add UI tests for remaining virtual keyboard | 196 // TODO(kevers|rsadam|bshe): Add UI tests for remaining virtual keyboard |
| 190 // functionality. | 197 // functionality. |
| OLD | NEW |