| // 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/android/tab_features.h" |
| |
| #include <memory> |
| |
| #include "chrome/browser/actor/actor_features.h" |
| #include "chrome/browser/actor/actor_keyed_service.h" |
| #include "chrome/browser/actor/actor_tab_data.h" |
| #include "chrome/browser/actor/android/ui/actor_ui_tab_controller_android.h" |
| #include "chrome/browser/glic/public/features.h" |
| #include "chrome/browser/glic/public/glic_enabling.h" |
| #include "chrome/browser/glic/public/widget/glic_side_panel_coordinator_android.h" |
| #include "chrome/browser/glic/public/widget/glic_side_panel_coordinator_desktop_android.h" |
| #include "chrome/browser/glic/service/glic_instance_helper.h" |
| #include "chrome/browser/net/qwac_web_contents_observer.h" |
| #include "chrome/browser/preloading/new_tab_page_preload/new_tab_page_preload_pipeline_manager.h" |
| #include "chrome/browser/profiles/profile.h" |
| #include "chrome/browser/sync/sessions/sync_sessions_router_tab_helper.h" |
| #include "chrome/browser/sync/sessions/sync_sessions_web_contents_router_factory.h" |
| #include "chrome/browser/translate/chrome_translate_client.h" |
| #include "chrome/browser/ui/contextual_search/tab_contextualization_controller.h" |
| #include "chrome/browser/ui/side_panel/android/android_side_panel_enabled_fn.h" |
| #include "chrome/browser/ui/side_panel/side_panel_registry.h" |
| #include "chrome/common/buildflags.h" |
| #include "chrome/common/chrome_features.h" |
| #include "components/favicon/content/content_favicon_driver.h" |
| #include "components/tabs/public/tab_interface.h" |
| #include "net/base/features.h" |
| #include "ui/base/unowned_user_data/user_data_factory.h" |
| |
| namespace tabs { |
| |
| TabFeatures::TabFeatures(content::WebContents* web_contents, Profile* profile) { |
| sync_sessions_router_ = |
| std::make_unique<sync_sessions::SyncSessionsRouterTabHelper>( |
| web_contents, |
| sync_sessions::SyncSessionsWebContentsRouterFactory::GetForProfile( |
| profile), |
| ChromeTranslateClient::FromWebContents(web_contents), |
| favicon::ContentFaviconDriver::FromWebContents(web_contents)); |
| |
| if (base::FeatureList::IsEnabled(net::features::kVerifyQWACs)) { |
| qwac_web_contents_observer_ = |
| std::make_unique<QwacWebContentsObserver>(web_contents); |
| } |
| |
| new_tab_page_preload_pipeline_manager_ = |
| std::make_unique<NewTabPagePreloadPipelineManager>(web_contents); |
| |
| TabInterface* const tab = TabInterface::GetFromContents(web_contents); |
| tab_scoped_side_panel_registry_ = |
| AndroidSidePanelEnabledFn::IsEnabled() |
| ? std::make_unique<SidePanelRegistry>(tab) |
| : nullptr; |
| |
| if (base::FeatureList::IsEnabled(features::kGlicActor)) { |
| actor_tab_data_ = |
| GetUserDataFactory().CreateInstance<actor::ActorTabData>(*tab, tab); |
| } |
| |
| auto* actor_service = actor::ActorKeyedService::Get(profile); |
| if (glic::GlicEnabling::IsProfileEligible(profile) && actor_service) { |
| actor_ui_tab_controller_ = |
| GetUserDataFactory() |
| .CreateInstance<actor::ui::ActorUiTabControllerAndroid>( |
| *tab, *tab, actor_service); |
| } |
| |
| tab_contextualization_controller_ = |
| GetUserDataFactory().CreateInstance<lens::TabContextualizationController>( |
| *tab, tab); |
| |
| glic_instance_helper_ = |
| GetUserDataFactory().CreateInstance<glic::GlicInstanceHelper>(*tab, tab); |
| if (AndroidSidePanelEnabledFn::IsEnabled()) { |
| glic_side_panel_coordinator_ = |
| GetUserDataFactory() |
| .CreateInstance<glic::GlicSidePanelCoordinatorDesktopAndroid>( |
| *tab, tab, tab_scoped_side_panel_registry_.get(), profile); |
| } else { |
| glic_side_panel_coordinator_ = |
| GetUserDataFactory() |
| .CreateInstance<glic::GlicSidePanelCoordinatorAndroid>(*tab, tab); |
| } |
| } |
| |
| TabFeatures::~TabFeatures() = default; |
| |
| // static |
| ui::UserDataFactoryWithOwner<TabInterface>& TabFeatures::GetUserDataFactory() { |
| static base::NoDestructor<ui::UserDataFactoryWithOwner<TabInterface>> factory; |
| return *factory; |
| } |
| |
| } // namespace tabs |