Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / api / input / input.cc
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   base::UserMetricsAction("VirtualKeyboardLoaded");
137
138   return true;
139 #endif
140   error_ = kNotYetImplementedError;
141   return false;
142 }
143
144 bool VirtualKeyboardPrivateGetKeyboardConfigFunction::RunImpl() {
145   DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
146 #if defined(USE_ASH)
147   base::DictionaryValue* results = new base::DictionaryValue();
148   results->SetString("layout", keyboard::GetKeyboardLayout());
149   results->SetBoolean("a11ymode", keyboard::GetAccessibilityKeyboardEnabled());
150   SetResult(results);
151   return true;
152 #endif
153   error_ = kNotYetImplementedError;
154   return false;
155 }
156
157 InputAPI::InputAPI(Profile* profile) {
158 }
159
160 InputAPI::~InputAPI() {
161 }
162
163 static base::LazyInstance<ProfileKeyedAPIFactory<InputAPI> >
164 g_factory = LAZY_INSTANCE_INITIALIZER;
165
166 // static
167 ProfileKeyedAPIFactory<InputAPI>* InputAPI::GetFactoryInstance() {
168   return g_factory.Pointer();
169 }
170
171 }  // namespace extensions