blob: 0d4f92fa30bb282a7cd2a210750f857cddb0b32d [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 "base/metrics/histogram_functions.h"
#include "chrome/browser/actor/actor_tab_data.h"
#include "chrome/browser/actor/ui/dom_node_geometry.h"
#include "chrome/browser/actor/ui/event_dispatcher.h"
#include "chrome/browser/actor/ui/ui_event.h"
#include "chrome/browser/actor/ui/ui_event_debugstring.h"
namespace actor::ui {
namespace {
using base::UmaHistogramEnumeration;
constexpr std::string_view kComputedTargetResultHistogram =
"Actor.EventDispatcher.ComputedTargetResult";
constexpr std::string_view kModelPageTargetTypeHistogram =
"Actor.EventDispatcher.ModelPageTargetType";
} // namespace
AsyncUiEvent ComputedMouseMove(tabs::TabInterface::Handle tab,
const PageTarget& target) {
if (std::holds_alternative<gfx::Point>(target)) {
UmaHistogramEnumeration(kModelPageTargetTypeHistogram,
ModelPageTargetType::kPoint);
return MouseMove(tab, std::get<gfx::Point>(target),
TargetSource::kToolRequest);
}
UmaHistogramEnumeration(kModelPageTargetTypeHistogram,
ModelPageTargetType::kDomNode);
// Try to compute a point target by converting the DomNode to a gfx::Point.
auto* actor_tab_data = ActorTabData::From(tab.Get());
if (!actor_tab_data) {
VLOG(4) << "ComputedMouseMove: No ActorTabData available for tab "
<< tab.raw_value();
UmaHistogramEnumeration(kComputedTargetResultHistogram,
ComputedTargetResult::kMissingActorTabData);
return MouseMove(tab, std::nullopt, TargetSource::kUnresolvableInApc);
}
auto* apc = actor_tab_data->GetLastObservedPageContent();
if (!apc) {
VLOG(4) << "ComputedMouseMove: No cached APC available for tab "
<< tab.raw_value();
UmaHistogramEnumeration(kComputedTargetResultHistogram,
ComputedTargetResult::kMissingAnnotatedPageContent);
return MouseMove(tab, std::nullopt, TargetSource::kUnresolvableInApc);
}
auto pt_target = GetDomNodePointFromApc(*apc, std::get<DomNode>(target));
if (!pt_target.has_value()) {
VLOG(4) << "ComputedMouseMove: Failed to resolve point target for "
<< DebugString(target);
UmaHistogramEnumeration(kComputedTargetResultHistogram,
ComputedTargetResult::kTargetNotResolvedInApc);
return MouseMove(tab, std::nullopt, TargetSource::kUnresolvableInApc);
}
VLOG(4) << "Converted PageTarget: " << std::get<DomNode>(target) << " to "
<< pt_target.value();
UmaHistogramEnumeration(kComputedTargetResultHistogram,
ComputedTargetResult::kSuccess);
return MouseMove(tab, pt_target.value(), TargetSource::kDerivedFromApc);
}
} // namespace actor::ui