Skip to content

Commit 909557d

Browse files
MartinMaAndrewKushnir
authored andcommittedApr 25, 2019
feat(core): add missing ARIA attributes to html sanitizer (#29685)
Allow ARIA attributes from the WAI-ARIA 1.1 spec which were stripped by the htmlSanitizer. Closes #26815 PR Close #29685
1 parent 957f594 commit 909557d

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed
 

‎integration/_payload-limits.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"master": {
2222
"uncompressed": {
2323
"runtime": 1440,
24-
"main": 155609,
24+
"main": 157393,
2525
"polyfills": 43567
2626
}
2727
}
@@ -30,8 +30,8 @@
3030
"master": {
3131
"uncompressed": {
3232
"bundle": "TODO(i): temporarily increase the payload size limit from 105779 - this is due to a closure issue related to ESM reexports that still needs to be investigated",
33-
"bundle": 179479
33+
"bundle": 179825
3434
}
3535
}
3636
}
37-
}
37+
}

‎packages/core/src/sanitization/html_sanitizer.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,16 @@ const HTML_ATTRS = tagSet(
7373
'scope,scrolling,shape,size,sizes,span,srclang,start,summary,tabindex,target,title,translate,type,usemap,' +
7474
'valign,value,vspace,width');
7575

76+
// Accessibility attributes as per WAI-ARIA 1.1 (W3C Working Draft 14 December 2018)
77+
const ARIA_ATTRS = tagSet(
78+
'aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,' +
79+
'aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,' +
80+
'aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,' +
81+
'aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,' +
82+
'aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,' +
83+
'aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,' +
84+
'aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext');
85+
7686
// NB: This currently consciously doesn't support SVG. SVG sanitization has had several security
7787
// issues in the past, so it seems safer to leave it out if possible. If support for binding SVG via
7888
// innerHTML is required, SVG attributes should be added here.
@@ -81,7 +91,7 @@ const HTML_ATTRS = tagSet(
8191
// can be sanitized, but they increase security surface area without a legitimate use case, so they
8292
// are left out here.
8393

84-
export const VALID_ATTRS = merge(URI_ATTRS, SRCSET_ATTRS, HTML_ATTRS);
94+
export const VALID_ATTRS = merge(URI_ATTRS, SRCSET_ATTRS, HTML_ATTRS, ARIA_ATTRS);
8595

8696
// Elements whose content should not be traversed/preserved, if the elements themselves are invalid.
8797
//

‎packages/core/test/sanitization/html_sanitizer_spec.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@ import {_sanitizeHtml} from '../../src/sanitization/html_sanitizer';
5252
.toEqual('<main><summary>Works</summary></main>');
5353
});
5454

55+
it('supports ARIA attributes', () => {
56+
expect(_sanitizeHtml(defaultDoc, '<h1 role="presentation" aria-haspopup="true">Test</h1>'))
57+
.toEqual('<h1 role="presentation" aria-haspopup="true">Test</h1>');
58+
expect(_sanitizeHtml(defaultDoc, '<i aria-label="Info">Info</i>'))
59+
.toEqual('<i aria-label="Info">Info</i>');
60+
expect(_sanitizeHtml(defaultDoc, '<img src="pteranodon.jpg" aria-details="details">'))
61+
.toEqual('<img src="pteranodon.jpg" aria-details="details">');
62+
});
63+
5564
it('sanitizes srcset attributes', () => {
5665
expect(_sanitizeHtml(defaultDoc, '<img srcset="/foo.png 400px, javascript:evil() 23px">'))
5766
.toEqual('<img srcset="/foo.png 400px, unsafe:javascript:evil() 23px">');

0 commit comments

Comments
 (0)
Please sign in to comment.