1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/devtools/global_confirm_info_bar.h"
#include <utility>
#include "base/command_line.h"
#include "base/strings/utf_string_conversions.h"
#include "build/build_config.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/infobars/core/infobar.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/test_utils.h"
namespace {
class TestConfirmInfoBarDelegate : public ConfirmInfoBarDelegate {
public:
TestConfirmInfoBarDelegate() = default;
TestConfirmInfoBarDelegate(const TestConfirmInfoBarDelegate&) = delete;
TestConfirmInfoBarDelegate& operator=(const TestConfirmInfoBarDelegate&) =
delete;
~TestConfirmInfoBarDelegate() override = default;
InfoBarIdentifier GetIdentifier() const override { return TEST_INFOBAR; }
std::u16string GetMessageText() const override {
return u"GlobalConfirmInfoBar browser tests delegate.";
}
};
class GlobalConfirmInfoBarTest : public InProcessBrowserTest {
public:
GlobalConfirmInfoBarTest() = default;
GlobalConfirmInfoBarTest(const GlobalConfirmInfoBarTest&) = delete;
GlobalConfirmInfoBarTest& operator=(const GlobalConfirmInfoBarTest&) = delete;
~GlobalConfirmInfoBarTest() override = default;
protected:
infobars::ContentInfoBarManager* GetInfoBarManagerFromTabIndex(
int tab_index) {
return infobars::ContentInfoBarManager::FromWebContents(
browser()->tab_strip_model()->GetWebContentsAt(tab_index));
}
// Adds an additional tab.
void AddTab() {
ASSERT_FALSE(
AddTabAtIndex(0, GURL("chrome://blank/"), ui::PAGE_TRANSITION_LINK));
}
};
} // namespace
IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest, UserInteraction) {
TabStripModel* tab_strip_model = browser()->tab_strip_model();
AddTab();
ASSERT_EQ(2, tab_strip_model->count());
// Make sure each tab has no info bars.
for (int i = 0; i < tab_strip_model->count(); i++)
EXPECT_EQ(0u, GetInfoBarManagerFromTabIndex(i)->infobars().size());
auto delegate = std::make_unique<TestConfirmInfoBarDelegate>();
TestConfirmInfoBarDelegate* delegate_ptr = delegate.get();
GlobalConfirmInfoBar::Show(std::move(delegate));
// Verify that the info bar is shown on each tab.
for (int i = 0; i < tab_strip_model->count(); i++) {
infobars::ContentInfoBarManager* infobar_manager =
GetInfoBarManagerFromTabIndex(i);
ASSERT_EQ(1u, infobar_manager->infobars().size());
EXPECT_TRUE(infobar_manager->infobars()[0]->delegate()->EqualsDelegate(
delegate_ptr));
}
// Close the GlobalConfirmInfoBar by simulating an interaction with the info
// bar on one of the tabs. In this case, the first tab is picked.
infobars::InfoBar* first_tab_infobar =
GetInfoBarManagerFromTabIndex(0)->infobars()[0];
EXPECT_TRUE(
first_tab_infobar->delegate()->AsConfirmInfoBarDelegate()->Accept());
// Usually, clicking the button makes the info bar close itself if Accept()
// returns true. In our case, since we interacted with the info bar delegate
// directly, the info bar must be removed manually.
first_tab_infobar->RemoveSelf();
for (int i = 0; i < tab_strip_model->count(); i++)
EXPECT_EQ(0u, GetInfoBarManagerFromTabIndex(i)->infobars().size());
}
IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest, CreateAndCloseInfobar) {
TabStripModel* tab_strip_model = browser()->tab_strip_model();
ASSERT_EQ(1, tab_strip_model->count());
infobars::ContentInfoBarManager* infobar_manager =
GetInfoBarManagerFromTabIndex(0);
// Make sure the tab has no info bar.
EXPECT_EQ(0u, infobar_manager->infobars().size());
auto delegate = std::make_unique<TestConfirmInfoBarDelegate>();
TestConfirmInfoBarDelegate* delegate_ptr = delegate.get();
GlobalConfirmInfoBar* infobar =
GlobalConfirmInfoBar::Show(std::move(delegate));
// Verify that the info bar is shown.
ASSERT_EQ(1u, infobar_manager->infobars().size());
auto* test_infobar = infobar_manager->infobars()[0]->delegate();
EXPECT_TRUE(test_infobar->EqualsDelegate(delegate_ptr));
EXPECT_TRUE(test_infobar->IsCloseable());
// Close the infobar and make sure that the tab has no info bar.
infobar->Close();
EXPECT_EQ(0u, infobar_manager->infobars().size());
}
class NonDefaultTestConfirmInfoBarDelegate : public TestConfirmInfoBarDelegate {
public:
NonDefaultTestConfirmInfoBarDelegate() = default;
NonDefaultTestConfirmInfoBarDelegate(
const NonDefaultTestConfirmInfoBarDelegate&) = delete;
NonDefaultTestConfirmInfoBarDelegate& operator=(
const NonDefaultTestConfirmInfoBarDelegate&) = delete;
~NonDefaultTestConfirmInfoBarDelegate() override = default;
bool IsCloseable() const override { return false; }
bool ShouldAnimate() const override { return false; }
};
IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest,
VerifyInfobarNonDefaultProperties) {
TabStripModel* tab_strip_model = browser()->tab_strip_model();
ASSERT_EQ(1, tab_strip_model->count());
infobars::ContentInfoBarManager* infobar_manager =
GetInfoBarManagerFromTabIndex(0);
// Make sure the tab has no info bar.
EXPECT_EQ(0u, infobar_manager->infobars().size());
auto delegate = std::make_unique<NonDefaultTestConfirmInfoBarDelegate>();
NonDefaultTestConfirmInfoBarDelegate* delegate_ptr = delegate.get();
GlobalConfirmInfoBar::Show(std::move(delegate));
// Verify that the info bar is shown.
ASSERT_EQ(1u, infobar_manager->infobars().size());
auto* test_infobar = infobar_manager->infobars()[0]->delegate();
EXPECT_TRUE(test_infobar->EqualsDelegate(delegate_ptr));
EXPECT_FALSE(test_infobar->IsCloseable());
EXPECT_FALSE(test_infobar->ShouldAnimate());
}
class TestConfirmInfoBarDelegateWithLink : public TestConfirmInfoBarDelegate {
public:
TestConfirmInfoBarDelegateWithLink() = default;
TestConfirmInfoBarDelegateWithLink(
const TestConfirmInfoBarDelegateWithLink&) = delete;
TestConfirmInfoBarDelegateWithLink& operator=(
const TestConfirmInfoBarDelegateWithLink&) = delete;
~TestConfirmInfoBarDelegateWithLink() override = default;
std::u16string GetLinkText() const override { return u"Test"; }
GURL GetLinkURL() const override { return GURL("about:blank"); }
};
// Verifies that clicking a link in a global infobar does not crash. Regression
// test for http://crbug.com/1393765.
IN_PROC_BROWSER_TEST_F(GlobalConfirmInfoBarTest, ClickLink) {
// Show an infobar with a link.
TabStripModel* tab_strip_model = browser()->tab_strip_model();
ASSERT_EQ(1, tab_strip_model->count());
GlobalConfirmInfoBar::Show(
std::make_unique<TestConfirmInfoBarDelegateWithLink>());
// Simulate clicking the link on the infobar.
infobars::InfoBar* first_tab_infobar =
GetInfoBarManagerFromTabIndex(0)->infobars()[0];
EXPECT_FALSE(first_tab_infobar->delegate()->LinkClicked(
WindowOpenDisposition::NEW_BACKGROUND_TAB));
// This should have opened a new tab.
ASSERT_EQ(2, tab_strip_model->count());
}
|