| Index: chrome/browser/ui/ash/keyboard_controller_browsertest.cc
|
| diff --git a/chrome/browser/ui/ash/keyboard_controller_browsertest.cc b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..66bae16b000fac2bab74d53e13a60524b9623bfb
|
| --- /dev/null
|
| +++ b/chrome/browser/ui/ash/keyboard_controller_browsertest.cc
|
| @@ -0,0 +1,109 @@
|
| +// 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/command_line.h"
|
| +#include "chrome/test/base/in_process_browser_test.h"
|
| +#include "content/public/browser/web_contents.h"
|
| +#include "ui/base/ime/dummy_text_input_client.h"
|
| +#include "ui/base/ime/input_method.h"
|
| +#include "ui/base/ime/input_method_factory.h"
|
| +#include "ui/keyboard/keyboard_constants.h"
|
| +#include "ui/keyboard/keyboard_controller.h"
|
| +#include "ui/keyboard/keyboard_controller_proxy.h"
|
| +#include "ui/keyboard/keyboard_switches.h"
|
| +#include "ui/keyboard/keyboard_util.h"
|
| +
|
| +namespace {
|
| +const int kKeyboardHeightForTest = 100;
|
| +} // namespace
|
| +
|
| +class VirtualKeyboardWebContentTest : public InProcessBrowserTest {
|
| + public:
|
| + VirtualKeyboardWebContentTest() {};
|
| + virtual ~VirtualKeyboardWebContentTest() {};
|
| +
|
| + virtual void SetUp() OVERRIDE {
|
| + ui::SetUpInputMethodFactoryForTesting();
|
| + InProcessBrowserTest::SetUp();
|
| + }
|
| +
|
| + // Ensure that the virtual keyboard is enabled.
|
| + virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
|
| + command_line->AppendSwitch(
|
| + keyboard::switches::kEnableVirtualKeyboard);
|
| + }
|
| +
|
| + keyboard::KeyboardControllerProxy* proxy() {
|
| + return keyboard::KeyboardController::GetInstance()->proxy();
|
| + }
|
| +
|
| + protected:
|
| + void FocusEditableNodeAndShowKeyboard() {
|
| + client.reset(new ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_TEXT));
|
| + ui::InputMethod* input_method = proxy()->GetInputMethod();
|
| + input_method->SetFocusedTextInputClient(client.get());
|
| + input_method->ShowImeIfNeeded();
|
| + ResizeKeyboardWindow();
|
| + }
|
| +
|
| + void FocusNonEditableNode() {
|
| + client.reset(new ui::DummyTextInputClient(ui::TEXT_INPUT_TYPE_NONE));
|
| + ui::InputMethod* input_method = proxy()->GetInputMethod();
|
| + input_method->SetFocusedTextInputClient(client.get());
|
| + }
|
| +
|
| + void MockEnableIMEInDifferentExtension(const std::string& url) {
|
| + keyboard::SetOverrideContentUrl(GURL(url));
|
| + keyboard::KeyboardController::GetInstance()->Reload();
|
| + ResizeKeyboardWindow();
|
| + }
|
| +
|
| + bool KeyboardVisible() const {
|
| + return keyboard::KeyboardController::GetInstance()->keyboard_visible();
|
| + }
|
| +
|
| + private:
|
| + // Mock window.resizeTo that is expected to be called after navigate to a new
|
| + // virtual keyboard.
|
| + void ResizeKeyboardWindow() {
|
| + gfx::Rect bounds = proxy()->GetKeyboardWindow()->bounds();
|
| + proxy()->GetKeyboardWindow()->SetBounds(gfx::Rect(
|
| + bounds.x(),
|
| + bounds.bottom() - kKeyboardHeightForTest,
|
| + bounds.width(),
|
| + kKeyboardHeightForTest));
|
| + }
|
| +
|
| + scoped_ptr<ui::DummyTextInputClient> client;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(VirtualKeyboardWebContentTest);
|
| +};
|
| +
|
| +// Test for crbug.com/404340. After enabling an IME in a different extension,
|
| +// its virtual keyboard should not become visible if previous one is not.
|
| +IN_PROC_BROWSER_TEST_F(VirtualKeyboardWebContentTest,
|
| + EnableIMEInDifferentExtension) {
|
| + FocusEditableNodeAndShowKeyboard();
|
| + EXPECT_TRUE(KeyboardVisible());
|
| + FocusNonEditableNode();
|
| + EXPECT_FALSE(KeyboardVisible());
|
| +
|
| + MockEnableIMEInDifferentExtension("chrome-extension://domain-1");
|
| + // Keyboard should not become visible if previous keyboard is not.
|
| + EXPECT_FALSE(KeyboardVisible());
|
| +
|
| + FocusEditableNodeAndShowKeyboard();
|
| + // Keyboard should become visible after focus on an editable node.
|
| + EXPECT_TRUE(KeyboardVisible());
|
| +
|
| + // Simulate hide keyboard by pressing hide key on the virtual keyboard.
|
| + keyboard::KeyboardController::GetInstance()->HideKeyboard(
|
| + keyboard::KeyboardController::HIDE_REASON_MANUAL);
|
| + EXPECT_FALSE(KeyboardVisible());
|
| +
|
| + MockEnableIMEInDifferentExtension("chrome-extension://domain-2");
|
| + // Keyboard should not become visible if previous keyboard is not, even if it
|
| + // is currently focused on an editable node.
|
| + EXPECT_FALSE(KeyboardVisible());
|
| +}
|
|
|