blob: 8df70b58647b273d192d46f1aec489c7bd441816 [file] [log] [blame]
// Copyright (c) 2012 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/help/help_handler.h"
#include <stddef.h>
#include <string>
#include "base/bind.h"
#include "base/bind_helpers.h"
#include "base/command_line.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/location.h"
#include "base/macros.h"
#include "base/strings/string16.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "base/task_runner_util.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/chrome_notification_types.h"
#include "chrome/browser/obsolete_system/obsolete_system.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_commands.h"
#include "chrome/browser/ui/browser_finder.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/common/channel_info.h"
#include "chrome/common/chrome_content_client.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/grit/chromium_strings.h"
#include "chrome/grit/generated_resources.h"
#include "components/google/core/browser/google_util.h"
#include "components/version_info/version_info.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_service.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
#include "content/public/common/user_agent.h"
#include "grit/components_chromium_strings.h"
#include "grit/components_google_chrome_strings.h"
#include "grit/components_strings.h"
#include "ui/base/l10n/l10n_util.h"
#include "v8/include/v8.h"
#if defined(OS_CHROMEOS)
#include "base/files/file_util_proxy.h"
#include "base/i18n/time_formatting.h"
#include "base/sys_info.h"
#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos.h"
#include "chrome/browser/chromeos/ownership/owner_settings_service_chromeos_factory.h"
#include "chrome/browser/chromeos/policy/browser_policy_connector_chromeos.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/browser/chromeos/settings/cros_settings.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/webui/chromeos/image_source.h"
#include "chrome/browser/ui/webui/help/help_utils_chromeos.h"
#include "chrome/browser/ui/webui/help/version_updater_chromeos.h"
#include "chromeos/chromeos_switches.h"
#include "chromeos/dbus/dbus_thread_manager.h"
#include "chromeos/dbus/power_manager_client.h"
#include "chromeos/system/statistics_provider.h"
#include "components/prefs/pref_service.h"
#include "components/user_manager/user_manager.h"
#endif
using base::ListValue;
using content::BrowserThread;
namespace {
#if defined(OS_CHROMEOS)
// Directory containing the regulatory labels for supported regions.
const char kRegulatoryLabelsDirectory[] = "regulatory_labels";
// File names of the image file and the file containing alt text for the label.
const char kRegulatoryLabelImageFilename[] = "label.png";
const char kRegulatoryLabelTextFilename[] = "label.txt";
// Default region code to use if there's no label for the VPD region code.
const char kDefaultRegionCode[] = "us";
struct RegulatoryLabel {
const std::string label_text;
const std::string image_url;
};
// Returns message that informs user that for update it's better to
// connect to a network of one of the allowed types.
base::string16 GetAllowedConnectionTypesMessage() {
if (help_utils_chromeos::IsUpdateOverCellularAllowed()) {
return l10n_util::GetStringUTF16(IDS_UPGRADE_NETWORK_LIST_CELLULAR_ALLOWED);
} else {
return l10n_util::GetStringUTF16(
IDS_UPGRADE_NETWORK_LIST_CELLULAR_DISALLOWED);
}
}
// Returns true if the device is enterprise managed, false otherwise.
bool IsEnterpriseManaged() {
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
return connector->IsEnterpriseManaged();
}
// Returns true if current user can change channel, false otherwise.
bool CanChangeChannel(Profile* profile) {
bool value = false;
chromeos::CrosSettings::Get()->GetBoolean(chromeos::kReleaseChannelDelegated,
&value);
// On a managed machine we delegate this setting to the users of the same
// domain only if the policy value is "domain".
if (IsEnterpriseManaged()) {
if (!value)
return false;
// Get the currently logged in user and strip the domain part only.
std::string domain = "";
const user_manager::User* user =
profile ? chromeos::ProfileHelper::Get()->GetUserByProfile(profile)
: nullptr;
std::string email = user ? user->email() : std::string();
size_t at_pos = email.find('@');
if (at_pos != std::string::npos && at_pos + 1 < email.length())
domain = email.substr(email.find('@') + 1);
policy::BrowserPolicyConnectorChromeOS* connector =
g_browser_process->platform_part()->browser_policy_connector_chromeos();
return domain == connector->GetEnterpriseDomain();
} else {
chromeos::OwnerSettingsServiceChromeOS* service =
chromeos::OwnerSettingsServiceChromeOSFactory::GetInstance()
->GetForBrowserContext(profile);
// On non managed machines we have local owner who is the only one to change
// anything. Ensure that ReleaseChannelDelegated is false.
if (service && service->IsOwner())
return !value;
}
return false;
}
// Returns the path of the regulatory labels directory for a given region, if
// found. Must be called from the blocking pool.
base::FilePath GetRegulatoryLabelDirForRegion(const std::string& region) {
DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
// Generate the path under the asset dir or URL host to the regulatory files
// for the region, e.g., "regulatory_labels/us/".
const base::FilePath region_path =
base::FilePath(kRegulatoryLabelsDirectory).AppendASCII(region);
// Check for file existence starting in /usr/share/chromeos-assets/, e.g.,
// "/usr/share/chromeos-assets/regulatory_labels/us/label.png".
const base::FilePath asset_dir(chrome::kChromeOSAssetPath);
if (base::PathExists(asset_dir.Append(region_path)
.AppendASCII(kRegulatoryLabelImageFilename))) {
return region_path;
}
return base::FilePath();
}
// Finds the directory for the regulatory label, using the VPD region code.
// Also tries "us" as a fallback region. Must be called from the blocking pool.
base::FilePath FindRegulatoryLabelDir() {
DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
std::string region;
base::FilePath region_path;
// Use the VPD region code to find the label dir.
if (chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic(
"region", &region) && !region.empty()) {
region_path = GetRegulatoryLabelDirForRegion(region);
}
// Try the fallback region code if no directory was found.
if (region_path.empty() && region != kDefaultRegionCode)
region_path = GetRegulatoryLabelDirForRegion(kDefaultRegionCode);
return region_path;
}
// Reads the file containing the regulatory label text, if found, relative to
// the asset directory. Must be called from the blocking pool.
std::string ReadRegulatoryLabelText(const base::FilePath& path) {
DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread());
base::FilePath text_path(chrome::kChromeOSAssetPath);
text_path = text_path.Append(path);
text_path = text_path.AppendASCII(kRegulatoryLabelTextFilename);
std::string contents;
if (base::ReadFileToString(text_path, &contents))
return contents;
return std::string();
}
#endif // defined(OS_CHROMEOS)
} // namespace
HelpHandler::HelpHandler()
: weak_factory_(this) {
}
HelpHandler::~HelpHandler() {
}
void HelpHandler::GetLocalizedValues(base::DictionaryValue* localized_strings) {
struct L10nResources {
const char* name;
int ids;
};
static L10nResources resources[] = {
{"aboutTitle", IDS_ABOUT_TITLE},
#if defined(OS_CHROMEOS)
{"aboutProductTitle", IDS_PRODUCT_OS_NAME},
#else
{"aboutProductTitle", IDS_PRODUCT_NAME},
#endif
{"aboutProductDescription", IDS_ABOUT_PRODUCT_DESCRIPTION},
{"relaunch", IDS_RELAUNCH_BUTTON},
#if defined(OS_CHROMEOS)
{"relaunchAndPowerwash", IDS_RELAUNCH_AND_POWERWASH_BUTTON},
#endif
{"productName", IDS_PRODUCT_NAME},
{"updateCheckStarted", IDS_UPGRADE_CHECK_STARTED},
{"upToDate", IDS_UPGRADE_UP_TO_DATE},
{"updating", IDS_UPGRADE_UPDATING},
#if defined(OS_CHROMEOS)
{"updateButton", IDS_UPGRADE_BUTTON},
{"updatingChannelSwitch", IDS_UPGRADE_UPDATING_CHANNEL_SWITCH},
#endif
{"updateAlmostDone", IDS_UPGRADE_SUCCESSFUL_RELAUNCH},
#if defined(OS_CHROMEOS)
{"successfulChannelSwitch", IDS_UPGRADE_SUCCESSFUL_CHANNEL_SWITCH},
#endif
{"getHelpWithChrome", IDS_GET_HELP_USING_CHROME},
{"reportAnIssue", IDS_REPORT_AN_ISSUE},
#if defined(OS_CHROMEOS)
{"platform", IDS_PLATFORM_LABEL},
{"firmware", IDS_ABOUT_PAGE_FIRMWARE},
{"showMoreInfo", IDS_SHOW_MORE_INFO},
{"hideMoreInfo", IDS_HIDE_MORE_INFO},
{"channel", IDS_ABOUT_PAGE_CHANNEL},
{"stable", IDS_ABOUT_PAGE_CHANNEL_STABLE},
{"beta", IDS_ABOUT_PAGE_CHANNEL_BETA},
{"dev", IDS_ABOUT_PAGE_CHANNEL_DEVELOPMENT},
{"channel-changed", IDS_ABOUT_PAGE_CHANNEL_CHANGED},
{"currentChannelStable", IDS_ABOUT_PAGE_CURRENT_CHANNEL_STABLE},
{"currentChannelBeta", IDS_ABOUT_PAGE_CURRENT_CHANNEL_BETA},
{"currentChannelDev", IDS_ABOUT_PAGE_CURRENT_CHANNEL_DEV},
{"currentChannel", IDS_ABOUT_PAGE_CURRENT_CHANNEL},
{"channelChangeButton", IDS_ABOUT_PAGE_CHANNEL_CHANGE_BUTTON},
{"channelChangeDisallowedMessage",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_DISALLOWED_MESSAGE},
{"channelChangePageTitle", IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_TITLE},
{"channelChangePagePowerwashTitle",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_POWERWASH_TITLE},
{"channelChangePagePowerwashMessage",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_POWERWASH_MESSAGE},
{"channelChangePageDelayedChangeTitle",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_DELAYED_CHANGE_TITLE},
{"channelChangePageUnstableTitle",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_UNSTABLE_TITLE},
{"channelChangePagePowerwashButton",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_POWERWASH_BUTTON},
{"channelChangePageChangeButton",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_CHANGE_BUTTON},
{"channelChangePageCancelButton",
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_CANCEL_BUTTON},
{"webkit", IDS_WEBKIT},
{"userAgent", IDS_VERSION_UI_USER_AGENT},
{"commandLine", IDS_VERSION_UI_COMMAND_LINE},
{"buildDate", IDS_VERSION_UI_BUILD_DATE},
#endif
#if defined(OS_MACOSX) || defined(OS_WIN)
{"learnMore", IDS_LEARN_MORE},
#endif
#if defined(OS_MACOSX)
{"promote", IDS_ABOUT_CHROME_PROMOTE_UPDATER},
#endif
};
for (size_t i = 0; i < arraysize(resources); ++i) {
localized_strings->SetString(resources[i].name,
l10n_util::GetStringUTF16(resources[i].ids));
}
localized_strings->SetString("updateObsoleteSystem",
ObsoleteSystem::LocalizedObsoleteString());
localized_strings->SetString("updateObsoleteSystemURL",
ObsoleteSystem::GetLinkURL());
localized_strings->SetString(
"browserVersion",
l10n_util::GetStringFUTF16(IDS_ABOUT_PRODUCT_VERSION,
BuildBrowserVersionString()));
base::Time::Exploded exploded_time;
base::Time::Now().LocalExplode(&exploded_time);
localized_strings->SetString(
"productCopyright",
l10n_util::GetStringFUTF16(IDS_ABOUT_VERSION_COPYRIGHT,
base::IntToString16(exploded_time.year)));
base::string16 license = l10n_util::GetStringFUTF16(
IDS_VERSION_UI_LICENSE, base::ASCIIToUTF16(chrome::kChromiumProjectURL),
base::ASCIIToUTF16(chrome::kChromeUICreditsURL));
localized_strings->SetString("productLicense", license);
#if defined(OS_CHROMEOS)
base::string16 os_license = l10n_util::GetStringFUTF16(
IDS_ABOUT_CROS_VERSION_LICENSE,
base::ASCIIToUTF16(chrome::kChromeUIOSCreditsURL));
localized_strings->SetString("productOsLicense", os_license);
base::string16 product_name = l10n_util::GetStringUTF16(IDS_PRODUCT_OS_NAME);
localized_strings->SetString(
"channelChangePageDelayedChangeMessage",
l10n_util::GetStringFUTF16(
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_DELAYED_CHANGE_MESSAGE,
product_name));
localized_strings->SetString(
"channelChangePageUnstableMessage",
l10n_util::GetStringFUTF16(
IDS_ABOUT_PAGE_CHANNEL_CHANGE_PAGE_UNSTABLE_MESSAGE,
product_name));
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
chromeos::switches::kDisableNewChannelSwitcherUI)) {
localized_strings->SetBoolean("disableNewChannelSwitcherUI", true);
}
#endif
base::string16 tos = l10n_util::GetStringFUTF16(
IDS_ABOUT_TERMS_OF_SERVICE, base::UTF8ToUTF16(chrome::kChromeUITermsURL));
localized_strings->SetString("productTOS", tos);
localized_strings->SetString("webkitVersion", content::GetWebKitVersion());
localized_strings->SetString("jsEngine", "V8");
localized_strings->SetString("jsEngineVersion", v8::V8::GetVersion());
localized_strings->SetString("userAgentInfo", GetUserAgent());
base::CommandLine::StringType command_line =
base::CommandLine::ForCurrentProcess()->GetCommandLineString();
localized_strings->SetString("commandLineInfo", command_line);
}
void HelpHandler::RegisterMessages() {
version_updater_.reset(VersionUpdater::Create(web_ui()->GetWebContents()));
registrar_.Add(this, chrome::NOTIFICATION_UPGRADE_RECOMMENDED,
content::NotificationService::AllSources());
web_ui()->RegisterMessageCallback("onPageLoaded",
base::Bind(&HelpHandler::OnPageLoaded, base::Unretained(this)));
web_ui()->RegisterMessageCallback("relaunchNow",
base::Bind(&HelpHandler::RelaunchNow, base::Unretained(this)));
web_ui()->RegisterMessageCallback("openFeedbackDialog",
base::Bind(&HelpHandler::OpenFeedbackDialog, base::Unretained(this)));
web_ui()->RegisterMessageCallback("openHelpPage",
base::Bind(&HelpHandler::OpenHelpPage, base::Unretained(this)));
#if defined(OS_CHROMEOS)
web_ui()->RegisterMessageCallback("setChannel",
base::Bind(&HelpHandler::SetChannel, base::Unretained(this)));
web_ui()->RegisterMessageCallback("relaunchAndPowerwash",
base::Bind(&HelpHandler::RelaunchAndPowerwash, base::Unretained(this)));
web_ui()->RegisterMessageCallback("requestUpdate",
base::Bind(&HelpHandler::RequestUpdate, base::Unretained(this)));
#endif
#if defined(OS_MACOSX)
web_ui()->RegisterMessageCallback("promoteUpdater",
base::Bind(&HelpHandler::PromoteUpdater, base::Unretained(this)));
#endif
#if defined(OS_CHROMEOS)
// Handler for the product label image, which will be shown if available.
content::URLDataSource::Add(Profile::FromWebUI(web_ui()),
new chromeos::ImageSource());
#endif
}
void HelpHandler::Observe(int type, const content::NotificationSource& source,
const content::NotificationDetails& details) {
switch (type) {
case chrome::NOTIFICATION_UPGRADE_RECOMMENDED: {
// A version update is installed and ready to go. Refresh the UI so the
// correct state will be shown.
RequestUpdate(NULL);
break;
}
default:
NOTREACHED();
}
}
// static
base::string16 HelpHandler::BuildBrowserVersionString() {
std::string version = version_info::GetVersionNumber();
std::string modifier = chrome::GetChannelString();
if (!modifier.empty())
version += " " + modifier;
#if defined(ARCH_CPU_64_BITS)
version += " (64-bit)";
#endif
return base::UTF8ToUTF16(version);
}
void HelpHandler::OnPageLoaded(const base::ListValue* args) {
#if defined(OS_CHROMEOS)
base::PostTaskAndReplyWithResult(
content::BrowserThread::GetBlockingPool(),
FROM_HERE,
base::Bind(&chromeos::version_loader::GetVersion,
chromeos::version_loader::VERSION_FULL),
base::Bind(&HelpHandler::OnOSVersion,
weak_factory_.GetWeakPtr()));
base::PostTaskAndReplyWithResult(
content::BrowserThread::GetBlockingPool(),
FROM_HERE,
base::Bind(&chromeos::version_loader::GetFirmware),
base::Bind(&HelpHandler::OnOSFirmware,
weak_factory_.GetWeakPtr()));
web_ui()->CallJavascriptFunction(
"help.HelpPage.updateEnableReleaseChannel",
base::FundamentalValue(CanChangeChannel(Profile::FromWebUI(web_ui()))));
base::Time build_time = base::SysInfo::GetLsbReleaseTime();
base::string16 build_date = base::TimeFormatFriendlyDate(build_time);
web_ui()->CallJavascriptFunction("help.HelpPage.setBuildDate",
base::StringValue(build_date));
#endif // defined(OS_CHROMEOS)
// On Chrome OS, do not check for an update automatically.
#if defined(OS_CHROMEOS)
static_cast<VersionUpdaterCros*>(version_updater_.get())->GetUpdateStatus(
base::Bind(&HelpHandler::SetUpdateStatus, base::Unretained(this)));
#else
RequestUpdate(NULL);
#endif
web_ui()->CallJavascriptFunction(
"help.HelpPage.setObsoleteSystem",
base::FundamentalValue(ObsoleteSystem::IsObsoleteNowOrSoon()));
web_ui()->CallJavascriptFunction(
"help.HelpPage.setObsoleteSystemEndOfTheLine",
base::FundamentalValue(ObsoleteSystem::IsObsoleteNowOrSoon() &&
ObsoleteSystem::IsEndOfTheLine()));
#if defined(OS_CHROMEOS)
web_ui()->CallJavascriptFunction(
"help.HelpPage.updateIsEnterpriseManaged",
base::FundamentalValue(IsEnterpriseManaged()));
// First argument to GetChannel() is a flag that indicates whether
// current channel should be returned (if true) or target channel
// (otherwise).
version_updater_->GetChannel(true,
base::Bind(&HelpHandler::OnCurrentChannel, weak_factory_.GetWeakPtr()));
version_updater_->GetChannel(false,
base::Bind(&HelpHandler::OnTargetChannel, weak_factory_.GetWeakPtr()));
base::PostTaskAndReplyWithResult(
content::BrowserThread::GetBlockingPool(),
FROM_HERE,
base::Bind(&FindRegulatoryLabelDir),
base::Bind(&HelpHandler::OnRegulatoryLabelDirFound,
weak_factory_.GetWeakPtr()));
#endif
}
#if defined(OS_MACOSX)
void HelpHandler::PromoteUpdater(const base::ListValue* args) {
version_updater_->PromoteUpdater();
}
#endif
void HelpHandler::RelaunchNow(const base::ListValue* args) {
DCHECK(args->empty());
version_updater_->RelaunchBrowser();
}
void HelpHandler::OpenFeedbackDialog(const base::ListValue* args) {
DCHECK(args->empty());
Browser* browser = chrome::FindBrowserWithWebContents(
web_ui()->GetWebContents());
chrome::OpenFeedbackDialog(browser);
}
void HelpHandler::OpenHelpPage(const base::ListValue* args) {
DCHECK(args->empty());
Browser* browser = chrome::FindBrowserWithWebContents(
web_ui()->GetWebContents());
chrome::ShowHelp(browser, chrome::HELP_SOURCE_WEBUI);
}
#if defined(OS_CHROMEOS)
void HelpHandler::SetChannel(const base::ListValue* args) {
DCHECK(args->GetSize() == 2);
if (!CanChangeChannel(Profile::FromWebUI(web_ui()))) {
LOG(WARNING) << "Non-owner tried to change release track.";
return;
}
base::string16 channel;
bool is_powerwash_allowed;
if (!args->GetString(0, &channel) ||
!args->GetBoolean(1, &is_powerwash_allowed)) {
LOG(ERROR) << "Can't parse SetChannel() args";
return;
}
version_updater_->SetChannel(base::UTF16ToUTF8(channel),
is_powerwash_allowed);
if (user_manager::UserManager::Get()->IsCurrentUserOwner()) {
// Check for update after switching release channel.
version_updater_->CheckForUpdate(base::Bind(&HelpHandler::SetUpdateStatus,
base::Unretained(this)),
VersionUpdater::PromoteCallback());
}
}
void HelpHandler::RelaunchAndPowerwash(const base::ListValue* args) {
DCHECK(args->empty());
if (IsEnterpriseManaged())
return;
PrefService* prefs = g_browser_process->local_state();
prefs->SetBoolean(prefs::kFactoryResetRequested, true);
prefs->CommitPendingWrite();
// Perform sign out. Current chrome process will then terminate, new one will
// be launched (as if it was a restart).
chromeos::DBusThreadManager::Get()->GetPowerManagerClient()->RequestRestart();
}
#endif // defined(OS_CHROMEOS)
void HelpHandler::RequestUpdate(const base::ListValue* args) {
VersionUpdater::PromoteCallback promote_callback;
version_updater_->CheckForUpdate(
base::Bind(&HelpHandler::SetUpdateStatus, base::Unretained(this)),
#if defined(OS_MACOSX)
base::Bind(&HelpHandler::SetPromotionState, base::Unretained(this)));
#else
VersionUpdater::PromoteCallback());
#endif // OS_MACOSX
}
void HelpHandler::SetUpdateStatus(VersionUpdater::Status status,
int progress, const base::string16& message) {
// Only UPDATING state should have progress set.
DCHECK(status == VersionUpdater::UPDATING || progress == 0);
std::string status_str;
switch (status) {
case VersionUpdater::CHECKING:
status_str = "checking";
break;
case VersionUpdater::UPDATING:
status_str = "updating";
break;
case VersionUpdater::NEARLY_UPDATED:
status_str = "nearly_updated";
break;
case VersionUpdater::UPDATED:
status_str = "updated";
break;
case VersionUpdater::FAILED:
case VersionUpdater::FAILED_OFFLINE:
case VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED:
status_str = "failed";
break;
case VersionUpdater::DISABLED:
status_str = "disabled";
break;
case VersionUpdater::DISABLED_BY_ADMIN:
status_str = "disabled_by_admin";
break;
}
web_ui()->CallJavascriptFunction("help.HelpPage.setUpdateStatus",
base::StringValue(status_str),
base::StringValue(message));
if (status == VersionUpdater::UPDATING) {
web_ui()->CallJavascriptFunction("help.HelpPage.setProgress",
base::FundamentalValue(progress));
}
#if defined(OS_CHROMEOS)
if (status == VersionUpdater::FAILED_OFFLINE ||
status == VersionUpdater::FAILED_CONNECTION_TYPE_DISALLOWED) {
base::string16 types_msg = GetAllowedConnectionTypesMessage();
if (!types_msg.empty()) {
web_ui()->CallJavascriptFunction(
"help.HelpPage.setAndShowAllowedConnectionTypesMsg",
base::StringValue(types_msg));
} else {
web_ui()->CallJavascriptFunction(
"help.HelpPage.showAllowedConnectionTypesMsg",
base::FundamentalValue(false));
}
} else {
web_ui()->CallJavascriptFunction(
"help.HelpPage.showAllowedConnectionTypesMsg",
base::FundamentalValue(false));
}
#endif // defined(OS_CHROMEOS)
}
#if defined(OS_MACOSX)
void HelpHandler::SetPromotionState(VersionUpdater::PromotionState state) {
std::string state_str;
switch (state) {
case VersionUpdater::PROMOTE_HIDDEN:
state_str = "hidden";
break;
case VersionUpdater::PROMOTE_ENABLED:
state_str = "enabled";
break;
case VersionUpdater::PROMOTE_DISABLED:
state_str = "disabled";
break;
}
web_ui()->CallJavascriptFunction("help.HelpPage.setPromotionState",
base::StringValue(state_str));
}
#endif // defined(OS_MACOSX)
#if defined(OS_CHROMEOS)
void HelpHandler::OnOSVersion(const std::string& version) {
web_ui()->CallJavascriptFunction("help.HelpPage.setOSVersion",
base::StringValue(version));
}
void HelpHandler::OnOSFirmware(const std::string& firmware) {
web_ui()->CallJavascriptFunction("help.HelpPage.setOSFirmware",
base::StringValue(firmware));
}
void HelpHandler::OnCurrentChannel(const std::string& channel) {
web_ui()->CallJavascriptFunction(
"help.HelpPage.updateCurrentChannel", base::StringValue(channel));
}
void HelpHandler::OnTargetChannel(const std::string& channel) {
web_ui()->CallJavascriptFunction(
"help.HelpPage.updateTargetChannel", base::StringValue(channel));
}
void HelpHandler::OnRegulatoryLabelDirFound(const base::FilePath& path) {
if (path.empty())
return;
base::PostTaskAndReplyWithResult(
content::BrowserThread::GetBlockingPool(), FROM_HERE,
base::Bind(&ReadRegulatoryLabelText, path),
base::Bind(&HelpHandler::OnRegulatoryLabelTextRead,
weak_factory_.GetWeakPtr()));
// Send the image path to the WebUI.
OnRegulatoryLabelImageFound(path.AppendASCII(kRegulatoryLabelImageFilename));
}
void HelpHandler::OnRegulatoryLabelImageFound(const base::FilePath& path) {
std::string url = std::string("chrome://") + chrome::kChromeOSAssetHost +
"/" + path.MaybeAsASCII();
web_ui()->CallJavascriptFunction("help.HelpPage.setRegulatoryLabelPath",
base::StringValue(url));
}
void HelpHandler::OnRegulatoryLabelTextRead(const std::string& text) {
// Remove unnecessary whitespace.
web_ui()->CallJavascriptFunction(
"help.HelpPage.setRegulatoryLabelText",
base::StringValue(base::CollapseWhitespaceASCII(text, true)));
}
#endif // defined(OS_CHROMEOS)