1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ash/shell.h" 6#include "base/files/file_path.h" 7#include "chrome/browser/chromeos/extensions/virtual_keyboard_browsertest.h" 8#include "chrome/browser/extensions/crx_installer.h" 9#include "chrome/browser/extensions/extension_service.h" 10#include "chrome/browser/extensions/extension_test_notification_observer.h" 11#include "chrome/browser/profiles/profile.h" 12#include "chrome/browser/ui/browser.h" 13#include "chrome/test/base/ui_test_utils.h" 14#include "chromeos/ime/extension_ime_util.h" 15#include "chromeos/ime/input_method_manager.h" 16#include "content/public/browser/render_view_host.h" 17#include "content/public/browser/site_instance.h" 18#include "content/public/browser/web_contents.h" 19#include "content/public/common/url_constants.h" 20#include "content/public/test/browser_test_utils.h" 21#include "extensions/browser/extension_system.h" 22#include "extensions/browser/notification_types.h" 23#include "extensions/common/constants.h" 24#include "extensions/common/extension.h" 25#include "extensions/common/file_util.h" 26#include "ui/aura/client/aura_constants.h" 27#include "ui/base/ime/input_method.h" 28 29namespace { 30 31const base::FilePath::CharType kExtensionName[] = "GoogleKeyboardInput-xkb.crx"; 32 33const base::FilePath::CharType kInputViewTestDir[] = 34 "chromeos/virtual_keyboard/inputview/"; 35const base::FilePath::CharType kBaseKeyboardTestFramework[] = "test_base.js"; 36 37const char kDefaultLayout[] = "us"; 38const char kCompactLayout[] = "us.compact.qwerty"; 39 40struct InputViewConfig : public VirtualKeyboardBrowserTestConfig { 41 explicit InputViewConfig(std::string id, std::string layout) { 42 base_framework_ = kBaseKeyboardTestFramework; 43 extension_id_ = id; 44 test_dir_ = kInputViewTestDir; 45 url_ = std::string(extensions::kExtensionScheme) + 46 url::kStandardSchemeSeparator + id + "/inputview.html?id=" + 47 layout; 48 } 49}; 50 51} // namespace 52 53class InputViewBrowserTest : public VirtualKeyboardBrowserTest { 54 public: 55 // Installs the IME Extension keyboard |kExtensionName|. 56 std::string InstallIMEExtension() { 57 // Loads extension. 58 base::FilePath path = ui_test_utils::GetTestFilePath( 59 base::FilePath(kInputViewTestDir), base::FilePath(kExtensionName)); 60 ExtensionService* service = extensions::ExtensionSystem::Get( 61 browser()->profile())->extension_service(); 62 scoped_refptr<extensions::CrxInstaller> installer = 63 extensions::CrxInstaller::CreateSilent(service); 64 65 ExtensionTestNotificationObserver observer(browser()); 66 observer.Watch(extensions::NOTIFICATION_CRX_INSTALLER_DONE, 67 content::Source<extensions::CrxInstaller>(installer.get())); 68 installer->set_allow_silent_install(true); 69 installer->set_creation_flags(extensions::Extension::FROM_WEBSTORE); 70 installer->InstallCrx(path); 71 // Wait for CRX to be installed. 72 observer.Wait(); 73 std::string extensionId = installer->extension()->id(); 74 if (!service->GetExtensionById(extensionId, false)) 75 return ""; 76 return extensionId; 77 } 78}; 79 80IN_PROC_BROWSER_TEST_F(InputViewBrowserTest, TypingTest) { 81 std::string id = InstallIMEExtension(); 82 ASSERT_FALSE(id.empty()); 83 RunTest(base::FilePath("typing_test.js"), 84 InputViewConfig(id, kDefaultLayout)); 85} 86 87IN_PROC_BROWSER_TEST_F(InputViewBrowserTest, CompactTypingTest) { 88 std::string id = InstallIMEExtension(); 89 ASSERT_FALSE(id.empty()); 90 RunTest(base::FilePath("typing_test.js"), 91 InputViewConfig(id, kCompactLayout)); 92} 93 94IN_PROC_BROWSER_TEST_F(InputViewBrowserTest, CompactLongpressTest) { 95 std::string id = InstallIMEExtension(); 96 ASSERT_FALSE(id.empty()); 97 RunTest(base::FilePath("longpress_test.js"), 98 InputViewConfig(id, kCompactLayout)); 99} 100 101// Disabled for leaking memory: http://crbug.com/380537 102IN_PROC_BROWSER_TEST_F(InputViewBrowserTest, DISABLED_KeysetTransitionTest) { 103 std::string id = InstallIMEExtension(); 104 ASSERT_FALSE(id.empty()); 105 RunTest(base::FilePath("keyset_transition_test.js"), 106 InputViewConfig(id, kDefaultLayout)); 107} 108 109// Disabled for leaking memory: http://crbug.com/380537 110IN_PROC_BROWSER_TEST_F(InputViewBrowserTest, 111 DISABLED_CompactKeysetTransitionTest) { 112 std::string id = InstallIMEExtension(); 113 ASSERT_FALSE(id.empty()); 114 RunTest(base::FilePath("keyset_transition_test.js"), 115 InputViewConfig(id, kCompactLayout)); 116} 117