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 * @fileoverview Provides output services for ChromeVox. | 6 * @fileoverview Provides output services for ChromeVox. |
7 */ | 7 */ |
8 | 8 |
9 goog.provide('Output'); | 9 goog.provide('Output'); |
10 goog.provide('Output.EventType'); | 10 goog.provide('Output.EventType'); |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 msgId: 'role_math', | 208 msgId: 'role_math', |
209 inherits: 'abstractContainer' | 209 inherits: 'abstractContainer' |
210 }, | 210 }, |
211 menu: { | 211 menu: { |
212 msgId: 'role_menu' | 212 msgId: 'role_menu' |
213 }, | 213 }, |
214 menuBar: { | 214 menuBar: { |
215 msgId: 'role_menubar', | 215 msgId: 'role_menubar', |
216 }, | 216 }, |
217 menuItem: { | 217 menuItem: { |
218 msgId: 'role_menuitem' | 218 msgId: 'role_menuitem', |
| 219 earconId: 'BUTTON' |
219 }, | 220 }, |
220 menuItemCheckBox: { | 221 menuItemCheckBox: { |
221 msgId: 'role_menuitemcheckbox' | 222 msgId: 'role_menuitemcheckbox', |
| 223 earconId: 'BUTTON' |
222 }, | 224 }, |
223 menuItemRadio: { | 225 menuItemRadio: { |
224 msgId: 'role_menuitemradio' | 226 msgId: 'role_menuitemradio', |
| 227 earconId: 'BUTTON' |
225 }, | 228 }, |
226 menuListOption: { | 229 menuListOption: { |
227 msgId: 'role_menuitem' | 230 msgId: 'role_menuitem' |
228 }, | 231 }, |
229 menuListPopup: { | 232 menuListPopup: { |
230 msgId: 'role_menu' | 233 msgId: 'role_menu' |
231 }, | 234 }, |
232 navigation: { | 235 navigation: { |
233 msgId: 'role_navigation', | 236 msgId: 'role_navigation', |
234 inherits: 'abstractContainer' | 237 inherits: 'abstractContainer' |
235 }, | 238 }, |
236 note: { | 239 note: { |
237 msgId: 'role_note', | 240 msgId: 'role_note', |
238 inherits: 'abstractContainer' | 241 inherits: 'abstractContainer' |
239 }, | 242 }, |
240 popUpButton: { | 243 popUpButton: { |
241 msgId: 'role_button', | 244 msgId: 'role_button', |
242 earcon: 'LISTBOX' | |
243 }, | 245 }, |
244 radioButton: { | 246 radioButton: { |
245 msgId: 'role_radio' | 247 msgId: 'role_radio' |
246 }, | 248 }, |
247 radioGroup: { | 249 radioGroup: { |
248 msgId: 'role_radiogroup', | 250 msgId: 'role_radiogroup', |
249 }, | 251 }, |
250 region: { | 252 region: { |
251 msgId: 'role_region', | 253 msgId: 'role_region', |
252 inherits: 'abstractContainer' | 254 inherits: 'abstractContainer' |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
314 * off: {msgId: string, earconId: string}, | 316 * off: {msgId: string, earconId: string}, |
315 * omitted: {msgId: string, earconId: string}}>} | 317 * omitted: {msgId: string, earconId: string}}>} |
316 * on: info used to describe a state that is set to true. | 318 * on: info used to describe a state that is set to true. |
317 * off: info used to describe a state that is set to false. | 319 * off: info used to describe a state that is set to false. |
318 * omitted: info used to describe a state that is undefined. | 320 * omitted: info used to describe a state that is undefined. |
319 * @private | 321 * @private |
320 */ | 322 */ |
321 Output.STATE_INFO_ = { | 323 Output.STATE_INFO_ = { |
322 checked: { | 324 checked: { |
323 on: { | 325 on: { |
324 earconId: 'CHECK_ON', | |
325 msgId: 'checkbox_checked_state' | 326 msgId: 'checkbox_checked_state' |
326 }, | 327 }, |
327 off: { | 328 off: { |
328 earconId: 'CHECK_OFF', | |
329 msgId: 'checkbox_unchecked_state' | 329 msgId: 'checkbox_unchecked_state' |
330 }, | 330 }, |
331 omitted: { | 331 omitted: { |
332 earconId: 'CHECK_OFF', | |
333 msgId: 'checkbox_unchecked_state' | 332 msgId: 'checkbox_unchecked_state' |
334 } | 333 } |
335 }, | 334 }, |
336 collapsed: { | 335 collapsed: { |
337 on: { | 336 on: { |
338 msgId: 'aria_expanded_false' | 337 msgId: 'aria_expanded_false' |
339 }, | 338 }, |
340 off: { | 339 off: { |
341 msgId: 'aria_expanded_true' | 340 msgId: 'aria_expanded_true' |
342 } | 341 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
388 alert: { | 387 alert: { |
389 speak: '!doNotInterrupt $role $descendants' | 388 speak: '!doNotInterrupt $role $descendants' |
390 }, | 389 }, |
391 alertDialog: { | 390 alertDialog: { |
392 enter: '$name $role $descendants' | 391 enter: '$name $role $descendants' |
393 }, | 392 }, |
394 cell: { | 393 cell: { |
395 enter: '@column_granularity $tableCellColumnIndex' | 394 enter: '@column_granularity $tableCellColumnIndex' |
396 }, | 395 }, |
397 checkBox: { | 396 checkBox: { |
398 speak: '$name $role $checked' | 397 speak: '$if($checked, $earcon(CHECK_ON), $earcon(CHECK_OFF)) ' + |
| 398 '$name $role $checked' |
399 }, | 399 }, |
400 dialog: { | 400 dialog: { |
401 enter: '$name $role' | 401 enter: '$name $role' |
402 }, | 402 }, |
403 div: { | 403 div: { |
404 enter: '$name', | 404 enter: '$name', |
405 speak: '$name' | 405 speak: '$name' |
406 }, | 406 }, |
407 grid: { | 407 grid: { |
408 enter: '$name $role' | 408 enter: '$name $role' |
(...skipping 30 matching lines...) Expand all Loading... |
439 '@describe_index($indexInParent, $parentChildCount)' | 439 '@describe_index($indexInParent, $parentChildCount)' |
440 }, | 440 }, |
441 menuListOption: { | 441 menuListOption: { |
442 speak: '$name $value @role_menuitem ' + | 442 speak: '$name $value @role_menuitem ' + |
443 '@describe_index($indexInParent, $parentChildCount)' | 443 '@describe_index($indexInParent, $parentChildCount)' |
444 }, | 444 }, |
445 paragraph: { | 445 paragraph: { |
446 speak: '$descendants' | 446 speak: '$descendants' |
447 }, | 447 }, |
448 popUpButton: { | 448 popUpButton: { |
449 speak: '$value $name $role @aria_has_popup ' + | 449 speak: '$earcon(POP_UP_BUTTON) $value $name $role @aria_has_popup ' + |
450 '$if($collapsed, @aria_expanded_false, @aria_expanded_true)' | 450 '$if($collapsed, @aria_expanded_false, @aria_expanded_true)' |
451 }, | 451 }, |
452 radioButton: { | 452 radioButton: { |
453 speak: '$if($checked, @describe_radio_selected($name), ' + | 453 speak: '$if($checked, @describe_radio_selected($name), ' + |
454 '@describe_radio_unselected($name))' | 454 '@describe_radio_unselected($name))' |
455 }, | 455 }, |
456 radioGroup: { | 456 radioGroup: { |
457 enter: '$name $role' | 457 enter: '$name $role' |
458 }, | 458 }, |
459 rootWebArea: { | 459 rootWebArea: { |
460 enter: '$name' | 460 enter: '$name' |
461 }, | 461 }, |
462 row: { | 462 row: { |
463 enter: '@row_granularity $tableRowIndex' | 463 enter: '@row_granularity $tableRowIndex' |
464 }, | 464 }, |
465 slider: { | 465 slider: { |
466 speak: '@describe_slider($value, $name) $help' | 466 speak: '$earcon(SLIDER) @describe_slider($value, $name) $help' |
467 }, | 467 }, |
468 staticText: { | 468 staticText: { |
469 speak: '$value=' | 469 speak: '$value=' |
470 }, | 470 }, |
471 tab: { | 471 tab: { |
472 speak: '@describe_tab($name)' | 472 speak: '@describe_tab($name)' |
473 }, | 473 }, |
474 textField: { | 474 textField: { |
475 speak: '$name $value $if(' + | 475 speak: '$name $value $if(' + |
476 '$inputType, $inputType, $role)', | 476 '$inputType, $inputType, $role)', |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 return this; | 672 return this; |
673 }, | 673 }, |
674 | 674 |
675 /** | 675 /** |
676 * Executes all specified output. | 676 * Executes all specified output. |
677 */ | 677 */ |
678 go: function() { | 678 go: function() { |
679 // Speech. | 679 // Speech. |
680 var queueMode = cvox.QueueMode.FLUSH; | 680 var queueMode = cvox.QueueMode.FLUSH; |
681 this.speechBuffer_.forEach(function(buff, i, a) { | 681 this.speechBuffer_.forEach(function(buff, i, a) { |
682 if (buff.toString()) { | 682 (function() { |
683 (function() { | 683 var scopedBuff = buff; |
684 var scopedBuff = buff; | 684 this.speechProperties_['startCallback'] = function() { |
685 this.speechProperties_['startCallback'] = function() { | 685 var actions = scopedBuff.getSpansInstanceOf(Output.Action); |
686 var actions = scopedBuff.getSpansInstanceOf(Output.Action); | 686 if (actions) { |
687 if (actions) { | 687 actions.forEach(function(a) { |
688 actions.forEach(function(a) { | 688 a.run(); |
689 a.run(); | 689 }); |
690 }); | 690 } |
691 } | 691 }; |
692 }; | 692 }.bind(this)()); |
693 }.bind(this)()); | |
694 | 693 |
695 if (this.speechEndCallback_ && i == a.length - 1) | 694 if (this.speechEndCallback_ && i == a.length - 1) |
696 this.speechProperties_['endCallback'] = this.speechEndCallback_; | 695 this.speechProperties_['endCallback'] = this.speechEndCallback_; |
697 else | 696 else |
698 this.speechProperties_['endCallback'] = null; | 697 this.speechProperties_['endCallback'] = null; |
699 cvox.ChromeVox.tts.speak( | 698 cvox.ChromeVox.tts.speak( |
700 buff.toString(), queueMode, this.speechProperties_); | 699 buff.toString(), queueMode, this.speechProperties_); |
701 queueMode = cvox.QueueMode.QUEUE; | 700 queueMode = cvox.QueueMode.QUEUE; |
702 } | |
703 }.bind(this)); | 701 }.bind(this)); |
704 | 702 |
705 // Braille. | 703 // Braille. |
706 if (this.brailleBuffer_.length) { | 704 if (this.brailleBuffer_.length) { |
707 var buff = this.createBrailleOutput_(); | 705 var buff = this.createBrailleOutput_(); |
708 var selSpan = | 706 var selSpan = |
709 buff.getSpanInstanceOf(Output.SelectionSpan); | 707 buff.getSpanInstanceOf(Output.SelectionSpan); |
710 var startIndex = -1, endIndex = -1; | 708 var startIndex = -1, endIndex = -1; |
711 if (selSpan) { | 709 if (selSpan) { |
712 // Casts ok, since the span is known to be in the spannable. | 710 // Casts ok, since the span is known to be in the spannable. |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
949 var cond = tree.firstChild; | 947 var cond = tree.firstChild; |
950 var attrib = cond.value.slice(1); | 948 var attrib = cond.value.slice(1); |
951 if (node[attrib] || node.state[attrib]) | 949 if (node[attrib] || node.state[attrib]) |
952 this.format_(node, cond.nextSibling, buff); | 950 this.format_(node, cond.nextSibling, buff); |
953 else | 951 else |
954 this.format_(node, cond.nextSibling.nextSibling, buff); | 952 this.format_(node, cond.nextSibling.nextSibling, buff); |
955 } else if (token == 'earcon') { | 953 } else if (token == 'earcon') { |
956 // Ignore unless we're generating speech output. | 954 // Ignore unless we're generating speech output. |
957 if (!this.formatOptions_.speech) | 955 if (!this.formatOptions_.speech) |
958 return; | 956 return; |
959 // Assumes there's existing output in our buffer. | |
960 var lastBuff = buff[buff.length - 1]; | |
961 if (!lastBuff) | |
962 return; | |
963 | 957 |
964 lastBuff.setSpan( | 958 options.annotation.push( |
965 new Output.EarconAction(tree.firstChild.value), 0, 0); | 959 new Output.EarconAction(tree.firstChild.value), 0, 0); |
| 960 this.append_(buff, '', options); |
966 } else if (token == 'countChildren') { | 961 } else if (token == 'countChildren') { |
967 var role = tree.firstChild.value; | 962 var role = tree.firstChild.value; |
968 var count = node.children.filter(function(e) { | 963 var count = node.children.filter(function(e) { |
969 return e.role == role; | 964 return e.role == role; |
970 }).length; | 965 }).length; |
971 this.append_(buff, String(count)); | 966 this.append_(buff, String(count)); |
972 } | 967 } |
973 } | 968 } |
974 } else if (prefix == '@') { | 969 } else if (prefix == '@') { |
975 var isPluralized = (token[0] == '@'); | 970 var isPluralized = (token[0] == '@'); |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1320 elem.end); | 1315 elem.end); |
1321 }); | 1316 }); |
1322 spansToRemove.forEach(result.removeSpan.bind(result)); | 1317 spansToRemove.forEach(result.removeSpan.bind(result)); |
1323 separator = Output.SPACE; | 1318 separator = Output.SPACE; |
1324 }); | 1319 }); |
1325 return result; | 1320 return result; |
1326 } | 1321 } |
1327 }; | 1322 }; |
1328 | 1323 |
1329 }); // goog.scope | 1324 }); // goog.scope |
OLD | NEW |