OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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/prefs/prefs_tab_helper.h" | 5 #include "chrome/browser/ui/prefs/prefs_tab_helper.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/prefs/overlay_user_pref_store.h" | 9 #include "base/prefs/overlay_user_pref_store.h" |
10 #include "base/prefs/pref_service.h" | 10 #include "base/prefs/pref_service.h" |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
42 using content::WebContents; | 42 using content::WebContents; |
43 using content::WebPreferences; | 43 using content::WebPreferences; |
44 | 44 |
45 DEFINE_WEB_CONTENTS_USER_DATA_KEY(PrefsTabHelper); | 45 DEFINE_WEB_CONTENTS_USER_DATA_KEY(PrefsTabHelper); |
46 | 46 |
47 namespace { | 47 namespace { |
48 | 48 |
49 // The list of prefs we want to observe. | 49 // The list of prefs we want to observe. |
50 const char* kPrefsToObserve[] = { | 50 const char* kPrefsToObserve[] = { |
51 prefs::kDefaultCharset, | 51 prefs::kDefaultCharset, |
52 prefs::kDisable3DAPIs, | |
53 prefs::kEnableHyperlinkAuditing, | |
54 prefs::kWebKitAllowDisplayingInsecureContent, | 52 prefs::kWebKitAllowDisplayingInsecureContent, |
55 prefs::kWebKitAllowRunningInsecureContent, | 53 prefs::kWebKitAllowRunningInsecureContent, |
56 prefs::kWebKitDefaultFixedFontSize, | 54 prefs::kWebKitDefaultFixedFontSize, |
57 prefs::kWebKitDefaultFontSize, | 55 prefs::kWebKitDefaultFontSize, |
58 prefs::kWebKitDomPasteEnabled, | |
59 #if defined(OS_ANDROID) | 56 #if defined(OS_ANDROID) |
60 prefs::kWebKitFontScaleFactor, | 57 prefs::kWebKitFontScaleFactor, |
61 prefs::kWebKitForceEnableZoom, | 58 prefs::kWebKitForceEnableZoom, |
62 prefs::kWebKitPasswordEchoEnabled, | 59 prefs::kWebKitPasswordEchoEnabled, |
63 #endif | 60 #endif |
64 prefs::kWebKitInspectorSettings, | |
65 prefs::kWebKitJavascriptCanOpenWindowsAutomatically, | |
66 prefs::kWebKitJavascriptEnabled, | 61 prefs::kWebKitJavascriptEnabled, |
67 prefs::kWebKitJavaEnabled, | 62 prefs::kWebKitJavaEnabled, |
68 prefs::kWebKitLoadsImagesAutomatically, | 63 prefs::kWebKitLoadsImagesAutomatically, |
69 prefs::kWebKitMinimumFontSize, | 64 prefs::kWebKitMinimumFontSize, |
70 prefs::kWebKitMinimumLogicalFontSize, | 65 prefs::kWebKitMinimumLogicalFontSize, |
71 prefs::kWebKitPluginsEnabled, | 66 prefs::kWebKitPluginsEnabled, |
72 prefs::kWebKitShrinksStandaloneImagesToFit, | |
73 prefs::kWebkitTabsToLinks, | 67 prefs::kWebkitTabsToLinks, |
74 prefs::kWebKitTextAreasAreResizable, | 68 prefs::kWebKitUsesUniversalDetector |
75 prefs::kWebKitUsesUniversalDetector, | |
76 prefs::kWebKitWebSecurityEnabled, | |
77 }; | 69 }; |
78 | 70 |
79 const int kPrefsToObserveLength = arraysize(kPrefsToObserve); | 71 const int kPrefsToObserveLength = arraysize(kPrefsToObserve); |
80 | 72 |
81 #if !defined(OS_ANDROID) | 73 #if !defined(OS_ANDROID) |
82 // Registers a preference under the path |pref_name| for each script used for | 74 // Registers a preference under the path |pref_name| for each script used for |
83 // per-script font prefs. | 75 // per-script font prefs. |
84 // For example, for WEBKIT_WEBPREFS_FONTS_SERIF ("fonts.serif"): | 76 // For example, for WEBKIT_WEBPREFS_FONTS_SERIF ("fonts.serif"): |
85 // "fonts.serif.Arab", "fonts.serif.Hang", etc. are registered. | 77 // "fonts.serif.Arab", "fonts.serif.Hang", etc. are registered. |
86 // |fonts_with_defaults| contains all |pref_names| already registered since they | 78 // |fonts_with_defaults| contains all |pref_names| already registered since they |
(...skipping 26 matching lines...) Expand all Loading... |
113 if (fonts_with_defaults.find(pref_name) == fonts_with_defaults.end()) { | 105 if (fonts_with_defaults.find(pref_name) == fonts_with_defaults.end()) { |
114 // We haven't already set a default value for this font preference, so set | 106 // We haven't already set a default value for this font preference, so set |
115 // an empty string as the default. | 107 // an empty string as the default. |
116 registry->RegisterStringPref( | 108 registry->RegisterStringPref( |
117 pref_name, | 109 pref_name, |
118 std::string(), | 110 std::string(), |
119 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 111 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); |
120 } | 112 } |
121 } | 113 } |
122 } | 114 } |
123 #endif // !defined(OS_ANDROID) | |
124 | 115 |
125 // Registers |obs| to observe per-script font prefs under the path |map_name|. | 116 // Registers |obs| to observe per-script font prefs under the path |map_name|. |
126 // On android, there's no exposed way to change these prefs, so we can save | 117 // On android, there's no exposed way to change these prefs, so we can save |
127 // ~715KB of heap and some startup cycles by avoiding observing these prefs | 118 // ~715KB of heap and some startup cycles by avoiding observing these prefs |
128 // since they will never change. | 119 // since they will never change. |
129 void RegisterFontFamilyMapObserver( | 120 void RegisterFontFamilyMapObserver( |
130 PrefChangeRegistrar* registrar, | 121 PrefChangeRegistrar* registrar, |
131 const char* map_name, | 122 const char* map_name, |
132 const PrefChangeRegistrar::NamedChangeCallback& obs) { | 123 const PrefChangeRegistrar::NamedChangeCallback& obs) { |
133 DCHECK(StartsWithASCII(map_name, "webkit.webprefs.", true)); | 124 DCHECK(StartsWithASCII(map_name, "webkit.webprefs.", true)); |
134 for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) { | 125 for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) { |
135 const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i]; | 126 const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i]; |
136 std::string pref_name = base::StringPrintf("%s.%s", map_name, script); | 127 std::string pref_name = base::StringPrintf("%s.%s", map_name, script); |
137 registrar->Add(pref_name.c_str(), obs); | 128 registrar->Add(pref_name.c_str(), obs); |
138 } | 129 } |
139 } | 130 } |
| 131 #endif // !defined(OS_ANDROID) |
140 | 132 |
141 #if defined(OS_WIN) | 133 #if defined(OS_WIN) |
142 // On Windows with antialising we want to use an alternate fixed font like | 134 // On Windows with antialising we want to use an alternate fixed font like |
143 // Consolas, which looks much better than Courier New. | 135 // Consolas, which looks much better than Courier New. |
144 bool ShouldUseAlternateDefaultFixedFont(const std::string& script) { | 136 bool ShouldUseAlternateDefaultFixedFont(const std::string& script) { |
145 if (!StartsWithASCII(script, "courier", false)) | 137 if (!StartsWithASCII(script, "courier", false)) |
146 return false; | 138 return false; |
147 UINT smooth_type = 0; | 139 UINT smooth_type = 0; |
148 SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smooth_type, 0); | 140 SystemParametersInfo(SPI_GETFONTSMOOTHINGTYPE, 0, &smooth_type, 0); |
149 return (base::win::GetVersion() >= base::win::VERSION_WIN7) && | 141 return (base::win::GetVersion() >= base::win::VERSION_WIN7) && |
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
327 pref_change_registrar_.Add(prefs::kEnableReferrers, renderer_callback); | 319 pref_change_registrar_.Add(prefs::kEnableReferrers, renderer_callback); |
328 | 320 |
329 #if !defined(OS_MACOSX) | 321 #if !defined(OS_MACOSX) |
330 pref_change_registrar_.Add(prefs::kFullscreenAllowed, renderer_callback); | 322 pref_change_registrar_.Add(prefs::kFullscreenAllowed, renderer_callback); |
331 #endif | 323 #endif |
332 | 324 |
333 PrefChangeRegistrar::NamedChangeCallback webkit_callback = base::Bind( | 325 PrefChangeRegistrar::NamedChangeCallback webkit_callback = base::Bind( |
334 &PrefsTabHelper::OnWebPrefChanged, base::Unretained(this)); | 326 &PrefsTabHelper::OnWebPrefChanged, base::Unretained(this)); |
335 for (int i = 0; i < kPrefsToObserveLength; ++i) { | 327 for (int i = 0; i < kPrefsToObserveLength; ++i) { |
336 const char* pref_name = kPrefsToObserve[i]; | 328 const char* pref_name = kPrefsToObserve[i]; |
| 329 DCHECK(std::string(pref_name) == prefs::kDefaultCharset || |
| 330 StartsWithASCII(pref_name, "webkit.webprefs.", true)); |
337 pref_change_registrar_.Add(pref_name, webkit_callback); | 331 pref_change_registrar_.Add(pref_name, webkit_callback); |
338 } | 332 } |
339 | 333 |
| 334 #if !defined(OS_ANDROID) |
340 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 335 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
341 prefs::kWebKitStandardFontFamilyMap, | 336 prefs::kWebKitStandardFontFamilyMap, |
342 webkit_callback); | 337 webkit_callback); |
343 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 338 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
344 prefs::kWebKitFixedFontFamilyMap, | 339 prefs::kWebKitFixedFontFamilyMap, |
345 webkit_callback); | 340 webkit_callback); |
346 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 341 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
347 prefs::kWebKitSerifFontFamilyMap, | 342 prefs::kWebKitSerifFontFamilyMap, |
348 webkit_callback); | 343 webkit_callback); |
349 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 344 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
350 prefs::kWebKitSansSerifFontFamilyMap, | 345 prefs::kWebKitSansSerifFontFamilyMap, |
351 webkit_callback); | 346 webkit_callback); |
352 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 347 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
353 prefs::kWebKitCursiveFontFamilyMap, | 348 prefs::kWebKitCursiveFontFamilyMap, |
354 webkit_callback); | 349 webkit_callback); |
355 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 350 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
356 prefs::kWebKitFantasyFontFamilyMap, | 351 prefs::kWebKitFantasyFontFamilyMap, |
357 webkit_callback); | 352 webkit_callback); |
358 RegisterFontFamilyMapObserver(&pref_change_registrar_, | 353 RegisterFontFamilyMapObserver(&pref_change_registrar_, |
359 prefs::kWebKitPictographFontFamilyMap, | 354 prefs::kWebKitPictographFontFamilyMap, |
360 webkit_callback); | 355 webkit_callback); |
| 356 #endif // !defined(OS_ANDROID) |
361 } | 357 } |
362 | 358 |
363 renderer_preferences_util::UpdateFromSystemSettings( | 359 renderer_preferences_util::UpdateFromSystemSettings( |
364 web_contents_->GetMutableRendererPrefs(), GetProfile()); | 360 web_contents_->GetMutableRendererPrefs(), GetProfile()); |
365 | 361 |
366 #if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES) | 362 #if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES) |
367 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, | 363 registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED, |
368 content::Source<ThemeService>( | 364 content::Source<ThemeService>( |
369 ThemeServiceFactory::GetForProfile(GetProfile()))); | 365 ThemeServiceFactory::GetForProfile(GetProfile()))); |
370 #endif | 366 #endif |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
573 void PrefsTabHelper::UpdateRendererPreferences() { | 569 void PrefsTabHelper::UpdateRendererPreferences() { |
574 renderer_preferences_util::UpdateFromSystemSettings( | 570 renderer_preferences_util::UpdateFromSystemSettings( |
575 web_contents_->GetMutableRendererPrefs(), GetProfile()); | 571 web_contents_->GetMutableRendererPrefs(), GetProfile()); |
576 web_contents_->GetRenderViewHost()->SyncRendererPrefs(); | 572 web_contents_->GetRenderViewHost()->SyncRendererPrefs(); |
577 } | 573 } |
578 | 574 |
579 Profile* PrefsTabHelper::GetProfile() { | 575 Profile* PrefsTabHelper::GetProfile() { |
580 return Profile::FromBrowserContext(web_contents_->GetBrowserContext()); | 576 return Profile::FromBrowserContext(web_contents_->GetBrowserContext()); |
581 } | 577 } |
582 | 578 |
583 void PrefsTabHelper::OnFontFamilyPrefChanged(const std::string& pref_name) { | 579 void PrefsTabHelper::OnWebPrefChanged(const std::string& pref_name) { |
584 // When a font family pref's value goes from non-empty to the empty string, we | 580 // When a font family pref's value goes from non-empty to the empty string, we |
585 // must add it to the usual WebPreferences struct passed to the renderer. | 581 // must add it to the usual WebPreferences struct passed to the renderer. |
586 // | 582 // |
587 // The empty string means to fall back to the pref for the Common script | 583 // The empty string means to fall back to the pref for the Common script |
588 // ("Zyyy"). For example, if chrome.fonts.serif.Cyrl is the empty string, it | 584 // ("Zyyy"). For example, if chrome.fonts.serif.Cyrl is the empty string, it |
589 // means to use chrome.fonts.serif.Zyyy for Cyrillic script. Prefs that are | 585 // means to use chrome.fonts.serif.Zyyy for Cyrillic script. Prefs that are |
590 // the empty string are normally not passed to WebKit, since there are so many | 586 // the empty string are normally not passed to WebKit, since there are so many |
591 // of them that it would cause a performance regression. Not passing the pref | 587 // of them that it would cause a performance regression. Not passing the pref |
592 // is normally okay since WebKit does the desired fallback behavior regardless | 588 // is normally okay since WebKit does the desired fallback behavior regardless |
593 // of whether the empty string is passed or the pref is not passed at all. But | 589 // of whether the empty string is passed or the pref is not passed at all. But |
594 // if the pref has changed from non-empty to the empty string, we must let | 590 // if the pref has changed from non-empty to the empty string, we must let |
595 // WebKit know. | 591 // WebKit know. |
596 std::string generic_family; | 592 std::string generic_family; |
597 std::string script; | 593 std::string script; |
598 if (pref_names_util::ParseFontNamePrefPath(pref_name, | 594 if (pref_names_util::ParseFontNamePrefPath(pref_name, |
599 &generic_family, | 595 &generic_family, |
600 &script)) { | 596 &script)) { |
601 PrefService* prefs = GetProfile()->GetPrefs(); | 597 PrefService* prefs = GetProfile()->GetPrefs(); |
602 std::string pref_value = prefs->GetString(pref_name.c_str()); | 598 std::string pref_value = prefs->GetString(pref_name.c_str()); |
603 if (pref_value.empty()) { | 599 if (pref_value.empty()) { |
604 WebPreferences web_prefs = | 600 WebPreferences web_prefs = |
605 web_contents_->GetRenderViewHost()->GetWebkitPreferences(); | 601 web_contents_->GetRenderViewHost()->GetWebkitPreferences(); |
606 OverrideFontFamily(&web_prefs, generic_family, script, std::string()); | 602 OverrideFontFamily(&web_prefs, generic_family, script, std::string()); |
607 web_contents_->GetRenderViewHost()->UpdateWebkitPreferences(web_prefs); | 603 web_contents_->GetRenderViewHost()->UpdateWebkitPreferences(web_prefs); |
608 return; | 604 return; |
609 } | 605 } |
610 } | 606 } |
| 607 |
| 608 UpdateWebPreferences(); |
611 } | 609 } |
612 | |
613 void PrefsTabHelper::OnWebPrefChanged(const std::string& pref_name) { | |
614 #if !defined(OS_ANDROID) | |
615 OnFontFamilyPrefChanged(pref_name); | |
616 #endif | |
617 | |
618 web_contents_->GetRenderViewHost()->OnWebkitPreferencesChanged(); | |
619 } | |
OLD | NEW |