blob: 97c96c836fdc7758770c75e394f246f2370ae79d [file] [log] [blame]
// 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.
#import "ios/chrome/browser/tabs/tab_helper_util.h"
#if !defined(__has_feature) || !__has_feature(objc_arc)
#error "This file requires ARC support."
#endif
#import "base/feature_list.h"
#import "components/autofill/ios/form_util/unique_id_data_tab_helper.h"
#import "components/breadcrumbs/core/features.h"
#import "components/commerce/ios/browser/commerce_tab_helper.h"
#import "components/favicon/core/favicon_service.h"
#import "components/favicon/ios/web_favicon_driver.h"
#import "components/history/core/browser/top_sites.h"
#import "components/history/ios/browser/web_state_top_sites_observer.h"
#import "components/keyed_service/core/service_access_type.h"
#import "components/language/ios/browser/ios_language_detection_tab_helper.h"
#import "components/omnibox/common/omnibox_features.h"
#import "components/safe_browsing/core/common/features.h"
#import "components/safe_browsing/ios/browser/safe_browsing_url_allow_list.h"
#import "components/ukm/ios/ukm_url_recorder.h"
#import "ios/chrome/browser/app_launcher/app_launcher_abuse_detector.h"
#import "ios/chrome/browser/app_launcher/app_launcher_tab_helper.h"
#import "ios/chrome/browser/autofill/autofill_tab_helper.h"
#import "ios/chrome/browser/autofill/form_suggestion_tab_helper.h"
#import "ios/chrome/browser/browser_state/chrome_browser_state.h"
#import "ios/chrome/browser/commerce/price_alert_util.h"
#import "ios/chrome/browser/commerce/price_notifications/price_notifications_tab_helper.h"
#import "ios/chrome/browser/commerce/push_notification/push_notification_feature.h"
#import "ios/chrome/browser/commerce/shopping_persisted_data_tab_helper.h"
#import "ios/chrome/browser/commerce/shopping_service_factory.h"
#import "ios/chrome/browser/complex_tasks/ios_task_tab_helper.h"
#import "ios/chrome/browser/crash_report/breadcrumbs/breadcrumb_manager_tab_helper.h"
#import "ios/chrome/browser/download/ar_quick_look_tab_helper.h"
#import "ios/chrome/browser/download/download_manager_tab_helper.h"
#import "ios/chrome/browser/download/pass_kit_tab_helper.h"
#import "ios/chrome/browser/download/safari_download_tab_helper.h"
#import "ios/chrome/browser/download/vcard_tab_helper.h"
#import "ios/chrome/browser/favicon/favicon_service_factory.h"
#import "ios/chrome/browser/find_in_page/find_tab_helper.h"
#import "ios/chrome/browser/follow/follow_tab_helper.h"
#import "ios/chrome/browser/history/history_service_factory.h"
#import "ios/chrome/browser/history/history_tab_helper.h"
#import "ios/chrome/browser/history/top_sites_factory.h"
#import "ios/chrome/browser/https_upgrades/https_only_mode_upgrade_tab_helper.h"
#import "ios/chrome/browser/https_upgrades/https_upgrade_service_factory.h"
#import "ios/chrome/browser/https_upgrades/typed_navigation_upgrade_tab_helper.h"
#import "ios/chrome/browser/infobars/infobar_badge_tab_helper.h"
#import "ios/chrome/browser/infobars/infobar_manager_impl.h"
#import "ios/chrome/browser/infobars/overlays/default_infobar_overlay_request_factory.h"
#import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h"
#import "ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h"
#import "ios/chrome/browser/infobars/overlays/translate_overlay_tab_helper.h"
#import "ios/chrome/browser/itunes_urls/itunes_urls_handler_tab_helper.h"
#import "ios/chrome/browser/link_to_text/link_to_text_tab_helper.h"
#import "ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h"
#import "ios/chrome/browser/ntp/features.h"
#import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h"
#import "ios/chrome/browser/open_in/open_in_tab_helper.h"
#import "ios/chrome/browser/optimization_guide/optimization_guide_tab_helper.h"
#import "ios/chrome/browser/optimization_guide/optimization_guide_validation_tab_helper.h"
#import "ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper.h"
#import "ios/chrome/browser/passwords/password_tab_helper.h"
#import "ios/chrome/browser/passwords/well_known_change_password_tab_helper.h"
#import "ios/chrome/browser/permissions/permissions_tab_helper.h"
#import "ios/chrome/browser/policy_url_blocking/policy_url_blocking_tab_helper.h"
#import "ios/chrome/browser/prerender/prerender_service_factory.h"
#import "ios/chrome/browser/reading_list/offline_page_tab_helper.h"
#import "ios/chrome/browser/reading_list/reading_list_model_factory.h"
#import "ios/chrome/browser/reading_list/reading_list_web_state_observer.h"
#import "ios/chrome/browser/safe_browsing/safe_browsing_client_factory.h"
#import "ios/chrome/browser/safe_browsing/tailored_security/tailored_security_service_factory.h"
#import "ios/chrome/browser/safe_browsing/tailored_security/tailored_security_tab_helper.h"
#import "ios/chrome/browser/search_engines/search_engine_tab_helper.h"
#import "ios/chrome/browser/sessions/ios_chrome_session_tab_helper.h"
#import "ios/chrome/browser/snapshots/snapshot_tab_helper.h"
#import "ios/chrome/browser/ssl/captive_portal_tab_helper.h"
#import "ios/chrome/browser/sync/ios_chrome_synced_tab_delegate.h"
#import "ios/chrome/browser/translate/chrome_ios_translate_client.h"
#import "ios/chrome/browser/ui/ui_feature_flags.h"
#import "ios/chrome/browser/voice/voice_search_navigations_tab_helper.h"
#import "ios/chrome/browser/web/annotations/annotations_tab_helper.h"
#import "ios/chrome/browser/web/blocked_popup_tab_helper.h"
#import "ios/chrome/browser/web/error_page_controller_bridge.h"
#import "ios/chrome/browser/web/font_size/font_size_tab_helper.h"
#import "ios/chrome/browser/web/image_fetch/image_fetch_tab_helper.h"
#import "ios/chrome/browser/web/invalid_url_tab_helper.h"
#import "ios/chrome/browser/web/load_timing_tab_helper.h"
#import "ios/chrome/browser/web/page_placeholder_tab_helper.h"
#import "ios/chrome/browser/web/print/print_tab_helper.h"
#import "ios/chrome/browser/web/repost_form_tab_helper.h"
#import "ios/chrome/browser/web/sad_tab_tab_helper.h"
#import "ios/chrome/browser/web/session_state/web_session_state_tab_helper.h"
#import "ios/chrome/browser/web/web_performance_metrics/web_performance_metrics_tab_helper.h"
#import "ios/chrome/browser/webui/net_export_tab_helper.h"
#import "ios/components/security_interstitials/https_only_mode/feature.h"
#import "ios/components/security_interstitials/https_only_mode/https_only_mode_container.h"
#import "ios/components/security_interstitials/ios_blocking_page_tab_helper.h"
#import "ios/components/security_interstitials/lookalikes/lookalike_url_container.h"
#import "ios/components/security_interstitials/lookalikes/lookalike_url_tab_allow_list.h"
#import "ios/components/security_interstitials/lookalikes/lookalike_url_tab_helper.h"
#import "ios/components/security_interstitials/safe_browsing/safe_browsing_client.h"
#import "ios/components/security_interstitials/safe_browsing/safe_browsing_query_manager.h"
#import "ios/components/security_interstitials/safe_browsing/safe_browsing_tab_helper.h"
#import "ios/components/security_interstitials/safe_browsing/safe_browsing_unsafe_resource_container.h"
#import "ios/public/provider/chrome/browser/text_zoom/text_zoom_api.h"
#import "ios/web/common/features.h"
#import "ios/web/public/web_state.h"
void AttachTabHelpers(web::WebState* web_state, bool for_prerender) {
ChromeBrowserState* const browser_state =
ChromeBrowserState::FromBrowserState(web_state->GetBrowserState());
const bool is_off_the_record = browser_state->IsOffTheRecord();
// IOSChromeSessionTabHelper sets up the session ID used by other helpers,
// so it needs to be created before them.
IOSChromeSessionTabHelper::CreateForWebState(web_state);
VoiceSearchNavigationTabHelper::CreateForWebState(web_state);
IOSChromeSyncedTabDelegate::CreateForWebState(web_state);
InfoBarManagerImpl::CreateForWebState(web_state);
BlockedPopupTabHelper::CreateForWebState(web_state);
FindTabHelper::CreateForWebState(web_state);
ITunesUrlsHandlerTabHelper::CreateForWebState(web_state);
HistoryTabHelper::CreateForWebState(web_state);
LoadTimingTabHelper::CreateForWebState(web_state);
OverscrollActionsTabHelper::CreateForWebState(web_state);
IOSTaskTabHelper::CreateForWebState(web_state);
if (IsPriceAlertsEligible(web_state->GetBrowserState()))
ShoppingPersistedDataTabHelper::CreateForWebState(web_state);
commerce::CommerceTabHelper::CreateForWebState(
web_state, is_off_the_record,
commerce::ShoppingServiceFactory::GetForBrowserState(browser_state));
AppLauncherTabHelper::CreateForWebState(
web_state, [[AppLauncherAbuseDetector alloc] init]);
security_interstitials::IOSBlockingPageTabHelper::CreateForWebState(
web_state);
password_manager::WellKnownChangePasswordTabHelper::CreateForWebState(
web_state);
ErrorPageControllerBridge::CreateForWebState(web_state);
InvalidUrlTabHelper::CreateForWebState(web_state);
InfobarOverlayRequestInserter::CreateForWebState(
web_state, &DefaultInfobarOverlayRequestFactory);
InfobarOverlayTabHelper::CreateForWebState(web_state);
TranslateOverlayTabHelper::CreateForWebState(web_state);
if (ios::provider::IsTextZoomEnabled()) {
FontSizeTabHelper::CreateForWebState(web_state);
}
if (base::FeatureList::IsEnabled(breadcrumbs::kLogBreadcrumbs)) {
BreadcrumbManagerTabHelper::CreateForWebState(web_state);
}
if (base::FeatureList::IsEnabled(web::features::kEnableWebPageAnnotations) &&
!is_off_the_record) {
AnnotationsTabHelper::CreateForWebState(web_state);
}
SafeBrowsingClient* client =
SafeBrowsingClientFactory::GetForBrowserState(browser_state);
SafeBrowsingQueryManager::CreateForWebState(web_state, client);
SafeBrowsingTabHelper::CreateForWebState(web_state, client);
SafeBrowsingUrlAllowList::CreateForWebState(web_state);
SafeBrowsingUnsafeResourceContainer::CreateForWebState(web_state);
if (base::FeatureList::IsEnabled(
safe_browsing::kTailoredSecurityIntegration)) {
TailoredSecurityTabHelper::CreateForWebState(
web_state,
TailoredSecurityServiceFactory::GetForBrowserState(browser_state));
}
PolicyUrlBlockingTabHelper::CreateForWebState(web_state);
ImageFetchTabHelper::CreateForWebState(web_state);
NewTabPageTabHelper::CreateForWebState(web_state);
OpenInTabHelper::CreateForWebState(web_state);
OptimizationGuideTabHelper::CreateForWebState(web_state);
OptimizationGuideValidationTabHelper::CreateForWebState(web_state);
ChromeBrowserState* original_browser_state =
browser_state->GetOriginalChromeBrowserState();
favicon::WebFaviconDriver::CreateForWebState(
web_state,
ios::FaviconServiceFactory::GetForBrowserState(
original_browser_state, ServiceAccessType::IMPLICIT_ACCESS));
history::WebStateTopSitesObserver::CreateForWebState(
web_state,
ios::TopSitesFactory::GetForBrowserState(original_browser_state).get());
UniqueIDDataTabHelper::CreateForWebState(web_state);
PasswordTabHelper::CreateForWebState(web_state);
AutofillTabHelper::CreateForWebState(
web_state,
PasswordTabHelper::FromWebState(web_state)->GetPasswordManager());
// Depends on favicon::WebFaviconDriver, must be created after it.
SearchEngineTabHelper::CreateForWebState(web_state);
FormSuggestionTabHelper::CreateForWebState(web_state, @[
PasswordTabHelper::FromWebState(web_state)->GetSuggestionProvider(),
AutofillTabHelper::FromWebState(web_state)->GetSuggestionProvider(),
]);
ukm::InitializeSourceUrlRecorderForWebState(web_state);
// Download tab helpers.
ARQuickLookTabHelper::CreateForWebState(web_state);
DownloadManagerTabHelper::CreateForWebState(web_state);
SafariDownloadTabHelper::CreateForWebState(web_state);
PassKitTabHelper::CreateForWebState(web_state);
VcardTabHelper::CreateForWebState(web_state);
PageloadForegroundDurationTabHelper::CreateForWebState(web_state);
LookalikeUrlTabHelper::CreateForWebState(web_state);
LookalikeUrlTabAllowList::CreateForWebState(web_state);
LookalikeUrlContainer::CreateForWebState(web_state);
// TODO(crbug.com/794115): pre-rendered WebState have lots of unnecessary
// tab helpers for historical reasons. For the moment, AttachTabHelpers
// allows to inhibit the creation of some of them. Once PreloadController
// has been refactored to only create the necessary tab helpers, this
// condition can be removed.
if (!for_prerender) {
SadTabTabHelper::CreateForWebState(
web_state, SadTabTabHelper::kDefaultRepeatFailureInterval);
SnapshotTabHelper::CreateForWebState(web_state);
PagePlaceholderTabHelper::CreateForWebState(web_state);
PrintTabHelper::CreateForWebState(web_state);
ChromeIOSTranslateClient::CreateForWebState(web_state);
}
InfobarBadgeTabHelper::CreateForWebState(web_state);
if (base::FeatureList::IsEnabled(kSharedHighlightingIOS)) {
LinkToTextTabHelper::CreateForWebState(web_state);
}
WebSessionStateTabHelper::CreateForWebState(web_state);
WebPerformanceMetricsTabHelper::CreateForWebState(web_state);
OfflinePageTabHelper::CreateForWebState(
web_state, ReadingListModelFactory::GetForBrowserState(browser_state));
PermissionsTabHelper::CreateForWebState(web_state);
RepostFormTabHelper::CreateForWebState(web_state);
NetExportTabHelper::CreateForWebState(web_state);
if (base::FeatureList::IsEnabled(
security_interstitials::features::kHttpsOnlyMode)) {
HttpsOnlyModeUpgradeTabHelper::CreateForWebState(
web_state, browser_state->GetPrefs(),
PrerenderServiceFactory::GetForBrowserState(browser_state),
HttpsUpgradeServiceFactory::GetForBrowserState(browser_state));
HttpsOnlyModeContainer::CreateForWebState(web_state);
}
if (base::FeatureList::IsEnabled(omnibox::kDefaultTypedNavigationsToHttps)) {
TypedNavigationUpgradeTabHelper::CreateForWebState(
web_state, PrerenderServiceFactory::GetForBrowserState(browser_state),
HttpsUpgradeServiceFactory::GetForBrowserState(browser_state));
}
if (IsWebChannelsEnabled() && !is_off_the_record) {
FollowTabHelper::CreateForWebState(web_state);
}
CaptivePortalTabHelper::CreateForWebState(web_state);
if (IsPriceNotificationsEnabled()) {
PriceNotificationsTabHelper::CreateForWebState(web_state);
}
}