Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" | 5 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
| 6 | 6 |
| 7 #include "base/utf_string_conversions.h" | |
| 8 | |
| 9 #include "base/command_line.h" | |
| 10 #include "base/lazy_instance.h" | |
| 11 #include "base/stringprintf.h" | 7 #include "base/stringprintf.h" |
| 12 #include "chrome/browser/autocomplete_history_manager.h" | 8 #include "base/string_util.h" |
| 13 #include "chrome/browser/autofill/autofill_external_delegate.h" | |
| 14 #include "chrome/browser/autofill/autofill_manager.h" | |
| 15 #include "chrome/browser/automation/automation_tab_helper.h" | |
| 16 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/browser_process.h" |
| 17 #include "chrome/browser/content_settings/tab_specific_content_settings.h" | |
| 18 #include "chrome/browser/download/download_request_limiter_observer.h" | |
| 19 #include "chrome/browser/extensions/extension_tab_helper.h" | |
| 20 #include "chrome/browser/extensions/extension_webnavigation_api.h" | |
| 21 #include "chrome/browser/external_protocol/external_protocol_observer.h" | |
| 22 #include "chrome/browser/favicon/favicon_tab_helper.h" | |
| 23 #include "chrome/browser/google/google_util.h" | |
| 24 #include "chrome/browser/history/history_tab_helper.h" | |
| 25 #include "chrome/browser/infobars/infobar_tab_helper.h" | |
| 26 #include "chrome/browser/omnibox_search_hint.h" | |
| 27 #include "chrome/browser/password_manager/password_manager.h" | |
| 28 #include "chrome/browser/password_manager_delegate_impl.h" | |
| 29 #include "chrome/browser/pdf_unsupported_feature.h" | |
| 30 #include "chrome/browser/plugin_observer.h" | |
| 31 #include "chrome/browser/prefs/pref_service.h" | 10 #include "chrome/browser/prefs/pref_service.h" |
| 32 #include "chrome/browser/prerender/prerender_tab_helper.h" | 11 #include "chrome/browser/profiles/profile.h" |
| 33 #include "chrome/browser/printing/print_preview_message_handler.h" | |
| 34 #include "chrome/browser/printing/print_view_manager.h" | |
| 35 #include "chrome/browser/renderer_host/web_cache_manager.h" | |
| 36 #include "chrome/browser/renderer_preferences_util.h" | 12 #include "chrome/browser/renderer_preferences_util.h" |
| 37 #include "chrome/browser/sessions/restore_tab_helper.h" | |
| 38 #include "chrome/browser/safe_browsing/client_side_detection_host.h" | |
| 39 #include "chrome/browser/tab_contents/tab_contents_ssl_helper.h" | |
| 40 #include "chrome/browser/tab_contents/thumbnail_generator.h" | |
| 41 #include "chrome/browser/themes/theme_service.h" | 13 #include "chrome/browser/themes/theme_service.h" |
| 42 #include "chrome/browser/themes/theme_service_factory.h" | 14 #include "chrome/browser/themes/theme_service_factory.h" |
| 43 #include "chrome/browser/translate/translate_tab_helper.h" | |
| 44 #include "chrome/browser/ui/blocked_content/blocked_content_tab_helper.h" | |
| 45 #include "chrome/browser/ui/bookmarks/bookmark_tab_helper.h" | |
| 46 #include "chrome/browser/ui/constrained_window_tab_helper.h" | 15 #include "chrome/browser/ui/constrained_window_tab_helper.h" |
| 47 #include "chrome/browser/ui/find_bar/find_tab_helper.h" | 16 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper.h" |
| 48 #include "chrome/browser/ui/intents/web_intent_picker_factory_impl.h" | |
| 49 #include "chrome/browser/ui/intents/web_intent_picker_controller.h" | |
| 50 #include "chrome/browser/ui/sad_tab_observer.h" | |
| 51 #include "chrome/browser/ui/search_engines/search_engine_tab_helper.h" | |
| 52 #include "chrome/browser/ui/sync/tab_contents_wrapper_synced_tab_delegate.h" | |
| 53 #include "chrome/browser/ui/tab_contents/per_tab_prefs_tab_helper.h" | |
| 54 #include "chrome/browser/ui/tab_contents/tab_contents_wrapper_delegate.h" | |
| 55 #include "chrome/common/chrome_notification_types.h" | 17 #include "chrome/common/chrome_notification_types.h" |
| 56 #include "chrome/common/chrome_switches.h" | |
| 57 #include "chrome/common/pref_names.h" | 18 #include "chrome/common/pref_names.h" |
| 58 #include "chrome/common/render_messages.h" | |
| 59 #include "content/browser/renderer_host/render_view_host.h" | 19 #include "content/browser/renderer_host/render_view_host.h" |
| 60 #include "content/browser/tab_contents/tab_contents_view.h" | 20 #include "content/public/browser/notification_details.h" |
| 61 #include "content/public/browser/notification_service.h" | 21 #include "content/public/browser/notification_service.h" |
| 62 #include "grit/generated_resources.h" | |
| 63 #include "grit/locale_settings.h" | 22 #include "grit/locale_settings.h" |
| 64 #include "grit/platform_locale_settings.h" | 23 #include "grit/platform_locale_settings.h" |
| 65 #include "ui/base/l10n/l10n_util.h" | |
| 66 #include "webkit/glue/webpreferences.h" | 24 #include "webkit/glue/webpreferences.h" |
| 67 | 25 |
| 68 namespace { | 26 namespace { |
| 69 | 27 |
| 70 static base::LazyInstance<base::PropertyAccessor<TabContentsWrapper*> > | 28 const char* kPerTabPrefsToObserve[] = { |
| 71 g_tab_contents_wrapper_property_accessor = LAZY_INSTANCE_INITIALIZER; | 29 prefs::kWebKitJavascriptEnabled |
| 30 }; | |
| 31 | |
| 32 const int kPerTabPrefsToObserveLength = arraysize(kPerTabPrefsToObserve); | |
| 33 | |
| 34 void RegisterPerTabUserPrefs(PrefService* prefs) { | |
| 35 WebPreferences pref_defaults; | |
| 36 | |
| 37 prefs->RegisterBooleanPref(prefs::kWebKitJavascriptEnabled, | |
| 38 pref_defaults.javascript_enabled, | |
| 39 PrefService::UNSYNCABLE_PREF); | |
| 40 } | |
| 72 | 41 |
| 73 // The list of prefs we want to observe. | 42 // The list of prefs we want to observe. |
| 74 const char* kPrefsToObserve[] = { | 43 const char* kPrefsToObserve[] = { |
| 75 prefs::kAlternateErrorPagesEnabled, | |
| 76 prefs::kDefaultCharset, | 44 prefs::kDefaultCharset, |
| 77 prefs::kDefaultZoomLevel, | |
| 78 prefs::kEnableReferrers, | 45 prefs::kEnableReferrers, |
| 79 #if defined (ENABLE_SAFE_BROWSING) | |
| 80 prefs::kSafeBrowsingEnabled, | |
| 81 #endif | |
| 82 prefs::kWebKitAllowDisplayingInsecureContent, | 46 prefs::kWebKitAllowDisplayingInsecureContent, |
| 83 prefs::kWebKitAllowRunningInsecureContent, | 47 prefs::kWebKitAllowRunningInsecureContent, |
| 84 prefs::kWebKitCursiveFontFamily, | 48 prefs::kWebKitCursiveFontFamily, |
| 85 prefs::kWebKitDefaultFixedFontSize, | 49 prefs::kWebKitDefaultFixedFontSize, |
| 86 prefs::kWebKitDefaultFontSize, | 50 prefs::kWebKitDefaultFontSize, |
| 87 prefs::kWebKitFantasyFontFamily, | 51 prefs::kWebKitFantasyFontFamily, |
| 88 prefs::kWebKitFixedFontFamily, | 52 prefs::kWebKitFixedFontFamily, |
| 89 prefs::kWebKitGlobalJavascriptEnabled, | 53 prefs::kWebKitGlobalJavascriptEnabled, |
| 90 prefs::kWebKitJavaEnabled, | 54 prefs::kWebKitJavaEnabled, |
| 91 prefs::kWebKitLoadsImagesAutomatically, | 55 prefs::kWebKitLoadsImagesAutomatically, |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 238 #if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN) | 202 #if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN) |
| 239 // To avoid Clang warning, only define kPerScriptFontDefaultsLength when it is | 203 // To avoid Clang warning, only define kPerScriptFontDefaultsLength when it is |
| 240 // non-zero. When it is zero, code like | 204 // non-zero. When it is zero, code like |
| 241 // for (size_t i = 0; i < kPerScriptFontDefaultsLength; ++i) | 205 // for (size_t i = 0; i < kPerScriptFontDefaultsLength; ++i) |
| 242 // causes a warning due to comparison of unsigned expression < 0. | 206 // causes a warning due to comparison of unsigned expression < 0. |
| 243 const size_t kPerScriptFontDefaultsLength = arraysize(kPerScriptFontDefaults); | 207 const size_t kPerScriptFontDefaultsLength = arraysize(kPerScriptFontDefaults); |
| 244 #endif | 208 #endif |
| 245 | 209 |
| 246 } // namespace | 210 } // namespace |
| 247 | 211 |
| 248 //////////////////////////////////////////////////////////////////////////////// | 212 PrefsTabHelper::PrefsTabHelper(TabContentsWrapper* wrapper) |
| 249 // TabContentsWrapper, public: | 213 : TabContentsObserver(wrapper->tab_contents()), |
| 250 | 214 wrapper_(wrapper) { |
| 251 TabContentsWrapper::TabContentsWrapper(TabContents* contents) | 215 PrefService* prefs = wrapper->profile()->GetPrefs(); |
| 252 : TabContentsObserver(contents), | |
| 253 delegate_(NULL), | |
| 254 in_destructor_(false), | |
| 255 tab_contents_(contents) { | |
| 256 DCHECK(contents); | |
| 257 DCHECK(!GetCurrentWrapperForContents(contents)); | |
| 258 // Stash this in the property bag so it can be retrieved without having to | |
| 259 // go to a Browser. | |
| 260 property_accessor()->SetProperty(contents->property_bag(), this); | |
| 261 | |
| 262 // Create the tab helpers. | |
| 263 autocomplete_history_manager_.reset(new AutocompleteHistoryManager(contents)); | |
| 264 autofill_manager_ = new AutofillManager(this); | |
| 265 if (CommandLine::ForCurrentProcess()->HasSwitch( | |
| 266 switches::kExternalAutofillPopup)) { | |
| 267 autofill_external_delegate_.reset( | |
| 268 AutofillExternalDelegate::Create(this, autofill_manager_.get())); | |
| 269 autofill_manager_->SetExternalDelegate(autofill_external_delegate_.get()); | |
| 270 autocomplete_history_manager_->SetExternalDelegate( | |
| 271 autofill_external_delegate_.get()); | |
| 272 } | |
| 273 automation_tab_helper_.reset(new AutomationTabHelper(contents)); | |
| 274 blocked_content_tab_helper_.reset(new BlockedContentTabHelper(this)); | |
| 275 bookmark_tab_helper_.reset(new BookmarkTabHelper(this)); | |
| 276 constrained_window_tab_helper_.reset(new ConstrainedWindowTabHelper(this)); | |
| 277 extension_tab_helper_.reset(new ExtensionTabHelper(this)); | |
| 278 favicon_tab_helper_.reset(new FaviconTabHelper(contents)); | |
| 279 find_tab_helper_.reset(new FindTabHelper(contents)); | |
| 280 history_tab_helper_.reset(new HistoryTabHelper(contents)); | |
| 281 infobar_tab_helper_.reset(new InfoBarTabHelper(contents)); | |
| 282 password_manager_delegate_.reset(new PasswordManagerDelegateImpl(this)); | |
| 283 password_manager_.reset( | |
| 284 new PasswordManager(contents, password_manager_delegate_.get())); | |
| 285 per_tab_prefs_tab_helper_.reset(new PerTabPrefsTabHelper(this)); | |
| 286 prerender_tab_helper_.reset(new prerender::PrerenderTabHelper(this)); | |
| 287 print_view_manager_.reset(new printing::PrintViewManager(this)); | |
| 288 restore_tab_helper_.reset(new RestoreTabHelper(this)); | |
| 289 #if defined(ENABLE_SAFE_BROWSING) | |
| 290 if (profile()->GetPrefs()->GetBoolean(prefs::kSafeBrowsingEnabled) && | |
| 291 g_browser_process->safe_browsing_detection_service()) { | |
| 292 safebrowsing_detection_host_.reset( | |
| 293 safe_browsing::ClientSideDetectionHost::Create(contents)); | |
| 294 } | |
| 295 #endif | |
| 296 search_engine_tab_helper_.reset(new SearchEngineTabHelper(contents)); | |
| 297 ssl_helper_.reset(new TabContentsSSLHelper(this)); | |
| 298 synced_tab_delegate_.reset(new TabContentsWrapperSyncedTabDelegate(this)); | |
| 299 content_settings_.reset(new TabSpecificContentSettings(contents)); | |
| 300 translate_tab_helper_.reset(new TranslateTabHelper(contents)); | |
| 301 web_intent_picker_controller_.reset(new WebIntentPickerController( | |
| 302 this, new WebIntentPickerFactoryImpl())); | |
| 303 | |
| 304 // Create the per-tab observers. | |
| 305 download_request_limiter_observer_.reset( | |
| 306 new DownloadRequestLimiterObserver(contents)); | |
| 307 webnavigation_observer_.reset( | |
| 308 new ExtensionWebNavigationTabObserver(contents)); | |
| 309 external_protocol_observer_.reset(new ExternalProtocolObserver(contents)); | |
| 310 plugin_observer_.reset(new PluginObserver(this)); | |
| 311 print_preview_.reset(new printing::PrintPreviewMessageHandler(contents)); | |
| 312 sad_tab_observer_.reset(new SadTabObserver(contents)); | |
| 313 // Start the in-browser thumbnailing if the feature is enabled. | |
| 314 if (switches::IsInBrowserThumbnailingEnabled()) { | |
| 315 thumbnail_generation_observer_.reset(new ThumbnailGenerator); | |
| 316 thumbnail_generation_observer_->StartThumbnailing(tab_contents_.get()); | |
| 317 } | |
| 318 | |
| 319 // Set-up the showing of the omnibox search infobar if applicable. | |
| 320 if (OmniboxSearchHint::IsEnabled(profile())) | |
| 321 omnibox_search_hint_.reset(new OmniboxSearchHint(this)); | |
| 322 | |
| 323 registrar_.Add(this, chrome::NOTIFICATION_GOOGLE_URL_UPDATED, | |
| 324 content::NotificationService::AllSources()); | |
| 325 registrar_.Add(this, chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED, | |
| 326 content::NotificationService::AllSources()); | |
| 327 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
| 328 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | |
| 329 content::Source<ThemeService>( | |
| 330 ThemeServiceFactory::GetForProfile(profile()))); | |
| 331 #endif | |
| 332 | |
| 333 // Register for notifications about all interested prefs change. | |
| 334 PrefService* prefs = profile()->GetPrefs(); | |
| 335 pref_change_registrar_.Init(prefs); | 216 pref_change_registrar_.Init(prefs); |
| 336 if (prefs) { | 217 if (prefs) { |
| 337 for (int i = 0; i < kPrefsToObserveLength; ++i) | 218 for (int i = 0; i < kPrefsToObserveLength; ++i) |
| 338 pref_change_registrar_.Add(kPrefsToObserve[i], this); | 219 pref_change_registrar_.Add(kPrefsToObserve[i], this); |
| 339 | 220 |
| 340 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 221 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
| 341 prefs::kWebKitStandardFontFamilyMap, this); | 222 prefs::kWebKitStandardFontFamilyMap, this); |
| 342 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 223 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
| 343 prefs::kWebKitFixedFontFamilyMap, this); | 224 prefs::kWebKitFixedFontFamilyMap, this); |
| 344 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 225 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
| 345 prefs::kWebKitSerifFontFamilyMap, this); | 226 prefs::kWebKitSerifFontFamilyMap, this); |
| 346 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 227 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
| 347 prefs::kWebKitSansSerifFontFamilyMap, this); | 228 prefs::kWebKitSansSerifFontFamilyMap, this); |
| 348 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 229 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
| 349 prefs::kWebKitCursiveFontFamilyMap, this); | 230 prefs::kWebKitCursiveFontFamilyMap, this); |
| 350 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 231 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
| 351 prefs::kWebKitFantasyFontFamilyMap, this); | 232 prefs::kWebKitFantasyFontFamilyMap, this); |
| 352 } | 233 } |
| 353 | 234 |
| 235 per_tab_prefs_.reset( | |
| 236 wrapper_->profile()->GetPrefs()->CreatePrefServiceWithPerTabPrefStore()); | |
| 237 RegisterPerTabUserPrefs(per_tab_prefs_.get()); | |
| 238 per_tab_pref_change_registrar_.Init(per_tab_prefs_.get()); | |
| 239 for (int i = 0; i < kPerTabPrefsToObserveLength; ++i) { | |
| 240 per_tab_pref_change_registrar_.Add(kPerTabPrefsToObserve[i], this); | |
| 241 } | |
| 242 | |
| 354 renderer_preferences_util::UpdateFromSystemSettings( | 243 renderer_preferences_util::UpdateFromSystemSettings( |
| 355 tab_contents()->GetMutableRendererPrefs(), profile()); | 244 tab_contents()->GetMutableRendererPrefs(), wrapper->profile()); |
|
mnaganov (inactive)
2011/12/02 20:01:32
nit: Should use wrapper_
| |
| 245 | |
| 246 registrar_.Add(this, chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED, | |
| 247 content::NotificationService::AllSources()); | |
| 248 #if defined(OS_POSIX) && !defined(OS_MACOSX) | |
| 249 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | |
| 250 content::Source<ThemeService>( | |
| 251 ThemeServiceFactory::GetForProfile(wrapper->profile()))); | |
| 252 #endif | |
| 356 } | 253 } |
| 357 | 254 |
| 358 TabContentsWrapper::~TabContentsWrapper() { | 255 PrefsTabHelper::~PrefsTabHelper() { |
| 359 in_destructor_ = true; | |
| 360 | |
| 361 // Need to tear down infobars before the TabContents goes away. | |
| 362 infobar_tab_helper_.reset(); | |
| 363 } | |
| 364 | |
| 365 base::PropertyAccessor<TabContentsWrapper*>* | |
| 366 TabContentsWrapper::property_accessor() { | |
| 367 return g_tab_contents_wrapper_property_accessor.Pointer(); | |
| 368 } | 256 } |
| 369 | 257 |
| 370 // static | 258 // static |
| 371 void TabContentsWrapper::RegisterUserPrefs(PrefService* prefs) { | 259 void PrefsTabHelper::RegisterUserPrefs(PrefService* prefs) { |
| 372 prefs->RegisterBooleanPref(prefs::kAlternateErrorPagesEnabled, | |
| 373 true, | |
| 374 PrefService::SYNCABLE_PREF); | |
| 375 | |
| 376 WebPreferences pref_defaults; | 260 WebPreferences pref_defaults; |
| 377 prefs->RegisterBooleanPref(prefs::kWebKitGlobalJavascriptEnabled, | 261 prefs->RegisterBooleanPref(prefs::kWebKitGlobalJavascriptEnabled, |
| 378 pref_defaults.javascript_enabled, | 262 pref_defaults.javascript_enabled, |
| 379 PrefService::UNSYNCABLE_PREF); | 263 PrefService::UNSYNCABLE_PREF); |
| 380 prefs->RegisterBooleanPref(prefs::kWebKitWebSecurityEnabled, | 264 prefs->RegisterBooleanPref(prefs::kWebKitWebSecurityEnabled, |
| 381 pref_defaults.web_security_enabled, | 265 pref_defaults.web_security_enabled, |
| 382 PrefService::UNSYNCABLE_PREF); | 266 PrefService::UNSYNCABLE_PREF); |
| 383 prefs->RegisterBooleanPref( | 267 prefs->RegisterBooleanPref( |
| 384 prefs::kWebKitJavascriptCanOpenWindowsAutomatically, | 268 prefs::kWebKitJavascriptCanOpenWindowsAutomatically, |
| 385 true, | 269 true, |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 489 IDS_USES_UNIVERSAL_DETECTOR, | 373 IDS_USES_UNIVERSAL_DETECTOR, |
| 490 PrefService::SYNCABLE_PREF); | 374 PrefService::SYNCABLE_PREF); |
| 491 prefs->RegisterLocalizedStringPref(prefs::kStaticEncodings, | 375 prefs->RegisterLocalizedStringPref(prefs::kStaticEncodings, |
| 492 IDS_STATIC_ENCODING_LIST, | 376 IDS_STATIC_ENCODING_LIST, |
| 493 PrefService::UNSYNCABLE_PREF); | 377 PrefService::UNSYNCABLE_PREF); |
| 494 prefs->RegisterStringPref(prefs::kRecentlySelectedEncoding, | 378 prefs->RegisterStringPref(prefs::kRecentlySelectedEncoding, |
| 495 "", | 379 "", |
| 496 PrefService::UNSYNCABLE_PREF); | 380 PrefService::UNSYNCABLE_PREF); |
| 497 } | 381 } |
| 498 | 382 |
| 499 string16 TabContentsWrapper::GetDefaultTitle() { | 383 void PrefsTabHelper::OverrideWebPreferences(WebPreferences* prefs) { |
| 500 return l10n_util::GetStringUTF16(IDS_DEFAULT_TAB_TITLE); | 384 prefs->javascript_enabled = |
| 385 per_tab_prefs_->GetBoolean(prefs::kWebKitJavascriptEnabled); | |
| 501 } | 386 } |
| 502 | 387 |
| 503 string16 TabContentsWrapper::GetStatusText() const { | 388 void PrefsTabHelper::RenderViewCreated(RenderViewHost* render_view_host) { |
| 504 if (!tab_contents()->IsLoading() || | 389 UpdateWebPreferences(); |
| 505 tab_contents()->load_state().state == net::LOAD_STATE_IDLE) { | |
| 506 return string16(); | |
| 507 } | |
| 508 | |
| 509 switch (tab_contents()->load_state().state) { | |
| 510 case net::LOAD_STATE_WAITING_FOR_DELEGATE: | |
| 511 return l10n_util::GetStringFUTF16(IDS_LOAD_STATE_WAITING_FOR_DELEGATE, | |
| 512 tab_contents()->load_state().param); | |
| 513 case net::LOAD_STATE_WAITING_FOR_CACHE: | |
| 514 return l10n_util::GetStringUTF16(IDS_LOAD_STATE_WAITING_FOR_CACHE); | |
| 515 case net::LOAD_STATE_WAITING_FOR_APPCACHE: | |
| 516 return l10n_util::GetStringUTF16(IDS_LOAD_STATE_WAITING_FOR_APPCACHE); | |
| 517 case net::LOAD_STATE_ESTABLISHING_PROXY_TUNNEL: | |
| 518 return | |
| 519 l10n_util::GetStringUTF16(IDS_LOAD_STATE_ESTABLISHING_PROXY_TUNNEL); | |
| 520 case net::LOAD_STATE_RESOLVING_PROXY_FOR_URL: | |
| 521 return l10n_util::GetStringUTF16(IDS_LOAD_STATE_RESOLVING_PROXY_FOR_URL); | |
| 522 case net::LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT: | |
| 523 return l10n_util::GetStringUTF16( | |
| 524 IDS_LOAD_STATE_RESOLVING_HOST_IN_PROXY_SCRIPT); | |
| 525 case net::LOAD_STATE_RESOLVING_HOST: | |
| 526 return l10n_util::GetStringUTF16(IDS_LOAD_STATE_RESOLVING_HOST); | |
| 527 case net::LOAD_STATE_CONNECTING: | |
| 528 return l10n_util::GetStringUTF16(IDS_LOAD_STATE_CONNECTING); | |
| 529 case net::LOAD_STATE_SSL_HANDSHAKE: | |
| 530 return l10n_util::GetStringUTF16(IDS_LOAD_STATE_SSL_HANDSHAKE); | |
| 531 case net::LOAD_STATE_SENDING_REQUEST: | |
| 532 if (tab_contents()->upload_size()) | |
| 533 return l10n_util::GetStringFUTF16Int( | |
| 534 IDS_LOAD_STATE_SENDING_REQUEST_WITH_PROGRESS, | |
| 535 static_cast<int>((100 * tab_contents()->upload_position()) / | |
| 536 tab_contents()->upload_size())); | |
| 537 else | |
| 538 return l10n_util::GetStringUTF16(IDS_LOAD_STATE_SENDING_REQUEST); | |
| 539 case net::LOAD_STATE_WAITING_FOR_RESPONSE: | |
| 540 return l10n_util::GetStringFUTF16(IDS_LOAD_STATE_WAITING_FOR_RESPONSE, | |
| 541 tab_contents()->load_state_host()); | |
| 542 // Ignore net::LOAD_STATE_READING_RESPONSE and net::LOAD_STATE_IDLE | |
| 543 case net::LOAD_STATE_IDLE: | |
| 544 case net::LOAD_STATE_READING_RESPONSE: | |
| 545 break; | |
| 546 } | |
| 547 | |
| 548 return string16(); | |
| 549 } | 390 } |
| 550 | 391 |
| 551 TabContentsWrapper* TabContentsWrapper::Clone() { | 392 void PrefsTabHelper::TabContentsDestroyed(TabContents* tab) { |
| 552 TabContents* new_contents = tab_contents()->Clone(); | 393 per_tab_pref_change_registrar_.RemoveAll(); |
| 553 TabContentsWrapper* new_wrapper = new TabContentsWrapper(new_contents); | |
| 554 | |
| 555 new_wrapper->extension_tab_helper()->CopyStateFrom( | |
| 556 *extension_tab_helper_.get()); | |
| 557 return new_wrapper; | |
| 558 } | 394 } |
| 559 | 395 |
| 560 void TabContentsWrapper::CaptureSnapshot() { | 396 void PrefsTabHelper::Observe(int type, |
| 561 Send(new ChromeViewMsg_CaptureSnapshot(routing_id())); | 397 const content::NotificationSource& source, |
| 562 } | 398 const content::NotificationDetails& details) { |
| 563 | |
| 564 // static | |
| 565 TabContentsWrapper* TabContentsWrapper::GetCurrentWrapperForContents( | |
| 566 TabContents* contents) { | |
| 567 TabContentsWrapper** wrapper = | |
| 568 property_accessor()->GetProperty(contents->property_bag()); | |
| 569 | |
| 570 return wrapper ? *wrapper : NULL; | |
| 571 } | |
| 572 | |
| 573 // static | |
| 574 const TabContentsWrapper* TabContentsWrapper::GetCurrentWrapperForContents( | |
| 575 const TabContents* contents) { | |
| 576 TabContentsWrapper* const* wrapper = | |
| 577 property_accessor()->GetProperty(contents->property_bag()); | |
| 578 | |
| 579 return wrapper ? *wrapper : NULL; | |
| 580 } | |
| 581 | |
| 582 Profile* TabContentsWrapper::profile() const { | |
| 583 return Profile::FromBrowserContext(tab_contents()->browser_context()); | |
| 584 } | |
| 585 | |
| 586 //////////////////////////////////////////////////////////////////////////////// | |
| 587 // TabContentsWrapper implementation: | |
| 588 | |
| 589 void TabContentsWrapper::RenderViewCreated(RenderViewHost* render_view_host) { | |
| 590 UpdateAlternateErrorPageURL(render_view_host); | |
| 591 } | |
| 592 | |
| 593 void TabContentsWrapper::DidBecomeSelected() { | |
| 594 WebCacheManager::GetInstance()->ObserveActivity( | |
| 595 tab_contents()->GetRenderProcessHost()->GetID()); | |
| 596 } | |
| 597 | |
| 598 bool TabContentsWrapper::OnMessageReceived(const IPC::Message& message) { | |
| 599 bool handled = true; | |
| 600 IPC_BEGIN_MESSAGE_MAP(TabContentsWrapper, message) | |
| 601 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_Snapshot, OnSnapshot) | |
| 602 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_PDFHasUnsupportedFeature, | |
| 603 OnPDFHasUnsupportedFeature) | |
| 604 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 605 IPC_END_MESSAGE_MAP() | |
| 606 return handled; | |
| 607 } | |
| 608 | |
| 609 void TabContentsWrapper::TabContentsDestroyed(TabContents* tab) { | |
| 610 // Destruction of the TabContents should only be done by us from our | |
| 611 // destructor. Otherwise it's very likely we (or one of the helpers we own) | |
| 612 // will attempt to access the TabContents and we'll crash. | |
| 613 DCHECK(in_destructor_); | |
| 614 } | |
| 615 | |
| 616 void TabContentsWrapper::Observe(int type, | |
| 617 const content::NotificationSource& source, | |
| 618 const content::NotificationDetails& details) { | |
| 619 switch (type) { | 399 switch (type) { |
| 620 case chrome::NOTIFICATION_GOOGLE_URL_UPDATED: | |
| 621 UpdateAlternateErrorPageURL(render_view_host()); | |
| 622 break; | |
| 623 case chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED: | 400 case chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED: |
| 624 UpdateWebPreferences(); | 401 UpdateWebPreferences(); |
| 625 break; | 402 break; |
| 626 #if defined(OS_POSIX) && !defined(OS_MACOSX) | 403 #if defined(OS_POSIX) && !defined(OS_MACOSX) |
| 627 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: { | 404 case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: { |
| 628 UpdateRendererPreferences(); | 405 UpdateRendererPreferences(); |
| 629 break; | 406 break; |
| 630 } | 407 } |
| 631 #endif | 408 #endif |
| 632 case chrome::NOTIFICATION_PREF_CHANGED: { | 409 case chrome::NOTIFICATION_PREF_CHANGED: { |
| 633 std::string* pref_name_in = content::Details<std::string>(details).ptr(); | 410 std::string* pref_name_in = content::Details<std::string>(details).ptr(); |
| 634 DCHECK(content::Source<PrefService>(source).ptr() == | 411 DCHECK(content::Source<PrefService>(source).ptr() == |
| 635 profile()->GetPrefs() || | 412 wrapper_->profile()->GetPrefs() || |
| 636 content::Source<PrefService>(source).ptr() == | 413 content::Source<PrefService>(source).ptr() == per_tab_prefs_); |
| 637 per_tab_prefs_tab_helper_->prefs()); | 414 if ((*pref_name_in == prefs::kDefaultCharset) || |
| 638 if (*pref_name_in == prefs::kAlternateErrorPagesEnabled) { | 415 StartsWithASCII(*pref_name_in, "webkit.webprefs.", true)) { |
| 639 UpdateAlternateErrorPageURL(render_view_host()); | |
| 640 } else if ((*pref_name_in == prefs::kDefaultCharset) || | |
| 641 StartsWithASCII(*pref_name_in, "webkit.webprefs.", true)) { | |
| 642 UpdateWebPreferences(); | 416 UpdateWebPreferences(); |
| 643 } else if (*pref_name_in == prefs::kDefaultZoomLevel) { | |
| 644 tab_contents()->render_view_host()->SetZoomLevel( | |
| 645 tab_contents()->GetZoomLevel()); | |
| 646 } else if (*pref_name_in == prefs::kEnableReferrers) { | 417 } else if (*pref_name_in == prefs::kEnableReferrers) { |
| 647 UpdateRendererPreferences(); | 418 UpdateRendererPreferences(); |
| 648 } else if (*pref_name_in == prefs::kSafeBrowsingEnabled) { | |
| 649 UpdateSafebrowsingDetectionHost(); | |
| 650 } else { | 419 } else { |
| 651 NOTREACHED() << "unexpected pref change notification" << *pref_name_in; | 420 NOTREACHED() << "unexpected pref change notification" << *pref_name_in; |
| 652 } | 421 } |
| 653 break; | 422 break; |
| 654 } | 423 } |
| 655 default: | 424 default: |
| 656 NOTREACHED(); | 425 NOTREACHED(); |
| 657 } | 426 } |
| 658 } | 427 } |
| 659 | 428 |
| 660 //////////////////////////////////////////////////////////////////////////////// | 429 void PrefsTabHelper::UpdateWebPreferences() { |
| 661 // Internal helpers | |
| 662 | |
| 663 void TabContentsWrapper::OnSnapshot(const SkBitmap& bitmap) { | |
| 664 content::NotificationService::current()->Notify( | |
| 665 chrome::NOTIFICATION_TAB_SNAPSHOT_TAKEN, | |
| 666 content::Source<TabContentsWrapper>(this), | |
| 667 content::Details<const SkBitmap>(&bitmap)); | |
| 668 } | |
| 669 | |
| 670 void TabContentsWrapper::OnPDFHasUnsupportedFeature() { | |
| 671 PDFHasUnsupportedFeature(this); | |
| 672 } | |
| 673 | |
| 674 GURL TabContentsWrapper::GetAlternateErrorPageURL() const { | |
| 675 GURL url; | |
| 676 // Disable alternate error pages when in Incognito mode. | |
| 677 if (profile()->IsOffTheRecord()) | |
| 678 return url; | |
| 679 | |
| 680 PrefService* prefs = profile()->GetPrefs(); | |
| 681 if (prefs->GetBoolean(prefs::kAlternateErrorPagesEnabled)) { | |
| 682 url = google_util::AppendGoogleLocaleParam( | |
| 683 GURL(google_util::kLinkDoctorBaseURL)); | |
| 684 url = google_util::AppendGoogleTLDParam(url); | |
| 685 } | |
| 686 return url; | |
| 687 } | |
| 688 | |
| 689 void TabContentsWrapper::UpdateAlternateErrorPageURL(RenderViewHost* rvh) { | |
| 690 rvh->SetAltErrorPageURL(GetAlternateErrorPageURL()); | |
| 691 } | |
| 692 | |
| 693 void TabContentsWrapper::UpdateWebPreferences() { | |
| 694 RenderViewHostDelegate* rvhd = tab_contents(); | 430 RenderViewHostDelegate* rvhd = tab_contents(); |
| 695 WebPreferences prefs = rvhd->GetWebkitPrefs(); | 431 WebPreferences prefs = rvhd->GetWebkitPrefs(); |
| 696 per_tab_prefs_tab_helper_->OverrideWebPreferences(&prefs); | 432 OverrideWebPreferences(&prefs); |
| 697 tab_contents()->render_view_host()->UpdateWebkitPreferences(prefs); | 433 tab_contents()->render_view_host()->UpdateWebkitPreferences(prefs); |
| 698 } | 434 } |
| 699 | 435 |
| 700 void TabContentsWrapper::UpdateRendererPreferences() { | 436 void PrefsTabHelper::UpdateRendererPreferences() { |
| 701 renderer_preferences_util::UpdateFromSystemSettings( | 437 renderer_preferences_util::UpdateFromSystemSettings( |
| 702 tab_contents()->GetMutableRendererPrefs(), profile()); | 438 tab_contents()->GetMutableRendererPrefs(), wrapper_->profile()); |
| 703 render_view_host()->SyncRendererPrefs(); | 439 tab_contents()->render_view_host()->SyncRendererPrefs(); |
| 704 } | 440 } |
| 705 | |
| 706 void TabContentsWrapper::UpdateSafebrowsingDetectionHost() { | |
| 707 #if defined(ENABLE_SAFE_BROWSING) | |
| 708 PrefService* prefs = profile()->GetPrefs(); | |
| 709 bool safe_browsing = prefs->GetBoolean(prefs::kSafeBrowsingEnabled); | |
| 710 if (safe_browsing && | |
| 711 g_browser_process->safe_browsing_detection_service()) { | |
| 712 if (!safebrowsing_detection_host_.get()) { | |
| 713 safebrowsing_detection_host_.reset( | |
| 714 safe_browsing::ClientSideDetectionHost::Create(tab_contents())); | |
| 715 } | |
| 716 } else { | |
| 717 safebrowsing_detection_host_.reset(); | |
| 718 } | |
| 719 render_view_host()->Send( | |
| 720 new ChromeViewMsg_SetClientSidePhishingDetection(routing_id(), | |
| 721 safe_browsing)); | |
| 722 #endif | |
| 723 } | |
| 724 | |
| 725 void TabContentsWrapper::ExitFullscreenMode() { | |
| 726 if (tab_contents() && render_view_host()) | |
| 727 tab_contents()->render_view_host()->ExitFullscreen(); | |
| 728 } | |
| OLD | NEW |