diff options
author | shuchen@chromium.org <shuchen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-29 03:31:09 +0000 |
---|---|---|
committer | shuchen@chromium.org <shuchen@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-29 03:31:09 +0000 |
commit | 112f658dd4ee5ead677ab818fe4efe14ac8d501e (patch) | |
tree | d8a2364dcd6753e72adf3397e648b95b76b4da89 | |
parent | b520e13a9cddc9089d5ff0bf1c168a0abb6b7ec9 (diff) | |
download | chromium_src-112f658dd4ee5ead677ab818fe4efe14ac8d501e.zip chromium_src-112f658dd4ee5ead677ab818fe4efe14ac8d501e.tar.gz chromium_src-112f658dd4ee5ead677ab818fe4efe14ac8d501e.tar.bz2 |
[IME API] Implement input view which reuses virtual keyboard window.
BUG=chromium:316524
TEST=Locally verified on sandbox of ChromeOS on Linux.
Review URL: https://codereview.chromium.org/91443002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@237868 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/chromeos/input_method/input_method_engine_ibus.cc | 17 | ||||
-rw-r--r-- | chrome/browser/chromeos/input_method/input_method_engine_ibus.h | 4 | ||||
-rw-r--r-- | chromeos/ime/input_method_descriptor.h | 1 | ||||
-rw-r--r-- | ui/keyboard/keyboard.gyp | 1 | ||||
-rw-r--r-- | ui/keyboard/keyboard_controller.cc | 4 | ||||
-rw-r--r-- | ui/keyboard/keyboard_controller.h | 5 | ||||
-rw-r--r-- | ui/keyboard/keyboard_controller_proxy.cc | 38 | ||||
-rw-r--r-- | ui/keyboard/keyboard_controller_proxy.h | 12 |
8 files changed, 72 insertions, 10 deletions
diff --git a/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc b/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc index 5648cb9..dd2a934 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc +++ b/chrome/browser/chromeos/input_method/input_method_engine_ibus.cc @@ -13,6 +13,7 @@ #undef FocusOut #include <map> +#include "ash/shell.h" #include "base/bind.h" #include "base/logging.h" #include "base/memory/scoped_ptr.h" @@ -27,6 +28,7 @@ #include "chromeos/ime/input_method_manager.h" #include "ui/events/event.h" #include "ui/events/keycodes/keyboard_code_conversion_x.h" +#include "ui/keyboard/keyboard_controller.h" namespace chromeos { const char* kErrorNotActive = "IME is not active"; @@ -108,6 +110,8 @@ void InputMethodEngineIBus::Initialize( ibus_id_ = extension_ime_util::GetInputMethodID(extension_id, engine_id); } + input_view_url_ = input_view; + manager->AddInputMethodExtension(ibus_id_, engine_name, layouts, languages, options_page, input_view, this); RegisterComponent(); @@ -444,11 +448,24 @@ void InputMethodEngineIBus::Enable() { IBusEngineHandlerInterface::InputContext context(ui::TEXT_INPUT_TYPE_TEXT, ui::TEXT_INPUT_MODE_DEFAULT); FocusIn(context); + + keyboard::KeyboardController* keyboard_controller = + ash::Shell::GetInstance()->keyboard_controller(); + if (keyboard_controller) { + keyboard_controller->SetOverrideContentUrl(input_view_url_); + } } void InputMethodEngineIBus::Disable() { active_ = false; observer_->OnDeactivated(engine_id_); + + keyboard::KeyboardController* keyboard_controller = + ash::Shell::GetInstance()->keyboard_controller(); + if (keyboard_controller) { + GURL empty_url; + keyboard_controller->SetOverrideContentUrl(empty_url); + } } void InputMethodEngineIBus::PropertyActivate(const std::string& property_name) { diff --git a/chrome/browser/chromeos/input_method/input_method_engine_ibus.h b/chrome/browser/chromeos/input_method/input_method_engine_ibus.h index 56f8d39..6e45474a 100644 --- a/chrome/browser/chromeos/input_method/input_method_engine_ibus.h +++ b/chrome/browser/chromeos/input_method/input_method_engine_ibus.h @@ -11,6 +11,7 @@ #include "base/memory/weak_ptr.h" #include "chrome/browser/chromeos/input_method/input_method_engine.h" #include "ui/base/ime/chromeos/ibus_bridge.h" +#include "url/gurl.h" namespace ui { class KeyEvent; @@ -153,6 +154,9 @@ class InputMethodEngineIBus : public InputMethodEngine, // Used for making callbacks. base::WeakPtrFactory<InputMethodEngineIBus> weak_ptr_factory_; + + // Used for input view window. + GURL input_view_url_; }; } // namespace chromeos diff --git a/chromeos/ime/input_method_descriptor.h b/chromeos/ime/input_method_descriptor.h index cec186b..b63b54f 100644 --- a/chromeos/ime/input_method_descriptor.h +++ b/chromeos/ime/input_method_descriptor.h @@ -35,6 +35,7 @@ class CHROMEOS_EXPORT InputMethodDescriptor { return language_codes_; } const GURL& options_page_url() const { return options_page_url_; } + const GURL& input_view_url() const { return input_view_url_; } const std::vector<std::string>& keyboard_layouts() const { return keyboard_layouts_; } diff --git a/ui/keyboard/keyboard.gyp b/ui/keyboard/keyboard.gyp index 7953ef9..4ea3b09 100644 --- a/ui/keyboard/keyboard.gyp +++ b/ui/keyboard/keyboard.gyp @@ -82,6 +82,7 @@ '../../content/content.gyp:content', '../../skia/skia.gyp:skia', '../../testing/gtest.gyp:gtest', + '../../url/url.gyp:url_lib', '../aura/aura.gyp:aura', '../aura/aura.gyp:aura_test_support', '../compositor/compositor.gyp:compositor', diff --git a/ui/keyboard/keyboard_controller.cc b/ui/keyboard/keyboard_controller.cc index 537cf12..0cb975f 100644 --- a/ui/keyboard/keyboard_controller.cc +++ b/ui/keyboard/keyboard_controller.cc @@ -182,6 +182,10 @@ void KeyboardController::OnWindowHierarchyChanged( OnTextInputStateChanged(proxy_->GetInputMethod()->GetTextInputClient()); } +void KeyboardController::SetOverrideContentUrl(const GURL& url) { + proxy_->SetOverrideContentUrl(url); +} + void KeyboardController::OnTextInputStateChanged( const ui::TextInputClient* client) { if (!container_.get()) diff --git a/ui/keyboard/keyboard_controller.h b/ui/keyboard/keyboard_controller.h index 1daa296..45bba32 100644 --- a/ui/keyboard/keyboard_controller.h +++ b/ui/keyboard/keyboard_controller.h @@ -12,6 +12,7 @@ #include "ui/aura/window_observer.h" #include "ui/base/ime/input_method_observer.h" #include "ui/keyboard/keyboard_export.h" +#include "url/gurl.h" namespace aura { class Window; @@ -51,6 +52,10 @@ class KEYBOARD_EXPORT KeyboardController : public ui::InputMethodObserver, // KeyboardController. aura::Window* GetContainerWindow(); + // Sets the override content url. This is used by for input view for extension + // IMEs. + void SetOverrideContentUrl(const GURL& url); + // Hides virtual keyboard and notifies observer bounds change. // This function should be called with a delay to avoid layout flicker // when the focus of input field quickly change. |automatic| is true when the diff --git a/ui/keyboard/keyboard_controller_proxy.cc b/ui/keyboard/keyboard_controller_proxy.cc index 1cfb99d..2d1bb4b 100644 --- a/ui/keyboard/keyboard_controller_proxy.cc +++ b/ui/keyboard/keyboard_controller_proxy.cc @@ -93,28 +93,46 @@ class KeyboardContentsDelegate : public content::WebContentsDelegate, namespace keyboard { -KeyboardControllerProxy::KeyboardControllerProxy() { +KeyboardControllerProxy::KeyboardControllerProxy() + : default_url_(kKeyboardWebUIURL) { } KeyboardControllerProxy::~KeyboardControllerProxy() { } +const GURL& KeyboardControllerProxy::GetValidUrl() { + return override_url_.is_valid() ? override_url_ : default_url_; +} + +void KeyboardControllerProxy::SetOverrideContentUrl(const GURL& url) { + if (override_url_ == url) + return; + override_url_ = url; + + ReloadContents(); +} + +void KeyboardControllerProxy::ReloadContents() { + if (keyboard_contents_) { + content::OpenURLParams params( + GetValidUrl(), + content::Referrer(), + SINGLETON_TAB, + content::PAGE_TRANSITION_AUTO_TOPLEVEL, + false); + keyboard_contents_->OpenURL(params); + } +} + aura::Window* KeyboardControllerProxy::GetKeyboardWindow() { if (!keyboard_contents_) { content::BrowserContext* context = GetBrowserContext(); - GURL url(kKeyboardWebUIURL); keyboard_contents_.reset(content::WebContents::Create( content::WebContents::CreateParams(context, - content::SiteInstance::CreateForURL(context, url)))); + content::SiteInstance::CreateForURL(context, GetValidUrl())))); keyboard_contents_->SetDelegate(new KeyboardContentsDelegate(this)); SetupWebContents(keyboard_contents_.get()); - - content::OpenURLParams params(url, - content::Referrer(), - SINGLETON_TAB, - content::PAGE_TRANSITION_AUTO_TOPLEVEL, - false); - keyboard_contents_->OpenURL(params); + ReloadContents(); } return keyboard_contents_->GetView()->GetNativeView(); diff --git a/ui/keyboard/keyboard_controller_proxy.h b/ui/keyboard/keyboard_controller_proxy.h index 5358597..cdd870a 100644 --- a/ui/keyboard/keyboard_controller_proxy.h +++ b/ui/keyboard/keyboard_controller_proxy.h @@ -38,6 +38,9 @@ class KEYBOARD_EXPORT KeyboardControllerProxy { // with the proxy. virtual aura::Window* GetKeyboardWindow(); + // Sets the override content url. + void SetOverrideContentUrl(const GURL& url); + // Gets the InputMethod that will provide notifications about changes in the // text input context. virtual ui::InputMethod* GetInputMethod() = 0; @@ -74,6 +77,15 @@ class KEYBOARD_EXPORT KeyboardControllerProxy { virtual void SetupWebContents(content::WebContents* contents); private: + // Reloads the web contents to the valid url from GetValidUrl(). + void ReloadContents(); + + // Gets the valid url from default url or override url. + const GURL& GetValidUrl(); + + const GURL default_url_; + GURL override_url_; + scoped_ptr<content::WebContents> keyboard_contents_; DISALLOW_COPY_AND_ASSIGN(KeyboardControllerProxy); |