OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/extensions/api/input_ime/input_ime_api.h" | 5 #include "chrome/browser/extensions/api/input_ime/input_ime_api.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
11 #include "chrome/browser/chromeos/input_method/input_method_engine.h" | 11 #include "chrome/browser/chromeos/input_method/input_method_engine.h" |
12 #include "chrome/browser/chromeos/login/lock/screen_locker.h" | 12 #include "chrome/browser/chromeos/login/lock/screen_locker.h" |
13 #include "chrome/browser/chromeos/login/session/user_session_manager.h" | 13 #include "chrome/browser/chromeos/login/session/user_session_manager.h" |
14 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h" | 14 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h" |
15 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 15 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
16 #include "chrome/browser/extensions/extension_service.h" | 16 #include "chrome/browser/extensions/extension_service.h" |
17 #include "chrome/browser/profiles/profile_manager.h" | 17 #include "chrome/browser/profiles/profile_manager.h" |
18 #include "chrome/common/extensions/api/input_ime.h" | 18 #include "chrome/common/extensions/api/input_ime.h" |
| 19 #include "chrome/common/extensions/api/input_method_private.h" |
19 #include "extensions/browser/extension_system.h" | 20 #include "extensions/browser/extension_system.h" |
20 #include "extensions/common/manifest_handlers/background_info.h" | 21 #include "extensions/common/manifest_handlers/background_info.h" |
21 #include "ui/base/ime/chromeos/component_extension_ime_manager.h" | 22 #include "ui/base/ime/chromeos/component_extension_ime_manager.h" |
22 #include "ui/base/ime/chromeos/extension_ime_util.h" | 23 #include "ui/base/ime/chromeos/extension_ime_util.h" |
23 #include "ui/base/ime/chromeos/input_method_manager.h" | 24 #include "ui/base/ime/chromeos/input_method_manager.h" |
24 #include "ui/base/ime/ime_engine_handler_interface.h" | 25 #include "ui/base/ime/ime_engine_handler_interface.h" |
25 | 26 |
26 namespace input_ime = extensions::api::input_ime; | 27 namespace input_ime = extensions::api::input_ime; |
27 namespace DeleteSurroundingText = | 28 namespace DeleteSurroundingText = |
28 extensions::api::input_ime::DeleteSurroundingText; | 29 extensions::api::input_ime::DeleteSurroundingText; |
29 namespace UpdateMenuItems = extensions::api::input_ime::UpdateMenuItems; | 30 namespace UpdateMenuItems = extensions::api::input_ime::UpdateMenuItems; |
30 namespace SendKeyEvents = extensions::api::input_ime::SendKeyEvents; | 31 namespace SendKeyEvents = extensions::api::input_ime::SendKeyEvents; |
31 namespace HideInputView = extensions::api::input_ime::HideInputView; | 32 namespace HideInputView = extensions::api::input_ime::HideInputView; |
32 namespace SetMenuItems = extensions::api::input_ime::SetMenuItems; | 33 namespace SetMenuItems = extensions::api::input_ime::SetMenuItems; |
33 namespace SetCursorPosition = extensions::api::input_ime::SetCursorPosition; | 34 namespace SetCursorPosition = extensions::api::input_ime::SetCursorPosition; |
34 namespace SetCandidates = extensions::api::input_ime::SetCandidates; | 35 namespace SetCandidates = extensions::api::input_ime::SetCandidates; |
35 namespace SetCandidateWindowProperties = | 36 namespace SetCandidateWindowProperties = |
36 extensions::api::input_ime::SetCandidateWindowProperties; | 37 extensions::api::input_ime::SetCandidateWindowProperties; |
37 namespace CommitText = extensions::api::input_ime::CommitText; | 38 namespace CommitText = extensions::api::input_ime::CommitText; |
38 namespace ClearComposition = extensions::api::input_ime::ClearComposition; | 39 namespace ClearComposition = extensions::api::input_ime::ClearComposition; |
39 namespace SetComposition = extensions::api::input_ime::SetComposition; | 40 namespace SetComposition = extensions::api::input_ime::SetComposition; |
| 41 namespace OnCompositionBoundsChanged = |
| 42 extensions::api::input_method_private::OnCompositionBoundsChanged; |
40 using ui::IMEEngineHandlerInterface; | 43 using ui::IMEEngineHandlerInterface; |
41 | 44 |
42 namespace { | 45 namespace { |
43 const char kErrorEngineNotAvailable[] = "Engine is not available"; | 46 const char kErrorEngineNotAvailable[] = "Engine is not available"; |
44 const char kErrorSetMenuItemsFail[] = "Could not create menu Items"; | 47 const char kErrorSetMenuItemsFail[] = "Could not create menu Items"; |
45 const char kErrorUpdateMenuItemsFail[] = "Could not update menu Items"; | 48 const char kErrorUpdateMenuItemsFail[] = "Could not update menu Items"; |
46 const char kOnCompositionBoundsChangedEventName[] = | |
47 "inputMethodPrivate.onCompositionBoundsChanged"; | |
48 | 49 |
49 void SetMenuItemToMenu(const input_ime::MenuItem& input, | 50 void SetMenuItemToMenu(const input_ime::MenuItem& input, |
50 IMEEngineHandlerInterface::MenuItem* out) { | 51 IMEEngineHandlerInterface::MenuItem* out) { |
51 out->modified = 0; | 52 out->modified = 0; |
52 out->id = input.id; | 53 out->id = input.id; |
53 if (input.label) { | 54 if (input.label) { |
54 out->modified |= IMEEngineHandlerInterface::MENU_ITEM_MODIFIED_LABEL; | 55 out->modified |= IMEEngineHandlerInterface::MENU_ITEM_MODIFIED_LABEL; |
55 out->label = *input.label; | 56 out->label = *input.label; |
56 } | 57 } |
57 | 58 |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
144 input_ime::OnMenuItemActivated::Create(component_id, menu_id)); | 145 input_ime::OnMenuItemActivated::Create(component_id, menu_id)); |
145 | 146 |
146 DispatchEventToExtension( | 147 DispatchEventToExtension( |
147 extensions::events::INPUT_IME_ON_MENU_ITEM_ACTIVATED, | 148 extensions::events::INPUT_IME_ON_MENU_ITEM_ACTIVATED, |
148 input_ime::OnMenuItemActivated::kEventName, std::move(args)); | 149 input_ime::OnMenuItemActivated::kEventName, std::move(args)); |
149 } | 150 } |
150 | 151 |
151 void OnCompositionBoundsChanged( | 152 void OnCompositionBoundsChanged( |
152 const std::vector<gfx::Rect>& bounds) override { | 153 const std::vector<gfx::Rect>& bounds) override { |
153 if (extension_id_.empty() || | 154 if (extension_id_.empty() || |
154 !HasListener(kOnCompositionBoundsChangedEventName)) | 155 !HasListener(OnCompositionBoundsChanged::kEventName)) |
155 return; | 156 return; |
156 | 157 |
157 // Note: this is a private API event. | 158 // Note: this is a private API event. |
158 base::ListValue* bounds_list = new base::ListValue(); | 159 base::ListValue* bounds_list = new base::ListValue(); |
159 for (size_t i = 0; i < bounds.size(); ++i) { | 160 for (size_t i = 0; i < bounds.size(); ++i) { |
160 base::DictionaryValue* bounds_value = new base::DictionaryValue(); | 161 base::DictionaryValue* bounds_value = new base::DictionaryValue(); |
161 bounds_value->SetInteger("x", bounds[i].x()); | 162 bounds_value->SetInteger("x", bounds[i].x()); |
162 bounds_value->SetInteger("y", bounds[i].y()); | 163 bounds_value->SetInteger("y", bounds[i].y()); |
163 bounds_value->SetInteger("w", bounds[i].width()); | 164 bounds_value->SetInteger("w", bounds[i].width()); |
164 bounds_value->SetInteger("h", bounds[i].height()); | 165 bounds_value->SetInteger("h", bounds[i].height()); |
165 bounds_list->Append(bounds_value); | 166 bounds_list->Append(bounds_value); |
166 } | 167 } |
167 | 168 |
168 if (bounds_list->GetSize() <= 0) | 169 if (bounds_list->GetSize() <= 0) |
169 return; | 170 return; |
170 scoped_ptr<base::ListValue> args(new base::ListValue()); | 171 scoped_ptr<base::ListValue> args(new base::ListValue()); |
171 | 172 |
172 // The old extension code uses the first parameter to get the bounds of the | 173 // The old extension code uses the first parameter to get the bounds of the |
173 // first composition character, so for backward compatibility, add it here. | 174 // first composition character, so for backward compatibility, add it here. |
174 base::Value* first_value = NULL; | 175 base::Value* first_value = NULL; |
175 if (bounds_list->Get(0, &first_value)) | 176 if (bounds_list->Get(0, &first_value)) |
176 args->Append(first_value->DeepCopy()); | 177 args->Append(first_value->DeepCopy()); |
177 args->Append(bounds_list); | 178 args->Append(bounds_list); |
178 | 179 |
179 DispatchEventToExtension( | 180 DispatchEventToExtension( |
180 extensions::events::INPUT_METHOD_PRIVATE_ON_COMPOSITION_BOUNDS_CHANGED, | 181 extensions::events::INPUT_METHOD_PRIVATE_ON_COMPOSITION_BOUNDS_CHANGED, |
181 kOnCompositionBoundsChangedEventName, std::move(args)); | 182 OnCompositionBoundsChanged::kEventName, std::move(args)); |
182 } | 183 } |
183 | 184 |
184 private: | 185 private: |
185 // ui::ImeObserver overrides. | 186 // ui::ImeObserver overrides. |
186 void DispatchEventToExtension( | 187 void DispatchEventToExtension( |
187 extensions::events::HistogramValue histogram_value, | 188 extensions::events::HistogramValue histogram_value, |
188 const std::string& event_name, | 189 const std::string& event_name, |
189 scoped_ptr<base::ListValue> args) override { | 190 scoped_ptr<base::ListValue> args) override { |
190 if (event_name != input_ime::OnActivate::kEventName) { | 191 if (event_name != input_ime::OnActivate::kEventName) { |
191 // For suspended IME extension (e.g. XKB extension), don't awake it by IME | 192 // For suspended IME extension (e.g. XKB extension), don't awake it by IME |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 IMEEngineHandlerInterface* engine = | 699 IMEEngineHandlerInterface* engine = |
699 GetInputImeEventRouter( | 700 GetInputImeEventRouter( |
700 Profile::FromBrowserContext(details.browser_context)) | 701 Profile::FromBrowserContext(details.browser_context)) |
701 ->GetActiveEngine(details.extension_id); | 702 ->GetActiveEngine(details.extension_id); |
702 // Notifies the IME extension for IME ready with onActivate/onFocus events. | 703 // Notifies the IME extension for IME ready with onActivate/onFocus events. |
703 if (engine) | 704 if (engine) |
704 engine->Enable(engine->GetActiveComponentId()); | 705 engine->Enable(engine->GetActiveComponentId()); |
705 } | 706 } |
706 | 707 |
707 } // namespace extensions | 708 } // namespace extensions |
OLD | NEW |