Index: chrome/browser/extensions/api/input_ime/input_ime_api.cc |
diff --git a/chrome/browser/extensions/api/input_ime/input_ime_api.cc b/chrome/browser/extensions/api/input_ime/input_ime_api.cc |
index 0d0dea34c0f1618ee38dbfd735645659a6a4df9d..07d70126cf991b2a789b9dbb880ea560f8293d1e 100644 |
--- a/chrome/browser/extensions/api/input_ime/input_ime_api.cc |
+++ b/chrome/browser/extensions/api/input_ime/input_ime_api.cc |
@@ -46,6 +46,8 @@ namespace { |
const char kErrorEngineNotAvailable[] = "Engine is not available"; |
const char kErrorSetMenuItemsFail[] = "Could not create menu Items"; |
const char kErrorUpdateMenuItemsFail[] = "Could not update menu Items"; |
+const char kOnCompositionBoundsChangedEventName[] = |
+ "inputMethodPrivate.onCompositionBoundsChanged"; |
void SetMenuItemToMenu(const input_ime::MenuItem& input, |
InputMethodEngineInterface::MenuItem* out) { |
@@ -105,7 +107,8 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
virtual ~ImeObserver() {} |
virtual void OnActivate(const std::string& component_id) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || |
+ !HasListener(input_ime::OnActivate::kEventName)) |
return; |
scoped_ptr<base::ListValue> args(input_ime::OnActivate::Create( |
@@ -117,7 +120,8 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
} |
virtual void OnDeactivated(const std::string& component_id) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || |
+ !HasListener(input_ime::OnDeactivated::kEventName)) |
return; |
scoped_ptr<base::ListValue> args( |
@@ -129,7 +133,7 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
virtual void OnFocus( |
const InputMethodEngineInterface::InputContext& context) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || !HasListener(input_ime::OnFocus::kEventName)) |
return; |
input_ime::InputContext context_value; |
@@ -146,7 +150,7 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
} |
virtual void OnBlur(int context_id) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || !HasListener(input_ime::OnBlur::kEventName)) |
return; |
scoped_ptr<base::ListValue> args(input_ime::OnBlur::Create(context_id)); |
@@ -157,7 +161,8 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
virtual void OnInputContextUpdate( |
const InputMethodEngineInterface::InputContext& context) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || |
+ !HasListener(input_ime::OnInputContextUpdate::kEventName)) |
return; |
input_ime::InputContext context_value; |
@@ -217,7 +222,8 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
const std::string& component_id, |
int candidate_id, |
InputMethodEngineInterface::MouseButtonEvent button) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || |
+ !HasListener(input_ime::OnCandidateClicked::kEventName)) |
return; |
input_ime::OnCandidateClicked::Button button_enum = |
@@ -247,7 +253,8 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
virtual void OnMenuItemActivated(const std::string& component_id, |
const std::string& menu_id) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || |
+ !HasListener(input_ime::OnMenuItemActivated::kEventName)) |
return; |
scoped_ptr<base::ListValue> args( |
@@ -261,7 +268,8 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
const std::string& text, |
int cursor_pos, |
int anchor_pos) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || |
+ !HasListener(input_ime::OnSurroundingTextChanged::kEventName)) |
return; |
input_ime::OnSurroundingTextChanged::SurroundingInfo info; |
@@ -276,8 +284,27 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
args.Pass()); |
} |
+ virtual void OnCompositionBoundsChanged(const gfx::Rect& bounds) override { |
+ if (extension_id_.empty() || |
+ !HasListener(kOnCompositionBoundsChangedEventName)) |
+ return; |
+ |
+ // Note: this is a private API event. |
+ scoped_ptr<base::ListValue> args(new base::ListValue()); |
+ base::DictionaryValue* bounds_value = new base::DictionaryValue(); |
+ bounds_value->SetInteger("x", bounds.x()); |
+ bounds_value->SetInteger("y", bounds.y()); |
+ bounds_value->SetInteger("w", bounds.width()); |
+ bounds_value->SetInteger("h", bounds.height()); |
+ args->Append(bounds_value); |
+ |
+ DispatchEventToExtension(extension_id_, |
+ kOnCompositionBoundsChangedEventName, |
+ args.Pass()); |
+ } |
+ |
virtual void OnReset(const std::string& component_id) override { |
- if (extension_id_.empty()) |
+ if (extension_id_.empty() || !HasListener(input_ime::OnReset::kEventName)) |
return; |
scoped_ptr<base::ListValue> args(input_ime::OnReset::Create(component_id)); |
@@ -309,6 +336,11 @@ class ImeObserver : public InputMethodEngineInterface::Observer { |
return false; |
} |
+ bool HasListener(const std::string& event_name) const { |
+ return extensions::EventRouter::Get( |
+ ProfileManager::GetActiveUserProfile())->HasEventListener(event_name); |
+ } |
+ |
// The component IME extensions need to know the current screen type (e.g. |
// lock screen, login screen, etc.) so that its on-screen keyboard page |
// won't open new windows/pages. See crbug.com/395621. |