diff --git a/cjs/dom/token-list.js b/cjs/dom/token-list.js index 25f70f1d..b4999a7e 100644 --- a/cjs/dom/token-list.js +++ b/cjs/dom/token-list.js @@ -67,13 +67,16 @@ class DOMTokenList extends Set { * @param {boolean?} force */ toggle(token, force) { + // Web IDL optional boolean: omitted or undefined → plain toggle + if (arguments.length < 2 || force === undefined) + force = !this.has(token); if (this.has(token)) { if (force) return true; this.delete(token); update(this); } - else if (force || arguments.length === 1) { + else if (force) { super.add(token); update(this); return true; diff --git a/esm/dom/token-list.js b/esm/dom/token-list.js index 27c19ff7..e5b1c8ed 100644 --- a/esm/dom/token-list.js +++ b/esm/dom/token-list.js @@ -66,13 +66,16 @@ export class DOMTokenList extends Set { * @param {boolean?} force */ toggle(token, force) { + // Web IDL optional boolean: omitted or undefined → plain toggle + if (arguments.length < 2 || force === undefined) + force = !this.has(token); if (this.has(token)) { if (force) return true; this.delete(token); update(this); } - else if (force || arguments.length === 1) { + else if (force) { super.add(token); update(this); return true; diff --git a/test/html/element.js b/test/html/element.js index 3c3fedd8..561ed282 100644 --- a/test/html/element.js +++ b/test/html/element.js @@ -82,6 +82,17 @@ assert(node.classList.value, 'a c', 'correct .value again'); assert(node.classList.replace('b', 'c'), false, 'replace did not happen'); assert(node.classList.supports('whatever'), true, 'whatever'); +// #277: toggle(token, undefined) must match omitted force (plain toggle) +const tokenList = document.createElement('div'); +assert(tokenList.classList.toggle('foo', undefined), true, 'undefined force adds missing token'); +assert(tokenList.className, 'foo', 'undefined force added class'); +assert(tokenList.classList.toggle('foo', undefined), false, 'undefined force removes present token'); +assert(tokenList.className, '', 'undefined force removed class'); +tokenList.classList.toggle('bar', true); +assert(tokenList.classList.contains('bar'), true, 'force true adds'); +tokenList.classList.toggle('bar', false); +assert(tokenList.classList.contains('bar'), false, 'force false removes'); + assert(node.onclick, null, 'Level 0 events'); let args = null;