Index: chrome/browser/resources/chromeos/chromevox/cvox2/background/media_automation_handler.js |
diff --git a/chrome/browser/resources/chromeos/chromevox/cvox2/background/media_automation_handler.js b/chrome/browser/resources/chromeos/chromevox/cvox2/background/media_automation_handler.js |
index 8a57c06b0289f5dded396959f3f76eb4fa569425..cffe598693676707e4de0ebcd95fd47a641635c7 100644 |
--- a/chrome/browser/resources/chromeos/chromevox/cvox2/background/media_automation_handler.js |
+++ b/chrome/browser/resources/chromeos/chromevox/cvox2/background/media_automation_handler.js |
@@ -9,6 +9,7 @@ |
goog.provide('MediaAutomationHandler'); |
goog.require('BaseAutomationHandler'); |
+goog.require('cvox.TtsCapturingEventListener'); |
goog.scope(function() { |
var AutomationEvent = chrome.automation.AutomationEvent; |
@@ -17,32 +18,108 @@ var EventType = chrome.automation.EventType; |
var RoleType = chrome.automation.RoleType; |
/** |
- * @param {!AutomationNode} node The root to observe media changes. |
* @constructor |
* @extends {BaseAutomationHandler} |
+ * @implements {cvox.TtsCapturingEventListener} |
*/ |
-MediaAutomationHandler = function(node) { |
- BaseAutomationHandler.call(this, node); |
+MediaAutomationHandler = function() { |
+ /** @type {!Set<AutomationNode>} @private */ |
+ this.mediaRoots_ = new Set(); |
- var e = EventType; |
- this.addListener_(e.mediaStartedPlaying, this.onMediaStartedPlaying); |
- this.addListener_(e.mediaStoppedPlaying, this.onMediaStoppedPlaying); |
+ /** @type {Date} @private */ |
+ this.lastTtsEvent_ = new Date(); |
+ |
+ cvox.ChromeVox.tts.addCapturingEventListener(this); |
+ |
+ chrome.automation.getDesktop(function(node) { |
+ BaseAutomationHandler.call(this, node); |
+ node.findAll({role: RoleType.rootWebArea}).forEach(function(r) { |
+ if (localStorage['useAudioDucking'] == 'true') |
dmazzoni
2016/12/09 18:30:10
It doesn't make sense to me to do both.
I'd prefer
|
+ r.startDuckingMedia()(); |
+ if (localStorage['useAudioSuspension'] == 'true') |
+ r.suspendMedia()(); |
+ }); |
+ |
+ var e = EventType; |
+ this.addListener_(e.mediaStartedPlaying, this.onMediaStartedPlaying); |
+ this.addListener_(e.mediaStoppedPlaying, this.onMediaStoppedPlaying); |
+ }.bind(this)); |
}; |
+/** @type {number} */ |
+MediaAutomationHandler.MIN_WAITTIME_MS = 1000; |
+ |
MediaAutomationHandler.prototype = { |
__proto__: BaseAutomationHandler.prototype, |
+ /** @override */ |
+ onTtsStart: function() { |
+ this.lastTtsEvent_ = new Date(); |
+ if (localStorage['useAudioDucking'] == 'true') |
+ this.update_({duck: true}); |
+ if (localStorage['useAudioSuspension'] == 'true') |
+ this.update_({suspend: true}); |
+ }, |
+ |
+ /** @override */ |
+ onTtsEnd: function() { |
+ var now = new Date(); |
+ setTimeout(function() { |
+ var then = this.lastTtsEvent_; |
+ if (now < then) |
+ return; |
+ this.lastTtsEvent_ = now; |
+ if (localStorage['useAudioDucking'] == 'true') |
+ this.update_({unduck: true}); |
+ if (localStorage['useAudioSuspension'] == 'true') |
+ this.update_({resume: true}); |
+ }.bind(this), MediaAutomationHandler.MIN_WAITTIME_MS); |
+ }, |
+ |
/** |
* @param {!AutomationEvent} evt |
*/ |
onMediaStartedPlaying: function(evt) { |
+ if (cvox.ChromeVox.tts.isSpeaking()) |
+ evt.target.startDuckingMedia(); |
+ |
+ this.mediaRoots_.add(evt.target); |
}, |
/** |
* @param {!AutomationEvent} evt |
*/ |
onMediaStoppedPlaying: function(evt) { |
+ // Intentionally does nothing (to cover resume). |
+ }, |
+ |
+ /** |
+ * Updates the media state for all observed automation roots. |
+ * Does not check options. |
+ * @param {{duck: (boolean|undefined), |
+ * unduck: (boolean|undefined), |
+ * resume: (boolean|undefined), |
+ * suspend: (boolean|undefined)}} options |
+ * @private |
+ */ |
+ update_: function(options) { |
+ var it = this.mediaRoots_.values(); |
+ var item = it.next(); |
+ while (!item.done) { |
+ var root = item.value; |
+ if (options.duck) |
+ root.startDuckingMedia(); |
+ if (options.unduck) |
+ root.stopDuckingMedia(); |
+ if (options.resume) |
+ root.resumeMedia(); |
+ if (options.suspend) |
+ root.suspendMedia(); |
+ item = it.next(); |
+ } |
} |
}; |
}); // goog.scope |
+ |
+new MediaAutomationHandler(); |