Chromium Code Reviews| Index: chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc |
| diff --git a/chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc b/chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc |
| index 1e427ad3acd4c2c14468f1fc9a22bd713846bf5d..c9c9f172bd8cdbbe15d5f89263d38bf52bac452b 100644 |
| --- a/chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc |
| +++ b/chrome/browser/chromeos/input_method/virtual_keyboard_selector.cc |
| @@ -8,8 +8,26 @@ |
| #include "base/stl_util.h" |
| namespace { |
| + |
| const char kDefaultURLPath[] = "index.html"; |
| const size_t kDefaultURLPathLen = arraysize(kDefaultURLPath) - 1; |
| + |
| +namespace ime = ::chromeos::input_method; |
| + |
| +// Selects and returns a virtual keyboard extension from |keyboards| which |
| +// supports the |layout|. |
| +const ime::VirtualKeyboard* SelectVirtualKeyboardInternal( |
| + const std::list<const ime::VirtualKeyboard*>& keyboards, |
| + const std::string& layout) { |
| + for (std::list<const ime::VirtualKeyboard*>::const_iterator iter = |
| + keyboards.begin(); iter != keyboards.end(); ++iter) { |
| + const ime::VirtualKeyboard* keyboard = *iter; |
| + if (keyboard->IsLayoutSupported(layout)) |
| + return keyboard; |
| + } |
| + return NULL; |
| +} |
| + |
| } // namespace |
| namespace chromeos { |
| @@ -38,6 +56,10 @@ GURL VirtualKeyboard::GetURLForLayout(const std::string& layout) const { |
| return url_.ReplaceComponents(replacements); |
| } |
| +bool VirtualKeyboard::IsLayoutSupported(const std::string& layout) const { |
| + return supported_layouts_.count(layout) > 0; |
| +} |
| + |
| VirtualKeyboardSelector::VirtualKeyboardSelector() |
| : current_(NULL) { |
| } |
| @@ -47,10 +69,13 @@ VirtualKeyboardSelector::~VirtualKeyboardSelector() { |
| STLDeleteElements(&system_keyboards_); |
| } |
| -void VirtualKeyboardSelector::AddVirtualKeyboard( |
| +bool VirtualKeyboardSelector::AddVirtualKeyboard( |
| const GURL& url, |
| const std::set<std::string>& supported_layouts, |
| bool is_system) { |
| + if (url_to_keyboard_.count(url)) |
| + return false; // the URL is already in use. |
| + |
| const VirtualKeyboard* new_keyboard = new VirtualKeyboard(url, |
| supported_layouts, |
| is_system); |
| @@ -59,6 +84,9 @@ void VirtualKeyboardSelector::AddVirtualKeyboard( |
| } else { |
| keyboards_.push_front(new_keyboard); |
| } |
| + |
| + url_to_keyboard_.insert(std::make_pair(url, new_keyboard)); |
| + return true; |
| } |
| const VirtualKeyboard* VirtualKeyboardSelector::SelectVirtualKeyboard( |
| @@ -68,12 +96,22 @@ const VirtualKeyboard* VirtualKeyboardSelector::SelectVirtualKeyboard( |
| return NULL; |
| } |
| - // First, check whether the current keyboard supports the layout. |
| - if (current_ && current_->supported_layouts().count(layout) > 0) { |
| + // First, check the user pref. |
| + std::map<std::string, const VirtualKeyboard*>::const_iterator iter = |
| + user_preference_.find(layout); |
| + if (iter != user_preference_.end() && |
| + iter->second->IsLayoutSupported(layout)) { |
| + current_ = iter->second; |
| return current_; |
| } |
| - const VirtualKeyboard* keyboard = SelectVirtualKeyboardInternal(layout); |
| + // Second, check whether the current keyboard supports the layout. |
| + if (current_ && current_->IsLayoutSupported(layout)) { |
| + return current_; |
| + } |
| + |
| + const VirtualKeyboard* keyboard = |
| + SelectVirtualKeyboardWithoutPreferences(layout); |
| if (!keyboard) { |
| VLOG(1) << "No virtual keyboard for " << layout << " is found"; |
| return NULL; |
| @@ -83,21 +121,38 @@ const VirtualKeyboard* VirtualKeyboardSelector::SelectVirtualKeyboard( |
| return keyboard; |
| } |
| -const VirtualKeyboard* VirtualKeyboardSelector::SelectVirtualKeyboardInternal( |
| - const std::string& layout) { |
| - std::list<const VirtualKeyboard*>::const_iterator iter; |
| - for (iter = keyboards_.begin(); iter != keyboards_.end(); ++iter) { |
| - if ((*iter)->supported_layouts().count(layout) > 0) { |
| - return *iter; |
| - } |
| +bool VirtualKeyboardSelector::SetUserPreference( |
| + const std::string& layout, const GURL& url) { |
| + std::map<GURL, const VirtualKeyboard*>::const_iterator iter = |
| + url_to_keyboard_.find(url); |
| + if (iter == url_to_keyboard_.end()) { |
| + VLOG(1) << "Can't set user preference: unknown URL"; |
| + return false; |
| } |
| - for (iter = system_keyboards_.begin(); |
| - iter != system_keyboards_.end(); ++iter) { |
| - if ((*iter)->supported_layouts().count(layout) > 0) { |
| - return *iter; |
| - } |
| + |
| + const VirtualKeyboard* keyboard = iter->second; |
| + if (!keyboard->IsLayoutSupported(layout)) { |
| + VLOG(1) << "Can't set user preference: unsupported layout"; |
|
bryeung
2011/08/04 17:41:41
nit: maybe "requested layout is not supported by r
Yusuke Sato
2011/08/05 02:09:44
Done.
|
| + return false; |
| } |
| - return NULL; |
| + |
| + RemoveUserPreference(layout); |
| + user_preference_.insert(std::make_pair(layout, keyboard)); |
| + return true; |
| +} |
| + |
| +void VirtualKeyboardSelector::RemoveUserPreference(const std::string& layout) { |
| + user_preference_.erase(layout); |
| +} |
| + |
| +const VirtualKeyboard* |
| +VirtualKeyboardSelector::SelectVirtualKeyboardWithoutPreferences( |
| + const std::string& layout) { |
| + const VirtualKeyboard* keyboard = |
| + SelectVirtualKeyboardInternal(keyboards_, layout); |
| + if (!keyboard) |
| + keyboard = SelectVirtualKeyboardInternal(system_keyboards_, layout); |
| + return keyboard; |
| } |
| } // namespace input_method |