blob: ea629588726299e328bb51de2e907aff5c455160 [file] [log] [blame]
// 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/ui/webui/ash/lobster/lobster_page_handler.h"
#include <string>
#include "ash/public/cpp/lobster/lobster_metrics_state_enums.h"
#include "ash/public/cpp/lobster/lobster_session.h"
#include "ash/public/cpp/new_window_delegate.h"
#include "base/base64.h"
#include "base/strings/strcat.h"
#include "chrome/browser/download/download_prefs.h"
#include "chrome/browser/profiles/profile.h"
#include "url/url_constants.h"
namespace ash {
namespace {
base::FilePath GetDownloadDirectoryForProfile(Profile* profile) {
return DownloadPrefs::FromBrowserContext(profile)
->GetDefaultDownloadDirectoryForProfile();
}
bool IsUrlAllowed(const GURL& url) {
return url.SchemeIs(url::kHttpsScheme) ||
url.spec().starts_with("chrome://os-settings/systemPreferences");
}
} // namespace
LobsterPageHandler::LobsterPageHandler(LobsterSession* active_session,
Profile* profile)
: session_(active_session), profile_(profile) {
CHECK(session_);
}
LobsterPageHandler::~LobsterPageHandler() = default;
void LobsterPageHandler::BindInterface(
mojo::PendingReceiver<lobster::mojom::UntrustedLobsterPageHandler>
pending_receiver) {
receiver_.reset();
receiver_.Bind(std::move(pending_receiver));
}
void LobsterPageHandler::DownloadCandidate(uint32_t candidate_id,
DownloadCandidateCallback callback) {
// TODO: b:359361699 - Implements smarter file naming
session_->DownloadCandidate(candidate_id,
GetDownloadDirectoryForProfile(profile_),
std::move(callback));
}
void LobsterPageHandler::CommitAsInsert(uint32_t candidate_id,
CommitAsInsertCallback callback) {
session_->CommitAsInsert(candidate_id, std::move(callback));
}
void LobsterPageHandler::CommitAsDownload(uint32_t candidate_id,
CommitAsDownloadCallback callback) {
// TODO: b:359361699 - Implements smarter file naming
session_->CommitAsDownload(candidate_id,
GetDownloadDirectoryForProfile(profile_),
std::move(callback));
}
void LobsterPageHandler::RequestCandidates(const std::string& query,
uint32_t num_candidates,
RequestCandidatesCallback callback) {
session_->RequestCandidates(
query, num_candidates,
base::BindOnce(
[](RequestCandidatesCallback callback, const LobsterResult& result) {
if (!result.has_value()) {
auto response =
lobster::mojom::Response::NewError(lobster::mojom::Error::New(
/*code=*/result.error().error_code,
/*message=*/result.error().message));
std::move(callback).Run(std::move(response));
return;
}
std::vector<lobster::mojom::CandidatePtr> candidates;
for (const LobsterImageCandidate& candidate : *result) {
candidates.push_back(lobster::mojom::Candidate::New(
/*id=*/candidate.id,
/*data_url=*/GURL(base::StrCat(
{"data:image/jpeg;base64,",
base::Base64Encode(candidate.image_bytes)}))));
}
std::move(callback).Run(
lobster::mojom::Response::NewCandidates(std::move(candidates)));
},
std::move(callback)));
}
void LobsterPageHandler::PreviewFeedback(uint32_t candidate_id,
PreviewFeedbackCallback callback) {
session_->PreviewFeedback(
candidate_id,
base::BindOnce(
[](PreviewFeedbackCallback callback,
const LobsterFeedbackPreviewResponse& response) {
if (response.has_value()) {
std::move(callback).Run(std::move(response.value()));
}
},
std::move(callback)));
}
void LobsterPageHandler::SubmitFeedback(uint32_t candidate_id,
const std::string& description,
SubmitFeedbackCallback callback) {
std::move(callback).Run(
/*success=*/session_->SubmitFeedback(candidate_id, description));
}
void LobsterPageHandler::ShowUI() {
session_->ShowUI();
}
void LobsterPageHandler::CloseUI() {
session_->CloseUI();
}
void LobsterPageHandler::EmitMetricEvent(LobsterMetricState metric_event) {
session_->RecordWebUIMetricEvent(metric_event);
}
void LobsterPageHandler::OpenUrlInNewWindow(const GURL& url) {
if (!IsUrlAllowed(url)) {
mojo::ReportBadMessage("Invalid URL scheme. Only HTTPS is allowed.");
return;
}
ash::NewWindowDelegate::GetInstance()->OpenUrl(
url, ash::NewWindowDelegate::OpenUrlFrom::kUnspecified,
ash::NewWindowDelegate::Disposition::kNewForegroundTab);
}
} // namespace ash