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