Index: third_party/google_input_tools/third_party/closure_library/closure/goog/a11y/aria/announcer.js |
diff --git a/third_party/google_input_tools/third_party/closure_library/closure/goog/a11y/aria/announcer.js b/third_party/google_input_tools/third_party/closure_library/closure/goog/a11y/aria/announcer.js |
index ee87199bc9991871f23cebf7d8fbf590fab7c2e6..681826442d35415281171891cbb6a76e88c01bbb 100644 |
--- a/third_party/google_input_tools/third_party/closure_library/closure/goog/a11y/aria/announcer.js |
+++ b/third_party/google_input_tools/third_party/closure_library/closure/goog/a11y/aria/announcer.js |
@@ -21,10 +21,12 @@ |
goog.provide('goog.a11y.aria.Announcer'); |
goog.require('goog.Disposable'); |
+goog.require('goog.Timer'); |
goog.require('goog.a11y.aria'); |
goog.require('goog.a11y.aria.LivePriority'); |
goog.require('goog.a11y.aria.State'); |
goog.require('goog.dom'); |
+goog.require('goog.dom.TagName'); |
goog.require('goog.object'); |
@@ -50,7 +52,7 @@ goog.a11y.aria.Announcer = function(opt_domHelper) { |
/** |
* Map of priority to live region elements to use for communicating updates. |
* Elements are created on demand. |
- * @type {Object.<goog.a11y.aria.LivePriority, !Element>} |
+ * @type {Object<goog.a11y.aria.LivePriority, !Element>} |
* @private |
*/ |
this.liveRegions_ = {}; |
@@ -76,8 +78,17 @@ goog.a11y.aria.Announcer.prototype.disposeInternal = function() { |
* message. Defaults to POLITE. |
*/ |
goog.a11y.aria.Announcer.prototype.say = function(message, opt_priority) { |
- goog.dom.setTextContent(this.getLiveRegion_( |
- opt_priority || goog.a11y.aria.LivePriority.POLITE), message); |
+ var priority = opt_priority || goog.a11y.aria.LivePriority.POLITE; |
+ var liveRegion = this.getLiveRegion_(priority); |
+ // Resets text content to force a DOM mutation (so that the setTextContent |
+ // post-timeout function will be noticed by the screen reader). This is to |
+ // avoid the problem of when the same message is "said" twice, which doesn't |
+ // trigger a DOM mutation. |
+ goog.dom.setTextContent(liveRegion, ''); |
+ // Uses non-zero timer to make VoiceOver and NVDA work |
+ goog.Timer.callOnce(function() { |
+ goog.dom.setTextContent(liveRegion, message); |
+ }, 1); |
}; |
@@ -94,7 +105,8 @@ goog.a11y.aria.Announcer.prototype.getLiveRegion_ = function(priority) { |
goog.a11y.aria.removeState(liveRegion, goog.a11y.aria.State.HIDDEN); |
return liveRegion; |
} |
- liveRegion = this.domHelper_.createElement('div'); |
+ |
+ liveRegion = this.domHelper_.createElement(goog.dom.TagName.DIV); |
// Note that IE has a habit of declaring things that aren't display:none as |
// invisible to third-party tools like JAWs, so we can't just use height:0. |
liveRegion.style.position = 'absolute'; |