Chromium Code Reviews| 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/profiles/profile_helper.h" | 9 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 10 #include "chrome/browser/extensions/extension_service.h" | |
| 10 #include "chrome/browser/profiles/profile_manager.h" | 11 #include "chrome/browser/profiles/profile_manager.h" |
| 11 #include "chrome/common/extensions/api/input_ime.h" | 12 #include "chrome/common/extensions/api/input_ime.h" |
| 12 #include "chrome/common/extensions/api/input_ime/input_components_handler.h" | 13 #include "chrome/common/extensions/api/input_ime/input_components_handler.h" |
| 13 #include "extensions/browser/event_router.h" | 14 #include "extensions/browser/event_router.h" |
| 14 #include "extensions/browser/extension_function_registry.h" | 15 #include "extensions/browser/extension_function_registry.h" |
| 15 #include "extensions/browser/extension_registry.h" | 16 #include "extensions/browser/extension_registry.h" |
| 17 #include "extensions/browser/extension_system.h" | |
| 18 #include "extensions/common/manifest_handlers/background_info.h" | |
| 16 | 19 |
| 17 #if defined(USE_X11) | 20 #if defined(USE_X11) |
| 18 #include "chrome/browser/chromeos/input_method/input_method_engine.h" | 21 #include "chrome/browser/chromeos/input_method/input_method_engine.h" |
| 19 #endif | 22 #endif |
| 20 | 23 |
| 21 namespace input_ime = extensions::api::input_ime; | 24 namespace input_ime = extensions::api::input_ime; |
| 22 namespace KeyEventHandled = extensions::api::input_ime::KeyEventHandled; | 25 namespace KeyEventHandled = extensions::api::input_ime::KeyEventHandled; |
| 23 namespace DeleteSurroundingText = | 26 namespace DeleteSurroundingText = |
| 24 extensions::api::input_ime::DeleteSurroundingText; | 27 extensions::api::input_ime::DeleteSurroundingText; |
| 25 namespace UpdateMenuItems = extensions::api::input_ime::UpdateMenuItems; | 28 namespace UpdateMenuItems = extensions::api::input_ime::UpdateMenuItems; |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 const std::string& extension_id, | 76 const std::string& extension_id, |
| 74 const std::string& event_name, | 77 const std::string& event_name, |
| 75 scoped_ptr<base::ListValue> args) { | 78 scoped_ptr<base::ListValue> args) { |
| 76 scoped_ptr<extensions::Event> event(new extensions::Event( | 79 scoped_ptr<extensions::Event> event(new extensions::Event( |
| 77 event_name, args.Pass())); | 80 event_name, args.Pass())); |
| 78 event->restrict_to_browser_context = profile; | 81 event->restrict_to_browser_context = profile; |
| 79 extensions::EventRouter::Get(profile) | 82 extensions::EventRouter::Get(profile) |
| 80 ->DispatchEventToExtension(extension_id, event.Pass()); | 83 ->DispatchEventToExtension(extension_id, event.Pass()); |
| 81 } | 84 } |
| 82 | 85 |
| 86 void CallbackKeyEventHandle(chromeos::input_method::KeyEventHandle* key_data, | |
| 87 bool handled) { | |
| 88 base::Callback<void(bool consumed)>* callback = | |
| 89 reinterpret_cast<base::Callback<void(bool consumed)>*>(key_data); | |
| 90 callback->Run(handled); | |
| 91 delete callback; | |
| 92 } | |
| 93 | |
| 83 } // namespace | 94 } // namespace |
| 84 | 95 |
| 85 namespace chromeos { | 96 namespace chromeos { |
| 86 class ImeObserver : public InputMethodEngineInterface::Observer { | 97 class ImeObserver : public InputMethodEngineInterface::Observer { |
| 87 public: | 98 public: |
| 88 ImeObserver(Profile* profile, const std::string& extension_id) | 99 ImeObserver(Profile* profile, const std::string& extension_id) |
| 89 : profile_(profile), extension_id_(extension_id) {} | 100 : profile_(profile), extension_id_(extension_id), has_background_(false) { |
| 101 extensions::ExtensionSystem* extension_system = | |
| 102 extensions::ExtensionSystem::Get(profile_); | |
| 103 ExtensionService* extension_service = extension_system->extension_service(); | |
| 104 const extensions::Extension* extension = | |
| 105 extension_service->GetExtensionById(extension_id, false); | |
| 106 DCHECK(extension); | |
| 107 extensions::BackgroundInfo* info = static_cast<extensions::BackgroundInfo*>( | |
| 108 extension->GetManifestData("background")); | |
| 109 if (info) | |
| 110 has_background_ = info->has_background_page(); | |
| 111 } | |
| 90 | 112 |
| 91 virtual ~ImeObserver() {} | 113 virtual ~ImeObserver() {} |
| 92 | 114 |
| 93 virtual void OnActivate(const std::string& engine_id) OVERRIDE { | 115 virtual void OnActivate(const std::string& engine_id) OVERRIDE { |
| 94 if (profile_ == NULL || extension_id_.empty()) | 116 if (profile_ == NULL || extension_id_.empty()) |
| 95 return; | 117 return; |
| 96 | 118 |
| 97 scoped_ptr<base::ListValue> args(input_ime::OnActivate::Create(engine_id)); | 119 scoped_ptr<base::ListValue> args(input_ime::OnActivate::Create(engine_id)); |
| 98 | 120 |
| 99 DispatchEventToExtension(profile_, extension_id_, | 121 DispatchEventToExtension(profile_, extension_id_, |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 159 const InputMethodEngineInterface::KeyboardEvent& event, | 181 const InputMethodEngineInterface::KeyboardEvent& event, |
| 160 chromeos::input_method::KeyEventHandle* key_data) OVERRIDE { | 182 chromeos::input_method::KeyEventHandle* key_data) OVERRIDE { |
| 161 if (profile_ == NULL || extension_id_.empty()) | 183 if (profile_ == NULL || extension_id_.empty()) |
| 162 return; | 184 return; |
| 163 | 185 |
| 164 // If there is no listener for the event, no need to dispatch the event to | 186 // If there is no listener for the event, no need to dispatch the event to |
| 165 // extension. Instead, releases the key event for default system behavior. | 187 // extension. Instead, releases the key event for default system behavior. |
| 166 if (!HasKeyEventListener()) { | 188 if (!HasKeyEventListener()) { |
| 167 // Continue processing the key event so that the physical keyboard can | 189 // Continue processing the key event so that the physical keyboard can |
| 168 // still work. | 190 // still work. |
| 169 base::Callback<void(bool consumed)>* callback = | 191 CallbackKeyEventHandle(key_data, false); |
| 170 reinterpret_cast<base::Callback<void(bool consumed)>*>(key_data); | |
| 171 callback->Run(false); | |
| 172 delete callback; | |
| 173 return; | 192 return; |
| 174 } | 193 } |
| 175 | 194 |
| 176 extensions::InputImeEventRouter* ime_event_router = | 195 extensions::InputImeEventRouter* ime_event_router = |
| 177 extensions::InputImeEventRouter::GetInstance(); | 196 extensions::InputImeEventRouter::GetInstance(); |
| 178 | 197 |
| 179 const std::string request_id = | 198 const std::string request_id = |
| 180 ime_event_router->AddRequest(engine_id, key_data); | 199 ime_event_router->AddRequest(engine_id, key_data); |
| 181 | 200 |
| 182 input_ime::KeyboardEvent key_data_value; | 201 input_ime::KeyboardEvent key_data_value; |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 275 scoped_ptr<base::ListValue> args(input_ime::OnReset::Create(engine_id)); | 294 scoped_ptr<base::ListValue> args(input_ime::OnReset::Create(engine_id)); |
| 276 | 295 |
| 277 DispatchEventToExtension(profile_, | 296 DispatchEventToExtension(profile_, |
| 278 extension_id_, | 297 extension_id_, |
| 279 input_ime::OnReset::kEventName, | 298 input_ime::OnReset::kEventName, |
| 280 args.Pass()); | 299 args.Pass()); |
| 281 } | 300 } |
| 282 | 301 |
| 283 private: | 302 private: |
| 284 bool HasKeyEventListener() const { | 303 bool HasKeyEventListener() const { |
| 285 return extensions::EventRouter::Get(profile_) | 304 return has_background_ && extensions::EventRouter::Get(profile_) |
|
nona
2014/07/17 08:43:15
Could you elaborate a bit more about this logic? P
Shu Chen
2014/07/17 09:24:14
Done.
| |
| 286 ->ExtensionHasEventListener(extension_id_, | 305 ->ExtensionHasEventListener(extension_id_, |
| 287 input_ime::OnKeyEvent::kEventName); | 306 input_ime::OnKeyEvent::kEventName); |
| 288 } | 307 } |
| 289 | 308 |
| 290 Profile* profile_; | 309 Profile* profile_; |
| 291 std::string extension_id_; | 310 std::string extension_id_; |
| 311 bool has_background_; | |
| 292 | 312 |
| 293 DISALLOW_COPY_AND_ASSIGN(ImeObserver); | 313 DISALLOW_COPY_AND_ASSIGN(ImeObserver); |
| 294 }; | 314 }; |
| 295 | 315 |
| 296 } // namespace chromeos | 316 } // namespace chromeos |
| 297 | 317 |
| 298 namespace extensions { | 318 namespace extensions { |
| 299 | 319 |
| 300 InputImeEventRouter* | 320 InputImeEventRouter* |
| 301 InputImeEventRouter::GetInstance() { | 321 InputImeEventRouter::GetInstance() { |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 408 RequestMap::iterator request = request_map_.find(request_id); | 428 RequestMap::iterator request = request_map_.find(request_id); |
| 409 if (request == request_map_.end()) { | 429 if (request == request_map_.end()) { |
| 410 LOG(ERROR) << "Request ID not found: " << request_id; | 430 LOG(ERROR) << "Request ID not found: " << request_id; |
| 411 return; | 431 return; |
| 412 } | 432 } |
| 413 | 433 |
| 414 std::string engine_id = request->second.first; | 434 std::string engine_id = request->second.first; |
| 415 chromeos::input_method::KeyEventHandle* key_data = request->second.second; | 435 chromeos::input_method::KeyEventHandle* key_data = request->second.second; |
| 416 request_map_.erase(request); | 436 request_map_.erase(request); |
| 417 | 437 |
| 418 InputMethodEngineInterface* engine = GetEngine(extension_id, engine_id); | 438 CallbackKeyEventHandle(key_data, handled); |
| 419 if (!engine) { | |
| 420 LOG(ERROR) << "Engine does not exist: " << engine_id; | |
| 421 return; | |
| 422 } | |
| 423 | |
| 424 engine->KeyEventDone(key_data, handled); | |
| 425 } | 439 } |
| 426 | 440 |
| 427 std::string InputImeEventRouter::AddRequest( | 441 std::string InputImeEventRouter::AddRequest( |
| 428 const std::string& engine_id, | 442 const std::string& engine_id, |
| 429 chromeos::input_method::KeyEventHandle* key_data) { | 443 chromeos::input_method::KeyEventHandle* key_data) { |
| 430 std::string request_id = base::IntToString(next_request_id_); | 444 std::string request_id = base::IntToString(next_request_id_); |
| 431 ++next_request_id_; | 445 ++next_request_id_; |
| 432 | 446 |
| 433 request_map_[request_id] = std::make_pair(engine_id, key_data); | 447 request_map_[request_id] = std::make_pair(engine_id, key_data); |
| 434 | 448 |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 842 input_ime_event_router()->GetActiveEngine(details.extension_id); | 856 input_ime_event_router()->GetActiveEngine(details.extension_id); |
| 843 if (engine) | 857 if (engine) |
| 844 engine->NotifyImeReady(); | 858 engine->NotifyImeReady(); |
| 845 } | 859 } |
| 846 | 860 |
| 847 InputImeEventRouter* InputImeAPI::input_ime_event_router() { | 861 InputImeEventRouter* InputImeAPI::input_ime_event_router() { |
| 848 return InputImeEventRouter::GetInstance(); | 862 return InputImeEventRouter::GetInstance(); |
| 849 } | 863 } |
| 850 | 864 |
| 851 } // namespace extensions | 865 } // namespace extensions |
| OLD | NEW |