blob: 16a884d04d03857575ac6eda132e8773bc00f759 [file] [log] [blame]
// Copyright 2019 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/tabs/tab_group_editor_bubble_view.h"
#include "base/test/scoped_feature_list.h"
#include "base/time/time.h"
#include "build/build_config.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/tabs/tab_group.h"
#include "chrome/browser/ui/tabs/tab_group_model.h"
#include "chrome/browser/ui/test/test_browser_dialog.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/views/frame/browser_view.h"
#include "chrome/browser/ui/views/tabs/tab_group_header.h"
#include "chrome/browser/ui/views/tabs/tab_strip.h"
#include "chrome/browser/ui/views/tabs/tab_strip_controller.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/tab_groups/tab_group_id.h"
#include "content/public/test/browser_test.h"
#include "ui/events/event.h"
#include "ui/gfx/geometry/point_f.h"
#include "ui/views/test/button_test_api.h"
class TabGroupEditorBubbleViewDialogBrowserTest : public DialogBrowserTest {
protected:
void ShowUi(const std::string& name) override {
tab_groups::TabGroupId group =
browser()->tab_strip_model()->AddToNewGroup({0});
browser()->tab_strip_model()->OpenTabGroupEditor(group);
BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
TabGroupHeader* header = browser_view->tabstrip()->group_header(group);
ASSERT_NE(nullptr, header);
ASSERT_TRUE(header->editor_bubble_tracker_.is_open());
}
static views::Widget* GetEditorBubbleWidget(const TabGroupHeader* header) {
return header->editor_bubble_tracker_.is_open()
? header->editor_bubble_tracker_.widget()
: nullptr;
}
};
#if defined(OS_WIN)
#define MAYBE_InvokeUi_default DISABLED_InvokeUi_default
#else
#define MAYBE_InvokeUi_default InvokeUi_default
#endif
IN_PROC_BROWSER_TEST_F(TabGroupEditorBubbleViewDialogBrowserTest,
MAYBE_InvokeUi_default) {
ShowAndVerifyUi();
}
IN_PROC_BROWSER_TEST_F(TabGroupEditorBubbleViewDialogBrowserTest,
NewTabInGroup) {
ShowUi("SetUp");
TabGroupModel* group_model = browser()->tab_strip_model()->group_model();
std::vector<tab_groups::TabGroupId> group_list = group_model->ListTabGroups();
ASSERT_EQ(1u, group_list.size());
ASSERT_EQ(1u, group_model->GetTabGroup(group_list[0])->ListTabs().length());
BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
TabGroupHeader* header =
browser_view->tabstrip()->group_header(group_list[0]);
views::Widget* editor_bubble = GetEditorBubbleWidget(header);
ASSERT_NE(nullptr, editor_bubble);
views::Button* const new_tab_button =
views::Button::AsButton(editor_bubble->GetContentsView()->GetViewByID(
TabGroupEditorBubbleView::TAB_GROUP_HEADER_CXMENU_NEW_TAB_IN_GROUP));
EXPECT_NE(nullptr, new_tab_button);
ui::MouseEvent released_event(ui::ET_MOUSE_RELEASED, gfx::PointF(),
gfx::PointF(), base::TimeTicks(), 0, 0);
views::test::ButtonTestApi(new_tab_button).NotifyClick(released_event);
EXPECT_EQ(2u, group_model->GetTabGroup(group_list[0])->ListTabs().length());
}
IN_PROC_BROWSER_TEST_F(TabGroupEditorBubbleViewDialogBrowserTest, Ungroup) {
ShowUi("SetUp");
TabStripModel* tsm = browser()->tab_strip_model();
ASSERT_EQ(1, tsm->count());
TabGroupModel* group_model = tsm->group_model();
std::vector<tab_groups::TabGroupId> group_list = group_model->ListTabGroups();
ASSERT_EQ(1u, group_list.size());
ASSERT_EQ(1u, group_model->GetTabGroup(group_list[0])->ListTabs().length());
BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
TabGroupHeader* header =
browser_view->tabstrip()->group_header(group_list[0]);
views::Widget* editor_bubble = GetEditorBubbleWidget(header);
ASSERT_NE(nullptr, editor_bubble);
views::Button* const ungroup_button =
views::Button::AsButton(editor_bubble->GetContentsView()->GetViewByID(
TabGroupEditorBubbleView::TAB_GROUP_HEADER_CXMENU_UNGROUP));
EXPECT_NE(nullptr, ungroup_button);
ui::MouseEvent released_event(ui::ET_MOUSE_RELEASED, gfx::PointF(),
gfx::PointF(), base::TimeTicks(), 0, 0);
views::test::ButtonTestApi(ungroup_button).NotifyClick(released_event);
EXPECT_EQ(0u, group_model->ListTabGroups().size());
EXPECT_FALSE(group_model->ContainsTabGroup(group_list[0]));
EXPECT_EQ(1, tsm->count());
}
IN_PROC_BROWSER_TEST_F(TabGroupEditorBubbleViewDialogBrowserTest,
CloseGroupClosesBrowser) {
ShowUi("SetUp");
TabGroupModel* group_model = browser()->tab_strip_model()->group_model();
std::vector<tab_groups::TabGroupId> group_list = group_model->ListTabGroups();
ASSERT_EQ(1u, group_list.size());
ASSERT_EQ(1u, group_model->GetTabGroup(group_list[0])->ListTabs().length());
BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
TabGroupHeader* header =
browser_view->tabstrip()->group_header(group_list[0]);
views::Widget* editor_bubble = GetEditorBubbleWidget(header);
ASSERT_NE(nullptr, editor_bubble);
views::Button* const close_group_button =
views::Button::AsButton(editor_bubble->GetContentsView()->GetViewByID(
TabGroupEditorBubbleView::TAB_GROUP_HEADER_CXMENU_CLOSE_GROUP));
EXPECT_NE(nullptr, close_group_button);
ui::MouseEvent released_event(ui::ET_MOUSE_RELEASED, gfx::PointF(),
gfx::PointF(), base::TimeTicks(), 0, 0);
views::test::ButtonTestApi(close_group_button).NotifyClick(released_event);
EXPECT_EQ(0u, group_model->ListTabGroups().size());
EXPECT_FALSE(group_model->ContainsTabGroup(group_list[0]));
EXPECT_EQ(0, browser()->tab_strip_model()->count());
EXPECT_TRUE(browser()->IsAttemptingToCloseBrowser());
}
IN_PROC_BROWSER_TEST_F(TabGroupEditorBubbleViewDialogBrowserTest,
MoveGroupToNewWindow) {
ShowUi("SetUp");
TabGroupModel* group_model = browser()->tab_strip_model()->group_model();
std::vector<tab_groups::TabGroupId> group_list = group_model->ListTabGroups();
ASSERT_EQ(1u, group_list.size());
ASSERT_EQ(1u, group_model->GetTabGroup(group_list[0])->ListTabs().length());
BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
TabGroupHeader* header =
browser_view->tabstrip()->group_header(group_list[0]);
views::Widget* editor_bubble = GetEditorBubbleWidget(header);
ASSERT_NE(nullptr, editor_bubble);
views::Button* const move_group_button =
views::Button::AsButton(editor_bubble->GetContentsView()->GetViewByID(
TabGroupEditorBubbleView::
TAB_GROUP_HEADER_CXMENU_MOVE_GROUP_TO_NEW_WINDOW));
EXPECT_NE(nullptr, move_group_button);
ui::MouseEvent released_event(ui::ET_MOUSE_RELEASED, gfx::PointF(),
gfx::PointF(), base::TimeTicks(), 0, 0);
views::test::ButtonTestApi(move_group_button).NotifyClick(released_event);
EXPECT_EQ(0u, group_model->ListTabGroups().size());
EXPECT_FALSE(group_model->ContainsTabGroup(group_list[0]));
EXPECT_EQ(0, browser()->tab_strip_model()->count());
BrowserList* browser_list = BrowserList::GetInstance();
Browser* active_browser = browser_list->GetLastActive();
ASSERT_NE(active_browser, browser());
EXPECT_EQ(1, active_browser->tab_strip_model()->count());
EXPECT_EQ(
1u,
active_browser->tab_strip_model()->group_model()->ListTabGroups().size());
}
class TabGroupEditorBubbleViewDialogBrowserTestWithFreezingEnabled
: public TabGroupEditorBubbleViewDialogBrowserTest {
public:
TabGroupEditorBubbleViewDialogBrowserTestWithFreezingEnabled() {
scoped_feature_list_.InitWithFeatures(
{features::kTabGroupsCollapseFreezing}, {});
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
IN_PROC_BROWSER_TEST_F(
TabGroupEditorBubbleViewDialogBrowserTestWithFreezingEnabled,
CollapsingGroupFreezesAllTabs) {
BrowserView* browser_view = static_cast<BrowserView*>(browser()->window());
InProcessBrowserTest::AddBlankTabAndShow(browser());
InProcessBrowserTest::AddBlankTabAndShow(browser());
TabStripModel* tsm = browser()->tab_strip_model();
ASSERT_EQ(3, tsm->count());
tab_groups::TabGroupId group = tsm->AddToNewGroup({0, 1});
ASSERT_FALSE(browser_view->tabstrip()->tab_at(0)->HasFreezingVoteToken());
ASSERT_FALSE(browser_view->tabstrip()->tab_at(1)->HasFreezingVoteToken());
ASSERT_FALSE(browser_view->tabstrip()->tab_at(2)->HasFreezingVoteToken());
ASSERT_TRUE(
browser_view->tabstrip()->controller()->ToggleTabGroupCollapsedState(
group));
EXPECT_TRUE(browser_view->tabstrip()->tab_at(0)->HasFreezingVoteToken());
EXPECT_TRUE(browser_view->tabstrip()->tab_at(1)->HasFreezingVoteToken());
EXPECT_FALSE(browser_view->tabstrip()->tab_at(2)->HasFreezingVoteToken());
}