Commit b6de0c06 authored by Alex Newcomer's avatar Alex Newcomer Committed by Chromium LUCI CQ

[multipaste] Add consecutive copy/paste metrics

PM wants these to measure usefulness of clipboard history.

More consecutive copies or pastes  should mean users are using
multipaste more.

Bug: 1145445
Change-Id: I4d6cecb618e8e95f9438a44e8824aa23fbc5e89f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2613350
Commit-Queue: Alex Newcomer <newcomer@chromium.org>
Reviewed-by: default avatarIlya Sherman <isherman@chromium.org>
Reviewed-by: default avatarWeilun Shi <sweilun@chromium.org>
Reviewed-by: default avatarAndrew Xu <andrewxu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842298}
parent 197a5716
......@@ -6,6 +6,7 @@
#include "ash/clipboard/clipboard_history_util.h"
#include "ash/clipboard/clipboard_nudge_controller.h"
#include "base/metrics/histogram_functions.h"
#include "base/stl_util.h"
#include "base/threading/sequenced_task_runner_handle.h"
#include "ui/base/clipboard/clipboard_monitor.h"
......@@ -66,8 +67,6 @@ void ClipboardHistory::OnClipboardDataChanged() {
if (!ClipboardHistoryUtil::IsEnabledInCurrentMode())
return;
// TODO(newcomer): Prevent Clipboard from recording metrics when pausing
// observation.
if (num_pause_ > 0)
return;
......@@ -87,6 +86,15 @@ void ClipboardHistory::OnClipboardDataChanged() {
return;
}
// Debounce calls to `OnClipboardOperation()`. Certain surfaces
// (Omnibox) may Read/Write to the clipboard multiple times in one user
// initiated operation.
clipboard_histogram_weak_factory_.InvalidateWeakPtrs();
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&ClipboardHistory::OnClipboardOperation,
clipboard_histogram_weak_factory_.GetWeakPtr(),
/*copy=*/true));
// We post commit |clipboard_data| at the end of the current task sequence to
// debounce the case where multiple copies are programmatically performed.
// Since only the most recent copy will be at the top of the clipboard, the
......@@ -102,6 +110,39 @@ void ClipboardHistory::OnClipboardDataChanged() {
commit_data_weak_factory_.GetWeakPtr(), *clipboard_data));
}
void ClipboardHistory::OnClipboardDataRead() {
if (num_pause_ > 0)
return;
// Debounce calls to `OnClipboardOperation()`. Certain surfaces
// (Omnibox) may Read/Write to the clipboard multiple times in one user
// initiated operation.
clipboard_histogram_weak_factory_.InvalidateWeakPtrs();
base::SequencedTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::BindOnce(&ClipboardHistory::OnClipboardOperation,
clipboard_histogram_weak_factory_.GetWeakPtr(),
/*copy=*/false));
}
void ClipboardHistory::OnClipboardOperation(bool copy) {
if (copy) {
consecutive_copies_++;
if (consecutive_pastes_ > 0) {
base::UmaHistogramCounts100("Ash.Clipboard.ConsecutivePastes",
consecutive_pastes_);
consecutive_pastes_ = 0;
}
return;
}
consecutive_pastes_++;
if (consecutive_copies_ > 0) {
base::UmaHistogramCounts100("Ash.Clipboard.ConsecutiveCopies",
consecutive_copies_);
consecutive_copies_ = 0;
}
}
base::WeakPtr<ClipboardHistory> ClipboardHistory::GetWeakPtr() {
return weak_factory_.GetWeakPtr();
}
......
......@@ -56,8 +56,9 @@ class ASH_EXPORT ClipboardHistory : public ui::ClipboardObserver {
// do nothing.
void RemoveItemForId(const base::UnguessableToken& id);
// ClipboardMonitor:
// ui::ClipboardObserver:
void OnClipboardDataChanged() override;
void OnClipboardDataRead() override;
base::WeakPtr<ClipboardHistory> GetWeakPtr();
......@@ -73,9 +74,18 @@ class ASH_EXPORT ClipboardHistory : public ui::ClipboardObserver {
void Pause();
void Resume();
// Keeps track of consecutive clipboard operations and records metrics.
void OnClipboardOperation(bool copy);
// The count of pauses.
size_t num_pause_ = 0;
// The number of consecutive copies, reset after a paste.
int consecutive_copies_ = 0;
// The number of consecutive pastes, reset after a copy.
int consecutive_pastes_ = 0;
// The history of data copied to the Clipboard. Items of the list are sorted
// by recency.
std::list<ClipboardHistoryItem> history_list_;
......@@ -84,9 +94,14 @@ class ASH_EXPORT ClipboardHistory : public ui::ClipboardObserver {
// ClipboardHistory.
mutable base::ObserverList<Observer> observers_;
// Factory to create WeakPtrs used to debounce calls to CommitData().
// Factory to create WeakPtrs used to debounce calls to `CommitData()`.
base::WeakPtrFactory<ClipboardHistory> commit_data_weak_factory_{this};
// Factory to create WeakPtrs used to debounce calls to
// `OnClipboardOperation()`.
base::WeakPtrFactory<ClipboardHistory> clipboard_histogram_weak_factory_{
this};
// Factory to create WeakPtrs for ClipboardHistory.
base::WeakPtrFactory<ClipboardHistory> weak_factory_{this};
};
......
......@@ -336,6 +336,26 @@ reviews. Googlers can read more about this at go/gwsq-gerrit.
</summary>
</histogram>
<histogram name="Ash.Clipboard.ConsecutiveCopies" units="times"
expires_after="2021-09-01">
<owner>newcomer@chromium.org</owner>
<owner>multipaste@google.com</owner>
<summary>
The number of consecutive copies in the user session, recorded when a paste
occurs.
</summary>
</histogram>
<histogram name="Ash.Clipboard.ConsecutivePastes" units="times"
expires_after="2021-09-01">
<owner>newcomer@chromium.org</owner>
<owner>multipaste@google.com</owner>
<summary>
The number of consecutive pastes in the user session, recorded when a copy
occurs. Includes pastes from Clipboard History.
</summary>
</histogram>
<histogram name="Ash.ClipboardHistory.ContextMenu.DisplayFormatDeleted"
enum="ClipboardHistoryDisplayFormat" expires_after="2021-09-01">
<owner>andrewxu@chromium.org</owner>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment