OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
8 #include "base/values.h" | 8 #include "base/values.h" |
9 #include "chrome/browser/chromeos/input_method/input_method_engine.h" | 9 #include "chrome/browser/chromeos/input_method/input_method_engine.h" |
10 #include "chrome/browser/chromeos/login/lock/screen_locker.h" | 10 #include "chrome/browser/chromeos/login/lock/screen_locker.h" |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 | 71 |
72 if (input.checked) | 72 if (input.checked) |
73 out->modified |= InputMethodEngineInterface::MENU_ITEM_MODIFIED_CHECKED; | 73 out->modified |= InputMethodEngineInterface::MENU_ITEM_MODIFIED_CHECKED; |
74 out->checked = input.checked ? *input.checked : false; | 74 out->checked = input.checked ? *input.checked : false; |
75 | 75 |
76 if (input.enabled) | 76 if (input.enabled) |
77 out->modified |= InputMethodEngineInterface::MENU_ITEM_MODIFIED_ENABLED; | 77 out->modified |= InputMethodEngineInterface::MENU_ITEM_MODIFIED_ENABLED; |
78 out->enabled = input.enabled ? *input.enabled : true; | 78 out->enabled = input.enabled ? *input.enabled : true; |
79 } | 79 } |
80 | 80 |
81 static void DispatchEventToExtension(const std::string& extension_id, | |
82 const std::string& event_name, | |
83 scoped_ptr<base::ListValue> args) { | |
84 Profile* profile = ProfileManager::GetActiveUserProfile(); | |
85 if (event_name != input_ime::OnActivate::kEventName) { | |
86 // For suspended IME extension (e.g. XKB extension), don't awake it by IME | |
87 // events except onActivate. The IME extension should be awake by other | |
88 // events (e.g. runtime.onMessage) from its other pages. | |
89 // This is to save memory for steady state Chrome OS on which the users | |
90 // don't want any IME features. | |
91 extensions::ExtensionSystem* extension_system = | |
92 extensions::ExtensionSystem::Get(profile); | |
93 if (extension_system) { | |
94 const extensions::Extension* extension = | |
95 extension_system->extension_service()->GetExtensionById( | |
96 extension_id, false /* include_disabled */); | |
97 if (!extension) | |
98 return; | |
99 extensions::ProcessManager* process_manager = | |
100 extensions::ProcessManager::Get(profile); | |
101 if (extensions::BackgroundInfo::HasBackgroundPage(extension) && | |
102 !process_manager->GetBackgroundHostForExtension(extension_id)) { | |
103 return; | |
104 } | |
105 } | |
106 } | |
107 | |
108 scoped_ptr<extensions::Event> event(new extensions::Event( | |
109 event_name, args.Pass())); | |
110 event->restrict_to_browser_context = profile; | |
111 extensions::EventRouter::Get(profile) | |
112 ->DispatchEventToExtension(extension_id, event.Pass()); | |
113 } | |
114 | |
115 void CallbackKeyEventHandle(chromeos::input_method::KeyEventHandle* key_data, | 81 void CallbackKeyEventHandle(chromeos::input_method::KeyEventHandle* key_data, |
116 bool handled) { | 82 bool handled) { |
117 base::Callback<void(bool consumed)>* callback = | 83 base::Callback<void(bool consumed)>* callback = |
118 reinterpret_cast<base::Callback<void(bool consumed)>*>(key_data); | 84 reinterpret_cast<base::Callback<void(bool consumed)>*>(key_data); |
119 callback->Run(handled); | 85 callback->Run(handled); |
120 delete callback; | 86 delete callback; |
121 } | 87 } |
122 | 88 |
| 89 extensions::InputImeEventRouter* GetInputImeEventRouter(Profile* profile) { |
| 90 return extensions::InputImeEventRouterFactory::GetInstance()->GetRouter( |
| 91 profile); |
| 92 } |
| 93 |
123 } // namespace | 94 } // namespace |
124 | 95 |
125 namespace chromeos { | 96 namespace chromeos { |
126 class ImeObserver : public InputMethodEngineInterface::Observer { | 97 class ImeObserver : public InputMethodEngineInterface::Observer { |
127 public: | 98 public: |
128 explicit ImeObserver(const std::string& extension_id) | 99 explicit ImeObserver(const std::string& extension_id, Profile* profile) |
129 : extension_id_(extension_id) {} | 100 : extension_id_(extension_id), profile_(profile) { |
| 101 if (profile_->HasOffTheRecordProfile()) |
| 102 profile_ = profile_->GetOffTheRecordProfile(); |
| 103 } |
130 | 104 |
131 ~ImeObserver() override {} | 105 ~ImeObserver() override {} |
132 | 106 |
133 void OnActivate(const std::string& component_id) override { | 107 void OnActivate(const std::string& component_id) override { |
134 if (extension_id_.empty() || | 108 if (extension_id_.empty() || |
135 !HasListener(input_ime::OnActivate::kEventName)) | 109 !HasListener(input_ime::OnActivate::kEventName)) |
136 return; | 110 return; |
137 | 111 |
138 scoped_ptr<base::ListValue> args(input_ime::OnActivate::Create( | 112 scoped_ptr<base::ListValue> args(input_ime::OnActivate::Create( |
139 component_id, | 113 component_id, |
140 input_ime::ParseScreenType(GetCurrentScreenType()))); | 114 input_ime::ParseScreenType(GetCurrentScreenType()))); |
141 | 115 |
142 DispatchEventToExtension( | 116 DispatchEventToExtension(input_ime::OnActivate::kEventName, args.Pass()); |
143 extension_id_, input_ime::OnActivate::kEventName, args.Pass()); | |
144 } | 117 } |
145 | 118 |
146 void OnDeactivated(const std::string& component_id) override { | 119 void OnDeactivated(const std::string& component_id) override { |
147 if (extension_id_.empty() || | 120 if (extension_id_.empty() || |
148 !HasListener(input_ime::OnDeactivated::kEventName)) | 121 !HasListener(input_ime::OnDeactivated::kEventName)) |
149 return; | 122 return; |
150 | 123 |
151 scoped_ptr<base::ListValue> args( | 124 scoped_ptr<base::ListValue> args( |
152 input_ime::OnDeactivated::Create(component_id)); | 125 input_ime::OnDeactivated::Create(component_id)); |
153 | 126 |
154 DispatchEventToExtension( | 127 DispatchEventToExtension(input_ime::OnDeactivated::kEventName, args.Pass()); |
155 extension_id_, input_ime::OnDeactivated::kEventName, args.Pass()); | |
156 } | 128 } |
157 | 129 |
158 void OnFocus( | 130 void OnFocus( |
159 const InputMethodEngineInterface::InputContext& context) override { | 131 const InputMethodEngineInterface::InputContext& context) override { |
160 if (extension_id_.empty() || !HasListener(input_ime::OnFocus::kEventName)) | 132 if (extension_id_.empty() || !HasListener(input_ime::OnFocus::kEventName)) |
161 return; | 133 return; |
162 | 134 |
163 input_ime::InputContext context_value; | 135 input_ime::InputContext context_value; |
164 context_value.context_id = context.id; | 136 context_value.context_id = context.id; |
165 context_value.type = input_ime::ParseInputContextType(context.type); | 137 context_value.type = input_ime::ParseInputContextType(context.type); |
166 context_value.auto_correct = context.auto_correct; | 138 context_value.auto_correct = context.auto_correct; |
167 context_value.auto_complete = context.auto_complete; | 139 context_value.auto_complete = context.auto_complete; |
168 context_value.spell_check = context.spell_check; | 140 context_value.spell_check = context.spell_check; |
169 | 141 |
170 scoped_ptr<base::ListValue> args(input_ime::OnFocus::Create(context_value)); | 142 scoped_ptr<base::ListValue> args(input_ime::OnFocus::Create(context_value)); |
171 | 143 |
172 DispatchEventToExtension( | 144 DispatchEventToExtension(input_ime::OnFocus::kEventName, args.Pass()); |
173 extension_id_, input_ime::OnFocus::kEventName, args.Pass()); | |
174 } | 145 } |
175 | 146 |
176 void OnBlur(int context_id) override { | 147 void OnBlur(int context_id) override { |
177 if (extension_id_.empty() || !HasListener(input_ime::OnBlur::kEventName)) | 148 if (extension_id_.empty() || !HasListener(input_ime::OnBlur::kEventName)) |
178 return; | 149 return; |
179 | 150 |
180 scoped_ptr<base::ListValue> args(input_ime::OnBlur::Create(context_id)); | 151 scoped_ptr<base::ListValue> args(input_ime::OnBlur::Create(context_id)); |
181 | 152 |
182 DispatchEventToExtension( | 153 DispatchEventToExtension(input_ime::OnBlur::kEventName, args.Pass()); |
183 extension_id_, input_ime::OnBlur::kEventName, args.Pass()); | |
184 } | 154 } |
185 | 155 |
186 void OnInputContextUpdate( | 156 void OnInputContextUpdate( |
187 const InputMethodEngineInterface::InputContext& context) override { | 157 const InputMethodEngineInterface::InputContext& context) override { |
188 if (extension_id_.empty() || | 158 if (extension_id_.empty() || |
189 !HasListener(input_ime::OnInputContextUpdate::kEventName)) | 159 !HasListener(input_ime::OnInputContextUpdate::kEventName)) |
190 return; | 160 return; |
191 | 161 |
192 input_ime::InputContext context_value; | 162 input_ime::InputContext context_value; |
193 context_value.context_id = context.id; | 163 context_value.context_id = context.id; |
194 context_value.type = input_ime::ParseInputContextType(context.type); | 164 context_value.type = input_ime::ParseInputContextType(context.type); |
195 | 165 |
196 scoped_ptr<base::ListValue> args( | 166 scoped_ptr<base::ListValue> args( |
197 input_ime::OnInputContextUpdate::Create(context_value)); | 167 input_ime::OnInputContextUpdate::Create(context_value)); |
198 | 168 |
199 DispatchEventToExtension(extension_id_, | 169 DispatchEventToExtension(input_ime::OnInputContextUpdate::kEventName, |
200 input_ime::OnInputContextUpdate::kEventName, | |
201 args.Pass()); | 170 args.Pass()); |
202 } | 171 } |
203 | 172 |
204 bool IsInterestedInKeyEvent() const override { | 173 bool IsInterestedInKeyEvent() const override { |
205 return ShouldForwardKeyEvent(); | 174 return ShouldForwardKeyEvent(); |
206 } | 175 } |
207 | 176 |
208 void OnKeyEvent(const std::string& component_id, | 177 void OnKeyEvent(const std::string& component_id, |
209 const InputMethodEngineInterface::KeyboardEvent& event, | 178 const InputMethodEngineInterface::KeyboardEvent& event, |
210 chromeos::input_method::KeyEventHandle* key_data) override { | 179 chromeos::input_method::KeyEventHandle* key_data) override { |
211 if (extension_id_.empty()) | 180 if (extension_id_.empty()) |
212 return; | 181 return; |
213 | 182 |
214 // If there is no listener for the event, no need to dispatch the event to | 183 // If there is no listener for the event, no need to dispatch the event to |
215 // extension. Instead, releases the key event for default system behavior. | 184 // extension. Instead, releases the key event for default system behavior. |
216 if (!ShouldForwardKeyEvent()) { | 185 if (!ShouldForwardKeyEvent()) { |
217 // Continue processing the key event so that the physical keyboard can | 186 // Continue processing the key event so that the physical keyboard can |
218 // still work. | 187 // still work. |
219 CallbackKeyEventHandle(key_data, false); | 188 CallbackKeyEventHandle(key_data, false); |
220 return; | 189 return; |
221 } | 190 } |
222 | 191 |
223 extensions::InputImeEventRouter* ime_event_router = | |
224 extensions::InputImeEventRouter::GetInstance(); | |
225 | |
226 const std::string request_id = | 192 const std::string request_id = |
227 ime_event_router->AddRequest(component_id, key_data); | 193 GetInputImeEventRouter(profile_)->AddRequest(component_id, key_data); |
228 | 194 |
229 input_ime::KeyboardEvent key_data_value; | 195 input_ime::KeyboardEvent key_data_value; |
230 key_data_value.type = input_ime::ParseKeyboardEventType(event.type); | 196 key_data_value.type = input_ime::ParseKeyboardEventType(event.type); |
231 key_data_value.request_id = request_id; | 197 key_data_value.request_id = request_id; |
232 if (!event.extension_id.empty()) | 198 if (!event.extension_id.empty()) |
233 key_data_value.extension_id.reset(new std::string(event.extension_id)); | 199 key_data_value.extension_id.reset(new std::string(event.extension_id)); |
234 key_data_value.key = event.key; | 200 key_data_value.key = event.key; |
235 key_data_value.code = event.code; | 201 key_data_value.code = event.code; |
236 key_data_value.alt_key.reset(new bool(event.alt_key)); | 202 key_data_value.alt_key.reset(new bool(event.alt_key)); |
237 key_data_value.ctrl_key.reset(new bool(event.ctrl_key)); | 203 key_data_value.ctrl_key.reset(new bool(event.ctrl_key)); |
238 key_data_value.shift_key.reset(new bool(event.shift_key)); | 204 key_data_value.shift_key.reset(new bool(event.shift_key)); |
239 key_data_value.caps_lock.reset(new bool(event.caps_lock)); | 205 key_data_value.caps_lock.reset(new bool(event.caps_lock)); |
240 | 206 |
241 scoped_ptr<base::ListValue> args( | 207 scoped_ptr<base::ListValue> args( |
242 input_ime::OnKeyEvent::Create(component_id, key_data_value)); | 208 input_ime::OnKeyEvent::Create(component_id, key_data_value)); |
243 | 209 |
244 DispatchEventToExtension( | 210 DispatchEventToExtension(input_ime::OnKeyEvent::kEventName, args.Pass()); |
245 extension_id_, input_ime::OnKeyEvent::kEventName, args.Pass()); | |
246 } | 211 } |
247 | 212 |
248 void OnCandidateClicked( | 213 void OnCandidateClicked( |
249 const std::string& component_id, | 214 const std::string& component_id, |
250 int candidate_id, | 215 int candidate_id, |
251 InputMethodEngineInterface::MouseButtonEvent button) override { | 216 InputMethodEngineInterface::MouseButtonEvent button) override { |
252 if (extension_id_.empty() || | 217 if (extension_id_.empty() || |
253 !HasListener(input_ime::OnCandidateClicked::kEventName)) | 218 !HasListener(input_ime::OnCandidateClicked::kEventName)) |
254 return; | 219 return; |
255 | 220 |
(...skipping 10 matching lines...) Expand all Loading... |
266 case InputMethodEngineInterface::MOUSE_BUTTON_LEFT: | 231 case InputMethodEngineInterface::MOUSE_BUTTON_LEFT: |
267 // Default to left. | 232 // Default to left. |
268 default: | 233 default: |
269 button_enum = input_ime::MOUSE_BUTTON_LEFT; | 234 button_enum = input_ime::MOUSE_BUTTON_LEFT; |
270 break; | 235 break; |
271 } | 236 } |
272 | 237 |
273 scoped_ptr<base::ListValue> args(input_ime::OnCandidateClicked::Create( | 238 scoped_ptr<base::ListValue> args(input_ime::OnCandidateClicked::Create( |
274 component_id, candidate_id, button_enum)); | 239 component_id, candidate_id, button_enum)); |
275 | 240 |
276 DispatchEventToExtension( | 241 DispatchEventToExtension(input_ime::OnCandidateClicked::kEventName, |
277 extension_id_, input_ime::OnCandidateClicked::kEventName, args.Pass()); | 242 args.Pass()); |
278 } | 243 } |
279 | 244 |
280 void OnMenuItemActivated(const std::string& component_id, | 245 void OnMenuItemActivated(const std::string& component_id, |
281 const std::string& menu_id) override { | 246 const std::string& menu_id) override { |
282 if (extension_id_.empty() || | 247 if (extension_id_.empty() || |
283 !HasListener(input_ime::OnMenuItemActivated::kEventName)) | 248 !HasListener(input_ime::OnMenuItemActivated::kEventName)) |
284 return; | 249 return; |
285 | 250 |
286 scoped_ptr<base::ListValue> args( | 251 scoped_ptr<base::ListValue> args( |
287 input_ime::OnMenuItemActivated::Create(component_id, menu_id)); | 252 input_ime::OnMenuItemActivated::Create(component_id, menu_id)); |
288 | 253 |
289 DispatchEventToExtension( | 254 DispatchEventToExtension(input_ime::OnMenuItemActivated::kEventName, |
290 extension_id_, input_ime::OnMenuItemActivated::kEventName, args.Pass()); | 255 args.Pass()); |
291 } | 256 } |
292 | 257 |
293 void OnSurroundingTextChanged(const std::string& component_id, | 258 void OnSurroundingTextChanged(const std::string& component_id, |
294 const std::string& text, | 259 const std::string& text, |
295 int cursor_pos, | 260 int cursor_pos, |
296 int anchor_pos) override { | 261 int anchor_pos) override { |
297 if (extension_id_.empty() || | 262 if (extension_id_.empty() || |
298 !HasListener(input_ime::OnSurroundingTextChanged::kEventName)) | 263 !HasListener(input_ime::OnSurroundingTextChanged::kEventName)) |
299 return; | 264 return; |
300 | 265 |
301 input_ime::OnSurroundingTextChanged::SurroundingInfo info; | 266 input_ime::OnSurroundingTextChanged::SurroundingInfo info; |
302 info.text = text; | 267 info.text = text; |
303 info.focus = cursor_pos; | 268 info.focus = cursor_pos; |
304 info.anchor = anchor_pos; | 269 info.anchor = anchor_pos; |
305 scoped_ptr<base::ListValue> args( | 270 scoped_ptr<base::ListValue> args( |
306 input_ime::OnSurroundingTextChanged::Create(component_id, info)); | 271 input_ime::OnSurroundingTextChanged::Create(component_id, info)); |
307 | 272 |
308 DispatchEventToExtension(extension_id_, | 273 DispatchEventToExtension(input_ime::OnSurroundingTextChanged::kEventName, |
309 input_ime::OnSurroundingTextChanged::kEventName, | |
310 args.Pass()); | 274 args.Pass()); |
311 } | 275 } |
312 | 276 |
313 void OnCompositionBoundsChanged( | 277 void OnCompositionBoundsChanged( |
314 const std::vector<gfx::Rect>& bounds) override { | 278 const std::vector<gfx::Rect>& bounds) override { |
315 if (extension_id_.empty() || | 279 if (extension_id_.empty() || |
316 !HasListener(kOnCompositionBoundsChangedEventName)) | 280 !HasListener(kOnCompositionBoundsChangedEventName)) |
317 return; | 281 return; |
318 | 282 |
319 // Note: this is a private API event. | 283 // Note: this is a private API event. |
(...skipping 11 matching lines...) Expand all Loading... |
331 return; | 295 return; |
332 scoped_ptr<base::ListValue> args(new base::ListValue()); | 296 scoped_ptr<base::ListValue> args(new base::ListValue()); |
333 | 297 |
334 // The old extension code uses the first parameter to get the bounds of the | 298 // The old extension code uses the first parameter to get the bounds of the |
335 // first composition character, so for backward compatibility, add it here. | 299 // first composition character, so for backward compatibility, add it here. |
336 base::Value* first_value = NULL; | 300 base::Value* first_value = NULL; |
337 if (bounds_list->Get(0, &first_value)) | 301 if (bounds_list->Get(0, &first_value)) |
338 args->Append(first_value->DeepCopy()); | 302 args->Append(first_value->DeepCopy()); |
339 args->Append(bounds_list); | 303 args->Append(bounds_list); |
340 | 304 |
341 DispatchEventToExtension(extension_id_, | 305 DispatchEventToExtension(kOnCompositionBoundsChangedEventName, args.Pass()); |
342 kOnCompositionBoundsChangedEventName, | |
343 args.Pass()); | |
344 } | 306 } |
345 | 307 |
346 void OnReset(const std::string& component_id) override { | 308 void OnReset(const std::string& component_id) override { |
347 if (extension_id_.empty() || !HasListener(input_ime::OnReset::kEventName)) | 309 if (extension_id_.empty() || !HasListener(input_ime::OnReset::kEventName)) |
348 return; | 310 return; |
349 | 311 |
350 scoped_ptr<base::ListValue> args(input_ime::OnReset::Create(component_id)); | 312 scoped_ptr<base::ListValue> args(input_ime::OnReset::Create(component_id)); |
351 | 313 |
352 DispatchEventToExtension( | 314 DispatchEventToExtension(input_ime::OnReset::kEventName, args.Pass()); |
353 extension_id_, input_ime::OnReset::kEventName, args.Pass()); | |
354 } | 315 } |
355 | 316 |
356 private: | 317 private: |
| 318 void DispatchEventToExtension(const std::string& event_name, |
| 319 scoped_ptr<base::ListValue> args) { |
| 320 if (event_name != input_ime::OnActivate::kEventName) { |
| 321 // For suspended IME extension (e.g. XKB extension), don't awake it by IME |
| 322 // events except onActivate. The IME extension should be awake by other |
| 323 // events (e.g. runtime.onMessage) from its other pages. |
| 324 // This is to save memory for steady state Chrome OS on which the users |
| 325 // don't want any IME features. |
| 326 extensions::ExtensionSystem* extension_system = |
| 327 extensions::ExtensionSystem::Get(profile_); |
| 328 if (extension_system) { |
| 329 const extensions::Extension* extension = |
| 330 extension_system->extension_service()->GetExtensionById( |
| 331 extension_id_, false /* include_disabled */); |
| 332 if (!extension) |
| 333 return; |
| 334 extensions::ProcessManager* process_manager = |
| 335 extensions::ProcessManager::Get(profile_); |
| 336 if (extensions::BackgroundInfo::HasBackgroundPage(extension) && |
| 337 !process_manager->GetBackgroundHostForExtension(extension_id_)) { |
| 338 return; |
| 339 } |
| 340 } |
| 341 } |
| 342 |
| 343 scoped_ptr<extensions::Event> event( |
| 344 new extensions::Event(event_name, args.Pass())); |
| 345 event->restrict_to_browser_context = profile_; |
| 346 extensions::EventRouter::Get(profile_) |
| 347 ->DispatchEventToExtension(extension_id_, event.Pass()); |
| 348 } |
| 349 |
357 // Returns true if the extension is ready to accept key event, otherwise | 350 // Returns true if the extension is ready to accept key event, otherwise |
358 // returns false. | 351 // returns false. |
359 bool ShouldForwardKeyEvent() const { | 352 bool ShouldForwardKeyEvent() const { |
360 // Only forward key events to extension if there are non-lazy listeners | 353 // Only forward key events to extension if there are non-lazy listeners |
361 // for onKeyEvent. Because if something wrong with the lazy background | 354 // for onKeyEvent. Because if something wrong with the lazy background |
362 // page which doesn't register listener for onKeyEvent, it will not handle | 355 // page which doesn't register listener for onKeyEvent, it will not handle |
363 // the key events, and therefore, all key events will be eaten. | 356 // the key events, and therefore, all key events will be eaten. |
364 // This is for error-tolerance, and it means that onKeyEvent will never wake | 357 // This is for error-tolerance, and it means that onKeyEvent will never wake |
365 // up lazy background page. | 358 // up lazy background page. |
366 const extensions::EventListenerMap::ListenerList& listener_list = | 359 const extensions::EventListenerMap::ListenerList& listener_list = |
367 extensions::EventRouter::Get(ProfileManager::GetActiveUserProfile()) | 360 extensions::EventRouter::Get(profile_) |
368 ->listeners().GetEventListenersByName( | 361 ->listeners() |
369 input_ime::OnKeyEvent::kEventName); | 362 .GetEventListenersByName(input_ime::OnKeyEvent::kEventName); |
370 for (extensions::EventListenerMap::ListenerList::const_iterator it = | 363 for (extensions::EventListenerMap::ListenerList::const_iterator it = |
371 listener_list.begin(); | 364 listener_list.begin(); |
372 it != listener_list.end(); ++it) { | 365 it != listener_list.end(); ++it) { |
373 if ((*it)->extension_id() == extension_id_ && !(*it)->IsLazy()) | 366 if ((*it)->extension_id() == extension_id_ && !(*it)->IsLazy()) |
374 return true; | 367 return true; |
375 } | 368 } |
376 return false; | 369 return false; |
377 } | 370 } |
378 | 371 |
379 bool HasListener(const std::string& event_name) const { | 372 bool HasListener(const std::string& event_name) const { |
380 return extensions::EventRouter::Get( | 373 return extensions::EventRouter::Get(profile_)->HasEventListener(event_name); |
381 ProfileManager::GetActiveUserProfile())->HasEventListener(event_name); | |
382 } | 374 } |
383 | 375 |
384 // The component IME extensions need to know the current screen type (e.g. | 376 // The component IME extensions need to know the current screen type (e.g. |
385 // lock screen, login screen, etc.) so that its on-screen keyboard page | 377 // lock screen, login screen, etc.) so that its on-screen keyboard page |
386 // won't open new windows/pages. See crbug.com/395621. | 378 // won't open new windows/pages. See crbug.com/395621. |
387 std::string GetCurrentScreenType() { | 379 std::string GetCurrentScreenType() { |
388 switch (chromeos::input_method::InputMethodManager::Get() | 380 switch (chromeos::input_method::InputMethodManager::Get() |
389 ->GetUISessionState()) { | 381 ->GetUISessionState()) { |
390 case chromeos::input_method::InputMethodManager::STATE_LOGIN_SCREEN: | 382 case chromeos::input_method::InputMethodManager::STATE_LOGIN_SCREEN: |
391 return "login"; | 383 return "login"; |
392 case chromeos::input_method::InputMethodManager::STATE_LOCK_SCREEN: | 384 case chromeos::input_method::InputMethodManager::STATE_LOCK_SCREEN: |
393 return "lock"; | 385 return "lock"; |
394 case chromeos::input_method::InputMethodManager::STATE_BROWSER_SCREEN: | 386 case chromeos::input_method::InputMethodManager::STATE_BROWSER_SCREEN: |
395 return UserAddingScreen::Get()->IsRunning() ? "secondary-login" | 387 return UserAddingScreen::Get()->IsRunning() ? "secondary-login" |
396 : "normal"; | 388 : "normal"; |
397 case chromeos::input_method::InputMethodManager::STATE_TERMINATING: | 389 case chromeos::input_method::InputMethodManager::STATE_TERMINATING: |
398 return "normal"; | 390 return "normal"; |
399 } | 391 } |
400 NOTREACHED() << "New screen type is added. Please add new entry above."; | 392 NOTREACHED() << "New screen type is added. Please add new entry above."; |
401 return "normal"; | 393 return "normal"; |
402 } | 394 } |
403 | 395 |
404 std::string extension_id_; | 396 std::string extension_id_; |
| 397 Profile* profile_; |
405 | 398 |
406 DISALLOW_COPY_AND_ASSIGN(ImeObserver); | 399 DISALLOW_COPY_AND_ASSIGN(ImeObserver); |
407 }; | 400 }; |
408 | 401 |
409 } // namespace chromeos | 402 } // namespace chromeos |
410 | 403 |
411 namespace extensions { | 404 namespace extensions { |
412 | 405 |
413 InputImeEventRouter* | 406 InputImeEventRouterFactory* InputImeEventRouterFactory::GetInstance() { |
414 InputImeEventRouter::GetInstance() { | 407 return Singleton<InputImeEventRouterFactory>::get(); |
415 return Singleton<InputImeEventRouter>::get(); | 408 } |
| 409 |
| 410 InputImeEventRouterFactory::InputImeEventRouterFactory(){} |
| 411 |
| 412 InputImeEventRouterFactory::~InputImeEventRouterFactory(){} |
| 413 |
| 414 InputImeEventRouter* InputImeEventRouterFactory::GetRouter(Profile* profile) { |
| 415 InputImeEventRouter* router = router_map_[profile]; |
| 416 if (!router) { |
| 417 router = new InputImeEventRouter(profile); |
| 418 router_map_[profile] = router; |
| 419 } |
| 420 return router; |
| 421 } |
| 422 |
| 423 InputImeEventRouter::InputImeEventRouter(Profile* profile) |
| 424 : next_request_id_(1), profile_(profile) { |
| 425 } |
| 426 |
| 427 InputImeEventRouter::~InputImeEventRouter() { |
416 } | 428 } |
417 | 429 |
418 bool InputImeEventRouter::RegisterImeExtension( | 430 bool InputImeEventRouter::RegisterImeExtension( |
419 Profile* profile, | |
420 const std::string& extension_id, | 431 const std::string& extension_id, |
421 const std::vector<extensions::InputComponentInfo>& input_components) { | 432 const std::vector<extensions::InputComponentInfo>& input_components) { |
422 VLOG(1) << "RegisterImeExtension: " << extension_id; | 433 VLOG(1) << "RegisterImeExtension: " << extension_id; |
423 | 434 |
424 if (engine_map_[extension_id]) | 435 if (engine_map_[extension_id]) |
425 return false; | 436 return false; |
426 | 437 |
427 chromeos::input_method::InputMethodManager* manager = | 438 chromeos::input_method::InputMethodManager* manager = |
428 chromeos::input_method::InputMethodManager::Get(); | 439 chromeos::input_method::InputMethodManager::Get(); |
429 chromeos::ComponentExtensionIMEManager* comp_ext_ime_manager = | 440 chromeos::ComponentExtensionIMEManager* comp_ext_ime_manager = |
(...skipping 24 matching lines...) Expand all Loading... |
454 std::string(), // TODO(uekawa): Set short name. | 465 std::string(), // TODO(uekawa): Set short name. |
455 layouts, | 466 layouts, |
456 languages, | 467 languages, |
457 false, // 3rd party IMEs are always not for login. | 468 false, // 3rd party IMEs are always not for login. |
458 component.options_page_url, | 469 component.options_page_url, |
459 component.input_view_url)); | 470 component.input_view_url)); |
460 } | 471 } |
461 } | 472 } |
462 | 473 |
463 scoped_ptr<chromeos::InputMethodEngineInterface::Observer> observer( | 474 scoped_ptr<chromeos::InputMethodEngineInterface::Observer> observer( |
464 new chromeos::ImeObserver(extension_id)); | 475 new chromeos::ImeObserver(extension_id, profile_)); |
465 chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine(); | 476 chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine(); |
466 engine->Initialize(observer.Pass(), extension_id.c_str()); | 477 engine->Initialize(observer.Pass(), extension_id.c_str(), profile_); |
467 engine_map_[extension_id] = engine; | 478 engine_map_[extension_id] = engine; |
468 chromeos::UserSessionManager::GetInstance() | 479 chromeos::UserSessionManager::GetInstance() |
469 ->GetDefaultIMEState(profile) | 480 ->GetDefaultIMEState(profile_) |
470 ->AddInputMethodExtension(extension_id, descriptors, engine); | 481 ->AddInputMethodExtension(extension_id, descriptors, engine); |
471 | 482 |
472 return true; | 483 return true; |
473 } | 484 } |
474 | 485 |
475 void InputImeEventRouter::UnregisterAllImes(const std::string& extension_id) { | 486 void InputImeEventRouter::UnregisterAllImes(const std::string& extension_id) { |
476 std::map<std::string, InputMethodEngineInterface*>::iterator it = | 487 std::map<std::string, InputMethodEngineInterface*>::iterator it = |
477 engine_map_.find(extension_id); | 488 engine_map_.find(extension_id); |
478 if (it != engine_map_.end()) { | 489 if (it != engine_map_.end()) { |
479 chromeos::input_method::InputMethodManager::Get() | 490 chromeos::input_method::InputMethodManager::Get() |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 const std::string& component_id, | 535 const std::string& component_id, |
525 chromeos::input_method::KeyEventHandle* key_data) { | 536 chromeos::input_method::KeyEventHandle* key_data) { |
526 std::string request_id = base::IntToString(next_request_id_); | 537 std::string request_id = base::IntToString(next_request_id_); |
527 ++next_request_id_; | 538 ++next_request_id_; |
528 | 539 |
529 request_map_[request_id] = std::make_pair(component_id, key_data); | 540 request_map_[request_id] = std::make_pair(component_id, key_data); |
530 | 541 |
531 return request_id; | 542 return request_id; |
532 } | 543 } |
533 | 544 |
534 InputImeEventRouter::InputImeEventRouter() | |
535 : next_request_id_(1) { | |
536 } | |
537 | |
538 InputImeEventRouter::~InputImeEventRouter() {} | |
539 | |
540 bool InputImeSetCompositionFunction::RunSync() { | 545 bool InputImeSetCompositionFunction::RunSync() { |
541 InputMethodEngineInterface* engine = | 546 InputMethodEngineInterface* engine = |
542 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); | 547 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
| 548 ->GetActiveEngine(extension_id()); |
543 if (!engine) { | 549 if (!engine) { |
544 SetResult(new base::FundamentalValue(false)); | 550 SetResult(new base::FundamentalValue(false)); |
545 return true; | 551 return true; |
546 } | 552 } |
547 | 553 |
548 scoped_ptr<SetComposition::Params> parent_params( | 554 scoped_ptr<SetComposition::Params> parent_params( |
549 SetComposition::Params::Create(*args_)); | 555 SetComposition::Params::Create(*args_)); |
550 const SetComposition::Params::Parameters& params = parent_params->parameters; | 556 const SetComposition::Params::Parameters& params = parent_params->parameters; |
551 std::vector<InputMethodEngineInterface::SegmentInfo> segments; | 557 std::vector<InputMethodEngineInterface::SegmentInfo> segments; |
552 if (params.segments) { | 558 if (params.segments) { |
(...skipping 29 matching lines...) Expand all Loading... |
582 | 588 |
583 SetResult(new base::FundamentalValue( | 589 SetResult(new base::FundamentalValue( |
584 engine->SetComposition(params.context_id, params.text.c_str(), | 590 engine->SetComposition(params.context_id, params.text.c_str(), |
585 selection_start, selection_end, params.cursor, | 591 selection_start, selection_end, params.cursor, |
586 segments, &error_))); | 592 segments, &error_))); |
587 return true; | 593 return true; |
588 } | 594 } |
589 | 595 |
590 bool InputImeClearCompositionFunction::RunSync() { | 596 bool InputImeClearCompositionFunction::RunSync() { |
591 InputMethodEngineInterface* engine = | 597 InputMethodEngineInterface* engine = |
592 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); | 598 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
| 599 ->GetActiveEngine(extension_id()); |
593 if (!engine) { | 600 if (!engine) { |
594 SetResult(new base::FundamentalValue(false)); | 601 SetResult(new base::FundamentalValue(false)); |
595 return true; | 602 return true; |
596 } | 603 } |
597 | 604 |
598 scoped_ptr<ClearComposition::Params> parent_params( | 605 scoped_ptr<ClearComposition::Params> parent_params( |
599 ClearComposition::Params::Create(*args_)); | 606 ClearComposition::Params::Create(*args_)); |
600 const ClearComposition::Params::Parameters& params = | 607 const ClearComposition::Params::Parameters& params = |
601 parent_params->parameters; | 608 parent_params->parameters; |
602 | 609 |
603 SetResult(new base::FundamentalValue( | 610 SetResult(new base::FundamentalValue( |
604 engine->ClearComposition(params.context_id, &error_))); | 611 engine->ClearComposition(params.context_id, &error_))); |
605 return true; | 612 return true; |
606 } | 613 } |
607 | 614 |
608 bool InputImeCommitTextFunction::RunSync() { | 615 bool InputImeCommitTextFunction::RunSync() { |
609 // TODO(zork): Support committing when not active. | |
610 InputMethodEngineInterface* engine = | 616 InputMethodEngineInterface* engine = |
611 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); | 617 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
| 618 ->GetActiveEngine(extension_id()); |
612 if (!engine) { | 619 if (!engine) { |
613 SetResult(new base::FundamentalValue(false)); | 620 SetResult(new base::FundamentalValue(false)); |
614 return true; | 621 return true; |
615 } | 622 } |
616 | 623 |
617 scoped_ptr<CommitText::Params> parent_params( | 624 scoped_ptr<CommitText::Params> parent_params( |
618 CommitText::Params::Create(*args_)); | 625 CommitText::Params::Create(*args_)); |
619 const CommitText::Params::Parameters& params = | 626 const CommitText::Params::Parameters& params = |
620 parent_params->parameters; | 627 parent_params->parameters; |
621 | 628 |
622 SetResult(new base::FundamentalValue( | 629 SetResult(new base::FundamentalValue( |
623 engine->CommitText(params.context_id, params.text.c_str(), &error_))); | 630 engine->CommitText(params.context_id, params.text.c_str(), &error_))); |
624 return true; | 631 return true; |
625 } | 632 } |
626 | 633 |
627 bool InputImeHideInputViewFunction::RunAsync() { | 634 bool InputImeHideInputViewFunction::RunAsync() { |
628 InputMethodEngineInterface* engine = | 635 InputMethodEngineInterface* engine = |
629 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); | 636 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
| 637 ->GetActiveEngine(extension_id()); |
630 if (!engine) { | 638 if (!engine) { |
631 return true; | 639 return true; |
632 } | 640 } |
633 engine->HideInputView(); | 641 engine->HideInputView(); |
634 return true; | 642 return true; |
635 } | 643 } |
636 | 644 |
637 bool InputImeSendKeyEventsFunction::RunAsync() { | 645 bool InputImeSendKeyEventsFunction::RunAsync() { |
638 scoped_ptr<SendKeyEvents::Params> parent_params( | 646 scoped_ptr<SendKeyEvents::Params> parent_params( |
639 SendKeyEvents::Params::Create(*args_)); | 647 SendKeyEvents::Params::Create(*args_)); |
640 const SendKeyEvents::Params::Parameters& params = | 648 const SendKeyEvents::Params::Parameters& params = |
641 parent_params->parameters; | 649 parent_params->parameters; |
642 chromeos::InputMethodEngineInterface* engine = | 650 InputMethodEngineInterface* engine = |
643 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); | 651 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
| 652 ->GetActiveEngine(extension_id()); |
644 if (!engine) { | 653 if (!engine) { |
645 error_ = kErrorEngineNotAvailable; | 654 error_ = kErrorEngineNotAvailable; |
646 return false; | 655 return false; |
647 } | 656 } |
648 | 657 |
649 const std::vector<linked_ptr<input_ime::KeyboardEvent> >& key_data = | 658 const std::vector<linked_ptr<input_ime::KeyboardEvent> >& key_data = |
650 params.key_data; | 659 params.key_data; |
651 std::vector<chromeos::InputMethodEngineInterface::KeyboardEvent> key_data_out; | 660 std::vector<chromeos::InputMethodEngineInterface::KeyboardEvent> key_data_out; |
652 | 661 |
653 for (size_t i = 0; i < key_data.size(); ++i) { | 662 for (size_t i = 0; i < key_data.size(); ++i) { |
(...skipping 17 matching lines...) Expand all Loading... |
671 return true; | 680 return true; |
672 } | 681 } |
673 | 682 |
674 bool InputImeSetCandidateWindowPropertiesFunction::RunSync() { | 683 bool InputImeSetCandidateWindowPropertiesFunction::RunSync() { |
675 scoped_ptr<SetCandidateWindowProperties::Params> parent_params( | 684 scoped_ptr<SetCandidateWindowProperties::Params> parent_params( |
676 SetCandidateWindowProperties::Params::Create(*args_)); | 685 SetCandidateWindowProperties::Params::Create(*args_)); |
677 const SetCandidateWindowProperties::Params::Parameters& | 686 const SetCandidateWindowProperties::Params::Parameters& |
678 params = parent_params->parameters; | 687 params = parent_params->parameters; |
679 | 688 |
680 InputMethodEngineInterface* engine = | 689 InputMethodEngineInterface* engine = |
681 InputImeEventRouter::GetInstance()->GetEngine(extension_id(), | 690 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
682 params.engine_id); | 691 ->GetEngine(extension_id(), params.engine_id); |
683 | |
684 if (!engine) { | 692 if (!engine) { |
685 SetResult(new base::FundamentalValue(false)); | 693 SetResult(new base::FundamentalValue(false)); |
686 return true; | 694 return true; |
687 } | 695 } |
688 | 696 |
689 const SetCandidateWindowProperties::Params::Parameters::Properties& | 697 const SetCandidateWindowProperties::Params::Parameters::Properties& |
690 properties = params.properties; | 698 properties = params.properties; |
691 | 699 |
692 if (properties.visible && | 700 if (properties.visible && |
693 !engine->SetCandidateWindowVisible(*properties.visible, &error_)) { | 701 !engine->SetCandidateWindowVisible(*properties.visible, &error_)) { |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
737 engine->SetCandidateWindowProperty(properties_out); | 745 engine->SetCandidateWindowProperty(properties_out); |
738 } | 746 } |
739 | 747 |
740 SetResult(new base::FundamentalValue(true)); | 748 SetResult(new base::FundamentalValue(true)); |
741 | 749 |
742 return true; | 750 return true; |
743 } | 751 } |
744 | 752 |
745 bool InputImeSetCandidatesFunction::RunSync() { | 753 bool InputImeSetCandidatesFunction::RunSync() { |
746 InputMethodEngineInterface* engine = | 754 InputMethodEngineInterface* engine = |
747 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); | 755 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
| 756 ->GetActiveEngine(extension_id()); |
748 if (!engine) { | 757 if (!engine) { |
749 SetResult(new base::FundamentalValue(false)); | 758 SetResult(new base::FundamentalValue(false)); |
750 return true; | 759 return true; |
751 } | 760 } |
752 | 761 |
753 scoped_ptr<SetCandidates::Params> parent_params( | 762 scoped_ptr<SetCandidates::Params> parent_params( |
754 SetCandidates::Params::Create(*args_)); | 763 SetCandidates::Params::Create(*args_)); |
755 const SetCandidates::Params::Parameters& params = | 764 const SetCandidates::Params::Parameters& params = |
756 parent_params->parameters; | 765 parent_params->parameters; |
757 | 766 |
(...skipping 15 matching lines...) Expand all Loading... |
773 } | 782 } |
774 } | 783 } |
775 | 784 |
776 SetResult(new base::FundamentalValue( | 785 SetResult(new base::FundamentalValue( |
777 engine->SetCandidates(params.context_id, candidates_out, &error_))); | 786 engine->SetCandidates(params.context_id, candidates_out, &error_))); |
778 return true; | 787 return true; |
779 } | 788 } |
780 | 789 |
781 bool InputImeSetCursorPositionFunction::RunSync() { | 790 bool InputImeSetCursorPositionFunction::RunSync() { |
782 InputMethodEngineInterface* engine = | 791 InputMethodEngineInterface* engine = |
783 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); | 792 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
| 793 ->GetActiveEngine(extension_id()); |
784 if (!engine) { | 794 if (!engine) { |
785 SetResult(new base::FundamentalValue(false)); | 795 SetResult(new base::FundamentalValue(false)); |
786 return true; | 796 return true; |
787 } | 797 } |
788 | 798 |
789 scoped_ptr<SetCursorPosition::Params> parent_params( | 799 scoped_ptr<SetCursorPosition::Params> parent_params( |
790 SetCursorPosition::Params::Create(*args_)); | 800 SetCursorPosition::Params::Create(*args_)); |
791 const SetCursorPosition::Params::Parameters& params = | 801 const SetCursorPosition::Params::Parameters& params = |
792 parent_params->parameters; | 802 parent_params->parameters; |
793 | 803 |
794 SetResult(new base::FundamentalValue( | 804 SetResult(new base::FundamentalValue( |
795 engine->SetCursorPosition(params.context_id, params.candidate_id, | 805 engine->SetCursorPosition(params.context_id, params.candidate_id, |
796 &error_))); | 806 &error_))); |
797 return true; | 807 return true; |
798 } | 808 } |
799 | 809 |
800 bool InputImeSetMenuItemsFunction::RunSync() { | 810 bool InputImeSetMenuItemsFunction::RunSync() { |
801 scoped_ptr<SetMenuItems::Params> parent_params( | 811 scoped_ptr<SetMenuItems::Params> parent_params( |
802 SetMenuItems::Params::Create(*args_)); | 812 SetMenuItems::Params::Create(*args_)); |
803 const SetMenuItems::Params::Parameters& params = | 813 const SetMenuItems::Params::Parameters& params = |
804 parent_params->parameters; | 814 parent_params->parameters; |
805 | 815 |
806 InputMethodEngineInterface* engine = | 816 InputMethodEngineInterface* engine = |
807 InputImeEventRouter::GetInstance()->GetEngine(extension_id(), | 817 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
808 params.engine_id); | 818 ->GetEngine(extension_id(), params.engine_id); |
809 if (!engine) { | 819 if (!engine) { |
810 error_ = kErrorEngineNotAvailable; | 820 error_ = kErrorEngineNotAvailable; |
811 return false; | 821 return false; |
812 } | 822 } |
813 | 823 |
814 const std::vector<linked_ptr<input_ime::MenuItem> >& items = params.items; | 824 const std::vector<linked_ptr<input_ime::MenuItem> >& items = params.items; |
815 std::vector<InputMethodEngineInterface::MenuItem> items_out; | 825 std::vector<InputMethodEngineInterface::MenuItem> items_out; |
816 | 826 |
817 for (size_t i = 0; i < items.size(); ++i) { | 827 for (size_t i = 0; i < items.size(); ++i) { |
818 items_out.push_back(InputMethodEngineInterface::MenuItem()); | 828 items_out.push_back(InputMethodEngineInterface::MenuItem()); |
819 SetMenuItemToMenu(*items[i], &items_out.back()); | 829 SetMenuItemToMenu(*items[i], &items_out.back()); |
820 } | 830 } |
821 | 831 |
822 if (!engine->SetMenuItems(items_out)) | 832 if (!engine->SetMenuItems(items_out)) |
823 error_ = kErrorSetMenuItemsFail; | 833 error_ = kErrorSetMenuItemsFail; |
824 return true; | 834 return true; |
825 } | 835 } |
826 | 836 |
827 bool InputImeUpdateMenuItemsFunction::RunSync() { | 837 bool InputImeUpdateMenuItemsFunction::RunSync() { |
828 scoped_ptr<UpdateMenuItems::Params> parent_params( | 838 scoped_ptr<UpdateMenuItems::Params> parent_params( |
829 UpdateMenuItems::Params::Create(*args_)); | 839 UpdateMenuItems::Params::Create(*args_)); |
830 const UpdateMenuItems::Params::Parameters& params = | 840 const UpdateMenuItems::Params::Parameters& params = |
831 parent_params->parameters; | 841 parent_params->parameters; |
832 | 842 |
833 InputMethodEngineInterface* engine = | 843 InputMethodEngineInterface* engine = |
834 InputImeEventRouter::GetInstance()->GetEngine(extension_id(), | 844 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
835 params.engine_id); | 845 ->GetEngine(extension_id(), params.engine_id); |
836 if (!engine) { | 846 if (!engine) { |
837 error_ = kErrorEngineNotAvailable; | 847 error_ = kErrorEngineNotAvailable; |
838 return false; | 848 return false; |
839 } | 849 } |
840 | 850 |
841 const std::vector<linked_ptr<input_ime::MenuItem> >& items = params.items; | 851 const std::vector<linked_ptr<input_ime::MenuItem> >& items = params.items; |
842 std::vector<InputMethodEngineInterface::MenuItem> items_out; | 852 std::vector<InputMethodEngineInterface::MenuItem> items_out; |
843 | 853 |
844 for (size_t i = 0; i < items.size(); ++i) { | 854 for (size_t i = 0; i < items.size(); ++i) { |
845 items_out.push_back(InputMethodEngineInterface::MenuItem()); | 855 items_out.push_back(InputMethodEngineInterface::MenuItem()); |
846 SetMenuItemToMenu(*items[i], &items_out.back()); | 856 SetMenuItemToMenu(*items[i], &items_out.back()); |
847 } | 857 } |
848 | 858 |
849 if (!engine->UpdateMenuItems(items_out)) | 859 if (!engine->UpdateMenuItems(items_out)) |
850 error_ = kErrorUpdateMenuItemsFail; | 860 error_ = kErrorUpdateMenuItemsFail; |
851 return true; | 861 return true; |
852 } | 862 } |
853 | 863 |
854 bool InputImeDeleteSurroundingTextFunction::RunSync() { | 864 bool InputImeDeleteSurroundingTextFunction::RunSync() { |
855 scoped_ptr<DeleteSurroundingText::Params> parent_params( | 865 scoped_ptr<DeleteSurroundingText::Params> parent_params( |
856 DeleteSurroundingText::Params::Create(*args_)); | 866 DeleteSurroundingText::Params::Create(*args_)); |
857 const DeleteSurroundingText::Params::Parameters& params = | 867 const DeleteSurroundingText::Params::Parameters& params = |
858 parent_params->parameters; | 868 parent_params->parameters; |
859 | 869 |
860 InputMethodEngineInterface* engine = | 870 InputMethodEngineInterface* engine = |
861 InputImeEventRouter::GetInstance()->GetEngine(extension_id(), | 871 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
862 params.engine_id); | 872 ->GetEngine(extension_id(), params.engine_id); |
863 if (!engine) { | 873 if (!engine) { |
864 error_ = kErrorEngineNotAvailable; | 874 error_ = kErrorEngineNotAvailable; |
865 return false; | 875 return false; |
866 } | 876 } |
867 | 877 |
868 engine->DeleteSurroundingText(params.context_id, params.offset, params.length, | 878 engine->DeleteSurroundingText(params.context_id, params.offset, params.length, |
869 &error_); | 879 &error_); |
870 return true; | 880 return true; |
871 } | 881 } |
872 | 882 |
873 bool InputImeKeyEventHandledFunction::RunAsync() { | 883 bool InputImeKeyEventHandledFunction::RunAsync() { |
874 scoped_ptr<KeyEventHandled::Params> params( | 884 scoped_ptr<KeyEventHandled::Params> params( |
875 KeyEventHandled::Params::Create(*args_)); | 885 KeyEventHandled::Params::Create(*args_)); |
876 InputImeEventRouter::GetInstance()->OnKeyEventHandled( | 886 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())) |
877 extension_id(), params->request_id, params->response); | 887 ->OnKeyEventHandled(extension_id(), params->request_id, params->response); |
878 return true; | 888 return true; |
879 } | 889 } |
880 | 890 |
881 InputImeAPI::InputImeAPI(content::BrowserContext* context) | 891 InputImeAPI::InputImeAPI(content::BrowserContext* context) |
882 : browser_context_(context), extension_registry_observer_(this) { | 892 : browser_context_(context), extension_registry_observer_(this) { |
883 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); | 893 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
884 | 894 |
885 EventRouter* event_router = EventRouter::Get(browser_context_); | 895 EventRouter* event_router = EventRouter::Get(browser_context_); |
886 event_router->RegisterObserver(this, input_ime::OnFocus::kEventName); | 896 event_router->RegisterObserver(this, input_ime::OnFocus::kEventName); |
887 } | 897 } |
888 | 898 |
889 InputImeAPI::~InputImeAPI() { | 899 InputImeAPI::~InputImeAPI() { |
890 EventRouter::Get(browser_context_)->UnregisterObserver(this); | 900 EventRouter::Get(browser_context_)->UnregisterObserver(this); |
891 } | 901 } |
892 | 902 |
893 static base::LazyInstance<BrowserContextKeyedAPIFactory<InputImeAPI> > | 903 static base::LazyInstance<BrowserContextKeyedAPIFactory<InputImeAPI> > |
894 g_factory = LAZY_INSTANCE_INITIALIZER; | 904 g_factory = LAZY_INSTANCE_INITIALIZER; |
895 | 905 |
896 // static | 906 // static |
897 BrowserContextKeyedAPIFactory<InputImeAPI>* InputImeAPI::GetFactoryInstance() { | 907 BrowserContextKeyedAPIFactory<InputImeAPI>* InputImeAPI::GetFactoryInstance() { |
898 return g_factory.Pointer(); | 908 return g_factory.Pointer(); |
899 } | 909 } |
900 | 910 |
901 void InputImeAPI::OnExtensionLoaded(content::BrowserContext* browser_context, | 911 void InputImeAPI::OnExtensionLoaded(content::BrowserContext* browser_context, |
902 const Extension* extension) { | 912 const Extension* extension) { |
903 const std::vector<InputComponentInfo>* input_components = | 913 const std::vector<InputComponentInfo>* input_components = |
904 extensions::InputComponents::GetInputComponents(extension); | 914 extensions::InputComponents::GetInputComponents(extension); |
905 if (input_components) | 915 if (input_components) |
906 input_ime_event_router()->RegisterImeExtension( | 916 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context)) |
907 Profile::FromBrowserContext(browser_context), | 917 ->RegisterImeExtension(extension->id(), *input_components); |
908 extension->id(), | |
909 *input_components); | |
910 } | 918 } |
911 | 919 |
912 void InputImeAPI::OnExtensionUnloaded(content::BrowserContext* browser_context, | 920 void InputImeAPI::OnExtensionUnloaded(content::BrowserContext* browser_context, |
913 const Extension* extension, | 921 const Extension* extension, |
914 UnloadedExtensionInfo::Reason reason) { | 922 UnloadedExtensionInfo::Reason reason) { |
915 const std::vector<InputComponentInfo>* input_components = | 923 const std::vector<InputComponentInfo>* input_components = |
916 extensions::InputComponents::GetInputComponents(extension); | 924 extensions::InputComponents::GetInputComponents(extension); |
917 if (!input_components) | 925 if (!input_components) |
918 return; | 926 return; |
919 if (input_components->size() > 0) | 927 if (input_components->size() > 0) { |
920 input_ime_event_router()->UnregisterAllImes(extension->id()); | 928 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context)) |
| 929 ->UnregisterAllImes(extension->id()); |
| 930 } |
921 } | 931 } |
922 | 932 |
923 void InputImeAPI::OnListenerAdded(const EventListenerInfo& details) { | 933 void InputImeAPI::OnListenerAdded(const EventListenerInfo& details) { |
| 934 if (!details.browser_context) |
| 935 return; |
924 InputMethodEngineInterface* engine = | 936 InputMethodEngineInterface* engine = |
925 input_ime_event_router()->GetActiveEngine(details.extension_id); | 937 GetInputImeEventRouter( |
| 938 Profile::FromBrowserContext(details.browser_context)) |
| 939 ->GetActiveEngine(details.extension_id); |
926 // Notifies the IME extension for IME ready with onActivate/onFocus events. | 940 // Notifies the IME extension for IME ready with onActivate/onFocus events. |
927 if (engine) | 941 if (engine) |
928 engine->Enable(engine->GetActiveComponentId()); | 942 engine->Enable(engine->GetActiveComponentId()); |
929 } | 943 } |
930 | 944 |
931 InputImeEventRouter* InputImeAPI::input_ime_event_router() { | |
932 return InputImeEventRouter::GetInstance(); | |
933 } | |
934 | |
935 } // namespace extensions | 945 } // namespace extensions |
OLD | NEW |