// 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