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/login/lock/screen_locker.h" | 9 #include "chrome/browser/chromeos/login/lock/screen_locker.h" |
10 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h" | 10 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h" |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 } // namespace chromeos | 342 } // namespace chromeos |
343 | 343 |
344 namespace extensions { | 344 namespace extensions { |
345 | 345 |
346 InputImeEventRouter* | 346 InputImeEventRouter* |
347 InputImeEventRouter::GetInstance() { | 347 InputImeEventRouter::GetInstance() { |
348 return Singleton<InputImeEventRouter>::get(); | 348 return Singleton<InputImeEventRouter>::get(); |
349 } | 349 } |
350 | 350 |
351 bool InputImeEventRouter::RegisterIme( | 351 bool InputImeEventRouter::RegisterIme( |
| 352 Profile* profile, |
352 const std::string& extension_id, | 353 const std::string& extension_id, |
353 const extensions::InputComponentInfo& component) { | 354 const extensions::InputComponentInfo& component) { |
354 #if defined(USE_X11) | 355 #if defined(USE_X11) |
355 VLOG(1) << "RegisterIme: " << extension_id << " id: " << component.id; | 356 VLOG(1) << "RegisterIme: " << extension_id << " id: " << component.id; |
356 | 357 |
357 Profile* profile = ProfileManager::GetActiveUserProfile(); | |
358 // Avoid potential mem leaks due to duplicated component IDs. | 358 // Avoid potential mem leaks due to duplicated component IDs. |
359 if (!profile_engine_map_[profile][extension_id][component.id]) { | 359 if (!profile_engine_map_[profile][extension_id][component.id]) { |
360 std::vector<std::string> layouts; | 360 std::vector<std::string> layouts; |
361 layouts.assign(component.layouts.begin(), component.layouts.end()); | 361 layouts.assign(component.layouts.begin(), component.layouts.end()); |
362 | 362 |
363 std::vector<std::string> languages; | 363 std::vector<std::string> languages; |
364 languages.assign(component.languages.begin(), component.languages.end()); | 364 languages.assign(component.languages.begin(), component.languages.end()); |
365 | 365 |
366 // Ideally Observer should be per (extension_id + Profile), and multiple | 366 // Ideally Observer should be per (extension_id + Profile), and multiple |
367 // InputMethodEngine can share one Observer. But it would become tricky | 367 // InputMethodEngine can share one Observer. But it would become tricky |
368 // to maintain an internal map for observers which does nearly nothing | 368 // to maintain an internal map for observers which does nearly nothing |
369 // but just make sure they can properly deleted. | 369 // but just make sure they can properly deleted. |
370 // Making Obesrver per InputMethodEngine can make things cleaner. | 370 // Making Obesrver per InputMethodEngine can make things cleaner. |
371 scoped_ptr<chromeos::InputMethodEngineInterface::Observer> observer( | 371 scoped_ptr<chromeos::InputMethodEngineInterface::Observer> observer( |
372 new chromeos::ImeObserver(profile, extension_id)); | 372 new chromeos::ImeObserver(profile, extension_id)); |
373 chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine(); | 373 chromeos::InputMethodEngine* engine = new chromeos::InputMethodEngine(); |
374 engine->Initialize(observer.Pass(), | 374 engine->Initialize(profile, |
| 375 observer.Pass(), |
375 component.name.c_str(), | 376 component.name.c_str(), |
376 extension_id.c_str(), | 377 extension_id.c_str(), |
377 component.id.c_str(), | 378 component.id.c_str(), |
378 languages, | 379 languages, |
379 layouts, | 380 layouts, |
380 component.options_page_url, | 381 component.options_page_url, |
381 component.input_view_url); | 382 component.input_view_url); |
382 profile_engine_map_[profile][extension_id][component.id] = engine; | 383 profile_engine_map_[profile][extension_id][component.id] = engine; |
383 } | 384 } |
384 | 385 |
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 const Extension* extension) { | 848 const Extension* extension) { |
848 const std::vector<InputComponentInfo>* input_components = | 849 const std::vector<InputComponentInfo>* input_components = |
849 extensions::InputComponents::GetInputComponents(extension); | 850 extensions::InputComponents::GetInputComponents(extension); |
850 if (!input_components) | 851 if (!input_components) |
851 return; | 852 return; |
852 for (std::vector<extensions::InputComponentInfo>::const_iterator component = | 853 for (std::vector<extensions::InputComponentInfo>::const_iterator component = |
853 input_components->begin(); | 854 input_components->begin(); |
854 component != input_components->end(); | 855 component != input_components->end(); |
855 ++component) { | 856 ++component) { |
856 if (component->type == extensions::INPUT_COMPONENT_TYPE_IME) { | 857 if (component->type == extensions::INPUT_COMPONENT_TYPE_IME) { |
857 // Don't pass profile_ to register ime, instead always use | 858 // If |browser_context| looks like signin profile, use the real signin |
858 // GetActiveUserProfile. It is because: | 859 // profile. This is because IME extensions for signin profile are run |
859 // The original profile for login screen is called signin profile. | 860 // in Off-The-Record profile, based on given static defaults. |
860 // And the active profile is the incognito profile based on signin | 861 // So if |profile_| is signin profile, we need to make sure |
861 // profile. So if |profile_| is signin profile, we need to make sure | |
862 // the router/observer runs under its incognito profile, because the | 862 // the router/observer runs under its incognito profile, because the |
863 // component extensions were installed under its incognito profile. | 863 // component extensions were installed under its incognito profile. |
864 input_ime_event_router()->RegisterIme(extension->id(), *component); | 864 Profile* profile = Profile::FromBrowserContext(browser_context); |
| 865 if (chromeos::ProfileHelper::IsSigninProfile(profile)) |
| 866 profile = chromeos::ProfileHelper::GetSigninProfile(); |
| 867 input_ime_event_router()->RegisterIme( |
| 868 profile, extension->id(), *component); |
865 } | 869 } |
866 } | 870 } |
867 } | 871 } |
868 | 872 |
869 void InputImeAPI::OnExtensionUnloaded(content::BrowserContext* browser_context, | 873 void InputImeAPI::OnExtensionUnloaded(content::BrowserContext* browser_context, |
870 const Extension* extension, | 874 const Extension* extension, |
871 UnloadedExtensionInfo::Reason reason) { | 875 UnloadedExtensionInfo::Reason reason) { |
872 const std::vector<InputComponentInfo>* input_components = | 876 const std::vector<InputComponentInfo>* input_components = |
873 extensions::InputComponents::GetInputComponents(extension); | 877 extensions::InputComponents::GetInputComponents(extension); |
874 if (!input_components) | 878 if (!input_components) |
875 return; | 879 return; |
876 if (input_components->size() > 0) | 880 if (input_components->size() > 0) |
877 input_ime_event_router()->UnregisterAllImes(extension->id()); | 881 input_ime_event_router()->UnregisterAllImes(extension->id()); |
878 } | 882 } |
879 | 883 |
880 void InputImeAPI::OnListenerAdded(const EventListenerInfo& details) { | 884 void InputImeAPI::OnListenerAdded(const EventListenerInfo& details) { |
881 InputMethodEngineInterface* engine = | 885 InputMethodEngineInterface* engine = |
882 input_ime_event_router()->GetActiveEngine(details.extension_id); | 886 input_ime_event_router()->GetActiveEngine(details.extension_id); |
883 if (engine) | 887 if (engine) |
884 engine->NotifyImeReady(); | 888 engine->NotifyImeReady(); |
885 } | 889 } |
886 | 890 |
887 InputImeEventRouter* InputImeAPI::input_ime_event_router() { | 891 InputImeEventRouter* InputImeAPI::input_ime_event_router() { |
888 return InputImeEventRouter::GetInstance(); | 892 return InputImeEventRouter::GetInstance(); |
889 } | 893 } |
890 | 894 |
891 } // namespace extensions | 895 } // namespace extensions |
OLD | NEW |