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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/chromeos/extensions/input_method_api.h" 6 7 #include "base/lazy_instance.h" 8 #include "base/values.h" 9 #include "chrome/browser/chromeos/extensions/input_method_event_router.h" 10 #include "chrome/browser/extensions/api/input_ime/input_ime_api.h" 11 #include "chrome/browser/extensions/event_names.h" 12 #include "chrome/browser/extensions/extension_function_registry.h" 13 #include "chrome/browser/extensions/extension_system.h" 14 #include "chrome/browser/profiles/profile.h" 15 #include "chromeos/ime/input_method_manager.h" 16 17 namespace { 18 19 // Prefix, which is used by XKB. 20 const char kXkbPrefix[] = "xkb:"; 21 22 } // namespace 23 24 namespace extensions { 25 26 GetInputMethodFunction::GetInputMethodFunction() { 27 } 28 29 GetInputMethodFunction::~GetInputMethodFunction() { 30 } 31 32 bool GetInputMethodFunction::RunImpl() { 33 #if !defined(OS_CHROMEOS) 34 NOTREACHED(); 35 return false; 36 #else 37 chromeos::input_method::InputMethodManager* manager = 38 chromeos::input_method::InputMethodManager::Get(); 39 const std::string input_method = InputMethodAPI::GetInputMethodForXkb( 40 manager->GetCurrentInputMethod().id()); 41 SetResult(Value::CreateStringValue(input_method)); 42 return true; 43 #endif 44 } 45 46 StartImeFunction::StartImeFunction() { 47 } 48 49 StartImeFunction::~StartImeFunction() { 50 } 51 52 bool StartImeFunction::RunImpl() { 53 #if !defined(OS_CHROMEOS) 54 NOTREACHED(); 55 return false; 56 #else 57 chromeos::InputMethodEngine* engine = 58 InputImeEventRouter::GetInstance()->GetActiveEngine(extension_id()); 59 if (engine) 60 engine->StartIme(); 61 return true; 62 #endif 63 } 64 65 InputMethodAPI::InputMethodAPI(Profile* profile) 66 : profile_(profile) { 67 ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( 68 this, event_names::kOnInputMethodChanged); 69 ExtensionFunctionRegistry* registry = 70 ExtensionFunctionRegistry::GetInstance(); 71 registry->RegisterFunction<GetInputMethodFunction>(); 72 registry->RegisterFunction<StartImeFunction>(); 73 } 74 75 InputMethodAPI::~InputMethodAPI() { 76 } 77 78 // static 79 std::string InputMethodAPI::GetInputMethodForXkb(const std::string& xkb_id) { 80 size_t prefix_length = std::string(kXkbPrefix).length(); 81 DCHECK(xkb_id.substr(0, prefix_length) == kXkbPrefix); 82 return xkb_id.substr(prefix_length); 83 } 84 85 void InputMethodAPI::Shutdown() { 86 // UnregisterObserver may have already been called in OnListenerAdded, 87 // but it is safe to call it more than once. 88 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); 89 } 90 91 void InputMethodAPI::OnListenerAdded( 92 const extensions::EventListenerInfo& details) { 93 DCHECK(!input_method_event_router_.get()); 94 input_method_event_router_.reset( 95 new chromeos::ExtensionInputMethodEventRouter()); 96 ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); 97 } 98 99 static base::LazyInstance<ProfileKeyedAPIFactory<InputMethodAPI> > 100 g_factory = LAZY_INSTANCE_INITIALIZER; 101 102 // static 103 ProfileKeyedAPIFactory<InputMethodAPI>* InputMethodAPI::GetFactoryInstance() { 104 return &g_factory.Get(); 105 } 106 107 } // namespace extensions 108