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 |