blob: 64faf40525237aa5f38a6e187f07e84f17c97685 [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.
#include "chrome/browser/actor/ui/ui_event_debugstring.h"
#include <string>
#include <variant>
#include "base/strings/strcat.h"
#include "chrome/browser/actor/shared_types.h"
#include "third_party/abseil-cpp/absl/functional/overload.h"
#include "third_party/abseil-cpp/absl/strings/str_format.h"
namespace actor::ui {
namespace {
// TODO(crbug.com/388070065): Replace with std::optional::transform when C++23
// is available.
template <typename In, typename TransformT>
std::optional<std::invoke_result_t<TransformT, In>> transform(
std::optional<In> opt,
TransformT&& fn) {
if (!opt.has_value()) {
return std::nullopt;
}
return std::invoke(std::forward<TransformT>(fn), opt.value());
}
constexpr absl::Overload UiEventToDebugStringFn{
[](const StartTask& e) -> std::string {
return absl::StrFormat("StartTask[id=%d]", e.task_id.value());
},
[](const StopTask& e) -> std::string {
return absl::StrFormat(
"StopTask[id=%d, final_state=%s, title=%s, last_acted_on_tab=%d]",
e.task_id.value(), ToString(e.final_state), e.title,
e.last_acted_on_tab_handle.raw_value());
},
[](const TaskStateChanged& e) -> std::string {
return absl::StrFormat("TaskStateChanged[task_id=%d, state=%s]",
e.task_id.value(), ToString(e.state));
},
[](const StartingToActOnTab& e) -> std::string {
return absl::StrFormat("StartingToActOnTab[task_id=%d, tab=%d]",
e.task_id.value(), e.tab_handle.raw_value());
},
[](const StoppedActingOnTab& e) -> std::string {
return absl::StrFormat("StoppedActingOnTab[tab=%d]",
e.tab_handle.raw_value());
},
[](const MouseClick& e) -> std::string {
return absl::StrFormat("MouseClick[type=%s, count=%s]",
actor::DebugString(e.click_type),
actor::DebugString(e.click_count));
},
[](const MouseMove& e) -> std::string {
return absl::StrFormat(
"MouseMove[target=%s target_source=%s]",
transform(e.target, &gfx::Point::ToString).value_or("null"),
DebugString(e.target_source));
},
};
} // namespace
std::string DebugString(const UiEvent& event) {
return std::visit(UiEventToDebugStringFn, event);
}
std::string DebugString(const AsyncUiEvent& event) {
return std::visit(UiEventToDebugStringFn, event);
}
std::string DebugString(const SyncUiEvent& event) {
return std::visit(UiEventToDebugStringFn, event);
}
std::string DebugString(TargetSource source) {
switch (source) {
case TargetSource::kUnresolvableInApc:
return "UnresolvableInApc";
case TargetSource::kToolRequest:
return "ToolRequest";
case TargetSource::kDerivedFromApc:
return "DerivedFromApc";
}
}
} // namespace actor::ui