forked from shaka-project/shaka-player
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(ARIA): Add polyfill for ARIAMixin.
The ARIAMixin interface mixin lets users apply ARIA attributes to DOM elements without having to rely on setAttribute and getAttribute. It is one of our goals to switch to using that interface. Unfortunately, it is not implemented on Firefox, so a polyfill is necessary for that platform, before we can start using it. Issue shaka-project#3378 Change-Id: Ia878900d75c7c2c04613360baacb4524774ac746
- Loading branch information
Showing
3 changed files
with
74 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
/*! @license | ||
* Shaka Player | ||
* Copyright 2016 Google LLC | ||
* SPDX-License-Identifier: Apache-2.0 | ||
*/ | ||
|
||
goog.provide('shaka.polyfill.Aria'); | ||
|
||
goog.require('shaka.log'); | ||
goog.require('shaka.polyfill'); | ||
|
||
/** | ||
* @summary A polyfill to add support for the ARIAMixin interface mixin, for | ||
* browsers that do not implement it (e.g. Firefox). | ||
* Note that IE also does not support ARIAMixin, but this polyfill does not work | ||
* for that platform, as it relies on getters and setters. | ||
* @see https://w3c.github.io/aria/#ARIAMixin | ||
* @see https://developer.mozilla.org/en-US/docs/Web/API/Element | ||
*/ | ||
shaka.polyfill.Aria = class { | ||
/** Install the polyfill if needed. */ | ||
static install() { | ||
// eslint-disable-next-line no-restricted-syntax | ||
if (Object.getOwnPropertyDescriptor(Element.prototype, 'ariaHidden')) { | ||
shaka.log.info('Using native ARIAMixin interface.'); | ||
return; | ||
} | ||
shaka.log.info('ARIAMixin interface not detected. Installing polyfill.'); | ||
|
||
// Define a list of all of the ARIAMixin properties that we have externs | ||
// for. | ||
const attributes = [ | ||
'ariaHidden', | ||
'ariaLabel', | ||
'ariaPressed', | ||
'ariaSelected', | ||
]; | ||
|
||
// Add each attribute, one by one. | ||
for (const attribute of attributes) { | ||
shaka.polyfill.Aria.addARIAMixinAttribute_(attribute); | ||
} | ||
} | ||
|
||
/** | ||
* Adds an attribute with the given name. | ||
* @param {string} name The name of the attribute, in camelCase. | ||
* @private | ||
*/ | ||
static addARIAMixinAttribute_(name) { | ||
const snakeCaseName = name.toLowerCase().replace('aria', 'aria-'); | ||
/* eslint-disable no-restricted-syntax */ | ||
Object.defineProperty(Element.prototype, name, { | ||
get() { | ||
const element = /** @type {!Element} */ (this); | ||
return element.getAttribute(snakeCaseName); | ||
}, | ||
set(value) { | ||
const element = /** @type {!Element} */ (this); | ||
if (value == null || value == undefined) { | ||
element.removeAttribute(snakeCaseName); | ||
} else { | ||
element.setAttribute(snakeCaseName, value); | ||
} | ||
}, | ||
}); | ||
/* eslint-enable no-restricted-syntax */ | ||
} | ||
}; | ||
|
||
|
||
shaka.polyfill.register(shaka.polyfill.Aria.install); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters