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

Unified Diff: chrome/browser/chromeos/login/screen_locker.cc

Issue 2771005: Deactivate all input methods (except keyboard layouts) when screen is locked. (Closed)
Patch Set: fixed all Created 10 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/chromeos/login/screen_locker.cc
diff --git a/chrome/browser/chromeos/login/screen_locker.cc b/chrome/browser/chromeos/login/screen_locker.cc
index bba8f616bb595204cd52c65118e5a40bc66196e7..a5905957b1131597ed3950109ce5abfef9975e0f 100644
--- a/chrome/browser/chromeos/login/screen_locker.cc
+++ b/chrome/browser/chromeos/login/screen_locker.cc
@@ -4,13 +4,19 @@
#include "chrome/browser/chromeos/login/screen_locker.h"
+#include <string>
+#include <vector>
+
#include "app/l10n_util.h"
#include "app/resource_bundle.h"
#include "base/message_loop.h"
#include "base/singleton.h"
+#include "base/string_util.h"
#include "base/utf_string_conversions.h"
#include "chrome/browser/browser_list.h"
+#include "chrome/browser/chromeos/cros/language_library.h"
#include "chrome/browser/chromeos/cros/screen_lock_library.h"
+#include "chrome/browser/chromeos/language_preferences.h"
#include "chrome/browser/chromeos/login/authenticator.h"
#include "chrome/browser/chromeos/login/background_view.h"
#include "chrome/browser/chromeos/login/login_utils.h"
@@ -33,6 +39,8 @@ namespace {
// otherwise chromium process fails and the session is terminated.
const int64 kRetryGrabIntervalMs = 500;
const int kGrabFailureLimit = 60;
+// Each keyboard layout has a dummy input method ID which starts with "xkb:".
+const char kValidInputMethodPrefix[] = "xkb:";
// Observer to start ScreenLocker when the screen lock
class ScreenLockObserver : public chromeos::ScreenLockLibrary::Observer,
@@ -56,10 +64,12 @@ class ScreenLockObserver : public chromeos::ScreenLockLibrary::Observer,
}
virtual void LockScreen(chromeos::ScreenLockLibrary* obj) {
+ SetupInputMethodsForScreenLocker();
chromeos::ScreenLocker::Show();
}
virtual void UnlockScreen(chromeos::ScreenLockLibrary* obj) {
+ RestoreInputMethods();
chromeos::ScreenLocker::Hide();
}
@@ -68,7 +78,64 @@ class ScreenLockObserver : public chromeos::ScreenLockLibrary::Observer,
}
private:
+ // Temporarily deactivates all input methods (e.g. Chinese, Japanese, Arabic)
+ // since they are not necessary to input a login password. Users are still
+ // able to use/switch active keyboard layouts (e.g. US qwerty, US dvorak,
+ // French).
+ void SetupInputMethodsForScreenLocker() {
+ if (chromeos::CrosLibrary::Get()->EnsureLoaded() &&
+ // The LockScreen function is also called when the OS is suspended, and
+ // in that case |saved_active_input_method_list_| might be non-empty.
+ saved_active_input_method_list_.empty()) {
+ chromeos::LanguageLibrary* language =
+ chromeos::CrosLibrary::Get()->GetLanguageLibrary();
+ saved_current_input_method_id_ = language->current_input_method().id;
+ // TODO(yusukes): save/restore previous input method ID.
+ scoped_ptr<chromeos::InputMethodDescriptors> active_input_method_list(
+ language->GetActiveInputMethods());
+
+ chromeos::ImeConfigValue value;
+ value.type = chromeos::ImeConfigValue::kValueTypeStringList;
+ for (size_t i = 0; i < active_input_method_list->size(); ++i) {
+ const std::string& input_method_id = active_input_method_list->at(i).id;
+ saved_active_input_method_list_.push_back(input_method_id);
+ // |active_input_method_list| contains both input method descriptions
+ // and keyboard layout descriptions.
+ if (!StartsWithASCII(input_method_id, kValidInputMethodPrefix, true))
+ continue;
+ value.string_list_value.push_back(input_method_id);
+ }
+ if (value.string_list_value.empty()) {
+ value.string_list_value.push_back(kFallbackInputMethodId); // US qwerty
+ }
+ language->SetImeConfig(chromeos::kGeneralSectionName,
+ chromeos::kPreloadEnginesConfigName,
+ value);
+ }
+ }
+
+ void RestoreInputMethods() {
+ if (chromeos::CrosLibrary::Get()->EnsureLoaded() &&
+ !saved_active_input_method_list_.empty()) {
+ chromeos::LanguageLibrary* language =
+ chromeos::CrosLibrary::Get()->GetLanguageLibrary();
+
+ chromeos::ImeConfigValue value;
+ value.type = chromeos::ImeConfigValue::kValueTypeStringList;
+ value.string_list_value = saved_active_input_method_list_;
+ language->SetImeConfig(chromeos::kGeneralSectionName,
+ chromeos::kPreloadEnginesConfigName,
+ value);
+ language->ChangeInputMethod(saved_current_input_method_id_);
+
+ saved_current_input_method_id_.clear();
+ saved_active_input_method_list_.clear();
+ }
+ }
+
NotificationRegistrar registrar_;
+ std::string saved_current_input_method_id_;
+ std::vector<std::string> saved_active_input_method_list_;
DISALLOW_COPY_AND_ASSIGN(ScreenLockObserver);
};
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698