UNPKG

google-closure-library

Version:
83 lines (71 loc) 2.3 kB
/** * @license * Copyright The Closure Library Authors. * SPDX-License-Identifier: Apache-2.0 */ /** * @fileoverview Helper object used by modal elements to control aria * visibility of the rest of the page. */ goog.provide('goog.ui.ModalAriaVisibilityHelper'); goog.require('goog.a11y.aria'); goog.require('goog.a11y.aria.State'); goog.requireType('goog.dom.DomHelper'); /** * Helper object to control aria visibility of the rest of the page (background) * for a given element. Example usage is to restrict screenreader focus to * a modal popup while it is visible. * * WARNING: This will work only if the element is rendered directly in the * 'body' element. * * @param {!Element} element The given element. * @param {!goog.dom.DomHelper} domHelper DomHelper for the page. * @constructor */ goog.ui.ModalAriaVisibilityHelper = function(element, domHelper) { 'use strict'; /** * @private {!Element} */ this.element_ = element; /** * @private {!goog.dom.DomHelper} */ this.dom_ = domHelper; }; /** * The elements set to aria-hidden when the popup was made visible. * @type {Array<!Element>} * @private */ goog.ui.ModalAriaVisibilityHelper.prototype.hiddenElements_; /** * Sets aria-hidden on the rest of the page to restrict screen reader focus. * Top-level elements with an explicit aria-hidden state are not altered. * @param {boolean} hide Whether to hide or show the rest of the page. */ goog.ui.ModalAriaVisibilityHelper.prototype.setBackgroundVisibility = function( hide) { 'use strict'; if (hide) { if (!this.hiddenElements_) { this.hiddenElements_ = []; } var topLevelChildren = this.dom_.getChildren(this.dom_.getDocument().body); for (var i = 0; i < topLevelChildren.length; i++) { var child = topLevelChildren[i]; if (child != this.element_ && !goog.a11y.aria.getState(child, goog.a11y.aria.State.HIDDEN)) { goog.a11y.aria.setState(child, goog.a11y.aria.State.HIDDEN, true); this.hiddenElements_.push(child); } } } else if (this.hiddenElements_) { for (var i = 0; i < this.hiddenElements_.length; i++) { goog.a11y.aria.removeState( this.hiddenElements_[i], goog.a11y.aria.State.HIDDEN); } this.hiddenElements_ = null; } };