prefs_tab_helper.cc revision ca12bfac764ba476d6cd062bf1dde12cc64c3f40
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/prefs/prefs_tab_helper.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/overlay_user_pref_store.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/stringprintf.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/renderer_preferences_util.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_font_webkit_names.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names_util.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "components/user_prefs/pref_registry_syncable.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_service.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/locale_settings.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/platform_locale_settings.h"
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/common/unicode/uchar.h"
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "third_party/icu/source/common/unicode/uscript.h"
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "webkit/common/webpreferences.h"
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/themes/theme_service_factory.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)DEFINE_WEB_CONTENTS_USER_DATA_KEY(PrefsTabHelper);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Registers prefs only used for migration.
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RegisterPrefsToMigrate(user_prefs::PrefRegistrySyncable* prefs) {
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitOldStandardFontFamily,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_STANDARD_FONT_FAMILY,
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitOldFixedFontFamily,
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_FIXED_FONT_FAMILY,
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitOldSerifFontFamily,
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_SERIF_FONT_FAMILY,
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitOldSansSerifFontFamily,
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_SANS_SERIF_FONT_FAMILY,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitOldCursiveFontFamily,
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_CURSIVE_FONT_FAMILY,
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitOldFantasyFontFamily,
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_FANTASY_FONT_FAMILY,
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kGlobalDefaultCharset,
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_DEFAULT_ENCODING,
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedIntegerPref(
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalDefaultFontSize,
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_DEFAULT_FONT_SIZE,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedIntegerPref(
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalDefaultFixedFontSize,
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_DEFAULT_FIXED_FONT_SIZE,
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedIntegerPref(
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalMinimumFontSize,
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_MINIMUM_FONT_SIZE,
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs->RegisterLocalizedIntegerPref(
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kWebKitGlobalMinimumLogicalFontSize,
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_MINIMUM_LOGICAL_FONT_SIZE,
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalStandardFontFamily,
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_STANDARD_FONT_FAMILY,
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalFixedFontFamily,
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_FIXED_FONT_FAMILY,
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalSerifFontFamily,
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_SERIF_FONT_FAMILY,
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalSansSerifFontFamily,
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_SANS_SERIF_FONT_FAMILY,
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalCursiveFontFamily,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_CURSIVE_FONT_FAMILY,
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  prefs->RegisterLocalizedStringPref(
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitGlobalFantasyFontFamily,
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_FANTASY_FONT_FAMILY,
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The list of prefs we want to observe.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* kPrefsToObserve[] = {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kDefaultCharset,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitAllowDisplayingInsecureContent,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitAllowRunningInsecureContent,
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitDefaultFixedFontSize,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitDefaultFontSize,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitFontScaleFactor,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitForceEnableZoom,
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  prefs::kWebKitPasswordEchoEnabled,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitJavascriptEnabled,
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitJavaEnabled,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitLoadsImagesAutomatically,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitMinimumFontSize,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitMinimumLogicalFontSize,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitPluginsEnabled,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebkitTabsToLinks,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prefs::kWebKitUsesUniversalDetector
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPrefsToObserveLength = arraysize(kPrefsToObserve);
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Registers a preference under the path |pref_name| for each script used for
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// per-script font prefs.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// For example, for WEBKIT_WEBPREFS_FONTS_SERIF ("fonts.serif"):
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "fonts.serif.Arab", "fonts.serif.Hang", etc. are registered.
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// |fonts_with_defaults| contains all |pref_names| already registered since they
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// have a specified default value.
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void RegisterFontFamilyPrefs(user_prefs::PrefRegistrySyncable* registry,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             const std::set<std::string>& fonts_with_defaults) {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Expand the font concatenated with script name so this stays at RO memory
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // rather than allocated in heap.
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const char* const kFontFamilyMap[] = {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define EXPAND_SCRIPT_FONT(map_name, script_name) map_name "." script_name,
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/common/pref_font_script_names-inl.h"
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FONT_SCRIPTS(WEBKIT_WEBPREFS_FONTS_CURSIVE)
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FONT_SCRIPTS(WEBKIT_WEBPREFS_FONTS_FANTASY)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FONT_SCRIPTS(WEBKIT_WEBPREFS_FONTS_FIXED)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FONT_SCRIPTS(WEBKIT_WEBPREFS_FONTS_PICTOGRAPH)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FONT_SCRIPTS(WEBKIT_WEBPREFS_FONTS_SANSERIF)
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FONT_SCRIPTS(WEBKIT_WEBPREFS_FONTS_SERIF)
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ALL_FONT_SCRIPTS(WEBKIT_WEBPREFS_FONTS_STANDARD)
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef EXPAND_SCRIPT_FONT
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (size_t i = 0; i < arraysize(kFontFamilyMap); ++i) {
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* pref_name = kFontFamilyMap[i];
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (fonts_with_defaults.find(pref_name) == fonts_with_defaults.end()) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // We haven't already set a default value for this font preference, so set
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // an empty string as the default.
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry->RegisterStringPref(
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          pref_name,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          std::string(),
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Registers |obs| to observe per-script font prefs under the path |map_name|.
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// On android, there's no exposed way to change these prefs, so we can save
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// ~715KB of heap and some startup cycles by avoiding observing these prefs
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// since they will never change.
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RegisterFontFamilyMapObserver(
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrefChangeRegistrar* registrar,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const char* map_name,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PrefChangeRegistrar::NamedChangeCallback& obs) {
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(StartsWithASCII(map_name, "webkit.webprefs.", true));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < prefs::kWebKitScriptsForFontFamilyMapsLength; ++i) {
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* script = prefs::kWebKitScriptsForFontFamilyMaps[i];
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string pref_name = base::StringPrintf("%s.%s", map_name, script);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    registrar->Add(pref_name.c_str(), obs);
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_ANDROID)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct FontDefault {
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* pref_name;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int resource_id;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Font pref defaults.  The prefs that have defaults vary by platform, since not
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// all platforms have fonts for all scripts for all generic families.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(falken): add proper defaults when possible for all
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// platforms/scripts/generic families.
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const FontDefault kFontDefaults[] = {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamily, IDS_STANDARD_FONT_FAMILY },
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamily, IDS_FIXED_FONT_FAMILY },
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamily, IDS_SERIF_FONT_FAMILY },
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamily, IDS_SANS_SERIF_FONT_FAMILY },
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitCursiveFontFamily, IDS_CURSIVE_FONT_FAMILY },
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFantasyFontFamily, IDS_FANTASY_FONT_FAMILY },
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitPictographFontFamily, IDS_PICTOGRAPH_FONT_FAMILY },
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS) || defined(OS_MACOSX) || defined(OS_WIN)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamilyJapanese,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_STANDARD_FONT_FAMILY_JAPANESE },
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilyJapanese, IDS_FIXED_FONT_FAMILY_JAPANESE },
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamilyJapanese, IDS_SERIF_FONT_FAMILY_JAPANESE },
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamilyJapanese,
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SANS_SERIF_FONT_FAMILY_JAPANESE },
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamilyKorean, IDS_STANDARD_FONT_FAMILY_KOREAN },
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamilyKorean, IDS_SERIF_FONT_FAMILY_KOREAN },
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamilyKorean,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SANS_SERIF_FONT_FAMILY_KOREAN },
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamilySimplifiedHan,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_STANDARD_FONT_FAMILY_SIMPLIFIED_HAN },
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamilySimplifiedHan,
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN },
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamilySimplifiedHan,
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SANS_SERIF_FONT_FAMILY_SIMPLIFIED_HAN },
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamilyTraditionalHan,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_STANDARD_FONT_FAMILY_TRADITIONAL_HAN },
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamilyTraditionalHan,
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SERIF_FONT_FAMILY_TRADITIONAL_HAN },
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamilyTraditionalHan,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SANS_SERIF_FONT_FAMILY_TRADITIONAL_HAN },
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_CHROMEOS)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamilyArabic, IDS_STANDARD_FONT_FAMILY_ARABIC },
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamilyArabic, IDS_SERIF_FONT_FAMILY_ARABIC },
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamilyArabic,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SANS_SERIF_FONT_FAMILY_ARABIC },
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilyKorean, IDS_FIXED_FONT_FAMILY_KOREAN },
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilySimplifiedHan,
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_FIXED_FONT_FAMILY_SIMPLIFIED_HAN },
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilyTraditionalHan,
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_FIXED_FONT_FAMILY_TRADITIONAL_HAN },
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamilyCyrillic,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_STANDARD_FONT_FAMILY_CYRILLIC },
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilyCyrillic, IDS_FIXED_FONT_FAMILY_CYRILLIC },
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamilyCyrillic, IDS_SERIF_FONT_FAMILY_CYRILLIC },
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamilyCyrillic,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_SANS_SERIF_FONT_FAMILY_CYRILLIC },
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitStandardFontFamilyGreek, IDS_STANDARD_FONT_FAMILY_GREEK },
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilyGreek, IDS_FIXED_FONT_FAMILY_GREEK },
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSerifFontFamilyGreek, IDS_SERIF_FONT_FAMILY_GREEK },
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitSansSerifFontFamilyGreek, IDS_SANS_SERIF_FONT_FAMILY_GREEK },
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilyKorean, IDS_FIXED_FONT_FAMILY_KOREAN },
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitCursiveFontFamilyKorean, IDS_CURSIVE_FONT_FAMILY_KOREAN },
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilySimplifiedHan,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_FIXED_FONT_FAMILY_SIMPLIFIED_HAN },
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitFixedFontFamilyTraditionalHan,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IDS_FIXED_FONT_FAMILY_TRADITIONAL_HAN },
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const size_t kFontDefaultsLength = arraysize(kFontDefaults);
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the script of the font pref |pref_name|.  For example, suppose
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |pref_name| is "webkit.webprefs.fonts.serif.Hant".  Since the script code for
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the script name "Hant" is USCRIPT_TRADITIONAL_HAN, the function returns
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// USCRIPT_TRADITIONAL_HAN.  |pref_name| must be a valid font pref name.
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UScriptCode GetScriptOfFontPref(const char* pref_name) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ICU script names are four letters.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const size_t kScriptNameLength = 4;
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t len = strlen(pref_name);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK_GT(len, kScriptNameLength);
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* scriptName = &pref_name[len - kScriptNameLength];
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int32 code = u_getPropertyValueEnum(UCHAR_SCRIPT, scriptName);
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(code >= 0 && code < USCRIPT_CODE_LIMIT);
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<UScriptCode>(code);
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |scriptCode| is a member of a family of "similar" script codes, returns
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the script code in that family that is used in font pref names.  For example,
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// USCRIPT_HANGUL and USCRIPT_KOREAN are considered equivalent for the purposes
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of font selection.  Chrome uses the script code USCRIPT_HANGUL (script name
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "Hang") in Korean font pref names (for example,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// "webkit.webprefs.fonts.serif.Hang").  So, if |scriptCode| is USCRIPT_KOREAN,
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the function returns USCRIPT_HANGUL.  If |scriptCode| is not a member of such
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// a family, returns |scriptCode|.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UScriptCode GetScriptForFontPrefMatching(UScriptCode scriptCode) {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (scriptCode) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case USCRIPT_HIRAGANA:
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case USCRIPT_KATAKANA:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case USCRIPT_KATAKANA_OR_HIRAGANA:
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return USCRIPT_JAPANESE;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  case USCRIPT_KOREAN:
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return USCRIPT_HANGUL;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default:
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return scriptCode;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the primary script used by the browser's UI locale.  For example, if
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the locale is "ru", the function returns USCRIPT_CYRILLIC, and if the locale
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// is "en", the function returns USCRIPT_LATIN.
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UScriptCode GetScriptOfBrowserLocale() {
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string locale = g_browser_process->GetApplicationLocale();
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For Chinese locales, uscript_getCode() just returns USCRIPT_HAN but our
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // per-script fonts are for USCRIPT_SIMPLIFIED_HAN and
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // USCRIPT_TRADITIONAL_HAN.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (locale == "zh-CN")
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return USCRIPT_SIMPLIFIED_HAN;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (locale == "zh-TW")
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return USCRIPT_TRADITIONAL_HAN;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UScriptCode code = USCRIPT_INVALID_CODE;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UErrorCode err = U_ZERO_ERROR;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uscript_getCode(locale.c_str(), &code, 1, &err);
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ignore the error that multiple scripts could be returned, since we only
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // want one script.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (U_FAILURE(err) && err != U_BUFFER_OVERFLOW_ERROR)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    code = USCRIPT_INVALID_CODE;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetScriptForFontPrefMatching(code);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const struct {
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* from;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* to;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} kPrefNamesToMigrate[] = {
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrate prefs like "webkit.webprefs.standard_font_family" to
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "webkit.webprefs.fonts.standard.Zyyy". This moves the formerly
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "non-per-script" font prefs into the per-script font pref maps, as the
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // entry for the "Common" script (Zyyy is the ISO 15924 script code for the
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Common script). The |from| prefs will exist if the migration to global
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // prefs (for the per-tab pref mechanism, which has since been removed) never
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // occurred.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitOldCursiveFontFamily,
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitCursiveFontFamily },
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitOldFantasyFontFamily,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitFantasyFontFamily },
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitOldFixedFontFamily,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitFixedFontFamily },
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitOldSansSerifFontFamily,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitSansSerifFontFamily },
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitOldSerifFontFamily,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitSerifFontFamily },
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitOldStandardFontFamily,
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitStandardFontFamily },
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Migrate "global" prefs. These will exist if the migration to global prefs
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (for the per-tab pref mechanism, which has since been removed) occurred.
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // In addition, this moves the formerly "non-per-script" font prefs into the
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // per-script font pref maps, as above.
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kGlobalDefaultCharset,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kDefaultCharset },
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalDefaultFixedFontSize,
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitDefaultFixedFontSize },
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalDefaultFontSize,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitDefaultFontSize },
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalMinimumFontSize,
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitMinimumFontSize },
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalMinimumLogicalFontSize,
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitMinimumLogicalFontSize },
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalCursiveFontFamily,
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitCursiveFontFamily },
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalFantasyFontFamily,
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitFantasyFontFamily },
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalFixedFontFamily,
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitFixedFontFamily },
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalSansSerifFontFamily,
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitSansSerifFontFamily },
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalSerifFontFamily,
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitSerifFontFamily },
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { prefs::kWebKitGlobalStandardFontFamily,
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prefs::kWebKitStandardFontFamily }
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int kPrefsToMigrateLength = ARRAYSIZE_UNSAFE(kPrefNamesToMigrate);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets a font family pref in |prefs| to |pref_value|.
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void OverrideFontFamily(WebPreferences* prefs,
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& generic_family,
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& script,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& pref_value) {
390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  webkit_glue::ScriptFontFamilyMap* map = NULL;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (generic_family == "standard")
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = &prefs->standard_font_family_map;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (generic_family == "fixed")
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = &prefs->fixed_font_family_map;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (generic_family == "serif")
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = &prefs->serif_font_family_map;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (generic_family == "sansserif")
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = &prefs->sans_serif_font_family_map;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (generic_family == "cursive")
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = &prefs->cursive_font_family_map;
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (generic_family == "fantasy")
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = &prefs->fantasy_font_family_map;
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (generic_family == "pictograph")
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    map = &prefs->pictograph_font_family_map;
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NOTREACHED() << "Unknown generic font family: " << generic_family;
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  (*map)[script] = UTF8ToUTF16(pref_value);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefsTabHelper::PrefsTabHelper(WebContents* contents)
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : web_contents_(contents) {
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* prefs = GetProfile()->GetPrefs();
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_change_registrar_.Init(prefs);
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (prefs) {
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    base::Closure renderer_callback = base::Bind(
4182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &PrefsTabHelper::UpdateRendererPreferences, base::Unretained(this));
4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    pref_change_registrar_.Add(prefs::kAcceptLanguages, renderer_callback);
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_change_registrar_.Add(prefs::kDefaultZoomLevel, renderer_callback);
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_change_registrar_.Add(prefs::kEnableDoNotTrack, renderer_callback);
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    pref_change_registrar_.Add(prefs::kEnableReferrers, renderer_callback);
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PrefChangeRegistrar::NamedChangeCallback webkit_callback = base::Bind(
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        &PrefsTabHelper::OnWebPrefChanged, base::Unretained(this));
4262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    for (int i = 0; i < kPrefsToObserveLength; ++i) {
4272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const char* pref_name = kPrefsToObserve[i];
4282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DCHECK(std::string(pref_name) == prefs::kDefaultCharset ||
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             StartsWithASCII(pref_name, "webkit.webprefs.", true));
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_change_registrar_.Add(pref_name, webkit_callback);
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if !defined(OS_ANDROID)
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFontFamilyMapObserver(&pref_change_registrar_,
4352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  prefs::kWebKitStandardFontFamilyMap,
4362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  webkit_callback);
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFontFamilyMapObserver(&pref_change_registrar_,
4382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  prefs::kWebKitFixedFontFamilyMap,
4392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  webkit_callback);
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFontFamilyMapObserver(&pref_change_registrar_,
4412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  prefs::kWebKitSerifFontFamilyMap,
4422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  webkit_callback);
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFontFamilyMapObserver(&pref_change_registrar_,
4442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  prefs::kWebKitSansSerifFontFamilyMap,
4452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  webkit_callback);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFontFamilyMapObserver(&pref_change_registrar_,
4472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  prefs::kWebKitCursiveFontFamilyMap,
4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  webkit_callback);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFontFamilyMapObserver(&pref_change_registrar_,
4502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  prefs::kWebKitFantasyFontFamilyMap,
4512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  webkit_callback);
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RegisterFontFamilyMapObserver(&pref_change_registrar_,
4532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  prefs::kWebKitPictographFontFamilyMap,
4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  webkit_callback);
4552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // !defined(OS_ANDROID)
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_preferences_util::UpdateFromSystemSettings(
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetMutableRendererPrefs(), GetProfile());
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_ANDROID)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::NotificationService::AllSources());
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_BROWSER_THEME_CHANGED,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 content::Source<ThemeService>(
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     ThemeServiceFactory::GetForProfile(GetProfile())));
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registrar_.Add(this,
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 chrome::NOTIFICATION_BROWSER_FLING_CURVE_PARAMETERS_CHANGED,
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 content::NotificationService::AllSources());
4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PrefsTabHelper::~PrefsTabHelper() {
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrefsTabHelper::InitIncognitoUserPrefStore(
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    OverlayUserPrefStore* pref_store) {
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // List of keys that cannot be changed in the user prefs file by the incognito
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // profile.  All preferences that store information about the browsing history
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // or behavior of the user should have this property.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_store->RegisterOverlayPref(prefs::kBrowserWindowPlacement);
487868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  pref_store->RegisterOverlayPref(prefs::kSaveFileDefaultDirectory);
4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(OS_ANDROID) || defined(OS_IOS)
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pref_store->RegisterOverlayPref(prefs::kProxy);
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(OS_ANDROID) || defined(OS_IOS)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid PrefsTabHelper::RegisterProfilePrefs(
495c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    user_prefs::PrefRegistrySyncable* registry) {
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebPreferences pref_defaults;
497c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
498c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitJavascriptEnabled,
499c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.javascript_enabled,
500c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
501c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitWebSecurityEnabled,
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.web_security_enabled,
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterBooleanPref(
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kWebKitJavascriptCanOpenWindowsAutomatically,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitLoadsImagesAutomatically,
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.loads_images_automatically,
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
513c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
514c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitPluginsEnabled,
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.plugins_enabled,
516c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
518c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitDomPasteEnabled,
519c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.dom_paste_enabled,
520c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
521c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
522c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitShrinksStandaloneImagesToFit,
523c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.shrinks_standalone_images_to_fit,
524c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterDictionaryPref(
526c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitInspectorSettings,
527c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
528c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
529c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitTextAreasAreResizable,
530c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.text_areas_are_resizable,
531c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
532c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
533c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitJavaEnabled,
534c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.java_enabled,
535c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
536c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
537c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebkitTabsToLinks,
538c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.tabs_to_links,
539c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
540c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
541c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitAllowRunningInsecureContent,
542c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      false,
543c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
544c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
545c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitAllowDisplayingInsecureContent,
546c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
547c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
548c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
549c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kEnableReferrers,
550c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      true,
551c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_ANDROID)
553c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterDoublePref(
554c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitFontScaleFactor,
555c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.font_scale_factor,
556c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
557c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterBooleanPref(
558c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitForceEnableZoom,
559c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      pref_defaults.force_enable_zoom,
560c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
561868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  registry->RegisterBooleanPref(
562868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      prefs::kWebKitPasswordEchoEnabled,
563868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      pref_defaults.password_echo_enabled,
564868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
566c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterLocalizedStringPref(
567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kAcceptLanguages,
568c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_ACCEPT_LANGUAGES,
569c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterLocalizedStringPref(
571c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kDefaultCharset,
572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_DEFAULT_ENCODING,
573c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register font prefs that have defaults.
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::set<std::string> fonts_with_defaults;
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UScriptCode browser_script = GetScriptOfBrowserLocale();
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < kFontDefaultsLength; ++i) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const FontDefault& pref = kFontDefaults[i];
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UScriptCode pref_script = GetScriptOfFontPref(pref.pref_name);
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Suppress this default font pref value if it is for the primary script of
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the browser's UI locale.  For example, if the pref is for the sans-serif
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // font for the Cyrillic script, and the browser locale is "ru" (Russian),
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the default is suppressed.  Otherwise, the default would override the
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // user's font preferences when viewing pages in their native language.
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // This is because users have no way yet of customizing their per-script
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // font preferences.  The font prefs accessible in the options UI are for
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the default, unknown script; these prefs have less priority than the
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // per-script font prefs when the script of the content is known.  This code
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // can possibly be removed later if users can easily access per-script font
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // prefs (e.g., via the extensions workflow), or the problem turns out to
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // not be really critical after all.
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (browser_script != pref_script) {
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      registry->RegisterLocalizedStringPref(
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pref.pref_name,
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          pref.resource_id,
598c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fonts_with_defaults.insert(pref.pref_name);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register font prefs that don't have defaults.
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RegisterFontFamilyPrefs(registry, fonts_with_defaults);
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
606c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterLocalizedIntegerPref(
607c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitDefaultFontSize,
608c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_DEFAULT_FONT_SIZE,
609c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
610c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterLocalizedIntegerPref(
611c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitDefaultFixedFontSize,
612c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_DEFAULT_FIXED_FONT_SIZE,
613c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
614c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterLocalizedIntegerPref(
615c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitMinimumFontSize,
616c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_MINIMUM_FONT_SIZE,
617c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  registry->RegisterLocalizedIntegerPref(
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      prefs::kWebKitMinimumLogicalFontSize,
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_MINIMUM_LOGICAL_FONT_SIZE,
621c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
622c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterLocalizedBooleanPref(
623c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kWebKitUsesUniversalDetector,
624c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_USES_UNIVERSAL_DETECTOR,
625c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
626c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterLocalizedStringPref(
627c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kStaticEncodings,
628c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      IDS_STATIC_ENCODING_LIST,
629c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
630c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  registry->RegisterStringPref(
631c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      prefs::kRecentlySelectedEncoding,
632c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      std::string(),
633c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF);
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  RegisterPrefsToMigrate(registry);
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrefsTabHelper::MigrateUserPrefs(PrefService* prefs) {
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  for (int i = 0; i < kPrefsToMigrateLength; ++i) {
6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const PrefService::Preference* pref =
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        prefs->FindPreference(kPrefNamesToMigrate[i].from);
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (pref && !pref->IsDefaultValue()) {
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->Set(kPrefNamesToMigrate[i].to, *pref->GetValue());
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs->ClearPref(kPrefNamesToMigrate[i].from);
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrefsTabHelper::Observe(int type,
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationSource& source,
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationDetails& details) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
653c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if !defined(OS_ANDROID)
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_USER_STYLE_SHEET_UPDATED:
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateWebPreferences();
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
657c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif // !defined(OS_ANDROID)
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_POSIX) && !defined(OS_MACOSX) && defined(ENABLE_THEMES)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case chrome::NOTIFICATION_BROWSER_THEME_CHANGED: {
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      UpdateRendererPreferences();
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_AURA)
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case chrome::NOTIFICATION_BROWSER_FLING_CURVE_PARAMETERS_CHANGED: {
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      UpdateRendererPreferences();
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      break;
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // defined(USE_AURA)
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED();
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrefsTabHelper::UpdateWebPreferences() {
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->UpdateWebkitPreferences(
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetRenderViewHost()->GetWebkitPreferences());
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrefsTabHelper::UpdateRendererPreferences() {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  renderer_preferences_util::UpdateFromSystemSettings(
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetMutableRendererPrefs(), GetProfile());
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_contents_->GetRenderViewHost()->SyncRendererPrefs();
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Profile* PrefsTabHelper::GetProfile() {
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Profile::FromBrowserContext(web_contents_->GetBrowserContext());
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrefsTabHelper::OnWebPrefChanged(const std::string& pref_name) {
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // When a font family pref's value goes from non-empty to the empty string, we
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // must add it to the usual WebPreferences struct passed to the renderer.
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The empty string means to fall back to the pref for the Common script
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ("Zyyy").  For example, if chrome.fonts.serif.Cyrl is the empty string, it
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // means to use chrome.fonts.serif.Zyyy for Cyrillic script. Prefs that are
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the empty string are normally not passed to WebKit, since there are so many
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of them that it would cause a performance regression. Not passing the pref
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // is normally okay since WebKit does the desired fallback behavior regardless
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of whether the empty string is passed or the pref is not passed at all. But
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // if the pref has changed from non-empty to the empty string, we must let
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebKit know.
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string generic_family;
7045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string script;
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (pref_names_util::ParseFontNamePrefPath(pref_name,
7065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             &generic_family,
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             &script)) {
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PrefService* prefs = GetProfile()->GetPrefs();
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string pref_value = prefs->GetString(pref_name.c_str());
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (pref_value.empty()) {
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WebPreferences web_prefs =
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          web_contents_->GetRenderViewHost()->GetWebkitPreferences();
713c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      OverrideFontFamily(&web_prefs, generic_family, script, std::string());
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      web_contents_->GetRenderViewHost()->UpdateWebkitPreferences(web_prefs);
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  UpdateWebPreferences();
7205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
721