• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/ui/webui/options/font_settings_handler.h"
6 
7 #include <string>
8 
9 #include "base/basictypes.h"
10 #include "base/i18n/rtl.h"
11 #include "base/string_number_conversions.h"
12 #include "base/string_util.h"
13 #include "base/values.h"
14 #include "chrome/browser/browser_process.h"
15 #include "chrome/browser/character_encoding.h"
16 #include "chrome/browser/prefs/pref_service.h"
17 #include "chrome/browser/profiles/profile.h"
18 #include "chrome/browser/ui/webui/options/font_settings_utils.h"
19 #include "chrome/common/pref_names.h"
20 #include "content/common/notification_details.h"
21 #include "content/common/notification_type.h"
22 #include "grit/chromium_strings.h"
23 #include "grit/generated_resources.h"
24 #include "ui/base/l10n/l10n_util.h"
25 
FontSettingsHandler()26 FontSettingsHandler::FontSettingsHandler() {
27   fonts_list_loader_ = new FontSettingsFontsListLoader(this);
28 }
29 
~FontSettingsHandler()30 FontSettingsHandler::~FontSettingsHandler() {
31   if (fonts_list_loader_)
32     fonts_list_loader_->SetObserver(NULL);
33 }
34 
GetLocalizedValues(DictionaryValue * localized_strings)35 void FontSettingsHandler::GetLocalizedValues(
36     DictionaryValue* localized_strings) {
37   DCHECK(localized_strings);
38 
39   static OptionsStringResource resources[] = {
40     { "fontSettingsStandard",
41       IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_STANDARD_LABEL },
42     { "fontSettingsSerif",
43       IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_SERIF_LABEL },
44     { "fontSettingsSansSerif",
45       IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_SANS_SERIF_LABEL },
46     { "fontSettingsFixedWidth",
47       IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_FIXED_WIDTH_LABEL },
48     { "fontSettingsMinimumSize",
49       IDS_FONT_LANGUAGE_SETTING_MINIMUM_FONT_SIZE_TITLE },
50     { "fontSettingsEncoding",
51       IDS_FONT_LANGUAGE_SETTING_FONT_SUB_DIALOG_ENCODING_TITLE },
52     { "fontSettingsSizeTiny",
53       IDS_FONT_LANGUAGE_SETTING_FONT_SIZE_TINY },
54     { "fontSettingsSizeHuge",
55       IDS_FONT_LANGUAGE_SETTING_FONT_SIZE_HUGE },
56     { "fontSettingsLoremIpsum",
57       IDS_FONT_LANGUAGE_SETTING_LOREM_IPSUM },
58   };
59 
60   RegisterStrings(localized_strings, resources, arraysize(resources));
61   RegisterTitle(localized_strings, "fontSettingsPage",
62                 IDS_FONT_LANGUAGE_SETTING_FONT_TAB_TITLE);
63   localized_strings->SetString("fontSettingsPlaceholder",
64       l10n_util::GetStringUTF16(
65           IDS_FONT_LANGUAGE_SETTING_PLACEHOLDER));
66 }
67 
Initialize()68 void FontSettingsHandler::Initialize() {
69   DCHECK(web_ui_);
70   SetUpStandardFontSample();
71   SetUpSerifFontSample();
72   SetUpSansSerifFontSample();
73   SetUpFixedFontSample();
74   SetUpMinimumFontSample();
75 }
76 
Attach(WebUI * web_ui)77 WebUIMessageHandler* FontSettingsHandler::Attach(WebUI* web_ui) {
78   // Call through to superclass.
79   WebUIMessageHandler* handler = OptionsPageUIHandler::Attach(web_ui);
80 
81   // Perform validation for saved fonts.
82   DCHECK(web_ui_);
83   PrefService* pref_service = web_ui_->GetProfile()->GetPrefs();
84   FontSettingsUtilities::ValidateSavedFonts(pref_service);
85 
86   // Register for preferences that we need to observe manually.
87   standard_font_.Init(prefs::kWebKitStandardFontFamily, pref_service, this);
88   serif_font_.Init(prefs::kWebKitSerifFontFamily, pref_service, this);
89   sans_serif_font_.Init(prefs::kWebKitSansSerifFontFamily, pref_service, this);
90   fixed_font_.Init(prefs::kWebKitFixedFontFamily, pref_service, this);
91   font_encoding_.Init(prefs::kDefaultCharset, pref_service, this);
92   default_font_size_.Init(prefs::kWebKitDefaultFontSize, pref_service, this);
93   default_fixed_font_size_.Init(prefs::kWebKitDefaultFixedFontSize,
94                                 pref_service, this);
95   minimum_font_size_.Init(prefs::kWebKitMinimumFontSize, pref_service, this);
96 
97   // Return result from the superclass.
98   return handler;
99 }
100 
RegisterMessages()101 void FontSettingsHandler::RegisterMessages() {
102   web_ui_->RegisterMessageCallback("fetchFontsData",
103       NewCallback(this, &FontSettingsHandler::HandleFetchFontsData));
104 }
105 
HandleFetchFontsData(const ListValue * args)106 void FontSettingsHandler::HandleFetchFontsData(const ListValue* args) {
107   fonts_list_loader_->StartLoadFontsList();
108 }
109 
FontsListHasLoaded()110 void FontSettingsHandler::FontsListHasLoaded() {
111   ListValue* fonts_list = fonts_list_loader_->GetFontsList();
112 
113   ListValue encoding_list;
114   const std::vector<CharacterEncoding::EncodingInfo>* encodings;
115   PrefService* pref_service = web_ui_->GetProfile()->GetPrefs();
116   encodings = CharacterEncoding::GetCurrentDisplayEncodings(
117       g_browser_process->GetApplicationLocale(),
118       pref_service->GetString(prefs::kStaticEncodings),
119       pref_service->GetString(prefs::kRecentlySelectedEncoding));
120   DCHECK(encodings);
121   DCHECK(!encodings->empty());
122 
123   std::vector<CharacterEncoding::EncodingInfo>::const_iterator it;
124   for (it = encodings->begin(); it != encodings->end(); ++it) {
125     ListValue* option = new ListValue();
126     if (it->encoding_id) {
127       int cmd_id = it->encoding_id;
128       std::string encoding =
129       CharacterEncoding::GetCanonicalEncodingNameByCommandId(cmd_id);
130       string16 name = it->encoding_display_name;
131       base::i18n::AdjustStringForLocaleDirection(&name);
132       option->Append(Value::CreateStringValue(encoding));
133       option->Append(Value::CreateStringValue(name));
134     } else {
135       // Add empty name/value to indicate a separator item.
136       option->Append(Value::CreateStringValue(""));
137       option->Append(Value::CreateStringValue(""));
138     }
139     encoding_list.Append(option);
140   }
141 
142   ListValue selected_values;
143   selected_values.Append(Value::CreateStringValue(standard_font_.GetValue()));
144   selected_values.Append(Value::CreateStringValue(serif_font_.GetValue()));
145   selected_values.Append(Value::CreateStringValue(sans_serif_font_.GetValue()));
146   selected_values.Append(Value::CreateStringValue(fixed_font_.GetValue()));
147   selected_values.Append(Value::CreateStringValue(font_encoding_.GetValue()));
148 
149   web_ui_->CallJavascriptFunction("FontSettings.setFontsData",
150                                   *fonts_list, encoding_list, selected_values);
151 }
152 
Observe(NotificationType type,const NotificationSource & source,const NotificationDetails & details)153 void FontSettingsHandler::Observe(NotificationType type,
154                                   const NotificationSource& source,
155                                   const NotificationDetails& details) {
156   if (type == NotificationType::PREF_CHANGED) {
157     std::string* pref_name = Details<std::string>(details).ptr();
158     if (*pref_name == prefs::kWebKitStandardFontFamily) {
159       SetUpStandardFontSample();
160     } else if (*pref_name == prefs::kWebKitSerifFontFamily) {
161       SetUpSerifFontSample();
162     } else if (*pref_name == prefs::kWebKitSansSerifFontFamily) {
163       SetUpSansSerifFontSample();
164     } else if (*pref_name == prefs::kWebKitFixedFontFamily ||
165                *pref_name == prefs::kWebKitDefaultFixedFontSize) {
166       SetUpFixedFontSample();
167     } else if (*pref_name == prefs::kWebKitDefaultFontSize) {
168       SetUpStandardFontSample();
169       SetUpSerifFontSample();
170       SetUpSansSerifFontSample();
171     } else if (*pref_name == prefs::kWebKitMinimumFontSize) {
172       SetUpMinimumFontSample();
173     }
174   }
175 }
176 
SetUpStandardFontSample()177 void FontSettingsHandler::SetUpStandardFontSample() {
178   StringValue font_value(standard_font_.GetValue());
179   FundamentalValue size_value(default_font_size_.GetValue());
180   web_ui_->CallJavascriptFunction(
181       "FontSettings.setUpStandardFontSample", font_value, size_value);
182 }
183 
SetUpSerifFontSample()184 void FontSettingsHandler::SetUpSerifFontSample() {
185   StringValue font_value(serif_font_.GetValue());
186   FundamentalValue size_value(default_font_size_.GetValue());
187   web_ui_->CallJavascriptFunction(
188       "FontSettings.setUpSerifFontSample", font_value, size_value);
189 }
190 
SetUpSansSerifFontSample()191 void FontSettingsHandler::SetUpSansSerifFontSample() {
192   StringValue font_value(sans_serif_font_.GetValue());
193   FundamentalValue size_value(default_font_size_.GetValue());
194   web_ui_->CallJavascriptFunction(
195       "FontSettings.setUpSansSerifFontSample", font_value, size_value);
196 }
197 
SetUpFixedFontSample()198 void FontSettingsHandler::SetUpFixedFontSample() {
199   StringValue font_value(fixed_font_.GetValue());
200   FundamentalValue size_value(default_fixed_font_size_.GetValue());
201   web_ui_->CallJavascriptFunction(
202       "FontSettings.setUpFixedFontSample", font_value, size_value);
203 }
204 
SetUpMinimumFontSample()205 void FontSettingsHandler::SetUpMinimumFontSample() {
206   FundamentalValue size_value(minimum_font_size_.GetValue());
207   web_ui_->CallJavascriptFunction("FontSettings.setUpMinimumFontSample",
208                                   size_value);
209 }
210