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