Index: chrome/browser/ui/webui/options2/options_ui2.cc |
diff --git a/chrome/browser/ui/webui/options2/options_ui2.cc b/chrome/browser/ui/webui/options2/options_ui2.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..879361ac4bc83c08ad5ea4e9262f7ab39a2eef61 |
--- /dev/null |
+++ b/chrome/browser/ui/webui/options2/options_ui2.cc |
@@ -0,0 +1,368 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/ui/webui/options2/options_ui2.h" |
+ |
+#include <algorithm> |
+#include <vector> |
+ |
+#include "base/callback.h" |
+#include "base/command_line.h" |
+#include "base/memory/singleton.h" |
+#include "base/message_loop.h" |
+#include "base/string_piece.h" |
+#include "base/string_util.h" |
+#include "base/threading/thread.h" |
+#include "base/time.h" |
+#include "base/values.h" |
+#include "chrome/browser/browser_about_handler.h" |
+#include "chrome/browser/browser_process.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/browser/ui/webui/options2/advanced_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/autofill_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/browser_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/clear_browser_data_handler.h" |
+#include "chrome/browser/ui/webui/options2/content_settings_handler.h" |
+#include "chrome/browser/ui/webui/options2/cookies_view_handler.h" |
+#include "chrome/browser/ui/webui/options2/core_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/extension_settings_handler.h" |
+#include "chrome/browser/ui/webui/options2/font_settings_handler.h" |
+#include "chrome/browser/ui/webui/options2/handler_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/import_data_handler.h" |
+#include "chrome/browser/ui/webui/options2/language_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/manage_profile_handler.h" |
+#include "chrome/browser/ui/webui/options2/options_sync_setup_handler.h" |
+#include "chrome/browser/ui/webui/options2/pack_extension_handler.h" |
+#include "chrome/browser/ui/webui/options2/password_manager_handler.h" |
+#include "chrome/browser/ui/webui/options2/personal_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/search_engine_manager_handler.h" |
+#include "chrome/browser/ui/webui/options2/stop_syncing_handler.h" |
+#include "chrome/browser/ui/webui/options2/web_intents_settings_handler.h" |
+#include "chrome/browser/ui/webui/theme_source.h" |
+#include "chrome/common/jstemplate_builder.h" |
+#include "chrome/common/time_format.h" |
+#include "chrome/common/url_constants.h" |
+#include "content/browser/renderer_host/render_view_host.h" |
+#include "content/browser/tab_contents/tab_contents.h" |
+#include "content/browser/tab_contents/tab_contents_delegate.h" |
+#include "content/public/browser/browser_thread.h" |
+#include "content/public/browser/notification_types.h" |
+#include "grit/chromium_strings.h" |
+#include "grit/generated_resources.h" |
+#include "grit/locale_settings.h" |
+#include "grit/options2_resources.h" |
+#include "grit/theme_resources.h" |
+#include "grit/theme_resources_standard.h" |
+#include "net/base/escape.h" |
+#include "ui/base/resource/resource_bundle.h" |
+ |
+#if defined(OS_CHROMEOS) |
+#include "chrome/browser/ui/webui/options2/chromeos/about_page_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/accounts_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/bluetooth_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/change_picture_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/core_chromeos_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/cros_language_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/internet_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/language_chewing_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/language_customize_modifier_keys_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/language_hangul_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/language_mozc_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/language_pinyin_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/proxy_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/stats_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/system_options_handler.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/user_image_source.h" |
+#include "chrome/browser/ui/webui/options2/chromeos/virtual_keyboard_manager_handler.h" |
+#endif |
+ |
+#if defined(USE_NSS) |
+#include "chrome/browser/ui/webui/options2/certificate_manager_handler.h" |
+#endif |
+ |
+static const char kLocalizedStringsFile[] = "strings.js"; |
+static const char kOptionsBundleJsFile[] = "options_bundle.js"; |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// |
+// Options2UIHTMLSource |
+// |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+class Options2UIHTMLSource : public ChromeURLDataManager::DataSource { |
+ public: |
+ // The constructor takes over ownership of |localized_strings|. |
+ explicit Options2UIHTMLSource(DictionaryValue* localized_strings); |
+ virtual ~Options2UIHTMLSource(); |
+ |
+ // Called when the network layer has requested a resource underneath |
+ // the path we registered. |
+ virtual void StartDataRequest(const std::string& path, |
+ bool is_incognito, |
+ int request_id); |
+ virtual std::string GetMimeType(const std::string&) const; |
+ |
+ private: |
+ // Localized strings collection. |
+ scoped_ptr<DictionaryValue> localized_strings_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(Options2UIHTMLSource); |
+}; |
+ |
+Options2UIHTMLSource::Options2UIHTMLSource(DictionaryValue* localized_strings) |
+ : DataSource(chrome::kChromeUISettingsFrameHost, MessageLoop::current()) { |
+ DCHECK(localized_strings); |
+ localized_strings_.reset(localized_strings); |
+} |
+ |
+Options2UIHTMLSource::~Options2UIHTMLSource() {} |
+ |
+void Options2UIHTMLSource::StartDataRequest(const std::string& path, |
+ bool is_incognito, |
+ int request_id) { |
+ scoped_refptr<RefCountedMemory> response_bytes; |
+ SetFontAndTextDirection(localized_strings_.get()); |
+ |
+ if (path == kLocalizedStringsFile) { |
+ // Return dynamically-generated strings from memory. |
+ std::string strings_js; |
+ jstemplate_builder::AppendJsonJS(localized_strings_.get(), &strings_js); |
+ response_bytes = base::RefCountedString::TakeString(&strings_js); |
+ } else if (path == kOptionsBundleJsFile) { |
+ // Return (and cache) the options javascript code. |
+ response_bytes = ResourceBundle::GetSharedInstance().LoadDataResourceBytes( |
+ IDR_OPTIONS2_BUNDLE_JS); |
+ } else { |
+ // Return (and cache) the main options html page as the default. |
+ response_bytes = ResourceBundle::GetSharedInstance().LoadDataResourceBytes( |
+ IDR_OPTIONS2_HTML); |
+ } |
+ |
+ SendResponse(request_id, response_bytes); |
+} |
+ |
+std::string Options2UIHTMLSource::GetMimeType(const std::string& path) const { |
+ if (path == kLocalizedStringsFile || path == kOptionsBundleJsFile) |
+ return "application/javascript"; |
+ |
+ return "text/html"; |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// |
+// OptionsPage2UIHandler |
+// |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+OptionsPage2UIHandler::OptionsPage2UIHandler() { |
+} |
+ |
+OptionsPage2UIHandler::~OptionsPage2UIHandler() { |
+} |
+ |
+bool OptionsPage2UIHandler::IsEnabled() { |
+ return true; |
+} |
+ |
+// static |
+void OptionsPage2UIHandler::RegisterStrings( |
+ DictionaryValue* localized_strings, |
+ const OptionsStringResource* resources, |
+ size_t length) { |
+ for (size_t i = 0; i < length; ++i) { |
+ localized_strings->SetString( |
+ resources[i].name, l10n_util::GetStringUTF16(resources[i].id)); |
+ } |
+} |
+ |
+void OptionsPage2UIHandler::RegisterTitle(DictionaryValue* localized_strings, |
+ const std::string& variable_name, |
+ int title_id) { |
+ localized_strings->SetString(variable_name, |
+ l10n_util::GetStringUTF16(title_id)); |
+ localized_strings->SetString(variable_name + "TabTitle", |
+ l10n_util::GetStringFUTF16(IDS_OPTIONS_TAB_TITLE, |
+ l10n_util::GetStringUTF16(IDS_SETTINGS_TITLE), |
+ l10n_util::GetStringUTF16(title_id))); |
+} |
+ |
+//////////////////////////////////////////////////////////////////////////////// |
+// |
+// Options2UI |
+// |
+//////////////////////////////////////////////////////////////////////////////// |
+ |
+Options2UI::Options2UI(TabContents* contents) |
+ : ChromeWebUI(contents), |
+ initialized_handlers_(false) { |
+ DictionaryValue* localized_strings = new DictionaryValue(); |
+ |
+ CoreOptionsHandler* core_handler; |
+#if defined(OS_CHROMEOS) |
+ core_handler = new chromeos::CoreChromeOSOptionsHandler(); |
+#else |
+ core_handler = new CoreOptionsHandler(); |
+#endif |
+ core_handler->set_handlers_host(this); |
+ AddOptionsPageUIHandler(localized_strings, core_handler); |
+ |
+ AddOptionsPageUIHandler(localized_strings, new AdvancedOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new AutofillOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new BrowserOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new ClearBrowserDataHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new ContentSettingsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new CookiesViewHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new ExtensionSettingsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new FontSettingsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new WebIntentsSettingsHandler()); |
+#if defined(OS_CHROMEOS) |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::CrosLanguageOptionsHandler()); |
+#else |
+ AddOptionsPageUIHandler(localized_strings, new LanguageOptionsHandler()); |
+#endif |
+ AddOptionsPageUIHandler(localized_strings, new ManageProfileHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new PackExtensionHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new PasswordManagerHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new PersonalOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new SearchEngineManagerHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new ImportDataHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new StopSyncingHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new OptionsSyncSetupHandler( |
+ g_browser_process->profile_manager())); |
+#if defined(OS_CHROMEOS) |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::AboutPageHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::AccountsOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::BluetoothOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new InternetOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::LanguageChewingHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::LanguageCustomizeModifierKeysHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::LanguageHangulHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::LanguageMozcHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::LanguagePinyinHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::VirtualKeyboardManagerHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::ProxyHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::ChangePictureOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, |
+ new chromeos::StatsOptionsHandler()); |
+ AddOptionsPageUIHandler(localized_strings, new SystemOptionsHandler()); |
+#endif |
+#if defined(USE_NSS) |
+ AddOptionsPageUIHandler(localized_strings, new CertificateManagerHandler()); |
+#endif |
+ AddOptionsPageUIHandler(localized_strings, new HandlerOptionsHandler()); |
+ |
+ // |localized_strings| ownership is taken over by this constructor. |
+ Options2UIHTMLSource* html_source = |
+ new Options2UIHTMLSource(localized_strings); |
+ |
+ // Set up the chrome://settings-frame/ source. |
+ Profile* profile = Profile::FromBrowserContext(contents->browser_context()); |
+ profile->GetChromeURLDataManager()->AddDataSource(html_source); |
+ |
+ // Set up the chrome://theme/ source. |
+ ThemeSource* theme = new ThemeSource(profile); |
+ profile->GetChromeURLDataManager()->AddDataSource(theme); |
+ |
+#if defined(OS_CHROMEOS) |
+ // Set up the chrome://userimage/ source. |
+ chromeos::UserImageSource* user_image_source = |
+ new chromeos::UserImageSource(); |
+ profile->GetChromeURLDataManager()->AddDataSource(user_image_source); |
+#endif |
+} |
+ |
+Options2UI::~Options2UI() { |
+ // Uninitialize all registered handlers. The base class owns them and it will |
+ // eventually delete them. Skip over the generic handler. |
+ for (std::vector<WebUIMessageHandler*>::iterator iter = handlers_.begin() + 1; |
+ iter != handlers_.end(); |
+ ++iter) { |
+ static_cast<OptionsPage2UIHandler*>(*iter)->Uninitialize(); |
+ } |
+} |
+ |
+// Override. |
+void Options2UI::RenderViewCreated(RenderViewHost* render_view_host) { |
+ SetCommandLineString(render_view_host); |
+ ChromeWebUI::RenderViewCreated(render_view_host); |
+} |
+ |
+void Options2UI::RenderViewReused(RenderViewHost* render_view_host) { |
+ SetCommandLineString(render_view_host); |
+ ChromeWebUI::RenderViewReused(render_view_host); |
+} |
+ |
+void Options2UI::DidBecomeActiveForReusedRenderView() { |
+ // When the renderer is re-used (e.g., for back/forward navigation within |
+ // options), the handlers are torn down and rebuilt, so are no longer |
+ // initialized, but the web page's DOM may remain intact, in which case onload |
+ // won't fire to initilize the handlers. To make sure initialization always |
+ // happens, call reinitializeCore (which is a no-op unless the DOM was already |
+ // initialized). |
+ CallJavascriptFunction("OptionsPage.reinitializeCore"); |
+ |
+ ChromeWebUI::DidBecomeActiveForReusedRenderView(); |
+} |
+ |
+// static |
+RefCountedMemory* Options2UI::GetFaviconResourceBytes() { |
+ return ResourceBundle::GetSharedInstance(). |
+ LoadDataResourceBytes(IDR_SETTINGS_FAVICON); |
+} |
+ |
+void Options2UI::InitializeHandlers() { |
+ DCHECK(!GetProfile()->IsOffTheRecord() || Profile::IsGuestSession()); |
+ |
+ // The reinitialize call from DidBecomeActiveForReusedRenderView end up being |
+ // delivered after a new web page DOM has been brought up in an existing |
+ // renderer (due to IPC delays), causing this method to be called twice. If |
+ // that happens, ignore the second call. |
+ if (initialized_handlers_) |
+ return; |
+ initialized_handlers_ = true; |
+ |
+ std::vector<WebUIMessageHandler*>::iterator iter; |
+ // Skip over the generic handler. |
+ for (iter = handlers_.begin() + 1; iter != handlers_.end(); ++iter) { |
+ (static_cast<OptionsPage2UIHandler*>(*iter))->Initialize(); |
+ } |
+} |
+ |
+void Options2UI::AddOptionsPageUIHandler(DictionaryValue* localized_strings, |
+ OptionsPage2UIHandler* handler_raw) { |
+ scoped_ptr<OptionsPage2UIHandler> handler(handler_raw); |
+ DCHECK(handler.get()); |
+ // Add only if handler's service is enabled. |
+ if (handler->IsEnabled()) { |
+ handler->GetLocalizedValues(localized_strings); |
+ // Add handler to the list and also pass the ownership. |
+ AddMessageHandler(handler.release()->Attach(this)); |
+ } |
+} |
+ |
+void Options2UI::SetCommandLineString(RenderViewHost* render_view_host) { |
+ std::string command_line_string; |
+ |
+#if defined(OS_WIN) |
+ command_line_string = |
+ WideToASCII(CommandLine::ForCurrentProcess()->GetCommandLineString()); |
+#else |
+ command_line_string = |
+ CommandLine::ForCurrentProcess()->GetCommandLineString(); |
+#endif |
+ |
+ render_view_host->SetWebUIProperty("commandLineString", command_line_string); |
+} |