// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ash/growth/open_url_action_performer.h"
#include <memory>
#include "ash/public/cpp/new_window_delegate.h"
#include "base/functional/bind.h"
#include "base/logging.h"
#include "base/strings/utf_string_conversions.h"
#include "base/values.h"
#include "chromeos/ash/components/growth/campaigns_logger.h"
#include "chromeos/ash/components/growth/growth_metrics.h"
#include "url/gurl.h"
namespace {
constexpr char kUrl[] = "url";
constexpr char kDisposition[] = "dispositon";
// These values are deserialized from Growth Campaign, so entries should not
// be renumbered and numeric values should never be reused.
enum class Disposition {
kNewForegroundTab,
kNewWindow,
kOffTheRecord,
kSwitchToTab,
};
struct OpenUrlParam {
GURL url;
ash::NewWindowDelegate::Disposition disposition;
};
ash::NewWindowDelegate::Disposition ConvertDisposition(
Disposition disposition) {
switch (disposition) {
case Disposition::kNewForegroundTab:
return ash::NewWindowDelegate::Disposition::kNewForegroundTab;
case Disposition::kNewWindow:
return ash::NewWindowDelegate::Disposition::kNewWindow;
case Disposition::kOffTheRecord:
return ash::NewWindowDelegate::Disposition::kOffTheRecord;
case Disposition::kSwitchToTab:
return ash::NewWindowDelegate::Disposition::kSwitchToTab;
}
}
std::unique_ptr<OpenUrlParam> ParseOpenUrlActionPerformerParams(
const base::Value::Dict* params) {
if (!params) {
CAMPAIGNS_LOG(ERROR) << "Empty parameter to OpenUrlActionPerformer.";
return nullptr;
}
auto* url = params->FindString(kUrl);
if (!url) {
CAMPAIGNS_LOG(ERROR) << kUrl << " parameter not found.";
return nullptr;
}
auto disposition = params->FindInt(kDisposition);
auto open_url_param = std::make_unique<OpenUrlParam>();
open_url_param->url = GURL(*url);
open_url_param->disposition =
ConvertDisposition(static_cast<Disposition>(disposition.value_or(0)));
return open_url_param;
}
} // namespace
OpenUrlActionPerformer::OpenUrlActionPerformer() = default;
OpenUrlActionPerformer::~OpenUrlActionPerformer() = default;
void OpenUrlActionPerformer::Run(int campaign_id,
std::optional<int> group_id,
const base::Value::Dict* params,
growth::ActionPerformer::Callback callback) {
auto open_url_param = ParseOpenUrlActionPerformerParams(params);
if (!open_url_param) {
growth::RecordCampaignsManagerError(
growth::CampaignsManagerError::kOpenUrlParamsParsingFail);
std::move(callback).Run(growth::ActionResult::kFailure,
growth::ActionResultReason::kParsingActionFailed);
return;
}
ash::NewWindowDelegate::GetPrimary()->OpenUrl(
open_url_param->url,
ash::NewWindowDelegate::OpenUrlFrom::kUserInteraction,
open_url_param->disposition);
std::move(callback).Run(growth::ActionResult::kSuccess,
/*action_result_reason=*/std::nullopt);
}
growth::ActionType OpenUrlActionPerformer::ActionType() const {
return growth::ActionType::kOpenUrl;
}