blob: 9670540c76bf812e62dcd55fe5305d5cc45e6cad [file] [log] [blame]
// Copyright 2020 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/browser_command/browser_command_handler.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/user_metrics.h"
#include "chrome/browser/command_updater_impl.h"
#include "chrome/browser/enterprise/util/managed_browser_utils.h"
#include "chrome/browser/new_tab_page/promos/promo_service.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/browser/ui/browser_navigator.h"
#include "chrome/browser/ui/chrome_pages.h"
#include "chrome/common/webui_url_constants.h"
#include "components/safe_browsing/content/browser/web_ui/safe_browsing_ui.h"
#include "components/safe_browsing/core/common/safe_browsing_policy_handler.h"
#include "components/safe_browsing/core/common/safe_browsing_prefs.h"
#include "ui/base/page_transition_types.h"
#include "ui/base/window_open_disposition.h"
using browser_command::mojom::ClickInfoPtr;
using browser_command::mojom::Command;
using browser_command::mojom::CommandHandler;
// static
const char BrowserCommandHandler::kPromoBrowserCommandHistogramName[] =
"NewTabPage.Promos.PromoBrowserCommand";
BrowserCommandHandler::BrowserCommandHandler(
mojo::PendingReceiver<CommandHandler> pending_page_handler,
Profile* profile,
std::vector<browser_command::mojom::Command> supported_commands)
: profile_(profile),
supported_commands_(supported_commands),
command_updater_(std::make_unique<CommandUpdaterImpl>(this)),
page_handler_(this, std::move(pending_page_handler)) {
if (supported_commands_.empty())
return;
EnableSupportedCommands();
}
BrowserCommandHandler::~BrowserCommandHandler() = default;
void BrowserCommandHandler::CanExecuteCommand(
browser_command::mojom::Command command_id,
CanExecuteCommandCallback callback) {
if (!base::Contains(supported_commands_, command_id)) {
std::move(callback).Run(false);
return;
}
bool can_execute = false;
switch (static_cast<Command>(command_id)) {
case Command::kUnknownCommand:
// Nothing to do.
break;
case Command::kOpenSafetyCheck:
can_execute = !chrome::enterprise_util::IsBrowserManaged(profile_);
break;
case Command::kOpenSafeBrowsingEnhancedProtectionSettings: {
bool managed = safe_browsing::SafeBrowsingPolicyHandler::
IsSafeBrowsingProtectionLevelSetByPolicy(profile_->GetPrefs());
bool already_enabled =
safe_browsing::IsEnhancedProtectionEnabled(*(profile_->GetPrefs()));
can_execute = !managed && !already_enabled;
} break;
case Command::kOpenFeedbackForm:
can_execute = true;
break;
default:
NOTREACHED() << "Unspecified behavior for command " << command_id;
break;
}
std::move(callback).Run(can_execute);
}
void BrowserCommandHandler::ExecuteCommand(Command command_id,
ClickInfoPtr click_info,
ExecuteCommandCallback callback) {
if (!base::Contains(supported_commands_, command_id)) {
std::move(callback).Run(false);
return;
}
const auto disposition = ui::DispositionFromClick(
click_info->middle_button, click_info->alt_key, click_info->ctrl_key,
click_info->meta_key, click_info->shift_key);
const bool command_executed =
GetCommandUpdater()->ExecuteCommandWithDisposition(
static_cast<int>(command_id), disposition);
std::move(callback).Run(command_executed);
}
void BrowserCommandHandler::ExecuteCommandWithDisposition(
int id,
WindowOpenDisposition disposition) {
const auto command = static_cast<Command>(id);
base::UmaHistogramEnumeration(kPromoBrowserCommandHistogramName, command);
switch (command) {
case Command::kUnknownCommand:
// Nothing to do.
break;
case Command::kOpenSafetyCheck:
NavigateToURL(GURL(chrome::GetSettingsUrl(chrome::kSafetyCheckSubPage)),
disposition);
base::RecordAction(
base::UserMetricsAction("NewTabPage_Promos_SafetyCheck"));
break;
case Command::kOpenSafeBrowsingEnhancedProtectionSettings:
NavigateToURL(GURL(chrome::GetSettingsUrl(
chrome::kSafeBrowsingEnhancedProtectionSubPage)),
disposition);
base::RecordAction(
base::UserMetricsAction("NewTabPage_Promos_EnhancedProtection"));
break;
case Command::kOpenFeedbackForm:
OpenFeedbackForm();
break;
default:
NOTREACHED() << "Unspecified behavior for command " << id;
break;
}
}
void BrowserCommandHandler::OpenFeedbackForm() {
chrome::ShowFeedbackPage(feedback_settings_.url, profile_,
feedback_settings_.source,
std::string() /* description_template */,
std::string() /* description_placeholder_text */,
feedback_settings_.category /* category_tag */,
std::string() /* extra_diagnostics */);
}
void BrowserCommandHandler::ConfigureFeedbackCommand(
FeedbackCommandSettings settings) {
feedback_settings_ = settings;
}
void BrowserCommandHandler::EnableSupportedCommands() {
// Explicitly enable supported commands.
GetCommandUpdater()->UpdateCommandEnabled(
static_cast<int>(Command::kUnknownCommand), true);
for (Command command : supported_commands_) {
GetCommandUpdater()->UpdateCommandEnabled(static_cast<int>(command), true);
}
}
CommandUpdater* BrowserCommandHandler::GetCommandUpdater() {
return command_updater_.get();
}
void BrowserCommandHandler::NavigateToURL(const GURL& url,
WindowOpenDisposition disposition) {
NavigateParams params(profile_, url, ui::PAGE_TRANSITION_LINK);
params.disposition = disposition;
Navigate(&params);
}