| Index: third_party/google_input_tools/src/chrome/os/statistics.js
|
| diff --git a/third_party/google_input_tools/src/chrome/os/statistics.js b/third_party/google_input_tools/src/chrome/os/statistics.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..59d3761db7357b4ee1fcebcbb7c8b976872bea62
|
| --- /dev/null
|
| +++ b/third_party/google_input_tools/src/chrome/os/statistics.js
|
| @@ -0,0 +1,288 @@
|
| +// Copyright 2014 The ChromeOS IME Authors. All Rights Reserved.
|
| +// limitations under the License.
|
| +// See the License for the specific language governing permissions and
|
| +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| +// distributed under the License is distributed on an "AS-IS" BASIS,
|
| +// Unless required by applicable law or agreed to in writing, software
|
| +//
|
| +// http://www.apache.org/licenses/LICENSE-2.0
|
| +//
|
| +// You may obtain a copy of the License at
|
| +// you may not use this file except in compliance with the License.
|
| +// Licensed under the Apache License, Version 2.0 (the "License");
|
| +//
|
| +goog.provide('i18n.input.chrome.Statistics');
|
| +
|
| +goog.scope(function() {
|
| +
|
| +
|
| +
|
| +/**
|
| + * The statistics util class for IME of ChromeOS.
|
| + *
|
| + * @constructor
|
| + */
|
| +i18n.input.chrome.Statistics = function() {
|
| +};
|
| +goog.addSingletonGetter(i18n.input.chrome.Statistics);
|
| +var Statistics = i18n.input.chrome.Statistics;
|
| +
|
| +
|
| +/**
|
| + * The layout types for stats.
|
| + *
|
| + * @enum {number}
|
| + */
|
| +Statistics.LayoutTypes = {
|
| + COMPACT: 0,
|
| + COMPACT_SYMBOL: 1,
|
| + COMPACT_MORE: 2,
|
| + FULL: 3,
|
| + A11Y: 4,
|
| + HANDWRITING: 5,
|
| + EMOJI: 6,
|
| + MAX: 7
|
| +};
|
| +
|
| +
|
| +/**
|
| + * The commit type for stats.
|
| + *
|
| + * @enum {number}
|
| + */
|
| +Statistics.CommitTypes = {
|
| + X_X0: 0, // User types X, and chooses X as top suggestion.
|
| + X_X1: 1, // User types X, and chooses X as non-top suggestion.
|
| + X_Y0: 2, // User types X, and chooses Y as top suggestion.
|
| + X_Y1: 3, // User types X, and chooses Y as non-top suggestion.
|
| + PREDICTION: 4,
|
| + REVERT: 5,
|
| + MAX: 7
|
| +};
|
| +
|
| +
|
| +/**
|
| + * The current input method id.
|
| + *
|
| + * @type {string}
|
| + * @private
|
| + */
|
| +Statistics.prototype.inputMethodId_ = '';
|
| +
|
| +
|
| +/**
|
| + * The current auto correct level.
|
| + *
|
| + * @type {number}
|
| + * @private
|
| + */
|
| +Statistics.prototype.autoCorrectLevel_ = 0;
|
| +
|
| +
|
| +/**
|
| + * Sets the current input method id.
|
| + *
|
| + * @param {string} inputMethodId .
|
| + */
|
| +Statistics.prototype.setInputMethodId = function(
|
| + inputMethodId) {
|
| + this.inputMethodId_ = inputMethodId;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Sets the current auto-correct level.
|
| + *
|
| + * @param {number} level .
|
| + */
|
| +Statistics.prototype.setAutoCorrectLevel = function(
|
| + level) {
|
| + this.autoCorrectLevel_ = level;
|
| + this.recordEnum('InputMethod.AutoCorrectLevel', level, 3);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Gets the commit target type based on the given source and target.
|
| + *
|
| + * @param {string} source .
|
| + * @param {string} target .
|
| + * @return {number} The target type number value.
|
| + * 0: Source; 1: Correction; 2: Completion; 3: Prediction.
|
| + * @private
|
| + */
|
| +Statistics.prototype.getTargetType_ = function(
|
| + source, target) {
|
| + if (source == target) {
|
| + return 0;
|
| + }
|
| + if (!source) {
|
| + return 3;
|
| + }
|
| + if (target.length > source.length) {
|
| + return 2;
|
| + }
|
| + return 1;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Records the metrics for each commit.
|
| + *
|
| + * @param {string} source .
|
| + * @param {string} target .
|
| + * @param {number} targetIndex The target index.
|
| + * @param {number} triggerType The trigger type:
|
| + * 0: BySpace; 1: ByReset; 2: ByCandidate; 3: BySymbolOrNumber;
|
| + * 4: ByDoubleSpaceToPeriod; 5: ByRevert.
|
| + */
|
| +Statistics.prototype.recordCommit = function(
|
| + source, target, targetIndex, triggerType) {
|
| + if (!this.inputMethodId_) {
|
| + return;
|
| + }
|
| + var CommitTypes = Statistics.CommitTypes;
|
| + var commitType = -1;
|
| + if (targetIndex == 0 && source == target) {
|
| + commitType = CommitTypes.X_X0;
|
| + } else if (targetIndex == 0 && source != target) {
|
| + commitType = CommitTypes.X_Y0;
|
| + } else if (targetIndex > 0 && source == target) {
|
| + commitType = CommitTypes.X_X1;
|
| + } else if (targetIndex > 0 && source != target) {
|
| + commitType = CommitTypes.X_Y1;
|
| + } else if (!source && this.getTargetType_(source, target) == 3) {
|
| + commitType = CommitTypes.PREDICTION;
|
| + } else if (triggerType == 5) {
|
| + commitType = CommitTypes.REVERT;
|
| + }
|
| + if (commitType < 0) {
|
| + return;
|
| + }
|
| +
|
| + var self = this;
|
| + var record = function(suffix) {
|
| + self.recordEnum('InputMethod.Commit.Index' + suffix,
|
| + targetIndex + 1, 20);
|
| + self.recordEnum('InputMethod.Commit.Type' + suffix,
|
| + commitType, CommitTypes.MAX);
|
| + };
|
| +
|
| + record('');
|
| +
|
| + if (/^pinyin/.test(this.inputMethodId_)) {
|
| + record('.Pinyin');
|
| + } else if (/^xkb:us/.test(this.inputMethodId_)) {
|
| + record('.US');
|
| + record('.US.AC' + this.autoCorrectLevel_);
|
| + } else if (/^xkb:fr/.test(this.inputMethodId_)) {
|
| + record('.FR');
|
| + record('.FR.AC' + this.autoCorrectLevel_);
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Records the latency value for stats.
|
| + *
|
| + * @param {string} name .
|
| + * @param {number} timeInMs .
|
| + */
|
| +Statistics.prototype.recordLatency = function(
|
| + name, timeInMs) {
|
| + this.recordValue(name, timeInMs, 1000, 50);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Gets the layout type for stats.
|
| + *
|
| + * @param {string} layoutCode .
|
| + * @param {boolean} isA11yMode .
|
| + * @return {Statistics.LayoutTypes}
|
| + */
|
| +Statistics.prototype.getLayoutType = function(layoutCode, isA11yMode) {
|
| + var LayoutTypes = Statistics.LayoutTypes;
|
| + var layoutType = LayoutTypes.MAX;
|
| + if (isA11yMode) {
|
| + layoutType = LayoutTypes.A11Y;
|
| + } else if (/compact/.test(layoutCode)) {
|
| + if (/symbol/.test(layoutCode)) {
|
| + layoutType = LayoutTypes.COMPACT_SYMBOL;
|
| + } else if (/more/.test(layoutCode)) {
|
| + layoutType = LayoutTypes.COMPACT_MORE;
|
| + } else {
|
| + layoutType = LayoutTypes.COMPACT;
|
| + }
|
| + } else if (/^hwt/.test(layoutCode)) {
|
| + layoutType = LayoutTypes.HANDWRITING;
|
| + } else if (/^emoji/.test(layoutCode)) {
|
| + layoutType = LayoutTypes.EMOJI;
|
| + }
|
| + return layoutType;
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Records the layout usage.
|
| + *
|
| + * @param {string} layoutCode The layout code to be switched to.
|
| + * @param {boolean} isA11yMode .
|
| + */
|
| +Statistics.prototype.recordLayout = function(
|
| + layoutCode, isA11yMode) {
|
| + this.recordEnum('InputMethod.VirtualKeyboard.Layout',
|
| + this.getLayoutType(layoutCode, isA11yMode), Statistics.LayoutTypes.MAX);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Records the layout switching action.
|
| + */
|
| +Statistics.prototype.recordLayoutSwitch = function() {
|
| + this.recordValue('InputMethod.VirtualKeyboard.LayoutSwitch', 1, 1, 1);
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Records enum value.
|
| + *
|
| + * @param {string} name .
|
| + * @param {number} enumVal .
|
| + * @param {number} enumCount .
|
| + */
|
| +Statistics.prototype.recordEnum = function(
|
| + name, enumVal, enumCount) {
|
| + if (chrome.metricsPrivate && chrome.metricsPrivate.recordValue) {
|
| + chrome.metricsPrivate.recordValue({
|
| + 'metricName': name,
|
| + 'type': 'histogram-linear',
|
| + 'min': 0,
|
| + 'max': enumCount - 1,
|
| + 'buckets': enumCount
|
| + }, enumVal);
|
| + }
|
| +};
|
| +
|
| +
|
| +/**
|
| + * Records count value.
|
| + *
|
| + * @param {string} name .
|
| + * @param {number} count .
|
| + * @param {number} max .
|
| + * @param {number} bucketCount .
|
| + */
|
| +Statistics.prototype.recordValue = function(
|
| + name, count, max, bucketCount) {
|
| + if (chrome.metricsPrivate && chrome.metricsPrivate.recordValue) {
|
| + chrome.metricsPrivate.recordValue({
|
| + 'metricName': name,
|
| + 'type': 'histogram-log',
|
| + 'min': 0,
|
| + 'max': max,
|
| + 'buckets': bucketCount
|
| + }, count);
|
| + }
|
| +};
|
| +}); // goog.scope
|
|
|