blob: d1773b7332a4bc34725330dc9dc3ea07051124f6 [file] [log] [blame]
// Copyright 2024 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/sync/test/integration/sync_test_tab_utils.h"
#include "base/notreached.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/sync/test/integration/sync_datatype_helper.h"
#include "chrome/browser/sync/test/integration/sync_test.h"
#include "components/saved_tab_groups/public/types.h"
#include "components/tab_groups/tab_group_visual_data.h"
#include "content/public/browser/web_contents.h"
#include "content/public/test/browser_test_utils.h"
#if BUILDFLAG(IS_ANDROID)
#include "chrome/browser/sync/test/integration/sync_test_utils_android.h"
#include "chrome/browser/ui/android/tab_model/tab_model.h"
#include "chrome/browser/ui/android/tab_model/tab_model_list.h"
#else
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_tabstrip.h"
#include "chrome/browser/ui/tabs/tab_group_model.h"
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "components/tabs/public/tab_group.h"
#endif // BUILDFLAG(IS_ANDROID)
using sync_datatype_helper::test;
namespace sync_test_tab_utils {
namespace {
#if BUILDFLAG(IS_ANDROID)
TabModel* GetActiveTabModel() {
for (TabModel* model : TabModelList::models()) {
if (model->IsActiveModel()) {
return model;
}
}
NOTREACHED() << "No active tab model";
}
TabAndroid* GetFirstTabAtGroup(
const tab_groups::LocalTabGroupID& local_group_id) {
TabModel* active_model = GetActiveTabModel();
for (int i = 0; i < active_model->GetTabCount(); ++i) {
TabAndroid* tab = active_model->GetTabAt(i);
CHECK(tab);
if (sync_test_utils_android::GetGroupIdForTab(tab) == local_group_id) {
return tab;
}
}
return nullptr;
}
#else // BUILDFLAG(IS_ANDROID)
Browser* GetBrowserOrDie() {
CHECK_EQ(test()->num_clients(), 1)
<< "Tab utils support only single-client tests";
Browser* browser = test()->GetBrowser(/*index=*/0);
CHECK(browser);
return browser;
}
#endif // BUILDFLAG(IS_ANDROID)
} // namespace
std::optional<size_t> OpenNewTab(const GURL& url) {
content::WebContents* web_contents = nullptr;
size_t tab_index = 0;
#if BUILDFLAG(IS_ANDROID)
tab_index = GetActiveTabModel()->GetTabCount();
web_contents =
GetActiveTabModel()->CreateNewTabForDevTools(url, /*new_window=*/false);
#else
TabStripModel* tab_strip = GetBrowserOrDie()->tab_strip_model();
tab_index = tab_strip->count();
web_contents = chrome::AddAndReturnTabAt(GetBrowserOrDie(), url, tab_index,
/*foreground=*/true);
#endif // BUILDFLAG(IS_ANDROID)
CHECK(web_contents);
CHECK(WaitForLoadStop(web_contents)) << "Failed to load URL: " << url;
return tab_index;
}
tab_groups::LocalTabGroupID CreateGroupFromTab(
size_t tab_index,
std::string_view title,
tab_groups::TabGroupColorId color) {
std::optional<tab_groups::LocalTabGroupID> local_group_id;
#if BUILDFLAG(IS_ANDROID)
TabAndroid* tab = GetActiveTabModel()->GetTabAt(tab_index);
CHECK(tab);
local_group_id = sync_test_utils_android::CreateGroupFromTab(tab);
#else
TabStripModel* tab_strip = GetBrowserOrDie()->tab_strip_model();
local_group_id = tab_strip->AddToNewGroup({static_cast<int>(tab_index)});
#endif // BUILDFLAG(IS_ANDROID)
CHECK(local_group_id.has_value());
UpdateTabGroupVisualData(local_group_id.value(), title, color);
return local_group_id.value();
}
bool IsTabGroupOpen(const tab_groups::LocalTabGroupID& local_group_id) {
#if BUILDFLAG(IS_ANDROID)
return GetFirstTabAtGroup(local_group_id) != nullptr;
#else
TabStripModel* tab_strip = GetBrowserOrDie()->tab_strip_model();
return tab_strip->group_model()->ContainsTabGroup(local_group_id);
#endif // BUILDFLAG(IS_ANDROID)
}
void UpdateTabGroupVisualData(const tab_groups::LocalTabGroupID& local_group_id,
const std::string_view& title,
tab_groups::TabGroupColorId color) {
#if BUILDFLAG(IS_ANDROID)
return sync_test_utils_android::UpdateTabGroupVisualData(
GetFirstTabAtGroup(local_group_id), title, color);
#else
TabStripModel* tab_strip = GetBrowserOrDie()->tab_strip_model();
TabGroup* model_tab_group =
tab_strip->group_model()->GetTabGroup(local_group_id);
CHECK(model_tab_group);
tab_strip->ChangeTabGroupVisuals(
local_group_id,
tab_groups::TabGroupVisualData(base::UTF8ToUTF16(title), color),
/*is_customized=*/true);
#endif // BUILDFLAG(IS_ANDROID)
}
} // namespace sync_test_tab_utils