input_method_api.cc revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/extensions/input_method_api.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/lazy_instance.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/extensions/input_method_event_router.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_configuration.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_manager.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/event_names.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_function_registry.h" 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/profiles/profile.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Prefix, which is used by XKB. 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kXkbPrefix[] = "xkb:"; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace extensions { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GetInputMethodFunction::GetInputMethodFunction() { 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)GetInputMethodFunction::~GetInputMethodFunction() { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool GetInputMethodFunction::RunImpl() { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_CHROMEOS) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#else 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::input_method::InputMethodManager* manager = 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) chromeos::input_method::GetInputMethodManager(); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string input_method = InputMethodAPI::GetInputMethodForXkb( 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) manager->GetCurrentInputMethod().id()); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetResult(Value::CreateStringValue(input_method)); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InputMethodAPI::InputMethodAPI(Profile* profile) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : profile_(profile) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionSystem::Get(profile_)->event_router()->RegisterObserver( 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) this, event_names::kOnInputMethodChanged); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionFunctionRegistry* registry = 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionFunctionRegistry::GetInstance(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) registry->RegisterFunction<GetInputMethodFunction>(); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)InputMethodAPI::~InputMethodAPI() { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string InputMethodAPI::GetInputMethodForXkb(const std::string& xkb_id) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) size_t prefix_length = std::string(kXkbPrefix).length(); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(xkb_id.substr(0, prefix_length) == kXkbPrefix); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return xkb_id.substr(prefix_length); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InputMethodAPI::Shutdown() { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // UnregisterObserver may have already been called in OnListenerAdded, 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // but it is safe to call it more than once. 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void InputMethodAPI::OnListenerAdded( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::EventListenerInfo& details) { 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!input_method_event_router_.get()); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) input_method_event_router_.reset( 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new chromeos::ExtensionInputMethodEventRouter()); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionSystem::Get(profile_)->event_router()->UnregisterObserver(this); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)static base::LazyInstance<ProfileKeyedAPIFactory<InputMethodAPI> > 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) g_factory = LAZY_INSTANCE_INITIALIZER; 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ProfileKeyedAPIFactory<InputMethodAPI>* InputMethodAPI::GetFactoryInstance() { 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return &g_factory.Get(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace extensions 88