Skip to content

Commit b2468c9

Browse files
Fix aria null values (#5097)
* fix: align aria null behavior between setting methods * fix: setAttribute string case * fix: revert missing stringify * fix: revert deletion * fix: revert setAttribute 'null' behavior change
1 parent 891f3fb commit b2468c9

File tree

5 files changed

+28
-11
lines changed

5 files changed

+28
-11
lines changed

packages/@lwc/engine-server/src/__tests__/fixtures/attribute-aria/dynamic/expected.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<template shadowrootmode="open">
1515
<div>
1616
</div>
17-
<x-grandchild aria-activedescendant="null" aria-atomic="null" aria-autocomplete="null" aria-braillelabel="null" aria-brailleroledescription="null" aria-busy="null" aria-checked="null" aria-colcount="null" aria-colindex="null" aria-colindextext="null" aria-colspan="null" aria-controls="null" aria-current="null" aria-describedby="null" aria-description="null" aria-details="null" aria-disabled="null" aria-errormessage="null" aria-expanded="null" aria-flowto="null" aria-haspopup="null" aria-hidden="null" aria-invalid="null" aria-keyshortcuts="null" aria-label="null" aria-labelledby="null" aria-level="null" aria-live="null" aria-modal="null" aria-multiline="null" aria-multiselectable="null" aria-orientation="null" aria-owns="null" aria-placeholder="null" aria-posinset="null" aria-pressed="null" aria-readonly="null" aria-relevant="null" aria-required="null" aria-roledescription="null" aria-rowcount="null" aria-rowindex="null" aria-rowindextext="null" aria-rowspan="null" aria-selected="null" aria-setsize="null" aria-sort="null" aria-valuemax="null" aria-valuemin="null" aria-valuenow="null" aria-valuetext="null" role="null">
17+
<x-grandchild>
1818
<template shadowrootmode="open">
1919
</template>
2020
</x-grandchild>
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<x-test aria-description="undefined" data-bar="null" data-foo="null" data-lwc-host-mutated="aria-description aria-label data-bar data-foo">
1+
<x-test aria-describedby="undefined" aria-label="null" aria-labelledby="undefined" data-bar-set-attribute="null" data-foo-set-attribute="null" data-lwc-host-mutated="aria-describedby aria-description aria-label aria-labelledby data-bar-set-attribute data-foo-set-attribute">
22
<template shadowrootmode="open">
33
</template>
44
</x-test>
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,25 @@
11
import { LightningElement } from 'lwc';
22

33
export default class extends LightningElement {
4+
isNull = null;
45
connectedCallback() {
5-
this.setAttribute('data-foo', 'foo');
6-
this.setAttribute('data-foo', null);
7-
this.setAttribute('data-bar', null);
6+
// Non-aria set attribute should be "null"
7+
this.setAttribute('data-foo-set-attribute', 'foo');
8+
this.setAttribute('data-foo-set-attribute', null);
9+
this.setAttribute('data-bar-set-attribute', null);
810

11+
// Aria null (the attribute should be absent)
12+
this.ariaDescription = 'awesome description';
13+
this.ariaDescription = null;
14+
15+
// Aria null setAttribute (the attribute should be "null")
916
this.setAttribute('aria-label', 'awesome label');
10-
this.ariaLabel = null;
11-
this.setAttribute('aria-description', 'awesome description');
12-
this.ariaDescription = undefined;
17+
this.setAttribute('aria-label', null);
18+
19+
// Aria undefined (the attribute should be "undefined")
20+
this.setAttribute('aria-describedby', 'awesome label');
21+
this.setAttribute('aria-describedby', undefined);
22+
this.ariaLabelledBy = 'id1';
23+
this.ariaLabelledBy = undefined;
1324
}
1425
}

packages/@lwc/engine-server/src/renderer.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,15 @@ function setProperty(node: N, propName: string, value: any): void {
227227
: removeAttribute(node, attrName);
228228
}
229229

230-
// Handle global html attributes and AOM.
231-
if (REFLECTIVE_GLOBAL_PROPERTY_SET.has(propName) || isAriaAttribute(attrName)) {
230+
if (isAriaAttribute(attrName)) {
231+
// TODO [#3284]: According to the spec, IDL nullable type values
232+
// (null and undefined) should remove the attribute; however, we
233+
// only do so in the case of null for historical reasons.
234+
return isNull(value)
235+
? removeAttribute(node, attrName)
236+
: setAttribute(node, attrName, value);
237+
} else if (REFLECTIVE_GLOBAL_PROPERTY_SET.has(propName)) {
238+
// Handle global html attributes and AOM.
232239
return setAttribute(node, attrName, value);
233240
}
234241
}

packages/@lwc/ssr-compiler/src/__tests__/utils/expected-failures.ts

-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
// We should slowly drive down these test failures or at least document where we expect the failures
99
// TODO [#4815]: enable all SSR v2 tests
1010
export const expectedFailures = new Set([
11-
'attribute-aria/dynamic/index.js',
1211
'attribute-class/with-scoped-styles-only-in-child/dynamic/index.js',
1312
'attribute-class/with-scoped-styles/dynamic/index.js',
1413
'attribute-global-html/as-component-prop/undeclared/index.js',

0 commit comments

Comments
 (0)