// 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/conflicts_ui.h" #if defined(OS_WIN) #include <string> #include "base/string_number_conversions.h" #include "base/utf_string_conversions.h" #include "base/values.h" #include "chrome/browser/enumerate_modules_model_win.h" #include "chrome/browser/metrics/user_metrics.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/webui/chrome_url_data_manager.h" #include "chrome/common/jstemplate_builder.h" #include "chrome/common/url_constants.h" #include "content/browser/tab_contents/tab_contents.h" #include "content/common/notification_observer.h" #include "content/common/notification_registrar.h" #include "content/common/notification_service.h" #include "grit/browser_resources.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "grit/theme_resources.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" namespace { //////////////////////////////////////////////////////////////////////////////// // // ConflictsUIHTMLSource // //////////////////////////////////////////////////////////////////////////////// class ConflictsUIHTMLSource : public ChromeURLDataManager::DataSource { public: ConflictsUIHTMLSource() : DataSource(chrome::kChromeUIConflictsHost, MessageLoop::current()) {} // 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 { return "text/html"; } private: DISALLOW_COPY_AND_ASSIGN(ConflictsUIHTMLSource); }; void ConflictsUIHTMLSource::StartDataRequest(const std::string& path, bool is_incognito, int request_id) { // Strings used in the JsTemplate file. DictionaryValue localized_strings; localized_strings.SetString("loadingMessage", l10n_util::GetStringUTF16(IDS_CONFLICTS_LOADING_MESSAGE)); localized_strings.SetString("modulesLongTitle", l10n_util::GetStringUTF16(IDS_CONFLICTS_CHECK_PAGE_TITLE_LONG)); localized_strings.SetString("modulesBlurb", l10n_util::GetStringUTF16(IDS_CONFLICTS_EXPLANATION_TEXT)); localized_strings.SetString("moduleSuspectedBad", l10n_util::GetStringUTF16(IDS_CONFLICTS_CHECK_WARNING_SUSPECTED)); localized_strings.SetString("moduleConfirmedBad", l10n_util::GetStringUTF16(IDS_CONFLICTS_CHECK_WARNING_CONFIRMED)); localized_strings.SetString("helpCenterLink", l10n_util::GetStringUTF16(IDS_CONFLICTS_HELP_CENTER_LINK)); localized_strings.SetString("investigatingText", l10n_util::GetStringUTF16(IDS_CONFLICTS_CHECK_INVESTIGATING)); localized_strings.SetString("modulesNoneLoaded", l10n_util::GetStringUTF16(IDS_CONFLICTS_NO_MODULES_LOADED)); localized_strings.SetString("headerSoftware", l10n_util::GetStringUTF16(IDS_CONFLICTS_HEADER_SOFTWARE)); localized_strings.SetString("headerSignedBy", l10n_util::GetStringUTF16(IDS_CONFLICTS_HEADER_SIGNED_BY)); localized_strings.SetString("headerLocation", l10n_util::GetStringUTF16(IDS_CONFLICTS_HEADER_LOCATION)); localized_strings.SetString("headerVersion", l10n_util::GetStringUTF16(IDS_CONFLICTS_HEADER_VERSION)); localized_strings.SetString("headerHelpTip", l10n_util::GetStringUTF16(IDS_CONFLICTS_HEADER_HELP_TIP)); ChromeURLDataManager::DataSource::SetFontAndTextDirection(&localized_strings); static const base::StringPiece flags_html( ResourceBundle::GetSharedInstance().GetRawDataResource( IDR_ABOUT_CONFLICTS_HTML)); std::string full_html(flags_html.data(), flags_html.size()); jstemplate_builder::AppendJsonHtml(&localized_strings, &full_html); jstemplate_builder::AppendI18nTemplateSourceHtml(&full_html); jstemplate_builder::AppendI18nTemplateProcessHtml(&full_html); jstemplate_builder::AppendJsTemplateSourceHtml(&full_html); scoped_refptr<RefCountedBytes> html_bytes(new RefCountedBytes); html_bytes->data.resize(full_html.size()); std::copy(full_html.begin(), full_html.end(), html_bytes->data.begin()); SendResponse(request_id, html_bytes); } //////////////////////////////////////////////////////////////////////////////// // // ConflictsDOMHandler // //////////////////////////////////////////////////////////////////////////////// // The handler for JavaScript messages for the about:flags page. class ConflictsDOMHandler : public WebUIMessageHandler, public NotificationObserver { public: ConflictsDOMHandler() {} virtual ~ConflictsDOMHandler() {} // WebUIMessageHandler implementation. virtual void RegisterMessages(); // Callback for the "requestModuleList" message. void HandleRequestModuleList(const ListValue* args); private: void SendModuleList(); void Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details); NotificationRegistrar registrar_; DISALLOW_COPY_AND_ASSIGN(ConflictsDOMHandler); }; void ConflictsDOMHandler::RegisterMessages() { web_ui_->RegisterMessageCallback("requestModuleList", NewCallback(this, &ConflictsDOMHandler::HandleRequestModuleList)); } void ConflictsDOMHandler::HandleRequestModuleList(const ListValue* args) { // This request is handled asynchronously. See Observe for when we reply back. registrar_.Add(this, NotificationType::MODULE_LIST_ENUMERATED, NotificationService::AllSources()); EnumerateModulesModel::GetInstance()->ScanNow(); } void ConflictsDOMHandler::SendModuleList() { EnumerateModulesModel* loaded_modules = EnumerateModulesModel::GetInstance(); ListValue* list = loaded_modules->GetModuleList(); DictionaryValue results; results.Set("moduleList", list); // Add the section title and the total count for bad modules found. int confirmed_bad = loaded_modules->confirmed_bad_modules_detected(); int suspected_bad = loaded_modules->suspected_bad_modules_detected(); string16 table_title; if (!confirmed_bad && !suspected_bad) { table_title += l10n_util::GetStringFUTF16( IDS_CONFLICTS_CHECK_PAGE_TABLE_TITLE_SUFFIX_ONE, base::IntToString16(list->GetSize())); } else { table_title += l10n_util::GetStringFUTF16( IDS_CONFLICTS_CHECK_PAGE_TABLE_TITLE_SUFFIX_TWO, base::IntToString16(list->GetSize()), base::IntToString16(confirmed_bad), base::IntToString16(suspected_bad)); } results.SetString("modulesTableTitle", table_title); web_ui_->CallJavascriptFunction("returnModuleList", results); } void ConflictsDOMHandler::Observe(NotificationType type, const NotificationSource& source, const NotificationDetails& details) { switch (type.value) { case NotificationType::MODULE_LIST_ENUMERATED: SendModuleList(); registrar_.RemoveAll(); break; default: NOTREACHED(); break; } } } // namespace /////////////////////////////////////////////////////////////////////////////// // // ConflictsUI // /////////////////////////////////////////////////////////////////////////////// ConflictsUI::ConflictsUI(TabContents* contents) : WebUI(contents) { UserMetrics::RecordAction( UserMetricsAction("ViewAboutConflicts"), contents->profile()); AddMessageHandler((new ConflictsDOMHandler())->Attach(this)); ConflictsUIHTMLSource* html_source = new ConflictsUIHTMLSource(); // Set up the about:conflicts source. contents->profile()->GetChromeURLDataManager()->AddDataSource(html_source); } // static RefCountedMemory* ConflictsUI::GetFaviconResourceBytes() { return ResourceBundle::GetSharedInstance(). LoadDataResourceBytes(IDR_CONFLICT_FAVICON); } #endif