| Index: chrome/browser/ui/views/infobars/infobar_view.cc
|
| diff --git a/chrome/browser/ui/views/infobars/infobar_view.cc b/chrome/browser/ui/views/infobars/infobar_view.cc
|
| index 8f4c01a6d3450d14fc973bb55f71d91c05c2af0e..340996301a7bf3313dfe4614b8063065b5a648c6 100644
|
| --- a/chrome/browser/ui/views/infobars/infobar_view.cc
|
| +++ b/chrome/browser/ui/views/infobars/infobar_view.cc
|
| @@ -79,12 +79,24 @@ const int InfoBarView::kEndOfLabelSpacing = views::kItemLabelSpacing;
|
|
|
| InfoBarView::InfoBarView(scoped_ptr<infobars::InfoBarDelegate> delegate)
|
| : infobars::InfoBar(std::move(delegate)),
|
| - views::ExternalFocusTracker(this, NULL),
|
| - icon_(NULL),
|
| - close_button_(NULL) {
|
| + views::ExternalFocusTracker(this, nullptr),
|
| + child_container_(new views::View()),
|
| + icon_(nullptr),
|
| + close_button_(nullptr) {
|
| set_owned_by_client(); // InfoBar deletes itself at the appropriate time.
|
| set_background(
|
| new InfoBarBackground(infobars::InfoBar::delegate()->GetInfoBarType()));
|
| +
|
| + AddChildView(child_container_);
|
| +
|
| + if (ui::MaterialDesignController::IsModeMaterial()) {
|
| + child_container_->SetPaintToLayer(true);
|
| + child_container_->layer()->SetMasksToBounds(true);
|
| + // Since MD doesn't use a gradient, we can set a solid bg color.
|
| + child_container_->set_background(
|
| + views::Background::CreateSolidBackground(infobars::InfoBar::GetTopColor(
|
| + infobars::InfoBar::delegate()->GetInfoBarType())));
|
| + }
|
| }
|
|
|
| InfoBarView::~InfoBarView() {
|
| @@ -208,6 +220,12 @@ void InfoBarView::Layout() {
|
| height() - InfoBarContainerDelegate::kSeparatorLineHeight));
|
| }
|
|
|
| + child_container_->SetBounds(0, arrow_height(), width(), bar_height());
|
| + // |child_container_| should be the only child.
|
| + DCHECK_EQ(1, child_count());
|
| +
|
| + // Even though other views are technically grandchildren, we'll lay them out
|
| + // here on behalf of |child_container_|.
|
| int start_x = kEdgeItemPadding;
|
| if (icon_ != NULL) {
|
| icon_->SetPosition(gfx::Point(start_x, OffsetY(icon_)));
|
| @@ -233,7 +251,7 @@ void InfoBarView::ViewHierarchyChanged(
|
| icon_ = new views::ImageView;
|
| icon_->SetImage(image.ToImageSkia());
|
| icon_->SizeToPreferredSize();
|
| - AddChildView(icon_);
|
| + child_container_->AddChildView(icon_);
|
| }
|
|
|
| if (ui::MaterialDesignController::IsModeMaterial()) {
|
| @@ -256,13 +274,13 @@ void InfoBarView::ViewHierarchyChanged(
|
| close_button_->SetAccessibleName(
|
| l10n_util::GetStringUTF16(IDS_ACCNAME_CLOSE));
|
| close_button_->SetFocusable(true);
|
| - AddChildView(close_button_);
|
| + child_container_->AddChildView(close_button_);
|
| } else if ((close_button_ != NULL) && (details.parent == this) &&
|
| (details.child != close_button_) && (close_button_->parent() == this) &&
|
| (child_at(child_count() - 1) != close_button_)) {
|
| // For accessibility, ensure the close button is the last child view.
|
| RemoveChildView(close_button_);
|
| - AddChildView(close_button_);
|
| + child_container_->AddChildView(close_button_);
|
| }
|
|
|
| // Ensure the infobar is tall enough to display its contents.
|
| @@ -277,19 +295,6 @@ void InfoBarView::ViewHierarchyChanged(
|
| SetBarTargetHeight(height);
|
| }
|
|
|
| -void InfoBarView::PaintChildren(const ui::PaintContext& context) {
|
| - // TODO(scr): This really should be the |fill_path_|, but the clipPath seems
|
| - // broken on non-Windows platforms (crbug.com/75154). For now, just clip to
|
| - // the bar bounds.
|
| - //
|
| - // canvas->sk_canvas()->clipPath(fill_path_);
|
| - DCHECK_EQ(total_height(), height())
|
| - << "Infobar piecewise heights do not match overall height";
|
| - ui::ClipRecorder clip_recorder(context);
|
| - clip_recorder.ClipRect(gfx::Rect(0, arrow_height(), width(), bar_height()));
|
| - views::View::PaintChildren(context);
|
| -}
|
| -
|
| void InfoBarView::ButtonPressed(views::Button* sender,
|
| const ui::Event& event) {
|
| if (!owner())
|
| @@ -317,9 +322,8 @@ int InfoBarView::EndX() const {
|
| }
|
|
|
| int InfoBarView::OffsetY(views::View* view) const {
|
| - return arrow_height() +
|
| - std::max((bar_target_height() - view->height()) / 2, 0) -
|
| - (bar_target_height() - bar_height());
|
| + return std::max((bar_target_height() - view->height()) / 2, 0) -
|
| + (bar_target_height() - bar_height());
|
| }
|
|
|
| const infobars::InfoBarContainer::Delegate* InfoBarView::container_delegate()
|
| @@ -344,6 +348,10 @@ void InfoBarView::RunMenuAt(ui::MenuModel* menu_model,
|
| ui::MENU_SOURCE_NONE));
|
| }
|
|
|
| +void InfoBarView::AddViewToContentArea(views::View* view) {
|
| + child_container_->AddChildView(view);
|
| +}
|
| +
|
| // static
|
| void InfoBarView::AssignWidthsSorted(Labels* labels, int available_width) {
|
| if (labels->empty())
|
|
|