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/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
8 #include "chrome/common/extensions/api/input_ime.h" | 8 #include "chrome/common/extensions/api/input_ime.h" |
9 #include "extensions/browser/extension_registry.h" | 9 #include "extensions/browser/extension_registry.h" |
10 | 10 |
11 namespace input_ime = extensions::api::input_ime; | 11 namespace input_ime = extensions::api::input_ime; |
12 namespace KeyEventHandled = extensions::api::input_ime::KeyEventHandled; | 12 namespace KeyEventHandled = extensions::api::input_ime::KeyEventHandled; |
| 13 namespace SetComposition = extensions::api::input_ime::SetComposition; |
| 14 namespace CommitText = extensions::api::input_ime::CommitText; |
13 using ui::IMEEngineHandlerInterface; | 15 using ui::IMEEngineHandlerInterface; |
14 using input_method::InputMethodEngineBase; | 16 using input_method::InputMethodEngineBase; |
15 | 17 |
16 namespace ui { | 18 namespace ui { |
17 | 19 |
18 ImeObserver::ImeObserver(const std::string& extension_id, Profile* profile) | 20 ImeObserver::ImeObserver(const std::string& extension_id, Profile* profile) |
19 : extension_id_(extension_id), profile_(profile) {} | 21 : extension_id_(extension_id), profile_(profile) {} |
20 | 22 |
21 void ImeObserver::OnActivate(const std::string& component_id) { | 23 void ImeObserver::OnActivate(const std::string& component_id) { |
22 if (extension_id_.empty() || !HasListener(input_ime::OnActivate::kEventName)) | 24 if (extension_id_.empty() || !HasListener(input_ime::OnActivate::kEventName)) |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
256 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())); | 258 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())); |
257 InputMethodEngineBase* engine = | 259 InputMethodEngineBase* engine = |
258 event_router ? event_router->GetActiveEngine(extension_id()) : nullptr; | 260 event_router ? event_router->GetActiveEngine(extension_id()) : nullptr; |
259 if (engine) { | 261 if (engine) { |
260 engine->KeyEventHandled(extension_id(), params->request_id, | 262 engine->KeyEventHandled(extension_id(), params->request_id, |
261 params->response); | 263 params->response); |
262 } | 264 } |
263 return RespondNow(NoArguments()); | 265 return RespondNow(NoArguments()); |
264 } | 266 } |
265 | 267 |
| 268 ExtensionFunction::ResponseAction InputImeSetCompositionFunction::Run() { |
| 269 bool success = false; |
| 270 InputImeEventRouter* event_router = |
| 271 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())); |
| 272 InputMethodEngineBase* engine = |
| 273 event_router ? event_router->GetActiveEngine(extension_id()) : nullptr; |
| 274 if (engine) { |
| 275 scoped_ptr<SetComposition::Params> parent_params( |
| 276 SetComposition::Params::Create(*args_)); |
| 277 const SetComposition::Params::Parameters& params = |
| 278 parent_params->parameters; |
| 279 std::vector<InputMethodEngineBase::SegmentInfo> segments; |
| 280 if (params.segments) { |
| 281 const std::vector< |
| 282 linked_ptr<SetComposition::Params::Parameters::SegmentsType>>& |
| 283 segments_args = *params.segments; |
| 284 for (const auto& segments_arg : segments_args) { |
| 285 EXTENSION_FUNCTION_VALIDATE(segments_arg->style != |
| 286 input_ime::UNDERLINE_STYLE_NONE); |
| 287 InputMethodEngineBase::SegmentInfo segment_info; |
| 288 segment_info.start = segments_arg->start; |
| 289 segment_info.end = segments_arg->end; |
| 290 if (segments_arg->style == input_ime::UNDERLINE_STYLE_UNDERLINE) { |
| 291 segment_info.style = InputMethodEngineBase::SEGMENT_STYLE_UNDERLINE; |
| 292 } else if (segments_arg->style == |
| 293 input_ime::UNDERLINE_STYLE_DOUBLEUNDERLINE) { |
| 294 segment_info.style = |
| 295 InputMethodEngineBase::SEGMENT_STYLE_DOUBLE_UNDERLINE; |
| 296 } else { |
| 297 segment_info.style = |
| 298 InputMethodEngineBase::SEGMENT_STYLE_NO_UNDERLINE; |
| 299 } |
| 300 segments.push_back(segment_info); |
| 301 } |
| 302 } |
| 303 int selection_start = |
| 304 params.selection_start ? *params.selection_start : params.cursor; |
| 305 int selection_end = |
| 306 params.selection_end ? *params.selection_end : params.cursor; |
| 307 success = engine->SetComposition(params.context_id, params.text.c_str(), |
| 308 selection_start, selection_end, |
| 309 params.cursor, segments, &error_); |
| 310 } |
| 311 scoped_ptr<base::ListValue> output = SetComposition::Results::Create(success); |
| 312 return RespondNow(ArgumentList(std::move(output))); |
| 313 } |
| 314 |
| 315 ExtensionFunction::ResponseAction InputImeCommitTextFunction::Run() { |
| 316 bool success = false; |
| 317 InputImeEventRouter* event_router = |
| 318 GetInputImeEventRouter(Profile::FromBrowserContext(browser_context())); |
| 319 InputMethodEngineBase* engine = |
| 320 event_router ? event_router->GetActiveEngine(extension_id()) : nullptr; |
| 321 if (engine) { |
| 322 scoped_ptr<CommitText::Params> parent_params( |
| 323 CommitText::Params::Create(*args_)); |
| 324 const CommitText::Params::Parameters& params = parent_params->parameters; |
| 325 success = |
| 326 engine->CommitText(params.context_id, params.text.c_str(), &error_); |
| 327 } |
| 328 scoped_ptr<base::ListValue> output = CommitText::Results::Create(success); |
| 329 return RespondNow(ArgumentList(std::move(output))); |
| 330 } |
| 331 |
266 InputImeAPI::InputImeAPI(content::BrowserContext* context) | 332 InputImeAPI::InputImeAPI(content::BrowserContext* context) |
267 : browser_context_(context), extension_registry_observer_(this) { | 333 : browser_context_(context), extension_registry_observer_(this) { |
268 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); | 334 extension_registry_observer_.Add(ExtensionRegistry::Get(browser_context_)); |
269 | 335 |
270 EventRouter* event_router = EventRouter::Get(browser_context_); | 336 EventRouter* event_router = EventRouter::Get(browser_context_); |
271 event_router->RegisterObserver(this, input_ime::OnFocus::kEventName); | 337 event_router->RegisterObserver(this, input_ime::OnFocus::kEventName); |
272 } | 338 } |
273 | 339 |
274 InputImeAPI::~InputImeAPI() { | 340 InputImeAPI::~InputImeAPI() { |
275 EventRouter::Get(browser_context_)->UnregisterObserver(this); | 341 EventRouter::Get(browser_context_)->UnregisterObserver(this); |
(...skipping 10 matching lines...) Expand all Loading... |
286 InputImeEventRouter* GetInputImeEventRouter(Profile* profile) { | 352 InputImeEventRouter* GetInputImeEventRouter(Profile* profile) { |
287 if (!profile) | 353 if (!profile) |
288 return nullptr; | 354 return nullptr; |
289 if (profile->HasOffTheRecordProfile()) | 355 if (profile->HasOffTheRecordProfile()) |
290 profile = profile->GetOffTheRecordProfile(); | 356 profile = profile->GetOffTheRecordProfile(); |
291 return extensions::InputImeEventRouterFactory::GetInstance()->GetRouter( | 357 return extensions::InputImeEventRouterFactory::GetInstance()->GetRouter( |
292 profile); | 358 profile); |
293 } | 359 } |
294 | 360 |
295 } // namespace extensions | 361 } // namespace extensions |
OLD | NEW |