font_settings_handler.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
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_tab_util.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/options/font_settings_utils.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/font_list_async.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h" 291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/notification_service.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui.h" 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.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( 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::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, 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::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) 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void FontSettingsHandler::HandleFetchFontsData(const base::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++) { 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* font; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool has_font = list->GetList(i, &font); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(has_font); 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::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) 2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::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) { 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::ListValue* option = new base::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); 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::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) 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::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; 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::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