Skip to content

Commit d1182cb

Browse files
authored
fix: [#1812] Incorrect cache match caused Element classList to return the wrong items (#1830)
1 parent 9e884df commit d1182cb

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

packages/happy-dom/src/dom/DOMTokenList.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ export default class DOMTokenList {
181181
* @param newToken NewToken.
182182
*/
183183
public replace(token: string, newToken: string): boolean {
184-
const list = this[PropertySymbol.getTokenList]();
184+
const list = this[PropertySymbol.getTokenList]().slice();
185185
const index = list.indexOf(token);
186186
if (index === -1) {
187187
return false;
@@ -241,14 +241,12 @@ export default class DOMTokenList {
241241
* @param tokens Tokens.
242242
*/
243243
public add(...tokens: string[]): void {
244-
const list = this[PropertySymbol.getTokenList]();
244+
const list = this[PropertySymbol.getTokenList]().slice();
245245

246246
for (const token of tokens) {
247247
const index = list.indexOf(token);
248248
if (index === -1) {
249249
list.push(token);
250-
} else {
251-
list[index] = token;
252250
}
253251
}
254252

@@ -264,7 +262,7 @@ export default class DOMTokenList {
264262
* @param tokens Tokens.
265263
*/
266264
public remove(...tokens: string[]): void {
267-
const list = this[PropertySymbol.getTokenList]();
265+
const list = this[PropertySymbol.getTokenList]().slice();
268266

269267
for (const token of tokens) {
270268
const index = list.indexOf(token);

packages/happy-dom/test/nodes/element/Element.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,18 @@ describe('Element', () => {
211211
expect(element.classList[0]).toBe('value1');
212212
expect(element.classList[1]).toBe('value2');
213213
});
214+
215+
it('Handles cache correctly (#1812)', () => {
216+
element.classList.add('foo', 'bar', 'baz');
217+
expect(element.outerHTML).toEqual('<div class="foo bar baz"></div>');
218+
element.className = '';
219+
element.classList.add('bar', 'baz');
220+
expect(element.outerHTML).toEqual('<div class="bar baz"></div>');
221+
element.classList.remove('baz');
222+
expect(element.outerHTML).toEqual('<div class="bar"></div>');
223+
element.classList.replace('bar', 'foo');
224+
expect(element.outerHTML).toEqual('<div class="foo"></div>');
225+
});
214226
});
215227

216228
describe('set classList()', () => {

0 commit comments

Comments
 (0)