blob: 9cf602c5fd35d12c8fa273b543db51875f69fbaa [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 "content/browser/accessibility/accessibility_tree_snapshot_combiner.h"
#include "base/metrics/histogram_macros.h"
#include "content/browser/renderer_host/render_frame_host_impl.h"
#include "ui/accessibility/accessibility_features.h"
namespace content {
AccessibilityTreeSnapshotCombiner::AccessibilityTreeSnapshotCombiner(
base::OnceCallback<void(const ui::AXTreeUpdate&)> callback,
mojom::SnapshotAccessibilityTreeParamsPtr params)
: callback_(std::move(callback)), params_(std::move(params)) {}
void AccessibilityTreeSnapshotCombiner::RequestSnapshotOnRenderFrameHost(
RenderFrameHostImpl* rfhi) {
// The callback creates a reference to this, which is needed to keep the
// object alive using base::RefCounted. Once all frames have received their
// responses from the renderer and run their respective callbacks, all
// references to this will be removed and the destructor will be called.
rfhi->RequestAXTreeSnapshot(
base::BindOnce(&AccessibilityTreeSnapshotCombiner::
ReceiveSnapshotFromRenderFrameHost,
this, rfhi->AccessibilityIsRootFrame()),
params_.Clone());
}
void AccessibilityTreeSnapshotCombiner::ReceiveSnapshotFromRenderFrameHost(
bool is_root_frame,
const ui::AXTreeUpdate& snapshot) {
combiner_.AddTree(snapshot, is_root_frame);
}
// This is called automatically after the last call to
// ReceiveSnapshotFromRenderFrameHost when there are no more references to this
// object.
AccessibilityTreeSnapshotCombiner::~AccessibilityTreeSnapshotCombiner() {
SCOPED_UMA_HISTOGRAM_TIMER_MICROS(
"Accessibility.Performance.AccessibilityTreeSnapshotCombiner::"
"~AccessibilityTreeSnapshotCombiner");
combiner_.Combine();
if (features::IsUseMoveNotCopyInAXTreeCombinerEnabled()) {
// This ensures a move of `combiner_.combined()`. It should be safe to steal
// `combiner_`'s resources since we're being destroyed.
std::move(callback_).Run(
const_cast<ui::AXTreeUpdate&>(combiner_.combined()));
} else {
// This is a copy since combiner_.combined() is a const AXTreeUpdate&.
std::move(callback_).Run(combiner_.combined());
}
}
} // namespace content