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