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

Unified Diff: chrome/browser/chromeos/input_method/input_method_manager_impl.cc

Issue 419293002: IME refactoring: ChromeOS introduce input methods State. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 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
Index: chrome/browser/chromeos/input_method/input_method_manager_impl.cc
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
index b89db86fbb9bd2782507aaddfeb76bb2da07a0db..54174be7f686965927e668fd69a04fd274b5eec7 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -6,6 +6,8 @@
#include <algorithm> // std::find
+#include <sstream>
+
#include "ash/ime/input_method_menu_item.h"
#include "ash/ime/input_method_menu_manager.h"
#include "base/basictypes.h"
@@ -56,13 +58,92 @@ bool InputMethodManagerImpl::MigrateInputMethods(
return util_.MigrateInputMethods(input_method_ids);
}
+InputMethodManagerImpl::State::State() {
+}
+
+InputMethodManagerImpl::State::~State() {
+}
+
+void InputMethodManagerImpl::State::InitFrom(const State& other) {
+ // debug_name is not copied.
+
+ previous_input_method_ = other.previous_input_method_;
+ current_input_method_ = other.current_input_method_;
+
+ active_input_method_ids_ = other.active_input_method_ids_;
+
+ saved_previous_input_method_ = other.saved_previous_input_method_;
+ saved_current_input_method_ = other.saved_current_input_method_;
+ saved_active_input_method_ids_ = other.saved_active_input_method_ids_;
+
+ pending_input_method_ = other.pending_input_method_;
+
+ // TODO: recreate all input engines?
+ // typedef std::map<std::string, InputMethodEngineInterface*> EngineMap;
+ engine_map_ = other.engine_map_;
+}
+
+std::string InputMethodManagerImpl::State::Dump() const {
+ std::ostringstream os;
+
+ os << "################# " << state_name << " #################\n";
+
+ os << "previous_input_method_: '"
+ << previous_input_method_.GetPreferredKeyboardLayout() << "'\n";
+ os << "current_input_method_: '"
+ << current_input_method_.GetPreferredKeyboardLayout() << "'\n";
+ os << "active_input_method_ids_ (size=" << active_input_method_ids_.size()
+ << "):";
+ for (size_t i = 0; i < active_input_method_ids_.size(); ++i) {
+ os << " '" << active_input_method_ids_[i] << "',";
+ }
+ os << "\n";
+ os << "saved_previous_input_method_: '"
+ << saved_previous_input_method_.GetPreferredKeyboardLayout() << "'\n";
+ os << "saved_current_input_method_: '"
+ << saved_current_input_method_.GetPreferredKeyboardLayout() << "'\n";
+ os << "saved_active_input_method_ids_ (size="
+ << saved_active_input_method_ids_.size() << "):";
+ for (size_t i = 0; i < saved_active_input_method_ids_.size(); ++i) {
+ os << " '" << saved_active_input_method_ids_[i] << "'\n";
+ }
+ os << "pending_input_method_: '" << pending_input_method_ << "'\n";
+ os << "engine_map_ (size=" << engine_map_.size() << "): ...\n ";
+
+ return os.str();
+}
+
+scoped_refptr<InputMethodManager::State> InputMethodManagerImpl::CreateNewState(
+ const std::string& debug_name) const {
+ scoped_refptr<InputMethodManagerImpl::State> new_state(
+ new InputMethodManagerImpl::State);
+ new_state->state_name = debug_name;
+
+ return scoped_refptr<InputMethodManager::State>(new_state.get());
+}
+
+void InputMethodManagerImpl::SetState(
Shu Chen 2014/08/04 14:55:23 I guess this is for fast user switching, correct?
Alexander Alekseev 2014/08/06 23:39:45 Yes, this was one of my concerns, when I've upload
Shu Chen 2014/08/07 15:40:19 I think enabled_extension_imes_ should not be shar
Alexander Alekseev 2014/08/07 17:26:19 But it is still shared. (I don't understand why.)
+ scoped_refptr<InputMethodManager::State> state) {
+ LOG(ERROR) << "InputMethodManagerImpl::SetState(): Called.";
+ LOG(ERROR) << "InputMethodManagerImpl::SetState(): old state_: "
+ << (state_ ? state_->Dump() : std::string("NULL"));
+ state_ = static_cast<InputMethodManagerImpl::State*>(state.get());
+ LOG(ERROR) << "InputMethodManagerImpl::SetState(): new state_: "
+ << (state_ ? state_->Dump() : std::string("NULL"));
+ if (state_->active_input_method_ids_.size()) {
+ ReconfigureIMFramework();
+ ChangeInputMethodInternal(state_->current_input_method_, false);
Shu Chen 2014/08/04 14:55:23 Is there particular reason of calling ChangeInputM
Alexander Alekseev 2014/08/06 23:39:45 The idea is that SetState should be lightweight, b
Shu Chen 2014/08/07 15:40:19 I think ReconfigureIMEFramework() is not heavy, be
Alexander Alekseev 2014/08/07 17:26:18 Extensions are not unloaded. From the extensions p
+ }
+}
+
InputMethodManagerImpl::InputMethodManagerImpl(
scoped_ptr<InputMethodDelegate> delegate)
: delegate_(delegate.Pass()),
- state_(STATE_LOGIN_SCREEN),
+ ui_state_(STATE_LOGIN_SCREEN),
util_(delegate_.get(), whitelist_.GetSupportedInputMethods()),
component_extension_ime_manager_(new ComponentExtensionIMEManager()),
weak_ptr_factory_(this) {
+ SetState(CreateNewState("default"));
}
InputMethodManagerImpl::~InputMethodManagerImpl() {
@@ -90,14 +171,14 @@ void InputMethodManagerImpl::RemoveCandidateWindowObserver(
candidate_window_observers_.RemoveObserver(observer);
}
-void InputMethodManagerImpl::SetState(State new_state) {
- const State old_state = state_;
- state_ = new_state;
- switch (state_) {
+void InputMethodManagerImpl::SetUIState(UIState new_ui_state) {
+ const UIState old_ui_state = ui_state_;
+ ui_state_ = new_ui_state;
+ switch (ui_state_) {
case STATE_LOGIN_SCREEN:
break;
case STATE_BROWSER_SCREEN:
- if (old_state == STATE_LOCK_SCREEN)
+ if (old_ui_state == STATE_LOCK_SCREEN)
OnScreenUnlocked();
break;
case STATE_LOCK_SCREEN:
@@ -123,8 +204,9 @@ InputMethodManagerImpl::GetActiveInputMethods() const {
scoped_ptr<InputMethodDescriptors> result(new InputMethodDescriptors);
// Build the active input method descriptors from the active input
// methods cache |active_input_method_ids_|.
- for (size_t i = 0; i < active_input_method_ids_.size(); ++i) {
- const std::string& input_method_id = active_input_method_ids_[i];
+ DCHECK(state_);
+ for (size_t i = 0; i < state_->active_input_method_ids_.size(); ++i) {
+ const std::string& input_method_id = state_->active_input_method_ids_[i];
const InputMethodDescriptor* descriptor =
util_.GetInputMethodDescriptorFromId(input_method_id);
if (descriptor) {
@@ -149,11 +231,13 @@ InputMethodManagerImpl::GetActiveInputMethods() const {
const std::vector<std::string>&
InputMethodManagerImpl::GetActiveInputMethodIds() const {
- return active_input_method_ids_;
+ DCHECK(state_);
+ return state_->active_input_method_ids_;
}
size_t InputMethodManagerImpl::GetNumActiveInputMethods() const {
- return active_input_method_ids_.size();
+ DCHECK(state_);
+ return state_->active_input_method_ids_.size();
}
const InputMethodDescriptor* InputMethodManagerImpl::GetInputMethodFromId(
@@ -172,8 +256,10 @@ const InputMethodDescriptor* InputMethodManagerImpl::GetInputMethodFromId(
void InputMethodManagerImpl::EnableLoginLayouts(
const std::string& language_code,
const std::vector<std::string>& initial_layouts) {
- if (state_ == STATE_TERMINATING)
+ if (ui_state_ == STATE_TERMINATING)
return;
+ LOG(ERROR) << "InputMethodManagerImpl::EnableLoginLayouts(): old state_: "
+ << state_->Dump();
// First, hardware keyboard layout should be shown.
std::vector<std::string> candidates =
@@ -217,12 +303,15 @@ void InputMethodManagerImpl::EnableLoginLayouts(
}
MigrateInputMethods(&layouts);
- active_input_method_ids_.swap(layouts);
+ DCHECK(state_);
+ state_->active_input_method_ids_.swap(layouts);
+ LOG(ERROR) << "InputMethodManagerImpl::EnableLoginLayouts(): new state_: "
+ << state_->Dump();
// Initialize candidate window controller and widgets such as
// candidate window, infolist and mode indicator. Note, mode
// indicator is used by only keyboard layout input methods.
- if (active_input_method_ids_.size() > 1)
+ if (state_->active_input_method_ids_.size() > 1)
MaybeInitializeCandidateWindowController();
// you can pass empty |initial_layout|.
@@ -258,7 +347,9 @@ void InputMethodManagerImpl::ReconfigureIMFramework() {
bool InputMethodManagerImpl::EnableInputMethod(
const std::string& input_method_id) {
- if (!EnableInputMethodImpl(input_method_id, &active_input_method_ids_))
+ DCHECK(state_);
+ if (!EnableInputMethodImpl(input_method_id,
+ &(state_->active_input_method_ids_)))
return false;
ReconfigureIMFramework();
@@ -267,8 +358,11 @@ bool InputMethodManagerImpl::EnableInputMethod(
bool InputMethodManagerImpl::ReplaceEnabledInputMethods(
const std::vector<std::string>& new_active_input_method_ids) {
- if (state_ == STATE_TERMINATING)
+ if (ui_state_ == STATE_TERMINATING)
return false;
+ LOG(ERROR)
+ << "InputMethodManagerImpl::ReplaceEnabledInputMethods(): old state_: "
+ << state_->Dump();
// Filter unknown or obsolete IDs.
std::vector<std::string> new_active_input_method_ids_filtered;
@@ -284,31 +378,51 @@ bool InputMethodManagerImpl::ReplaceEnabledInputMethods(
// Copy extension IDs to |new_active_input_method_ids_filtered|. We have to
// keep relative order of the extension input method IDs.
- for (size_t i = 0; i < active_input_method_ids_.size(); ++i) {
- const std::string& input_method_id = active_input_method_ids_[i];
+ DCHECK(state_);
+ for (size_t i = 0; i < state_->active_input_method_ids_.size(); ++i) {
+ const std::string& input_method_id = state_->active_input_method_ids_[i];
if (extension_ime_util::IsExtensionIME(input_method_id))
new_active_input_method_ids_filtered.push_back(input_method_id);
}
- active_input_method_ids_.swap(new_active_input_method_ids_filtered);
- MigrateInputMethods(&active_input_method_ids_);
+ state_->active_input_method_ids_.swap(new_active_input_method_ids_filtered);
+ MigrateInputMethods(&(state_->active_input_method_ids_));
+ LOG(ERROR)
+ << "InputMethodManagerImpl::ReplaceEnabledInputMethods(): new state_: "
+ << state_->Dump();
ReconfigureIMFramework();
// If |current_input_method| is no longer in |active_input_method_ids_|,
// ChangeInputMethod() picks the first one in |active_input_method_ids_|.
- ChangeInputMethod(current_input_method_.id());
+ ChangeInputMethod(state_->current_input_method_.id());
return true;
}
void InputMethodManagerImpl::ChangeInputMethod(
const std::string& input_method_id) {
- ChangeInputMethodInternal(input_method_id, false);
+ LookupAndChangeInputMethodInternal(input_method_id, false);
}
-bool InputMethodManagerImpl::ChangeInputMethodInternal(
+void InputMethodManagerImpl::ChangeInputMethodInternal(
+ const InputMethodDescriptor& descriptor,
+ bool show_message) {
+ // Change the keyboard layout to a preferred layout for the input method.
+ if (!keyboard_->SetCurrentKeyboardLayoutByName(
+ descriptor.GetPreferredKeyboardLayout())) {
+ LOG(ERROR) << "Failed to change keyboard layout to "
+ << descriptor.GetPreferredKeyboardLayout();
+ }
+
+ // Update input method indicators (e.g. "US", "DV") in Chrome windows.
+ FOR_EACH_OBSERVER(InputMethodManager::Observer,
+ observers_,
+ InputMethodChanged(this, show_message));
+}
+
+bool InputMethodManagerImpl::LookupAndChangeInputMethodInternal(
Shu Chen 2014/08/04 14:55:23 looks like the bool return value never gets used.
Alexander Alekseev 2014/08/06 23:39:45 Done.
const std::string& input_method_id,
bool show_message) {
- if (state_ == STATE_TERMINATING)
+ if (ui_state_ == STATE_TERMINATING)
return false;
std::string input_method_id_to_switch = input_method_id;
@@ -331,10 +445,10 @@ bool InputMethodManagerImpl::ChangeInputMethodInternal(
// component extension ime manager. ChangeInputMethod will be
// called with |pending_input_method_| when the initialization is
// done.
- pending_input_method_ = input_method_id_to_switch;
+ state_->pending_input_method_ = input_method_id_to_switch;
return false;
}
- pending_input_method_.clear();
+ state_->pending_input_method_.clear();
// Hide candidate window and info list.
if (candidate_window_controller_.get())
@@ -353,7 +467,7 @@ bool InputMethodManagerImpl::ChangeInputMethodInternal(
IMEBridge::Get()->SetCurrentEngineHandler(NULL);
} else {
IMEEngineHandlerInterface* next_engine =
- profile_engine_map_[GetProfile()][input_method_id_to_switch];
+ state_->engine_map_[input_method_id_to_switch];
if (next_engine) {
IMEBridge::Get()->SetCurrentEngineHandler(next_engine);
next_engine->Enable();
@@ -362,7 +476,7 @@ bool InputMethodManagerImpl::ChangeInputMethodInternal(
// TODO(komatsu): Check if it is necessary to perform the above routine
// when the current input method is equal to |input_method_id_to_swich|.
- if (current_input_method_.id() != input_method_id_to_switch) {
+ if (state_->current_input_method_.id() != input_method_id_to_switch) {
// Clear property list. Property list would be updated by
// extension IMEs via InputMethodEngine::(Set|Update)MenuItems.
// If the current input method is a keyboard layout, empty
@@ -386,21 +500,11 @@ bool InputMethodManagerImpl::ChangeInputMethodInternal(
}
DCHECK(descriptor);
- previous_input_method_ = current_input_method_;
- current_input_method_ = *descriptor;
- }
-
- // Change the keyboard layout to a preferred layout for the input method.
- if (!keyboard_->SetCurrentKeyboardLayoutByName(
- current_input_method_.GetPreferredKeyboardLayout())) {
- LOG(ERROR) << "Failed to change keyboard layout to "
- << current_input_method_.GetPreferredKeyboardLayout();
+ state_->previous_input_method_ = state_->current_input_method_;
+ state_->current_input_method_ = *descriptor;
}
- // Update input method indicators (e.g. "US", "DV") in Chrome windows.
- FOR_EACH_OBSERVER(InputMethodManager::Observer,
- observers_,
- InputMethodChanged(this, show_message));
+ ChangeInputMethodInternal(state_->current_input_method_, show_message);
return true;
}
@@ -432,31 +536,39 @@ void InputMethodManagerImpl::OnComponentExtensionInitialized(
LoadNecessaryComponentExtensions();
- if (!pending_input_method_.empty())
- ChangeInputMethodInternal(pending_input_method_, false);
+ DCHECK(state_);
+ if (!state_->pending_input_method_.empty())
+ LookupAndChangeInputMethodInternal(state_->pending_input_method_, false);
}
void InputMethodManagerImpl::LoadNecessaryComponentExtensions() {
if (!component_extension_ime_manager_->IsInitialized())
return;
+ LOG(ERROR) << "InputMethodManagerImpl::LoadNecessaryComponentExtensions(): "
+ "old state_: " << state_->Dump();
// Load component extensions but also update |active_input_method_ids_| as
// some component extension IMEs may have been removed from the Chrome OS
// image. If specified component extension IME no longer exists, falling back
// to an existing IME.
+ DCHECK(state_);
std::vector<std::string> unfiltered_input_method_ids;
- unfiltered_input_method_ids.swap(active_input_method_ids_);
+ unfiltered_input_method_ids.swap(state_->active_input_method_ids_);
for (size_t i = 0; i < unfiltered_input_method_ids.size(); ++i) {
if (!extension_ime_util::IsComponentExtensionIME(
unfiltered_input_method_ids[i])) {
// Legacy IMEs or xkb layouts are alwayes active.
- active_input_method_ids_.push_back(unfiltered_input_method_ids[i]);
+ state_->active_input_method_ids_.push_back(
+ unfiltered_input_method_ids[i]);
} else if (component_extension_ime_manager_->IsWhitelisted(
unfiltered_input_method_ids[i])) {
component_extension_ime_manager_->LoadComponentExtensionIME(
unfiltered_input_method_ids[i]);
- active_input_method_ids_.push_back(unfiltered_input_method_ids[i]);
+ state_->active_input_method_ids_.push_back(
+ unfiltered_input_method_ids[i]);
}
}
+ LOG(ERROR) << "InputMethodManagerImpl::LoadNecessaryComponentExtensions(): "
+ "new state_: " << state_->Dump();
// TODO(shuchen): move this call in ComponentExtensionIMEManager.
component_extension_ime_manager_->NotifyInitialized();
}
@@ -480,14 +592,18 @@ void InputMethodManagerImpl::ActivateInputMethodMenuItem(
void InputMethodManagerImpl::AddInputMethodExtension(
const std::string& id,
InputMethodEngineInterface* engine) {
- if (state_ == STATE_TERMINATING)
+ if (ui_state_ == STATE_TERMINATING)
return;
+ LOG(ERROR)
+ << "InputMethodManagerImpl::AddInputMethodExtension(): old state_: "
+ << state_->Dump();
DCHECK(engine);
+ DCHECK(state_);
- profile_engine_map_[GetProfile()][id] = engine;
+ state_->engine_map_[id] = engine;
Shu Chen 2014/08/04 14:55:23 I think this will break something. GetProfile() is
Alexander Alekseev 2014/08/06 23:39:45 state_ is per-user, so this would never happen. I
- if (id == current_input_method_.id()) {
+ if (id == state_->current_input_method_.id()) {
IMEBridge::Get()->SetCurrentEngineHandler(engine);
engine->Enable();
}
@@ -502,8 +618,11 @@ void InputMethodManagerImpl::AddInputMethodExtension(
extra_input_methods_[id] = descriptor;
if (Contains(enabled_extension_imes_, id)) {
- if (!Contains(active_input_method_ids_, id)) {
- active_input_method_ids_.push_back(id);
+ if (!Contains(state_->active_input_method_ids_, id)) {
+ state_->active_input_method_ids_.push_back(id);
+ LOG(ERROR)
+ << "InputMethodManagerImpl::AddInputMethodExtension(): new state_: "
+ << state_->Dump();
} else {
DVLOG(1) << "AddInputMethodExtension: alread added: "
<< id << ", " << descriptor.name();
@@ -517,23 +636,29 @@ void InputMethodManagerImpl::AddInputMethodExtension(
void InputMethodManagerImpl::RemoveInputMethodExtension(const std::string& id) {
if (!extension_ime_util::IsExtensionIME(id))
DVLOG(1) << id << " is not a valid extension input method ID.";
-
- std::vector<std::string>::iterator i = std::find(
- active_input_method_ids_.begin(), active_input_method_ids_.end(), id);
- if (i != active_input_method_ids_.end())
- active_input_method_ids_.erase(i);
+ LOG(ERROR) << "InputMethodManagerImpl::RemoveInputMethodExtension('" << id
+ << "'): old state_: " << state_->Dump();
+
+ DCHECK(state_);
+ std::vector<std::string>::iterator i =
+ std::find(state_->active_input_method_ids_.begin(),
+ state_->active_input_method_ids_.end(),
+ id);
+ if (i != state_->active_input_method_ids_.end())
+ state_->active_input_method_ids_.erase(i);
extra_input_methods_.erase(id);
- EngineMap& engine_map = profile_engine_map_[GetProfile()];
- if (IMEBridge::Get()->GetCurrentEngineHandler() == engine_map[id])
+ if (IMEBridge::Get()->GetCurrentEngineHandler() == state_->engine_map_[id])
IMEBridge::Get()->SetCurrentEngineHandler(NULL);
- engine_map.erase(id);
+ state_->engine_map_.erase(id);
+ LOG(ERROR) << "InputMethodManagerImpl::RemoveInputMethodExtension('" << id
+ << "'): new state_: " << state_->Dump();
// No need to switch input method when terminating.
- if (state_ != STATE_TERMINATING) {
+ if (ui_state_ != STATE_TERMINATING) {
// If |current_input_method| is no longer in |active_input_method_ids_|,
// switch to the first one in |active_input_method_ids_|.
- ChangeInputMethod(current_input_method_.id());
+ ChangeInputMethod(state_->current_input_method_.id());
}
}
@@ -555,6 +680,9 @@ void InputMethodManagerImpl::SetEnabledExtensionImes(
enabled_extension_imes_.insert(enabled_extension_imes_.end(),
ids->begin(),
ids->end());
+ LOG(ERROR)
+ << "InputMethodManagerImpl::SetEnabledExtensionImes(): old state_: "
+ << state_->Dump();
bool active_imes_changed = false;
@@ -564,29 +692,34 @@ void InputMethodManagerImpl::SetEnabledExtensionImes(
if (extension_ime_util::IsComponentExtensionIME(
extra_iter->first))
continue; // Do not filter component extension.
- std::vector<std::string>::iterator active_iter = std::find(
- active_input_method_ids_.begin(), active_input_method_ids_.end(),
- extra_iter->first);
+ DCHECK(state_);
+ std::vector<std::string>::iterator active_iter =
+ std::find(state_->active_input_method_ids_.begin(),
+ state_->active_input_method_ids_.end(),
+ extra_iter->first);
- bool active = active_iter != active_input_method_ids_.end();
+ bool active = active_iter != state_->active_input_method_ids_.end();
bool enabled = Contains(enabled_extension_imes_, extra_iter->first);
if (active && !enabled)
- active_input_method_ids_.erase(active_iter);
+ state_->active_input_method_ids_.erase(active_iter);
if (!active && enabled)
- active_input_method_ids_.push_back(extra_iter->first);
+ state_->active_input_method_ids_.push_back(extra_iter->first);
if (active == !enabled)
active_imes_changed = true;
}
+ LOG(ERROR)
+ << "InputMethodManagerImpl::SetEnabledExtensionImes(): new state_: "
+ << state_->Dump();
if (active_imes_changed) {
MaybeInitializeCandidateWindowController();
// If |current_input_method| is no longer in |active_input_method_ids_|,
// switch to the first one in |active_input_method_ids_|.
- ChangeInputMethod(current_input_method_.id());
+ ChangeInputMethod(state_->current_input_method_.id());
}
}
@@ -653,65 +786,69 @@ void InputMethodManagerImpl::SetInputMethodLoginDefault() {
}
bool InputMethodManagerImpl::SwitchToNextInputMethod() {
+ DCHECK(state_);
// Sanity checks.
- if (active_input_method_ids_.empty()) {
+ if (state_->active_input_method_ids_.empty()) {
DVLOG(1) << "active input method is empty";
return false;
}
- if (current_input_method_.id().empty()) {
+ if (state_->current_input_method_.id().empty()) {
DVLOG(1) << "current_input_method_ is unknown";
return false;
}
// Do not consume key event if there is only one input method is enabled.
// Ctrl+Space or Alt+Shift may be used by other application.
- if (active_input_method_ids_.size() == 1)
+ if (state_->active_input_method_ids_.size() == 1)
return false;
// Find the next input method and switch to it.
- SwitchToNextInputMethodInternal(active_input_method_ids_,
- current_input_method_.id());
+ SwitchToNextInputMethodInternal(state_->active_input_method_ids_,
+ state_->current_input_method_.id());
return true;
}
bool InputMethodManagerImpl::SwitchToPreviousInputMethod(
const ui::Accelerator& accelerator) {
+ DCHECK(state_);
// Sanity check.
- if (active_input_method_ids_.empty()) {
+ if (state_->active_input_method_ids_.empty()) {
DVLOG(1) << "active input method is empty";
return false;
}
// Do not consume key event if there is only one input method is enabled.
// Ctrl+Space or Alt+Shift may be used by other application.
- if (active_input_method_ids_.size() == 1)
+ if (state_->active_input_method_ids_.size() == 1)
return false;
if (accelerator.type() == ui::ET_KEY_RELEASED)
return true;
- if (previous_input_method_.id().empty() ||
- previous_input_method_.id() == current_input_method_.id()) {
+ if (state_->previous_input_method_.id().empty() ||
+ state_->previous_input_method_.id() ==
+ state_->current_input_method_.id()) {
return SwitchToNextInputMethod();
}
std::vector<std::string>::const_iterator iter =
- std::find(active_input_method_ids_.begin(),
- active_input_method_ids_.end(),
- previous_input_method_.id());
- if (iter == active_input_method_ids_.end()) {
+ std::find(state_->active_input_method_ids_.begin(),
+ state_->active_input_method_ids_.end(),
+ state_->previous_input_method_.id());
+ if (iter == state_->active_input_method_ids_.end()) {
// previous_input_method_ is not supported.
return SwitchToNextInputMethod();
}
- ChangeInputMethodInternal(*iter, true);
+ LookupAndChangeInputMethodInternal(*iter, true);
return true;
}
bool InputMethodManagerImpl::SwitchInputMethod(
const ui::Accelerator& accelerator) {
+ DCHECK(state_);
// Sanity check.
- if (active_input_method_ids_.empty()) {
+ if (state_->active_input_method_ids_.empty()) {
DVLOG(1) << "active input method is empty";
return false;
}
@@ -750,7 +887,7 @@ bool InputMethodManagerImpl::SwitchInputMethod(
std::vector<std::string> ids;
for (size_t i = 0; i < input_method_ids_to_switch.size(); ++i) {
const std::string& id = input_method_ids_to_switch[i];
- if (Contains(active_input_method_ids_, id))
+ if (Contains(state_->active_input_method_ids_, id))
ids.push_back(id);
}
if (ids.empty()) {
@@ -759,7 +896,7 @@ bool InputMethodManagerImpl::SwitchInputMethod(
return false;
}
- SwitchToNextInputMethodInternal(ids, current_input_method_.id());
+ SwitchToNextInputMethodInternal(ids, state_->current_input_method_.id());
return true; // consume the accelerator.
}
@@ -774,14 +911,15 @@ void InputMethodManagerImpl::SwitchToNextInputMethodInternal(
++iter;
if (iter == input_method_ids.end())
iter = input_method_ids.begin();
- ChangeInputMethodInternal(*iter, true);
+ LookupAndChangeInputMethodInternal(*iter, true);
}
InputMethodDescriptor InputMethodManagerImpl::GetCurrentInputMethod() const {
- if (current_input_method_.id().empty())
+ DCHECK(state_);
+ if (state_->current_input_method_.id().empty())
return InputMethodUtil::GetFallbackInputMethodDescriptor();
- return current_input_method_;
+ return state_->current_input_method_;
}
bool InputMethodManagerImpl::IsISOLevel5ShiftUsedByCurrentInputMethod() const {
@@ -867,24 +1005,28 @@ void InputMethodManagerImpl::CandidateWindowClosed() {
}
void InputMethodManagerImpl::OnScreenLocked() {
- saved_previous_input_method_ = previous_input_method_;
- saved_current_input_method_ = current_input_method_;
- saved_active_input_method_ids_ = active_input_method_ids_;
+ DCHECK(state_);
+ LOG(ERROR) << "InputMethodManagerImpl::OnScreenLocked(): old state_: "
+ << state_->Dump();
+ state_->saved_previous_input_method_ = state_->previous_input_method_;
+ state_->saved_current_input_method_ = state_->current_input_method_;
+ state_->saved_active_input_method_ids_ = state_->active_input_method_ids_;
std::set<std::string> added_ids_;
const std::vector<std::string>& hardware_keyboard_ids =
util_.GetHardwareLoginInputMethodIds();
- active_input_method_ids_.clear();
- for (size_t i = 0; i < saved_active_input_method_ids_.size(); ++i) {
- const std::string& input_method_id = saved_active_input_method_ids_[i];
+ state_->active_input_method_ids_.clear();
+ for (size_t i = 0; i < state_->saved_active_input_method_ids_.size(); ++i) {
+ const std::string& input_method_id =
+ state_->saved_active_input_method_ids_[i];
// Skip if it's not a keyboard layout. Drop input methods including
// extension ones.
if (!IsLoginKeyboard(input_method_id) ||
added_ids_.find(input_method_id) != added_ids_.end())
continue;
- active_input_method_ids_.push_back(input_method_id);
+ state_->active_input_method_ids_.push_back(input_method_id);
added_ids_.insert(input_method_id);
}
@@ -893,25 +1035,32 @@ void InputMethodManagerImpl::OnScreenLocked() {
// keyboard on the screen locker.
for (size_t i = 0; i < hardware_keyboard_ids.size(); ++i) {
if (added_ids_.find(hardware_keyboard_ids[i]) == added_ids_.end()) {
- active_input_method_ids_.push_back(hardware_keyboard_ids[i]);
+ state_->active_input_method_ids_.push_back(hardware_keyboard_ids[i]);
added_ids_.insert(hardware_keyboard_ids[i]);
}
}
- ChangeInputMethod(current_input_method_.id());
+ LOG(ERROR) << "InputMethodManagerImpl::OnScreenLocked(): new state_: "
+ << state_->Dump();
+ ChangeInputMethod(state_->current_input_method_.id());
}
void InputMethodManagerImpl::OnScreenUnlocked() {
- previous_input_method_ = saved_previous_input_method_;
- current_input_method_ = saved_current_input_method_;
- active_input_method_ids_ = saved_active_input_method_ids_;
-
- ChangeInputMethod(current_input_method_.id());
+ LOG(ERROR) << "InputMethodManagerImpl::OnScreenUnLocked(): old state_: "
+ << state_->Dump();
+ state_->previous_input_method_ = state_->saved_previous_input_method_;
+ state_->current_input_method_ = state_->saved_current_input_method_;
+ state_->active_input_method_ids_ = state_->saved_active_input_method_ids_;
+
+ LOG(ERROR) << "InputMethodManagerImpl::OnScreenUnLocked(): new state_: "
+ << state_->Dump();
+ ChangeInputMethod(state_->current_input_method_.id());
}
bool InputMethodManagerImpl::InputMethodIsActivated(
const std::string& input_method_id) {
- return Contains(active_input_method_ids_, input_method_id);
+ DCHECK(state_);
+ return Contains(state_->active_input_method_ids_, input_method_id);
}
void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() {
@@ -923,9 +1072,5 @@ void InputMethodManagerImpl::MaybeInitializeCandidateWindowController() {
candidate_window_controller_->AddObserver(this);
}
-Profile* InputMethodManagerImpl::GetProfile() const {
- return ProfileManager::GetActiveUserProfile();
-}
-
} // namespace input_method
} // namespace chromeos

Powered by Google App Engine
This is Rietveld 408576698