blob: d55c0d1f7313c8f1820d3ea5da122bde05edc645 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* Handles events specific to the PDF viewer and logs the corresponding metrics.
*/
class PDFMetrics {
/**
* Records when the zoom mode is changed to fit a FittingType.
*
* @param {FittingType} fittingType the new FittingType.
*/
static recordFitTo(fittingType) {
if (fittingType == FittingType.FIT_TO_PAGE) {
PDFMetrics.record(PDFMetrics.UserAction.FIT_TO_PAGE);
} else if (fittingType == FittingType.FIT_TO_WIDTH) {
PDFMetrics.record(PDFMetrics.UserAction.FIT_TO_WIDTH);
}
// There is no user action to do a fit-to-height, this only happens with
// the open param "view=FitV".
}
/**
* Records the given action to chrome.metricsPrivate.
*
* @param {PDFMetrics.UserAction} action
*/
static record(action) {
if (!chrome.metricsPrivate) {
return;
}
if (!PDFMetrics.actionsMetric_) {
PDFMetrics.actionsMetric_ = {
'metricName': 'PDF.Actions',
'type': chrome.metricsPrivate.MetricTypeType.HISTOGRAM_LOG,
'min': 1,
'max': PDFMetrics.UserAction.NUMBER_OF_ACTIONS,
'buckets': PDFMetrics.UserAction.NUMBER_OF_ACTIONS + 1
};
}
chrome.metricsPrivate.recordValue(PDFMetrics.actionsMetric_, action);
if (PDFMetrics.firstMap_.has(action)) {
const firstAction = PDFMetrics.firstMap_.get(action);
if (!PDFMetrics.firstActionRecorded_.has(firstAction)) {
chrome.metricsPrivate.recordValue(
PDFMetrics.actionsMetric_, firstAction);
PDFMetrics.firstActionRecorded_.add(firstAction);
}
}
}
static resetForTesting() {
PDFMetrics.firstActionRecorded_.clear();
PDFMetrics.actionsMetric_ = null;
}
}
/** @private {?chrome.metricsPrivate.MetricType} */
PDFMetrics.actionsMetric_ = null;
/** @private {Set} */
PDFMetrics.firstActionRecorded_ = new Set();
// Keep in sync with enums.xml.
// Do not change the numeric values or reuse them since these numbers are
// persisted to logs.
/**
* User Actions that can be recorded by calling PDFMetrics.record.
* The *_FIRST values are recorded automaticlly,
* eg. PDFMetrics.record(...ROTATE) will also record ROTATE_FIRST
* on the first instance.
*
* @enum {number}
*/
PDFMetrics.UserAction = {
/**
* Recorded when the document is first loaded. This event serves as
* denominator to determine percentages of documents in which an action was
* taken as well as average number of each action per document.
*/
DOCUMENT_OPENED: 0,
/** Recorded when the document is rotated clockwise or counter-clockwise. */
ROTATE_FIRST: 1,
ROTATE: 2,
FIT_TO_WIDTH_FIRST: 3,
FIT_TO_WIDTH: 4,
FIT_TO_PAGE_FIRST: 5,
FIT_TO_PAGE: 6,
/** Recorded when the bookmarks panel is opened. */
OPEN_BOOKMARKS_PANEL_FIRST: 7,
OPEN_BOOKMARKS_PANEL: 8,
/** Recorded when a bookmark is followed. */
FOLLOW_BOOKMARK_FIRST: 9,
FOLLOW_BOOKMARK: 10,
/** Recorded when the page selection is used to navigate to another page. */
PAGE_SELECTOR_NAVIGATE_FIRST: 11,
PAGE_SELECTOR_NAVIGATE: 12,
/** Recorded when the user triggers a save of the document. */
SAVE_FIRST: 13,
SAVE: 14,
/**
* Recorded when the user triggers a save of the document and the document
* has been modified by annotations.
*/
SAVE_WITH_ANNOTATION_FIRST: 15,
SAVE_WITH_ANNOTATION: 16,
PRINT_FIRST: 17,
PRINT: 18,
ENTER_ANNOTATION_MODE_FIRST: 19,
ENTER_ANNOTATION_MODE: 20,
EXIT_ANNOTATION_MODE_FIRST: 21,
EXIT_ANNOTATION_MODE: 22,
/** Recorded when a pen stroke is made. */
ANNOTATE_STROKE_TOOL_PEN_FIRST: 23,
ANNOTATE_STROKE_TOOL_PEN: 24,
/** Recorded when an eraser stroke is made. */
ANNOTATE_STROKE_TOOL_ERASER_FIRST: 25,
ANNOTATE_STROKE_TOOL_ERASER: 26,
/** Recorded when a highlighter stroke is made. */
ANNOTATE_STROKE_TOOL_HIGHLIGHTER_FIRST: 27,
ANNOTATE_STROKE_TOOL_HIGHLIGHTER: 28,
/** Recorded when a stroke is made using touch. */
ANNOTATE_STROKE_DEVICE_TOUCH_FIRST: 29,
ANNOTATE_STROKE_DEVICE_TOUCH: 30,
/** Recorded when a stroke is made using mouse. */
ANNOTATE_STROKE_DEVICE_MOUSE_FIRST: 31,
ANNOTATE_STROKE_DEVICE_MOUSE: 32,
/** Recorded when a stroke is made using pen. */
ANNOTATE_STROKE_DEVICE_PEN_FIRST: 33,
ANNOTATE_STROKE_DEVICE_PEN: 34,
NUMBER_OF_ACTIONS: 35,
};
// Map from UserAction to the 'FIRST' action. These metrics are recorded
// by PDFMetrics.log the first time each corresponding action occurs.
/** @private Map<number, number> */
PDFMetrics.firstMap_ = new Map([
[
PDFMetrics.UserAction.ROTATE,
PDFMetrics.UserAction.ROTATE_FIRST,
],
[
PDFMetrics.UserAction.FIT_TO_WIDTH,
PDFMetrics.UserAction.FIT_TO_WIDTH_FIRST,
],
[
PDFMetrics.UserAction.FIT_TO_PAGE,
PDFMetrics.UserAction.FIT_TO_PAGE_FIRST,
],
[
PDFMetrics.UserAction.OPEN_BOOKMARKS_PANEL,
PDFMetrics.UserAction.OPEN_BOOKMARKS_PANEL_FIRST,
],
[
PDFMetrics.UserAction.FOLLOW_BOOKMARK,
PDFMetrics.UserAction.FOLLOW_BOOKMARK_FIRST,
],
[
PDFMetrics.UserAction.PAGE_SELECTOR_NAVIGATE,
PDFMetrics.UserAction.PAGE_SELECTOR_NAVIGATE_FIRST,
],
[
PDFMetrics.UserAction.SAVE,
PDFMetrics.UserAction.SAVE_FIRST,
],
[
PDFMetrics.UserAction.SAVE_WITH_ANNOTATION,
PDFMetrics.UserAction.SAVE_WITH_ANNOTATION_FIRST,
],
[
PDFMetrics.UserAction.PRINT,
PDFMetrics.UserAction.PRINT_FIRST,
],
[
PDFMetrics.UserAction.ENTER_ANNOTATION_MODE,
PDFMetrics.UserAction.ENTER_ANNOTATION_MODE_FIRST,
],
[
PDFMetrics.UserAction.EXIT_ANNOTATION_MODE,
PDFMetrics.UserAction.EXIT_ANNOTATION_MODE_FIRST,
],
[
PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_PEN,
PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_PEN_FIRST,
],
[
PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_ERASER,
PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_ERASER_FIRST,
],
[
PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_HIGHLIGHTER,
PDFMetrics.UserAction.ANNOTATE_STROKE_TOOL_HIGHLIGHTER_FIRST,
],
[
PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_TOUCH,
PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_TOUCH_FIRST,
],
[
PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_MOUSE,
PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_MOUSE_FIRST,
],
[
PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_PEN,
PDFMetrics.UserAction.ANNOTATE_STROKE_DEVICE_PEN_FIRST,
],
]);