Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(202)

Side by Side Diff: chrome/browser/extensions/api/input_ime/input_ime_api.cc

Issue 1657593007: Implement chrome.input.ime.setComposition/commitText API. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Use Xxx::Results::Create(). Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698