Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(187)

Side by Side Diff: chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc

Issue 10399046: Remove virtual keyboard support. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: final rebase Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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/input_method/virtual_keyboard_selector.h"
6
7 #include "base/logging.h"
8 #include "base/stl_util.h"
9
10 namespace {
11
12 const char kDefaultURLPath[] = "index.html";
13 const size_t kDefaultURLPathLen = arraysize(kDefaultURLPath) - 1;
14
15 namespace ime = ::chromeos::input_method;
16
17 // Selects and returns a virtual keyboard extension from |keyboards| which
18 // supports the |layout|.
19 const ime::VirtualKeyboard* SelectVirtualKeyboardInternal(
20 const std::list<const ime::VirtualKeyboard*>& keyboards,
21 const std::string& layout) {
22 for (std::list<const ime::VirtualKeyboard*>::const_iterator iter =
23 keyboards.begin(); iter != keyboards.end(); ++iter) {
24 const ime::VirtualKeyboard* keyboard = *iter;
25 if (keyboard->IsLayoutSupported(layout))
26 return keyboard;
27 }
28 return NULL;
29 }
30
31 } // namespace
32
33 namespace chromeos {
34 namespace input_method {
35
36 VirtualKeyboard::VirtualKeyboard(const GURL& url,
37 const std::string& name,
38 const std::set<std::string>& supported_layouts,
39 bool is_system)
40 : url_(url),
41 name_(name),
42 supported_layouts_(supported_layouts),
43 is_system_(is_system) {
44 }
45
46 VirtualKeyboard::~VirtualKeyboard() {
47 }
48
49 GURL VirtualKeyboard::GetURLForLayout(const std::string& layout) const {
50 if (layout.empty()) {
51 return url_;
52 }
53 url_canon::Replacements<char> replacements;
54 replacements.SetPath(
55 kDefaultURLPath, url_parse::Component(0, kDefaultURLPathLen));
56 // TODO(yusukes): would be better to URL-encode the |layout|?
57 replacements.SetRef(layout.c_str(), url_parse::Component(0, layout.length()));
58 return url_.ReplaceComponents(replacements);
59 }
60
61 bool VirtualKeyboard::IsLayoutSupported(const std::string& layout) const {
62 return supported_layouts_.count(layout) > 0;
63 }
64
65 VirtualKeyboardSelector::VirtualKeyboardSelector()
66 : current_(NULL) {
67 }
68
69 VirtualKeyboardSelector::~VirtualKeyboardSelector() {
70 STLDeleteElements(&keyboards_);
71 STLDeleteElements(&system_keyboards_);
72 }
73
74 bool VirtualKeyboardSelector::AddVirtualKeyboard(
75 const GURL& url,
76 const std::string& name,
77 const std::set<std::string>& supported_layouts,
78 bool is_system) {
79 if (url_to_keyboard_.count(url))
80 return false; // the URL is already in use.
81
82 const VirtualKeyboard* new_keyboard = new VirtualKeyboard(url,
83 name,
84 supported_layouts,
85 is_system);
86 if (is_system) {
87 system_keyboards_.push_front(new_keyboard);
88 } else {
89 keyboards_.push_front(new_keyboard);
90 }
91
92 url_to_keyboard_.insert(std::make_pair(url, new_keyboard));
93 std::set<std::string>::const_iterator layout_iter;
94 for (layout_iter = new_keyboard->supported_layouts().begin();
95 layout_iter != new_keyboard->supported_layouts().end();
96 ++layout_iter) {
97 const std::string& layout = *layout_iter;
98 layout_to_keyboard_.insert(std::make_pair(layout, new_keyboard));
99 }
100
101 return true;
102 }
103
104 const VirtualKeyboard* VirtualKeyboardSelector::SelectVirtualKeyboard(
105 const std::string& layout) {
106 if (layout.empty()) {
107 DVLOG(1) << "No layout is specified";
108 return NULL;
109 }
110
111 // First, check the user pref.
112 std::map<std::string, const VirtualKeyboard*>::const_iterator iter =
113 user_preference_.find(layout);
114 if (iter != user_preference_.end() &&
115 iter->second->IsLayoutSupported(layout)) {
116 current_ = iter->second;
117 return current_;
118 }
119
120 // Second, check whether the current keyboard supports the layout.
121 if (current_ && current_->IsLayoutSupported(layout)) {
122 return current_;
123 }
124
125 const VirtualKeyboard* keyboard =
126 SelectVirtualKeyboardWithoutPreferences(layout);
127 if (!keyboard) {
128 DVLOG(1) << "No virtual keyboard for " << layout << " is found";
129 return NULL;
130 }
131
132 current_ = keyboard;
133 return keyboard;
134 }
135
136 bool VirtualKeyboardSelector::SetUserPreference(
137 const std::string& layout, const GURL& url) {
138 std::map<GURL, const VirtualKeyboard*>::const_iterator iter =
139 url_to_keyboard_.find(url);
140 if (iter == url_to_keyboard_.end()) {
141 DVLOG(1) << "Can't set user preference: unknown URL";
142 return false;
143 }
144
145 const VirtualKeyboard* keyboard = iter->second;
146 if (!keyboard->IsLayoutSupported(layout)) {
147 DVLOG(1) << "Requested layout is not supported by requested URL";
148 return false;
149 }
150
151 RemoveUserPreference(layout);
152 user_preference_.insert(std::make_pair(layout, keyboard));
153 return true;
154 }
155
156 void VirtualKeyboardSelector::RemoveUserPreference(const std::string& layout) {
157 user_preference_.erase(layout);
158 }
159
160 void VirtualKeyboardSelector::ClearAllUserPreferences() {
161 user_preference_.clear();
162 }
163
164 const VirtualKeyboard*
165 VirtualKeyboardSelector::SelectVirtualKeyboardWithoutPreferences(
166 const std::string& layout) {
167 const VirtualKeyboard* keyboard =
168 SelectVirtualKeyboardInternal(keyboards_, layout);
169 if (!keyboard)
170 keyboard = SelectVirtualKeyboardInternal(system_keyboards_, layout);
171 return keyboard;
172 }
173
174 } // namespace input_method
175 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698