#include "chrome/browser/ui/webui/tab_search/tab_search_page_handler.h"
#include <stdint.h>
#include <iterator>
#include <memory>
#include <set>
#include <string>
#include <utility>
#include <vector>
#include "base/base64.h"
#include "base/feature_list.h"
#include "base/metrics/histogram_functions.h"
#include "base/ranges/algorithm.h"
#include "base/strings/utf_string_conversions.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
#include "base/trace_event/trace_event.h"
#include "base/values.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/extensions/api/tab_groups/tab_groups_util.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/favicon/favicon_utils.h"
#include "chrome/browser/feedback/show_feedback_page.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h"
#include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/sessions/tab_restore_service_factory.h"
#include "chrome/browser/signin/identity_manager_factory.h"
#include "chrome/browser/signin/signin_error_controller_factory.h"
#include "chrome/browser/signin/signin_ui_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/browser_list.h"
#include "chrome/browser/ui/browser_live_tab_context.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/browser_window.h"
#include "chrome/browser/ui/color/chrome_color_id.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_request.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_service.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_service_factory.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_session.h"
#include "chrome/browser/ui/tabs/organization/tab_organization_utils.h"
#include "chrome/browser/ui/tabs/tab_enums.h"
#include "chrome/browser/ui/tabs/tab_renderer_data.h"
#include "chrome/browser/ui/tabs/tab_strip_model_observer.h"
#include "chrome/browser/ui/tabs/tab_utils.h"
#include "chrome/browser/ui/ui_features.h"
#include "chrome/browser/ui/webui/metrics_reporter/metrics_reporter.h"
#include "chrome/browser/ui/webui/tab_search/tab_search_prefs.h"
#include "chrome/browser/ui/webui/util/image_util.h"
#include "chrome/browser/user_education/tutorial_identifiers.h"
#include "chrome/browser/user_education/user_education_service.h"
#include "chrome/browser/user_education/user_education_service_factory.h"
#include "chrome/common/webui_url_constants.h"
#include "chrome/grit/generated_resources.h"
#include "components/optimization_guide/core/optimization_guide_model_executor.h"
#include "components/optimization_guide/proto/model_quality_service.pb.h"
#include "components/signin/public/base/signin_metrics.h"
#include "components/user_education/common/tutorial_identifier.h"
#include "components/user_education/common/tutorial_service.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/time_format.h"
#include "ui/color/color_provider.h"
namespace {
constexpr base::TimeDelta kTabsChangeDelay = …;
std::string GetLastActiveElapsedText(
const base::TimeTicks& last_active_time_ticks) { … }
std::string GetLastActiveElapsedText(const base::Time& last_active_time) { … }
base::Time GetTabGroupTimeStamp(
const std::vector<std::unique_ptr<sessions::tab_restore::Tab>>& tabs) { … }
void CreateTabGroupIfNotPresent(
sessions::tab_restore::Tab* tab,
std::set<tab_groups::TabGroupId>& tab_group_ids,
std::vector<tab_search::mojom::TabGroupPtr>& tab_groups) { … }
gfx::ImageSkia ThemeFavicon(const gfx::ImageSkia& source,
const ui::ColorProvider& provider) { … }
TabOrganization* GetTabOrganization(TabOrganizationService* service,
int32_t session_id,
int32_t organization_id) { … }
tab_search::mojom::TabOrganizationSessionPtr CreateFailedMojoSession() { … }
tab_search::mojom::TabOrganizationSessionPtr CreateNotStartedMojoSession() { … }
}
TabSearchPageHandler::TabSearchPageHandler(
mojo::PendingReceiver<tab_search::mojom::PageHandler> receiver,
mojo::PendingRemote<tab_search::mojom::Page> page,
content::WebUI* web_ui,
TopChromeWebUIController* webui_controller,
MetricsReporter* metrics_reporter)
: … { … }
TabSearchPageHandler::~TabSearchPageHandler() { … }
void TabSearchPageHandler::CloseTab(int32_t tab_id) { … }
void TabSearchPageHandler::DeclutterTabs(const std::vector<int32_t>& tab_ids) { … }
void TabSearchPageHandler::AcceptTabOrganization(
int32_t session_id,
int32_t organization_id,
const std::u16string& name,
std::vector<tab_search::mojom::TabPtr> tabs) { … }
void TabSearchPageHandler::RejectTabOrganization(int32_t session_id,
int32_t organization_id) { … }
void TabSearchPageHandler::ExcludeFromStaleTabs(int32_t tab_id) { … }
void TabSearchPageHandler::GetProfileData(GetProfileDataCallback callback) { … }
void TabSearchPageHandler::GetStaleTabs(GetStaleTabsCallback callback) { … }
void TabSearchPageHandler::GetTabOrganizationSession(
GetTabOrganizationSessionCallback callback) { … }
std::optional<TabSearchPageHandler::TabDetails>
TabSearchPageHandler::GetTabDetails(int32_t tab_id) { … }
void TabSearchPageHandler::GetTabOrganizationModelStrategy(
GetTabOrganizationModelStrategyCallback callback) { … }
void TabSearchPageHandler::SwitchToTab(
tab_search::mojom::SwitchToTabInfoPtr switch_to_tab_info) { … }
void TabSearchPageHandler::OpenRecentlyClosedEntry(int32_t session_id) { … }
void TabSearchPageHandler::RequestTabOrganization() { … }
void TabSearchPageHandler::RemoveTabFromOrganization(
int32_t session_id,
int32_t organization_id,
tab_search::mojom::TabPtr tab) { … }
void TabSearchPageHandler::RejectSession(int32_t session_id) { … }
void TabSearchPageHandler::RestartSession() { … }
void TabSearchPageHandler::SaveRecentlyClosedExpandedPref(bool expanded) { … }
void TabSearchPageHandler::SetTabIndex(int32_t index) { … }
void TabSearchPageHandler::StartTabGroupTutorial() { … }
void TabSearchPageHandler::TriggerFeedback(int32_t session_id) { … }
void TabSearchPageHandler::TriggerSignIn() { … }
void TabSearchPageHandler::OpenHelpPage() { … }
void TabSearchPageHandler::SetTabOrganizationModelStrategy(
tab_search::mojom::TabOrganizationModelStrategy strategy) { … }
void TabSearchPageHandler::SetUserFeedback(
int32_t session_id,
int32_t organization_id,
tab_search::mojom::UserFeedback feedback) { … }
void TabSearchPageHandler::NotifyOrganizationUIReadyToShow() { … }
void TabSearchPageHandler::NotifySearchUIReadyToShow() { … }
void TabSearchPageHandler::MaybeShowUI() { … }
tab_search::mojom::ProfileDataPtr TabSearchPageHandler::CreateProfileData() { … }
std::vector<tab_search::mojom::TabPtr> TabSearchPageHandler::FindStaleTabs(
int32_t excluded_id) { … }
void TabSearchPageHandler::AddRecentlyClosedEntries(
std::vector<tab_search::mojom::RecentlyClosedTabPtr>& recently_closed_tabs,
std::vector<tab_search::mojom::RecentlyClosedTabGroupPtr>&
recently_closed_tab_groups,
std::set<tab_groups::TabGroupId>& tab_group_ids,
std::vector<tab_search::mojom::TabGroupPtr>& tab_groups,
std::set<DedupKey>& tab_dedup_keys) { … }
bool TabSearchPageHandler::AddRecentlyClosedTab(
sessions::tab_restore::Tab* tab,
const base::Time& close_time,
std::vector<tab_search::mojom::RecentlyClosedTabPtr>& recently_closed_tabs,
std::set<DedupKey>& tab_dedup_keys,
std::set<tab_groups::TabGroupId>& tab_group_ids,
std::vector<tab_search::mojom::TabGroupPtr>& tab_groups) { … }
tab_search::mojom::TabPtr TabSearchPageHandler::GetTab(
const TabStripModel* tab_strip_model,
content::WebContents* contents,
int index) const { … }
tab_search::mojom::RecentlyClosedTabPtr
TabSearchPageHandler::GetRecentlyClosedTab(sessions::tab_restore::Tab* tab,
const base::Time& close_time) { … }
void TabSearchPageHandler::OnTabStripModelChanged(
TabStripModel* tab_strip_model,
const TabStripModelChange& change,
const TabStripSelectionChange& selection) { … }
void TabSearchPageHandler::TabChangedAt(content::WebContents* contents,
int index,
TabChangeType change_type) { … }
void TabSearchPageHandler::ScheduleDebounce() { … }
void TabSearchPageHandler::NotifyTabsChanged() { … }
void TabSearchPageHandler::NotifyTabIndexPrefChanged(const Profile* profile) { … }
void TabSearchPageHandler::NotifyShowFREPrefChanged(const Profile* profile) { … }
bool TabSearchPageHandler::IsWebContentsVisible() { … }
tab_search::mojom::TabPtr TabSearchPageHandler::GetMojoForTabData(
TabData* tab_data) const { … }
tab_search::mojom::TabOrganizationPtr
TabSearchPageHandler::GetMojoForTabOrganization(
const TabOrganization* organization) const { … }
tab_search::mojom::TabOrganizationSessionPtr
TabSearchPageHandler::GetMojoForTabOrganizationSession(
const TabOrganizationSession* session) const { … }
void TabSearchPageHandler::OnTabOrganizationSessionUpdated(
const TabOrganizationSession* session) { … }
void TabSearchPageHandler::OnTabOrganizationSessionDestroyed(
TabOrganizationSession::ID session_id) { … }
void TabSearchPageHandler::OnSessionCreated(const Browser* browser,
TabOrganizationSession* session) { … }
void TabSearchPageHandler::OnChangeInFeatureCurrentlyEnabledState(
bool is_now_enabled) { … }
bool TabSearchPageHandler::ShouldTrackBrowser(Browser* browser) { … }
void TabSearchPageHandler::SetTimerForTesting(
std::unique_ptr<base::RetainingOneShotTimer> timer) { … }