OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 | 5 |
6 /** | 6 /** |
7 * @fileoverview Provides different rules for each type of result. | 7 * @fileoverview Provides different rules for each type of result. |
8 */ | 8 */ |
9 | 9 |
10 goog.provide('cvox.SearchResults'); | 10 goog.provide('cvox.SearchResults'); |
11 goog.provide('cvox.UnknownResult'); | 11 goog.provide('cvox.UnknownResult'); |
12 | 12 |
13 goog.require('cvox.AbstractResult'); | 13 goog.require('cvox.AbstractResult'); |
14 goog.require('cvox.ChromeVox'); | 14 goog.require('cvox.ChromeVox'); |
15 goog.require('cvox.SearchUtil'); | 15 goog.require('cvox.SearchUtil'); |
16 | 16 |
17 /** | 17 /** |
18 * @constructor | 18 * @constructor |
19 */ | 19 */ |
20 cvox.SearchResults = function() { | 20 cvox.SearchResults = function() {}; |
21 }; | |
22 | 21 |
23 /** | 22 /** |
24 * Speaks a result based on given selectors. | 23 * Speaks a result based on given selectors. |
25 * @param {Node} result Search result to be spoken. | 24 * @param {Node} result Search result to be spoken. |
26 * @param {Array} selectTexts Array of selectors or text to speak. | 25 * @param {Array} selectTexts Array of selectors or text to speak. |
27 */ | 26 */ |
28 cvox.SearchResults.speakResultBySelectTexts = function(result, selectTexts) { | 27 cvox.SearchResults.speakResultBySelectTexts = function(result, selectTexts) { |
29 for (var j = 0; j < selectTexts.length; j++) { | 28 for (var j = 0; j < selectTexts.length; j++) { |
30 var selectText = selectTexts[j]; | 29 var selectText = selectTexts[j]; |
31 if (selectText.select) { | 30 if (selectText.select) { |
32 var elems = result.querySelectorAll(selectText.select); | 31 var elems = result.querySelectorAll(selectText.select); |
33 for (var i = 0; i < elems.length; i++) { | 32 for (var i = 0; i < elems.length; i++) { |
34 cvox.ChromeVox.tts.speak(cvox.DomUtil.getName(elems.item(i)), | 33 cvox.ChromeVox.tts.speak( |
35 cvox.QueueMode.QUEUE); | 34 cvox.DomUtil.getName(elems.item(i)), cvox.QueueMode.QUEUE); |
36 } | 35 } |
37 } | 36 } |
38 if (selectText.text) { | 37 if (selectText.text) { |
39 cvox.ChromeVox.tts.speak(selectText.text, cvox.QueueMode.QUEUE); | 38 cvox.ChromeVox.tts.speak(selectText.text, cvox.QueueMode.QUEUE); |
40 } | 39 } |
41 } | 40 } |
42 }; | 41 }; |
43 | 42 |
44 /** | 43 /** |
45 * Unknown Result Type. This is used if we don't know what to do. | 44 * Unknown Result Type. This is used if we don't know what to do. |
46 * @constructor | 45 * @constructor |
47 * @extends {cvox.AbstractResult} | 46 * @extends {cvox.AbstractResult} |
48 */ | 47 */ |
49 cvox.UnknownResult = function() { | 48 cvox.UnknownResult = function() {}; |
50 }; | |
51 goog.inherits(cvox.UnknownResult, cvox.AbstractResult); | 49 goog.inherits(cvox.UnknownResult, cvox.AbstractResult); |
52 | 50 |
53 /* Normal Result Type. */ | 51 /* Normal Result Type. */ |
54 /** | 52 /** |
55 * @constructor | 53 * @constructor |
56 * @extends {cvox.AbstractResult} | 54 * @extends {cvox.AbstractResult} |
57 */ | 55 */ |
58 cvox.NormalResult = function() { | 56 cvox.NormalResult = function() {}; |
59 }; | |
60 goog.inherits(cvox.NormalResult, cvox.AbstractResult); | 57 goog.inherits(cvox.NormalResult, cvox.AbstractResult); |
61 | 58 |
62 /** | 59 /** |
63 * Checks the result if it is a normal result. | 60 * Checks the result if it is a normal result. |
64 * @override | 61 * @override |
65 */ | 62 */ |
66 cvox.NormalResult.prototype.isType = function(result) { | 63 cvox.NormalResult.prototype.isType = function(result) { |
67 var NORMAL_SELECT = '.rc'; | 64 var NORMAL_SELECT = '.rc'; |
68 return result.querySelector(NORMAL_SELECT) !== null; | 65 return result.querySelector(NORMAL_SELECT) !== null; |
69 }; | 66 }; |
70 | 67 |
71 /** | 68 /** |
72 * Speak a normal search result. | 69 * Speak a normal search result. |
73 * @override | 70 * @override |
74 */ | 71 */ |
75 cvox.NormalResult.prototype.speak = function(result) { | 72 cvox.NormalResult.prototype.speak = function(result) { |
76 if (!result) { | 73 if (!result) { |
77 return false; | 74 return false; |
78 } | 75 } |
79 var NORMAL_TITLE_SELECT = '.rc .r'; | 76 var NORMAL_TITLE_SELECT = '.rc .r'; |
80 var NORMAL_URL_SELECT = '.kv'; | 77 var NORMAL_URL_SELECT = '.kv'; |
81 var NORMAL_DESC_SELECT = '.rc .st'; | 78 var NORMAL_DESC_SELECT = '.rc .st'; |
82 var SITE_LINK_SELECT = '.osl'; | 79 var SITE_LINK_SELECT = '.osl'; |
83 var MORE_RESULTS_SELECT = '.sld'; | 80 var MORE_RESULTS_SELECT = '.sld'; |
84 var MORE_RESULTS_LINK_SELECT = '.mrf'; | 81 var MORE_RESULTS_LINK_SELECT = '.mrf'; |
85 | 82 |
86 var NORMAL_SELECTORS = [ | 83 var NORMAL_SELECTORS = [ |
87 { select: NORMAL_TITLE_SELECT }, | 84 {select: NORMAL_TITLE_SELECT}, {select: NORMAL_DESC_SELECT}, |
88 { select: NORMAL_DESC_SELECT }, | 85 {select: NORMAL_URL_SELECT}, {select: SITE_LINK_SELECT}, |
89 { select: NORMAL_URL_SELECT }, | 86 {select: MORE_RESULTS_SELECT}, {select: MORE_RESULTS_LINK_SELECT} |
90 { select: SITE_LINK_SELECT }, | 87 ]; |
91 { select: MORE_RESULTS_SELECT }, | |
92 { select: MORE_RESULTS_LINK_SELECT }]; | |
93 cvox.SearchResults.speakResultBySelectTexts(result, NORMAL_SELECTORS); | 88 cvox.SearchResults.speakResultBySelectTexts(result, NORMAL_SELECTORS); |
94 | 89 |
95 var DISCUSS_TITLE_SELECT = '.mas-1st-col div'; | 90 var DISCUSS_TITLE_SELECT = '.mas-1st-col div'; |
96 var DISCUSS_DATE_SELECT = '.mas-col div'; | 91 var DISCUSS_DATE_SELECT = '.mas-col div'; |
97 var discussTitles = result.querySelectorAll(DISCUSS_TITLE_SELECT); | 92 var discussTitles = result.querySelectorAll(DISCUSS_TITLE_SELECT); |
98 var discussDates = result.querySelectorAll(DISCUSS_DATE_SELECT); | 93 var discussDates = result.querySelectorAll(DISCUSS_DATE_SELECT); |
99 for (var i = 0; i < discussTitles.length; i++) { | 94 for (var i = 0; i < discussTitles.length; i++) { |
100 cvox.ChromeVox.tts.speak( | 95 cvox.ChromeVox.tts.speak( |
101 cvox.DomUtil.getName(discussTitles.item(i)), cvox.QueueMode.QUEUE); | 96 cvox.DomUtil.getName(discussTitles.item(i)), cvox.QueueMode.QUEUE); |
102 cvox.ChromeVox.tts.speak( | 97 cvox.ChromeVox.tts.speak( |
103 cvox.DomUtil.getName(discussDates.item(i)), cvox.QueueMode.QUEUE); | 98 cvox.DomUtil.getName(discussDates.item(i)), cvox.QueueMode.QUEUE); |
104 } | 99 } |
105 return true; | 100 return true; |
106 }; | 101 }; |
107 | 102 |
108 /* Weather Result */ | 103 /* Weather Result */ |
109 /** | 104 /** |
110 * @constructor | 105 * @constructor |
111 * @extends {cvox.AbstractResult} | 106 * @extends {cvox.AbstractResult} |
112 */ | 107 */ |
113 cvox.WeatherResult = function() { | 108 cvox.WeatherResult = function() {}; |
114 }; | |
115 goog.inherits(cvox.WeatherResult, cvox.AbstractResult); | 109 goog.inherits(cvox.WeatherResult, cvox.AbstractResult); |
116 | 110 |
117 /** | 111 /** |
118 * Checks the result if it is a weather result. | 112 * Checks the result if it is a weather result. |
119 * @override | 113 * @override |
120 */ | 114 */ |
121 cvox.WeatherResult.prototype.isType = function(result) { | 115 cvox.WeatherResult.prototype.isType = function(result) { |
122 var WEATHER_SELECT = '#wob_wc'; | 116 var WEATHER_SELECT = '#wob_wc'; |
123 return result.querySelector(WEATHER_SELECT) !== null; | 117 return result.querySelector(WEATHER_SELECT) !== null; |
124 }; | 118 }; |
125 | 119 |
126 /** | 120 /** |
127 * Speak a weather forecast. | 121 * Speak a weather forecast. |
128 * @param {Element} forecast Weather forecast to be spoken. | 122 * @param {Element} forecast Weather forecast to be spoken. |
129 */ | 123 */ |
130 cvox.WeatherResult.speakForecast = function(forecast) { | 124 cvox.WeatherResult.speakForecast = function(forecast) { |
131 if (!forecast) { | 125 if (!forecast) { |
132 return; | 126 return; |
133 } | 127 } |
134 var FORE_DAY_SELECT = '.vk_lgy'; | 128 var FORE_DAY_SELECT = '.vk_lgy'; |
135 var FORE_COND_SELECT = 'img'; | 129 var FORE_COND_SELECT = 'img'; |
136 var FORE_HIGH_SELECT = '.vk_gy'; | 130 var FORE_HIGH_SELECT = '.vk_gy'; |
137 var FORE_LOW_SELECT = '.vk_lgy'; | 131 var FORE_LOW_SELECT = '.vk_lgy'; |
138 | 132 |
139 var FORE_SELECTORS = [ | 133 var FORE_SELECTORS = [ |
140 { select: FORE_DAY_SELECT }, | 134 {select: FORE_DAY_SELECT}, {select: FORE_COND_SELECT}, |
141 { select: FORE_COND_SELECT }, | 135 {select: FORE_HIGH_SELECT}, {select: FORE_LOW_SELECT} |
142 { select: FORE_HIGH_SELECT }, | |
143 { select: FORE_LOW_SELECT } | |
144 ]; | 136 ]; |
145 cvox.SearchResults.speakResultBySelectTexts(forecast, FORE_SELECTORS); | 137 cvox.SearchResults.speakResultBySelectTexts(forecast, FORE_SELECTORS); |
146 }; | 138 }; |
147 | 139 |
148 /** | 140 /** |
149 * Speak a weather search result. | 141 * Speak a weather search result. |
150 * @override | 142 * @override |
151 */ | 143 */ |
152 cvox.WeatherResult.prototype.speak = function(result) { | 144 cvox.WeatherResult.prototype.speak = function(result) { |
153 if (!result) { | 145 if (!result) { |
154 return false; | 146 return false; |
155 } | 147 } |
156 /* TODO(peterxiao): Internationalization? */ | 148 /* TODO(peterxiao): Internationalization? */ |
157 var WEATHER_INTRO = 'The weather forcast for'; | 149 var WEATHER_INTRO = 'The weather forcast for'; |
158 var WEATHER_TEMP_UNITS = 'degrees fahrenheit'; | 150 var WEATHER_TEMP_UNITS = 'degrees fahrenheit'; |
159 var WEATHER_PREC_INTRO = 'precipitation is'; | 151 var WEATHER_PREC_INTRO = 'precipitation is'; |
160 var WEATHER_HUMID_INTRO = 'humidity is'; | 152 var WEATHER_HUMID_INTRO = 'humidity is'; |
161 var WEATHER_WIND_INTRO = 'wind is'; | 153 var WEATHER_WIND_INTRO = 'wind is'; |
162 var FORE_INTRO = 'Forecasts for this week'; | 154 var FORE_INTRO = 'Forecasts for this week'; |
163 var WEATHER_LOC_SELECT = '.vk_h'; | 155 var WEATHER_LOC_SELECT = '.vk_h'; |
164 var WEATHER_WHEN_SELECT = '#wob_dts'; | 156 var WEATHER_WHEN_SELECT = '#wob_dts'; |
165 var WEATHER_COND_SELECT = '#wob_dc'; | 157 var WEATHER_COND_SELECT = '#wob_dc'; |
166 var WEATHER_TEMP_SELECT = '#wob_tm'; | 158 var WEATHER_TEMP_SELECT = '#wob_tm'; |
167 var WEATHER_PREC_SELECT = '#wob_pp'; | 159 var WEATHER_PREC_SELECT = '#wob_pp'; |
168 var WEATHER_HUMID_SELECT = '#wob_hm'; | 160 var WEATHER_HUMID_SELECT = '#wob_hm'; |
169 var WEATHER_WIND_SELECT = '#wob_ws'; | 161 var WEATHER_WIND_SELECT = '#wob_ws'; |
170 | 162 |
171 var WEATHER_SELECT_TEXTS = [ | 163 var WEATHER_SELECT_TEXTS = [ |
172 { text: WEATHER_INTRO }, | 164 {text: WEATHER_INTRO}, {select: WEATHER_LOC_SELECT}, |
173 { select: WEATHER_LOC_SELECT }, | 165 {select: WEATHER_WHEN_SELECT}, {select: WEATHER_COND_SELECT}, |
174 { select: WEATHER_WHEN_SELECT }, | 166 {select: WEATHER_TEMP_SELECT}, {text: WEATHER_TEMP_UNITS}, |
175 { select: WEATHER_COND_SELECT }, | 167 {text: WEATHER_PREC_INTRO}, {select: WEATHER_PREC_SELECT}, |
176 { select: WEATHER_TEMP_SELECT }, | 168 {text: WEATHER_HUMID_INTRO}, {select: WEATHER_HUMID_SELECT}, |
177 { text: WEATHER_TEMP_UNITS }, | 169 {text: WEATHER_WIND_INTRO}, {select: WEATHER_WIND_SELECT} |
178 { text: WEATHER_PREC_INTRO }, | |
179 { select: WEATHER_PREC_SELECT }, | |
180 { text: WEATHER_HUMID_INTRO }, | |
181 { select: WEATHER_HUMID_SELECT }, | |
182 { text: WEATHER_WIND_INTRO }, | |
183 { select: WEATHER_WIND_SELECT } | |
184 ]; | 170 ]; |
185 cvox.SearchResults.speakResultBySelectTexts(result, WEATHER_SELECT_TEXTS); | 171 cvox.SearchResults.speakResultBySelectTexts(result, WEATHER_SELECT_TEXTS); |
186 | 172 |
187 var WEATHER_FORCAST_CLASS = 'wob_df'; | 173 var WEATHER_FORCAST_CLASS = 'wob_df'; |
188 var forecasts = result.getElementsByClassName(WEATHER_FORCAST_CLASS); | 174 var forecasts = result.getElementsByClassName(WEATHER_FORCAST_CLASS); |
189 cvox.ChromeVox.tts.speak(FORE_INTRO, cvox.QueueMode.QUEUE); | 175 cvox.ChromeVox.tts.speak(FORE_INTRO, cvox.QueueMode.QUEUE); |
190 for (var i = 0; i < forecasts.length; i++) { | 176 for (var i = 0; i < forecasts.length; i++) { |
191 var forecast = forecasts.item(i); | 177 var forecast = forecasts.item(i); |
192 cvox.WeatherResult.speakForecast(forecast); | 178 cvox.WeatherResult.speakForecast(forecast); |
193 } | 179 } |
194 return true; | 180 return true; |
195 }; | 181 }; |
196 | 182 |
197 /* Knowledge Panel Result */ | 183 /* Knowledge Panel Result */ |
198 /** | 184 /** |
199 * @constructor | 185 * @constructor |
200 * @extends {cvox.AbstractResult} | 186 * @extends {cvox.AbstractResult} |
201 */ | 187 */ |
202 cvox.KnowResult = function() { | 188 cvox.KnowResult = function() {}; |
203 }; | |
204 goog.inherits(cvox.KnowResult, cvox.AbstractResult); | 189 goog.inherits(cvox.KnowResult, cvox.AbstractResult); |
205 | 190 |
206 /** | 191 /** |
207 * Checks the result if it is a know result. | 192 * Checks the result if it is a know result. |
208 * @override | 193 * @override |
209 */ | 194 */ |
210 cvox.KnowResult.prototype.isType = function(result) { | 195 cvox.KnowResult.prototype.isType = function(result) { |
211 var KNOP_SELECT = '.kno-ec'; | 196 var KNOP_SELECT = '.kno-ec'; |
212 return result.querySelector(KNOP_SELECT) !== null; | 197 return result.querySelector(KNOP_SELECT) !== null; |
213 }; | 198 }; |
214 | 199 |
215 /** | 200 /** |
216 * Speak a knowledge panel search result. | 201 * Speak a knowledge panel search result. |
217 * @override | 202 * @override |
218 */ | 203 */ |
219 cvox.KnowResult.prototype.speak = function(result) { | 204 cvox.KnowResult.prototype.speak = function(result) { |
220 | 205 |
221 cvox.ChromeVox.tts.speak( | 206 cvox.ChromeVox.tts.speak(cvox.DomUtil.getName(result), cvox.QueueMode.QUEUE); |
222 cvox.DomUtil.getName(result), cvox.QueueMode.QUEUE); | |
223 return true; | 207 return true; |
224 }; | 208 }; |
225 | 209 |
226 /** | 210 /** |
227 * Extracts the wikipedia URL from knowledge panel. | 211 * Extracts the wikipedia URL from knowledge panel. |
228 * @override | 212 * @override |
229 */ | 213 */ |
230 cvox.KnowResult.prototype.getURL = function(result) { | 214 cvox.KnowResult.prototype.getURL = function(result) { |
231 var LINK_SELECTOR = '.q'; | 215 var LINK_SELECTOR = '.q'; |
232 return cvox.SearchUtil.extractURL(result.querySelector(LINK_SELECTOR)); | 216 return cvox.SearchUtil.extractURL(result.querySelector(LINK_SELECTOR)); |
233 }; | 217 }; |
234 | 218 |
235 /** | 219 /** |
236 * @override | 220 * @override |
237 */ | 221 */ |
238 cvox.KnowResult.prototype.getSyncNode = function(result) { | 222 cvox.KnowResult.prototype.getSyncNode = function(result) { |
239 var HEADER_SELECTOR = '.kno-ecr-pt'; | 223 var HEADER_SELECTOR = '.kno-ecr-pt'; |
240 return result.querySelector(HEADER_SELECTOR); | 224 return result.querySelector(HEADER_SELECTOR); |
241 }; | 225 }; |
242 | 226 |
243 /* Calculator Type */ | 227 /* Calculator Type */ |
244 /** | 228 /** |
245 * @constructor | 229 * @constructor |
246 * @extends {cvox.AbstractResult} | 230 * @extends {cvox.AbstractResult} |
247 */ | 231 */ |
248 cvox.CalcResult = function() { | 232 cvox.CalcResult = function() {}; |
249 }; | |
250 goog.inherits(cvox.CalcResult, cvox.AbstractResult); | 233 goog.inherits(cvox.CalcResult, cvox.AbstractResult); |
251 | 234 |
252 /** | 235 /** |
253 * Checks the result if it is a calculator result. | 236 * Checks the result if it is a calculator result. |
254 * @override | 237 * @override |
255 */ | 238 */ |
256 cvox.CalcResult.prototype.isType = function(result) { | 239 cvox.CalcResult.prototype.isType = function(result) { |
257 var CALC_SELECT = '#cwmcwd'; | 240 var CALC_SELECT = '#cwmcwd'; |
258 return result.querySelector(CALC_SELECT) !== null; | 241 return result.querySelector(CALC_SELECT) !== null; |
259 }; | 242 }; |
260 | 243 |
261 /** | 244 /** |
262 * Speak a calculator search result. | 245 * Speak a calculator search result. |
263 * @override | 246 * @override |
264 */ | 247 */ |
265 cvox.CalcResult.prototype.speak = function(result) { | 248 cvox.CalcResult.prototype.speak = function(result) { |
266 if (!result) { | 249 if (!result) { |
267 return false; | 250 return false; |
268 } | 251 } |
269 var CALC_QUERY_SELECT = '#cwles'; | 252 var CALC_QUERY_SELECT = '#cwles'; |
270 var CALC_RESULT_SELECT = '#cwos'; | 253 var CALC_RESULT_SELECT = '#cwos'; |
271 var CALC_SELECTORS = [ | 254 var CALC_SELECTORS = |
272 { select: CALC_QUERY_SELECT }, | 255 [{select: CALC_QUERY_SELECT}, {select: CALC_RESULT_SELECT}]; |
273 { select: CALC_RESULT_SELECT } | |
274 ]; | |
275 cvox.SearchResults.speakResultBySelectTexts(result, CALC_SELECTORS); | 256 cvox.SearchResults.speakResultBySelectTexts(result, CALC_SELECTORS); |
276 return true; | 257 return true; |
277 }; | 258 }; |
278 | 259 |
279 /* Game Type */ | 260 /* Game Type */ |
280 /** | 261 /** |
281 * @constructor | 262 * @constructor |
282 * @extends {cvox.AbstractResult} | 263 * @extends {cvox.AbstractResult} |
283 */ | 264 */ |
284 cvox.GameResult = function() { | 265 cvox.GameResult = function() {}; |
285 }; | |
286 goog.inherits(cvox.GameResult, cvox.AbstractResult); | 266 goog.inherits(cvox.GameResult, cvox.AbstractResult); |
287 | 267 |
288 /** | 268 /** |
289 * Checks the result if it is a game result. | 269 * Checks the result if it is a game result. |
290 * @override | 270 * @override |
291 */ | 271 */ |
292 cvox.GameResult.prototype.isType = function(result) { | 272 cvox.GameResult.prototype.isType = function(result) { |
293 var GAME_SELECT = '.xpdbox'; | 273 var GAME_SELECT = '.xpdbox'; |
294 return result.querySelector(GAME_SELECT) !== null; | 274 return result.querySelector(GAME_SELECT) !== null; |
295 }; | 275 }; |
296 | 276 |
297 /* Image Type */ | 277 /* Image Type */ |
298 /** | 278 /** |
299 * @constructor | 279 * @constructor |
300 * @extends {cvox.AbstractResult} | 280 * @extends {cvox.AbstractResult} |
301 */ | 281 */ |
302 cvox.ImageResult = function() { | 282 cvox.ImageResult = function() {}; |
303 }; | |
304 goog.inherits(cvox.ImageResult, cvox.AbstractResult); | 283 goog.inherits(cvox.ImageResult, cvox.AbstractResult); |
305 | 284 |
306 /** | 285 /** |
307 * Checks the result if it is a image result. | 286 * Checks the result if it is a image result. |
308 * @override | 287 * @override |
309 */ | 288 */ |
310 cvox.ImageResult.prototype.isType = function(result) { | 289 cvox.ImageResult.prototype.isType = function(result) { |
311 var IMAGE_CLASSES = 'rg_di'; | 290 var IMAGE_CLASSES = 'rg_di'; |
312 return result.className === IMAGE_CLASSES; | 291 return result.className === IMAGE_CLASSES; |
313 }; | 292 }; |
314 | 293 |
315 /** | 294 /** |
316 * Speak an image result. | 295 * Speak an image result. |
317 * @override | 296 * @override |
318 */ | 297 */ |
319 cvox.ImageResult.prototype.speak = function(result) { | 298 cvox.ImageResult.prototype.speak = function(result) { |
320 if (!result) { | 299 if (!result) { |
321 return false; | 300 return false; |
322 } | 301 } |
323 /* Grab image result metadata. */ | 302 /* Grab image result metadata. */ |
324 var META_CLASS = 'rg_meta'; | 303 var META_CLASS = 'rg_meta'; |
325 var metaDiv = result.querySelector('.' + META_CLASS); | 304 var metaDiv = result.querySelector('.' + META_CLASS); |
326 var metaJSON = metaDiv.innerHTML; | 305 var metaJSON = metaDiv.innerHTML; |
327 var metaData = JSON.parse(metaJSON); | 306 var metaData = JSON.parse(metaJSON); |
328 | 307 |
329 var imageSelectTexts = []; | 308 var imageSelectTexts = []; |
330 | 309 |
331 var filename = metaData['fn']; | 310 var filename = metaData['fn']; |
332 if (filename) { | 311 if (filename) { |
333 imageSelectTexts.push({ text: filename }); | 312 imageSelectTexts.push({text: filename}); |
334 } | 313 } |
335 | 314 |
336 var rawDimensions = metaData['is']; | 315 var rawDimensions = metaData['is']; |
337 if (rawDimensions) { | 316 if (rawDimensions) { |
338 /* Dimensions contain HTML codes, so we convert them. */ | 317 /* Dimensions contain HTML codes, so we convert them. */ |
339 var tmpDiv = document.createElement('div'); | 318 var tmpDiv = document.createElement('div'); |
340 tmpDiv.innerHTML = rawDimensions; | 319 tmpDiv.innerHTML = rawDimensions; |
341 var dimensions = tmpDiv.textContent || tmpDiv.innerText; | 320 var dimensions = tmpDiv.textContent || tmpDiv.innerText; |
342 imageSelectTexts.push({ text: dimensions }); | 321 imageSelectTexts.push({text: dimensions}); |
343 } | 322 } |
344 | 323 |
345 var url = metaData['isu']; | 324 var url = metaData['isu']; |
346 if (url) { | 325 if (url) { |
347 imageSelectTexts.push({ text: url}); | 326 imageSelectTexts.push({text: url}); |
348 } | 327 } |
349 cvox.SearchResults.speakResultBySelectTexts(result, imageSelectTexts); | 328 cvox.SearchResults.speakResultBySelectTexts(result, imageSelectTexts); |
350 return true; | 329 return true; |
351 }; | 330 }; |
352 | 331 |
353 /* Category Result */ | 332 /* Category Result */ |
354 /** | 333 /** |
355 * @constructor | 334 * @constructor |
356 * @extends {cvox.AbstractResult} | 335 * @extends {cvox.AbstractResult} |
357 */ | 336 */ |
358 cvox.CategoryResult = function() { | 337 cvox.CategoryResult = function() {}; |
359 }; | |
360 goog.inherits(cvox.CategoryResult, cvox.AbstractResult); | 338 goog.inherits(cvox.CategoryResult, cvox.AbstractResult); |
361 | 339 |
362 /** | 340 /** |
363 * Checks the result if it is a category result. | 341 * Checks the result if it is a category result. |
364 * @param {Element} result Result to be checked. | 342 * @param {Element} result Result to be checked. |
365 * @return {boolean} Whether or not the element is a category result. | 343 * @return {boolean} Whether or not the element is a category result. |
366 * @override | 344 * @override |
367 */ | 345 */ |
368 cvox.CategoryResult.prototype.isType = function(result) { | 346 cvox.CategoryResult.prototype.isType = function(result) { |
369 var CATEGORY_CLASSES = 'rg_fbl nj'; | 347 var CATEGORY_CLASSES = 'rg_fbl nj'; |
370 return result.className === CATEGORY_CLASSES; | 348 return result.className === CATEGORY_CLASSES; |
371 }; | 349 }; |
372 | 350 |
373 /** | 351 /** |
374 * Speak a category result. | 352 * Speak a category result. |
375 * @override | 353 * @override |
376 */ | 354 */ |
377 cvox.CategoryResult.prototype.speak = function(result) { | 355 cvox.CategoryResult.prototype.speak = function(result) { |
378 if (!result) { | 356 if (!result) { |
379 return false; | 357 return false; |
380 } | 358 } |
381 var LABEL_SELECT = '.rg_bb_label'; | 359 var LABEL_SELECT = '.rg_bb_label'; |
382 var label = result.querySelector(LABEL_SELECT); | 360 var label = result.querySelector(LABEL_SELECT); |
383 | 361 |
384 cvox.ChromeVox.tts.speak( | 362 cvox.ChromeVox.tts.speak(cvox.DomUtil.getName(label), cvox.QueueMode.QUEUE); |
385 cvox.DomUtil.getName(label), cvox.QueueMode.QUEUE); | |
386 return true; | 363 return true; |
387 }; | 364 }; |
388 | 365 |
389 /* Ad Result */ | 366 /* Ad Result */ |
390 /** | 367 /** |
391 * @constructor | 368 * @constructor |
392 * @extends {cvox.AbstractResult} | 369 * @extends {cvox.AbstractResult} |
393 */ | 370 */ |
394 cvox.AdResult = function() { | 371 cvox.AdResult = function() {}; |
395 }; | |
396 goog.inherits(cvox.AdResult, cvox.AbstractResult); | 372 goog.inherits(cvox.AdResult, cvox.AbstractResult); |
397 | 373 |
398 /** | 374 /** |
399 * Checks the result if it is an ad result. | 375 * Checks the result if it is an ad result. |
400 * @override | 376 * @override |
401 */ | 377 */ |
402 cvox.AdResult.prototype.isType = function(result) { | 378 cvox.AdResult.prototype.isType = function(result) { |
403 var ADS_CLASS = 'ads-ad'; | 379 var ADS_CLASS = 'ads-ad'; |
404 return result.className === ADS_CLASS; | 380 return result.className === ADS_CLASS; |
405 }; | 381 }; |
406 | 382 |
407 /** | 383 /** |
408 * Speak an ad result. | 384 * Speak an ad result. |
409 * @override | 385 * @override |
410 */ | 386 */ |
411 cvox.AdResult.prototype.speak = function(result) { | 387 cvox.AdResult.prototype.speak = function(result) { |
412 if (!result) { | 388 if (!result) { |
413 return false; | 389 return false; |
414 } | 390 } |
415 var HEADER_SELECT = 'h3'; | 391 var HEADER_SELECT = 'h3'; |
416 var DESC_SELECT = '.ads-creative'; | 392 var DESC_SELECT = '.ads-creative'; |
417 var URL_SELECT = '.ads-visurl'; | 393 var URL_SELECT = '.ads-visurl'; |
418 var AD_SELECTS = [ | 394 var AD_SELECTS = |
419 { select: HEADER_SELECT }, | 395 [{select: HEADER_SELECT}, {select: DESC_SELECT}, {select: URL_SELECT}]; |
420 { select: DESC_SELECT }, | |
421 { select: URL_SELECT }]; | |
422 cvox.SearchResults.speakResultBySelectTexts(result, AD_SELECTS); | 396 cvox.SearchResults.speakResultBySelectTexts(result, AD_SELECTS); |
423 return true; | 397 return true; |
424 }; | 398 }; |
425 | 399 |
426 /** | 400 /** |
427 * To add new result types, create a new object with the following properties: | 401 * To add new result types, create a new object with the following properties: |
428 * isType: Function to indicate if an element is the object's type. | 402 * isType: Function to indicate if an element is the object's type. |
429 * speak: Function that takes in a result and speaks the type to the user. | 403 * speak: Function that takes in a result and speaks the type to the user. |
430 * getURL: Function that takes in a result and extracts the URL to follow. | 404 * getURL: Function that takes in a result and extracts the URL to follow. |
431 */ | 405 */ |
432 cvox.SearchResults.RESULT_TYPES = [ | 406 cvox.SearchResults.RESULT_TYPES = [ |
433 cvox.UnknownResult, | 407 cvox.UnknownResult, cvox.NormalResult, cvox.KnowResult, cvox.WeatherResult, |
434 cvox.NormalResult, | 408 cvox.AdResult, cvox.CalcResult, cvox.GameResult, cvox.ImageResult, |
435 cvox.KnowResult, | |
436 cvox.WeatherResult, | |
437 cvox.AdResult, | |
438 cvox.CalcResult, | |
439 cvox.GameResult, | |
440 cvox.ImageResult, | |
441 cvox.CategoryResult | 409 cvox.CategoryResult |
442 ]; | 410 ]; |
OLD | NEW |