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