1010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// found in the LICENSE file. 4010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 5010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ash/shell.h" 6010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/files/file_path.h" 7010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/chromeos/extensions/virtual_keyboard_browsertest.h" 8010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/crx_installer.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/extension_service.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_notification_observer.h" 11010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chromeos/ime/extension_ime_util.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h" 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/browser/render_view_host.h" 17010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/browser/site_instance.h" 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/browser/web_contents.h" 1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/common/url_constants.h" 20010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "extensions/browser/extension_system.h" 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "extensions/browser/notification_types.h" 23010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/common/constants.h" 24010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/common/extension.h" 25010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "extensions/common/file_util.h" 26010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/aura/client/aura_constants.h" 27010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "ui/base/ime/input_method.h" 28010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 29010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)namespace { 30010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 31010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const base::FilePath::CharType kExtensionName[] = "GoogleKeyboardInput-xkb.crx"; 32010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 33010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const base::FilePath::CharType kInputViewTestDir[] = 34010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) "chromeos/virtual_keyboard/inputview/"; 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)const base::FilePath::CharType kBaseKeyboardTestFramework[] = "test_base.js"; 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDefaultLayout[] = "us"; 3846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char kCompactLayout[] = "us.compact.qwerty"; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)struct InputViewConfig : public VirtualKeyboardBrowserTestConfig { 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) explicit InputViewConfig(std::string id, std::string layout) { 42010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base_framework_ = kBaseKeyboardTestFramework; 43010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extension_id_ = id; 44010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test_dir_ = kInputViewTestDir; 4546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url_ = std::string(extensions::kExtensionScheme) + 4646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) url::kStandardSchemeSeparator + id + "/inputview.html?id=" + 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) layout; 48010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 49010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 50010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 51010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} // namespace 52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)class InputViewBrowserTest : public VirtualKeyboardBrowserTest { 54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) public: 55010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Installs the IME Extension keyboard |kExtensionName|. 56010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string InstallIMEExtension() { 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Loads extension. 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath path = ui_test_utils::GetTestFilePath( 59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::FilePath(kInputViewTestDir), base::FilePath(kExtensionName)); 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ExtensionService* service = extensions::ExtensionSystem::Get( 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser()->profile())->extension_service(); 62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<extensions::CrxInstaller> installer = 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) extensions::CrxInstaller::CreateSilent(service); 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ExtensionTestNotificationObserver observer(browser()); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observer.Watch(extensions::NOTIFICATION_CRX_INSTALLER_DONE, 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::Source<extensions::CrxInstaller>(installer.get())); 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) installer->set_allow_silent_install(true); 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) installer->set_creation_flags(extensions::Extension::FROM_WEBSTORE); 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) installer->InstallCrx(path); 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Wait for CRX to be installed. 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) observer.Wait(); 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string extensionId = installer->extension()->id(); 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) if (!service->GetExtensionById(extensionId, false)) 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return ""; 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return extensionId; 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}; 79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 80116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(InputViewBrowserTest, TypingTest) { 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) std::string id = InstallIMEExtension(); 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ASSERT_FALSE(id.empty()); 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(base::FilePath("typing_test.js"), 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputViewConfig(id, kDefaultLayout)); 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 87116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(InputViewBrowserTest, CompactTypingTest) { 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string id = InstallIMEExtension(); 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_FALSE(id.empty()); 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(base::FilePath("typing_test.js"), 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputViewConfig(id, kCompactLayout)); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 94116680a4aac90f2aa7413d9095a592090648e557Ben MurdochIN_PROC_BROWSER_TEST_F(InputViewBrowserTest, CompactLongpressTest) { 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string id = InstallIMEExtension(); 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ASSERT_FALSE(id.empty()); 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch RunTest(base::FilePath("longpress_test.js"), 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch InputViewConfig(id, kCompactLayout)); 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 10146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Disabled for leaking memory: http://crbug.com/380537 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(InputViewBrowserTest, DISABLED_KeysetTransitionTest) { 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string id = InstallIMEExtension(); 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_FALSE(id.empty()); 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(base::FilePath("keyset_transition_test.js"), 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputViewConfig(id, kDefaultLayout)); 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Disabled for leaking memory: http://crbug.com/380537 11046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(InputViewBrowserTest, 11146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) DISABLED_CompactKeysetTransitionTest) { 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string id = InstallIMEExtension(); 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_FALSE(id.empty()); 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RunTest(base::FilePath("keyset_transition_test.js"), 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InputViewConfig(id, kCompactLayout)); 116010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)} 117