Index: third_party/google_input_tools/src/chrome/os/inputview/elements/content/candidateview.js |
diff --git a/third_party/google_input_tools/src/chrome/os/inputview/elements/content/candidateview.js b/third_party/google_input_tools/src/chrome/os/inputview/elements/content/candidateview.js |
index 28add19f1af3ec4f7ce55ac05445de5036fb415e..84ce75fc9b5a1f5d0b4d93a036ee7786c95588cd 100644 |
--- a/third_party/google_input_tools/src/chrome/os/inputview/elements/content/candidateview.js |
+++ b/third_party/google_input_tools/src/chrome/os/inputview/elements/content/candidateview.js |
@@ -13,6 +13,8 @@ |
// |
goog.provide('i18n.input.chrome.inputview.elements.content.CandidateView'); |
+goog.require('goog.a11y.aria'); |
+goog.require('goog.a11y.aria.State'); |
goog.require('goog.dom.TagName'); |
goog.require('goog.dom.classlist'); |
goog.require('goog.object'); |
@@ -32,7 +34,6 @@ var TagName = goog.dom.TagName; |
var Candidate = i18n.input.chrome.inputview.elements.content.Candidate; |
var Type = i18n.input.chrome.inputview.elements.content.Candidate.Type; |
var ElementType = i18n.input.chrome.inputview.elements.ElementType; |
-var Element = i18n.input.chrome.inputview.elements.Element; |
var content = i18n.input.chrome.inputview.elements.content; |
var Name = i18n.input.chrome.message.Name; |
@@ -42,15 +43,23 @@ var Name = i18n.input.chrome.message.Name; |
* The candidate view. |
* |
* @param {string} id The id. |
+ * @param {!i18n.input.chrome.inputview.Adapter} adapter . |
* @param {goog.events.EventTarget=} opt_eventTarget The event target. |
* @constructor |
* @extends {i18n.input.chrome.inputview.elements.Element} |
*/ |
i18n.input.chrome.inputview.elements.content.CandidateView = function(id, |
- opt_eventTarget) { |
+ adapter, opt_eventTarget) { |
goog.base(this, id, ElementType.CANDIDATE_VIEW, opt_eventTarget); |
/** |
+ * The bus channel to communicate with background. |
+ * |
+ * @private {!i18n.input.chrome.inputview.Adapter} |
+ */ |
+ this.adapter_ = adapter; |
+ |
+ /** |
* The icons. |
* |
* @private {!Array.<!i18n.input.chrome.inputview.elements.Element>} |
@@ -66,6 +75,9 @@ i18n.input.chrome.inputview.elements.content.CandidateView = function(id, |
this.iconButtons_[CandidateView.IconType.EXPAND_CANDIDATES] = new content. |
CandidateButton('', ElementType.EXPAND_CANDIDATES, |
Css.EXPAND_CANDIDATES_ICON, '', this); |
+ this.iconButtons_[CandidateView.IconType.VOICE] = new content. |
+ CandidateButton('', ElementType.VOICE_BTN, Css.VOICE_MIC_BAR, '', this, |
+ true); |
}; |
goog.inherits(i18n.input.chrome.inputview.elements.content.CandidateView, |
i18n.input.chrome.inputview.elements.Element); |
@@ -80,7 +92,8 @@ var CandidateView = i18n.input.chrome.inputview.elements.content.CandidateView; |
CandidateView.IconType = { |
BACK: 0, |
SHRINK_CANDIDATES: 1, |
- EXPAND_CANDIDATES: 2 |
+ EXPAND_CANDIDATES: 2, |
+ VOICE: 3 |
}; |
@@ -153,6 +166,14 @@ CandidateView.HANDWRITING_VIEW_CODE_ = 'hwt'; |
/** |
+ * The emoji keyset code. |
+ * |
+ * @private {string} |
+ */ |
+CandidateView.EMOJI_VIEW_CODE_ = 'emoji'; |
+ |
+ |
+/** |
* The width of the inter container. |
* |
* @private {number} |
@@ -175,6 +196,10 @@ CandidateView.prototype.createDom = function() { |
button.render(elem); |
button.setVisible(false); |
} |
+ goog.a11y.aria.setState(/** @type {!Element} */ |
+ (this.iconButtons_[CandidateView.IconType.VOICE].getElement()), |
+ goog.a11y.aria.State.LABEL, |
+ chrome.i18n.getMessage('VOICE_TURN_ON')); |
}; |
@@ -196,12 +221,12 @@ CandidateView.prototype.showNumberRow = function() { |
goog.dom.classlist.remove(this.getElement(), |
i18n.input.chrome.inputview.Css.THREE_CANDIDATES); |
var dom = this.getDomHelper(); |
- var numberWidth = this.width / this.widthInWeight_ - 1; |
+ var numberWidth = Math.floor((this.width - CandidateView.ICON_WIDTH_) / 10); |
dom.removeChildren(this.interContainer_); |
for (var i = 0; i < 10; i++) { |
var candidateElem = new Candidate(String(i), goog.object.create( |
Name.CANDIDATE, String((i + 1) % 10)), |
- Type.NUMBER, this.height, false, false, numberWidth, this); |
+ Type.NUMBER, this.height, false, numberWidth, this); |
candidateElem.render(this.interContainer_); |
} |
this.showingNumberRow = true; |
@@ -223,12 +248,12 @@ CandidateView.prototype.showCandidates = function(candidates, |
if (candidates.length > 0) { |
if (showThreeCandidates) { |
this.addThreeCandidates_(candidates); |
+ // Hide the voice icons. |
+ this.switchToIcon(CandidateView.IconType.VOICE, false); |
} else { |
this.addFullCandidates_(candidates); |
- if (opt_expandable) { |
- this.switchToIcon(CandidateView.IconType.EXPAND_CANDIDATES, |
- this.candidateCount < candidates.length); |
- } |
+ this.switchToIcon(CandidateView.IconType.EXPAND_CANDIDATES, |
+ !!opt_expandable && this.candidateCount < candidates.length); |
} |
this.showingCandidates = true; |
this.showingNumberRow = false; |
@@ -249,7 +274,7 @@ CandidateView.prototype.addThreeCandidates_ = function(candidates) { |
var dom = this.getDomHelper(); |
for (var i = 0; i < num; i++) { |
var candidateElem = new Candidate(String(i), candidates[i], Type.CANDIDATE, |
- this.height, i == 1 || num == 1, true, CandidateView. |
+ this.height, i == 1 || num == 1, CandidateView. |
WIDTH_FOR_THREE_CANDIDATES_, this); |
candidateElem.render(this.interContainer_); |
} |
@@ -284,7 +309,7 @@ CandidateView.prototype.addFullCandidates_ = function(candidates) { |
var i; |
for (i = 0; i < candidates.length; i++) { |
var candidateElem = new Candidate(String(i), candidates[i], Type.CANDIDATE, |
- this.height, false, false, undefined, this); |
+ this.height, false, undefined, this); |
candidateElem.render(this.interContainer_); |
var size = goog.style.getSize(candidateElem.getElement()); |
var candidateWidth = size.width + CandidateView.PADDING_ * 2; |
@@ -292,10 +317,16 @@ CandidateView.prototype.addFullCandidates_ = function(candidates) { |
w += candidateWidth + 1; |
if (w >= totalWidth) { |
- this.interContainer_.removeChild(candidateElem.getElement()); |
+ if (i == 0) { |
+ // Make sure have one at least. |
+ candidateElem.setSize(totalWidth); |
+ ++i; |
+ } else { |
+ this.interContainer_.removeChild(candidateElem.getElement()); |
+ } |
break; |
} |
- goog.style.setWidth(candidateElem.getElement(), candidateWidth); |
+ candidateElem.setSize(candidateWidth); |
} |
this.candidateCount = i; |
}; |
@@ -321,6 +352,20 @@ CandidateView.prototype.resize = function(width, height) { |
button.resize(CandidateView.ICON_WIDTH_, height); |
} |
+ |
+ // Resets the candidates elements visibility. |
+ if (this.candidateCount > 0) { |
+ var totalWidth = Math.floor(width - CandidateView.ICON_WIDTH_); |
+ var w = 0; |
+ for (i = 0; i < this.candidateCount; i++) { |
+ if (w <= totalWidth) { |
+ w += goog.style.getSize(this.interContainer_.children[i]).width; |
+ } |
+ goog.style.setElementShown(this.interContainer_.children[i], |
+ w <= totalWidth); |
+ } |
+ } |
+ |
goog.base(this, 'resize', width, height); |
if (this.showingNumberRow) { |
@@ -337,10 +382,18 @@ CandidateView.prototype.resize = function(width, height) { |
*/ |
CandidateView.prototype.switchToIcon = function(type, visible) { |
for (var i = 0; i < this.iconButtons_.length; i++) { |
- this.iconButtons_[i].setVisible(false); |
+ // Don't enable voice when focus in password box. |
+ this.iconButtons_[i].setVisible(visible && type == i && |
+ (type != CandidateView.IconType.VOICE || !this.candidateCount && |
+ this.adapter_.contextType != 'password')); |
} |
- this.iconButtons_[type].setVisible(visible); |
+ // We need make default voice icon showed if the position doesn't show other |
+ // icon. |
+ if (!visible && this.adapter_.isExperimental && |
+ this.adapter_.contextType != 'password') { |
+ this.iconButtons_[CandidateView.IconType.VOICE].setVisible(true); |
+ } |
}; |
@@ -353,8 +406,14 @@ CandidateView.prototype.switchToIcon = function(type, visible) { |
*/ |
CandidateView.prototype.updateByKeyset = function( |
keyset, isPasswordBox, isRTL) { |
- this.switchToIcon(CandidateView.IconType.BACK, |
- keyset == CandidateView.HANDWRITING_VIEW_CODE_); |
+ if (keyset == CandidateView.HANDWRITING_VIEW_CODE_) { |
+ this.switchToIcon(CandidateView.IconType.BACK, true); |
+ } else if (keyset != CandidateView.EMOJI_VIEW_CODE_ && !this.candidateCount && |
+ this.adapter_.isExperimental) { |
+ // If candidates count is greater than 0, don't show voice icon. |
+ this.switchToIcon(CandidateView.IconType.VOICE, true); |
+ } |
+ |
if (isPasswordBox && keyset.indexOf('compact') != -1) { |
this.showNumberRow(); |
} else { |