Skip to content

Commit d351e33

Browse files
crisbetoandrewseguin
authored andcommitted
fix(aria-describer): better handling of non-string values (#9959)
Currently the `AriaDescriber` assumes that any values being described are going to be strings, however that may not be the case if a value is being passed it directly from the view. These changes add an extra check in order to avoid having to do null checks on consumption (see #9957).
1 parent 5e5b8b5 commit d351e33

File tree

2 files changed

+17
-2
lines changed

2 files changed

+17
-2
lines changed

src/cdk/a11y/aria-describer/aria-describer.spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,15 @@ describe('AriaDescriber', () => {
4040
expect(getMessageElements()).toBe(null);
4141
});
4242

43+
it('should not register non-string values', () => {
44+
expect(() => ariaDescriber.describe(component.element1, null!)).not.toThrow();
45+
expect(getMessageElements()).toBe(null);
46+
});
47+
48+
it('should not throw when trying to remove non-string value', () => {
49+
expect(() => ariaDescriber.removeDescription(component.element1, null!)).not.toThrow();
50+
});
51+
4352
it('should de-dupe a message registered multiple times', () => {
4453
ariaDescriber.describe(component.element1, 'My Message');
4554
ariaDescriber.describe(component.element2, 'My Message');

src/cdk/a11y/aria-describer/aria-describer.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export class AriaDescriber {
6060
* message element.
6161
*/
6262
describe(hostElement: Element, message: string) {
63-
if (hostElement.nodeType !== this._document.ELEMENT_NODE || !message.trim()) {
63+
if (!this._canBeDescribed(hostElement, message)) {
6464
return;
6565
}
6666

@@ -75,7 +75,7 @@ export class AriaDescriber {
7575

7676
/** Removes the host element's aria-describedby reference to the message element. */
7777
removeDescription(hostElement: Element, message: string) {
78-
if (hostElement.nodeType !== this._document.ELEMENT_NODE || !message.trim()) {
78+
if (!this._canBeDescribed(hostElement, message)) {
7979
return;
8080
}
8181

@@ -196,6 +196,12 @@ export class AriaDescriber {
196196
return !!messageId && referenceIds.indexOf(messageId) != -1;
197197
}
198198

199+
/** Determines whether a message can be described on a particular element. */
200+
private _canBeDescribed(element: Element, message: string): boolean {
201+
return element.nodeType === this._document.ELEMENT_NODE && message != null &&
202+
!!`${message}`.trim();
203+
}
204+
199205
}
200206

201207
/** @docs-private */

0 commit comments

Comments
 (0)