blob: 0043c806c1ca41781b14955d94c7dc5648f92b86 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_ACTOR_BROWSER_ACTION_UTIL_H_
#define CHROME_BROWSER_ACTOR_BROWSER_ACTION_UTIL_H_
#include <memory>
#include <vector>
#include "base/types/expected.h"
#include "chrome/common/actor.mojom-forward.h"
#include "components/optimization_guide/proto/features/actions_data.pb.h"
#include "components/tabs/public/tab_interface.h"
#include "content/public/browser/browser_context.h"
#include "third_party/abseil-cpp/absl/container/flat_hash_set.h"
// Conversion function for turning optimization_guide::proto::* types into
// ToolRequests usable by the actor framework.
// TODO(bokan): Rename to actor_proto_conversion.h|cc
namespace optimization_guide::proto {
class Action;
class Actions;
class BrowserAction;
} // namespace optimization_guide::proto
namespace page_content_annotations {
struct FetchPageContextResult;
} // namespace page_content_annotations
namespace actor {
class ActorTask;
class ToolRequest;
// The mime type used for screenshots.
inline constexpr std::string kMimeTypeJpeg = "image/jpeg";
// Build a ToolRequest from the provided optimization_guide Action proto. If the
// action proto doesn't provide a tab_id, and the fallback_tab parameter is
// provided (non-null), the fallback_tab will be used as the acting tab.
// However, this parameter will eventually be phased out and clients will be
// expected to always provide a tab id on each Action. Returns nullptr if the
// action is invalid.
// TODO(https://crbug.com/411462297): The client should eventually always
// provide a tab id for actions where one is needed. Remove this parameter when
// that's done.
std::unique_ptr<ToolRequest> CreateToolRequest(
const optimization_guide::proto::Action& action,
tabs::TabInterface* deprecated_fallback_tab);
// Input type used for ActorKeyedService acting APIs, created from
// BuildToolRequest functions below. Aliased for convenience.
using ToolRequestList = std::vector<std::unique_ptr<ToolRequest>>;
// Result type returned from the BuildToolRequest functions below. Aliased for
// convenience. on failure, the error value contains the index of the action in
// the list that failed to convert.
using BuildToolRequestResult =
base::expected<ToolRequestList, size_t /*index_of_failed_action*/>;
// Builds a vector of ToolRequests usable for ActorKeyedService::PerformActions
// out of the given proto::Actions proto. If an action failed to convert,
// returns the index of the failing action.
BuildToolRequestResult BuildToolRequest(
const optimization_guide::proto::Actions& actions);
// Builds the ActionsResult proto from the output of a call to the
// ActorKeyedService::PerformActions API and fetches new observations for
// tabs relevant to the actions.
void BuildActionsResultWithObservations(
content::BrowserContext& browser_context,
mojom::ActionResultCode result_code,
std::optional<size_t> index_of_failed_action,
std::vector<optimization_guide::proto::ScriptToolResult>
script_tool_results,
const ActorTask& task,
base::OnceCallback<void(
std::unique_ptr<optimization_guide::proto::ActionsResult>)> callback);
optimization_guide::proto::ActionsResult BuildErrorActionsResult(
mojom::ActionResultCode result_code,
std::optional<size_t> index_of_failed_action);
// Builds a vector of ToolRequests usable for ActorKeyedService::ActInFocusedTab
// out of the given proto::BrowserAction proto.
// TODO(https://crbug.com/411462297): Remove this once the BrowserAction path is
// removed.
BuildToolRequestResult BuildToolRequest(
const optimization_guide::proto::BrowserAction& actions,
tabs::TabInterface* deprecated_fallback_tab);
// Converts a FetchPageContext result to a TabObservation proto. Note that this
// does not fill in the (tab) `id` field on the proto, the caller is responsible
// for that.
optimization_guide::proto::TabObservation ConvertToTabObservation(
const page_content_annotations::FetchPageContextResult&
page_context_result);
// Builds the BrowserActionResult proto from the output of a call to the
// ActorKeyedService::ActInFocusedTab API.
// TODO(https://crbug.com/411462297): Remove this once the BrowserAction path is
// removed.
optimization_guide::proto::BrowserActionResult BuildBrowserActionResult(
mojom::ActionResultCode result_code,
int32_t tab_id);
// Copies `script_tool_results` to the input proto.
template <typename T>
void CopyScriptToolResults(
T& proto,
const std::vector<optimization_guide::proto::ScriptToolResult>&
script_tool_results) {
for (const auto& result : script_tool_results) {
*proto.add_script_tool_results() = result;
}
}
std::string ToBase64(const optimization_guide::proto::BrowserAction& actions);
std::string ToBase64(const optimization_guide::proto::Actions& actions);
} // namespace actor
#endif // CHROME_BROWSER_ACTOR_BROWSER_ACTION_UTIL_H_