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 The entry point for all ChromeVox2 related code for the | 6 * @fileoverview The entry point for all ChromeVox2 related code for the |
7 * background page. | 7 * background page. |
8 */ | 8 */ |
9 | 9 |
10 goog.provide('Background'); | 10 goog.provide('Background'); |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 predErrorMsg = 'no_previous_visited_link'; | 250 predErrorMsg = 'no_previous_visited_link'; |
251 break; | 251 break; |
252 case 'nextElement': | 252 case 'nextElement': |
253 current = current.move(cursors.Unit.NODE, Dir.FORWARD); | 253 current = current.move(cursors.Unit.NODE, Dir.FORWARD); |
254 break; | 254 break; |
255 case 'previousElement': | 255 case 'previousElement': |
256 current = current.move(cursors.Unit.NODE, Dir.BACKWARD); | 256 current = current.move(cursors.Unit.NODE, Dir.BACKWARD); |
257 break; | 257 break; |
258 case 'goToBeginning': | 258 case 'goToBeginning': |
259 var node = | 259 var node = |
260 AutomationUtil.findNodePost(current.getStart().getNode().root, | 260 AutomationUtil.findNodePost(current.start.node.root, |
261 Dir.FORWARD, | 261 Dir.FORWARD, |
262 AutomationPredicate.leaf); | 262 AutomationPredicate.leaf); |
263 if (node) | 263 if (node) |
264 current = cursors.Range.fromNode(node); | 264 current = cursors.Range.fromNode(node); |
265 break; | 265 break; |
266 case 'goToEnd': | 266 case 'goToEnd': |
267 var node = | 267 var node = |
268 AutomationUtil.findNodePost(current.getStart().getNode().root, | 268 AutomationUtil.findNodePost(current.start.node.root, |
269 Dir.BACKWARD, | 269 Dir.BACKWARD, |
270 AutomationPredicate.leaf); | 270 AutomationPredicate.leaf); |
271 if (node) | 271 if (node) |
272 current = cursors.Range.fromNode(node); | 272 current = cursors.Range.fromNode(node); |
273 break; | 273 break; |
274 case 'doDefault': | 274 case 'doDefault': |
275 if (this.currentRange_) { | 275 if (this.currentRange_) { |
276 var actionNode = this.currentRange_.getStart().getNode(); | 276 var actionNode = this.currentRange_.start.node; |
277 if (actionNode.role == chrome.automation.RoleType.inlineTextBox) | 277 if (actionNode.role == chrome.automation.RoleType.inlineTextBox) |
278 actionNode = actionNode.parent; | 278 actionNode = actionNode.parent; |
279 actionNode.doDefault(); | 279 actionNode.doDefault(); |
280 } | 280 } |
281 // Skip all other processing; if focus changes, we should get an event | 281 // Skip all other processing; if focus changes, we should get an event |
282 // for that. | 282 // for that. |
283 return; | 283 return; |
284 case 'continuousRead': | 284 case 'continuousRead': |
285 global.isReadingContinuously = true; | 285 global.isReadingContinuously = true; |
286 var continueReading = function(prevRange) { | 286 var continueReading = function(prevRange) { |
287 if (!global.isReadingContinuously || !this.currentRange_) | 287 if (!global.isReadingContinuously || !this.currentRange_) |
288 return; | 288 return; |
289 | 289 |
290 new Output().withSpeechAndBraille( | 290 new Output().withSpeechAndBraille( |
291 this.currentRange_, prevRange, Output.EventType.NAVIGATE) | 291 this.currentRange_, prevRange, Output.EventType.NAVIGATE) |
292 .onSpeechEnd(function() { continueReading(prevRange); }) | 292 .onSpeechEnd(function() { continueReading(prevRange); }) |
293 .go(); | 293 .go(); |
294 prevRange = this.currentRange_; | 294 prevRange = this.currentRange_; |
295 this.currentRange_ = | 295 this.currentRange_ = |
296 this.currentRange_.move(cursors.Unit.NODE, Dir.FORWARD); | 296 this.currentRange_.move(cursors.Unit.NODE, Dir.FORWARD); |
297 | 297 |
298 if (!this.currentRange_ || this.currentRange_.equals(prevRange)) | 298 if (!this.currentRange_ || this.currentRange_.equals(prevRange)) |
299 global.isReadingContinuously = false; | 299 global.isReadingContinuously = false; |
300 }.bind(this); | 300 }.bind(this); |
301 | 301 |
302 continueReading(null); | 302 continueReading(null); |
303 return; | 303 return; |
304 case 'showContextMenu': | 304 case 'showContextMenu': |
305 if (this.currentRange_) { | 305 if (this.currentRange_) { |
306 var actionNode = this.currentRange_.getStart().getNode(); | 306 var actionNode = this.currentRange_.start.node; |
307 if (actionNode.role == chrome.automation.RoleType.inlineTextBox) | 307 if (actionNode.role == chrome.automation.RoleType.inlineTextBox) |
308 actionNode = actionNode.parent; | 308 actionNode = actionNode.parent; |
309 actionNode.showContextMenu(); | 309 actionNode.showContextMenu(); |
310 return; | 310 return; |
311 } | 311 } |
312 break; | 312 break; |
313 case 'showOptionsPage': | 313 case 'showOptionsPage': |
314 var optionsPage = {url: 'chromevox/background/options.html'}; | 314 var optionsPage = {url: 'chromevox/background/options.html'}; |
315 chrome.tabs.create(optionsPage); | 315 chrome.tabs.create(optionsPage); |
316 break; | 316 break; |
317 } | 317 } |
318 | 318 |
319 if (pred) { | 319 if (pred) { |
320 var node = AutomationUtil.findNextNode( | 320 var node = AutomationUtil.findNextNode( |
321 current.getBound(dir).getNode(), dir, pred); | 321 current.getBound(dir).node, dir, pred); |
322 | 322 |
323 if (node) { | 323 if (node) { |
324 current = cursors.Range.fromNode(node); | 324 current = cursors.Range.fromNode(node); |
325 } else { | 325 } else { |
326 if (predErrorMsg) { | 326 if (predErrorMsg) { |
327 cvox.ChromeVox.tts.speak(cvox.ChromeVox.msgs.getMsg(predErrorMsg), | 327 cvox.ChromeVox.tts.speak(cvox.ChromeVox.msgs.getMsg(predErrorMsg), |
328 cvox.QueueMode.FLUSH); | 328 cvox.QueueMode.FLUSH); |
329 } | 329 } |
330 return; | 330 return; |
331 } | 331 } |
332 } | 332 } |
333 | 333 |
334 if (current) { | 334 if (current) { |
335 // TODO(dtseng): Figure out what it means to focus a range. | 335 // TODO(dtseng): Figure out what it means to focus a range. |
336 var actionNode = current.getStart().getNode(); | 336 var actionNode = current.start.node; |
337 if (actionNode.role == chrome.automation.RoleType.inlineTextBox) | 337 if (actionNode.role == chrome.automation.RoleType.inlineTextBox) |
338 actionNode = actionNode.parent; | 338 actionNode = actionNode.parent; |
339 actionNode.focus(); | 339 actionNode.focus(); |
340 | 340 |
341 var prevRange = this.currentRange_; | 341 var prevRange = this.currentRange_; |
342 this.currentRange_ = current; | 342 this.currentRange_ = current; |
343 | 343 |
344 new Output().withSpeechAndBraille( | 344 new Output().withSpeechAndBraille( |
345 this.currentRange_, prevRange, Output.EventType.NAVIGATE) | 345 this.currentRange_, prevRange, Output.EventType.NAVIGATE) |
346 .go(); | 346 .go(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
392 return; | 392 return; |
393 | 393 |
394 var prevRange = this.currentRange_; | 394 var prevRange = this.currentRange_; |
395 | 395 |
396 this.currentRange_ = cursors.Range.fromNode(node); | 396 this.currentRange_ = cursors.Range.fromNode(node); |
397 | 397 |
398 // Check to see if we've crossed roots. Continue if we've crossed roots or | 398 // Check to see if we've crossed roots. Continue if we've crossed roots or |
399 // are not within web content. | 399 // are not within web content. |
400 if (node.root.role == 'desktop' || | 400 if (node.root.role == 'desktop' || |
401 !prevRange || | 401 !prevRange || |
402 (prevRange.getStart().getNode().root != node.root && | 402 (prevRange.start.node.root != node.root && |
403 node.state.focused)) | 403 node.state.focused)) |
404 this.setupChromeVoxVariants_(node.root.docUrl || ''); | 404 this.setupChromeVoxVariants_(node.root.docUrl || ''); |
405 | 405 |
406 // Don't process nodes inside of web content if ChromeVox Next is inactive. | 406 // Don't process nodes inside of web content if ChromeVox Next is inactive. |
407 if (node.root.role != chrome.automation.RoleType.desktop && | 407 if (node.root.role != chrome.automation.RoleType.desktop && |
408 this.mode_ === ChromeVoxMode.CLASSIC) { | 408 this.mode_ === ChromeVoxMode.CLASSIC) { |
409 chrome.accessibilityPrivate.setFocusRing([]); | 409 chrome.accessibilityPrivate.setFocusRing([]); |
410 return; | 410 return; |
411 } | 411 } |
412 | 412 |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
496 this.onEventDefault(evt); | 496 this.onEventDefault(evt); |
497 this.currentRange_ = cursors.Range.fromNode(evt.target); | 497 this.currentRange_ = cursors.Range.fromNode(evt.target); |
498 } | 498 } |
499 | 499 |
500 var textChangeEvent = new cvox.TextChangeEvent( | 500 var textChangeEvent = new cvox.TextChangeEvent( |
501 evt.target.value, | 501 evt.target.value, |
502 evt.target.textSelStart, | 502 evt.target.textSelStart, |
503 evt.target.textSelEnd, | 503 evt.target.textSelEnd, |
504 true); // triggered by user | 504 true); // triggered by user |
505 if (!this.editableTextHandler || | 505 if (!this.editableTextHandler || |
506 evt.target != this.currentRange_.getStart().getNode()) { | 506 evt.target != this.currentRange_.start.node) { |
507 this.editableTextHandler = | 507 this.editableTextHandler = |
508 new cvox.ChromeVoxEditableTextBase( | 508 new cvox.ChromeVoxEditableTextBase( |
509 textChangeEvent.value, | 509 textChangeEvent.value, |
510 textChangeEvent.start, | 510 textChangeEvent.start, |
511 textChangeEvent.end, | 511 textChangeEvent.end, |
512 evt.target.state['protected'], | 512 evt.target.state['protected'], |
513 cvox.ChromeVox.tts); | 513 cvox.ChromeVox.tts); |
514 } | 514 } |
515 | 515 |
516 this.editableTextHandler.changed(textChangeEvent); | 516 this.editableTextHandler.changed(textChangeEvent); |
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
649 | 649 |
650 chrome.tabs.query({active: true}, function(tabs) { | 650 chrome.tabs.query({active: true}, function(tabs) { |
651 if (mode === ChromeVoxMode.CLASSIC) { | 651 if (mode === ChromeVoxMode.CLASSIC) { |
652 // This case should do nothing because Classic gets injected by the | 652 // This case should do nothing because Classic gets injected by the |
653 // extension system via our manifest. Once ChromeVox Next is enabled | 653 // extension system via our manifest. Once ChromeVox Next is enabled |
654 // for tabs, re-enable. | 654 // for tabs, re-enable. |
655 // cvox.ChromeVox.injectChromeVoxIntoTabs(tabs); | 655 // cvox.ChromeVox.injectChromeVoxIntoTabs(tabs); |
656 } else { | 656 } else { |
657 // When in compat mode, if the focus is within the desktop tree proper, | 657 // When in compat mode, if the focus is within the desktop tree proper, |
658 // then do not disable content scripts. | 658 // then do not disable content scripts. |
659 if (this.currentRange_.getStart().getNode().root.role == 'desktop') | 659 if (this.currentRange_.start.node.root.role == 'desktop') |
660 return; | 660 return; |
661 | 661 |
662 this.disableClassicChromeVox_(); | 662 this.disableClassicChromeVox_(); |
663 } | 663 } |
664 }.bind(this)); | 664 }.bind(this)); |
665 | 665 |
666 this.mode_ = mode; | 666 this.mode_ = mode; |
667 } | 667 } |
668 }; | 668 }; |
669 | 669 |
670 /** @type {Background} */ | 670 /** @type {Background} */ |
671 global.backgroundObj = new Background(); | 671 global.backgroundObj = new Background(); |
672 | 672 |
673 }); // goog.scope | 673 }); // goog.scope |
OLD | NEW |