1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/browser_tab_contents.h" 6 7 #include "base/command_line.h" 8 #include "chrome/browser/browser_process.h" 9 #include "chrome/browser/content_settings/tab_specific_content_settings.h" 10 #include "chrome/browser/extensions/api/web_navigation/web_navigation_api.h" 11 #include "chrome/browser/extensions/tab_helper.h" 12 #include "chrome/browser/external_protocol/external_protocol_observer.h" 13 #include "chrome/browser/favicon/favicon_tab_helper.h" 14 #include "chrome/browser/history/history_tab_helper.h" 15 #include "chrome/browser/infobars/infobar_service.h" 16 #include "chrome/browser/managed_mode/managed_mode_navigation_observer.h" 17 #include "chrome/browser/net/load_time_stats.h" 18 #include "chrome/browser/net/net_error_tab_helper.h" 19 #include "chrome/browser/net/predictor_tab_helper.h" 20 #include "chrome/browser/password_manager/password_generation_manager.h" 21 #include "chrome/browser/password_manager/password_manager.h" 22 #include "chrome/browser/password_manager/password_manager_delegate_impl.h" 23 #include "chrome/browser/plugins/plugin_observer.h" 24 #include "chrome/browser/prerender/prerender_tab_helper.h" 25 #include "chrome/browser/profiles/profile.h" 26 #include "chrome/browser/safe_browsing/safe_browsing_tab_observer.h" 27 #include "chrome/browser/sessions/session_tab_helper.h" 28 #include "chrome/browser/ssl/ssl_tab_helper.h" 29 #include "chrome/browser/tab_contents/navigation_metrics_recorder.h" 30 #include "chrome/browser/thumbnails/thumbnail_tab_helper.h" 31 #include "chrome/browser/translate/translate_tab_helper.h" 32 #include "chrome/browser/ui/alternate_error_tab_observer.h" 33 #include "chrome/browser/ui/autofill/tab_autofill_manager_delegate.h" 34 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" 35 #include "chrome/browser/ui/blocked_content/popup_blocker_tab_helper.h" 36 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" 37 #include "chrome/browser/ui/find_bar/find_tab_helper.h" 38 #include "chrome/browser/ui/hung_plugin_tab_helper.h" 39 #include "chrome/browser/ui/pdf/pdf_tab_helper.h" 40 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" 41 #include "chrome/browser/ui/sad_tab_helper.h" 42 #include "chrome/browser/ui/search/search_tab_helper.h" 43 #include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" 44 #include "chrome/browser/ui/sync/tab_contents_synced_tab_delegate.h" 45 #include "chrome/browser/ui/tab_contents/core_tab_helper.h" 46 #include "chrome/browser/ui/zoom/zoom_controller.h" 47 #include "chrome/common/chrome_switches.h" 48 #include "components/autofill/content/browser/autofill_driver_impl.h" 49 #include "components/autofill/core/browser/autofill_manager.h" 50 #include "components/web_modal/web_contents_modal_dialog_manager.h" 51 #include "content/public/browser/web_contents.h" 52 #include "extensions/browser/view_type_utils.h" 53 54 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 55 #include "chrome/browser/captive_portal/captive_portal_tab_helper.h" 56 #endif 57 58 #if defined(ENABLE_PRINTING) 59 #if defined(ENABLE_FULL_PRINTING) 60 #include "chrome/browser/printing/print_preview_message_handler.h" 61 #include "chrome/browser/printing/print_view_manager.h" 62 #else 63 #include "chrome/browser/printing/print_view_manager_basic.h" 64 #endif // defined(ENABLE_FULL_PRINTING) 65 #endif // defined(ENABLE_PRINTING) 66 67 #if defined(ENABLE_ONE_CLICK_SIGNIN) 68 #include "chrome/browser/ui/sync/one_click_signin_helper.h" 69 #endif 70 71 #if defined(OS_WIN) 72 #include "chrome/browser/ui/metro_pin_tab_helper_win.h" 73 #endif 74 75 using autofill::AutofillDriverImpl; 76 using autofill::AutofillManager; 77 using autofill::TabAutofillManagerDelegate; 78 using content::WebContents; 79 using web_modal::WebContentsModalDialogManager; 80 81 namespace { 82 83 const char kTabContentsAttachedTabHelpersUserDataKey[] = 84 "TabContentsAttachedTabHelpers"; 85 86 } // namespace 87 88 // static 89 void BrowserTabContents::AttachTabHelpers(WebContents* web_contents) { 90 // If already adopted, nothing to be done. 91 base::SupportsUserData::Data* adoption_tag = 92 web_contents->GetUserData(&kTabContentsAttachedTabHelpersUserDataKey); 93 if (adoption_tag) 94 return; 95 96 // Mark as adopted. 97 web_contents->SetUserData(&kTabContentsAttachedTabHelpersUserDataKey, 98 new base::SupportsUserData::Data()); 99 100 // Set the view type. 101 extensions::SetViewType(web_contents, extensions::VIEW_TYPE_TAB_CONTENTS); 102 103 // Create all the tab helpers. 104 105 Profile* profile = 106 Profile::FromBrowserContext(web_contents->GetBrowserContext()); 107 108 // SessionTabHelper comes first because it sets up the tab ID, and other 109 // helpers may rely on that. 110 SessionTabHelper::CreateForWebContents(web_contents); 111 112 AlternateErrorPageTabObserver::CreateForWebContents(web_contents); 113 TabAutofillManagerDelegate::CreateForWebContents(web_contents); 114 AutofillDriverImpl::CreateForWebContentsAndDelegate( 115 web_contents, 116 TabAutofillManagerDelegate::FromWebContents(web_contents), 117 g_browser_process->GetApplicationLocale(), 118 AutofillManager::ENABLE_AUTOFILL_DOWNLOAD_MANAGER); 119 BlockedContentTabHelper::CreateForWebContents(web_contents); 120 BookmarkTabHelper::CreateForWebContents(web_contents); 121 chrome_browser_net::LoadTimeStatsTabHelper::CreateForWebContents( 122 web_contents); 123 chrome_browser_net::NetErrorTabHelper::CreateForWebContents(web_contents); 124 chrome_browser_net::PredictorTabHelper::CreateForWebContents(web_contents); 125 WebContentsModalDialogManager::CreateForWebContents(web_contents); 126 CoreTabHelper::CreateForWebContents(web_contents); 127 extensions::TabHelper::CreateForWebContents(web_contents); 128 extensions::WebNavigationTabObserver::CreateForWebContents(web_contents); 129 ExternalProtocolObserver::CreateForWebContents(web_contents); 130 FaviconTabHelper::CreateForWebContents(web_contents); 131 FindTabHelper::CreateForWebContents(web_contents); 132 HistoryTabHelper::CreateForWebContents(web_contents); 133 HungPluginTabHelper::CreateForWebContents(web_contents); 134 InfoBarService::CreateForWebContents(web_contents); 135 NavigationMetricsRecorder::CreateForWebContents(web_contents); 136 PasswordGenerationManager::CreateForWebContents(web_contents); 137 PasswordManagerDelegateImpl::CreateForWebContents(web_contents); 138 PasswordManager::CreateForWebContentsAndDelegate( 139 web_contents, PasswordManagerDelegateImpl::FromWebContents(web_contents)); 140 PDFTabHelper::CreateForWebContents(web_contents); 141 PluginObserver::CreateForWebContents(web_contents); 142 if (!CommandLine::ForCurrentProcess()->HasSwitch( 143 switches::kDisableBetterPopupBlocking)) { 144 PopupBlockerTabHelper::CreateForWebContents(web_contents); 145 } 146 PrefsTabHelper::CreateForWebContents(web_contents); 147 prerender::PrerenderTabHelper::CreateForWebContents(web_contents); 148 SadTabHelper::CreateForWebContents(web_contents); 149 safe_browsing::SafeBrowsingTabObserver::CreateForWebContents(web_contents); 150 SearchEngineTabHelper::CreateForWebContents(web_contents); 151 SearchTabHelper::CreateForWebContents(web_contents); 152 SSLTabHelper::CreateForWebContents(web_contents); 153 TabContentsSyncedTabDelegate::CreateForWebContents(web_contents); 154 TabSpecificContentSettings::CreateForWebContents(web_contents); 155 ThumbnailTabHelper::CreateForWebContents(web_contents); 156 TranslateTabHelper::CreateForWebContents(web_contents); 157 ZoomController::CreateForWebContents(web_contents); 158 159 #if defined(ENABLE_CAPTIVE_PORTAL_DETECTION) 160 captive_portal::CaptivePortalTabHelper::CreateForWebContents(web_contents); 161 #endif 162 163 if (profile->IsManaged()) { 164 ManagedModeNavigationObserver::CreateForWebContents(web_contents); 165 } 166 167 #if defined(ENABLE_PRINTING) 168 #if defined(ENABLE_FULL_PRINTING) 169 printing::PrintViewManager::CreateForWebContents(web_contents); 170 printing::PrintPreviewMessageHandler::CreateForWebContents(web_contents); 171 #else 172 printing::PrintViewManagerBasic::CreateForWebContents(web_contents); 173 #endif // defined(ENABLE_FULL_PRINTING) 174 #endif // defined(ENABLE_PRINTING) 175 176 #if defined(ENABLE_ONE_CLICK_SIGNIN) 177 // If this is not an incognito window, setup to handle one-click login. 178 // We don't want to check that the profile is already connected at this time 179 // because the connected state may change while this tab is open. Having a 180 // one-click signin helper attached does not cause problems if the profile 181 // happens to be already connected. 182 if (OneClickSigninHelper::CanOffer(web_contents, 183 OneClickSigninHelper::CAN_OFFER_FOR_ALL, 184 std::string(), 185 NULL)) { 186 OneClickSigninHelper::CreateForWebContents(web_contents); 187 } 188 #endif 189 190 #if defined(OS_WIN) 191 MetroPinTabHelper::CreateForWebContents(web_contents); 192 #endif 193 } 194