Chromium Code Reviews| Index: chrome/browser/ui/views/location_bar/location_bar_view.cc |
| diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
| index df73e4c8b9699a93eb0a1de6b608df224339c5f2..702d67d88b61a56209cf93a8039d84674f375ca3 100644 |
| --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc |
| +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc |
| @@ -11,6 +11,7 @@ |
| #include "base/i18n/rtl.h" |
| #include "base/prefs/pref_service.h" |
| #include "base/stl_util.h" |
| +#include "base/strings/string_split.h" |
| #include "base/strings/utf_string_conversions.h" |
| #include "chrome/app/chrome_command_ids.h" |
| #include "chrome/browser/chrome_notification_types.h" |
| @@ -39,6 +40,7 @@ |
| #include "chrome/browser/ui/omnibox/omnibox_popup_view.h" |
| #include "chrome/browser/ui/passwords/manage_passwords_bubble_ui_controller.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| +#include "chrome/browser/ui/toolbar/origin_chip_info.h" |
| #include "chrome/browser/ui/view_ids.h" |
| #include "chrome/browser/ui/views/bookmarks/bookmark_prompt_view.h" |
| #include "chrome/browser/ui/views/browser_dialogs.h" |
| @@ -78,6 +80,7 @@ |
| #include "ui/base/resource/resource_bundle.h" |
| #include "ui/base/theme_provider.h" |
| #include "ui/events/event.h" |
| +#include "ui/gfx/animation/slide_animation.h" |
| #include "ui/gfx/canvas.h" |
| #include "ui/gfx/color_utils.h" |
| #include "ui/gfx/image/image.h" |
| @@ -220,6 +223,7 @@ LocationBarView::LocationBarView(Browser* browser, |
| show_focus_rect_(false), |
| template_url_service_(NULL), |
| animation_offset_(0), |
| + animated_host_label_(NULL), |
| weak_ptr_factory_(this) { |
| edit_bookmarks_enabled_.Init( |
| prefs::kEditBookmarksEnabled, profile->GetPrefs(), |
| @@ -317,6 +321,10 @@ void LocationBarView::Init() { |
| ime_inline_autocomplete_view_->SetVisible(false); |
| AddChildView(ime_inline_autocomplete_view_); |
| + animated_host_label_ = new views::Label(base::string16(), font_list); |
| + animated_host_label_->SetVisible(false); |
| + AddChildView(animated_host_label_); |
| + |
| origin_chip_view_ = new OriginChipView(this, profile(), font_list); |
| origin_chip_view_->Init(); |
| origin_chip_view_->SetFocusable(false); |
| @@ -423,6 +431,14 @@ void LocationBarView::Init() { |
| search_button_->SetVisible(false); |
| AddChildView(search_button_); |
| + show_url_animation_.reset(new gfx::SlideAnimation(this)); |
| + show_url_animation_->SetTweenType(gfx::Tween::FAST_OUT_SLOW_IN); |
| + show_url_animation_->SetSlideDuration(200); |
| + |
| + hide_url_animation_.reset(new gfx::SlideAnimation(this)); |
| + hide_url_animation_->SetTweenType(gfx::Tween::FAST_OUT_SLOW_IN); |
| + hide_url_animation_->SetSlideDuration(200); |
| + |
| content::Source<Profile> profile_source = content::Source<Profile>(profile()); |
| registrar_.Add(this, |
| chrome::NOTIFICATION_EXTENSION_LOCATION_BAR_UPDATED, |
| @@ -706,6 +722,7 @@ void LocationBarView::Layout() { |
| if (!IsInitialized()) |
| return; |
| + animated_host_label_->SetVisible(false); |
| origin_chip_view_->SetVisible(origin_chip_view_->ShouldShow()); |
| selected_keyword_view_->SetVisible(false); |
| location_icon_view_->SetVisible(false); |
| @@ -721,6 +738,47 @@ void LocationBarView::Layout() { |
| LocationBarLayout trailing_decorations(LocationBarLayout::RIGHT_EDGE, |
| item_padding); |
| + // Show and position the animated host label used in the show and hide URL |
| + // animations. |
| + if (show_url_animation_->is_animating() || |
| + hide_url_animation_->is_animating()) { |
| + const GURL url = GetWebContents()->GetURL(); |
| + const base::string16 host = |
| + OriginChip::LabelFromURLForProfile(url, profile()); |
| + animated_host_label_->SetText(host); |
| + |
| + const base::string16 formatted_url = GetToolbarModel()->GetFormattedURL(); |
| + |
| + // Split the formatted URL on the host name in order to determine the size |
| + // of the text leading up to it. |
| + std::vector<base::string16> substrings; |
| + base::SplitStringUsingSubstr(formatted_url, host, &substrings); |
|
Peter Kasting
2014/03/21 21:22:10
Does this do the right thing for, say, an intranet
Justin Donnelly
2014/03/24 22:59:37
Good point. There are other issues like a hostname
|
| + const base::string16 text_leading_host = substrings[0]; |
| + |
| + gfx::FontList font_list = origin_chip_view_->GetFontList(); |
| + int w = std::numeric_limits<int>::max(); |
| + int h = font_list.GetHeight(); |
| + gfx::Canvas::SizeStringInt(text_leading_host, font_list, &w, &h, 0, 0); |
|
Peter Kasting
2014/03/21 21:22:10
Do you just want GetStringWidth() here?
Justin Donnelly
2014/03/24 22:59:37
Oh, cool, didn't see that method. Done.
|
| + |
| + const int position_of_host_name_in_chip = |
| + origin_chip_view_->LabelPosition(); |
| + const int postition_of_host_name_in_url = position_of_host_name_in_chip + w; |
| + |
| + int host_label_x = position_of_host_name_in_chip; |
| + if (show_url_animation_->is_animating()) { |
| + host_label_x = show_url_animation_-> |
| + CurrentValueBetween(position_of_host_name_in_chip, |
| + postition_of_host_name_in_url); |
| + } else if (hide_url_animation_->is_animating()) { |
| + host_label_x = hide_url_animation_-> |
| + CurrentValueBetween(postition_of_host_name_in_url, |
| + position_of_host_name_in_chip); |
| + } |
| + animated_host_label_->SetBounds(host_label_x, 0, |
| + animated_host_label_->GetPreferredSize().width(), height()); |
|
Peter Kasting
2014/03/21 21:22:10
Nit: All lines of args should begin at the same ho
Justin Donnelly
2014/03/24 22:59:37
Done.
|
| + animated_host_label_->SetVisible(true); |
| + } |
| + |
| const int origin_chip_width = origin_chip_view_->visible() ? |
| origin_chip_view_->GetPreferredSize().width() : 0; |
| origin_chip_view_->SetBounds(0, 0, origin_chip_width, height()); |
| @@ -1099,6 +1157,49 @@ void LocationBarView::OnSetFocus() { |
| GetFocusManager()->SetFocusedView(this); |
| } |
| +void LocationBarView::ShowURL() { |
| + omnibox_view_->SetVisible(false); |
| + omnibox_view_->ShowURL(); |
| + show_url_animation_->Show(); |
| +} |
| + |
| +void LocationBarView::OnShowURLAnimationEnded() { |
| + animated_host_label_->SetVisible(false); |
| + omnibox_view_->SetVisible(true); |
| + omnibox_view_->FadeIn(); |
| + omnibox_view_->SetFocus(); |
| +} |
| + |
| +void LocationBarView::HideURLAndShowOriginChip() { |
| + omnibox_view_->SetVisible(false); |
| + hide_url_animation_->Show(); |
| +} |
| + |
| +void LocationBarView::OnHideURLAnimationEnded() { |
| + animated_host_label_->SetVisible(false); |
| + omnibox_view_->HideURL(); |
| + omnibox_view_->SetVisible(true); |
| + origin_chip_view_->FadeIn(); |
| +} |
| + |
| +void LocationBarView::AnimationProgressed(const gfx::Animation* animation) { |
| + if (animation == show_url_animation_.get() || |
| + animation == hide_url_animation_.get()) { |
| + Layout(); |
| + SchedulePaint(); |
| + } |
| +} |
| + |
| +void LocationBarView::AnimationEnded(const gfx::Animation* animation) { |
| + if (animation == show_url_animation_.get()) { |
| + show_url_animation_->Reset(); |
| + OnShowURLAnimationEnded(); |
| + } else if (animation == hide_url_animation_.get()) { |
| + hide_url_animation_->Reset(); |
| + OnHideURLAnimationEnded(); |
| + } |
| +} |
| + |
| InstantController* LocationBarView::GetInstant() { |
| return delegate_->GetInstant(); |
| } |