172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/options_ui.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include <algorithm> 821d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include <vector> 93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/callback.h" 11731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/command_line.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/singleton.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/message_loop.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_piece.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/threading/thread.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h" 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/values.h" 193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/browser/browser_about_handler.h" 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/metrics/user_metrics.h" 2121d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/profiles/profile.h" 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/about_page_handler.h" 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/advanced_options_handler.h" 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/autofill_options_handler.h" 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/browser_options_handler.h" 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/clear_browser_data_handler.h" 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/content_settings_handler.h" 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/cookies_view_handler.h" 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/core_options_handler.h" 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/font_settings_handler.h" 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/import_data_handler.h" 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/language_options_handler.h" 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/password_manager_handler.h" 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/personal_options_handler.h" 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/search_engine_manager_handler.h" 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/stop_syncing_handler.h" 37ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/sync_setup_handler.h" 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/theme_source.h" 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/jstemplate_builder.h" 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/time_format.h" 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/url_constants.h" 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/render_view_host.h" 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_delegate.h" 46ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h" 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/browser_resources.h" 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h" 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/locale_settings.h" 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/theme_resources.h" 523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "net/base/escape.h" 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/resource/resource_bundle.h" 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_CHROMEOS) 56ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/accounts_options_handler.h" 57ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/change_picture_options_handler.h" 58ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/core_chromeos_options_handler.h" 59ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.h" 60ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/internet_options_handler.h" 61ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/language_chewing_handler.h" 62ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/language_customize_modifier_keys_handler.h" 63ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/language_hangul_handler.h" 64ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/language_mozc_handler.h" 65ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/language_pinyin_handler.h" 66ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/proxy_handler.h" 67ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/stats_options_handler.h" 68ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/system_options_handler.h" 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/webui/options/chromeos/user_image_source.h" 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 723345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_NSS) 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/ui/webui/options/certificate_manager_handler.h" 743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OptionsUIHTMLSource 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass OptionsUIHTMLSource : public ChromeURLDataManager::DataSource { 83ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen public: 84ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // The constructor takes over ownership of |localized_strings|. 85ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen explicit OptionsUIHTMLSource(DictionaryValue* localized_strings); 86ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual ~OptionsUIHTMLSource(); 87ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 88ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Called when the network layer has requested a resource underneath 89ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // the path we registered. 90ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual void StartDataRequest(const std::string& path, 91ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_incognito, 92ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen int request_id); 93ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen virtual std::string GetMimeType(const std::string&) const; 94ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 95ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen private: 96ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Localized strings collection. 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen scoped_ptr<DictionaryValue> localized_strings_; 98ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen DISALLOW_COPY_AND_ASSIGN(OptionsUIHTMLSource); 100ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}; 101ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOptionsUIHTMLSource::OptionsUIHTMLSource(DictionaryValue* localized_strings) 1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick : DataSource(chrome::kChromeUISettingsHost, MessageLoop::current()) { 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(localized_strings); 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch localized_strings_.reset(localized_strings); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 108731df977c0511bca2206b5f333555b1205ff1f43Iain MerrickOptionsUIHTMLSource::~OptionsUIHTMLSource() {} 109731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OptionsUIHTMLSource::StartDataRequest(const std::string& path, 111ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen bool is_incognito, 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int request_id) { 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SetFontAndTextDirection(localized_strings_.get()); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static const base::StringPiece options_html( 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ResourceBundle::GetSharedInstance().GetRawDataResource( 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDR_OPTIONS_HTML)); 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string full_html = jstemplate_builder::GetI18nTemplateHtml( 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch options_html, localized_strings_.get()); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch html_bytes->data.resize(full_html.size()); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin()); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SendResponse(request_id, html_bytes); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 128731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickstd::string OptionsUIHTMLSource::GetMimeType(const std::string&) const { 129731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick return "text/html"; 130731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OptionsPageUIHandler 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOptionsPageUIHandler::OptionsPageUIHandler() { 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochOptionsPageUIHandler::~OptionsPageUIHandler() { 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 14421d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsenbool OptionsPageUIHandler::IsEnabled() { 14521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen return true; 14621d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen} 14721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OptionsPageUIHandler::UserMetricsRecordAction( 1493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick const UserMetricsAction& action) { 15072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen UserMetrics::RecordAction(action, web_ui_->GetProfile()); 15172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 15272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 15372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// static 15472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OptionsPageUIHandler::RegisterStrings( 15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DictionaryValue* localized_strings, 15672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const OptionsStringResource* resources, 15772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen size_t length) { 15872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (size_t i = 0; i < length; ++i) { 15972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen localized_strings->SetString( 160ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen resources[i].name, l10n_util::GetStringUTF16(resources[i].id)); 16172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 16272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 16372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenvoid OptionsPageUIHandler::RegisterTitle(DictionaryValue* localized_strings, 16572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& variable_name, 16672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen int title_id) { 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen localized_strings->SetString(variable_name, 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen l10n_util::GetStringUTF16(title_id)); 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen localized_strings->SetString(variable_name + "TabTitle", 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen l10n_util::GetStringFUTF16(IDS_OPTIONS_TAB_TITLE, 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen l10n_util::GetStringUTF16(IDS_SETTINGS_TITLE), 17272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen l10n_util::GetStringUTF16(title_id))); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OptionsUI 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//////////////////////////////////////////////////////////////////////////////// 180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenOptionsUI::OptionsUI(TabContents* contents) 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen : WebUI(contents), initialized_handlers_(false) { 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DictionaryValue* localized_strings = new DictionaryValue(); 184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CoreOptionsHandler* core_handler; 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(OS_CHROMEOS) 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen core_handler = new chromeos::CoreChromeOSOptionsHandler(); 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#else 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen core_handler = new CoreOptionsHandler(); 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen core_handler->set_handlers_host(this); 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddOptionsPageUIHandler(localized_strings, core_handler); 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 1943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new AdvancedOptionsHandler()); 195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddOptionsPageUIHandler(localized_strings, new AutofillOptionsHandler()); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddOptionsPageUIHandler(localized_strings, new BrowserOptionsHandler()); 1973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new ClearBrowserDataHandler()); 1983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new ContentSettingsHandler()); 1993345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new CookiesViewHandler()); 2003345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new FontSettingsHandler()); 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#if defined(OS_CHROMEOS) 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddOptionsPageUIHandler(localized_strings, 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen new chromeos::CrosLanguageOptionsHandler()); 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#else 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen AddOptionsPageUIHandler(localized_strings, new LanguageOptionsHandler()); 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#endif 20721d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen AddOptionsPageUIHandler(localized_strings, new PasswordManagerHandler()); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddOptionsPageUIHandler(localized_strings, new PersonalOptionsHandler()); 2093345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new SearchEngineManagerHandler()); 2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new ImportDataHandler()); 211731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddOptionsPageUIHandler(localized_strings, new StopSyncingHandler()); 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddOptionsPageUIHandler(localized_strings, new SyncSetupHandler()); 2133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(OS_CHROMEOS) 2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new AboutPageHandler()); 2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, 2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new chromeos::AccountsOptionsHandler()); 2173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new InternetOptionsHandler()); 218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddOptionsPageUIHandler(localized_strings, 219ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new chromeos::LanguageChewingHandler()); 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch AddOptionsPageUIHandler(localized_strings, 2213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick new chromeos::LanguageCustomizeModifierKeysHandler()); 2223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, 223ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new chromeos::LanguageHangulHandler()); 2243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new chromeos::LanguageMozcHandler()); 2263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, 227ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new chromeos::LanguagePinyinHandler()); 2283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new chromeos::ProxyHandler()); 229731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddOptionsPageUIHandler(localized_strings, 230ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen new chromeos::ChangePictureOptionsHandler()); 231ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen AddOptionsPageUIHandler(localized_strings, 232731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick new chromeos::StatsOptionsHandler()); 2333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new SystemOptionsHandler()); 2343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#endif 2353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#if defined(USE_NSS) 2363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick AddOptionsPageUIHandler(localized_strings, new CertificateManagerHandler()); 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // |localized_strings| ownership is taken over by this constructor. 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch OptionsUIHTMLSource* html_source = 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new OptionsUIHTMLSource(localized_strings); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 2433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Set up the chrome://settings/ source. 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source); 2453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Set up the chrome://theme/ source. 247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ThemeSource* theme = new ThemeSource(contents->profile()); 24872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen contents->profile()->GetChromeURLDataManager()->AddDataSource(theme); 2493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if defined(OS_CHROMEOS) 251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Set up the chrome://userimage/ source. 252dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen chromeos::UserImageSource* user_image_source = 253dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen new chromeos::UserImageSource(); 254dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen contents->profile()->GetChromeURLDataManager()->AddDataSource( 255dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen user_image_source); 256dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif 257dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 2583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // Initialize the chrome://about/ source in case the user clicks the credits 2593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen // link. 26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InitializeAboutDataSource(contents->profile()); 2613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick} 2623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick 2633345a6884c488ff3a535c2c9acdd33d74b37e311Iain MerrickOptionsUI::~OptionsUI() { 2643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick // Uninitialize all registered handlers. The base class owns them and it will 26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // eventually delete them. Skip over the generic handler. 26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (std::vector<WebUIMessageHandler*>::iterator iter = handlers_.begin() + 1; 2673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick iter != handlers_.end(); 2683345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick ++iter) { 269731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick static_cast<OptionsPageUIHandler*>(*iter)->Uninitialize(); 2703345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick } 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 273731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick// Override. 274731df977c0511bca2206b5f333555b1205ff1f43Iain Merrickvoid OptionsUI::RenderViewCreated(RenderViewHost* render_view_host) { 275731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::string command_line_string; 276731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 277731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#if defined(OS_WIN) 278731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick std::wstring wstr = CommandLine::ForCurrentProcess()->command_line_string(); 279731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick command_line_string = WideToASCII(wstr); 280731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#else 281731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick command_line_string = CommandLine::ForCurrentProcess()->command_line_string(); 282731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#endif 283731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 28472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen render_view_host->SetWebUIProperty("commandLineString", command_line_string); 28572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WebUI::RenderViewCreated(render_view_host); 286731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick} 287731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick 288201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdochvoid OptionsUI::DidBecomeActiveForReusedRenderView() { 289201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // When the renderer is re-used (e.g., for back/forward navigation within 290201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // options), the handlers are torn down and rebuilt, so are no longer 291201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // initialized, but the web page's DOM may remain intact, in which case onload 292201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // won't fire to initilize the handlers. To make sure initialization always 293201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // happens, call reinitializeCore (which is a no-op unless the DOM was already 294201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch // initialized). 295ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen CallJavascriptFunction("OptionsPage.reinitializeCore"); 296201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 29772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen WebUI::DidBecomeActiveForReusedRenderView(); 298201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch} 299201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochRefCountedMemory* OptionsUI::GetFaviconResourceBytes() { 3023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick return ResourceBundle::GetSharedInstance(). 3033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick LoadDataResourceBytes(IDR_SETTINGS_FAVICON); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OptionsUI::InitializeHandlers() { 30772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen DCHECK(!GetProfile()->IsOffTheRecord() || Profile::IsGuestSession()); 30872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 30972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // The reinitialize call from DidBecomeActiveForReusedRenderView end up being 31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // delivered after a new web page DOM has been brought up in an existing 31172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // renderer (due to IPC delays), causing this method to be called twice. If 31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // that happens, ignore the second call. 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen if (initialized_handlers_) 31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return; 31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen initialized_handlers_ = true; 31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 31772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::vector<WebUIMessageHandler*>::iterator iter; 31872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Skip over the generic handler. 31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (iter = handlers_.begin() + 1; iter != handlers_.end(); ++iter) { 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (static_cast<OptionsPageUIHandler*>(*iter))->Initialize(); 321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid OptionsUI::AddOptionsPageUIHandler(DictionaryValue* localized_strings, 325731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick OptionsPageUIHandler* handler_raw) { 326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick scoped_ptr<OptionsPageUIHandler> handler(handler_raw); 327731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick DCHECK(handler.get()); 328731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Add only if handler's service is enabled. 329731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick if (handler->IsEnabled()) { 330731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick handler->GetLocalizedValues(localized_strings); 331731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick // Add handler to the list and also pass the ownership. 332731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick AddMessageHandler(handler.release()->Attach(this)); 333731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick } 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 335