Index: chrome/browser/resources/options2/options_page.js |
diff --git a/chrome/browser/resources/options2/options_page.js b/chrome/browser/resources/options2/options_page.js |
index 33652e67a59492ae596a022397cd9e8347538463..af39c54bd7aacee175ddb699451336110b322c0b 100644 |
--- a/chrome/browser/resources/options2/options_page.js |
+++ b/chrome/browser/resources/options2/options_page.js |
@@ -67,6 +67,18 @@ cr.define('options', function() { |
}; |
/** |
+ * Removes the aria-hidden attribute from both the topmost visible page and |
+ * the search box if needed. |
+ */ |
+ OptionsPage.removeAriaHidden_ = function() { |
+ var topmostPage = this.getTopmostVisiblePage(); |
+ topmostPage.pageDiv.removeAttribute('aria-hidden'); |
+ |
+ if (!this.isOverlayVisible_()) |
+ $('searchBox').removeAttribute('aria-hidden'); |
+ }; |
+ |
+ /** |
* Shows a registered page. This handles both top-level and overlay pages. |
* @param {string} pageName Page name. |
* @param {boolean} updateHistory True if we should update the history after |
@@ -98,6 +110,7 @@ cr.define('options', function() { |
if (!targetPage && this.showOverlay_(pageName, rootPage)) { |
if (updateHistory) |
this.updateHistoryState_(!!opt_propertyBag.replaceState); |
+ this.removeAriaHidden_(); |
Evan Stade
2012/05/15 21:37:33
sprinkling this.removeAriaHidden_() all across thi
|
return; |
} else { |
targetPage = this.getDefaultPage(); |
@@ -140,6 +153,8 @@ cr.define('options', function() { |
page.visible = name == pageName || page.isAncestorOfPage(targetPage); |
} |
+ this.removeAriaHidden_(); |
+ |
// Update the history and current location. |
if (updateHistory) |
this.updateHistoryState_(!!opt_propertyBag.replaceState); |
@@ -242,6 +257,16 @@ cr.define('options', function() { |
if (overlay.didShowPage) overlay.didShowPage(); |
} |
+ // The pages behind the new topmost overlay are now obscured behind its |
+ // contents. To prevent screen readers from reading this "hidden" |
+ // information, enable the aria-hidden attribute on those pages. |
+ var current = this.getTopmostVisiblePage(); |
+ while (current = current.parentPage) |
+ current.pageDiv.setAttribute('aria-hidden', true); |
+ |
+ // The search box also needs to have this attribute applied. |
+ $('searchBox').setAttribute('aria-hidden', true); |
+ |
// Update tab title. |
this.setTitle_(overlay.title); |
// Try to focus the first element of the new overlay. |
@@ -289,7 +314,7 @@ cr.define('options', function() { |
if (overlay.didClosePage) overlay.didClosePage(); |
this.updateHistoryState_(false, {ignoreHash: true}); |
- // TODO(khorimoto): Set correct focus on new topmost dialog. |
+ this.removeAriaHidden_(); |
}; |
/** |
@@ -300,11 +325,13 @@ cr.define('options', function() { |
document.activeElement.blur(); |
var overlay = this.getVisibleOverlay_(); |
// Let the overlay handle the <Esc> if it wants to. |
- if (overlay.handleCancel) |
+ if (overlay.handleCancel) { |
overlay.handleCancel(); |
- else |
+ this.removeAriaHidden_(); |
+ } else { |
this.closeOverlay(); |
- } |
+ } |
+ }; |
/** |
* Hides the visible overlay. Does not affect the history state. |