| 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 | 9 |
| 9 #include "base/macros.h" | 10 #include "base/macros.h" |
| 10 #include "chrome/browser/chromeos/input_method/input_method_engine.h" | 11 #include "chrome/browser/chromeos/input_method/input_method_engine.h" |
| 11 #include "chrome/browser/chromeos/login/lock/screen_locker.h" | 12 #include "chrome/browser/chromeos/login/lock/screen_locker.h" |
| 12 #include "chrome/browser/chromeos/login/session/user_session_manager.h" | 13 #include "chrome/browser/chromeos/login/session/user_session_manager.h" |
| 13 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h" | 14 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h" |
| 14 #include "chrome/browser/chromeos/profiles/profile_helper.h" | 15 #include "chrome/browser/chromeos/profiles/profile_helper.h" |
| 15 #include "chrome/browser/extensions/extension_service.h" | 16 #include "chrome/browser/extensions/extension_service.h" |
| 16 #include "chrome/browser/profiles/profile_manager.h" | 17 #include "chrome/browser/profiles/profile_manager.h" |
| 17 #include "chrome/common/extensions/api/input_ime.h" | 18 #include "chrome/common/extensions/api/input_ime.h" |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 85 void OnActivate(const std::string& component_id) override { | 86 void OnActivate(const std::string& component_id) override { |
| 86 if (extension_id_.empty() || | 87 if (extension_id_.empty() || |
| 87 !HasListener(input_ime::OnActivate::kEventName)) | 88 !HasListener(input_ime::OnActivate::kEventName)) |
| 88 return; | 89 return; |
| 89 | 90 |
| 90 scoped_ptr<base::ListValue> args(input_ime::OnActivate::Create( | 91 scoped_ptr<base::ListValue> args(input_ime::OnActivate::Create( |
| 91 component_id, | 92 component_id, |
| 92 input_ime::ParseScreenType(GetCurrentScreenType()))); | 93 input_ime::ParseScreenType(GetCurrentScreenType()))); |
| 93 | 94 |
| 94 DispatchEventToExtension(extensions::events::INPUT_IME_ON_ACTIVATE, | 95 DispatchEventToExtension(extensions::events::INPUT_IME_ON_ACTIVATE, |
| 95 input_ime::OnActivate::kEventName, args.Pass()); | 96 input_ime::OnActivate::kEventName, |
| 97 std::move(args)); |
| 96 } | 98 } |
| 97 | 99 |
| 98 void OnInputContextUpdate( | 100 void OnInputContextUpdate( |
| 99 const IMEEngineHandlerInterface::InputContext& context) override { | 101 const IMEEngineHandlerInterface::InputContext& context) override { |
| 100 if (extension_id_.empty() || | 102 if (extension_id_.empty() || |
| 101 !HasListener(input_ime::OnInputContextUpdate::kEventName)) | 103 !HasListener(input_ime::OnInputContextUpdate::kEventName)) |
| 102 return; | 104 return; |
| 103 | 105 |
| 104 input_ime::InputContext context_value; | 106 input_ime::InputContext context_value; |
| 105 context_value.context_id = context.id; | 107 context_value.context_id = context.id; |
| 106 context_value.type = | 108 context_value.type = |
| 107 input_ime::ParseInputContextType(ConvertInputContextType(context)); | 109 input_ime::ParseInputContextType(ConvertInputContextType(context)); |
| 108 | 110 |
| 109 scoped_ptr<base::ListValue> args( | 111 scoped_ptr<base::ListValue> args( |
| 110 input_ime::OnInputContextUpdate::Create(context_value)); | 112 input_ime::OnInputContextUpdate::Create(context_value)); |
| 111 | 113 |
| 112 DispatchEventToExtension( | 114 DispatchEventToExtension( |
| 113 extensions::events::INPUT_IME_ON_INPUT_CONTEXT_UPDATE, | 115 extensions::events::INPUT_IME_ON_INPUT_CONTEXT_UPDATE, |
| 114 input_ime::OnInputContextUpdate::kEventName, args.Pass()); | 116 input_ime::OnInputContextUpdate::kEventName, std::move(args)); |
| 115 } | 117 } |
| 116 | 118 |
| 117 bool IsInterestedInKeyEvent() const override { | 119 bool IsInterestedInKeyEvent() const override { |
| 118 return ShouldForwardKeyEvent(); | 120 return ShouldForwardKeyEvent(); |
| 119 } | 121 } |
| 120 | 122 |
| 121 void OnCandidateClicked( | 123 void OnCandidateClicked( |
| 122 const std::string& component_id, | 124 const std::string& component_id, |
| 123 int candidate_id, | 125 int candidate_id, |
| 124 ui::IMEEngineObserver::MouseButtonEvent button) override { | 126 ui::IMEEngineObserver::MouseButtonEvent button) override { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 141 default: | 143 default: |
| 142 button_enum = input_ime::MOUSE_BUTTON_LEFT; | 144 button_enum = input_ime::MOUSE_BUTTON_LEFT; |
| 143 break; | 145 break; |
| 144 } | 146 } |
| 145 | 147 |
| 146 scoped_ptr<base::ListValue> args(input_ime::OnCandidateClicked::Create( | 148 scoped_ptr<base::ListValue> args(input_ime::OnCandidateClicked::Create( |
| 147 component_id, candidate_id, button_enum)); | 149 component_id, candidate_id, button_enum)); |
| 148 | 150 |
| 149 DispatchEventToExtension(extensions::events::INPUT_IME_ON_CANDIDATE_CLICKED, | 151 DispatchEventToExtension(extensions::events::INPUT_IME_ON_CANDIDATE_CLICKED, |
| 150 input_ime::OnCandidateClicked::kEventName, | 152 input_ime::OnCandidateClicked::kEventName, |
| 151 args.Pass()); | 153 std::move(args)); |
| 152 } | 154 } |
| 153 | 155 |
| 154 void OnMenuItemActivated(const std::string& component_id, | 156 void OnMenuItemActivated(const std::string& component_id, |
| 155 const std::string& menu_id) override { | 157 const std::string& menu_id) override { |
| 156 if (extension_id_.empty() || | 158 if (extension_id_.empty() || |
| 157 !HasListener(input_ime::OnMenuItemActivated::kEventName)) | 159 !HasListener(input_ime::OnMenuItemActivated::kEventName)) |
| 158 return; | 160 return; |
| 159 | 161 |
| 160 scoped_ptr<base::ListValue> args( | 162 scoped_ptr<base::ListValue> args( |
| 161 input_ime::OnMenuItemActivated::Create(component_id, menu_id)); | 163 input_ime::OnMenuItemActivated::Create(component_id, menu_id)); |
| 162 | 164 |
| 163 DispatchEventToExtension( | 165 DispatchEventToExtension( |
| 164 extensions::events::INPUT_IME_ON_MENU_ITEM_ACTIVATED, | 166 extensions::events::INPUT_IME_ON_MENU_ITEM_ACTIVATED, |
| 165 input_ime::OnMenuItemActivated::kEventName, args.Pass()); | 167 input_ime::OnMenuItemActivated::kEventName, std::move(args)); |
| 166 } | 168 } |
| 167 | 169 |
| 168 void OnSurroundingTextChanged(const std::string& component_id, | 170 void OnSurroundingTextChanged(const std::string& component_id, |
| 169 const std::string& text, | 171 const std::string& text, |
| 170 int cursor_pos, | 172 int cursor_pos, |
| 171 int anchor_pos, | 173 int anchor_pos, |
| 172 int offset_pos) override { | 174 int offset_pos) override { |
| 173 if (extension_id_.empty() || | 175 if (extension_id_.empty() || |
| 174 !HasListener(input_ime::OnSurroundingTextChanged::kEventName)) | 176 !HasListener(input_ime::OnSurroundingTextChanged::kEventName)) |
| 175 return; | 177 return; |
| 176 | 178 |
| 177 input_ime::OnSurroundingTextChanged::SurroundingInfo info; | 179 input_ime::OnSurroundingTextChanged::SurroundingInfo info; |
| 178 info.text = text; | 180 info.text = text; |
| 179 info.focus = cursor_pos; | 181 info.focus = cursor_pos; |
| 180 info.anchor = anchor_pos; | 182 info.anchor = anchor_pos; |
| 181 info.offset = offset_pos; | 183 info.offset = offset_pos; |
| 182 scoped_ptr<base::ListValue> args( | 184 scoped_ptr<base::ListValue> args( |
| 183 input_ime::OnSurroundingTextChanged::Create(component_id, info)); | 185 input_ime::OnSurroundingTextChanged::Create(component_id, info)); |
| 184 | 186 |
| 185 DispatchEventToExtension( | 187 DispatchEventToExtension( |
| 186 extensions::events::INPUT_IME_ON_SURROUNDING_TEXT_CHANGED, | 188 extensions::events::INPUT_IME_ON_SURROUNDING_TEXT_CHANGED, |
| 187 input_ime::OnSurroundingTextChanged::kEventName, args.Pass()); | 189 input_ime::OnSurroundingTextChanged::kEventName, std::move(args)); |
| 188 } | 190 } |
| 189 | 191 |
| 190 void OnCompositionBoundsChanged( | 192 void OnCompositionBoundsChanged( |
| 191 const std::vector<gfx::Rect>& bounds) override { | 193 const std::vector<gfx::Rect>& bounds) override { |
| 192 if (extension_id_.empty() || | 194 if (extension_id_.empty() || |
| 193 !HasListener(kOnCompositionBoundsChangedEventName)) | 195 !HasListener(kOnCompositionBoundsChangedEventName)) |
| 194 return; | 196 return; |
| 195 | 197 |
| 196 // Note: this is a private API event. | 198 // Note: this is a private API event. |
| 197 base::ListValue* bounds_list = new base::ListValue(); | 199 base::ListValue* bounds_list = new base::ListValue(); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 210 | 212 |
| 211 // The old extension code uses the first parameter to get the bounds of the | 213 // The old extension code uses the first parameter to get the bounds of the |
| 212 // first composition character, so for backward compatibility, add it here. | 214 // first composition character, so for backward compatibility, add it here. |
| 213 base::Value* first_value = NULL; | 215 base::Value* first_value = NULL; |
| 214 if (bounds_list->Get(0, &first_value)) | 216 if (bounds_list->Get(0, &first_value)) |
| 215 args->Append(first_value->DeepCopy()); | 217 args->Append(first_value->DeepCopy()); |
| 216 args->Append(bounds_list); | 218 args->Append(bounds_list); |
| 217 | 219 |
| 218 DispatchEventToExtension( | 220 DispatchEventToExtension( |
| 219 extensions::events::INPUT_METHOD_PRIVATE_ON_COMPOSITION_BOUNDS_CHANGED, | 221 extensions::events::INPUT_METHOD_PRIVATE_ON_COMPOSITION_BOUNDS_CHANGED, |
| 220 kOnCompositionBoundsChangedEventName, args.Pass()); | 222 kOnCompositionBoundsChangedEventName, std::move(args)); |
| 221 } | 223 } |
| 222 | 224 |
| 223 private: | 225 private: |
| 224 // ui::ImeObserver overrides. | 226 // ui::ImeObserver overrides. |
| 225 void DispatchEventToExtension( | 227 void DispatchEventToExtension( |
| 226 extensions::events::HistogramValue histogram_value, | 228 extensions::events::HistogramValue histogram_value, |
| 227 const std::string& event_name, | 229 const std::string& event_name, |
| 228 scoped_ptr<base::ListValue> args) override { | 230 scoped_ptr<base::ListValue> args) override { |
| 229 if (event_name != input_ime::OnActivate::kEventName) { | 231 if (event_name != input_ime::OnActivate::kEventName) { |
| 230 // For suspended IME extension (e.g. XKB extension), don't awake it by IME | 232 // For suspended IME extension (e.g. XKB extension), don't awake it by IME |
| (...skipping 12 matching lines...) Expand all Loading... |
| 243 extensions::ProcessManager* process_manager = | 245 extensions::ProcessManager* process_manager = |
| 244 extensions::ProcessManager::Get(profile_); | 246 extensions::ProcessManager::Get(profile_); |
| 245 if (extensions::BackgroundInfo::HasBackgroundPage(extension) && | 247 if (extensions::BackgroundInfo::HasBackgroundPage(extension) && |
| 246 !process_manager->GetBackgroundHostForExtension(extension_id_)) { | 248 !process_manager->GetBackgroundHostForExtension(extension_id_)) { |
| 247 return; | 249 return; |
| 248 } | 250 } |
| 249 } | 251 } |
| 250 } | 252 } |
| 251 | 253 |
| 252 scoped_ptr<extensions::Event> event( | 254 scoped_ptr<extensions::Event> event( |
| 253 new extensions::Event(histogram_value, event_name, args.Pass())); | 255 new extensions::Event(histogram_value, event_name, std::move(args))); |
| 254 event->restrict_to_browser_context = profile_; | 256 event->restrict_to_browser_context = profile_; |
| 255 extensions::EventRouter::Get(profile_) | 257 extensions::EventRouter::Get(profile_) |
| 256 ->DispatchEventToExtension(extension_id_, event.Pass()); | 258 ->DispatchEventToExtension(extension_id_, std::move(event)); |
| 257 } | 259 } |
| 258 | 260 |
| 259 // The component IME extensions need to know the current screen type (e.g. | 261 // The component IME extensions need to know the current screen type (e.g. |
| 260 // lock screen, login screen, etc.) so that its on-screen keyboard page | 262 // lock screen, login screen, etc.) so that its on-screen keyboard page |
| 261 // won't open new windows/pages. See crbug.com/395621. | 263 // won't open new windows/pages. See crbug.com/395621. |
| 262 std::string GetCurrentScreenType() { | 264 std::string GetCurrentScreenType() { |
| 263 switch (chromeos::input_method::InputMethodManager::Get() | 265 switch (chromeos::input_method::InputMethodManager::Get() |
| 264 ->GetUISessionState()) { | 266 ->GetUISessionState()) { |
| 265 case chromeos::input_method::InputMethodManager::STATE_LOGIN_SCREEN: | 267 case chromeos::input_method::InputMethodManager::STATE_LOGIN_SCREEN: |
| 266 return "login"; | 268 return "login"; |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 324 languages, | 326 languages, |
| 325 false, // 3rd party IMEs are always not for login. | 327 false, // 3rd party IMEs are always not for login. |
| 326 component.options_page_url, | 328 component.options_page_url, |
| 327 component.input_view_url)); | 329 component.input_view_url)); |
| 328 } | 330 } |
| 329 } | 331 } |
| 330 | 332 |
| 331 scoped_ptr<ui::IMEEngineObserver> observer( | 333 scoped_ptr<ui::IMEEngineObserver> observer( |
| 332 new ImeObserverChromeOS(extension_id, profile_)); | 334 new ImeObserverChromeOS(extension_id, profile_)); |
| 333 chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine(); | 335 chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine(); |
| 334 engine->Initialize(observer.Pass(), extension_id.c_str(), profile_); | 336 engine->Initialize(std::move(observer), extension_id.c_str(), profile_); |
| 335 engine_map_[extension_id] = engine; | 337 engine_map_[extension_id] = engine; |
| 336 chromeos::UserSessionManager::GetInstance() | 338 chromeos::UserSessionManager::GetInstance() |
| 337 ->GetDefaultIMEState(profile_) | 339 ->GetDefaultIMEState(profile_) |
| 338 ->AddInputMethodExtension(extension_id, descriptors, engine); | 340 ->AddInputMethodExtension(extension_id, descriptors, engine); |
| 339 | 341 |
| 340 return true; | 342 return true; |
| 341 } | 343 } |
| 342 | 344 |
| 343 void InputImeEventRouter::UnregisterAllImes(const std::string& extension_id) { | 345 void InputImeEventRouter::UnregisterAllImes(const std::string& extension_id) { |
| 344 std::map<std::string, IMEEngineHandlerInterface*>::iterator it = | 346 std::map<std::string, IMEEngineHandlerInterface*>::iterator it = |
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 684 error_ = kErrorEngineNotAvailable; | 686 error_ = kErrorEngineNotAvailable; |
| 685 return false; | 687 return false; |
| 686 } | 688 } |
| 687 | 689 |
| 688 engine->DeleteSurroundingText(params.context_id, params.offset, params.length, | 690 engine->DeleteSurroundingText(params.context_id, params.offset, params.length, |
| 689 &error_); | 691 &error_); |
| 690 return true; | 692 return true; |
| 691 } | 693 } |
| 692 | 694 |
| 693 } // namespace extensions | 695 } // namespace extensions |
| OLD | NEW |