Chromium Code Reviews| Index: chrome/browser/resources/chromeos/chromevox/cvox2/background/background.extjs |
| diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.extjs b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.extjs |
| index 207d70732f405a2234804763e1e61a6ed1adc7bb..f16faf9447b879bd0bf08f24bf648d3fdd3f7294 100644 |
| --- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.extjs |
| +++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/background.extjs |
| @@ -49,25 +49,62 @@ var MockTts = function() { |
| }; |
| MockTts.prototype = { |
| - /** Tracks all spoken text. @type {!Array.<string>} */ |
| - utterances: [], |
| + /** |
| + * A list of predicate callbacks. |
| + * @type {!Array.<function(string) : boolean>} |
| + * @private |
| + */ |
| + callbacks_: [], |
| + |
| + /** |
| + * A list of strings stored whenever there are no expectations. |
| + * @type {!Array.<string} |
| + * @private |
| + */ |
| +idleUtterances_: [], |
|
dmazzoni
2014/09/29 06:06:17
nit: indent 2
David Tseng
2014/09/29 17:05:23
Done.
|
| /** @override */ |
| speak: function(textString, queueMode, properties) { |
| - this.utterances.push(textString); |
| + this.process_(textString); |
| }, |
| /** |
| - * Checks to see if a string was spoken. |
| - * @param {string} textString The string to check. |
| - * @return {boolean} True if the string was spoken (possibly as part of a |
| - * larger utterance). |
| + * Adds an expectation for the given string to be spoken. If satisfied, |
| + * |opt_callback| is * called. |
|
dmazzoni
2014/09/29 06:06:18
Nit: delete extra '*'
David Tseng
2014/09/29 17:05:23
Done.
|
| + * @param {string} expected |
| + * @param {function() : void=} opt_callback |
| */ |
| - checkIfSubstringWasSpoken: function(textString) { |
| - return this.utterances.some(function(t) { |
| - return t.indexOf(textString) != -1; |
| + expectSpeech: function(expected, opt_callback) { |
| + this.callbacks_.push(function(actual) { |
| + var match = actual.indexOf(expected) != -1; |
| + if (opt_callback && match) |
| + opt_callback(); |
| + return match; |
| }); |
| - } |
| + |
| + // Process any idleUtterances. |
| + this.idleUtterances_.forEach(this.process_, true); |
| + }, |
| + |
| + /** |
| + * @param {string} textString Utterance to match against callbacks. |
| + * @param {boolean=} opt_manual True if called outside of tts.speak. |
| + * @private |
| + */ |
| + process_: function(textString, opt_manual) { |
| + if (this.callbacks_.length == 0) { |
| + if (!opt_manual) |
| + this.idleUtterances_.push(textString); |
| + return; |
| + } |
| + |
| + var allUtterances = this.idleUtterances_.concat([textString]); |
| + var targetCallback = this.callbacks_.shift(); |
| + if (allUtterances.some(targetCallback)) |
| + this.idleUtterances_.length = 0; |
| + else |
| + this.callbacks_.unshift(targetCallback); |
| + }, |
| }; |
| /** Tests that ChromeVox classic is in this context. */ |
| @@ -100,13 +137,21 @@ TEST_F('BackgroundTest', 'DesktopFocus', function() { |
| chrome.automation.getDesktop(function(root) { |
| var testButton = findStatusTray(root); |
| - testButton.addEventListener(chrome.automation.EventType.focus, |
| - function(e) { |
| - var result = |
| - cvox.ChromeVox.tts.checkIfSubstringWasSpoken('Status tray'); |
| - testDone([result, '']); |
| - }, |
| - true); |
| + cvox.ChromeVox.tts.expectSpeech('Status tray', testDone); |
|
dmazzoni
2014/09/29 06:06:18
This looks much cleaner. I don't mind that the ord
|
| testButton.focus(); |
| }); |
| }); |
| + |
| +/** Tests feedback once a page loads. */ |
| +TEST_F('BackgroundTest', 'InitialFeedback', function() { |
| + this.runWithDocument(function() {/*! |
| + <p>start |
| + <p>end |
| + */}, |
| + function() { |
| + cvox.ChromeVox.tts.expectSpeech('start', function() { |
| + cvox2.global.backgroundObj.onGotCommand('nextLine'); |
| + }); |
| + cvox.ChromeVox.tts.expectSpeech('end', testDone); |
| + }.bind(this)); |
| +}); |