blob: 35b94a6f89f6e9c1ebfd71461edde21ba8bed601 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/prefs/prefs_tab_helper.h"
#include <string>
#include "base/string_util.h"
#include "base/stringprintf.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/prefs/overlay_user_pref_store.h"
#include "chrome/browser/prefs/pref_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/renderer_preferences_util.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/pref_names.h"
#include "content/public/browser/notification_details.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/web_contents.h"
#include "grit/locale_settings.h"
#include "grit/platform_locale_settings.h"
#include "unicode/uchar.h"
#include "unicode/uscript.h"
#include "webkit/glue/webpreferences.h"
#if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES)
#include "chrome/browser/themes/theme_service.h"
#include "chrome/browser/themes/theme_service_factory.h"
#endif
using content::WebContents;
using webkit_glue::WebPreferences;
namespace {
// Registers prefs only used for migration.
static void RegisterPrefsToMigrate(PrefService* prefs) {
prefs->RegisterLocalizedStringPref(prefs::kWebKitOldStandardFontFamily,
IDS_STANDARD_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitOldFixedFontFamily,
IDS_FIXED_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitOldSerifFontFamily,
IDS_SERIF_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitOldSansSerifFontFamily,
IDS_SANS_SERIF_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitOldCursiveFontFamily,
IDS_CURSIVE_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitOldFantasyFontFamily,
IDS_FANTASY_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kGlobalDefaultCharset,
IDS_DEFAULT_ENCODING,
PrefService::SYNCABLE_PREF);
prefs->RegisterLocalizedIntegerPref(prefs::kWebKitGlobalDefaultFontSize,
IDS_DEFAULT_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedIntegerPref(prefs::kWebKitGlobalDefaultFixedFontSize,
IDS_DEFAULT_FIXED_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedIntegerPref(prefs::kWebKitGlobalMinimumFontSize,
IDS_MINIMUM_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedIntegerPref(
prefs::kWebKitGlobalMinimumLogicalFontSize,
IDS_MINIMUM_LOGICAL_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitGlobalStandardFontFamily,
IDS_STANDARD_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitGlobalFixedFontFamily,
IDS_FIXED_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitGlobalSerifFontFamily,
IDS_SERIF_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitGlobalSansSerifFontFamily,
IDS_SANS_SERIF_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitGlobalCursiveFontFamily,
IDS_CURSIVE_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kWebKitGlobalFantasyFontFamily,
IDS_FANTASY_FONT_FAMILY,
PrefService::UNSYNCABLE_PREF);
}
// The list of prefs we want to observe.
const char* kPrefsToObserve[] = {
prefs::kDefaultZoomLevel,
prefs::kDefaultCharset,
prefs::kEnableReferrers,
prefs::kEnableDoNotTrack,
prefs::kWebKitAllowDisplayingInsecureContent,
prefs::kWebKitAllowRunningInsecureContent,
prefs::kWebKitDefaultFixedFontSize,
prefs::kWebKitDefaultFontSize,
#if defined(OS_ANDROID)
prefs::kWebKitFontScaleFactor,
prefs::kWebKitForceEnableZoom,
#endif
prefs::kWebKitJavascriptEnabled,
prefs::kWebKitJavaEnabled,
prefs::kWebKitLoadsImagesAutomatically,
prefs::kWebKitMinimumFontSize,
prefs::kWebKitMinimumLogicalFontSize,
prefs::kWebKitPluginsEnabled,
prefs::kWebkitTabsToLinks,
prefs::kWebKitUsesUniversalDetector
};
const int kPrefsToObserveLength = arraysize(kPrefsToObserve);
// Registers a preference under the path |map_name| for each script used for
// per-script font prefs. For example, if |map_name| is "fonts.serif", then
// "fonts.serif.Arab", "fonts.serif.Hang", etc. are registered.
void RegisterFontFamilyMap(PrefService* prefs, const char* map_name) {
for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) {
const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i];
std::string pref_name_str = base::StringPrintf("%s.%s", map_name, script);
const char* pref_name = pref_name_str.c_str();
if (!prefs->FindPreference(pref_name))
prefs->RegisterStringPref(pref_name, "", PrefService::UNSYNCABLE_PREF);
}
}
// Registers |obs| to observe per-script font prefs under the path |map_name|.
void RegisterFontFamilyMapObserver(PrefChangeRegistrar* registrar,
const char* map_name,
content::NotificationObserver* obs) {
for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) {
const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i];
std::string pref_name = base::StringPrintf("%s.%s", map_name, script);
registrar->Add(pref_name.c_str(), obs);
}
}
struct FontDefault {
const char* pref_name;
int resource_id;
};
// Font pref defaults. The prefs that have defaults vary by platform, since not
// all platforms have fonts for all scripts for all generic families.
// TODO(falken): add proper defaults when possible for all
// platforms/scripts/generic families.
const FontDefault kFontDefaults[] = {
{ prefs::kWebKitStandardFontFamily, IDS_STANDARD_FONT_FAMILY },
{ prefs::kWebKitFixedFontFamily, IDS_FIXED_FONT_FAMILY },
{ prefs::kWebKitSerifFontFamily, IDS_SERIF_FONT_FAMILY },
{ prefs::kWebKitSansSerifFontFamily, IDS_SANS_SERIF_FONT_FAMILY },
{ prefs::kWebKitCursiveFontFamily, IDS_CURSIVE_FONT_FAMILY },
{ prefs::kWebKitFantasyFontFamily, IDS_FANTASY_FONT_FAMILY },
#if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN)
{ prefs::kWebKitStandardFontFamilyJapanese,
IDS_STANDARD_FONT_FAMILY_JAPANESE },
{ prefs::kWebKitFixedFontFamilyJapanese, IDS_FIXED_FONT_FAMILY_JAPANESE },
{ prefs::kWebKitSerifFontFamilyJapanese, IDS_SERIF_FONT_FAMILY_JAPANESE },
{ prefs::kWebKitSansSerifFontFamilyJapanese,
IDS_SANS_SERIF_FONT_FAMILY_JAPANESE },
{ prefs::kWebKitStandardFontFamilyKorean, IDS_STANDARD_FONT_FAMILY_KOREAN },
{ prefs::kWebKitSerifFontFamilyKorean, IDS_SERIF_FONT_FAMILY_KOREAN },
{ prefs::kWebKitSansSerifFontFamilyKorean,
IDS_SANS_SERIF_FONT_FAMILY_KOREAN },
{ prefs::kWebKitStandardFontFamilySimplifiedHan,
IDS_STANDARD_FONT_FAMILY_SIMPLIFIED_HAN },
{ prefs::kWebKitSerifFontFamilySimplifiedHan,
IDS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN },
{ prefs::kWebKitSansSerifFontFamilySimplifiedHan,
IDS_SANS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN },
{ prefs::kWebKitStandardFontFamilyTraditionalHan,
IDS_STANDARD_FONT_FAMILY_TRADITIONAL_HAN },
{ prefs::kWebKitSerifFontFamilyTraditionalHan,
IDS_SERIF_FONT_FAMILY_TRADITIONAL_HAN },
{ prefs::kWebKitSansSerifFontFamilyTraditionalHan,
IDS_SANS_SERIF_FONT_FAMILY_TRADITIONAL_HAN },
#endif
#if defined(OS_CHROMEOS)
{ prefs::kWebKitStandardFontFamilyArabic, IDS_STANDARD_FONT_FAMILY_ARABIC },
{ prefs::kWebKitSerifFontFamilyArabic, IDS_SERIF_FONT_FAMILY_ARABIC },
{ prefs::kWebKitSansSerifFontFamilyArabic,
IDS_SANS_SERIF_FONT_FAMILY_ARABIC },
{ prefs::kWebKitFixedFontFamilyKorean, IDS_FIXED_FONT_FAMILY_KOREAN },
{ prefs::kWebKitFixedFontFamilySimplifiedHan,
IDS_FIXED_FONT_FAMILY_SIMPLIFIED_HAN },
{ prefs::kWebKitFixedFontFamilyTraditionalHan,
IDS_FIXED_FONT_FAMILY_TRADITIONAL_HAN },
#elif defined(OS_WIN)
{ prefs::kWebKitStandardFontFamilyCyrillic,
IDS_STANDARD_FONT_FAMILY_CYRILLIC },
{ prefs::kWebKitFixedFontFamilyCyrillic, IDS_FIXED_FONT_FAMILY_CYRILLIC },
{ prefs::kWebKitSerifFontFamilyCyrillic, IDS_SERIF_FONT_FAMILY_CYRILLIC },
{ prefs::kWebKitSansSerifFontFamilyCyrillic,
IDS_SANS_SERIF_FONT_FAMILY_CYRILLIC },
{ prefs::kWebKitStandardFontFamilyGreek, IDS_STANDARD_FONT_FAMILY_GREEK },
{ prefs::kWebKitFixedFontFamilyGreek, IDS_FIXED_FONT_FAMILY_GREEK },
{ prefs::kWebKitSerifFontFamilyGreek, IDS_SERIF_FONT_FAMILY_GREEK },
{ prefs::kWebKitSansSerifFontFamilyGreek, IDS_SANS_SERIF_FONT_FAMILY_GREEK },
{ prefs::kWebKitFixedFontFamilyKorean, IDS_FIXED_FONT_FAMILY_KOREAN },
{ prefs::kWebKitCursiveFontFamilyKorean, IDS_CURSIVE_FONT_FAMILY_KOREAN },
{ prefs::kWebKitFixedFontFamilySimplifiedHan,
IDS_FIXED_FONT_FAMILY_SIMPLIFIED_HAN },
{ prefs::kWebKitFixedFontFamilyTraditionalHan,
IDS_FIXED_FONT_FAMILY_TRADITIONAL_HAN },
#endif
};
const size_t kFontDefaultsLength = arraysize(kFontDefaults);
// Returns the script of the font pref |pref_name|. For example, suppose
// |pref_name| is "webkit.webprefs.fonts.serif.Hant". Since the script code for
// the script name "Hant" is USCRIPT_TRADITIONAL_HAN, the function returns
// USCRIPT_TRADITIONAL_HAN. |pref_name| must be a valid font pref name.
UScriptCode GetScriptOfFontPref(const char* pref_name) {
// ICU script names are four letters.
static const size_t kScriptNameLength = 4;
size_t len = strlen(pref_name);
DCHECK_GT(len, kScriptNameLength);
const char* scriptName = &pref_name[len - kScriptNameLength];
int32 code = u_getPropertyValueEnum(UCHAR_SCRIPT, scriptName);
DCHECK(code >= 0 && code < USCRIPT_CODE_LIMIT);
return static_cast<UScriptCode>(code);
}
// If |scriptCode| is a member of a family of "similar" script codes, returns
// the script code in that family that is used in font pref names. For example,
// USCRIPT_HANGUL and USCRIPT_KOREAN are considered equivalent for the purposes
// of font selection. Chrome uses the script code USCRIPT_HANGUL (script name
// "Hang") in Korean font pref names (for example,
// "webkit.webprefs.fonts.serif.Hang"). So, if |scriptCode| is USCRIPT_KOREAN,
// the function returns USCRIPT_HANGUL. If |scriptCode| is not a member of such
// a family, returns |scriptCode|.
UScriptCode GetScriptForFontPrefMatching(UScriptCode scriptCode) {
switch (scriptCode) {
case USCRIPT_HIRAGANA:
case USCRIPT_KATAKANA:
case USCRIPT_KATAKANA_OR_HIRAGANA:
return USCRIPT_JAPANESE;
case USCRIPT_KOREAN:
return USCRIPT_HANGUL;
default:
return scriptCode;
}
}
// Returns the primary script used by the browser's UI locale. For example, if
// the locale is "ru", the function returns USCRIPT_CYRILLIC, and if the locale
// is "en", the function returns USCRIPT_LATIN.
UScriptCode GetScriptOfBrowserLocale() {
std::string locale = g_browser_process->GetApplicationLocale();
// For Chinese locales, uscript_getCode() just returns USCRIPT_HAN but our
// per-script fonts are for USCRIPT_SIMPLIFIED_HAN and
// USCRIPT_TRADITIONAL_HAN.
if (locale == "zh-CN")
return USCRIPT_SIMPLIFIED_HAN;
if (locale == "zh-TW")
return USCRIPT_TRADITIONAL_HAN;
UScriptCode code = USCRIPT_INVALID_CODE;
UErrorCode err = U_ZERO_ERROR;
uscript_getCode(locale.c_str(), &code, 1, &err);
// Ignore the error that multiple scripts could be returned, since we only
// want one script.
if (U_FAILURE(err) && err != U_BUFFER_OVERFLOW_ERROR)
code = USCRIPT_INVALID_CODE;
return GetScriptForFontPrefMatching(code);
}
const struct {
const char* from;
const char* to;
} kPrefNamesToMigrate[] = {
// Migrate prefs like "webkit.webprefs.standard_font_family" to
// "webkit.webprefs.fonts.standard.Zyyy". This moves the formerly
// "non-per-script" font prefs into the per-script font pref maps, as the
// entry for the "Common" script (Zyyy is the ISO 15924 script code for the
// Common script). The |from| prefs will exist if the migration to global
// prefs (for the per-tab pref mechanism, which has since been removed) never
// occurred.
{ prefs::kWebKitOldCursiveFontFamily,
prefs::kWebKitCursiveFontFamily },
{ prefs::kWebKitOldFantasyFontFamily,
prefs::kWebKitFantasyFontFamily },
{ prefs::kWebKitOldFixedFontFamily,
prefs::kWebKitFixedFontFamily },
{ prefs::kWebKitOldSansSerifFontFamily,
prefs::kWebKitSansSerifFontFamily },
{ prefs::kWebKitOldSerifFontFamily,
prefs::kWebKitSerifFontFamily },
{ prefs::kWebKitOldStandardFontFamily,
prefs::kWebKitStandardFontFamily },
// Migrate "global" prefs. These will exist if the migration to global prefs
// (for the per-tab pref mechanism, which has since been removed) occurred.
// In addition, this moves the formerly "non-per-script" font prefs into the
// per-script font pref maps, as above.
{ prefs::kGlobalDefaultCharset,
prefs::kDefaultCharset },
{ prefs::kWebKitGlobalDefaultFixedFontSize,
prefs::kWebKitDefaultFixedFontSize },
{ prefs::kWebKitGlobalDefaultFontSize,
prefs::kWebKitDefaultFontSize },
{ prefs::kWebKitGlobalMinimumFontSize,
prefs::kWebKitMinimumFontSize },
{ prefs::kWebKitGlobalMinimumLogicalFontSize,
prefs::kWebKitMinimumLogicalFontSize },
{ prefs::kWebKitGlobalCursiveFontFamily,
prefs::kWebKitCursiveFontFamily },
{ prefs::kWebKitGlobalFantasyFontFamily,
prefs::kWebKitFantasyFontFamily },
{ prefs::kWebKitGlobalFixedFontFamily,
prefs::kWebKitFixedFontFamily },
{ prefs::kWebKitGlobalSansSerifFontFamily,
prefs::kWebKitSansSerifFontFamily },
{ prefs::kWebKitGlobalSerifFontFamily,
prefs::kWebKitSerifFontFamily },
{ prefs::kWebKitGlobalStandardFontFamily,
prefs::kWebKitStandardFontFamily }
};
const int kPrefsToMigrateLength = ARRAYSIZE_UNSAFE(kPrefNamesToMigrate);
static void MigratePreferences(PrefService* prefs) {
RegisterPrefsToMigrate(prefs);
for (int i = 0; i < kPrefsToMigrateLength; ++i) {
const PrefService::Preference* pref =
prefs->FindPreference(kPrefNamesToMigrate[i].from);
if (!pref) continue;
if (!pref->IsDefaultValue()) {
prefs->Set(kPrefNamesToMigrate[i].to, *pref->GetValue());
}
prefs->ClearPref(kPrefNamesToMigrate[i].from);
prefs->UnregisterPreference(kPrefNamesToMigrate[i].from);
}
}
} // namespace
PrefsTabHelper::PrefsTabHelper(WebContents* contents)
: web_contents_(contents) {
PrefService* prefs = GetProfile()->GetPrefs();
pref_change_registrar_.Init(prefs);
if (prefs) {
for (int i = 0; i < kPrefsToObserveLength; ++i)
pref_change_registrar_.Add(kPrefsToObserve[i], this);
RegisterFontFamilyMapObserver(&pref_change_registrar_,
prefs::kWebKitStandardFontFamilyMap, this);
RegisterFontFamilyMapObserver(&pref_change_registrar_,
prefs::kWebKitFixedFontFamilyMap, this);
RegisterFontFamilyMapObserver(&pref_change_registrar_,
prefs::kWebKitSerifFontFamilyMap, this);
RegisterFontFamilyMapObserver(&pref_change_registrar_,
prefs::kWebKitSansSerifFontFamilyMap, this);
RegisterFontFamilyMapObserver(&pref_change_registrar_,
prefs::kWebKitCursiveFontFamilyMap, this);
RegisterFontFamilyMapObserver(&pref_change_registrar_,
prefs::kWebKitFantasyFontFamilyMap, this);
}
renderer_preferences_util::UpdateFromSystemSettings(
web_contents_->GetMutableRendererPrefs(), GetProfile());
registrar_.Add(this, chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED,
content::NotificationService::AllSources());
#if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES)
registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
content::Source<ThemeService>(
ThemeServiceFactory::GetForProfile(GetProfile())));
#endif
}
PrefsTabHelper::~PrefsTabHelper() {
}
// static
void PrefsTabHelper::InitIncognitoUserPrefStore(
OverlayUserPrefStore* pref_store) {
// List of keys that cannot be changed in the user prefs file by the incognito
// profile. All preferences that store information about the browsing history
// or behavior of the user should have this property.
pref_store->RegisterOverlayPref(prefs::kBrowserWindowPlacement);
}
// static
void PrefsTabHelper::RegisterUserPrefs(PrefService* prefs) {
WebPreferences pref_defaults;
prefs->RegisterBooleanPref(prefs::kWebKitJavascriptEnabled,
pref_defaults.javascript_enabled,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitWebSecurityEnabled,
pref_defaults.web_security_enabled,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(
prefs::kWebKitJavascriptCanOpenWindowsAutomatically,
true,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitLoadsImagesAutomatically,
pref_defaults.loads_images_automatically,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitPluginsEnabled,
pref_defaults.plugins_enabled,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitDomPasteEnabled,
pref_defaults.dom_paste_enabled,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitShrinksStandaloneImagesToFit,
pref_defaults.shrinks_standalone_images_to_fit,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterDictionaryPref(prefs::kWebKitInspectorSettings,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitTextAreasAreResizable,
pref_defaults.text_areas_are_resizable,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitJavaEnabled,
pref_defaults.java_enabled,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebkitTabsToLinks,
pref_defaults.tabs_to_links,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitAllowRunningInsecureContent,
false,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitAllowDisplayingInsecureContent,
true,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kEnableReferrers,
true,
PrefService::UNSYNCABLE_PREF);
#if defined(OS_ANDROID)
prefs->RegisterDoublePref(prefs::kWebKitFontScaleFactor,
pref_defaults.font_scale_factor,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterBooleanPref(prefs::kWebKitForceEnableZoom,
pref_defaults.force_enable_zoom,
PrefService::UNSYNCABLE_PREF);
#endif
#if !defined(OS_MACOSX)
prefs->RegisterLocalizedStringPref(prefs::kAcceptLanguages,
IDS_ACCEPT_LANGUAGES,
PrefService::SYNCABLE_PREF);
#else
// Not used in OSX.
prefs->RegisterLocalizedStringPref(prefs::kAcceptLanguages,
IDS_ACCEPT_LANGUAGES,
PrefService::UNSYNCABLE_PREF);
#endif
prefs->RegisterLocalizedStringPref(prefs::kDefaultCharset,
IDS_DEFAULT_ENCODING,
PrefService::SYNCABLE_PREF);
// Register font prefs that have defaults.
UScriptCode browser_script = GetScriptOfBrowserLocale();
for (size_t i = 0; i < kFontDefaultsLength; ++i) {
const FontDefault& pref = kFontDefaults[i];
UScriptCode pref_script = GetScriptOfFontPref(pref.pref_name);
// Suppress this default font pref value if it is for the primary script of
// the browser's UI locale. For example, if the pref is for the sans-serif
// font for the Cyrillic script, and the browser locale is "ru" (Russian),
// the default is suppressed. Otherwise, the default would override the
// user's font preferences when viewing pages in their native language.
// This is because users have no way yet of customizing their per-script
// font preferences. The font prefs accessible in the options UI are for
// the default, unknown script; these prefs have less priority than the
// per-script font prefs when the script of the content is known. This code
// can possibly be removed later if users can easily access per-script font
// prefs (e.g., via the extensions workflow), or the problem turns out to
// not be really critical after all.
if (browser_script != pref_script) {
prefs->RegisterLocalizedStringPref(pref.pref_name,
pref.resource_id,
PrefService::UNSYNCABLE_PREF);
}
}
// Register font prefs that don't have defaults.
RegisterFontFamilyMap(prefs, prefs::kWebKitStandardFontFamilyMap);
RegisterFontFamilyMap(prefs, prefs::kWebKitFixedFontFamilyMap);
RegisterFontFamilyMap(prefs, prefs::kWebKitSerifFontFamilyMap);
RegisterFontFamilyMap(prefs, prefs::kWebKitSansSerifFontFamilyMap);
RegisterFontFamilyMap(prefs, prefs::kWebKitCursiveFontFamilyMap);
RegisterFontFamilyMap(prefs, prefs::kWebKitFantasyFontFamilyMap);
prefs->RegisterLocalizedIntegerPref(prefs::kWebKitDefaultFontSize,
IDS_DEFAULT_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedIntegerPref(prefs::kWebKitDefaultFixedFontSize,
IDS_DEFAULT_FIXED_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedIntegerPref(prefs::kWebKitMinimumFontSize,
IDS_MINIMUM_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedIntegerPref(
prefs::kWebKitMinimumLogicalFontSize,
IDS_MINIMUM_LOGICAL_FONT_SIZE,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterLocalizedBooleanPref(prefs::kWebKitUsesUniversalDetector,
IDS_USES_UNIVERSAL_DETECTOR,
PrefService::SYNCABLE_PREF);
prefs->RegisterLocalizedStringPref(prefs::kStaticEncodings,
IDS_STATIC_ENCODING_LIST,
PrefService::UNSYNCABLE_PREF);
prefs->RegisterStringPref(prefs::kRecentlySelectedEncoding,
"",
PrefService::UNSYNCABLE_PREF);
MigratePreferences(prefs);
}
void PrefsTabHelper::Observe(int type,
const content::NotificationSource& source,
const content::NotificationDetails& details) {
switch (type) {
case chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED:
UpdateWebPreferences();
break;
#if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES)
case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: {
UpdateRendererPreferences();
break;
}
#endif
case chrome::NOTIFICATION_PREF_CHANGED: {
std::string* pref_name_in = content::Details<std::string>(details).ptr();
DCHECK(content::Source<PrefService>(source).ptr() ==
GetProfile()->GetPrefs());
if (*pref_name_in == prefs::kDefaultCharset ||
StartsWithASCII(*pref_name_in, "webkit.webprefs.", true)) {
UpdateWebPreferences();
} else if (*pref_name_in == prefs::kDefaultZoomLevel ||
*pref_name_in == prefs::kEnableReferrers ||
*pref_name_in == prefs::kEnableDoNotTrack) {
UpdateRendererPreferences();
} else {
NOTREACHED() << "unexpected pref change notification" << *pref_name_in;
}
break;
}
default:
NOTREACHED();
}
}
void PrefsTabHelper::UpdateWebPreferences() {
web_contents_->GetRenderViewHost()->UpdateWebkitPreferences(
web_contents_->GetRenderViewHost()->GetWebkitPreferences());
}
void PrefsTabHelper::UpdateRendererPreferences() {
renderer_preferences_util::UpdateFromSystemSettings(
web_contents_->GetMutableRendererPrefs(), GetProfile());
web_contents_->GetRenderViewHost()->SyncRendererPrefs();
}
Profile* PrefsTabHelper::GetProfile() {
return Profile::FromBrowserContext(web_contents_->GetBrowserContext());
}