// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import {sendWithPromise} from 'chrome://resources/js/cr.js';
/**
* @fileoverview A helper object used by the chrome://metrics-internals page to
* interact with the browser.
*/
/**
* A pair of strings representing a row in a summary table. For example, |key|
* could be "Platform", with |value| being "Android".
*/
export interface KeyValue {
key: string;
value: string;
}
/**
* An individual event that occurred on a log. Optionally, this may include a
* message. For example, for a "Trimmed" event, the message could be "Log size
* too large".
*/
export interface LogEvent {
event: string;
timestampMs: number;
message?: string;
}
/**
* A log and its data, including the events that occurred throughout its
* lifetime. The |type| field is only set for UMA logs (i.e., ongoing,
* independent, or stability). The |compressed_data| field (i.e., its proto
* data) is only set when exporting.
* TODO(crbug.com/40238818): Change name of |type| to something else, since it is
* confusing and can be mistaken for |logType| in LogData (UMA or UKM).
*/
export interface Log {
type?: string;
hash: string;
timestamp: string;
data?: string;
size: number;
events: LogEvent[];
}
/**
* A list of logs, as well as their type (UMA or UKM).
*/
export interface LogData {
logType: string;
logs: Log[];
}
/**
* A study or group name along with its hex hash.
*/
export interface HashNamed {
// `undefined` if we only know the hash.
name: string|undefined;
hash: string;
}
/**
* A Field Trial Group.
*/
export interface Group extends HashNamed {
forceEnabled: boolean;
enabled: boolean;
}
/**
* A Field Trial.
*/
export interface Trial extends HashNamed {
groups: Group[];
}
/**
* Maps some hashes to their study/group names.
*/
export interface HashNameMap {
[hash: string]: string;
}
/**
* State of all field trials.
*/
export interface FieldTrialState {
trials: Trial[];
restartRequired: boolean;
}
export interface MetricsInternalsBrowserProxy {
/**
* Gets UMA log data. |includeLogProtoData| determines whether or not the
* fetched data should also include the protos of the logs.
*/
getUmaLogData(includeLogProtoData: boolean): Promise<string>;
/**
* Fetches a summary of variations info.
*/
fetchVariationsSummary(): Promise<KeyValue[]>;
/**
* Fetches a summary of UMA info.
*/
fetchUmaSummary(): Promise<KeyValue[]>;
/**
* Fetches whether the logs observer being used is owned by the metrics
* service or is owned by the page.
*/
isUsingMetricsServiceObserver(): Promise<boolean>;
/**
* Overrides the enroll state of a field trial which will be realized after a
* restart.
*/
setTrialEnrollState(
trialHash: string, groupHash: string,
forceEnable: boolean): Promise<boolean>;
/**
* Fetches the current state of the field trials.
*/
fetchTrialState(): Promise<FieldTrialState>;
/**
* Given a trial name, group name, or combination with a [/.-:] separator,
* returns any name hashes associated with that trial or group.
*/
lookupTrialOrGroupName(name: string): Promise<HashNameMap>;
/**
* Restarts the browser.
*/
restart(): Promise<void>;
}
export class MetricsInternalsBrowserProxyImpl implements
MetricsInternalsBrowserProxy {
getUmaLogData(includeLogProtoData: boolean): Promise<string> {
return sendWithPromise('fetchUmaLogsData', includeLogProtoData);
}
fetchVariationsSummary(): Promise<KeyValue[]> {
return sendWithPromise('fetchVariationsSummary');
}
fetchUmaSummary(): Promise<KeyValue[]> {
return sendWithPromise('fetchUmaSummary');
}
isUsingMetricsServiceObserver(): Promise<boolean> {
return sendWithPromise('isUsingMetricsServiceObserver');
}
setTrialEnrollState(
trialHash: string, groupHash: string,
forceEnable: boolean): Promise<boolean> {
return sendWithPromise(
'setTrialEnrollState', trialHash, groupHash, forceEnable);
}
fetchTrialState(): Promise<FieldTrialState> {
return sendWithPromise('fetchTrialState');
}
lookupTrialOrGroupName(name: string): Promise<HashNameMap> {
return sendWithPromise('lookupTrialOrGroupName', name);
}
restart(): Promise<void> {
return sendWithPromise('restart');
}
static getInstance(): MetricsInternalsBrowserProxy {
return instance || (instance = new MetricsInternalsBrowserProxyImpl());
}
static setInstance(obj: MetricsInternalsBrowserProxy) {
instance = obj;
}
}
let instance: MetricsInternalsBrowserProxy|null = null;