| Index: chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
|
| diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
|
| index eb359827c0a210eeab23b3d2cef64cbbde8169c1..f093bac9b3d85bb9477f08b080c0724f9dd53f9d 100644
|
| --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
|
| +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/output.js
|
| @@ -40,15 +40,9 @@ var Dir = AutomationUtil.Dir;
|
| * = suffix: used to specify substitution only if not previously appended.
|
| * For example, $name= would insert the name attribute only if no name
|
| * attribute had been inserted previously.
|
| - * @param {!cursors.Range} range
|
| - * @param {cursors.Range} prevRange
|
| - * @param {chrome.automation.EventType|Output.EventType} type
|
| - * @param {{braille: (boolean|undefined), speech: (boolean|undefined)}=}
|
| - * opt_options
|
| * @constructor
|
| */
|
| -Output = function(range, prevRange, type, opt_options) {
|
| - opt_options = opt_options || {braille: true, speech: true};
|
| +Output = function() {
|
| // TODO(dtseng): Include braille specific rules.
|
| /** @type {!cvox.Spannable} */
|
| this.buffer_ = new cvox.Spannable();
|
| @@ -56,19 +50,18 @@ Output = function(range, prevRange, type, opt_options) {
|
| this.brailleBuffer_ = new cvox.Spannable();
|
| /** @type {!Array.<Object>} */
|
| this.locations_ = [];
|
| + /** @type {function()} */
|
| + this.speechStartCallback_ = function() {};
|
| + /** @type {function()} */
|
| + this.speechEndCallback_ = function() {};
|
| + /** @type {function()} */
|
| + this.speechInterruptedCallback_ = function() {};
|
|
|
| /**
|
| * Current global options.
|
| * @type {{speech: boolean, braille: boolean, location: boolean}}
|
| */
|
| this.formatOptions_ = {speech: true, braille: false, location: true};
|
| -
|
| - this.render_(range, prevRange, type);
|
| - if (opt_options.speech)
|
| - this.handleSpeech();
|
| - if (opt_options.braille)
|
| - this.handleBraille();
|
| - this.handleDisplay();
|
| };
|
|
|
| /**
|
| @@ -240,26 +233,99 @@ Output.prototype = {
|
| },
|
|
|
| /**
|
| - * Handle output to speech.
|
| + * Specify ranges for speech.
|
| + * @param {!cursors.Range} range
|
| + * @param {cursors.Range} prevRange
|
| + * @param {chrome.automation.EventType|Output.EventType} type
|
| + * @return {!Output}
|
| + */
|
| + withSpeech: function(range, prevRange, type) {
|
| + this.formatOptions_ = {speech: true, braille: false, location: true};
|
| + this.render_(range, prevRange, type, this.buffer_);
|
| + return this;
|
| + },
|
| +
|
| + /**
|
| + * Specify ranges for braille.
|
| + * @param {!cursors.Range} range
|
| + * @param {cursors.Range} prevRange
|
| + * @param {chrome.automation.EventType|Output.EventType} type
|
| + * @return {!Output}
|
| + */
|
| + withBraille: function(range, prevRange, type) {
|
| + this.formatOptions_ = {speech: false, braille: true, location: false};
|
| + this.render_(range, prevRange, type, this.brailleBuffer_);
|
| + return this;
|
| + },
|
| +
|
| + /**
|
| + * Specify the same ranges for speech and braille.
|
| + * @param {!cursors.Range} range
|
| + * @param {cursors.Range} prevRange
|
| + * @param {chrome.automation.EventType|Output.EventType} type
|
| + * @return {!Output}
|
| + */
|
| + withSpeechAndBraille: function(range, prevRange, type) {
|
| + this.withSpeech(range, prevRange, type);
|
| + this.withBraille(range, prevRange, type);
|
| + return this;
|
| + },
|
| +
|
| + /**
|
| + * Triggers callback for a speech event.
|
| + * @param {function()} callback
|
| + */
|
| + onSpeechStart: function(callback) {
|
| + this.speechStartCallback_ = callback;
|
| + return this;
|
| + },
|
| +
|
| + /**
|
| + * Triggers callback for a speech event.
|
| + * @param {function()} callback
|
| */
|
| - handleSpeech: function() {
|
| + onSpeechEnd: function(callback) {
|
| + this.speechEndCallback_ = callback;
|
| + return this;
|
| + },
|
| +
|
| + /**
|
| + * Triggers callback for a speech event.
|
| + * @param {function()} callback
|
| + */
|
| + onSpeechInterrupted: function(callback) {
|
| + this.speechInterruptedCallback_ = callback;
|
| + return this;
|
| + },
|
| +
|
| + /**
|
| + * Executes all specified output.
|
| + */
|
| + go: function() {
|
| + // Speech.
|
| var buff = this.buffer_;
|
| - if (!buff.toString())
|
| - return;
|
|
|
| - cvox.ChromeVox.tts.speak(buff.toString(), cvox.QueueMode.FLUSH);
|
| + var onEvent = function(evt) {
|
| + switch (evt.type) {
|
| + case 'start': this.speechStartCallback_(); break;
|
| + case 'end': this.speechEndCallback_(); break;
|
| + case 'interrupted': this.speechInterruptedCallback_(); break;
|
| + }
|
| + }.bind(this);
|
| +
|
| + if (buff.toString()) {
|
| + cvox.ChromeVox.tts.speak(
|
| + buff.toString(), cvox.QueueMode.FLUSH, {onEvent: onEvent});
|
| + }
|
| +
|
| var actions = buff.getSpansInstanceOf(Output.Action);
|
| if (actions) {
|
| actions.forEach(function(a) {
|
| a.run();
|
| });
|
| }
|
| - },
|
|
|
| - /**
|
| - * Handles output to braille.
|
| - */
|
| - handleBraille: function() {
|
| + // Braille.
|
| var selSpan =
|
| this.brailleBuffer_.getSpanInstanceOf(Output.SelectionSpan);
|
| var startIndex = -1, endIndex = -1;
|
| @@ -285,13 +351,10 @@ Output.prototype = {
|
| endIndex: endIndex
|
| });
|
|
|
| - cvox.ChromeVox.braille.write(output);
|
| - },
|
| + if (this.brailleBuffer_)
|
| + cvox.ChromeVox.braille.write(output);
|
|
|
| - /**
|
| - * Handles output to visual display.
|
| - */
|
| - handleDisplay: function() {
|
| + // Display.
|
| chrome.accessibilityPrivate.setFocusRing(this.locations_);
|
| },
|
|
|
| @@ -301,25 +364,14 @@ Output.prototype = {
|
| * @param {!cursors.Range} range
|
| * @param {cursors.Range} prevRange
|
| * @param {chrome.automation.EventType|string} type
|
| + * @param {!cvox.Spannable} buff Buffer to receive rendered output.
|
| * @private
|
| */
|
| - render_: function(range, prevRange, type) {
|
| - var buff = new cvox.Spannable();
|
| - var brailleBuff = new cvox.Spannable();
|
| + render_: function(range, prevRange, type, buff) {
|
| if (range.isSubNode())
|
| this.subNode_(range, prevRange, type, buff);
|
| else
|
| this.range_(range, prevRange, type, buff);
|
| -
|
| - this.formatOptions_.braille = true;
|
| - this.formatOptions_.location = false;
|
| - if (range.isSubNode())
|
| - this.subNode_(range, prevRange, type, brailleBuff);
|
| - else
|
| - this.range_(range, prevRange, type, brailleBuff);
|
| -
|
| - this.buffer_ = buff;
|
| - this.brailleBuffer_ = brailleBuff;
|
| },
|
|
|
| /**
|
|
|