font_settings_handler.cc revision 1e9bf3e0803691d0a228da41fc608347b6db4340
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/webui/options/font_settings_handler.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind_helpers.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_number_conversions.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_process.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/character_encoding.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
211e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_service.h"
221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/extensions/extension_tab_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/font_settings_utils.h"
271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/common/extensions/extension.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/font_list_async.h"
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/notification_service.h"
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/chromium_strings.h"
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "url/gurl.h"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/font.h"
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/platform_font_win.h"
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the localized name of a font so that settings can find it within the
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// list of system fonts. On Windows, the list of system fonts has names only
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for the system locale, but the pref value may be in the English name.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string MaybeGetLocalizedFontName(const std::string& font_name) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Font font(font_name, 12);  // dummy font size
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return static_cast<gfx::PlatformFontWin*>(font.platform_font())->
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetLocalizedFontName();
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return font_name;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const char kAdvancedFontSettingsExtensionId[] =
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    "caclkomlalccbpcdllchkeecicepbmbm";
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace options {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FontSettingsHandler::FontSettingsHandler() {
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)FontSettingsHandler::~FontSettingsHandler() {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::GetLocalizedValues(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DictionaryValue* localized_strings) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(localized_strings);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static OptionsStringResource resources[] = {
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsStandard",
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_STANDARD_LABEL },
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsSerif",
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_SERIF_LABEL },
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsSansSerif",
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_SANS_SERIF_LABEL },
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsFixedWidth",
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_FONT_SELECTOR_FIXED_WIDTH_LABEL },
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsMinimumSize",
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_MINIMUM_FONT_SIZE_TITLE },
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsEncoding",
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_FONT_SUB_DIALOG_ENCODING_TITLE },
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsSizeTiny",
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_FONT_SIZE_TINY },
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsSizeHuge",
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_FONT_SIZE_HUGE },
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { "fontSettingsLoremIpsum",
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_LOREM_IPSUM },
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    { "advancedFontSettingsOptions",
961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      IDS_FONT_LANGUAGE_SETTING_ADVANCED_FONT_SETTINGS_OPTIONS }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterStrings(localized_strings, resources, arraysize(resources));
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterTitle(localized_strings, "fontSettingsPage",
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                IDS_FONT_LANGUAGE_SETTING_FONT_TAB_TITLE);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  localized_strings->SetString("fontSettingsPlaceholder",
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          IDS_FONT_LANGUAGE_SETTING_PLACEHOLDER));
1051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  GURL install_url(extension_urls::GetWebstoreItemDetailURLPrefix());
1071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  localized_strings->SetString("advancedFontSettingsInstall",
1081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      l10n_util::GetStringFUTF16(
1091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          IDS_FONT_LANGUAGE_SETTING_ADVANCED_FONT_SETTINGS_INSTALL,
1101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)          UTF8ToUTF16(
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)              install_url.Resolve(kAdvancedFontSettingsExtensionId).spec())));
1121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FontSettingsHandler::InitializeHandler() {
1151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
1161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 content::NotificationService::AllSources());
1171e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED,
1181e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 content::NotificationService::AllSources());
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::InitializePage() {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(web_ui());
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUpStandardFontSample();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUpSerifFontSample();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUpSansSerifFontSample();
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUpFixedFontSample();
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SetUpMinimumFontSample();
1281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  NotifyAdvancedFontSettingsAvailability();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::RegisterMessages() {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Perform validation for saved fonts.
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service = Profile::FromWebUI(web_ui())->GetPrefs();
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FontSettingsUtilities::ValidateSavedFonts(pref_service);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register for preferences that we need to observe manually.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  font_encoding_.Init(prefs::kDefaultCharset, pref_service);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  standard_font_.Init(prefs::kWebKitStandardFontFamily,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      pref_service,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                      base::Bind(&FontSettingsHandler::SetUpStandardFontSample,
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 base::Unretained(this)));
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  serif_font_.Init(prefs::kWebKitSerifFontFamily,
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   pref_service,
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   base::Bind(&FontSettingsHandler::SetUpSerifFontSample,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              base::Unretained(this)));
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sans_serif_font_.Init(
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kWebKitSansSerifFontFamily,
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service,
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&FontSettingsHandler::SetUpSansSerifFontSample,
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::Closure callback = base::Bind(
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      &FontSettingsHandler::SetUpFixedFontSample, base::Unretained(this));
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  fixed_font_.Init(prefs::kWebKitFixedFontFamily, pref_service, callback);
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  default_fixed_font_size_.Init(prefs::kWebKitDefaultFixedFontSize,
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                pref_service, callback);
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  default_font_size_.Init(
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kWebKitDefaultFontSize,
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service,
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&FontSettingsHandler::OnWebKitDefaultFontSizeChanged,
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  minimum_font_size_.Init(
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      prefs::kWebKitMinimumFontSize,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      pref_service,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Bind(&FontSettingsHandler::SetUpMinimumFontSample,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 base::Unretained(this)));
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->RegisterMessageCallback("fetchFontsData",
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&FontSettingsHandler::HandleFetchFontsData,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  web_ui()->RegisterMessageCallback("openAdvancedFontSettingsOptions",
1741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::Bind(&FontSettingsHandler::HandleOpenAdvancedFontSettingsOptions,
1751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                 base::Unretained(this)));
1761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
1771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1781e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FontSettingsHandler::Observe(int type,
1791e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  const content::NotificationSource& source,
1801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)                                  const content::NotificationDetails& details) {
1811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  DCHECK(type == chrome::NOTIFICATION_EXTENSION_LOADED ||
1821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)         type == chrome::NOTIFICATION_EXTENSION_UNLOADED);
1831e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  NotifyAdvancedFontSettingsAvailability();
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::HandleFetchFontsData(const ListValue* args) {
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::GetFontListAsync(
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::Bind(&FontSettingsHandler::FontsListHasLoaded,
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                 base::Unretained(this)));
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::FontsListHasLoaded(
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<base::ListValue> list) {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Selects the directionality for the fonts in the given list.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < list->GetSize(); i++) {
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* font;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_font = list->GetList(i, &font);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(has_font);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 value;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_value = font->GetString(1, &value);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(has_value);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_rtl_chars = base::i18n::StringContainsStrongRTLChars(value);
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    font->Append(new base::StringValue(has_rtl_chars ? "rtl" : "ltr"));
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue encoding_list;
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const std::vector<CharacterEncoding::EncodingInfo>* encodings;
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PrefService* pref_service = Profile::FromWebUI(web_ui())->GetPrefs();
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  encodings = CharacterEncoding::GetCurrentDisplayEncodings(
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      g_browser_process->GetApplicationLocale(),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service->GetString(prefs::kStaticEncodings),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      pref_service->GetString(prefs::kRecentlySelectedEncoding));
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(encodings);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!encodings->empty());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<CharacterEncoding::EncodingInfo>::const_iterator it;
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (it = encodings->begin(); it != encodings->end(); ++it) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ListValue* option = new ListValue();
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (it->encoding_id) {
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int cmd_id = it->encoding_id;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string encoding =
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CharacterEncoding::GetCanonicalEncodingNameByCommandId(cmd_id);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      string16 name = it->encoding_display_name;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      bool has_rtl_chars = base::i18n::StringContainsStrongRTLChars(name);
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      option->Append(new base::StringValue(encoding));
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      option->Append(new base::StringValue(name));
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      option->Append(new base::StringValue(has_rtl_chars ? "rtl" : "ltr"));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Add empty name/value to indicate a separator item.
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      option->Append(new base::StringValue(std::string()));
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      option->Append(new base::StringValue(std::string()));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    encoding_list.Append(option);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ListValue selected_values;
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_values.Append(new base::StringValue(MaybeGetLocalizedFontName(
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      standard_font_.GetValue())));
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_values.Append(new base::StringValue(MaybeGetLocalizedFontName(
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      serif_font_.GetValue())));
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_values.Append(new base::StringValue(MaybeGetLocalizedFontName(
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sans_serif_font_.GetValue())));
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_values.Append(new base::StringValue(MaybeGetLocalizedFontName(
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      fixed_font_.GetValue())));
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  selected_values.Append(new base::StringValue(font_encoding_.GetValue()));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("FontSettings.setFontsData",
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   *list.get(), encoding_list,
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   selected_values);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::SetUpStandardFontSample() {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue font_value(standard_font_.GetValue());
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue size_value(default_font_size_.GetValue());
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FontSettings.setUpStandardFontSample", font_value, size_value);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::SetUpSerifFontSample() {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue font_value(serif_font_.GetValue());
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue size_value(default_font_size_.GetValue());
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FontSettings.setUpSerifFontSample", font_value, size_value);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::SetUpSansSerifFontSample() {
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue font_value(sans_serif_font_.GetValue());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue size_value(default_font_size_.GetValue());
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FontSettings.setUpSansSerifFontSample", font_value, size_value);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::SetUpFixedFontSample() {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::StringValue font_value(fixed_font_.GetValue());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue size_value(default_fixed_font_size_.GetValue());
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FontSettings.setUpFixedFontSample", font_value, size_value);
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void FontSettingsHandler::SetUpMinimumFontSample() {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::FundamentalValue size_value(minimum_font_size_.GetValue());
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  web_ui()->CallJavascriptFunction("FontSettings.setUpMinimumFontSample",
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   size_value);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2861e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)const extensions::Extension*
2871e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)FontSettingsHandler::GetAdvancedFontSettingsExtension() {
2881e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  Profile* profile = Profile::FromWebUI(web_ui());
2891e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionService* service =
2901e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      extensions::ExtensionSystem::Get(profile)->extension_service();
2911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!service->IsExtensionEnabled(kAdvancedFontSettingsExtensionId))
2921e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return NULL;
2931e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  return service->GetInstalledExtension(kAdvancedFontSettingsExtensionId);
2941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
2951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
2961e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FontSettingsHandler::NotifyAdvancedFontSettingsAvailability() {
2971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  web_ui()->CallJavascriptFunction(
2981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      "FontSettings.notifyAdvancedFontSettingsAvailability",
2991e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      base::FundamentalValue(GetAdvancedFontSettingsExtension() != NULL));
3001e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3011e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3021e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)void FontSettingsHandler::HandleOpenAdvancedFontSettingsOptions(
3031e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    const base::ListValue* args) {
3041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const extensions::Extension* extension = GetAdvancedFontSettingsExtension();
3051e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!extension)
3061e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return;
3071e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  ExtensionTabUtil::OpenOptionsPage(extension,
3081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      chrome::FindBrowserWithWebContents(web_ui()->GetWebContents()));
3091e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}
3101e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void FontSettingsHandler::OnWebKitDefaultFontSizeChanged() {
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpStandardFontSample();
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpSerifFontSample();
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetUpSansSerifFontSample();
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace options
318