| Index: chrome/browser/ui/views/omnibox/omnibox_view_views.cc
|
| diff --git a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
|
| index 6add5dda5be118436629c2afa3534209146d6c72..07b278fc7bcb7ae7427da8c131b7192614f891ca 100644
|
| --- a/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
|
| +++ b/chrome/browser/ui/views/omnibox/omnibox_view_views.cc
|
| @@ -782,9 +782,9 @@ void OmniboxViewViews::OnBlur() {
|
| // at least call CloseOmniboxPopup(), so that if ZeroSuggest is in the
|
| // midst of running but hasn't yet opened the popup, it will be halted.
|
| // If we fully reverted in this case, we'd lose the cursor/highlight
|
| - // information saved above.
|
| - if (!model()->user_input_in_progress() && model()->popup_model()->IsOpen() &&
|
| - text() != model()->PermanentText())
|
| + // information saved above. Note: popup_model() can be null in tests.
|
| + if (!model()->user_input_in_progress() && model()->popup_model() &&
|
| + model()->popup_model()->IsOpen() && text() != model()->PermanentText())
|
| RevertAll();
|
| else
|
| CloseOmniboxPopup();
|
| @@ -792,17 +792,27 @@ void OmniboxViewViews::OnBlur() {
|
| // Tell the model to reset itself.
|
| model()->OnKillFocus();
|
|
|
| - // Make sure the beginning of the text is visible.
|
| - SelectRange(gfx::Range(0));
|
| -
|
| - GetRenderText()->SetElideBehavior(gfx::ELIDE_TAIL);
|
| + // When deselected, elide and reset scroll position. After eliding, the old
|
| + // scroll offset is meaningless (since the string is guaranteed to fit within
|
| + // the view). The scroll must be reset or the text may be rendered partly or
|
| + // wholly off-screen.
|
| + //
|
| + // Important: Since the URL can contain bidirectional text, it is important to
|
| + // set the display offset directly to 0 (not simply scroll to the start of the
|
| + // text, since the start of the text may not be at the left edge).
|
| + gfx::RenderText* render_text = GetRenderText();
|
| + render_text->SetElideBehavior(gfx::ELIDE_TAIL);
|
| + render_text->SetDisplayOffset(0);
|
|
|
| // Focus changes can affect the visibility of any keyword hint.
|
| - if (model()->is_keyword_hint())
|
| - location_bar_view_->Layout();
|
| + // |location_bar_view_| can be null in tests.
|
| + if (location_bar_view_) {
|
| + if (model()->is_keyword_hint())
|
| + location_bar_view_->Layout();
|
|
|
| - // The location bar needs to repaint without a focus ring.
|
| - location_bar_view_->SchedulePaint();
|
| + // The location bar needs to repaint without a focus ring.
|
| + location_bar_view_->SchedulePaint();
|
| + }
|
| }
|
|
|
| bool OmniboxViewViews::IsCommandIdEnabled(int command_id) const {
|
|
|