Chromium Code Reviews| Index: chrome/browser/ui/omnibox/omnibox_edit_model.cc |
| diff --git a/chrome/browser/ui/omnibox/omnibox_edit_model.cc b/chrome/browser/ui/omnibox/omnibox_edit_model.cc |
| index 7850c5c213948e0cfce113dc0d5800ae9b77a71a..362422dd1f8a0752c0380558f6db5a05bd577642 100644 |
| --- a/chrome/browser/ui/omnibox/omnibox_edit_model.cc |
| +++ b/chrome/browser/ui/omnibox/omnibox_edit_model.cc |
| @@ -71,12 +71,12 @@ OmniboxEditModel::State::State(bool user_input_in_progress, |
| const string16& user_text, |
| const string16& keyword, |
| bool is_keyword_hint, |
| - bool is_caret_visible) |
| + OmniboxFocusState focus_state) |
| : user_input_in_progress(user_input_in_progress), |
| user_text(user_text), |
| keyword(keyword), |
| is_keyword_hint(is_keyword_hint), |
| - is_caret_visible(is_caret_visible) { |
| + focus_state(focus_state) { |
| } |
| OmniboxEditModel::State::~State() { |
| @@ -91,8 +91,7 @@ OmniboxEditModel::OmniboxEditModel(OmniboxView* view, |
| : view_(view), |
| popup_(NULL), |
| controller_(controller), |
| - has_focus_(false), |
| - is_caret_visible_(true), |
| + focus_state_(OMNIBOX_FOCUS_NONE), |
| user_input_in_progress_(false), |
| just_deleted_text_(false), |
| has_temporary_text_(false), |
| @@ -132,11 +131,11 @@ const OmniboxEditModel::State OmniboxEditModel::GetStateForTabSwitch() { |
| } |
| return State(user_input_in_progress_, user_text_, keyword_, is_keyword_hint_, |
| - is_caret_visible_); |
| + focus_state_); |
| } |
| void OmniboxEditModel::RestoreState(const State& state) { |
| - SetCaretVisibility(state.is_caret_visible); |
| + SetFocusState(state.focus_state, OMNIBOX_FOCUS_CHANGE_TAB_SWITCH); |
| // Restore any user editing. |
| if (state.user_input_in_progress) { |
| // NOTE: Be sure and set keyword-related state BEFORE invoking |
| @@ -161,7 +160,7 @@ bool OmniboxEditModel::UpdatePermanentText(const string16& new_permanent_text) { |
| // an edit and then abandoned it and clicked a link on the page.) |
| const bool visibly_changed_permanent_text = |
| (permanent_text_ != new_permanent_text) && |
| - (!user_input_in_progress_ || !has_focus_); |
| + (!user_input_in_progress_ || !has_focus()); |
| permanent_text_ = new_permanent_text; |
| return visibly_changed_permanent_text; |
| @@ -437,7 +436,7 @@ void OmniboxEditModel::Revert() { |
| has_temporary_text_ = false; |
| is_temporary_text_set_by_instant_ = false; |
| view_->SetWindowTextAndCaretPos(permanent_text_, |
| - has_focus_ ? permanent_text_.length() : 0, |
| + has_focus() ? permanent_text_.length() : 0, |
| false, true); |
| AutocompleteActionPredictor* action_predictor = |
| AutocompleteActionPredictorFactory::GetForProfile(profile_); |
| @@ -713,13 +712,12 @@ const AutocompleteResult& OmniboxEditModel::result() const { |
| } |
| void OmniboxEditModel::OnSetFocus(bool control_down) { |
| - has_focus_ = true; |
| + // If the omnibox lost focus while the caret was hidden and then regained |
| + // focus, OnSetFocus() is called and should restore visibility. Note that |
| + // focus can be regained without an accompanying call to |
| + // OmniboxView::SetFocus(), e.g. by tabbing in. |
| + SetFocusState(OMNIBOX_FOCUS_VISIBLE, OMNIBOX_FOCUS_CHANGE_EXPLICIT); |
| control_key_state_ = control_down ? DOWN_WITHOUT_CHANGE : UP; |
| - // Restore caret visibility whenever the user focuses back into the omnibox. |
| - SetCaretVisibility(true); |
| - |
| - if (InstantController* instant = controller_->GetInstant()) |
| - instant->OmniboxGotFocus(); |
| content::WebContents* web_contents = controller_->GetWebContents(); |
| if (web_contents) { |
| @@ -736,17 +734,22 @@ void OmniboxEditModel::OnSetFocus(bool control_down) { |
| } |
| void OmniboxEditModel::SetCaretVisibility(bool visible) { |
| - if (has_focus_ && visible != is_caret_visible_) { |
| - is_caret_visible_ = visible; |
| - view_->ApplyCaretVisibility(); |
| + // Caret visibility only matters if the omnibox has focus. |
| + if (focus_state_ != OMNIBOX_FOCUS_NONE) { |
| + SetFocusState(visible ? OMNIBOX_FOCUS_VISIBLE : OMNIBOX_FOCUS_INVISIBLE, |
|
Peter Kasting
2012/12/11 19:20:50
I wonder if maybe we should just nuke SetCaretVisi
samarth
2012/12/12 01:11:26
That seems like overpromising. We'd have to put a
|
| + OMNIBOX_FOCUS_CHANGE_EXPLICIT); |
| } |
| } |
| void OmniboxEditModel::OnWillKillFocus(gfx::NativeView view_gaining_focus) { |
| SetInstantSuggestion(InstantSuggestion()); |
| - if (InstantController* instant = controller_->GetInstant()) |
| - instant->OmniboxLostFocus(view_gaining_focus); |
| + InstantController* instant = controller_->GetInstant(); |
| + if (instant) { |
| + instant->OmniboxFocusChanged(OMNIBOX_FOCUS_NONE, |
| + OMNIBOX_FOCUS_CHANGE_EXPLICIT, |
| + view_gaining_focus); |
| + } |
| // TODO(jered): Rip this out along with StartZeroSuggest. |
| autocomplete_controller_->StopZeroSuggest(); |
| @@ -754,7 +757,10 @@ void OmniboxEditModel::OnWillKillFocus(gfx::NativeView view_gaining_focus) { |
| } |
| void OmniboxEditModel::OnKillFocus() { |
| - has_focus_ = false; |
| + // TODO(samarth): determine if it is safe to move the call to |
| + // OmniboxFocusChanged() from OnWillKillFocus() to here, which would let us |
| + // just call SetFocusState() to handle the state change. |
| + focus_state_ = OMNIBOX_FOCUS_NONE; |
| control_key_state_ = UP; |
| paste_state_ = NONE; |
| } |
| @@ -952,7 +958,7 @@ bool OmniboxEditModel::OnAfterPossibleChange(const string16& old_text, |
| // Restore caret visibility whenever the user changes text or selection in the |
| // omnibox. |
| if (text_differs || selection_differs) |
| - SetCaretVisibility(true); |
| + SetFocusState(OMNIBOX_FOCUS_VISIBLE, OMNIBOX_FOCUS_CHANGE_TYPING); |
| // Modifying the selection counts as accepting the autocompleted text. |
| const bool user_text_changed = |
| @@ -1014,7 +1020,8 @@ bool OmniboxEditModel::OnAfterPossibleChange(const string16& old_text, |
| } |
| void OmniboxEditModel::PopupBoundsChangedTo(const gfx::Rect& bounds) { |
| - if (InstantController* instant = controller_->GetInstant()) |
| + InstantController* instant = controller_->GetInstant(); |
| + if (instant) |
| instant->SetOmniboxBounds(bounds); |
| } |
| @@ -1063,7 +1070,8 @@ void OmniboxEditModel::OnResultChanged(bool default_match_changed) { |
| NotifySearchTabHelper(); |
| } |
| - if (InstantController* instant = controller_->GetInstant()) |
| + InstantController* instant = controller_->GetInstant(); |
| + if (instant) |
| instant->HandleAutocompleteResults(*autocomplete_controller_->providers()); |
| } |
| @@ -1288,3 +1296,21 @@ void OmniboxEditModel::ClassifyStringForPasteAndGo( |
| AutocompleteClassifierFactory::GetForProfile(profile_)->Classify(text, |
| string16(), false, false, match, alternate_nav_url); |
| } |
| + |
| +void OmniboxEditModel::SetFocusState(OmniboxFocusState state, |
| + OmniboxFocusChangeReason reason) { |
| + if (state == focus_state_) |
| + return; |
| + |
| + InstantController* instant = controller_->GetInstant(); |
| + if (instant) |
| + instant->OmniboxFocusChanged(state, reason, NULL); |
| + |
| + // Update state and notify view if the omnibox has focus and the caret |
| + // visibility changed. |
| + const bool was_caret_visible = is_caret_visible(); |
| + focus_state_ = state; |
| + if (focus_state_ != OMNIBOX_FOCUS_NONE && |
| + is_caret_visible() != was_caret_visible) |
| + view_->ApplyCaretVisibility(); |
| +} |