| // 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/infobars/infobar_view.h" |
| |
| #include "chrome/browser/infobars/infobar_service.h" |
| #include "chrome/browser/ui/views/infobars/infobar_container_view.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "chrome/test/views/chrome_views_test_base.h" |
| #include "content/public/test/test_web_contents_factory.h" |
| |
| class TestInfoBarDelegate : public infobars::InfoBarDelegate { |
| public: |
| static InfoBarView* Create(InfoBarService* infobar_service) { |
| return static_cast<InfoBarView*>( |
| infobar_service->AddInfoBar(std::make_unique<InfoBarView>( |
| std::make_unique<TestInfoBarDelegate>()))); |
| } |
| |
| // infobars::InfoBarDelegate: |
| InfoBarIdentifier GetIdentifier() const override { return TEST_INFOBAR; } |
| }; |
| |
| class InfoBarViewTest : public ChromeViewsTestBase { |
| public: |
| InfoBarViewTest() |
| : web_contents_(web_contents_factory_.CreateWebContents(&profile_)), |
| infobar_container_view_(nullptr) { |
| InfoBarService::CreateForWebContents(web_contents_); |
| infobar_container_view_.ChangeInfoBarManager(infobar_service()); |
| } |
| |
| InfoBarService* infobar_service() { |
| return InfoBarService::FromWebContents(web_contents_); |
| } |
| |
| // Detaches |infobar_container_view_| from infobar_service(), so that newly- |
| // created infobars will not be placed in a container. This can be used to |
| // simulate creating an infobar in a background tab. |
| void DetachContainer() { |
| infobar_container_view_.ChangeInfoBarManager(nullptr); |
| } |
| |
| private: |
| TestingProfile profile_; |
| content::TestWebContentsFactory web_contents_factory_; |
| content::WebContents* web_contents_; |
| InfoBarContainerView infobar_container_view_; |
| }; |
| |
| TEST_F(InfoBarViewTest, ShouldDrawSeparator) { |
| // Add multiple infobars. The top infobar should not draw a separator; the |
| // others should. |
| for (int i = 0; i < 3; ++i) { |
| InfoBarView* infobar = TestInfoBarDelegate::Create(infobar_service()); |
| ASSERT_TRUE(infobar); |
| EXPECT_EQ(i > 0, infobar->ShouldDrawSeparator()); |
| } |
| } |
| |
| // Regression test for crbug.com/834728 . |
| TEST_F(InfoBarViewTest, LayoutOnHiddenInfoBar) { |
| // Calling Layout() on an infobar inside a container should not crash. |
| InfoBarView* infobar = TestInfoBarDelegate::Create(infobar_service()); |
| ASSERT_TRUE(infobar); |
| infobar->Layout(); |
| // Neither should calling it on an infobar not in a container. |
| DetachContainer(); |
| infobar->Layout(); |
| } |