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

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

Issue 674153004: Add third_party/google-input-tools: Take 2 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@google_input_tools
Patch Set: Created 6 years, 2 months 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/config/util.js
diff --git a/third_party/google_input_tools/src/chrome/os/inputview/config/util.js b/third_party/google_input_tools/src/chrome/os/inputview/config/util.js
new file mode 100644
index 0000000000000000000000000000000000000000..098e4aa3c1fd35f0b2bf339c8789b9046ad1ab4c
--- /dev/null
+++ b/third_party/google_input_tools/src/chrome/os/inputview/config/util.js
@@ -0,0 +1,605 @@
+// 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.inputview.content.util');
+
+goog.require('goog.array');
+goog.require('i18n.input.chrome.inputview.Css');
+goog.require('i18n.input.chrome.inputview.Direction');
+goog.require('i18n.input.chrome.inputview.SpecNodeName');
+goog.require('i18n.input.chrome.inputview.StateType');
+goog.require('i18n.input.chrome.inputview.elements.ElementType');
+
+goog.scope(function() {
+var ElementType = i18n.input.chrome.inputview.elements.ElementType;
+var SpecNodeName = i18n.input.chrome.inputview.SpecNodeName;
+
+
+/**
+ * The prefix of the key id.
+ *
+ * @type {string}
+ * @private
+ */
+i18n.input.chrome.inputview.content.util.keyIdPrefix_ = 'sk-';
+
+
+/**
+ * Creates the hide keyboard key.
+ *
+ * @return {!Object} The hide keyboard key.
+ */
+i18n.input.chrome.inputview.content.util.createHideKeyboardKey = function() {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.HIDE_KEYBOARD_ICON;
+ spec[SpecNodeName.TYPE] = ElementType.HIDE_KEYBOARD_KEY;
+ spec[SpecNodeName.ID] = 'HideKeyboard';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a shift key.
+ *
+ * @param {boolean} isLeft True if this is the left shift key.
+ * @param {boolean=} opt_supportSticky True if support sticky shift key.
+ * @return {!Object} The shift key.
+ */
+i18n.input.chrome.inputview.content.util.createShiftKey = function(isLeft,
+ opt_supportSticky) {
+ var spec = {};
+ spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.SHIFT;
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.SHIFT_ICON;
+ spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
+ spec[SpecNodeName.ID] = isLeft ? 'ShiftLeft' : 'ShiftRight';
+ spec[SpecNodeName.SUPPORT_STICKY] = !!opt_supportSticky;
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a globe key.
+ *
+ * @return {!Object} The globe key.
+ */
+i18n.input.chrome.inputview.content.util.createGlobeKey = function() {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.GLOBE_ICON;
+ spec[SpecNodeName.TYPE] = ElementType.GLOBE_KEY;
+ spec[SpecNodeName.ID] = 'Globe';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a menu key.
+ *
+ * @param {string=} opt_toKeyset The compact keyboard id.
+ * @return {!Object} The menu key.
+ */
+i18n.input.chrome.inputview.content.util.createMenuKey = function(
+ opt_toKeyset) {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.MENU_ICON;
+ spec[SpecNodeName.TO_KEYSET] = opt_toKeyset;
+ spec[SpecNodeName.TYPE] = ElementType.MENU_KEY;
+ spec[SpecNodeName.ID] = 'Menu';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Create the Emoji switch key.
+ *
+ * @param {string} id The emoji key id.
+ * @param {number} toKeyset The keyset that the tabbar represents.
+ * @param {i18n.input.chrome.inputview.Css}
+ * iconCssClass The icon css for the tabbar.
+ * @return {!Object} The emoji key.
+ */
+i18n.input.chrome.inputview.content.util.createTabBarKey =
+ function(id, toKeyset, iconCssClass) {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] = iconCssClass;
+ spec[SpecNodeName.TYPE] = ElementType.TAB_BAR_KEY;
+ spec[SpecNodeName.ID] = id;
+ spec[SpecNodeName.TO_KEYSET] = toKeyset;
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Create the indicator
+ *
+ * @param {string} id The indicator id.
+ * @return {!Object} The indicator.
+ */
+i18n.input.chrome.inputview.content.util.createPageIndicator =
+ function(id) {
+ var spec = {};
+ spec[SpecNodeName.TYPE] = ElementType.PAGE_INDICATOR;
+ spec[SpecNodeName.ID] = id;
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Create the back key for emoji
+ *
+ * @return {!Object} The back key.
+ */
+i18n.input.chrome.inputview.content.util.createBackKey = function() {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.EMOJI_BACK;
+ spec[SpecNodeName.TYPE] = ElementType.BACK_BUTTON;
+ spec[SpecNodeName.ID] = 'backkey';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a ctrl key.
+ *
+ * @return {!Object} The ctrl key.
+ */
+i18n.input.chrome.inputview.content.util.createCtrlKey = function() {
+ var spec = {};
+ spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.CTRL;
+ spec[SpecNodeName.NAME] = 'ctrl';
+ spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
+ spec[SpecNodeName.ID] = 'ControlLeft';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a alt key.
+ *
+ * @return {!Object} The alt key.
+ */
+i18n.input.chrome.inputview.content.util.createAltKey = function() {
+ var spec = {};
+ spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.ALT;
+ spec[SpecNodeName.NAME] = 'alt';
+ spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
+ spec[SpecNodeName.ID] = 'AltLeft';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a altgr key.
+ *
+ * @return {!Object} The altgr key.
+ */
+i18n.input.chrome.inputview.content.util.createAltgrKey = function() {
+ var spec = {};
+ spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.ALTGR;
+ spec[SpecNodeName.NAME] = 'alt gr';
+ spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
+ spec[SpecNodeName.ID] = 'AltRight';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a key used to switch to english.
+ *
+ * @return {!Object} The enSwitcher key.
+ */
+i18n.input.chrome.inputview.content.util.createEnSwitcherKey =
+ function() {
+ var spec = {};
+ spec[SpecNodeName.TYPE] = ElementType.EN_SWITCHER;
+ spec[SpecNodeName.ID] = 'enSwitcher';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a capslock key.
+ *
+ * @return {!Object} The capslock key.
+ */
+i18n.input.chrome.inputview.content.util.createCapslockKey = function() {
+ var spec = {};
+ spec[SpecNodeName.TO_STATE] = i18n.input.chrome.inputview.StateType.CAPSLOCK;
+ spec[SpecNodeName.NAME] = 'caps lock';
+ spec[SpecNodeName.TYPE] = ElementType.MODIFIER_KEY;
+ spec[SpecNodeName.ID] = 'OsLeft';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a enter key.
+ *
+ * @return {!Object} The enter key.
+ */
+i18n.input.chrome.inputview.content.util.createEnterKey = function() {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.ENTER_ICON;
+ spec[SpecNodeName.TYPE] = ElementType.ENTER_KEY;
+ spec[SpecNodeName.ID] = 'Enter';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a tab key.
+ *
+ * @return {!Object} The tab key.
+ */
+i18n.input.chrome.inputview.content.util.createTabKey = function() {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] = i18n.input.chrome.inputview.Css.TAB_ICON;
+ spec[SpecNodeName.TYPE] = ElementType.TAB_KEY;
+ spec[SpecNodeName.ID] = 'Tab';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a backspace key.
+ *
+ * @return {!Object} The backspace key.
+ */
+i18n.input.chrome.inputview.content.util.createBackspaceKey = function() {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.BACKSPACE_ICON;
+ spec[SpecNodeName.TYPE] = ElementType.BACKSPACE_KEY;
+ spec[SpecNodeName.ID] = 'Backspace';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a space key.
+ *
+ * @return {!Object} The space key.
+ */
+i18n.input.chrome.inputview.content.util.createSpaceKey = function() {
+ var spec = {};
+ spec[SpecNodeName.NAME] = ' ';
+ spec[SpecNodeName.TYPE] = ElementType.SPACE_KEY;
+ spec[SpecNodeName.ID] = 'Space';
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Create an IME switch key.
+ *
+ * @param {string} id .
+ * @param {string} name .
+ * @param {string} css .
+ * @return {!Object} The JP IME switch key.
+ */
+i18n.input.chrome.inputview.content.util.createIMESwitchKey =
+ function(id, name, css) {
+ var spec = {};
+ spec[SpecNodeName.NAME] = name;
+ spec[SpecNodeName.TYPE] = ElementType.IME_SWITCH;
+ spec[SpecNodeName.ID] = id;
+ spec[SpecNodeName.TEXT_CSS_CLASS] = css;
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a normal key.
+ *
+ * @param {!Object} spec The specification.
+ * @return {!Object} The normal key.
+ */
+i18n.input.chrome.inputview.content.util.createNormalKey = function(spec) {
+ spec[SpecNodeName.TYPE] = ElementType.CHARACTER_KEY;
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates an arrow key.
+ *
+ * @param {!i18n.input.chrome.inputview.Direction} direction The direction.
+ * @return {!Object} The arrow key.
+ */
+i18n.input.chrome.inputview.content.util.createArrowKey = function(direction) {
+ var spec = {};
+ spec[SpecNodeName.ICON_CSS_CLASS] =
+ i18n.input.chrome.inputview.Css.ARROW_KEY + ' ';
+ if (direction == i18n.input.chrome.inputview.Direction.UP) {
+ spec[SpecNodeName.ID] = 'ArrowUp';
+ spec[SpecNodeName.ICON_CSS_CLASS] += i18n.input.chrome.inputview.Css.UP_KEY;
+ spec[SpecNodeName.TYPE] = ElementType.ARROW_UP;
+ } else if (direction == i18n.input.chrome.inputview.Direction.DOWN) {
+ spec[SpecNodeName.ID] = 'ArrowDown';
+ spec[SpecNodeName.ICON_CSS_CLASS] +=
+ i18n.input.chrome.inputview.Css.DOWN_KEY;
+ spec[SpecNodeName.TYPE] = ElementType.ARROW_DOWN;
+ } else if (direction == i18n.input.chrome.inputview.Direction.LEFT) {
+ spec[SpecNodeName.ID] = 'ArrowLeft';
+ spec[SpecNodeName.ICON_CSS_CLASS] +=
+ i18n.input.chrome.inputview.Css.LEFT_KEY;
+ spec[SpecNodeName.TYPE] = ElementType.ARROW_LEFT;
+ } else if (direction == i18n.input.chrome.inputview.Direction.RIGHT) {
+ spec[SpecNodeName.ID] = 'ArrowRight';
+ spec[SpecNodeName.ICON_CSS_CLASS] +=
+ i18n.input.chrome.inputview.Css.RIGHT_KEY;
+ spec[SpecNodeName.TYPE] = ElementType.ARROW_RIGHT;
+ }
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Creates a soft key.
+ *
+ * @param {!Object} spec The specification.
+ * @return {!Object} The soft key.
+ */
+i18n.input.chrome.inputview.content.util.createKey = function(spec) {
+ var newSpec = {};
+ for (var key in spec) {
+ newSpec[key] = spec[key];
+ }
+ return {
+ 'spec': newSpec
+ };
+};
+
+
+/**
+ * The physical key codes.
+ *
+ * @type {!Array.<string>}
+ */
+i18n.input.chrome.inputview.content.util.KEY_CODES_101 = [
+ 'Backquote',
+ 'Digit1',
+ 'Digit2',
+ 'Digit3',
+ 'Digit4',
+ 'Digit5',
+ 'Digit6',
+ 'Digit7',
+ 'Digit8',
+ 'Digit9',
+ 'Digit0',
+ 'Minus',
+ 'Equal',
+ 'KeyQ',
+ 'KeyW',
+ 'KeyE',
+ 'KeyR',
+ 'KeyT',
+ 'KeyY',
+ 'KeyU',
+ 'KeyI',
+ 'KeyO',
+ 'KeyP',
+ 'BracketLeft',
+ 'BracketRight',
+ 'Backslash',
+ 'KeyA',
+ 'KeyS',
+ 'KeyD',
+ 'KeyF',
+ 'KeyG',
+ 'KeyH',
+ 'KeyJ',
+ 'KeyK',
+ 'KeyL',
+ 'Semicolon',
+ 'Quote',
+ 'KeyZ',
+ 'KeyX',
+ 'KeyC',
+ 'KeyV',
+ 'KeyB',
+ 'KeyN',
+ 'KeyM',
+ 'Comma',
+ 'Period',
+ 'Slash'
+];
+
+
+/**
+ * The physical key codes for 102 keyboard.
+ *
+ * @type {!Array.<string>}
+ */
+i18n.input.chrome.inputview.content.util.KEY_CODES_102 = [
+ 'Backquote',
+ 'Digit1',
+ 'Digit2',
+ 'Digit3',
+ 'Digit4',
+ 'Digit5',
+ 'Digit6',
+ 'Digit7',
+ 'Digit8',
+ 'Digit9',
+ 'Digit0',
+ 'Minus',
+ 'Equal',
+ 'KeyQ',
+ 'KeyW',
+ 'KeyE',
+ 'KeyR',
+ 'KeyT',
+ 'KeyY',
+ 'KeyU',
+ 'KeyI',
+ 'KeyO',
+ 'KeyP',
+ 'BracketLeft',
+ 'BracketRight',
+ 'KeyA',
+ 'KeyS',
+ 'KeyD',
+ 'KeyF',
+ 'KeyG',
+ 'KeyH',
+ 'KeyJ',
+ 'KeyK',
+ 'KeyL',
+ 'Semicolon',
+ 'Quote',
+ 'Backslash',
+ 'IntlBackslash',
+ 'KeyZ',
+ 'KeyX',
+ 'KeyC',
+ 'KeyV',
+ 'KeyB',
+ 'KeyN',
+ 'KeyM',
+ 'Comma',
+ 'Period',
+ 'Slash'
+];
+
+
+/**
+ * Creates the key data.
+ *
+ * @param {!Array.<!Array.<string>>} keyCharacters The key characters.
+ * @param {string} viewIdPrefix The prefix of the view.
+ * @param {boolean} is102 True if it is a 102 keyboard.
+ * @param {boolean} hasAltGrKey True if there is altgr key.
+ * @param {!Array.<!Array.<number>>=} opt_keyCodes The key codes.
+ * @param {string=} opt_compactKeyboardId The compact keyboard id.
+ * @return {!Object} The key data.
+ */
+i18n.input.chrome.inputview.content.util.createData = function(keyCharacters,
+ viewIdPrefix, is102, hasAltGrKey, opt_keyCodes, opt_compactKeyboardId) {
+ var keyList = [];
+ var mapping = {};
+ var keyCodes = opt_keyCodes || [];
+ var keyIds = is102 ? i18n.input.chrome.inputview.content.util.KEY_CODES_102 :
+ i18n.input.chrome.inputview.content.util.KEY_CODES_101;
+ for (var i = 0; i < keyCharacters.length - 1; i++) {
+ var spec = {};
+ spec[SpecNodeName.ID] = keyIds[i];
+ spec[SpecNodeName.TYPE] = ElementType.CHARACTER_KEY;
+ spec[SpecNodeName.CHARACTERS] = keyCharacters[i];
+ spec[SpecNodeName.KEY_CODE] = keyCodes[i];
+ var key = i18n.input.chrome.inputview.content.util.createKey(spec);
+ keyList.push(key);
+ }
+
+ i18n.input.chrome.inputview.content.util.insertModifierKeys_(keyList,
+ is102, opt_compactKeyboardId);
+ for (var i = 0; i < keyList.length; i++) {
+ var key = keyList[i];
+ mapping[key['spec'][SpecNodeName.ID]] = viewIdPrefix + i;
+ }
+ var layout = is102 ? '102kbd' : '101kbd';
+ var result = [];
+ result[SpecNodeName.KEY_LIST] = keyList;
+ result[SpecNodeName.MAPPING] = mapping;
+ result[SpecNodeName.LAYOUT] = layout;
+ result[SpecNodeName.HAS_ALTGR_KEY] = hasAltGrKey;
+ result[SpecNodeName.HAS_COMPACT_KEYBOARD] = !!opt_compactKeyboardId;
+ result[SpecNodeName.SHOW_MENU_KEY] = true;
+ return result;
+};
+
+
+/**
+ * Creates a switcher key which will switch between keyboards.
+ *
+ * @param {string} id The id.
+ * @param {string} name The name.
+ * @param {string|undefined} toKeyset The id of keyset this swicher key should
+ * switch to.
+ * @param {string} toKeysetName The name of the keyset.
+ * @param {string=} opt_iconCssClass The css class for the icon.
+ * @param {boolean=} opt_record True to record and next time the keyset will
+ * be recalled.
+ * @return {!Object} The switcher key.
+ */
+i18n.input.chrome.inputview.content.util.createSwitcherKey = function(
+ id, name, toKeyset, toKeysetName, opt_iconCssClass, opt_record) {
+ var spec = {};
+ spec[SpecNodeName.ID] = id;
+ spec[SpecNodeName.NAME] = name;
+ spec[SpecNodeName.TO_KEYSET] = toKeyset;
+ spec[SpecNodeName.TO_KEYSET_NAME] = toKeysetName;
+ spec[SpecNodeName.ICON_CSS_CLASS] = opt_iconCssClass;
+ spec[SpecNodeName.TYPE] = ElementType.SWITCHER_KEY;
+ spec[SpecNodeName.RECORD] = !!opt_record;
+ return i18n.input.chrome.inputview.content.util.createKey(spec);
+};
+
+
+/**
+ * Inserts modifier keys into the key list.
+ *
+ * @param {!Array.<!Object>} keyList The key list.
+ * @param {boolean} is102 True if it is a 102 keyboard.
+ * @param {string=} opt_compactKeyboardId The compact keyboard id.
+ * @private
+ */
+i18n.input.chrome.inputview.content.util.insertModifierKeys_ = function(
+ keyList, is102, opt_compactKeyboardId) {
+ goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
+ createBackspaceKey(), 13);
+ goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
+ createTabKey(), 14);
+ goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
+ createCapslockKey(), is102 ? 27 : 28);
+ goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
+ createEnterKey(), 40);
+ goog.array.insertAt(keyList, i18n.input.chrome.inputview.content.util.
+ createShiftKey(true), 41);
+ keyList.push(i18n.input.chrome.inputview.content.util.createShiftKey(false));
+ i18n.input.chrome.inputview.content.util.addLastRowKeys(
+ keyList, is102, opt_compactKeyboardId);
+};
+
+
+/**
+ * Inserts modifier keys into the key list.
+ *
+ * @param {!Array.<!Object>} keyList The key list.
+ * @param {boolean} is102 True if it is a 102 keyboard.
+ * @param {string=} opt_compactKeyboardId The compact keyboard id.
+ */
+i18n.input.chrome.inputview.content.util.addLastRowKeys =
+ function(keyList, is102, opt_compactKeyboardId) {
+ keyList.push(i18n.input.chrome.inputview.content.util.createGlobeKey());
+ keyList.push(i18n.input.chrome.inputview.content.util.createMenuKey(
+ opt_compactKeyboardId));
+ keyList.push(i18n.input.chrome.inputview.content.util.createCtrlKey());
+ keyList.push(i18n.input.chrome.inputview.content.util.createAltKey());
+ keyList.push(i18n.input.chrome.inputview.content.util.createSpaceKey());
+ keyList.push(i18n.input.chrome.inputview.content.util.createEnSwitcherKey());
+ keyList.push(i18n.input.chrome.inputview.content.util.createAltgrKey());
+ keyList.push(i18n.input.chrome.inputview.content.util.createArrowKey(
+ i18n.input.chrome.inputview.Direction.LEFT));
+ keyList.push(i18n.input.chrome.inputview.content.util.createArrowKey(
+ i18n.input.chrome.inputview.Direction.RIGHT));
+ keyList.push(i18n.input.chrome.inputview.content.util.
+ createHideKeyboardKey());
+};
+}); // goog.scope

Powered by Google App Engine
This is Rietveld 408576698