| 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 |