Reland #3: Ensure WebView notifies desktop automation on creation, destruction, and...
[chromium-blink-merge.git] / chrome / browser / resources / chromeos / chromevox / testing / mock_tts.js
blobfb34e1abe0dbae02d7069262a8d4714c197d4bdb
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 /**
6  * Mock tts class.
7  * @constructor
8  * @extends {cvox.TtsInterface}
9  */
10 var MockTts = function() {
11   /**
12    * The event handler for the most recent call to |speak|.
13    * @private
14    */
15   this.onEvent_;
18 MockTts.prototype = {
19   /**
20    * A list of predicate, start, and end callbacks for a pending expectation.
21    * @type {!Array.<{{predicate: function(string) : boolean,
22    *     startCallback: function() : void,
23    *     endCallback: function() : void}>}
24    * @private
25    */
26   expectations_: [],
28   /**
29    * A list of strings stored whenever there are no expectations.
30    * @type {!Array.<string}
31    * @private
32    */
33   idleUtterances_: [],
35   /** @override */
36   speak: function(textString, queueMode, properties) {
37     if (properties)
38       this.onEvent_ = properties['onEvent'];
40     this.process_(textString);
41   },
43   /**
44    * Adds an expectation for the given string to be spoken. If satisfied,
45    * |opt_callback| is called.
46    * @param {string} expectedText
47    * @param {function() : void=} opt_callback
48    * @param {boolean=} opt_exact Expect an exact match; defaults to false.
49    */
50   expectSpeech: function(expectedText, opt_callback, opt_exact) {
51     var expectation = {};
52     expectation.endCallback = opt_callback;
53     this.addExpectation_(expectedText, expectation, opt_exact);
54   },
56   /**
57    * Adds an expectation for the given string to be spoken after |opt_callback|
58    * executes.
59    * @param {string} expectedText
60    * @param {function() : void=} opt_callback
61    * @param {boolean=} opt_exact Expect an exact match; defaults to false.
62    */
63   expectSpeechAfter: function(expectedText, opt_callback, opt_exact) {
64     var expectation = {};
65     if (this.expectations_.length == 0 && opt_callback)
66       opt_callback();
67     else
68       expectation.startCallback = opt_callback;
69     this.addExpectation_(expectedText, expectation, opt_exact);
70   },
72   /**
73    * Finishes expectations and calls testDone.
74    */
75   finishExpectations: function() {
76     this.expectSpeechAfter('', testDone);
77   },
79   /**
80    * Fakes an event to |onEvent|.
81    */
82   sendStartEvent: function() {
83     if (this.onEvent_)
84       this.onEvent_({type: 'start'});
85   },
87   /**
88    * Fakes an event to |onEvent|.
89    */
90   sendEndEvent: function() {
91     if (this.onEvent_)
92       this.onEvent_({type: 'end'});
93   },
95   /**
96    * @private
97    * @param {string} expectedText Text expected spoken.
98    * @param {{startCallback: function() : void,
99    *     endCallback: function() : void}=} opt_expectation
100    * @param {boolean=} opt_exact Expects an exact match.
101    */
102   addExpectation_: function(expectedText, opt_expectation, opt_exact) {
103     var expectation = opt_expectation ? opt_expectation : {};
105     expectation.predicate = function(actualText) {
106       if (opt_exact)
107         return actualText === expectedText;
108       return actualText.indexOf(expectedText) != -1;
109     };
111     this.expectations_.push(expectation);
113     // Process any idleUtterances.
114     this.idleUtterances_.forEach(function(utterance) {
115       this.process_(utterance, true);
116     }.bind(this));
117   },
119   /**
120    * @param {string} textString Utterance to match against callbacks.
121    * @param {boolean=} opt_manual True if called outside of tts.speak.
122    * @private
123    */
124   process_: function(textString, opt_manual) {
125     if (this.expectations_.length == 0) {
126       if (!opt_manual)
127         this.idleUtterances_.push(textString);
128       return;
129     }
131     var allUtterances = this.idleUtterances_.concat([textString]);
132     var targetExpectation = this.expectations_.shift();
133     if (allUtterances.some(targetExpectation.predicate)) {
134       this.idleUtterances_.length = 0;
135       if (targetExpectation.endCallback)
136         targetExpectation.endCallback();
137       var nextExpectation = this.expectations_[0];
138       if (nextExpectation && nextExpectation.startCallback)
139         nextExpectation.startCallback();
140     } else {
141       this.expectations_.unshift(targetExpectation);
142     }
143   },