Home | History | Annotate | Download | only in input
      1 // Copyright 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/extensions/api/input/input.h"
      6 
      7 #include "base/command_line.h"
      8 #include "base/lazy_instance.h"
      9 #include "base/metrics/histogram.h"
     10 #include "base/strings/string16.h"
     11 #include "chrome/browser/extensions/extension_function_registry.h"
     12 #include "content/public/browser/browser_thread.h"
     13 #include "content/public/browser/user_metrics.h"
     14 #include "ui/events/event.h"
     15 #include "ui/keyboard/keyboard_controller.h"
     16 #include "ui/keyboard/keyboard_switches.h"
     17 
     18 #if defined(USE_ASH)
     19 #include "ash/root_window_controller.h"
     20 #include "ash/shell.h"
     21 #include "ui/keyboard/keyboard_util.h"
     22 #endif
     23 
     24 namespace {
     25 
     26 const char kNotYetImplementedError[] =
     27     "API is not implemented on this platform.";
     28 
     29 }  // namespace
     30 
     31 namespace extensions {
     32 
     33 bool VirtualKeyboardPrivateInsertTextFunction::RunImpl() {
     34   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     35 #if defined(USE_ASH)
     36   base::string16 text;
     37   EXTENSION_FUNCTION_VALIDATE(args_->GetString(0, &text));
     38 
     39   return keyboard::InsertText(text, ash::Shell::GetPrimaryRootWindow());
     40 #endif
     41   error_ = kNotYetImplementedError;
     42   return false;
     43 }
     44 
     45 bool VirtualKeyboardPrivateMoveCursorFunction::RunImpl() {
     46   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     47 #if defined(USE_ASH)
     48   if (!CommandLine::ForCurrentProcess()->HasSwitch(
     49       keyboard::switches::kEnableSwipeSelection)) {
     50     return false;
     51   }
     52 
     53   int swipe_direction;
     54   int modifier_flags;
     55   EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(0, &swipe_direction));
     56   EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(1, &modifier_flags));
     57 
     58   return keyboard::MoveCursor(
     59       swipe_direction,
     60       modifier_flags,
     61       ash::Shell::GetPrimaryRootWindow()->GetDispatcher());
     62 #endif
     63   error_ = kNotYetImplementedError;
     64   return false;
     65 }
     66 
     67 bool VirtualKeyboardPrivateSendKeyEventFunction::RunImpl() {
     68   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
     69 #if defined(USE_ASH)
     70   base::Value* options_value = NULL;
     71   base::DictionaryValue* params = NULL;
     72   std::string type;
     73   int char_value;
     74   int key_code;
     75   std::string key_name;
     76   int modifiers;
     77 
     78   EXTENSION_FUNCTION_VALIDATE(args_->Get(0, &options_value));
     79   EXTENSION_FUNCTION_VALIDATE(options_value->GetAsDictionary(&params));
     80   EXTENSION_FUNCTION_VALIDATE(params->GetString("type", &type));
     81   EXTENSION_FUNCTION_VALIDATE(params->GetInteger("charValue", &char_value));
     82   EXTENSION_FUNCTION_VALIDATE(params->GetInteger("keyCode", &key_code));
     83   EXTENSION_FUNCTION_VALIDATE(params->GetString("keyName", &key_name));
     84   EXTENSION_FUNCTION_VALIDATE(params->GetInteger("modifiers", &modifiers));
     85 
     86   return keyboard::SendKeyEvent(
     87       type,
     88       char_value,
     89       key_code,
     90       key_name,
     91       modifiers,
     92       ash::Shell::GetPrimaryRootWindow()->GetDispatcher());
     93 #endif
     94   error_ = kNotYetImplementedError;
     95   return false;
     96 }
     97 
     98 bool VirtualKeyboardPrivateHideKeyboardFunction::RunImpl() {
     99   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
    100 #if defined(USE_ASH)
    101   UMA_HISTOGRAM_ENUMERATION(
    102       "VirtualKeyboard.KeyboardControlEvent",
    103       keyboard::KEYBOARD_CONTROL_HIDE_USER,
    104       keyboard::KEYBOARD_CONTROL_MAX);
    105 
    106   // Pass HIDE_REASON_MANUAL since calls to HideKeyboard as part of this API
    107   // would be user generated.
    108   ash::Shell::GetInstance()->keyboard_controller()->HideKeyboard(
    109       keyboard::KeyboardController::HIDE_REASON_MANUAL);
    110 
    111   return true;
    112 #endif
    113   error_ = kNotYetImplementedError;
    114   return false;
    115 }
    116 
    117 bool VirtualKeyboardPrivateLockKeyboardFunction::RunImpl() {
    118   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
    119 #if defined(USE_ASH)
    120   bool lock;
    121   EXTENSION_FUNCTION_VALIDATE(args_->GetBoolean(0, &lock));
    122 
    123   ash::Shell::GetInstance()->keyboard_controller()->set_lock_keyboard(lock);
    124 
    125   return true;
    126 #endif
    127   error_ = kNotYetImplementedError;
    128   return false;
    129 }
    130 
    131 bool VirtualKeyboardPrivateKeyboardLoadedFunction::RunImpl() {
    132   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
    133 #if defined(USE_ASH)
    134   keyboard::MarkKeyboardLoadFinished();
    135 
    136   content::UserMetricsAction("VirtualKeyboardLoaded");
    137 
    138   return true;
    139 #endif
    140   error_ = kNotYetImplementedError;
    141   return false;
    142 }
    143 
    144 InputAPI::InputAPI(Profile* profile) {
    145 }
    146 
    147 InputAPI::~InputAPI() {
    148 }
    149 
    150 static base::LazyInstance<ProfileKeyedAPIFactory<InputAPI> >
    151 g_factory = LAZY_INSTANCE_INITIALIZER;
    152 
    153 // static
    154 ProfileKeyedAPIFactory<InputAPI>* InputAPI::GetFactoryInstance() {
    155   return &g_factory.Get();
    156 }
    157 
    158 }  // namespace extensions
    159