Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(273)

Unified Diff: third_party/google_input_tools/src/chrome/os/inputview/controller.js

Issue 701603002: Update to google-input-tools version 1.0.5.0 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/google_input_tools/src/chrome/os/inputview/controller.js
diff --git a/third_party/google_input_tools/src/chrome/os/inputview/controller.js b/third_party/google_input_tools/src/chrome/os/inputview/controller.js
index 27f305bdb0a1d4021ebf4d8ec6b4ca19fe702b80..0ba4efbb42ec8fdb2bf2755f3e6a01ae88e1823d 100644
--- a/third_party/google_input_tools/src/chrome/os/inputview/controller.js
+++ b/third_party/google_input_tools/src/chrome/os/inputview/controller.js
@@ -23,6 +23,7 @@ goog.require('goog.events.EventType');
goog.require('goog.i18n.bidi');
goog.require('goog.object');
goog.require('i18n.input.chrome.DataSource');
+goog.require('i18n.input.chrome.Statistics');
goog.require('i18n.input.chrome.inputview.Adapter');
goog.require('i18n.input.chrome.inputview.CandidatesInfo');
goog.require('i18n.input.chrome.inputview.ConditionName');
@@ -37,7 +38,6 @@ goog.require('i18n.input.chrome.inputview.SizeSpec');
goog.require('i18n.input.chrome.inputview.SoundController');
goog.require('i18n.input.chrome.inputview.SpecNodeName');
goog.require('i18n.input.chrome.inputview.StateType');
-goog.require('i18n.input.chrome.inputview.Statistics');
goog.require('i18n.input.chrome.inputview.SwipeDirection');
goog.require('i18n.input.chrome.inputview.elements.ElementType');
goog.require('i18n.input.chrome.inputview.elements.content.Candidate');
@@ -102,7 +102,8 @@ i18n.input.chrome.inputview.Controller = function(keyset, languageCode,
this.model_ = new i18n.input.chrome.inputview.Model();
/** @private {!i18n.input.chrome.inputview.PerfTracker} */
- this.perfTracker_ = new i18n.input.chrome.inputview.PerfTracker();
+ this.perfTracker_ = new i18n.input.chrome.inputview.PerfTracker(
+ PerfTracker.TickName.HTML_LOADED);
/**
* The layout map.
@@ -148,10 +149,10 @@ i18n.input.chrome.inputview.Controller = function(keyset, languageCode,
/**
* The statistics object for recording metrics values.
*
- * @type {!i18n.input.chrome.inputview.Statistics}
+ * @type {!i18n.input.chrome.Statistics}
* @private
*/
- this.statistics_ = i18n.input.chrome.inputview.Statistics.getInstance();
+ this.statistics_ = i18n.input.chrome.Statistics.getInstance();
/** @private {!i18n.input.chrome.inputview.ReadyState} */
this.readyState_ = new i18n.input.chrome.inputview.ReadyState();
@@ -178,6 +179,29 @@ i18n.input.chrome.inputview.Controller = function(keyset, languageCode,
*/
this.contextTypeToKeysetMap_ = {};
+ /**
+ * The stats map for input view closing.
+ *
+ * @type {!Object.<string, !Array.<number>>}
+ * @private
+ */
+ this.statsForClosing_ = {};
+
+ /**
+ * The last height sent to window.resizeTo to avoid multiple equivalent calls.
+ *
+ * @private {number}
+ */
+ this.lastResizeHeight_ = -1;
+
+ /**
+ * The activate (show) time stamp for statistics.
+ *
+ * @type {Date}
+ * @private
+ */
+ this.showTimeStamp_ = new Date();
+
this.initialize(keyset, languageCode, passwordLayout, name);
/**
* The suggestions.
@@ -436,9 +460,6 @@ Controller.prototype.onUpdateSettings_ = function(e) {
if (goog.isDef(e.msg['candidatesNavigation'])) {
settings.candidatesNavigation = e.msg['candidatesNavigation'];
}
- if (goog.isDef(e.msg['supportCompact'])) {
- settings.supportCompact = e.msg['supportCompact'];
- }
if (goog.isDef(e.msg[Name.KEYSET])) {
this.contextTypeToKeysetMap_[this.currentInputMethod_][
ContextType.DEFAULT] = e.msg[Name.KEYSET];
@@ -454,6 +475,7 @@ Controller.prototype.onUpdateSettings_ = function(e) {
this.soundController_.setEnabled(settings.soundOnKeypress);
}
this.perfTracker_.tick(PerfTracker.TickName.BACKGROUND_SETTINGS_FETCHED);
+ this.model_.stateManager.contextType = this.adapter_.getContextType();
var isPassword = this.adapter_.isPasswordBox();
this.switchToKeySet(this.getActiveKeyset_());
};
@@ -483,6 +505,10 @@ Controller.prototype.onSettingsReady_ = function() {
preferredKeyset;
}
}
+ if (!this.adapter_.isExperimental && keysetMap[ContextType.DEFAULT] ==
+ 'zhuyin.compact.qwerty') {
+ keysetMap[ContextType.DEFAULT] = 'zhuyin';
+ }
this.maybeCreateViews_();
this.switchToKeySet(this.getActiveKeyset_());
};
@@ -558,6 +584,10 @@ Controller.prototype.onPointerEvent_ = function(e) {
return;
}
+ if (e.type == EventType.POINTER_UP) {
+ this.stopBackspaceAutoRepeat_();
+ }
+
if (e.view) {
this.handlePointerAction_(e.view, e);
} else {
@@ -630,7 +660,8 @@ Controller.prototype.executeCommand_ = function(command, opt_arg) {
case CommandEnum.SWITCH_KEYSET:
var keyset = opt_arg;
if (keyset) {
- this.statistics_.recordSwitch(keyset);
+ this.recordStatsForClosing_(
+ 'InputMethod.VirtualKeyboard.LayoutSwitch', 1, 25, 25);
this.switchToKeySet(keyset);
}
break;
@@ -666,8 +697,15 @@ Controller.prototype.handlePointerAction_ = function(view, e) {
}
switch (view.type) {
case ElementType.BACK_BUTTON:
+ if (e.type == EventType.POINTER_OUT || e.type == EventType.POINTER_UP) {
+ view.setHighlighted(false);
+ } else if (e.type == EventType.POINTER_DOWN ||
+ e.type == EventType.POINTER_OVER) {
+ view.setHighlighted(true);
+ }
if (e.type == EventType.POINTER_UP) {
this.switchToKeySet(this.container_.currentKeysetView.fromKeyset);
+ this.clearCandidates_();
}
return;
case ElementType.EXPAND_CANDIDATES:
@@ -693,6 +731,7 @@ Controller.prototype.handlePointerAction_ = function(view, e) {
this.adapter_.commitText(view.candidate[Name.CANDIDATE]);
}
this.container_.cleanStroke();
+ this.soundController_.onKeyUp(ElementType.CANDIDATE);
}
if (e.type == EventType.POINTER_OUT || e.type == EventType.POINTER_UP) {
view.setHighlighted(false);
@@ -804,7 +843,8 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
key = /** @type {!content.CharacterKey} */ (softKey);
if (e.type == EventType.LONG_PRESS) {
this.container_.altDataView.show(
- key, goog.i18n.bidi.isRtlLanguage(this.languageCode_));
+ key, goog.i18n.bidi.isRtlLanguage(this.languageCode_),
+ this.adapter_.isExperimental);
} else if (e.type == EventType.POINTER_UP) {
this.model_.stateManager.triggerChording();
var ch = key.getActiveCharacter();
@@ -820,22 +860,23 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
var isStateEnabled = this.model_.stateManager.hasState(key.toState);
var isChording = this.model_.stateManager.isChording(key.toState);
if (e.type == EventType.POINTER_DOWN) {
- this.changeState_(key.toState, !isStateEnabled, true);
+ this.changeState_(key.toState, !isStateEnabled, true, false);
this.model_.stateManager.setKeyDown(key.toState, true);
} else if (e.type == EventType.POINTER_UP || e.type == EventType.
POINTER_OUT) {
if (isChording) {
this.changeState_(key.toState, false, false);
- } else if (key.toState != StateType.CAPSLOCK &&
- this.model_.stateManager.isKeyDown(key.toState)) {
+ } else if (key.toState == StateType.CAPSLOCK) {
+ this.changeState_(key.toState, isStateEnabled, true, true);
+ } else if (this.model_.stateManager.isKeyDown(key.toState)) {
this.changeState_(key.toState, isStateEnabled, false);
}
this.model_.stateManager.setKeyDown(key.toState, false);
} else if (e.type == EventType.DOUBLE_CLICK) {
- this.changeState_(key.toState, isStateEnabled, true);
+ this.changeState_(key.toState, isStateEnabled, true, true);
} else if (e.type == EventType.LONG_PRESS) {
if (!isChording) {
- this.changeState_(key.toState, true, true);
+ this.changeState_(key.toState, true, true, true);
this.model_.stateManager.setKeyDown(key.toState, false);
}
}
@@ -863,10 +904,8 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
case ElementType.ENTER_KEY:
key = /** @type {!content.FunctionalKey} */ (softKey);
- if (e.type == EventType.POINTER_DOWN) {
- this.adapter_.sendKeyDownEvent('\u000D', KeyCodes.ENTER);
- } else if (e.type == EventType.POINTER_UP) {
- this.adapter_.sendKeyUpEvent('\u000D', KeyCodes.ENTER);
+ if (e.type == EventType.POINTER_UP) {
+ this.adapter_.sendKeyDownAndUpEvent('\u000D', KeyCodes.ENTER);
}
break;
@@ -925,7 +964,8 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
case ElementType.SWITCHER_KEY:
key = /** @type {!content.SwitcherKey} */ (softKey);
if (e.type == EventType.POINTER_UP) {
- this.statistics_.recordSwitch(key.toKeyset);
+ this.recordStatsForClosing_(
+ 'InputMethod.VirtualKeyboard.LayoutSwitch', 1, 25, 25);
if (this.isSubKeyset_(key.toKeyset, this.currentKeyset_)) {
this.model_.stateManager.reset();
this.container_.update();
@@ -948,7 +988,8 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
key = /** @type {!content.CompactKey} */ (softKey);
if (e.type == EventType.LONG_PRESS) {
this.container_.altDataView.show(
- key, goog.i18n.bidi.isRtlLanguage(this.languageCode_));
+ key, goog.i18n.bidi.isRtlLanguage(this.languageCode_),
+ this.adapter_.isExperimental);
} else if (e.type == EventType.POINTER_UP) {
this.model_.stateManager.triggerChording();
this.adapter_.sendKeyDownAndUpEvent(key.getActiveCharacter(), '', 0,
@@ -959,29 +1000,37 @@ Controller.prototype.handlePointerEventForSoftKey_ = function(softKey, e) {
break;
case ElementType.HIDE_KEYBOARD_KEY:
+ var defaultKeyset = this.getActiveKeyset_();
if (e.type == EventType.POINTER_UP) {
this.adapter_.hideKeyboard();
}
+ if (this.currentKeyset_ != defaultKeyset) {
+ this.switchToKeySet(defaultKeyset);
+ }
break;
case ElementType.MENU_KEY:
key = /** @type {!content.MenuKey} */ (softKey);
if (e.type == EventType.POINTER_DOWN) {
var isCompact = this.currentKeyset_.indexOf('compact') != -1;
- var remappedKeyset = this.getRemappedKeyset_(this.currentKeyset_);
- var keysetData = this.keysetDataMap_[remappedKeyset];
- var enableCompact = !this.adapter_.isA11yMode &&
- !!keysetData[SpecNodeName.HAS_COMPACT_KEYBOARD] &&
- this.model_.settings.supportCompact;
+ var defaultKeyset = this.contextTypeToKeysetMap_[
+ this.currentInputMethod_][ContextType.DEFAULT];
+ var enableCompact = !this.adapter_.isA11yMode && goog.array.contains(
+ util.KEYSETS_HAVE_COMPACT, defaultKeyset.split(/\./)[0]);
+ if (defaultKeyset == 'zhuyin' && !this.adapter_.isExperimental ||
+ this.languageCode_ == 'ko') {
+ // Hides 'switch to compact' for zhuyin when not in experimental env.
+ enableCompact = false;
+ }
var self = this;
- var currentKeyset = this.currentKeyset_;
var hasHwt = !this.adapter_.isPasswordBox() &&
!Controller.DISABLE_HWT && goog.object.contains(
- InputToolCode, this.getHwtInputToolCode_());
+ InputToolCode, this.getHwtInputToolCode_()) &&
+ this.languageCode_ != 'ko';
var enableSettings = this.shouldEnableSettings() &&
- window.inputview && inputview.openSettings;
+ !!window.inputview && !!inputview.openSettings;
this.adapter_.getInputMethods(function(inputMethods) {
- this.container_.menuView.show(key, currentKeyset, isCompact,
+ this.container_.menuView.show(key, defaultKeyset, isCompact,
enableCompact, this.currentInputMethod_, inputMethods, hasHwt,
enableSettings, this.adapter_.isExperimental);
}.bind(this));
@@ -1034,10 +1083,12 @@ Controller.prototype.clearUnstickyState_ = function() {
* @private
*/
Controller.prototype.stopBackspaceAutoRepeat_ = function() {
- goog.dispose(this.backspaceAutoRepeat_);
- this.backspaceAutoRepeat_ = null;
- this.adapter_.sendKeyUpEvent('\u0008', KeyCodes.BACKSPACE);
- this.backspaceRepeated_ = 0;
+ if (this.backspaceAutoRepeat_) {
+ goog.dispose(this.backspaceAutoRepeat_);
+ this.backspaceAutoRepeat_ = null;
+ this.adapter_.sendKeyUpEvent('\u0008', KeyCodes.BACKSPACE);
+ this.backspaceRepeated_ = 0;
+ }
};
@@ -1072,6 +1123,14 @@ Controller.prototype.backspaceTick_ = function() {
*/
Controller.prototype.onVisibilityChange_ = function() {
if (!this.adapter_.isVisible) {
+ for (var name in this.statsForClosing_) {
+ var stat = this.statsForClosing_[name];
+ this.statistics_.recordValue(name, stat[0], stat[1], stat[2]);
+ }
+ this.statistics_.recordValue('InputMethod.VirtualKeyboard.Duration',
+ Math.floor((new Date() - this.showTimeStamp_) / 1000), 4096, 50);
+ this.statsForClosing_ = {};
+ this.showTimeStamp_ = new Date();
this.resetAll_();
}
};
@@ -1085,6 +1144,7 @@ Controller.prototype.onVisibilityChange_ = function() {
*/
Controller.prototype.resetAll_ = function() {
this.clearCandidates_();
+ this.container_.cleanStroke();
this.container_.candidateView.hideNumberRow();
this.model_.stateManager.reset();
this.container_.update();
@@ -1103,6 +1163,7 @@ Controller.prototype.resetAll_ = function() {
*/
Controller.prototype.onContextFocus_ = function() {
this.resetAll_();
+ this.model_.stateManager.contextType = this.adapter_.getContextType();
this.switchToKeySet(this.getActiveKeyset_());
};
@@ -1137,6 +1198,7 @@ Controller.prototype.onSurroundingTextChanged_ = function(e) {
*/
Controller.prototype.onContextBlur_ = function() {
this.clearCandidates_();
+ this.container_.cleanStroke();
this.deadKey_ = '';
this.container_.menuView.hide();
};
@@ -1154,6 +1216,12 @@ Controller.prototype.backspaceDown_ = function() {
} else {
this.adapter_.sendKeyDownEvent('\u0008', KeyCodes.BACKSPACE);
}
+ this.recordStatsForClosing_(
+ 'InputMethod.VirtualKeyboard.BackspaceCount', 1, 4095, 4096);
+ this.statistics_.recordEnum('InputMethod.VirtualKeyboard.BackspaceOnLayout',
+ this.statistics_.getLayoutType(this.currentKeyset_,
+ this.adapter_.isA11yMode),
+ i18n.input.chrome.Statistics.LayoutTypes.MAX);
};
@@ -1163,9 +1231,11 @@ Controller.prototype.backspaceDown_ = function() {
* @param {StateType} stateType The state type.
* @param {boolean} enable True to enable the state.
* @param {boolean} isSticky True to make the state sticky.
+ * @param {boolean=} opt_isFinalSticky .
* @private
*/
-Controller.prototype.changeState_ = function(stateType, enable, isSticky) {
+Controller.prototype.changeState_ = function(stateType, enable, isSticky,
+ opt_isFinalSticky) {
if (stateType == StateType.ALTGR) {
var code = KeyCodes.ALT_RIGHT;
if (enable) {
@@ -1181,7 +1251,12 @@ Controller.prototype.changeState_ = function(stateType, enable, isSticky) {
var isStickyBefore = this.model_.stateManager.isSticky(stateType);
this.model_.stateManager.setState(stateType, enable);
this.model_.stateManager.setSticky(stateType, isSticky);
- if (isEnabledBefore != enable || isStickyBefore != isSticky) {
+ var isFinalSticky = goog.isDef(opt_isFinalSticky) ? opt_isFinalSticky :
+ false;
+ var isFinalStikcyBefore = this.model_.stateManager.isFinalSticky(stateType);
+ this.model_.stateManager.setFinalSticky(stateType, isFinalSticky);
+ if (isEnabledBefore != enable || isStickyBefore != isSticky ||
+ isFinalStikcyBefore != isFinalSticky) {
this.container_.update();
}
};
@@ -1368,9 +1443,12 @@ Controller.prototype.switchToKeySet = function(keyset) {
this.title_, this.adapter_.isPasswordBox(), this.adapter_.isA11yMode,
keyset, this.currentKeyset_, this.languageCode_);
- // Update the keyset of current context type.
- this.contextTypeToKeysetMap_[this.currentInputMethod_][
- this.adapter_.getContextType()] = keyset;
+ if (!this.isSubKeyset_(this.currentKeyset_, keyset)) {
+ // If it is the sub keyset switching, don't record it.
+ // Update the keyset of current context type.
+ this.contextTypeToKeysetMap_[this.currentInputMethod_][
+ this.adapter_.getContextType()] = keyset;
+ }
if (ret) {
this.updateLanguageState_(this.currentKeyset_, keyset);
@@ -1381,7 +1459,7 @@ Controller.prototype.switchToKeySet = function(keyset) {
this.currentKeyset_ = keyset;
this.resize(Controller.DEV);
- this.statistics_.setCurrentLayout(keyset);
+ this.statistics_.recordLayout(keyset, this.adapter_.isA11yMode);
// Activate the current key set view instance.
this.container_.currentKeysetView.activate(keyset);
this.perfTracker_.tick(PerfTracker.TickName.KEYBOARD_SHOWN);
@@ -1463,7 +1541,10 @@ Controller.prototype.resize = function(opt_ignoreWindowResize) {
var viewportSize = goog.dom.getViewportSize();
if (viewportSize.height != height && !opt_ignoreWindowResize) {
- window.resizeTo(screen.width, height);
+ if (this.lastResizeHeight_ != height) {
+ this.lastResizeHeight_ = height;
+ window.resizeTo(screen.width, height);
+ }
return;
}
@@ -1545,6 +1626,12 @@ Controller.prototype.initialize = function(keyset, languageCode, passwordLayout,
title) {
this.perfTracker_.restart();
this.adapter_.getCurrentInputMethod(function(currentInputMethod) {
+ // TODO: remove this hack as soon as the manifest is fixed in chromium.
+ if (languageCode == 'ko') {
+ if (currentInputMethod.indexOf('hangul_2set') > 0) {
+ keyset = 'm17n:ko_2set';
+ }
+ }
this.languageCode_ = languageCode;
this.currentInputMethod_ = currentInputMethod;
var keySetMap = this.contextTypeToKeysetMap_[this.currentInputMethod_];
@@ -1641,18 +1728,47 @@ Controller.prototype.isSubKeyset_ = function(keysetA, keysetB) {
*/
Controller.prototype.updateLanguageState_ =
function(fromRawKeyset, toRawKeyset) {
- if (fromRawKeyset == 'pinyin-zh-CN.en.compact.qwerty' &&
- toRawKeyset.indexOf('en.compact') == -1) {
- this.adapter_.toggleLanguageState(true);
- } else if (fromRawKeyset.indexOf('en.compact') == -1 &&
- toRawKeyset == 'pinyin-zh-CN.en.compact.qwerty') {
- this.adapter_.toggleLanguageState(false);
- } else if (goog.array.contains(
- i18n.input.chrome.inputview.util.KEYSETS_HAVE_EN_SWTICHER,
- toRawKeyset)) {
- this.adapter_.toggleLanguageState(true);
- this.model_.stateManager.isEnMode = false;
+ var toggle = false;
+ var toggleState = false;
+ // Deal with the switch logic to/from English within the compact layout.
+ if (fromRawKeyset.indexOf('en.compact') *
+ toRawKeyset.indexOf('en.compact') < 0) { // Switches between non-en/en.
+ toggle = true;
+ toggleState = toRawKeyset.indexOf('en.compact') == -1;
+ } else if (fromRawKeyset.indexOf(toRawKeyset) == 0 &&
+ fromRawKeyset.indexOf('.compact') > 0 ||
+ fromRawKeyset && toRawKeyset.indexOf(fromRawKeyset) == 0 &&
+ toRawKeyset.indexOf('.compact') > 0) {
+ // Switch between full/compact layouts, reset the default button and
+ // language.
+ toggle = true;
+ toggleState = true;
+ }
+ if (toggle) {
+ this.adapter_.toggleLanguageState(toggleState);
+ this.model_.stateManager.isEnMode = !toggleState;
this.container_.currentKeysetView.update();
}
};
+
+
+/**
+ * Records the stats which will be reported when input view is closing.
+ *
+ * @param {string} name The metrics name.
+ * @param {number} count The count value for histogram.
+ * @param {number} max .
+ * @param {number} bucketCount .
+ * @private
+ */
+Controller.prototype.recordStatsForClosing_ = function(
+ name, count, max, bucketCount) {
+ if (!this.statsForClosing_[name]) {
+ this.statsForClosing_[name] = [count, max, bucketCount];
+ } else {
+ this.statsForClosing_[name][0] += count;
+ this.statsForClosing_[name][1] = max;
+ this.statsForClosing_[name][2] = bucketCount;
+ }
+};
}); // goog.scope

Powered by Google App Engine
This is Rietveld 408576698