blob: d5461da92f0d9934c8342040e2f3c7caa6270de4 [file] [log] [blame]
// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/location_bar/custom_tab_bar_view.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/layout_constants.h"
#include "chrome/browser/ui/omnibox/omnibox_theme.h"
#include "chrome/browser/ui/page_info/page_info_dialog.h"
#include "chrome/browser/ui/views/chrome_typography.h"
#include "components/url_formatter/url_formatter.h"
#include "content/public/browser/navigation_entry.h"
#include "ui/gfx/color_palette.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/views/background.h"
#include "ui/views/border.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/style/typography.h"
#include "ui/views/style/typography_provider.h"
// Container view for laying out and rendering the title/origin of the current
// page.
class CustomTabBarTitleOriginView : public views::View {
public:
CustomTabBarTitleOriginView() {
title_label_ = new views::Label(
base::string16(), views::style::TextContext::CONTEXT_DIALOG_TITLE);
location_label_ = new views::Label(base::string16());
constexpr SkColor text_color = gfx::kGoogleGrey900;
title_label_->SetEnabledColor(text_color);
location_label_->SetEnabledColor(text_color);
AddChildView(title_label_);
AddChildView(location_label_);
auto layout = std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kVertical, gfx::Insets(), 0);
layout->set_cross_axis_alignment(
views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_START);
SetLayoutManager(std::move(layout));
}
void Update(base::string16 title, base::string16 location) {
title_label_->SetText(title);
location_label_->SetText(location);
}
private:
views::Label* title_label_;
views::Label* location_label_;
};
// static
const char CustomTabBarView::kViewClassName[] = "CustomTabBarView";
CustomTabBarView::CustomTabBarView(Browser* browser,
LocationBarView::Delegate* delegate)
: TabStripModelObserver(), delegate_(delegate) {
constexpr SkColor background_color = SK_ColorWHITE;
SetBackground(views::CreateSolidBackground(background_color));
browser->tab_strip_model()->AddObserver(this);
const gfx::FontList& font_list = views::style::GetFont(
CONTEXT_OMNIBOX_PRIMARY, views::style::STYLE_PRIMARY);
location_icon_view_ = new LocationIconView(font_list, this);
AddChildView(location_icon_view_);
title_origin_view_ = new CustomTabBarTitleOriginView();
AddChildView(title_origin_view_);
int padding = GetLayoutConstant(LayoutConstant::LOCATION_BAR_ELEMENT_PADDING);
// The location icon already has some padding, so we subtract it from the
// padding we're going to apply.
int location_icon_padding =
GetLayoutInsets(LayoutInset::LOCATION_BAR_ICON_INTERIOR_PADDING).left();
gfx::Insets insets(padding, padding - location_icon_padding, padding,
padding);
auto layout = std::make_unique<views::BoxLayout>(
views::BoxLayout::Orientation::kHorizontal, insets, 0);
layout->set_cross_axis_alignment(
views::BoxLayout::CrossAxisAlignment::CROSS_AXIS_ALIGNMENT_CENTER);
SetLayoutManager(std::move(layout));
constexpr SkColor border_color = gfx::kGoogleGrey400;
// Create a bottom border.
SetBorder(views::CreateSolidSidedBorder(0, 0, 1, 0, border_color));
}
CustomTabBarView::~CustomTabBarView() {}
void CustomTabBarView::TabChangedAt(content::WebContents* contents,
int index,
TabChangeType change_type) {
if (!contents)
return;
content::NavigationEntry* entry = contents->GetController().GetVisibleEntry();
base::string16 title, location;
if (entry) {
title = Browser::FormatTitleForDisplay(entry->GetTitleForDisplay());
location = url_formatter::FormatUrl(
entry->GetVirtualURL(), url_formatter::kFormatUrlOmitDefaults,
net::UnescapeRule::NORMAL, nullptr, nullptr, nullptr);
}
title_origin_view_->Update(title, location);
location_icon_view_->Update(/*suppress animations = */ false);
last_title_ = title;
last_location_ = location;
Layout();
}
content::WebContents* CustomTabBarView::GetWebContents() {
return delegate_->GetWebContents();
}
bool CustomTabBarView::IsEditingOrEmpty() {
return false;
}
void CustomTabBarView::OnLocationIconPressed(const ui::MouseEvent& event) {}
void CustomTabBarView::OnLocationIconDragged(const ui::MouseEvent& event) {}
bool CustomTabBarView::ShowPageInfoDialog() {
return ::ShowPageInfoDialog(GetWebContents(),
bubble_anchor_util::Anchor::kCustomTabBar);
}
SkColor CustomTabBarView::GetSecurityChipColor(
security_state::SecurityLevel security_level) const {
// TODO(harrisjay): Use app theme color to determine OmniboxTint.
return GetOmniboxSecurityChipColor(OmniboxTint::LIGHT, security_level);
}
gfx::ImageSkia CustomTabBarView::GetLocationIcon(
LocationIconView::Delegate::IconFetchedCallback on_icon_fetched) const {
return gfx::CreateVectorIcon(
delegate_->GetLocationBarModel()->GetVectorIcon(),
GetLayoutConstant(LOCATION_BAR_ICON_SIZE),
GetSecurityChipColor(GetLocationBarModel()->GetSecurityLevel(false)));
}
SkColor CustomTabBarView::GetLocationIconInkDropColor() const {
return GetNativeTheme()->GetSystemColor(
ui::NativeTheme::kColorId_TextfieldDefaultColor);
}
const LocationBarModel* CustomTabBarView::GetLocationBarModel() const {
return delegate_->GetLocationBarModel();
}