1use super::*;
4
5pub fn selftest() -> (usize, usize) {
8 let cases: &[(&str, &str)] = &[
9 ("1 + 2 * 3", "7"),
11 ("(1 + 2) * 3", "9"),
12 ("2 ** 10", "1024"),
13 ("7 % 3", "1"),
14 ("10 / 4", "2.5"),
15 ("true && false || true", "true"),
16 ("null ?? 'x'", "x"),
17 ("1 < 2 ? 'a' : 'b'", "a"),
18 ("var name='World'; `Hello, ${name}!`", "Hello, World!"),
22 ("`1+2=${1+2}`", "1+2=3"),
23 ("var a=1,b=2; `${a}-${b}-${a+b}`", "1-2-3"),
24 ("`no interpolation here`", "no interpolation here"),
25 ("``", ""),
26 ("`${'a'+'b'}${'c'}`", "abc"),
27 ("`x=${'{not a brace}'}`", "x={not a brace}"),
30 ("`obj=${JSON.stringify({a:1})}`", "obj={\"a\":1}"),
31 ("`outer ${`inner`}`", "outer inner"),
33 ("'a' + 'b' + 'c'", "abc"),
35 ("'Hello'.toUpperCase()", "HELLO"),
36 ("'a,b,c'.split(',').length", "3"),
37 ("' hi '.trim()", "hi"),
38 ("'abc'.slice(1)", "bc"),
39 ("var s = 0; for (var i = 1; i <= 5; i++) s += i; s", "15"),
41 ("let n = 0; while (n < 3) n++; n", "3"),
42 ("let x = 10; if (x > 5) { x = 1 } else { x = 2 } x", "1"),
43 (
46 "var out=''; outer: for(var i=0;i<3;i++){ for(var j=0;j<3;j++){ if(j===1) continue outer; out+=i+''+j; } } out",
47 "001020",
48 ),
49 (
50 "var found=null; outer: for(var i=0;i<3;i++){ for(var j=0;j<3;j++){ if(i===1&&j===1){ found=i+''+j; break outer; } } } found",
51 "11",
52 ),
53 (
56 "var out=''; for(var i=0;i<3;i++){ for(var j=0;j<3;j++){ if(j===1) break; out+=i+''+j; } } out",
57 "001020",
58 ),
59 ("var x=5; x > 0 ? 1 : 2", "1"),
62 ("2 ** 3 ** 2", "512"),
64 ("var a=0; a ||= 5; a", "5"),
66 ("var a=1; a ||= 5; a", "1"),
67 ("var a=1; a &&= 5; a", "5"),
68 ("var a=0; a &&= 5; a", "0"),
69 ("var a=null; a ??= 5; a", "5"),
70 ("var a=0; a ??= 5; a", "0"),
71 (
75 "var calls=0; function rhs(){calls++; return 9;} var a=1; a ||= rhs(); calls",
76 "0",
77 ),
78 (
79 "var calls=0; function rhs(){calls++; return 9;} var a=0; a &&= rhs(); calls",
80 "0",
81 ),
82 (
83 "var calls=0; function rhs(){calls++; return 9;} var a=5; a ??= rhs(); calls",
84 "0",
85 ),
86 (
88 "var calls=0; function rhs(){calls++; return 9;} var a=0; a ||= rhs(); calls+','+a",
89 "1,9",
90 ),
91 ("function add(a, b) { return a + b } add(3, 4)", "7"),
93 ("let f = (a, b) => a + b; f(5, 6)", "11"),
94 ("function fib(n){ return n < 2 ? n : fib(n-1) + fib(n-2) } fib(10)", "55"),
95 ("let mk = () => { let c = 0; return () => ++c }; let g = mk(); g(); g(); g()", "3"),
96 ("[1,2,3].map(x => x * 2).join(',')", "2,4,6"),
98 ("[1,2,3,4].filter(x => x % 2 === 0).join(',')", "2,4"),
99 ("[1,2,3,4].reduce((s, x) => s + x, 0)", "10"),
100 ("[3,1,2].sort((a,b) => a - b).join('')", "123"),
101 ("let a = [1]; a.push(2); a.push(3); a.length", "3"),
102 ("var o = {a:1, b:2}; o.a + o.b", "3"),
104 ("var o = {}; o['k'] = 9; o.k", "9"),
105 ("Object.keys({x:1, y:2, z:3}).length", "3"),
106 ("typeof undefinedVar", "undefined"),
108 ("typeof 42", "number"),
109 ("try { throw 'boom' } catch (e) { e }", "boom"),
110 ("JSON.stringify({x:[1,2], y:'z'})", "{\"x\":[1,2],\"y\":\"z\"}"),
112 ("JSON.parse('{\"n\":5}').n", "5"),
113 ("Math.max(3, 7, 2)", "7"),
115 ("Math.floor(3.9)", "3"),
116 ("Math.abs(-5)", "5"),
117 ("function f(x){ switch(x){ case 1: return 'one'; case 2: return 'two'; default: return 'other' } } f(2)", "two"),
119 ("function f(x){ switch(x){ case 1: return 'one'; default: return 'd' } } f(9)", "d"),
120 ("var r=''; switch(1){ case 1: r+='a'; case 2: r+='b'; break; case 3: r+='c' } r", "ab"),
121 ("var a=[1,2]; var b=[...a,3,4]; b.join(',')", "1,2,3,4"),
123 ("function sum(...xs){ return xs.reduce((s,x)=>s+x,0) } sum(1,2,3,4)", "10"),
124 ("function add(a,b,c){ return a+b+c } add(...[1,2,3])", "6"),
125 ("var o={a:1}; var p={...o, b:2}; p.a + p.b", "3"),
126 ("Math.max(...[5,2,9,1])", "9"),
127 ("function tail(first, ...rest){ return rest.join('-') } tail(1,2,3,4)", "2-3-4"),
128 ("var m=new Map(); m.set('a',1).set('b',2); m.get('a') + m.size", "3"),
130 ("var m=new Map([['x',10],['y',20]]); m.has('y') + ',' + m.get('y')", "true,20"),
131 ("var m=new Map(); m.set(1,'one'); m.delete(1); m.has(1)", "false"),
132 (
136 "try { new Map([1,2,3]); 'no throw'; } catch(e) { 'threw'; }",
137 "threw",
138 ),
139 (
140 "try { new Map(['ab']); 'no throw'; } catch(e) { 'threw'; }",
141 "threw",
142 ),
143 ("var s=new Set([1,2,2,3,3,3]); s.size", "3"),
145 ("var s=new Set(); s.add(5).add(5).add(6); s.has(5) + ',' + s.size", "true,2"),
146 ("var s=new Set([1,2,3]); var t=0; s.forEach(v=>t+=v); t", "6"),
147 ("[...new Set([1,1,2,3,3])].join(',')", "1,2,3"),
148 ("var {a, b} = {a:1, b:2}; a + b", "3"),
150 ("var {a: x, b: y} = {a:10, b:20}; x + y", "30"),
151 ("var {a, c = 9} = {a:1}; a + c", "10"),
152 ("var {a, ...rest} = {a:1, b:2, c:3}; rest.b + rest.c", "5"),
153 ("var {p: {q}} = {p:{q:42}}; q", "42"),
154 ("var [a, b] = [1, 2]; a + b", "3"),
156 ("var [a, , c] = [1, 2, 3]; a + c", "4"),
157 ("var [a, ...rest] = [1, 2, 3, 4]; rest.join('-')", "2-3-4"),
158 ("var [a = 5, b = 6] = [1]; a + b", "7"),
159 ("var [[a], [b]] = [[1],[2]]; a + b", "3"),
160 ("var t=0; for (const [k,v] of [['a',1],['b',2]]) t += v; t", "3"),
161 ("function f(a, b = 10) { return a + b } f(5)", "15"),
163 ("function f(a, b = 10) { return a + b } f(5, 7)", "12"),
164 ("function f({x, y}) { return x * y } f({x:3, y:4})", "12"),
166 ("function f([a, b]) { return a - b } f([9, 2])", "7"),
167 ("var k = 'dyn'; var o = {[k]: 99}; o.dyn", "99"),
169 ("var o = {['a' + 'b']: 1}; o.ab", "1"),
170 ("class A { constructor(x){ this.x = x } get(){ return this.x } } new A(7).get()", "7"),
172 ("class A { constructor(){ this.n = 0 } inc(){ this.n++; return this.n } } var a=new A(); a.inc(); a.inc()", "2"),
173 ("class P { area(){ return 0 } } class C extends P { area(){ return 5 } } new C().area()", "5"),
174 ("class A { constructor(x){ this.x = x } } class B extends A { constructor(x,y){ super(x); this.y = y } sum(){ return this.x + this.y } } new B(3,4).sum()", "7"),
176 ("class A { greet(){ return 'A' } } class B extends A { greet(){ return super.greet() + 'B' } } new B().greet()", "AB"),
177 ("class A { constructor(){ this.v = 1 } } class B extends A {} new B().v", "1"),
178 ("class C { x = 5; } new C().x", "5"),
180 ("class C { x; } typeof new C().x", "undefined"),
181 ("class C { x = 1; y = this.x + 1; } var c = new C(); c.x + ',' + c.y", "1,2"),
182 (
183 "class C { x = 1; constructor(){ this.x = this.x + 10 } } new C().x",
184 "11",
185 ),
186 (
187 "class A { x = 1; } class B extends A { y = 2; } var b = new B(); b.x + ',' + b.y",
188 "1,2",
189 ),
190 (
193 "class Counter { #n = 0; inc(){ this.#n++; return this.#n } } var c = new Counter(); c.inc(); c.inc()",
194 "2",
195 ),
196 (
197 "class C { #secret = 'hidden'; reveal(){ return this.#secret } } new C().reveal()",
198 "hidden",
199 ),
200 (
202 "class C { #double(n){ return n * 2 } calc(n){ return this.#double(n) } } new C().calc(21)",
203 "42",
204 ),
205 (
208 "class C { #x = 1; static has(o){ return #x in o; } } C.has(new C()) + ',' + C.has({})",
209 "true,false",
210 ),
211 ("class C { static count = 7; } C.count", "7"),
213 ("class M { static twice(n){ return n * 2 } } M.twice(21)", "42"),
215 ("class C { a(){ return 2 } b(){ return this.a() * 10 } } new C().b()", "20"),
217 ("await Promise.resolve(42)", "42"),
219 (
224 "await Promise.resolve({ then(resolve){ resolve(99); } })",
225 "99",
226 ),
227 (
228 "await { then(resolve){ resolve(7); } }",
229 "7",
230 ),
231 (
232 "try { await { then(resolve, reject){ reject('bad'); } } } catch(e) { e }",
233 "bad",
234 ),
235 (
238 "await { then(resolve){ resolve({ then(r){ r(5); } }); } }",
239 "5",
240 ),
241 (
245 "class MyThenable { then(resolve){ resolve(42); } } await new MyThenable()",
246 "42",
247 ),
248 (
249 "class MyThenable { then(_, reject){ reject('bad'); } } try { await new MyThenable() } catch(e) { e }",
250 "bad",
251 ),
252 ("await Promise.resolve(1).then(v => v + 1)", "2"),
253 ("await Promise.resolve(1).then(v => v + 1).then(v => v * 10)", "20"),
254 ("await Promise.reject('e').catch(e => 'caught:' + e)", "caught:e"),
255 ("async function f(){ return 7 } await f()", "7"),
256 ("async function f(){ let x = await Promise.resolve(10); return x * 2 } await f()", "20"),
257 ("async function f(){ try { await Promise.reject('x') } catch(e){ return 'C' + e } } await f()", "Cx"),
258 ("await (async () => 5)()", "5"),
259 ("await new Promise((res) => res(99))", "99"),
260 ("await new Promise((res, rej) => rej('bad')).catch(e => 'got:' + e)", "got:bad"),
261 ("await Promise.all([Promise.resolve(1), Promise.resolve(2), 3]).then(a => a.join(','))", "1,2,3"),
262 (
267 "await Promise.all([1, { then(r){ r(2); } }, Promise.resolve(3)]).then(a => a.join(','))",
268 "1,2,3",
269 ),
270 (
271 "await Promise.all([{ then(resolve, reject){ reject('bad'); } }]).catch(e => 'caught:' + e)",
272 "caught:bad",
273 ),
274 ("typeof Promise.resolve(1)", "object"),
275 ("var log=''; await Promise.resolve(1).finally(() => log = 'F'); log", "F"),
276 ("await Promise.resolve(1).finally(() => 2)", "1"),
278 (
281 "await Promise.resolve(1).finally(() => { throw 'x'; }).catch(e => 'caught:' + e)",
282 "caught:x",
283 ),
284 (
286 "await Promise.resolve(1).finally(() => Promise.reject('y')).catch(e => 'caught:' + e)",
287 "caught:y",
288 ),
289 (
291 "await Promise.reject('orig').finally(() => 'ignored').catch(e => 'caught:' + e)",
292 "caught:orig",
293 ),
294 ("async function sq(n){ return n*n } var s=0; for (const n of [1,2,3]) s += await sq(n); s", "14"),
295 ("function* g(){ yield 1; yield 2; yield 3 } [...g()].join(',')", "1,2,3"),
297 ("function* g(){ yield* [1,2]; yield 3 } [...g()].join(',')", "1,2,3"),
298 ("function* g(){ for (let i=0;i<3;i++) yield i*i } [...g()].join(',')", "0,1,4"),
299 ("function* g(){ yield 1; yield 2; yield 3 } var s=0; for (const v of g()) s += v; s", "6"),
300 ("function* g(){ yield 'a'; yield 'b' } var it=g(); it.next().value + it.next().value + it.next().done", "abtrue"),
301 ("function* g(){ yield 1; return 99; } var it=g(); it.next(); it.next().done", "true"),
302 ("function* nat(){ let i=0; while(true) yield i++; } var it=nat(); it.next().value + ',' + it.next().value + ',' + it.next().value", "0,1,2"),
304 ("function* nat(){ let i=1; while(true) yield i++; } var it=nat(); var s=0; for(let k=0;k<5;k++) s += it.next().value; s", "15"),
305 ("function* g(){ var a = yield 1; var b = yield a + 10; return a + b; } var it=g(); it.next(); var r1=it.next(5); var r2=it.next(100); r1.value + ',' + r2.value", "15,105"),
307 ("function* g(){ var x = yield 'first'; yield 'got:' + x; } var it=g(); it.next(); it.next('hello').value", "got:hello"),
308 ("function* inner(){ yield 1; yield 2; } function* outer(){ yield 0; yield* inner(); yield 3; } [...outer()].join(',')", "0,1,2,3"),
310 (
315 "async function* g(){ yield 1; yield 2; } typeof g().next().then",
316 "function",
317 ),
318 (
319 "async function* g(){ yield 1; yield 2; } var it = g(); await it.next().then(r => r.value + ',' + r.done)",
320 "1,false",
321 ),
322 (
323 "async function* g(){ yield await Promise.resolve(42); } var it = g(); await it.next().then(r => r.value)",
324 "42",
325 ),
326 ("function* g(){ yield* 'abc'; } [...g()].join('-')", "a-b-c"),
327 ("function* g(){ yield 1; yield 2; yield 3; } var it=g(); it.next(); var r=it.return(99); r.value + ',' + r.done + ',' + it.next().done", "99,true,true"),
329 ("var log=''; function* g(){ try { yield 1; } finally { log+='f'; } } var it=g(); it.next(); var r=it.return(99); r.value + ',' + r.done + ',' + log", "99,true,f"),
331 ("function* g(){ try { yield 1; } finally { return 42; } } var it=g(); it.next(); it.return(99).value", "42"),
333 ("var log=''; function* g(){ try { yield 1; } finally { log+='f'; yield 2; log+='end'; } } var it=g(); it.next(); var r1=it.return(99); var r2=it.next(); r1.value+','+r1.done+','+r2.value+','+r2.done+','+log", "2,false,99,true,ffend"),
339 ("var log=''; function* g(){ log+='a'; yield 1; log+='b'; yield 2; } var it=g(); it.next(); it.next(); log", "aab"),
343 ("function* g(){ yield 1; yield 2; yield 3; } Array.from(g()).join(',')", "1,2,3"),
345 ("function* g(){ yield 1; yield 2; yield 3; } Array.from(g(), x => x * 10).join(',')", "10,20,30"),
346 ("function* g(){ try { yield 1; yield 2; } finally { } yield 3; } [...g()].join(',')", "1,2,3"),
348 ("var custom = { [Symbol.match](s) { return s === 'hello' ? 'yes' : 'no'; } }; 'hello'.match(custom) + ',' + 'world'.match(custom)", "yes,no"),
350 ("var custom = { [Symbol.replace](s, r) { return s + '-' + r; } }; 'abc'.replace(custom, '123')", "abc-123"),
351 ("var custom = { [Symbol.search](s) { return s.length; } }; 'abc'.search(custom)", "3"),
352 ("var custom = { [Symbol.split](s, lim) { return [s.length, lim]; } }; 'abc'.split(custom, 5).join(',')", "3,5"),
353 ("typeof /a/[Symbol.match]", "function"),
355 ("/b/[Symbol.match]('abc').join(',')", "b"),
356 ("/b/[Symbol.replace]('abc', 'X')", "aXc"),
357 ("/b/[Symbol.search]('abc')", "1"),
358 ("/b/[Symbol.split]('abc').join(',')", "a,c"),
359 ("Array[Symbol.species] === Array", "true"),
361 ("RegExp[Symbol.species] === RegExp", "true"),
362 ("Promise[Symbol.species] === Promise", "true"),
363 ("class SubArr extends Array {}; const sa = new SubArr(1, 2, 3); sa.map(x => x*2) instanceof SubArr", "true"),
365 ("class SubArr extends Array {}; const sa = new SubArr(1, 2, 3); sa.filter(x => x > 1) instanceof SubArr", "true"),
366 ("class SubArr extends Array {}; const sa = new SubArr(1, 2, 3); sa.slice(1) instanceof SubArr", "true"),
367 ("class SubArr extends Array {}; const sa = new SubArr(1, 2, 3); sa.concat([4]) instanceof SubArr", "true"),
368 ("class SubArr extends Array {}; const sa = new SubArr(1, 2, 3); sa.splice(1, 1) instanceof SubArr", "true"),
369 ("class SubArr extends Array {}; const sa = new SubArr(1, 2, 3); sa.flatMap(x => [x]) instanceof SubArr", "true"),
370 ("class CustomArr extends Array { static get [Symbol.species]() { return Array; } }; const ca = new CustomArr(1, 2); !(ca.map(x => x) instanceof CustomArr) && ca.map(x => x) instanceof Array", "true"),
371 ("Array.prototype[Symbol.unscopables].includes", "true"),
373 ("Array.prototype[Symbol.unscopables].at", "true"),
374 ("var x=0; await new Promise(r => setTimeout(() => { x = 5; r(); }, 0)); x", "5"),
376 ("var done=false; await new Promise(r => setTimeout(() => { done = true; r(); }, 0)); done", "true"),
377 ("await new Promise(res => setTimeout(() => res(7), 0))", "7"),
378 ("typeof requestAnimationFrame", "function"),
380 ("var x=0; await new Promise(r => requestAnimationFrame(() => { x = 5; r(); })); x", "5"),
381 ("var ty=''; await new Promise(r => requestAnimationFrame(t => { ty = typeof t; r(); })); ty", "number"),
382 ("var L=''; requestAnimationFrame(() => L+='a'); var id=requestAnimationFrame(() => L+='b'); cancelAnimationFrame(id); await new Promise(r => requestAnimationFrame(() => r())); L", "a"),
383 ("localStorage.clear(); localStorage.setItem('a','1'); localStorage.getItem('a')", "1"),
385 ("localStorage.clear(); localStorage.getItem('missing')", "null"),
386 ("localStorage.clear(); localStorage.setItem('x','9'); localStorage.length", "1"),
387 ("localStorage.clear(); localStorage.setItem('a','1'); localStorage.removeItem('a'); localStorage.getItem('a')", "null"),
388 ("localStorage.clear(); localStorage.foo='bar'; localStorage.getItem('foo')", "bar"),
389 ("sessionStorage.clear(); sessionStorage.setItem('s','2'); sessionStorage.getItem('s')", "2"),
390 (
393 "localStorage.clear(); localStorage.foo='bar'; delete localStorage.foo; localStorage.getItem('foo')",
394 "null",
395 ),
396 (
399 "localStorage.clear(); localStorage.setItem('a','1'); localStorage.setItem('b','2'); Object.keys(localStorage).sort().join(',')",
400 "a,b",
401 ),
402 (
403 "localStorage.clear(); localStorage.setItem('a','1'); localStorage.setItem('b','2'); Object.values(localStorage).sort().join(',')",
404 "1,2",
405 ),
406 (
407 "localStorage.clear(); localStorage.setItem('a','1'); Object.entries(localStorage)[0].join(':')",
408 "a:1",
409 ),
410 (
411 "localStorage.clear(); localStorage.setItem('a','1'); localStorage.setItem('b','2'); var out=[]; for (var k in localStorage) out.push(k); out.sort().join(',')",
412 "a,b",
413 ),
414 (
415 "localStorage.clear(); localStorage.setItem('a','1'); Object.assign({}, localStorage).a",
416 "1",
417 ),
418 (
422 "var e=document.createElement('div'); e.dataset.userId='42'; e.dataset.fooBar='x'; Object.keys(e.dataset).sort().join(',')",
423 "fooBar,userId",
424 ),
425 (
426 "var e=document.createElement('div'); e.dataset.a='1'; e.dataset.b='2'; Object.values(e.dataset).sort().join(',')",
427 "1,2",
428 ),
429 (
430 "var e=document.createElement('div'); e.dataset.a='1'; Object.entries(e.dataset)[0].join(':')",
431 "a:1",
432 ),
433 (
434 "var e=document.createElement('div'); e.dataset.a='1'; e.dataset.b='2'; var out=[]; for (var k in e.dataset) out.push(k); out.sort().join(',')",
435 "a,b",
436 ),
437 (
438 "var e=document.createElement('div'); e.dataset.a='1'; Object.assign({}, e.dataset).a",
439 "1",
440 ),
441 (
445 "function tag(s, ...v){ return s.join('|') + '::' + v.join(','); } tag`a${1}b${2}c`",
446 "a|b|c::1,2",
447 ),
448 (
449 "var o={ tag(s){ return this===o ? s[0] : 'bad'; } }; o.tag`hi`",
450 "hi",
451 ),
452 ("String.raw`a\\nb`", "a\\nb"),
453 ("String.raw`x${1+1}y`", "x2y"),
454 (
456 "function tag(s){ return s[0] + '|' + s.raw[0]; } tag`a\\nb`",
457 "a\nb|a\\nb",
458 ),
459 ("Object.is(NaN, NaN)", "true"),
462 ("NaN === NaN", "false"),
463 ("Object.is(0, -0)", "false"),
464 ("0 === -0", "true"),
465 ("Object.is(1, 1)", "true"),
466 ("Object.is('a', 'a')", "true"),
467 ("Object.is({}, {})", "false"),
468 (
471 "var o={}; var p={x:1}; Reflect.setPrototypeOf(o,p); o.x",
472 "1",
473 ),
474 ("var o={}; Reflect.isExtensible(o)", "true"),
475 (
476 "var o={}; Reflect.preventExtensions(o); Reflect.isExtensible(o)",
477 "false",
478 ),
479 (
480 "Reflect.getOwnPropertyDescriptor({x:1}, 'x').value",
481 "1",
482 ),
483 ("[1,2,3,4,5].fill(0,1,3).join(',')", "1,0,0,4,5"),
486 ("[1,2,3,4,5].fill(9).join(',')", "9,9,9,9,9"),
487 ("[1,2,3,4,5].fill(0,-2).join(',')", "1,2,3,0,0"),
488 ("[1,2,3].fill(0,1).join(',')", "1,0,0"),
489 ("[1,2,3,2,1].indexOf(2, 2)", "3"),
492 ("[1,2,3].indexOf(1, 1)", "-1"),
493 ("[1,2,3].indexOf(2, -2)", "1"),
494 ("[1,2,3].includes(1, 1)", "false"),
495 ("[1,2,3].includes(2, 1)", "true"),
496 ("[1,2,1,2,1].lastIndexOf(2, 2)", "1"),
498 ("[1,2,3].lastIndexOf(3, 1)", "-1"),
499 ("[1,2,3].lastIndexOf(1, -1)", "0"),
500 ("[1,2,3,2].lastIndexOf(2)", "3"),
501 ("[5,1,2].lastIndexOf(5, NaN)", "0"),
504 ("[5,1,2].lastIndexOf(1, NaN)", "-1"),
505 ("new URLSearchParams('a=1&b=2').get('a')", "1"),
507 ("new URLSearchParams('?a=1&b=2').get('b')", "2"),
508 ("new URLSearchParams('a=1&a=2').getAll('a').join(',')", "1,2"),
509 ("new URLSearchParams('a=1').has('a') + ',' + new URLSearchParams('a=1').has('z')", "true,false"),
510 ("var p=new URLSearchParams('a=1'); p.append('b','2'); p.toString()", "a=1&b=2"),
511 ("var p=new URLSearchParams('a=1&b=2'); p.delete('a'); p.toString()", "b=2"),
512 ("var p=new URLSearchParams('a=1'); p.set('a','9'); p.get('a')", "9"),
513 ("new URLSearchParams([['a','1'],['b','2']]).toString()", "a=1&b=2"),
517 ("new URLSearchParams({a:'1',b:'2'}).toString()", "a=1&b=2"),
518 (
519 "var p1=new URLSearchParams('a=1&b=2'); new URLSearchParams(p1).toString()",
520 "a=1&b=2",
521 ),
522 ("new URLSearchParams('a=hello%20world').get('a')", "hello world"),
524 ("new URLSearchParams('a=hello+world').get('a')", "hello world"),
525 ("var p=new URLSearchParams(); p.set('a','hello world'); p.toString()", "a=hello+world"),
526 ("var p=new URLSearchParams(); p.set('a','a&b=c'); p.get('a')", "a&b=c"),
527 (
530 "[...new URLSearchParams('a=1&b=2').entries()].map(e=>e[0]+':'+e[1]).join(',')",
531 "a:1,b:2",
532 ),
533 ("new URLSearchParams('a=1&b=2').keys().join(',')", "a,b"),
534 ("new URLSearchParams('a=1&b=2').values().join(',')", "1,2"),
535 (
536 "var s=''; new URLSearchParams('a=1&b=2').forEach(function(v,k){ s+=k+'='+v+';'; }); s",
537 "a=1;b=2;",
538 ),
539 (
542 "var out=[]; for (const [k,v] of new URLSearchParams('a=1&b=2')) out.push(k+':'+v); out.join(',')",
543 "a:1,b:2",
544 ),
545 (
546 "var fd=new FormData(); fd.set('x','9'); var out=[]; for (const [k,v] of fd) out.push(k+':'+v); out.join(',')",
547 "x:9",
548 ),
549 ("new URLPattern('/users/:id').test('/users/123')", "true"),
551 ("new URLPattern({ pathname: '/about' }).test('/about')", "true"),
552 ("new URLPattern('/users/:id').exec('/users/123').pathname.input", "/users/123"),
553 ("new URLPattern('/admin/*').test('/users/123')", "false"),
554 ("encodeURIComponent('hello world')", "hello%20world"),
556 ("encodeURIComponent('a=1&b=2')", "a%3D1%26b%3D2"),
557 ("decodeURIComponent('hello%20world')", "hello world"),
558 ("decodeURIComponent(encodeURIComponent('日本語'))", "日本語"),
559 ("encodeURIComponent(\"!'()*\")", "!'()*"),
560 ("encodeURI('https://example.com/a b?x=1&y=2')", "https://example.com/a%20b?x=1&y=2"),
562 ("decodeURI('https://example.com/a%20b')", "https://example.com/a b"),
563 ("escape('a b?c')", "a%20b%3Fc"),
565 ("unescape(escape('a b?c'))", "a b?c"),
566 ("escape('日')", "%u65E5"),
568 ("unescape('%u65E5')", "日"),
569 ("'hi'.bold()", "<b>hi</b>"),
571 ("'hi'.italics()", "<i>hi</i>"),
572 ("'hi'.big()", "<big>hi</big>"),
573 ("'hi'.small()", "<small>hi</small>"),
574 ("'hi'.strike()", "<strike>hi</strike>"),
575 ("'hi'.sub()", "<sub>hi</sub>"),
576 ("'hi'.sup()", "<sup>hi</sup>"),
577 ("'hi'.fixed()", "<tt>hi</tt>"),
578 ("'hi'.blink()", "<blink>hi</blink>"),
579 ("'hi'.anchor('top')", "<a name=\"top\">hi</a>"),
580 ("'hi'.link('x.html')", "<a href=\"x.html\">hi</a>"),
581 ("'hi'.fontcolor('red')", "<font color=\"red\">hi</font>"),
582 ("'hi'.fontsize(3)", "<font size=\"3\">hi</font>"),
583 ("'hi'.anchor('a\"b')", "<a name=\"a"b\">hi</a>"),
585 ("' hi '.trimLeft()", "hi "),
588 ("' hi '.trimRight()", " hi"),
589 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); f.get('a')", "1"),
591 ("var f=new FormData(); f.append('a','1'); f.append('a','2'); f.getAll('a').join(',')", "1,2"),
592 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); f.toString()", "a=1&b=2"),
593 ("var f=new FormData(); f.append('a','1'); f.set('a','9'); f.get('a')", "9"),
594 ("var f=new FormData(); f.append('a','1'); f.has('a')+','+f.has('z')", "true,false"),
595 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); f.entries().map(function(e){return e[0]+'='+e[1]}).join('&')", "a=1&b=2"),
596 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); f.keys().join(',')", "a,b"),
597 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); var s=''; f.forEach(function(v,k){s+=k+':'+v+';'}); s", "a:1;b:2;"),
598 ("new URL('https://e.com/p?x=1#h').pathname", "/p"),
600 ("new URL('https://e.com/p?x=1').searchParams.get('x')", "1"),
601 ("new URL('/a/b', 'https://e.com/x/y').href", "https://e.com/a/b"),
607 ("new URL('c', 'https://e.com/a/b').href", "https://e.com/a/c"),
608 ("new URL('https://user:pass@example.com/p').hostname", "example.com"),
612 ("new URL('https://user:pass@example.com/p').username", "user"),
613 ("new URL('https://user:pass@example.com/p').password", "pass"),
614 ("new URL('https://user:pass@example.com/p').origin", "https://example.com"),
615 ("new URL('https://example.com/p').username", ""),
617 (
621 "var u=new URL('https://a.com/x'); u.href='https://b.com/y?z=1'; u.hostname",
622 "b.com",
623 ),
624 (
625 "var u=new URL('https://a.com/x'); u.href='https://b.com/y?z=1'; u.pathname",
626 "/y",
627 ),
628 (
629 "var u=new URL('https://a.com/x'); u.href='https://b.com/y?z=1'; u.searchParams.get('z')",
630 "1",
631 ),
632 (
633 "var u=new URL('https://a.com/x'); var u2=u; u.href='https://b.com/y'; u2.href",
636 "https://b.com/y",
637 ),
638 (
643 "var u=new URL('https://a.com/x'); u.pathname='y'; u.href",
644 "https://a.com/y",
645 ),
646 (
647 "var u=new URL('https://a.com/x'); u.search='z=1'; u.href",
648 "https://a.com/x?z=1",
649 ),
650 (
651 "var u=new URL('https://a.com/x'); u.search='z=1'; u.searchParams.get('z')",
652 "1",
653 ),
654 (
655 "var u=new URL('https://a.com/x?old=1'); u.search='new=2'; u.href",
656 "https://a.com/x?new=2",
657 ),
658 (
659 "var u=new URL('https://a.com/x'); u.hash='frag'; u.href",
660 "https://a.com/x#frag",
661 ),
662 (
663 "var u=new URL('https://a.com/x?y=1#z'); u.search=''; u.hash=''; u.href",
665 "https://a.com/x",
666 ),
667 (
672 "var u=new URL('https://a.com:8080/x'); u.hostname='b.com'; u.href",
673 "https://b.com:8080/x",
674 ),
675 (
676 "var u=new URL('https://a.com:8080/x'); u.hostname='b.com'; u.origin",
677 "https://b.com:8080",
678 ),
679 (
680 "var u=new URL('https://a.com/x'); u.port='9090'; u.host",
681 "a.com:9090",
682 ),
683 (
684 "var u=new URL('https://a.com:8080/x'); u.host='c.com:7070'; u.hostname + ',' + u.port",
685 "c.com,7070",
686 ),
687 (
688 "var u=new URL('http://a.com/x'); u.protocol='https'; u.href",
689 "https://a.com/x",
690 ),
691 ("new URL('?x=2', 'https://e.com/a/b?x=1').href", "https://e.com/a/b?x=2"),
695 ("new URL('#frag', 'https://e.com/a/b?x=1').href", "https://e.com/a/b?x=1#frag"),
696 ("new URL('//cdn.example.com/x.js', 'https://e.com/a/b').href", "https://cdn.example.com/x.js"),
700 ("URL.canParse('https://example.com')", "true"),
702 ("URL.canParse('not a url')", "false"),
703 ("URL.canParse('/path', 'https://example.com')", "true"),
704 ("URL.canParse('/path')", "false"),
705 ("URL.parse('https://example.com/p').pathname", "/p"),
708 ("URL.parse('not a url') === null", "true"),
709 ("URL.parse('/path', 'https://example.com').host", "example.com"),
710 ("URL.parse('/path') === null", "true"),
711 ("URL.createObjectURL(new Blob(['x'])).startsWith('blob:')", "true"),
713 (
715 "URL.createObjectURL(new Blob(['x'])) === URL.createObjectURL(new Blob(['x']))",
716 "false",
717 ),
718 ("typeof URL.revokeObjectURL('blob:x')", "undefined"),
719 ("new URLSearchParams('a=1&b=2').size", "2"),
721 (
722 "var p=new URLSearchParams('a=1'); p.append('b','2'); p.size",
723 "2",
724 ),
725 (
726 "var p=new URLSearchParams('a=1&b=2'); p.delete('a'); p.size",
727 "1",
728 ),
729 ("new URLSearchParams('').size", "0"),
730 ("new URLSearchParams('a=1&a=2').has('a', '1')", "true"),
733 ("new URLSearchParams('a=1&a=2').has('a', '9')", "false"),
734 (
735 "var p=new URLSearchParams('a=1&a=2'); p.delete('a','1'); p.getAll('a').join(',')",
736 "2",
737 ),
738 (
739 "var p=new URLSearchParams('a=1&a=2'); p.delete('a'); p.getAll('a').join(',')",
740 "",
741 ),
742 (
744 "var p=new URLSearchParams('c=3&a=1&b=2'); p.sort(); p.toString()",
745 "a=1&b=2&c=3",
746 ),
747 (
748 "var p=new URLSearchParams('b=2&a=1&a=0'); p.sort(); p.getAll('a').join(',')",
749 "1,0",
750 ),
751 (
754 "var u=new URL('https://e.com/p?x=1'); u.searchParams.set('x','9'); u.toString()",
755 "https://e.com/p?x=9",
756 ),
757 (
758 "var u=new URL('https://e.com/p'); u.searchParams.append('a','1'); u.searchParams.append('b','2'); u.toString()",
759 "https://e.com/p?a=1&b=2",
760 ),
761 (
762 "var u=new URL('https://e.com/p?x=1#h'); u.searchParams.delete('x'); u.toString()",
763 "https://e.com/p#h",
764 ),
765 (
769 "JSON.stringify({u: new URL('https://e.com/p?x=1')})",
770 "{\"u\":\"https://e.com/p?x=1\"}",
771 ),
772 ("btoa('hello')", "aGVsbG8="),
774 ("atob('aGVsbG8=')", "hello"),
775 ("atob(btoa('AtmOS roundtrip'))", "AtmOS roundtrip"),
776 ("navigator.platform", "AtmOS"),
778 ("typeof navigator.userAgent", "string"),
779 ("navigator.onLine", "true"),
780 ("navigator.cookieEnabled", "true"),
783 ("navigator.hardwareConcurrency", "4"),
784 ("navigator.maxTouchPoints", "0"),
785 ("navigator.languages[0]", "ja-JP"),
786 ("navigator.webdriver", "false"),
787 (
791 "navigator.userAgentData.brands[0].brand + ',' + navigator.userAgentData.mobile + ',' + \
792 navigator.userAgentData.platform",
793 "AtmOSBrowser,false,AtmOS",
794 ),
795 (
796 "await navigator.userAgentData.getHighEntropyValues(['architecture','bitness']).then(v => \
797 v.architecture + ',' + v.bitness + ',' + v.platform)",
798 "arm,64,AtmOS",
799 ),
800 (
805 "await navigator.storage.estimate().then(e => typeof e.usage + ',' + typeof e.quota)",
806 "number,number",
807 ),
808 ("await navigator.storage.persist()", "true"),
809 ("await navigator.storage.persisted()", "true"),
810 ("typeof performance.now()", "number"),
811 ("performance.mark('a').entryType", "mark"),
815 (
816 "performance.mark('s1'); performance.mark('e1'); \
817 performance.measure('m1','s1','e1').entryType",
818 "measure",
819 ),
820 ("typeof performance.timeOrigin", "number"),
825 ("performance.timeOrigin >= 0", "true"),
826 (
829 "performance.mark('ge1'); performance.getEntries().some(e => e.name === 'ge1')",
830 "true",
831 ),
832 ("performance.mark('a'); performance.getEntriesByType('mark').length > 0", "true"),
833 ("performance.mark('a'); performance.getEntriesByName('a', 'mark').length", "1"),
834 (
835 "performance.mark('to-clear'); performance.clearMarks('to-clear'); \
836 performance.getEntriesByName('to-clear').length",
837 "0",
838 ),
839 (
840 "performance.mark('sX'); performance.mark('eX'); \
841 performance.measure('mX','sX','eX'); performance.clearMeasures(); \
842 performance.getEntriesByType('measure').length",
843 "0",
844 ),
845 (
848 "let got; new PerformanceObserver((list) => { got = list.getEntries()[0].name; }) \
849 .observe({entryTypes:['mark']}); performance.mark('obs1'); got",
850 "obs1",
851 ),
852 (
853 "let n = 0; new PerformanceObserver((list) => { n += list.getEntries().length; }) \
854 .observe({entryTypes:['measure']}); performance.mark('s2'); \
855 performance.mark('e2'); performance.measure('m2','s2','e2'); n",
856 "1",
857 ),
858 (
859 "let hit = false; let ob = new PerformanceObserver(() => { hit = true; }); \
860 ob.observe({entryTypes:['mark']}); ob.disconnect(); performance.mark('after-disconnect'); hit",
861 "false",
862 ),
863 (
866 "PerformanceObserver.supportedEntryTypes.join(',')",
867 "mark,measure",
868 ),
869 (
874 "let got; new PerformanceObserver((list) => { got = list.getEntries()[0].name; }) \
875 .observe({type:'mark'}); performance.mark('obs2'); got",
876 "obs2",
877 ),
878 (
879 "performance.mark('pre-existing'); let got=null; \
880 new PerformanceObserver((list) => { got = list.getEntries()[0].name; }) \
881 .observe({type:'mark', buffered:true}); got",
882 "pre-existing",
883 ),
884 (
885 "let n=0; new PerformanceObserver((list) => { n += list.getEntries().length; }) \
886 .observe({type:'mark'}); n",
887 "0",
888 ),
889 (
892 "let mc = new MessageChannel(); let got; \
893 mc.port2.onmessage = e => { got = e.data; }; \
894 mc.port1.postMessage('hi'); got",
895 "hi",
896 ),
897 (
898 "let mc2 = new MessageChannel(); let n = 0; \
899 mc2.port2.addEventListener('message', e => { n += e.data; }); \
900 mc2.port1.postMessage(1); mc2.port1.postMessage(2); n",
901 "3",
902 ),
903 (
904 "let mc3 = new MessageChannel(); let hit = false; \
905 mc3.port2.onmessage = () => { hit = true; }; \
906 mc3.port2.close(); mc3.port1.postMessage('x'); hit",
907 "false",
908 ),
909 (
912 "let a1 = new BroadcastChannel('ch'); let b1 = new BroadcastChannel('ch'); \
913 let got; b1.onmessage = e => { got = e.data; }; \
914 a1.postMessage('hi'); got",
915 "hi",
916 ),
917 (
918 "let a2 = new BroadcastChannel('ch2'); let selfHit = false; \
919 a2.onmessage = () => { selfHit = true; }; \
920 a2.postMessage('x'); selfHit",
921 "false",
922 ),
923 (
924 "let a3 = new BroadcastChannel('chX'); let b3 = new BroadcastChannel('chY'); \
925 let hit = false; b3.onmessage = () => { hit = true; }; \
926 a3.postMessage('x'); hit",
927 "false",
928 ),
929 ("typeof screen.width", "number"),
933 ("screen.width === window.innerWidth", "true"),
934 ("screen.availHeight === screen.height", "true"),
935 ("screen.colorDepth", "24"),
936 ("screen.orientation.type", "landscape-primary"),
937 ("window.screen === screen", "true"),
938 (
941 "typeof screen.orientation.lock('portrait-primary').then",
942 "function",
943 ),
944 (
945 "screen.orientation.lock('portrait-primary'); screen.orientation.type",
946 "portrait-primary",
947 ),
948 (
949 "screen.orientation.lock('portrait-primary'); screen.orientation.unlock(); \
950 screen.orientation.type",
951 "landscape-primary",
952 ),
953 (
957 "let got; window.onerror = (msg) => { got = msg; }; \
958 reportError(new Error('boom')); got",
959 "boom",
960 ),
961 (
962 "let ev; window.addEventListener('error', e => { ev = e; }); \
963 reportError(new Error('e2')); ev.error.message",
964 "e2",
965 ),
966 ("typeof reportError('plain string')", "undefined"),
967 ("confirm('are you sure?')", "true"),
973 ("window.confirm('are you sure?')", "true"),
974 ("prompt('name?', 'bob')", "bob"),
975 ("window.prompt('name?')", "null"),
976 ("typeof open", "function"),
981 ("open('https://example.com')", "null"),
982 ("window.open('https://example.com', '_blank')", "null"),
983 ("typeof close", "function"),
984 ("close(); window.close(); 'ok'", "ok"),
985 ("typeof stop", "function"),
989 ("stop(); window.stop(); 'ok'", "ok"),
990 ("typeof focus", "function"),
991 ("focus(); window.focus(); blur(); window.blur(); 'ok'", "ok"),
992 ("typeof window.getSelection", "function"),
999 ("typeof getSelection", "function"),
1000 ("window.getSelection().toString()", ""),
1001 ("self === window", "true"),
1007 ("window.top === window", "true"),
1008 ("parent === window", "true"),
1009 ("window.frames === window", "true"),
1010 ("typeof window.name", "string"),
1011 (
1015 "document.createElement('iframe').contentWindow === window",
1016 "true",
1017 ),
1018 (
1019 "document.createElement('iframe').contentDocument === document",
1020 "true",
1021 ),
1022 (
1023 "document.createElement('div').contentWindow",
1024 "undefined",
1025 ),
1026 (
1030 "document.createElement('object').contentDocument === document",
1031 "true",
1032 ),
1033 (
1034 "document.createElement('object').contentWindow",
1035 "undefined",
1036 ),
1037 ("typeof navigator.sendBeacon", "function"),
1041 ("navigator.sendBeacon('data:,x')", "true"),
1042 ("navigator.sendBeacon('data:,x', 'payload')", "true"),
1043 (
1046 "var e=document.createElement('div'); e.setAttribute('id','x'); \
1047 e.setAttribute('class','a b'); e.innerHTML='hi2'; \
1048 new XMLSerializer().serializeToString(e) === e.outerHTML",
1049 "true",
1050 ),
1051 (
1052 "var e=document.createElement('span'); e.textContent='z'; \
1053 new XMLSerializer().serializeToString(e) === e.outerHTML",
1054 "true",
1055 ),
1056 ("typeof new XMLSerializer().serializeToString", "function"),
1057 (
1061 "await navigator.clipboard.writeText('hello'); await navigator.clipboard.readText()",
1062 "hello",
1063 ),
1064 ("typeof navigator.clipboard.writeText('x')", "object"),
1065 ("[10,20,30].at(-1)", "30"),
1067 ("[10,20,30].at(0)", "10"),
1068 ("[1,2,3].flatMap(x => [x, x*10]).join(',')", "1,10,2,20,3,30"),
1069 ("[1,2,3,4].findLast(x => x % 2 === 1)", "3"),
1070 ("[1,2,3,4].findLastIndex(x => x % 2 === 0)", "3"),
1071 ("'hello'.at(-1)", "o"),
1073 ("'hello'.at(1)", "e"),
1074 ("'hello world'.includes('world')", "true"),
1076 ("'hello'.startsWith('he')", "true"),
1077 ("'hello'.endsWith('lo')", "true"),
1078 (
1083 "try { 'x'.includes(/x/); 'no-throw' } catch(e) { 'threw' }",
1084 "threw",
1085 ),
1086 (
1087 "try { 'x'.startsWith(/x/); 'no-throw' } catch(e) { 'threw' }",
1088 "threw",
1089 ),
1090 (
1091 "try { 'x'.endsWith(/x/); 'no-throw' } catch(e) { 'threw' }",
1092 "threw",
1093 ),
1094 ("(await Promise.allSettled([Promise.resolve(1), Promise.reject('e')])).map(r => r.status).join(',')", "fulfilled,rejected"),
1096 ("await Promise.race([Promise.resolve('first'), Promise.resolve('second')])", "first"),
1097 ("await Promise.any([Promise.reject('x'), Promise.resolve('ok')])", "ok"),
1098 (
1101 "(await Promise.allSettled([{ then(r){ r(1); } }, { then(_,rj){ rj('e'); } }])).map(r => r.status).join(',')",
1102 "fulfilled,rejected",
1103 ),
1104 (
1105 "await Promise.race([{ then(r){ r('first'); } }, Promise.resolve('second')])",
1106 "first",
1107 ),
1108 (
1109 "await Promise.any([{ then(_,rj){ rj('x'); } }, { then(r){ r('ok'); } }])",
1110 "ok",
1111 ),
1112 ("new TextEncoder().encode('Hi').join(',')", "72,105"),
1114 ("new TextDecoder().decode([72,105])", "Hi"),
1115 ("new TextDecoder().decode(new TextEncoder().encode('AtmOS'))", "AtmOS"),
1116 ("new TextDecoder('utf-16le').encoding", "utf-16le"),
1119 ("new TextDecoder('utf-16be').encoding", "utf-16be"),
1120 ("new TextDecoder('utf-16le').decode([0x48,0x00,0x69,0x00])", "Hi"),
1122 ("new TextDecoder('utf-16be').decode([0x00,0x48,0x00,0x69])", "Hi"),
1123 ("new TextDecoder('utf-16').encoding", "utf-16le"),
1124 (
1129 "var d=new TextDecoder(); d.decode(new Uint8Array([0xE2,0x82]), {stream:true}) + \
1130 d.decode(new Uint8Array([0xAC]))",
1131 "€",
1132 ),
1133 ("new TextDecoder().decode(new Uint8Array([0xE2,0x82]))", "\u{FFFD}"),
1136 ("crypto.randomUUID().length", "36"),
1138 ("crypto.randomUUID().charAt(14)", "4"),
1139 ("crypto.getRandomValues([0,0,0]).length", "3"),
1140 (
1145 "crypto.getRandomValues(new Uint16Array(200)).some(v => v > 255)",
1146 "true",
1147 ),
1148 (
1150 "crypto.getRandomValues(new Uint8Array(50)).every(v => v >= 0 && v <= 255)",
1151 "true",
1152 ),
1153 ("var o={a:{b:1}}; var c=structuredClone(o); o.a.b=9; c.a.b", "1"),
1155 ("structuredClone([1,[2,3]])[1][0]", "2"),
1156 (
1162 "var c=structuredClone(new TypeError('x')); c instanceof Error && c instanceof TypeError",
1163 "true",
1164 ),
1165 ("structuredClone(new Error('boom')).message", "boom"),
1166 ("structuredClone(new TypeError('x')).stack", "TypeError: x"),
1167 (
1172 "try { structuredClone(function(){}); 'no-throw' } catch(e) { e.name }",
1173 "DataCloneError",
1174 ),
1175 (
1176 "try { structuredClone({fn: () => 1}); 'no-throw' } catch(e) { e.name }",
1177 "DataCloneError",
1178 ),
1179 ("structuredClone({a: 1, b: [2, 3]}).a", "1"),
1180 (
1188 "try { structuredClone(new URLSearchParams('a=1')); 'no-throw' } catch(e) { e.name }",
1189 "DataCloneError",
1190 ),
1191 (
1192 "try { structuredClone(new FormData()); 'no-throw' } catch(e) { e.name }",
1193 "DataCloneError",
1194 ),
1195 (
1196 "try { structuredClone(new Headers()); 'no-throw' } catch(e) { e.name }",
1197 "DataCloneError",
1198 ),
1199 (
1203 "try { structuredClone(Promise.resolve(1)); 'no-throw' } catch(e) { e.name }",
1204 "DataCloneError",
1205 ),
1206 (
1212 "try { structuredClone(new WeakMap()); 'no-throw' } catch(e) { e.name }",
1213 "DataCloneError",
1214 ),
1215 (
1216 "try { structuredClone(new WeakSet()); 'no-throw' } catch(e) { e.name }",
1217 "DataCloneError",
1218 ),
1219 (
1225 "try { structuredClone(new AbortController()); 'no-throw' } catch(e) { e.name }",
1226 "DataCloneError",
1227 ),
1228 (
1229 "try { structuredClone(new AbortController().signal); 'no-throw' } catch(e) { e.name }",
1230 "DataCloneError",
1231 ),
1232 (
1233 "try { structuredClone(new MessageChannel()); 'no-throw' } catch(e) { e.name }",
1234 "DataCloneError",
1235 ),
1236 (
1237 "try { structuredClone(new MessageChannel().port1); 'no-throw' } catch(e) { e.name }",
1238 "DataCloneError",
1239 ),
1240 (
1243 "var m=new Map([['a',1],['b',2]]); var c=structuredClone(m); m.set('a',99); c.get('a')+','+c.get('b')+','+c.size",
1244 "1,2,2",
1245 ),
1246 (
1247 "var s=new Set([1,2,3]); var c=structuredClone(s); s.add(4); c.has(4)+','+c.size",
1248 "false,3",
1249 ),
1250 ("var a=new Int8Array([200,-100]); var c=structuredClone(a); c.join(',')", "-56,-100"),
1255 (
1256 "var a=new Int8Array(1); var c=structuredClone(a); c.BYTES_PER_ELEMENT",
1257 "1",
1258 ),
1259 ("var a=new Int8Array(1); var c=structuredClone(a); c[0]=200; c[0]", "-56"),
1260 (
1261 "var a=new Int8Array([1,2]); var c=structuredClone(a); a[0]=9; c[0]",
1262 "1",
1263 ),
1264 (
1268 "var b=new ArrayBuffer(4); var c=structuredClone(b,{transfer:[b]}); b.detached+','+c.byteLength",
1269 "true,4",
1270 ),
1271 (
1276 "var b=new Blob(['hi']); var c=structuredClone(b); await c.text()",
1277 "hi",
1278 ),
1279 ("var b=new Blob(['hi']); var c=structuredClone(b); c.size", "2"),
1280 (
1281 "var dv=new DataView(new ArrayBuffer(1)); dv.setUint8(0,65); var c=structuredClone(dv); c.getUint8(0)",
1282 "65",
1283 ),
1284 (
1287 "var buf=new ArrayBuffer(4); var c=structuredClone(buf); c.byteLength",
1288 "4",
1289 ),
1290 (
1291 "var buf=new ArrayBuffer(4); var c=structuredClone(buf); typeof c.slice",
1292 "function",
1293 ),
1294 (
1300 "var p=new Proxy({a:1,b:2},{}); var c=structuredClone(p); c.a+','+c.b",
1301 "1,2",
1302 ),
1303 (
1304 "var t={a:1}; var p=new Proxy(t,{}); var c=structuredClone(p); t.a=99; c.a",
1305 "1",
1306 ),
1307 (
1308 "var buf = await new Blob(['A']).arrayBuffer(); var c=structuredClone(buf); new DataView(c).getUint8(0)",
1309 "65",
1310 ),
1311 ("Object.fromEntries([['a',1],['b',2]]).b", "2"),
1313 ("Object.getOwnPropertyNames({x:1,y:2}).join(',')", "x,y"),
1314 ("var o=Object.freeze({a:1}); o.a", "1"),
1315 ("Number.isInteger(5)", "true"),
1317 ("Number.isInteger(5.5)", "false"),
1318 ("Number.isInteger('5')", "false"),
1319 ("Number.isSafeInteger(9007199254740991)", "true"),
1320 ("Number.MAX_SAFE_INTEGER", "9007199254740991"),
1321 ("Number.isNaN(NaN) + ',' + Number.isNaN(5)", "true,false"),
1322 ("Number.MIN_VALUE > 0", "true"),
1326 ("Number.MIN_VALUE < Number.EPSILON", "true"),
1327 ("Number.isNaN(Number.NaN)", "true"),
1328 ("Math.hypot(3,4)", "5"),
1330 ("Math.log2(8)", "3"),
1331 ("Math.round(Math.log10(1000))", "3"),
1332 ("Math.round(Math.cbrt(27))", "3"),
1333 ("Math.atan2(0,5)", "0"),
1334 ("Math.fround(1.5)", "1.5"),
1336 ("Math.fround(1.1) !== 1.1", "true"),
1337 ("Math.f16round(1.5)", "1.5"),
1338 ("Math.f16round(1.337) !== 1.337", "true"),
1339 ("Math.sumPrecise([1, 2, 3])", "6"),
1340 ("Math.sumPrecise([0.1, 0.2])", "0.30000000000000004"),
1341 ("Math.sumPrecise([1, Infinity])", "Infinity"),
1342 ("isNaN(Math.sumPrecise([Infinity, -Infinity]))", "true"),
1343 ("isNaN(Math.sumPrecise([1, NaN]))", "true"),
1344 ("new Headers({'Set-Cookie':'a=1'}).getSetCookie().join(',')", "a=1"),
1345 ("var h=new Headers(); h.append('Set-Cookie','a=1'); h.append('Set-Cookie','b=2'); h.getSetCookie().join('; ')", "a=1; b=2"),
1346 ("Math.clz32(1)", "31"),
1347 ("Math.clz32(0)", "32"),
1348 ("Math.clz32(1000)", "22"),
1349 ("Math.imul(3,4)", "12"),
1350 ("Math.imul(0xffffffff, 5)", "-5"),
1351 ("Math.round(Math.sinh(0))", "0"),
1352 ("Math.cosh(0)", "1"),
1353 ("Math.tanh(0)", "0"),
1354 ("Math.asinh(0)", "0"),
1355 ("Math.acosh(1)", "0"),
1356 ("Math.atanh(0)", "0"),
1357 ("Math.round(Math.expm1(0))", "0"),
1358 ("Math.log1p(0)", "0"),
1359 ("Math.round(Math.LN2*1000)", "693"),
1360 ("Math.round(Math.LN10*1000)", "2303"),
1361 ("Math.round(Math.SQRT2*1000)", "1414"),
1362 ("Math.round(Math.SQRT1_2*1000)", "707"),
1363 ("var c=new AbortController(); var b=c.signal.aborted; c.abort(); b+','+c.signal.aborted", "false,true"),
1365 (
1368 "var c=new AbortController(); var fired=false; c.signal.addEventListener('abort', function(){fired=true;}); c.abort(); fired",
1369 "true",
1370 ),
1371 ("var c=new AbortController(); c.abort(); c.signal.reason.name", "AbortError"),
1372 ("var c=new AbortController(); c.abort('custom'); c.signal.reason", "custom"),
1373 (
1375 "var c=new AbortController(); var n=0; c.signal.addEventListener('abort', function(){n++;}); c.abort(); c.abort(); n",
1376 "1",
1377 ),
1378 ("AbortSignal.abort().aborted", "true"),
1381 ("AbortSignal.abort('why').reason", "why"),
1382 ("AbortSignal.abort().reason.name", "AbortError"),
1383 ("new DOMException('boom', 'NotFoundError').message", "boom"),
1386 ("new DOMException('boom', 'NotFoundError').name", "NotFoundError"),
1387 ("new DOMException('boom', 'NotFoundError').code", "8"),
1388 ("DOMException.NOT_FOUND_ERR", "8"),
1389 ("new DOMException().name", "Error"),
1390 ("new DOMException('x', 'CustomError').code", "0"),
1391 ("AbortSignal.abort().reason.code", "20"),
1394 (
1397 "var c=new AbortController(); var n=0; var fn=function(){n++;}; c.signal.addEventListener('abort', fn); c.signal.removeEventListener('abort', fn); c.abort(); n",
1398 "0",
1399 ),
1400 (
1401 "var c=new AbortController(); var n=0; c.signal.addEventListener('abort', function(){n++;}); c.signal.removeEventListener('abort', function(){}); c.abort(); n",
1402 "1",
1403 ),
1404 (
1406 "var c1=new AbortController(); var c2=new AbortController(); var s=AbortSignal.any([c1.signal, c2.signal]); var before=s.aborted; c2.abort('two'); before+','+s.aborted+','+s.reason",
1407 "false,true,two",
1408 ),
1409 (
1410 "var c1=new AbortController(); c1.abort('already'); AbortSignal.any([c1.signal]).reason",
1411 "already",
1412 ),
1413 ("var c=new AbortController(); c.signal.throwIfAborted()", "undefined"),
1415 (
1417 "var c=new AbortController(); c.abort('boom'); \
1418 var caught; try { c.signal.throwIfAborted(); } catch (e) { caught = e; } caught",
1419 "boom",
1420 ),
1421 (
1425 "var t=new EventTarget(); var log=''; t.addEventListener('x', ()=>log+='a'); t.addEventListener('x', ()=>log+='b'); t.dispatchEvent(new Event('x')); log",
1426 "ab",
1427 ),
1428 (
1429 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn); t.addEventListener('x', fn); t.dispatchEvent(new Event('x')); n",
1430 "1",
1431 ),
1432 (
1433 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn); t.removeEventListener('x', fn); t.dispatchEvent(new Event('x')); n",
1434 "0",
1435 ),
1436 (
1442 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn, true); t.addEventListener('x', fn, false); t.dispatchEvent(new Event('x')); n",
1443 "2",
1444 ),
1445 (
1448 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn, true); t.addEventListener('x', fn, false); t.removeEventListener('x', fn); t.dispatchEvent(new Event('x')); n",
1449 "1",
1450 ),
1451 (
1455 "var t=new EventTarget(); var c=new AbortController(); var n=0; \
1456 t.addEventListener('x', ()=>n++, {signal: c.signal}); \
1457 t.dispatchEvent(new Event('x')); c.abort(); t.dispatchEvent(new Event('x')); n",
1458 "1",
1459 ),
1460 (
1462 "var t=new EventTarget(); var c=new AbortController(); c.abort(); var n=0; \
1463 t.addEventListener('x', ()=>n++, {signal: c.signal}); \
1464 t.dispatchEvent(new Event('x')); n",
1465 "0",
1466 ),
1467 (
1469 "var el=document.createElement('div'); var c=new AbortController(); var n=0; \
1470 el.addEventListener('click', ()=>n++, {signal: c.signal}); \
1471 el.click(); c.abort(); el.click(); n",
1472 "1",
1473 ),
1474 (
1477 "var t=new EventTarget(); t.addEventListener('x', e => e.preventDefault()); t.dispatchEvent(new Event('x', {cancelable:true}))",
1478 "false",
1479 ),
1480 (
1481 "var t=new EventTarget(); t.addEventListener('x', e => e.preventDefault()); t.dispatchEvent(new Event('x'))",
1482 "true",
1483 ),
1484 (
1487 "var t=new EventTarget(); var r; t.addEventListener('x', e => { r = e.isTrusted; }); t.dispatchEvent(new Event('x')); r",
1488 "false",
1489 ),
1490 ("new Event('x', {composed: true}).composed", "true"),
1494 ("new Event('x').composed", "false"),
1495 (
1496 "new CustomEvent('x', {detail: 1, composed: true}).composed",
1497 "true",
1498 ),
1499 (
1503 "var t=new EventTarget(); var log=''; \
1504 t.addEventListener('x', e => { log+='a'; e.stopImmediatePropagation(); }); \
1505 t.addEventListener('x', () => { log+='b'; }); \
1506 t.dispatchEvent(new Event('x')); log",
1507 "a",
1508 ),
1509 (
1512 "var t=new EventTarget(); var n=0; t.addEventListener('x', ()=>n++, {once:true}); \
1513 t.dispatchEvent(new Event('x')); t.dispatchEvent(new Event('x')); n",
1514 "1",
1515 ),
1516 (
1518 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn, {once:true}); \
1519 t.removeEventListener('x', fn); t.dispatchEvent(new Event('x')); n",
1520 "0",
1521 ),
1522 (
1525 "var t=new EventTarget(); var p; t.addEventListener('x', e => { p = e.composedPath(); }); \
1526 t.dispatchEvent(new Event('x')); p.length === 1 && p[0] === t",
1527 "true",
1528 ),
1529 ("new CustomEvent('x').composedPath().length", "0"),
1531 ("new KeyboardEvent('keydown', {key:'a', code:'KeyA'}).key", "a"),
1535 ("new KeyboardEvent('keydown', {key:'a', code:'KeyA'}).code", "KeyA"),
1536 (
1537 "var t=new EventTarget(); var got; \
1538 t.addEventListener('keydown', e => { got = e.ctrlKey + ':' + e.key; }); \
1539 t.dispatchEvent(new KeyboardEvent('keydown', {key:'Enter', ctrlKey:true})); got",
1540 "true:Enter",
1541 ),
1542 ("new MouseEvent('click', {clientX:10, clientY:20}).clientX", "10"),
1543 (
1544 "var t=new EventTarget(); var got; \
1545 t.addEventListener('click', e => { got = e.clientY + ':' + e.button; }); \
1546 t.dispatchEvent(new MouseEvent('click', {clientY:5, button:2})); got",
1547 "5:2",
1548 ),
1549 ("new MouseEvent('click').bubbles", "false"),
1550 ("new MouseEvent('click', {bubbles:true}).bubbles", "true"),
1551 ("new WheelEvent('wheel', {deltaY:100}).deltaY", "100"),
1554 ("new WheelEvent('wheel', {deltaY:1, clientX:5}).clientX", "5"),
1555 ("new WheelEvent('wheel').deltaMode", "0"),
1556 ("new FocusEvent('focusout', {relatedTarget: null}).relatedTarget === null", "true"),
1557 (
1558 "var t=new EventTarget(); var r=new EventTarget(); var got; \
1559 t.addEventListener('focusout', e => { got = e.relatedTarget; }); \
1560 t.dispatchEvent(new FocusEvent('focusout', {relatedTarget: r})); got === r",
1561 "true",
1562 ),
1563 ("new Touch({identifier:1, clientX:10, clientY:20}).clientX", "10"),
1567 ("new Touch({}).force", "1"),
1568 (
1569 "var t=new Touch({identifier:1}); \
1570 new TouchEvent('touchstart', {touches:[t], changedTouches:[t]}).touches[0] === t",
1571 "true",
1572 ),
1573 ("new CommandEvent('command', {command:'show-modal'}).command", "show-modal"),
1575 ("new CommandEvent('command', {source:null}).source === null", "true"),
1576 ("new ToggleEvent('toggle', {oldState:'closed', newState:'open'}).newState", "open"),
1577 ("new ToggleEvent('toggle').oldState", "closed"),
1578 ("new FormDataEvent('formdata', {formData:null}).formData === null", "true"),
1579
1580 ("new TouchEvent('touchend').changedTouches.length", "0"),
1581 (
1584 "new HashChangeEvent('hashchange', {oldURL:'a', newURL:'b'}).oldURL + ',' + \
1585 new HashChangeEvent('hashchange', {oldURL:'a', newURL:'b'}).newURL",
1586 "a,b",
1587 ),
1588 (
1589 "new HashChangeEvent('hashchange').type",
1590 "hashchange",
1591 ),
1592 (
1593 "new PageTransitionEvent('pageshow', {persisted:true}).persisted",
1594 "true",
1595 ),
1596 (
1600 "new PopStateEvent('popstate', {state:{a:1}}).state.a",
1601 "1",
1602 ),
1603 ("new PopStateEvent('popstate').state", "null"),
1604 (
1605 "var got=null; window.addEventListener('popstate', e => got = e.state); \
1606 window.dispatchEvent(new PopStateEvent('popstate', {state:'s'})); got",
1607 "s",
1608 ),
1609 (
1613 "var r=new DOMRect(10,20,30,40); \
1614 [r.x,r.y,r.width,r.height,r.left,r.top,r.right,r.bottom].join(',')",
1615 "10,20,30,40,10,20,40,60",
1616 ),
1617 ("new DOMRect().width", "0"),
1618 ("new DOMRectReadOnly(1,2,3,4).right", "4"),
1619 ("JSON.stringify(new DOMRect(1,2,3,4).toJSON()).includes('\"width\":3')", "true"),
1620 (
1622 "var p=new DOMPoint(1,2); p.x+','+p.y+','+p.z+','+p.w",
1623 "1,2,0,1",
1624 ),
1625 ("new DOMPoint(1,2,3,4).w", "4"),
1626 ("new DOMPointReadOnly().x", "0"),
1627 ("JSON.stringify(new DOMPoint(1,2).toJSON()).includes('\"y\":2')", "true"),
1628 ("new DOMPoint(10, 20).matrixTransform(new DOMMatrix().translate(5, 5)).x", "15"),
1629 ("new DOMMatrix().isIdentity", "true"),
1630 ("new DOMMatrix().is2D", "true"),
1631 ("new DOMMatrix([1,0,0,1,10,20]).toString()", "matrix(1, 0, 0, 1, 10, 20)"),
1632 ("new DOMMatrix().translate(10, 20).e", "10"),
1633 ("new DOMMatrix().scale(2, 3).d", "3"),
1634 ("DOMMatrix.fromFloat32Array(new Float32Array([1,0,0,1,10,20])).e", "10"),
1635 ("new DOMMatrix().rotate(90).b", "1"),
1636 ("new DOMMatrix([1,0,0,1,10,20]).invert().e", "-10"),
1637 ("new DOMMatrix().translateSelf(10, 20).e", "10"),
1638 ("new DOMMatrix().rotateSelf(90).b", "1"),
1639 ("new DOMMatrix().scaleSelf(2, 3).d", "3"),
1640 ("new DOMMatrix([1,0,0,1,10,20]).invertSelf().e", "-10"),
1641 ("DOMQuad.fromRect(new DOMRect(10, 20, 30, 40)).getBounds().width", "30"),
1642 ("DOMRect.fromRect({x: 5, y: 10, width: 15, height: 20}).width", "15"),
1643 ("DOMPoint.fromPoint({x: 3, y: 4, z: 5, w: 1}).z", "5"),
1644 ("'가'.normalize('NFD').normalize('NFC')", "가"),
1645
1646 (
1649 "var got=null; window.addEventListener('hashchange', e => got = e.newURL); \
1650 window.dispatchEvent(new HashChangeEvent('hashchange', {newURL:'x'})); got",
1651 "x",
1652 ),
1653 (
1654 "window.dispatchEvent(new Event('unknown-type'))",
1655 "true",
1656 ),
1657 (
1661 "var n=0; window.onhashchange = () => n++; \
1662 window.dispatchEvent(new HashChangeEvent('hashchange')); n",
1663 "1",
1664 ),
1665 (
1666 "var order=[]; window.onresize = () => order.push('on'); \
1667 window.addEventListener('resize', () => order.push('listener')); \
1668 window.dispatchEvent(new Event('resize')); order.join(',')",
1669 "on,listener",
1670 ),
1671 (
1675 "var n=0; var cb = () => n++; window.addEventListener('resize', cb); \
1676 window.removeEventListener('resize', cb); \
1677 window.dispatchEvent(new Event('resize')); n",
1678 "0",
1679 ),
1680 (
1681 "var log=[]; var cb1 = () => log.push('1'); var cb2 = () => log.push('2'); \
1682 window.addEventListener('resize', cb1); window.addEventListener('resize', cb2); \
1683 window.removeEventListener('resize', cb1); \
1684 window.dispatchEvent(new Event('resize')); log.join(',')",
1685 "2",
1686 ),
1687 (
1692 "typeof document.removeEventListener",
1693 "function",
1694 ),
1695 (
1696 "var n=0; var cb = () => n++; document.addEventListener('hashchange', cb); \
1697 document.removeEventListener('hashchange', cb); \
1698 window.dispatchEvent(new Event('hashchange')); n",
1699 "0",
1700 ),
1701 (
1704 "var got=null; document.addEventListener('hashchange', e => got = e.newURL); \
1705 document.dispatchEvent(new HashChangeEvent('hashchange', {newURL:'y'})); got",
1706 "y",
1707 ),
1708 (
1714 "window.addEventListener('resize', e => e.preventDefault()); \
1715 window.dispatchEvent(new Event('resize', {cancelable:true}))",
1716 "false",
1717 ),
1718 (
1719 "document.addEventListener('scroll', e => e.preventDefault()); \
1720 document.dispatchEvent(new Event('scroll', {cancelable:true}))",
1721 "false",
1722 ),
1723 (
1725 "window.addEventListener('popstate', () => {}); \
1726 window.dispatchEvent(new Event('popstate'))",
1727 "true",
1728 ),
1729 (
1733 "var t='none'; window.addEventListener('message', e => t = (e.target === window)); \
1734 window.dispatchEvent(new Event('message')); t",
1735 "true",
1736 ),
1737 (
1743 "var got=''; window.onerror = (msg, src, line, col) => { got = msg+'|'+src+'|'+line+'|'+col; }; \
1744 window.dispatchEvent(new ErrorEvent('error', {message:'boom', filename:'a.js', lineno:3, colno:7})); got",
1745 "boom|a.js|3|7",
1746 ),
1747 (
1750 "var n=0; window.addEventListener('online', () => n++); \
1751 window.dispatchEvent(new Event('online')); n",
1752 "1",
1753 ),
1754 (
1755 "var n=0; var cb = () => n++; window.addEventListener('offline', cb); \
1756 window.removeEventListener('offline', cb); \
1757 window.dispatchEvent(new Event('offline')); n",
1758 "0",
1759 ),
1760 (
1763 "var log=[]; \
1764 window.addEventListener('beforeunload', () => log.push('bu')); \
1765 window.addEventListener('unload', () => log.push('u')); \
1766 window.addEventListener('pageshow', () => log.push('ps')); \
1767 window.addEventListener('pagehide', () => log.push('ph')); \
1768 document.addEventListener('visibilitychange', () => log.push('vc')); \
1769 window.addEventListener('languagechange', () => log.push('lc')); \
1770 window.dispatchEvent(new Event('beforeunload')); \
1771 window.dispatchEvent(new Event('unload')); \
1772 window.dispatchEvent(new Event('pageshow')); \
1773 window.dispatchEvent(new Event('pagehide')); \
1774 document.dispatchEvent(new Event('visibilitychange')); \
1775 window.dispatchEvent(new Event('languagechange')); \
1776 log.join(',')",
1777 "bu,u,ps,ph,vc,lc",
1778 ),
1779 ("document.visibilityState", "visible"),
1782 ("document.hidden", "false"),
1783 ("document.characterSet", "UTF-8"),
1786 ("document.compatMode", "CSS1Compat"),
1787 ("document.contentType", "text/html"),
1788 ("document.doctype", "null"),
1789 ("document.currentScript", "null"),
1793 ("document.implementation.hasFeature('x','1.0')", "true"),
1798 (
1799 "var dt=document.implementation.createDocumentType('html',' ',''); dt.name+','+dt.nodeType",
1800 "html,10",
1801 ),
1802 (
1803 "var doc=document.implementation.createHTMLDocument('MyDoc'); doc.title+','+doc.nodeType",
1804 "MyDoc,9",
1805 ),
1806 (
1807 "var doc=document.implementation.createDocument('http://www.w3.org/1999/xhtml','html'); doc.qualifiedName+','+doc.nodeType",
1808 "html,9",
1809 ),
1810 (
1813 "var got=null; window.addEventListener('storage', e => got = e.key); \
1814 window.dispatchEvent(new StorageEvent('storage', {key:'k'})); got",
1815 "k",
1816 ),
1817 (
1821 "var n=0; document.addEventListener('readystatechange', () => n++); n",
1822 "1",
1823 ),
1824 ("window.print(); true", "true"),
1827 (
1828 "var log=[]; \
1829 window.addEventListener('beforeprint', () => log.push('bp')); \
1830 window.addEventListener('afterprint', () => log.push('ap')); \
1831 window.dispatchEvent(new Event('beforeprint')); \
1832 window.dispatchEvent(new Event('afterprint')); \
1833 log.join(',')",
1834 "bp,ap",
1835 ),
1836 ("new PointerEvent('pointerdown', {pointerId:7, pointerType:'touch'}).pointerId", "7"),
1839 ("new PointerEvent('pointerdown', {pointerType:'touch', clientX:9}).clientX", "9"),
1840 ("new PointerEvent('pointerdown').isPrimary", "false"),
1841 ("new PointerEvent('pointerdown', {isPrimary:true}).width", "1"),
1842 ("new InputEvent('input', {data:'a', inputType:'insertText'}).data", "a"),
1843 ("new InputEvent('input', {data:'a', inputType:'insertText'}).inputType", "insertText"),
1844 ("new InputEvent('beforeinput').isComposing", "false"),
1845 (
1848 "var e=document.createElement('div'); e.hasPointerCapture(1)",
1849 "false",
1850 ),
1851 (
1852 "var e=document.createElement('div'); e.setPointerCapture(1); e.hasPointerCapture(1)",
1853 "true",
1854 ),
1855 (
1856 "var e=document.createElement('div'); e.setPointerCapture(1); \
1857 e.releasePointerCapture(1); e.hasPointerCapture(1)",
1858 "false",
1859 ),
1860 (
1862 "var e=document.createElement('div'); e.setPointerCapture(1); e.hasPointerCapture(2)",
1863 "false",
1864 ),
1865 ("new ProgressEvent('progress', {loaded:50, total:100}).loaded", "50"),
1867 ("new ProgressEvent('progress', {lengthComputable:true}).lengthComputable", "true"),
1868 ("new ProgressEvent('progress').total", "0"),
1869 ("new StorageEvent('storage', {key:'k', newValue:'v'}).key", "k"),
1870 ("new StorageEvent('storage', {key:'k', newValue:'v'}).newValue", "v"),
1871 ("new StorageEvent('storage').oldValue === null", "true"),
1872 ("new CompositionEvent('compositionupdate', {data:'あ'}).data", "あ"),
1874 ("new CompositionEvent('compositionstart').data", ""),
1875 (
1876 "var t=new EventTarget(); var got; \
1877 t.addEventListener('paste', e => { got = e.clipboardData; }); \
1878 t.dispatchEvent(new ClipboardEvent('paste', {clipboardData:'X'})); got",
1879 "X",
1880 ),
1881 ("new ClipboardEvent('copy').clipboardData === null", "true"),
1882 ("new AnimationEvent('animationend', {animationName:'spin'}).animationName", "spin"),
1886 ("new AnimationEvent('animationend').elapsedTime", "0"),
1887 ("new TransitionEvent('transitionend', {propertyName:'opacity'}).propertyName", "opacity"),
1888 ("new DragEvent('drop', {dataTransfer:'X'}).dataTransfer", "X"),
1889 ("new DragEvent('drop', {clientX:3}).clientX", "3"),
1890 ("new SubmitEvent('submit', {submitter:'BTN'}).submitter", "BTN"),
1891 ("new SubmitEvent('submit').submitter === null", "true"),
1892 ("new MessageEvent('message', {data:'hi', origin:'https://a.com'}).data", "hi"),
1896 ("new MessageEvent('message', {data:'hi', origin:'https://a.com'}).origin", "https://a.com"),
1897 ("new MessageEvent('message').ports.length", "0"),
1898 ("new ErrorEvent('error', {message:'boom', lineno:5}).message", "boom"),
1899 ("new ErrorEvent('error', {message:'boom', lineno:5}).lineno", "5"),
1900 ("new ErrorEvent('error').error === null", "true"),
1901 (
1904 "var t=new EventTarget(); var ct, ph; \
1905 t.addEventListener('x', e => { ct = e.currentTarget; ph = e.eventPhase; }); \
1906 t.dispatchEvent(new Event('x')); ct === t && ph === 2",
1907 "true",
1908 ),
1909 (
1911 "var t=new EventTarget(); var e=new Event('x'); t.dispatchEvent(e); \
1912 e.currentTarget === null && e.eventPhase",
1913 "0",
1914 ),
1915 ("typeof new Event('x').timeStamp", "number"),
1918 (
1919 "var b=document.createElement('button'); var ts; \
1920 b.addEventListener('click', e => { ts = e.timeStamp; }); \
1921 b.dispatchEvent({type:'click'}); typeof ts",
1922 "number",
1923 ),
1924 (
1928 "var t=new EventTarget(); var r; \
1929 t.addEventListener('x', e => { e.returnValue = false; }); \
1930 r = t.dispatchEvent(new Event('x', {cancelable:true})); r",
1931 "false",
1932 ),
1933 (
1935 "var b=document.createElement('button'); var p=document.createElement('div'); \
1936 p.appendChild(b); var s=''; \
1937 p.addEventListener('click', ()=>s+='P'); \
1938 b.addEventListener('click', e => { s+='B'; e.cancelBubble = true; }); \
1939 b.dispatchEvent({type:'click', bubbles:true}); s",
1940 "B",
1941 ),
1942 (
1944 "var t=new EventTarget(); var se; \
1945 t.addEventListener('x', e => { se = e.srcElement; }); \
1946 t.dispatchEvent(new Event('x')); se === t",
1947 "true",
1948 ),
1949 (
1952 "Event.NONE + ',' + Event.CAPTURING_PHASE + ',' + Event.AT_TARGET + ',' + Event.BUBBLING_PHASE",
1953 "0,1,2,3",
1954 ),
1955 (
1956 "var t=new EventTarget(); var ph; \
1957 t.addEventListener('x', e => { ph = e.eventPhase === Event.AT_TARGET; }); \
1958 t.dispatchEvent(new Event('x')); ph",
1959 "true",
1960 ),
1961 (
1964 "var f=document.createElement('form'); var n=0; \
1965 f.addEventListener('submit', ()=>n++); f.requestSubmit(); n",
1966 "1",
1967 ),
1968 (
1970 "var f=document.createElement('form'); \
1971 f.addEventListener('submit', e=>e.preventDefault()); \
1972 typeof f.requestSubmit()",
1973 "undefined",
1974 ),
1975 ("var f=document.createElement('form'); f.submit(); true", "true"),
1978 (
1981 "var i=document.createElement('input'); i.type='date'; i.showPicker(); true",
1982 "true",
1983 ),
1984 (
1986 "var i=document.createElement('input'); i.type='number'; i.value='5'; \
1987 i.stepUp(); i.value",
1988 "6",
1989 ),
1990 ("var i=document.createElement('input'); i.type='number'; i.value='5'; i.stepDown(3); i.value", "2"),
1991 (
1993 "var i=document.createElement('input'); i.type='number'; i.value='0'; i.step='0.5'; \
1994 i.stepUp(); i.value",
1995 "0.5",
1996 ),
1997 (
1999 "var i=document.createElement('input'); i.type='number'; i.value='9'; i.max='10'; \
2000 i.stepUp(5); i.value",
2001 "10",
2002 ),
2003 ("String.fromCharCode(72,105)", "Hi"),
2005 ("String.fromCodePoint(65)", "A"),
2006 ("Array.of(1,2,3).join(',')", "1,2,3"),
2007 ("[...[10,20].keys()].join(',')", "0,1"),
2009 ("[...[10,20].values()].join(',')", "10,20"),
2010 ("[...[5,6].entries()].map(e => e[0]+':'+e[1]).join(',')", "0:5,1:6"),
2013 ("[1,2,3].reduceRight((a,b) => a+'-'+b)", "3-2-1"),
2014 ("[1,2,3,4].reduceRight((a,b) => a+b, 0)", "10"),
2015 ("document.title = 'AtmOS'; document.title", "AtmOS"),
2017 ("document.readyState", "complete"),
2018 ("document.compatMode", "CSS1Compat"),
2021 ("document.characterSet", "UTF-8"),
2022 ("document.charset", "UTF-8"),
2023 ("document.contentType", "text/html"),
2024 ("document.scrollingElement === document.documentElement", "true"),
2025 ("document.firstElementChild === document.documentElement", "true"),
2031 ("document.lastElementChild === document.documentElement", "true"),
2032 ("document.children.length", "0"),
2033 ("document.childElementCount", "0"),
2034 ("document.referrer", ""),
2037 (
2038 "/^\\d{2}\\/\\d{2}\\/\\d{4} \\d{2}:\\d{2}:\\d{2}$/.test(document.lastModified)",
2039 "true",
2040 ),
2041 ("typeof document.domain", "string"),
2042 ("typeof navigator.geolocation.getCurrentPosition", "function"),
2045 (
2046 "var code; navigator.geolocation.getCurrentPosition(() => {}, e => { code = e.code; }); \
2047 code === 1",
2048 "true",
2049 ),
2050 (
2051 "typeof navigator.geolocation.watchPosition(() => {}, () => {})",
2052 "number",
2053 ),
2054 ("typeof navigator.geolocation.clearWatch(1)", "undefined"),
2055 (
2058 "(await navigator.wakeLock.request('screen')).released",
2059 "false",
2060 ),
2061 ("(await navigator.wakeLock.request('screen')).type", "screen"),
2062 (
2063 "var s = await navigator.wakeLock.request('screen'); await s.release(); s.released",
2064 "true",
2065 ),
2066 ("navigator.canShare({title:'x'})", "false"),
2070 (
2071 "try { await navigator.share({title:'x'}); 'resolved' } \
2072 catch(e) { e.name }",
2073 "AbortError",
2074 ),
2075 (
2078 "try { await new EyeDropper().open(); 'resolved' } \
2079 catch(e) { e.name }",
2080 "AbortError",
2081 ),
2082 ("navigator.vibrate(200)", "true"),
2086 ("navigator.vibrate([100,50,100])", "true"),
2087 ("(await navigator.getBattery()).charging", "true"),
2091 ("(await navigator.getBattery()).level", "1"),
2092 ("(await navigator.getBattery()).chargingTime", "0"),
2093 ("navigator.connection.saveData", "false"),
2097 ("navigator.connection.effectiveType", "4g"),
2098 ("typeof navigator.connection.downlink", "number"),
2099 ("await navigator.locks.request('x', lock => lock.name)", "x"),
2103 ("await navigator.locks.request('x', lock => lock.mode)", "exclusive"),
2104 (
2105 "var ran=false; await navigator.locks.request('x', () => { ran=true; }); ran",
2106 "true",
2107 ),
2108 ("(await navigator.locks.query()).held.length", "0"),
2109 ("await document.hasStorageAccess()", "true"),
2113 ("typeof await document.requestStorageAccess()", "undefined"),
2114 (
2118 "await navigator.clipboard.write([new ClipboardItem({'text/plain': \
2119 new Blob(['hello-clip'], {type:'text/plain'})})]); \
2120 await navigator.clipboard.readText()",
2121 "hello-clip",
2122 ),
2123 (
2124 "await navigator.clipboard.writeText('via-text'); \
2125 (await navigator.clipboard.read())[0].types[0]",
2126 "text/plain",
2127 ),
2128 (
2129 "await navigator.clipboard.writeText('via-text2'); \
2130 var items = await navigator.clipboard.read(); \
2131 var blob = await items[0].getType('text/plain'); await blob.text()",
2132 "via-text2",
2133 ),
2134 (
2138 "(await navigator.permissions.query({name:'geolocation'})).state",
2139 "denied",
2140 ),
2141 (
2142 "(await navigator.permissions.query({name:'notifications'})).state",
2143 "granted",
2144 ),
2145 (
2146 "(await navigator.permissions.query({name:'camera'})).state",
2147 "denied",
2148 ),
2149 ("var seen=false; var io=new IntersectionObserver(entries => { seen=entries[0].isIntersecting; }); io.observe(document.body); seen", "true"),
2151 (
2154 "var e=null; var io=new IntersectionObserver(entries => { e=entries[0]; }); \
2155 io.observe(document.body); \
2156 typeof e.boundingClientRect.width + ',' + \
2157 (e.intersectionRect === e.boundingClientRect ? 'same' : 'diff') + ',' + \
2158 (e.rootBounds === null) + ',' + (typeof e.time)",
2159 "number,same,true,number",
2160 ),
2161 (
2166 "var io=new IntersectionObserver(()=>{}); \
2167 (io.root===null)+','+io.rootMargin+','+io.thresholds.join(',')",
2168 "true,0px 0px 0px 0px,0",
2169 ),
2170 (
2171 "var r=document.body; \
2172 var io=new IntersectionObserver(()=>{}, {root:r, rootMargin:'10px', threshold:0.5}); \
2173 (io.root===r)+','+io.rootMargin+','+io.thresholds.join(',')",
2174 "true,10px,0.5",
2175 ),
2176 (
2177 "var io=new IntersectionObserver(()=>{}, {threshold:[0,0.25,1]}); io.thresholds.join(',')",
2178 "0,0.25,1",
2179 ),
2180 (
2184 "var e=null; var ro=new ResizeObserver(entries => { e=entries[0]; }); \
2185 ro.observe(document.createElement('div')); \
2186 typeof e.contentRect.width + ',' + \
2187 Array.isArray(e.borderBoxSize) + ',' + \
2188 typeof e.borderBoxSize[0].inlineSize + ',' + \
2189 Array.isArray(e.contentBoxSize) + ',' + \
2190 typeof e.contentBoxSize[0].blockSize",
2191 "number,true,number,true,number",
2192 ),
2193 (
2198 "var e=null; var ro=new ResizeObserver(entries => { e=entries[0]; }); \
2199 ro.observe(document.createElement('div')); \
2200 Array.isArray(e.devicePixelContentBoxSize) + ',' + \
2201 typeof e.devicePixelContentBoxSize[0].inlineSize",
2202 "true,number",
2203 ),
2204 ("window.matchMedia('(max-width: 9999px)').matches", "true"),
2206 ("window.matchMedia('(max-width: 0px)').matches", "false"),
2207 ("window.matchMedia('(min-width: 1px)').matches", "true"),
2208 ("window.matchMedia('(prefers-color-scheme: light)').matches", "true"),
2212 ("window.matchMedia('(prefers-color-scheme: dark)').matches", "false"),
2213 ("typeof scrollY", "number"),
2215 ("scrollTo({top:100}); scrollY", "0"),
2216 ("var loaded=false; window.addEventListener('load', () => { loaded=true; }); loaded", "true"),
2218 (
2222 "var ready=false; document.addEventListener('DOMContentLoaded', () => { ready=true; }); ready",
2223 "true",
2224 ),
2225 (
2229 "var c=document.createElement('input'); c.type='checkbox'; c.checked",
2230 "false",
2231 ),
2232 (
2233 "var c=document.createElement('input'); c.type='checkbox'; c.checked=true; c.checked",
2234 "true",
2235 ),
2236 (
2237 "var c=document.createElement('input'); c.type='checkbox'; c.checked=true; c.checked=false; c.checked",
2238 "false",
2239 ),
2240 (
2244 "var f=document.createElement('input'); f.type='file'; f.files.length",
2245 "0",
2246 ),
2247 (
2248 "var f=document.createElement('input'); f.type='text'; f.files",
2249 "undefined",
2250 ),
2251 (
2257 "var f=document.createElement('input'); f.type='file'; \
2258 f.setAttribute('value','c:\\\\secret.txt'); f.value",
2259 "",
2260 ),
2261 (
2262 "var f=document.createElement('input'); f.type='file'; f.value='x'; f.value",
2263 "",
2264 ),
2265 (
2270 "var a=document.createElement('a'); a.href='https://sub.example.org:8080/x/y?z=1#top'; \
2271 [a.protocol,a.host,a.hostname,a.port,a.pathname,a.search,a.hash,a.origin].join('|')",
2272 "https:|sub.example.org:8080|sub.example.org|8080|/x/y|?z=1|#top|https://sub.example.org:8080",
2273 ),
2274 (
2275 "var a=document.createElement('area'); a.href='http://x.com/'; a.protocol",
2276 "http:",
2277 ),
2278 (
2281 "var c=document.createElement('input'); c.type='checkbox'; c.indeterminate",
2282 "false",
2283 ),
2284 (
2285 "var c=document.createElement('input'); c.type='checkbox'; c.indeterminate=true; c.indeterminate",
2286 "true",
2287 ),
2288 (
2289 "var c=document.createElement('input'); c.type='checkbox'; c.indeterminate=true; c.hasAttribute('indeterminate')",
2290 "false",
2291 ),
2292 (
2297 "var i=document.createElement('input'); i.selectionStart + ',' + i.selectionEnd + ',' + i.selectionDirection",
2298 "0,0,none",
2299 ),
2300 (
2301 "var i=document.createElement('input'); i.selectionStart=2; i.selectionEnd=5; i.selectionDirection='forward'; \
2302 i.selectionStart + ',' + i.selectionEnd + ',' + i.selectionDirection",
2303 "2,5,forward",
2304 ),
2305 (
2306 "var t=document.createElement('textarea'); t.value='hello'; t.textLength",
2307 "5",
2308 ),
2309 (
2313 "var i=document.createElement('input'); i.setSelectionRange(1,3,'forward'); \
2314 i.selectionStart + ',' + i.selectionEnd + ',' + i.selectionDirection",
2315 "1,3,forward",
2316 ),
2317 (
2318 "var i=document.createElement('input'); i.value='hello world'; \
2319 i.setRangeText('there', 6, 11); i.value",
2320 "hello there",
2321 ),
2322 (
2323 "var i=document.createElement('input'); i.value='hello world'; \
2324 i.setRangeText('there', 6, 11, 'select'); \
2325 i.value + '|' + i.selectionStart + ',' + i.selectionEnd",
2326 "hello there|6,11",
2327 ),
2328 (
2329 "var i=document.createElement('input'); i.value='hello world'; \
2330 i.selectionStart=0; i.selectionEnd=5; i.setRangeText('hi'); i.value",
2331 "hi world",
2332 ),
2333 (
2335 "var c=document.createElement('input'); c.type='checkbox'; c.click(); c.checked",
2336 "true",
2337 ),
2338 (
2339 "var c=document.createElement('input'); c.type='checkbox'; c.click(); c.click(); c.checked",
2340 "false",
2341 ),
2342 (
2343 "var r=document.createElement('input'); r.type='radio'; r.click(); r.checked",
2344 "true",
2345 ),
2346 (
2349 "document.createElement('div').ownerDocument === document",
2350 "true",
2351 ),
2352 (
2353 "typeof document.createElement('div').ownerDocument.createElement",
2354 "function",
2355 ),
2356 (
2360 "var r1=document.createElement('input'); r1.type='radio'; r1.name='g'; \
2361 var r2=document.createElement('input'); r2.type='radio'; r2.name='g'; \
2362 r1.click(); r2.click(); r1.checked + ',' + r2.checked",
2363 "false,true",
2364 ),
2365 (
2366 "var r1=document.createElement('input'); r1.type='radio'; r1.name='g2'; \
2367 var r2=document.createElement('input'); r2.type='radio'; r2.name='g2'; \
2368 r1.checked=true; r2.checked=true; r1.checked + ',' + r2.checked",
2369 "false,true",
2370 ),
2371 (
2373 "var r1=document.createElement('input'); r1.type='radio'; r1.name='ga'; \
2374 var r2=document.createElement('input'); r2.type='radio'; r2.name='gb'; \
2375 r1.click(); r2.click(); r1.checked + ',' + r2.checked",
2376 "true,true",
2377 ),
2378 (
2381 "var b=document.createElement('button'); b.disabled=true; b.disabled",
2382 "true",
2383 ),
2384 (
2385 "var b=document.createElement('button'); b.disabled=true; b.disabled=false; b.disabled",
2386 "false",
2387 ),
2388 (
2389 "var o=document.createElement('option'); o.selected=true; o.selected",
2390 "true",
2391 ),
2392 (
2395 "var o=document.createElement('option'); o.text='Label'; o.text",
2396 "Label",
2397 ),
2398 (
2399 "var o=document.createElement('option'); o.text='Label'; o.textContent",
2400 "Label",
2401 ),
2402 (
2406 "var o=document.createElement('option'); o.textContent='hi'; o.label",
2407 "hi",
2408 ),
2409 (
2410 "var o=document.createElement('option'); o.textContent='hi'; o.label='explicit'; o.label",
2411 "explicit",
2412 ),
2413 (
2414 "var g=document.createElement('optgroup'); g.textContent='hi'; g.label",
2415 "",
2416 ),
2417 (
2418 "var g=document.createElement('optgroup'); g.label='Group A'; g.label",
2419 "Group A",
2420 ),
2421 (
2424 "var i=document.createElement('input'); i.required=true; i.required",
2425 "true",
2426 ),
2427 (
2428 "var i=document.createElement('input'); i.readOnly=true; i.readOnly",
2429 "true",
2430 ),
2431 (
2432 "var s=document.createElement('select'); s.multiple=true; s.multiple",
2433 "true",
2434 ),
2435 (
2436 "var img=document.createElement('img'); img.src='a.png'; img.alt='pic'; img.src+','+img.alt",
2437 "a.png,pic",
2438 ),
2439 (
2440 "var a=document.createElement('a'); a.href='/x'; a.href",
2441 "/x",
2442 ),
2443 (
2446 "var l=document.createElement('label'); l.htmlFor='name'; l.htmlFor",
2447 "name",
2448 ),
2449 (
2450 "var f=document.createElement('form'); f.action='/submit'; f.method='post'; f.action+','+f.method",
2451 "/submit,post",
2452 ),
2453 ("document.createElement('form').method", "get"),
2457 (
2458 "var f=document.createElement('form'); f.setAttribute('method','DIALOG'); f.method",
2459 "dialog",
2460 ),
2461 (
2462 "var f=document.createElement('form'); f.setAttribute('method','bogus'); f.method",
2463 "get",
2464 ),
2465 (
2470 "document.createElement('form').enctype",
2471 "application/x-www-form-urlencoded",
2472 ),
2473 (
2474 "var f=document.createElement('form'); f.enctype='multipart/form-data'; f.enctype+','+f.encoding",
2475 "multipart/form-data,multipart/form-data",
2476 ),
2477 (
2478 "var f=document.createElement('form'); f.encoding='text/plain'; f.enctype",
2479 "text/plain",
2480 ),
2481 (
2485 "var f=document.createElement('form'); f.acceptCharset='UTF-8'; f.getAttribute('accept-charset')",
2486 "UTF-8",
2487 ),
2488 (
2489 "var f=document.createElement('form'); f.setAttribute('accept-charset','UTF-8'); f.acceptCharset",
2490 "UTF-8",
2491 ),
2492 (
2497 "var b=document.createElement('button'); b.formAction='/x'; b.getAttribute('formaction')",
2498 "/x",
2499 ),
2500 (
2501 "document.createElement('input').formEnctype",
2502 "application/x-www-form-urlencoded",
2503 ),
2504 (
2505 "var b=document.createElement('button'); b.formEnctype='multipart/form-data'; b.formEnctype",
2506 "multipart/form-data",
2507 ),
2508 ("document.createElement('button').formMethod", "get"),
2509 (
2510 "var i=document.createElement('input'); i.formMethod='post'; i.formMethod",
2511 "post",
2512 ),
2513 (
2514 "document.createElement('button').formNoValidate",
2515 "false",
2516 ),
2517 (
2518 "var b=document.createElement('button'); b.formNoValidate=true; b.getAttribute('formnovalidate')",
2519 "formnovalidate",
2520 ),
2521 (
2522 "var i=document.createElement('input'); i.formTarget='_blank'; i.formTarget",
2523 "_blank",
2524 ),
2525 (
2526 "var i=document.createElement('input'); i.defaultValue='hello'; i.defaultValue+','+i.getAttribute('value')",
2527 "hello,hello",
2528 ),
2529 (
2530 "var i=document.createElement('input'); i.defaultChecked=true; i.defaultChecked+','+i.hasAttribute('checked')",
2531 "true,true",
2532 ),
2533 (
2534 "var o=document.createElement('option'); o.defaultSelected=true; o.defaultSelected+','+o.hasAttribute('selected')",
2535 "true,true",
2536 ),
2537 ("document.createElement('img').loading", "auto"),
2541 (
2542 "var i=document.createElement('img'); i.loading='lazy'; i.loading",
2543 "lazy",
2544 ),
2545 (
2546 "var i=document.createElement('img'); i.setAttribute('loading','bogus'); i.loading",
2547 "auto",
2548 ),
2549 ("document.createElement('img').decoding", "auto"),
2550 (
2551 "var i=document.createElement('img'); i.decoding='sync'; i.decoding",
2552 "sync",
2553 ),
2554 (
2555 "var i=document.createElement('img'); i.setAttribute('decoding','bogus'); i.decoding",
2556 "auto",
2557 ),
2558 ("document.createElement('audio').preload", "metadata"),
2562 (
2563 "var v=document.createElement('video'); v.preload='none'; v.preload",
2564 "none",
2565 ),
2566 (
2567 "var v=document.createElement('video'); v.setAttribute('preload','bogus'); v.preload",
2568 "auto",
2569 ),
2570 ("document.createElement('textarea').wrap", "soft"),
2574 (
2575 "var t=document.createElement('textarea'); t.wrap='hard'; t.wrap",
2576 "hard",
2577 ),
2578 (
2579 "var t=document.createElement('textarea'); t.setAttribute('wrap','bogus'); t.wrap",
2580 "soft",
2581 ),
2582 ("document.createElement('track').kind", "subtitles"),
2586 (
2587 "var t=document.createElement('track'); t.kind='captions'; t.kind",
2588 "captions",
2589 ),
2590 (
2591 "var t=document.createElement('track'); t.setAttribute('kind','bogus'); t.kind",
2592 "metadata",
2593 ),
2594 (
2599 "var t=document.createElement('track'); t.label='English'; t.getAttribute('label')",
2600 "English",
2601 ),
2602 (
2603 "var t=document.createElement('track'); t.srclang='en'; t.srclang",
2604 "en",
2605 ),
2606 ("document.createElement('track').default", "false"),
2607 (
2608 "var t=document.createElement('track'); t.default=true; t.getAttribute('default')",
2609 "default",
2610 ),
2611 (
2614 "var l=document.createElement('link'); l.as='script'; l.getAttribute('as')",
2615 "script",
2616 ),
2617 (
2618 "var l=document.createElement('link'); l.setAttribute('as','style'); l.as",
2619 "style",
2620 ),
2621 (
2626 "document.createElement('video').videoWidth+','+document.createElement('video').videoHeight",
2627 "0,0",
2628 ),
2629 ("document.createElement('video').seeking", "false"),
2630 ("document.createElement('audio').seeking", "false"),
2631 ("document.createElement('select').size", "0"),
2635 (
2636 "var s=document.createElement('select'); s.size=5; s.size",
2637 "5",
2638 ),
2639 ("document.createElement('input').size", "20"),
2640 (
2641 "var i=document.createElement('input'); i.size=10; i.size",
2642 "10",
2643 ),
2644 (
2645 "var i=document.createElement('input'); i.setAttribute('size','0'); i.size",
2646 "20",
2647 ),
2648 ("document.createElement('textarea').rows", "2"),
2651 (
2652 "var t=document.createElement('textarea'); t.rows=8; t.rows",
2653 "8",
2654 ),
2655 ("document.createElement('textarea').cols", "20"),
2656 (
2657 "var t=document.createElement('textarea'); t.cols=40; t.cols",
2658 "40",
2659 ),
2660 (
2661 "var t=document.createElement('textarea'); t.setAttribute('rows','0'); t.rows",
2662 "2",
2663 ),
2664 (
2668 "var d=document.createElement('dialog'); d.open=true; d.requestClose('x'); \
2669 d.open+','+d.returnValue",
2670 "false,x",
2671 ),
2672 (
2673 "var d=document.createElement('dialog'); d.open=true; \
2674 d.addEventListener('cancel', e=>e.preventDefault()); d.requestClose(); d.open",
2675 "true",
2676 ),
2677 (
2678 "var d=document.createElement('dialog'); d.open=true; var fired=false; \
2679 d.addEventListener('close', ()=>fired=true); d.requestClose(); fired",
2680 "true",
2681 ),
2682 ("document.createElement('progress').position", "-1"),
2686 (
2687 "var p=document.createElement('progress'); p.max=10; p.value=5; p.position",
2688 "0.5",
2689 ),
2690 (
2691 "var p=document.createElement('progress'); p.value=1; p.position",
2692 "1",
2693 ),
2694 (
2699 "var o=document.createElement('output'); o.htmlFor='a b c'; \
2700 o.htmlFor.length+','+o.htmlFor[1]",
2701 "3,b",
2702 ),
2703 (
2704 "var o=document.createElement('output'); o.setAttribute('for','x y'); \
2705 Array.from(o.htmlFor).join(',')",
2706 "x,y",
2707 ),
2708 ("document.createElement('output').htmlFor.length", "0"),
2709 (
2715 "var c=document.createElement('input'); c.type='checkbox'; c.value",
2716 "on",
2717 ),
2718 (
2719 "var r=document.createElement('input'); r.type='radio'; r.value",
2720 "on",
2721 ),
2722 (
2723 "var c=document.createElement('input'); c.type='checkbox'; c.value='yes'; c.value",
2724 "yes",
2725 ),
2726 (
2727 "document.createElement('input').value",
2728 "",
2729 ),
2730 (
2735 "var c=document.createElement('input'); c.type='color'; c.value",
2736 "#000000",
2737 ),
2738 (
2739 "var c=document.createElement('input'); c.type='color'; c.value='#ff00aa'; c.value",
2740 "#ff00aa",
2741 ),
2742 (
2749 "var c=document.createElement('input'); c.type='color'; c.value='#FF00AA'; c.value",
2750 "#ff00aa",
2751 ),
2752 (
2753 "var c=document.createElement('input'); c.type='color'; c.value='red'; c.value",
2755 "#000000",
2756 ),
2757 (
2762 "var r=document.createElement('input'); r.type='range'; r.value",
2763 "50",
2764 ),
2765 (
2766 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; r.value",
2767 "5",
2768 ),
2769 (
2770 "var r=document.createElement('input'); r.type='range'; r.value='7'; r.value",
2771 "7",
2772 ),
2773 (
2774 "var r=document.createElement('input'); r.type='range'; r.min='5'; r.max='2'; r.value",
2775 "5",
2776 ),
2777 (
2782 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; r.value='999'; r.value",
2783 "10",
2784 ),
2785 (
2786 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; r.value='-5'; r.value",
2787 "0",
2788 ),
2789 (
2790 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; \
2793 r.setAttribute('value','999'); r.value",
2794 "10",
2795 ),
2796 (
2801 "var t=document.createElement('table'); var h=document.createElement('thead'); \
2802 t.tHead=h; t.tHead===h",
2803 "true",
2804 ),
2805 (
2806 "var t=document.createElement('table'); var h1=document.createElement('thead'); \
2807 var h2=document.createElement('thead'); t.tHead=h1; t.tHead=h2; \
2808 (t.tHead===h2)+','+t.children.length",
2809 "true,1",
2810 ),
2811 (
2812 "var t=document.createElement('table'); var h=document.createElement('thead'); \
2813 t.tHead=h; t.tHead=null; t.tHead",
2814 "null",
2815 ),
2816 (
2817 "var t=document.createElement('table'); var c=document.createElement('caption'); \
2818 var b=document.createElement('tbody'); t.appendChild(b); t.caption=c; \
2819 t.firstChild===c",
2820 "true",
2821 ),
2822 (
2825 "var s=document.createElement('select'); var o=document.createElement('option'); \
2826 s.add(o); s.options.length+','+(s.options[0]===o)",
2827 "1,true",
2828 ),
2829 (
2830 "var s=document.createElement('select'); var o1=document.createElement('option'); \
2831 var o2=document.createElement('option'); s.add(o1); s.add(o2, o1); \
2832 s.options[0]===o2",
2833 "true",
2834 ),
2835 ("document.createElement('video').played.length", "0"),
2838 ("document.createElement('audio').played.length", "0"),
2839 (
2844 "var d=document.createElement('div'); d.role='button'; d.getAttribute('role')",
2845 "button",
2846 ),
2847 (
2848 "var d=document.createElement('div'); d.setAttribute('role','tab'); d.role",
2849 "tab",
2850 ),
2851 (
2852 "var d=document.createElement('div'); d.ariaLabel='close'; d.getAttribute('aria-label')",
2853 "close",
2854 ),
2855 (
2856 "var d=document.createElement('div'); d.setAttribute('aria-hidden','true'); d.ariaHidden",
2857 "true",
2858 ),
2859 (
2860 "var d=document.createElement('div'); d.ariaValueNow='5'; d.getAttribute('aria-valuenow')",
2861 "5",
2862 ),
2863 (
2864 "var d=document.createElement('div'); d.ariaLabel='x'; d.ariaLabel=null; \
2865 d.getAttribute('aria-label')",
2866 "null",
2867 ),
2868 ("document.createElement('div').ariaLabel", "null"),
2869 (
2873 "var d=document.createElement('div'); d.textContent='hi'; d.outerText",
2874 "hi",
2875 ),
2876 (
2877 "var p=document.createElement('div'); var c=document.createElement('span'); \
2878 c.textContent='x'; p.appendChild(c); c.outerText='y'; p.textContent",
2879 "y",
2880 ),
2881 (
2882 "var p=document.createElement('div'); var c=document.createElement('span'); \
2883 p.appendChild(c); c.outerText='z'; p.children.length",
2884 "0",
2885 ),
2886 (
2890 "var d=document.createElement('div'); d.setAttribute('part','a b'); \
2891 d.part.length+','+d.part[1]",
2892 "2,b",
2893 ),
2894 ("document.createElement('div').part.length", "0"),
2895 (
2900 "var l=document.createElement('link'); l.setAttribute('sizes','16x16 32x32'); \
2901 l.sizes.length+','+l.sizes[1]",
2902 "2,32x32",
2903 ),
2904 (
2905 "var i=document.createElement('img'); i.sizes='(min-width: 600px) 50vw, 100vw'; i.sizes",
2906 "(min-width: 600px) 50vw, 100vw",
2907 ),
2908 (
2911 "var i=document.createElement('input'); i.accept='image/*'; i.getAttribute('accept')",
2912 "image/*",
2913 ),
2914 (
2915 "var i=document.createElement('input'); i.setAttribute('accept','.pdf,.doc'); i.accept",
2916 ".pdf,.doc",
2917 ),
2918 (
2922 "var s=document.createElement('script'); s.charset='utf-8'; s.getAttribute('charset')",
2923 "utf-8",
2924 ),
2925 (
2926 "var s=document.createElement('script'); s.setAttribute('charset','shift-jis'); s.charset",
2927 "shift-jis",
2928 ),
2929 (
2934 "var a=document.createElement('a'); a.href='https://x.com/p'; a.hostname='y.com'; a.href",
2935 "https://y.com/p",
2936 ),
2937 (
2938 "var a=document.createElement('a'); a.href='https://x.com/p'; a.protocol='http'; a.protocol",
2939 "http:",
2940 ),
2941 (
2942 "var a=document.createElement('a'); a.href='https://x.com/p'; a.pathname='q'; a.pathname",
2943 "/q",
2944 ),
2945 (
2946 "var a=document.createElement('a'); a.href='https://x.com/p'; a.search='x=1'; a.search",
2947 "?x=1",
2948 ),
2949 (
2950 "var a=document.createElement('a'); a.href='https://x.com/p'; a.hash='frag'; a.hash",
2951 "#frag",
2952 ),
2953 (
2954 "var a=document.createElement('a'); a.href='https://x.com:80/p'; a.host='y.com:90'; \
2955 a.hostname+','+a.port",
2956 "y.com,90",
2957 ),
2958 (
2959 "var a=document.createElement('a'); a.href='https://x.com/p'; a.username='u'; \
2960 a.password='pw'; a.href",
2961 "https://u:pw@x.com/p",
2962 ),
2963 ("document.createElement('output').willValidate", "false"),
2967 ("document.createElement('div').willValidate", "false"),
2968 ("document.createElement('fieldset').willValidate", "false"),
2969 ("document.createElement('input').willValidate", "true"),
2970 (
2971 "var b=document.createElement('button'); b.disabled=true; b.willValidate",
2972 "false",
2973 ),
2974 (
2980 "var o=document.createElement('output'); o.setAttribute('required','required'); \
2981 o.validity.valid",
2982 "true",
2983 ),
2984 (
2985 "var d=document.createElement('div'); d.setAttribute('required','required'); \
2986 d.validity.valueMissing",
2987 "false",
2988 ),
2989 (
2990 "var i=document.createElement('input'); i.setAttribute('required','required'); \
2991 i.validity.valueMissing",
2992 "true",
2993 ),
2994 (
3001 "var o=document.createElement('output'); o.setAttribute('required','required'); \
3002 o.checkValidity()",
3003 "true",
3004 ),
3005 (
3006 "var i=document.createElement('input'); i.setAttribute('required','required'); \
3007 i.checkValidity()",
3008 "false",
3009 ),
3010 (
3014 "document.createElement('video').disableRemotePlayback",
3015 "false",
3016 ),
3017 (
3018 "var v=document.createElement('video'); v.disableRemotePlayback=true; \
3019 v.getAttribute('disableremoteplayback')",
3020 "disableremoteplayback",
3021 ),
3022 (
3026 "var l=document.createElement('link'); l.setAttribute('blocking','render'); \
3027 l.blocking.length+','+l.blocking[0]",
3028 "1,render",
3029 ),
3030 ("document.createElement('script').blocking.length", "0"),
3031 (
3036 "var o=document.createElement('output'); o.textContent='42'; o.value",
3037 "42",
3038 ),
3039 (
3040 "var o=document.createElement('output'); o.textContent='42'; o.value='7'; o.value",
3041 "7",
3042 ),
3043 (
3044 "var o=document.createElement('output'); o.textContent='42'; o.value='7'; \
3045 o.textContent",
3046 "42",
3047 ),
3048 (
3052 "var q=document.createElement('video').getVideoPlaybackQuality(); \
3053 q.totalVideoFrames+','+q.droppedVideoFrames+','+q.corruptedVideoFrames",
3054 "0,0,0",
3055 ),
3056 (
3061 "document.createElement('div').namespaceURI",
3062 "http://www.w3.org/1999/xhtml",
3063 ),
3064 ("document.createElement('SPAN').localName", "span"),
3065 ("document.createElement('div').prefix", "null"),
3066 (
3067 "document.createTextNode('x').namespaceURI",
3068 "null",
3069 ),
3070 (
3071 "document.createTextNode('x').localName",
3072 "null",
3073 ),
3074 (
3078 "HTMLScriptElement.supports('classic')+','+HTMLScriptElement.supports('module')",
3079 "true,true",
3080 ),
3081 (
3082 "document.createElement('div').ariaActiveDescendantElement",
3083 "null",
3084 ),
3085 (
3086 "(function(){var a=document.createElement('div');a.setAttribute('aria-activedescendant','nope');return a.ariaActiveDescendantElement;})()",
3087 "null",
3088 ),
3089 (
3094 "var d=document.createElement('div'); d.innerHTML='<b>x</b>'; d.getHTML()",
3095 "<b>x</b>",
3096 ),
3097 (
3098 "var d=document.createElement('div'); d.setHTMLUnsafe('<i>y</i>'); d.innerHTML",
3099 "<i>y</i>",
3100 ),
3101 ("CSS.px(5).value+','+CSS.px(5).unit+','+CSS.px(5).toString()", "5,px,5px"),
3105 ("CSS.percent(50).toString()", "50%"),
3106 ("CSS.number(3).toString()", "3"),
3107 ("CSS.em(1.5).toString()", "1.5em"),
3108 ("CSS.rem(2).toString()", "2rem"),
3109 ("CSS.deg(90).toString()", "90deg"),
3110 ("HTMLScriptElement.supports('importmap')", "false"),
3111 ("HTMLScriptElement.supports('bogus')", "false"),
3112 (
3116 "(function(){var l=document.createElement('link');l.imageSrcset='a.jpg 1x, b.jpg 2x';l.imageSizes='100vw';return l.imageSrcset+'|'+l.imageSizes;})()",
3117 "a.jpg 1x, b.jpg 2x|100vw",
3118 ),
3119 (
3120 "document.createElement('link').imageSrcset+'|'+document.createElement('link').imageSizes",
3121 "|",
3122 ),
3123 (
3127 "(function(){var f=document.createElement('iframe');var before=f.credentialless;f.credentialless=true;var after=f.credentialless;f.credentialless=false;return before+','+after+','+f.credentialless;})()",
3128 "false,true,false",
3129 ),
3130 (
3135 "var a=document.createElement('area'); a.coords='0,0,10,10'; a.coords",
3136 "0,0,10,10",
3137 ),
3138 ("document.createElement('area').shape", "rect"),
3139 (
3140 "var a=document.createElement('area'); a.shape='circle'; a.shape",
3141 "circle",
3142 ),
3143 (
3144 "var a=document.createElement('area'); a.setAttribute('shape','circ'); a.shape",
3145 "circle",
3146 ),
3147 (
3148 "var a=document.createElement('area'); a.setAttribute('shape','polygon'); a.shape",
3149 "poly",
3150 ),
3151 ("document.createElement('ol').type", "1"),
3156 (
3157 "var o=document.createElement('ol'); o.type='A'; o.type",
3158 "A",
3159 ),
3160 (
3161 "var o=document.createElement('ol'); o.setAttribute('type','bogus'); o.type",
3162 "1",
3163 ),
3164 ("document.createElement('ol').start", "1"),
3165 (
3166 "var o=document.createElement('ol'); o.start=5; o.start",
3167 "5",
3168 ),
3169 (
3170 "document.createElement('ol').reversed",
3171 "false",
3172 ),
3173 (
3174 "var o=document.createElement('ol'); o.reversed=true; o.getAttribute('reversed')",
3175 "reversed",
3176 ),
3177 (
3181 "var m=document.createElement('meter'); m.min='2'; m.max='10'; m.low+','+m.high+','+m.optimum",
3182 "2,10,6",
3183 ),
3184 (
3185 "var m=document.createElement('meter'); m.max='10'; m.low='4'; m.low",
3186 "4",
3187 ),
3188 (
3189 "var m=document.createElement('meter'); m.max='10'; m.high='20'; m.high",
3190 "10",
3191 ),
3192 ("document.createElement('td').colSpan", "1"),
3196 (
3197 "var c=document.createElement('td'); c.colSpan=3; c.colSpan",
3198 "3",
3199 ),
3200 (
3201 "var c=document.createElement('td'); c.setAttribute('colspan','9999'); c.colSpan",
3202 "1000",
3203 ),
3204 ("document.createElement('th').rowSpan", "1"),
3205 (
3206 "var c=document.createElement('th'); c.rowSpan=0; c.rowSpan",
3207 "0",
3208 ),
3209 (
3213 "var c=document.createElement('td'); c.headers='h1 h2'; c.headers",
3214 "h1 h2",
3215 ),
3216 ("document.createElement('th').scope", ""),
3217 (
3218 "var t=document.createElement('th'); t.scope='col'; t.scope",
3219 "col",
3220 ),
3221 (
3222 "var t=document.createElement('th'); t.setAttribute('scope','bogus'); t.scope",
3223 "",
3224 ),
3225 (
3226 "var t=document.createElement('th'); t.abbr='Description'; t.abbr",
3227 "Description",
3228 ),
3229 ("document.createElement('col').span", "1"),
3232 (
3233 "var c=document.createElement('colgroup'); c.span=3; c.span",
3234 "3",
3235 ),
3236 (
3237 "var c=document.createElement('col'); c.setAttribute('span','9999'); c.span",
3238 "1000",
3239 ),
3240 (
3246 "var o=document.createElement('object'); o.data='/x'; o.getAttribute('data')",
3247 "/x",
3248 ),
3249 (
3250 "var t=document.createTextNode('hi'); t.data",
3251 "hi",
3252 ),
3253 (
3258 "var m=document.createElement('meta'); m.httpEquiv='refresh'; m.getAttribute('http-equiv')",
3259 "refresh",
3260 ),
3261 (
3262 "var m=document.createElement('meta'); m.setAttribute('http-equiv','refresh'); m.httpEquiv",
3263 "refresh",
3264 ),
3265 (
3266 "var m=document.createElement('meta'); m.content='width=device-width'; m.content",
3267 "width=device-width",
3268 ),
3269 (
3270 "var m=document.createElement('meta'); m.charset='utf-8'; m.charset",
3271 "utf-8",
3272 ),
3273 (
3277 "var b=document.createElement('blockquote'); b.cite='https://example.com'; b.getAttribute('cite')",
3278 "https://example.com",
3279 ),
3280 (
3281 "var t=document.createElement('time'); t.dateTime='2026-07-17'; t.getAttribute('datetime')",
3282 "2026-07-17",
3283 ),
3284 (
3285 "var i=document.createElement('ins'); i.setAttribute('datetime','2026-07-17'); i.dateTime",
3286 "2026-07-17",
3287 ),
3288 (
3291 "document.createElement('video').disablePictureInPicture",
3292 "false",
3293 ),
3294 (
3295 "var v=document.createElement('video'); v.disablePictureInPicture=true; v.getAttribute('disablepictureinpicture')",
3296 "disablepictureinpicture",
3297 ),
3298 (
3299 "var f=document.createElement('iframe'); f.allowFullscreen=true; f.getAttribute('allowfullscreen')",
3300 "allowfullscreen",
3301 ),
3302 (
3306 "document.createElement('canvas').width+','+document.createElement('canvas').height",
3307 "300,150",
3308 ),
3309 (
3310 "var c=document.createElement('canvas'); c.width=640; c.height=480; c.width+','+c.height",
3311 "640,480",
3312 ),
3313 (
3314 "document.createElement('img').width+','+document.createElement('img').height",
3315 "0,0",
3316 ),
3317 (
3318 "var v=document.createElement('video'); v.width=320; v.width",
3319 "320",
3320 ),
3321 (
3326 "var e=document.createElement('embed'); e.width='50%'; e.width",
3327 "50%",
3328 ),
3329 (
3330 "var o=document.createElement('object'); o.height='300'; o.height",
3331 "300",
3332 ),
3333 ("document.createElement('iframe').width", ""),
3334 (
3335 "var f=document.createElement('iframe'); f.setAttribute('width','640'); f.width",
3336 "640",
3337 ),
3338 (
3343 "var i=document.createElement('input'); i.defaultValue='hi'; i.getAttribute('value')",
3344 "hi",
3345 ),
3346 (
3347 "var i=document.createElement('input'); i.setAttribute('value','preset'); i.defaultValue",
3348 "preset",
3349 ),
3350 (
3351 "var i=document.createElement('input'); i.setAttribute('value','preset'); i.value='changed'; i.defaultValue",
3352 "preset",
3353 ),
3354 (
3355 "var i=document.createElement('input'); i.setAttribute('value','preset'); i.value='changed'; i.value",
3356 "changed",
3357 ),
3358 (
3359 "document.createElement('input').defaultChecked",
3360 "false",
3361 ),
3362 (
3363 "var i=document.createElement('input'); i.defaultChecked=true; i.getAttribute('checked')",
3364 "checked",
3365 ),
3366 (
3367 "var i=document.createElement('input'); i.defaultChecked=true; i.checked=false; i.defaultChecked",
3368 "true",
3369 ),
3370 (
3371 "document.createElement('option').defaultSelected",
3372 "false",
3373 ),
3374 (
3375 "var o=document.createElement('option'); o.defaultSelected=true; o.getAttribute('selected')",
3376 "selected",
3377 ),
3378 ("document.createElement('output').type", "output"),
3382 (
3383 "var o=document.createElement('output'); o.setAttribute('type','bogus'); o.type",
3384 "output",
3385 ),
3386 (
3389 "var f=document.createElement('iframe'); f.srcdoc='<p>hi</p>'; f.getAttribute('srcdoc')",
3390 "<p>hi</p>",
3391 ),
3392 (
3393 "var f=document.createElement('iframe'); f.setAttribute('srcdoc','<b>x</b>'); f.srcdoc",
3394 "<b>x</b>",
3395 ),
3396 ("document.createElement('li').value", "0"),
3401 (
3402 "var l=document.createElement('li'); l.value=5; l.value",
3403 "5",
3404 ),
3405 (
3406 "var l=document.createElement('li'); l.setAttribute('value','bogus'); l.value",
3407 "0",
3408 ),
3409 (
3412 "var i=document.createElement('input'); i.pattern='[0-9]+'; i.getAttribute('pattern')",
3413 "[0-9]+",
3414 ),
3415 (
3416 "var i=document.createElement('input'); i.setAttribute('pattern','[a-z]+'); i.pattern",
3417 "[a-z]+",
3418 ),
3419 (
3422 "var i=document.createElement('input'); i.capture='environment'; i.getAttribute('capture')",
3423 "environment",
3424 ),
3425 (
3426 "var i=document.createElement('input'); i.setAttribute('capture','user'); i.capture",
3427 "user",
3428 ),
3429 (
3433 "var i=document.createElement('input'); i.autocomplete='email'; i.getAttribute('autocomplete')",
3434 "email",
3435 ),
3436 (
3437 "var i=document.createElement('input'); i.setAttribute('autocomplete','off'); i.autocomplete",
3438 "off",
3439 ),
3440 (
3441 "document.createElement('input').autofocus",
3442 "false",
3443 ),
3444 (
3445 "var i=document.createElement('input'); i.autofocus=true; i.getAttribute('autofocus')",
3446 "autofocus",
3447 ),
3448 (
3449 "var i=document.createElement('input'); i.min='0'; i.max='10'; i.step='2'; i.min+','+i.max+','+i.step",
3450 "0,10,2",
3451 ),
3452 (
3453 "var i=document.createElement('input'); i.maxLength='5'; i.maxLength",
3454 "5",
3455 ),
3456 (
3461 "typeof document.createElement('input').maxLength",
3462 "number",
3463 ),
3464 (
3465 "document.createElement('input').maxLength",
3466 "-1",
3467 ),
3468 (
3469 "var i=document.createElement('input'); i.minLength=3; typeof i.minLength + ',' + i.minLength",
3470 "number,3",
3471 ),
3472 (
3473 "document.createElement('textarea').minLength",
3474 "-1",
3475 ),
3476 (
3477 "var a=document.createElement('a'); a.target='_blank'; a.rel='noopener'; a.download='f.txt'; a.target+','+a.rel+','+a.download",
3478 "_blank,noopener,f.txt",
3479 ),
3480 (
3481 "var i=document.createElement('input'); i.placeholder='enter name'; i.placeholder",
3482 "enter name",
3483 ),
3484 (
3485 "var d=document.createElement('details'); d.open",
3486 "false",
3487 ),
3488 (
3489 "var d=document.createElement('details'); d.open=true; d.open",
3490 "true",
3491 ),
3492 (
3493 "var d=document.createElement('details'); d.setAttribute('open',''); d.open",
3494 "true",
3495 ),
3496 (
3497 "var i=document.createElement('input'); i.name='email'; i.name",
3498 "email",
3499 ),
3500 (
3504 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.value",
3505 "a",
3506 ),
3507 (
3508 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.value='b'; s.value",
3509 "b",
3510 ),
3511 (
3512 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.value='b'; s.selectedIndex",
3513 "1",
3514 ),
3515 (
3516 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.selectedIndex=1; s.value",
3517 "b",
3518 ),
3519 (
3522 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.options[1].index",
3523 "1",
3524 ),
3525 (
3526 "document.createElement('option').index",
3527 "0",
3528 ),
3529 (
3532 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.length",
3533 "2",
3534 ),
3535 (
3536 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.length=1; s.options.length + ',' + s.value",
3537 "1,a",
3538 ),
3539 (
3540 "var s=document.createElement('select'); s.length=2; s.options.length",
3541 "2",
3542 ),
3543 (
3548 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.remove(0); s.options.length + ',' + s.value",
3549 "1,b",
3550 ),
3551 (
3552 "var d=document.createElement('div'); var s=document.createElement('select'); d.appendChild(s); s.remove(); d.children.length",
3555 "0",
3556 ),
3557 (
3558 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option>\"; s.remove(-1); s.options.length",
3561 "1",
3562 ),
3563 (
3567 "var t=document.createElement('textarea'); t.value='hi'; t.value",
3568 "hi",
3569 ),
3570 ("typeof console.table", "function"),
3571 ("typeof globalThis", "object"),
3572 ("typeof globalThis.document", "object"),
3573 ("typeof fetch", "function"),
3575 ("(await fetch('data:,hello')).status", "200"),
3576 ("(await fetch('data:,hello')).ok", "true"),
3577 ("await (await fetch('data:,hello world')).text()", "hello world"),
3578 ("await fetch('data:text/plain,abc').then(r => r.text())", "abc"),
3579 ("(await (await fetch('data:application/json,{\"a\":7,\"b\":[1,2]}')).json()).a", "7"),
3580 ("(await (await fetch('data:application/json,{\"a\":7,\"b\":[1,2]}')).json()).b.length", "2"),
3581 ("(await (await fetch('data:,hello')).blob()).size", "5"),
3583 ("await (await (await fetch('data:,hello')).blob()).text()", "hello"),
3584 (
3587 "var buf = await (await fetch('data:,A')).arrayBuffer(); new DataView(buf).getUint8(0)",
3588 "65",
3589 ),
3590 ("await fetch('ftp://x/y').then(() => 'ok', e => 'err:' + (e.message || e))", "err:fetch: only absolute http(s) and data URLs are supported"),
3591 ("(await fetch('data:,hi')).statusText", "OK"),
3595 (
3599 "var r = await fetch('data:,hello'); var c = r.clone(); (await c.text()) + ',' + (await r.text())",
3600 "hello,hello",
3601 ),
3602 ("(await fetch('data:,x')).clone().status", "200"),
3603 (
3606 "(await fetch('data:,hi')).url",
3607 "data:,hi",
3608 ),
3609 ("new Response('hi').status", "200"),
3612 ("await new Response('hi', {status: 201}).text()", "hi"),
3613 (
3614 "(await new Response(JSON.stringify({a:1}), {headers:{'content-type':'application/json'}}).json()).a",
3615 "1",
3616 ),
3617 ("(await Response.json({a:5}).json()).a", "5"),
3619 ("Response.json({}).headers.get('content-type')", "application/json"),
3620 ("Response.error().ok", "false"),
3622 ("Response.error().type", "error"),
3623 ("Response.redirect('https://e.com/x').status", "302"),
3625 ("Response.redirect('https://e.com/x', 301).headers.get('location')", "https://e.com/x"),
3626 (
3627 "(await fetch('data:,x')).clone().url",
3628 "data:,x",
3629 ),
3630 (
3633 "await fetch('data:,hi', {signal: AbortSignal.abort('why')}).then(() => 'no-throw', e => 'caught:' + e)",
3634 "caught:why",
3635 ),
3636 (
3637 "await fetch('data:,hi', {signal: new AbortController().signal}).then(r => r.status)",
3638 "200",
3639 ),
3640 ("new Request('data:,hi').url", "data:,hi"),
3643 ("new Request('data:,hi', {method:'POST'}).method", "POST"),
3644 (
3647 "new Request('data:,hi', {headers:{'X-Foo':'bar'}}).headers.get('x-foo')",
3648 "bar",
3649 ),
3650 ("typeof new Request('data:,hi').headers.get", "function"),
3651 ("(await fetch('data:,hi')).type", "basic"),
3653 ("(await fetch('data:,hi')).redirected", "false"),
3654 ("await fetch(new Request('data:,hello')).then(r => r.text())", "hello"),
3655 (
3656 "await fetch(new Request('data:,x'), {method:'GET'}).then(r => r.status)",
3657 "200",
3658 ),
3659 ("new Headers({'Content-Type':'text/plain'}).get('content-type')", "text/plain"),
3662 ("new Headers([['A','1'],['b','2']]).get('a')", "1"),
3666 ("new Headers().has('x')", "false"),
3667 (
3668 "var h=new Headers(); h.set('X-Foo','1'); h.has('x-foo')",
3669 "true",
3670 ),
3671 (
3672 "var h=new Headers(); h.append('a','1'); h.append('a','2'); h.get('a')",
3673 "1, 2",
3674 ),
3675 (
3676 "var h=new Headers({a:'1'}); h.delete('a'); h.has('a')",
3677 "false",
3678 ),
3679 (
3680 "var h=new Headers({a:'1',b:'2'}); var s=''; h.forEach(function(v,k){s+=k+'='+v+';'}); s",
3681 "a=1;b=2;",
3682 ),
3683 (
3686 "Array.from(new Headers({b:'2',a:'1'}).entries()).map(function(e){return e[0]+'='+e[1]}).join(',')",
3687 "a=1,b=2",
3688 ),
3689 ("Array.from(new Headers({a:'1',b:'2'}).keys()).join(',')", "a,b"),
3690 ("Array.from(new Headers({a:'1',b:'2'}).values()).join(',')", "1,2"),
3691 (
3692 "var s=''; for (var e of new Headers({a:'1',b:'2'})) { s += e[0]+e[1]; } s",
3693 "a1b2",
3694 ),
3695 (
3699 "typeof (await fetch('data:,hi')).headers.get",
3700 "function",
3701 ),
3702 (
3705 "var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.getResponseHeader('x') === null",
3706 "true",
3707 ),
3708 ("typeof XMLHttpRequest", "function"),
3710 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.responseText", "hi"),
3711 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.status", "200"),
3712 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.readyState", "4"),
3713 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.statusText", "OK"),
3716 ("var g=''; var x=new XMLHttpRequest(); x.onload=function(){g=x.responseText}; x.open('GET','data:,YO'); x.send(); g", "YO"),
3717 ("var g=''; var x=new XMLHttpRequest(); x.addEventListener('load',function(){g='L'+x.status}); x.open('GET','data:,q'); x.send(); g", "L200"),
3718 (
3721 "var g=''; var x=new XMLHttpRequest(); var fn=function(){g='L'}; x.addEventListener('load',fn); x.removeEventListener('load',fn); x.open('GET','data:,q'); x.send(); g",
3722 "",
3723 ),
3724 (
3725 "typeof new XMLHttpRequest().removeEventListener",
3726 "function",
3727 ),
3728 ("var x=new XMLHttpRequest(); x.open('GET','data:application/json,{\"n\":5}'); x.send(); JSON.parse(x.responseText).n", "5"),
3729 ("await (await fetch('data:,hi', {method:'POST', body:'x'})).text()", "hi"),
3731 ("(await fetch('data:,ok', {method:'POST', headers:{'Content-Type':'application/json'}, body:'{}'})).status", "200"),
3732 ("var x=new XMLHttpRequest(); x.open('POST','data:,ok'); x.setRequestHeader('Content-Type','application/json'); x.send('{\"a\":1}'); x.responseText", "ok"),
3733 ("var x=new XMLHttpRequest(); x.open('POST','data:,z'); x.send(); x.status", "200"),
3734 ("/\\d+/.test('abc123')", "true"),
3736 ("/^\\d+$/.test('abc')", "false"),
3737 ("'2026-06-15'.match(/(\\d+)-(\\d+)-(\\d+)/)[2]", "06"),
3738 ("'hello world'.replace(/o/g, '0')", "hell0 w0rld"),
3739 ("'a1b2c3'.replace(/\\d/g, m => '[' + m + ']')", "a[1]b[2]c[3]"),
3740 ("'one,two;three four'.split(/[,; ]/).join('|')", "one|two|three|four"),
3741 ("'foobarbaz'.match(/a/g).length", "2"),
3742 ("new RegExp('[A-Z]+').test('hello WORLD')", "true"),
3743 ("'Hello'.replace(/(\\w)(\\w+)/, '$2$1')", "elloH"),
3744 ("'price: $42'.match(/\\$(\\d+)/)[1]", "42"),
3745 ("/cat/i.test('CAT')", "true"),
3746 ("'a,b,,c'.split(/,/).length", "4"),
3747 ("/x/y.sticky", "true"),
3750 ("/x/g.sticky", "false"),
3751 ("/./s.dotAll", "true"),
3752 ("/./.dotAll", "false"),
3753 (
3754 "var re=/foo/y; re.lastIndex=3; re.test('xxxfoo')",
3755 "true",
3756 ),
3757 (
3758 "var re=/foo/y; re.lastIndex=2; re.test('xxxfoo')",
3759 "false",
3760 ),
3761 (
3762 "var re=/foo/y; var a=re.exec('foofoo').index; var b=re.exec('foofoo').index; a+','+b",
3763 "0,3",
3764 ),
3765 ("/x/d.hasIndices", "true"),
3768 ("/x/.hasIndices", "false"),
3769 (
3770 "var m=/(foo)(bar)/d.exec('xxfoobar'); m.indices[0].join(',')",
3771 "2,8",
3772 ),
3773 (
3774 "var m=/(foo)(bar)/d.exec('xxfoobar'); m.indices[1].join(',')+'/'+m.indices[2].join(',')",
3775 "2,5/5,8",
3776 ),
3777 (
3778 "var m=/(foo)(baz)?/d.exec('foo'); typeof m.indices[2]",
3779 "undefined",
3780 ),
3781 ("/x/.exec('x').indices", "undefined"),
3782 ("var n=0; var id=setInterval(function(){n++;}, 10); clearInterval(id); n", "0"),
3787 ("typeof window.innerWidth", "number"),
3789 ("typeof window.innerHeight", "number"),
3790 ("var x=new XMLHttpRequest(); x.open('PUT','data:text/plain,HELLO'); x.send('body'); x.status", "200"),
3794 ("var x=new XMLHttpRequest(); x.open('PUT','data:text/plain,HELLO'); x.send('body'); x.responseText", "HELLO"),
3795 ("var x=new XMLHttpRequest(); x.open('DELETE','data:text/plain,GONE'); x.send(); x.status", "200"),
3796 ("var x=new XMLHttpRequest(); x.open('DELETE','data:text/plain,GONE'); x.send(); x.responseText", "GONE"),
3797 ("var x=new XMLHttpRequest(); x.open('PATCH','data:text/plain,Pdata'); x.send('d'); x.responseText", "Pdata"),
3798 ("var x=new XMLHttpRequest(); x.open('put','data:text/plain,low'); x.send('b'); x.responseText", "low"),
3800 ("history.back(); history._pending_nav", "-1"),
3803 ("history.forward(); history._pending_nav", "1"),
3804 ("history.go(-2); history._pending_nav", "-2"),
3805 ("history.back(); history.back(); history._pending_nav", "-2"),
3806 ("history.go(0); history._pending_nav || 0", "0"),
3807 ("window.addEventListener('popstate', function(){}); window._popstate_listeners.length", "1"),
3809 ("window.addEventListener('scroll', function(){}); window._scroll_listeners.length", "1"),
3811 ("window.addEventListener('scroll', function(){}); window.addEventListener('scroll', function(){}); window._scroll_listeners.length", "2"),
3812 ("window.scrollY", "0"),
3814 (
3817 "var got=null; window.addEventListener('message', function(e){ got=e.data; }); \
3818 window.postMessage({x:1}); got.x",
3819 "1",
3820 ),
3821 (
3822 "var t=null; window.addEventListener('message', function(e){ t=e.type; }); \
3823 window.postMessage('hi'); t",
3824 "message",
3825 ),
3826 (
3830 "var c=new AbortController(); var n=0; \
3831 window.addEventListener('message', function(){n++;}, {signal: c.signal}); \
3832 window.postMessage('a'); c.abort(); window.postMessage('b'); n",
3833 "1",
3834 ),
3835 (
3837 "var c=new AbortController(); c.abort(); var n=0; \
3838 window.addEventListener('message', function(){n++;}, {signal: c.signal}); \
3839 window.postMessage('a'); n",
3840 "0",
3841 ),
3842 ("var p=new Proxy({}, {get:function(t,k){return 'G:'+k;}}); p.foo", "G:foo"),
3845 ("var p=new Proxy({a:42}, {}); p.a", "42"),
3847 ("var log=''; var p=new Proxy({}, {set:function(t,k,v){t['_'+k]=v;return true;}}); p.x=9; p._x", "9"),
3849 ("var p=new Proxy({}, {}); p.y=7; p.y", "7"),
3851 ("var p=new Proxy({}, {has:function(t,k){return k==='magic';}}); ('magic' in p)", "true"),
3853 ("var p=new Proxy({}, {has:function(t,k){return k==='magic';}}); ('other' in p)", "false"),
3854 ("var p=new Proxy({z:1}, {}); ('z' in p)", "true"),
3856 ("var p=new Proxy({z:1}, {}); ('w' in p)", "false"),
3857 (
3861 "var log=''; var p=new Proxy({a:1}, {deleteProperty:function(t,k){log+=k; delete t[k]; return true;}}); delete p.a; log + ':' + ('a' in p)",
3862 "a:false",
3863 ),
3864 ("var p=new Proxy({a:1}, {}); delete p.a; ('a' in p)", "false"),
3866 ("var p=new Proxy({a:1}, {}); delete p['a']; ('a' in p)", "false"),
3868 (
3872 "var t={}; var p=new Proxy(t, {}); Object.defineProperty(p, 'x', {value:5}); t.x",
3873 "5",
3874 ),
3875 (
3876 "var p=new Proxy({x:5}, {}); Object.getOwnPropertyDescriptor(p, 'x').value",
3877 "5",
3878 ),
3879 ("var f=function(a,b){return a+b;}; var p=new Proxy(f, {apply:function(t,thiz,args){return args[0]*args[1];}}); p(3,4)", "12"),
3881 ("var f=function(a,b){return a+b;}; var p=new Proxy(f, {}); p(3,4)", "7"),
3883 ("function C(){} var p=new Proxy(C, {construct:function(t,args){return {made:args[0]};}}); (new p(99)).made", "99"),
3885 ("function C(x){this.v=x;} var p=new Proxy(C, {}); (new p(5)).v", "5"),
3887 ("var o={a:1}; Reflect.set(o,'a',8); Reflect.get(o,'a')", "8"),
3889 ("Reflect.has({k:1},'k')", "true"),
3891 ("Reflect.has({k:1},'x')", "false"),
3892 ("var o={a:1,b:2}; Reflect.deleteProperty(o,'a'); ('a' in o)", "false"),
3894 ("Reflect.ownKeys({a:1,b:2,c:3}).length", "3"),
3896 ("var o={}; Reflect.defineProperty(o,'x',{value:42}); o.x", "42"),
3898 ("Reflect.apply(function(a,b){return a-b;}, null, [10,3])", "7"),
3900 (
3904 "Reflect.apply(function(a,b){return a-b;}, null, {0:10,1:3,length:2})",
3905 "7",
3906 ),
3907 ("function P(x){this.x=x;} Reflect.construct(P,[77]).x", "77"),
3909 (
3910 "function P(x){this.x=x;} Reflect.construct(P,{0:77,length:1}).x",
3911 "77",
3912 ),
3913 ("var base={greet:'hi'}; var o=Object.create(base); Reflect.get(o,'greet')", "hi"),
3915 ("var p=new Proxy({n:5}, {get:function(t,k){return Reflect.get(t,k)*2;}}); p.n", "10"),
3917 ("var p=new Proxy([10,20,30], {get:function(t,k){return Reflect.get(t,k);}}); p[1]", "20"),
3919 ("var inner=new Proxy({v:1},{get:function(t,k){return 100;}}); var outer=new Proxy(inner,{}); outer.v", "100"),
3921 ("var wm=new WeakMap(); var k={}; wm.set(k,42); wm.get(k)", "42"),
3923 ("var wm=new WeakMap(); var k={}; wm.set(k,1); wm.has(k)", "true"),
3924 ("var wm=new WeakMap(); var k={}; wm.set(k,1); wm.delete(k); wm.has(k)", "false"),
3925 ("var ws=new WeakSet(); var o={}; ws.add(o); ws.has(o)", "true"),
3927 ("var ws=new WeakSet(); var o={}; ws.add(o); ws.delete(o); ws.has(o)", "false"),
3928 (
3931 "try { new WeakMap().set(1,'x'); 'no-throw' } catch(e) { 'caught' }",
3932 "caught",
3933 ),
3934 (
3935 "try { new WeakSet().add('x'); 'no-throw' } catch(e) { 'caught' }",
3936 "caught",
3937 ),
3938 ("var k1={}; var wm=new WeakMap([[k1,1]]); wm.get(k1)", "1"),
3941 ("var o1={}; var ws=new WeakSet([o1]); ws.has(o1)", "true"),
3942 ("var o={v:7}; var wr=new WeakRef(o); wr.deref().v", "7"),
3944 ("typeof Symbol('x')", "string"),
3946 ("Symbol('a') === Symbol('a')", "false"),
3947 ("Symbol.for('x') === Symbol.for('x')", "true"),
3948 ("Symbol.keyFor(Symbol.for('mykey'))", "mykey"),
3950 ("typeof Symbol.keyFor(Symbol('local'))", "undefined"),
3951 ("typeof Symbol.iterator", "string"),
3952 ("typeof MutationObserver", "function"),
3954 ("var mo = new MutationObserver(function(){}); typeof mo.observe", "function"),
3956 ("var mo = new MutationObserver(function(){}); typeof mo.disconnect + ',' + typeof mo.takeRecords", "function,function"),
3958 ("var mo = new MutationObserver(function(){}); mo.takeRecords().length", "0"),
3960 (
3963 "var el=document.createElement('div'); el.setAttribute('foo','bar'); \
3964 var mo=new MutationObserver(function(){}); \
3965 mo.observe(el,{attributes:true,attributeOldValue:true}); \
3966 el.setAttribute('foo','baz'); var r=mo.takeRecords(); \
3967 r.length+','+r[0].attributeName+','+r[0].oldValue",
3968 "1,foo,bar",
3969 ),
3970 (
3973 "var el=document.createElement('div'); \
3974 var mo=new MutationObserver(function(){}); \
3975 mo.observe(el,{attributes:true,attributeFilter:['foo']}); \
3976 el.setAttribute('bar','x'); el.setAttribute('foo','y'); \
3977 var r=mo.takeRecords(); r.length+','+r[0].attributeName",
3978 "1,foo",
3979 ),
3980 (
3984 "var el=document.createElement('div'); el.setAttribute('foo','bar'); \
3985 var mo=new MutationObserver(function(){}); \
3986 mo.observe(el,{attributes:true,attributeOldValue:true}); \
3987 el.removeAttribute('foo'); var r=mo.takeRecords(); \
3988 r.length+','+r[0].attributeName+','+r[0].oldValue",
3989 "1,foo,bar",
3990 ),
3991 (
3996 "var el=document.createElement('div'); el.className='a'; \
3997 var mo=new MutationObserver(function(){}); \
3998 mo.observe(el,{attributes:true,attributeOldValue:true}); \
3999 el.classList.add('b'); var r=mo.takeRecords(); \
4000 r.length+','+r[0].attributeName+','+r[0].oldValue",
4001 "1,class,a",
4002 ),
4003 (
4004 "var el=document.createElement('div'); el.className='a b'; \
4005 var mo=new MutationObserver(function(){}); \
4006 mo.observe(el,{attributes:true,attributeOldValue:true}); \
4007 el.classList.remove('b'); var r=mo.takeRecords(); \
4008 r.length+','+r[0].attributeName+','+r[0].oldValue",
4009 "1,class,a b",
4010 ),
4011 (
4015 "var el=document.createElement('div'); el.style.color='red'; \
4016 var mo=new MutationObserver(function(){}); \
4017 mo.observe(el,{attributes:true,attributeOldValue:true}); \
4018 el.style.color='blue'; var r=mo.takeRecords(); \
4019 r.length+','+r[0].attributeName+','+r[0].oldValue",
4020 "1,style,color: red",
4021 ),
4022 (
4029 "var el=document.createElement('div'); el.setAttribute('data-x','1'); \
4030 var mo=new MutationObserver(function(){}); \
4031 mo.observe(el,{attributeOldValue:true}); \
4032 el.setAttribute('data-x','2'); var r=mo.takeRecords(); \
4033 r.length+','+r[0].type",
4034 "1,attributes",
4035 ),
4036 (
4038 "var el=document.createElement('div'); \
4039 var mo=new MutationObserver(function(){}); \
4040 mo.observe(el,{attributeFilter:['data-x']}); \
4041 el.setAttribute('data-x','1'); var r=mo.takeRecords(); \
4042 r.length",
4043 "1",
4044 ),
4045 (
4047 "var el=document.createElement('div'); el.textContent='hi'; \
4048 var mo=new MutationObserver(function(){}); \
4049 mo.observe(el,{characterDataOldValue:true, subtree:true}); \
4050 el.textContent='bye'; var r=mo.takeRecords(); \
4051 r.length+','+r[0].type+','+r[0].oldValue",
4052 "1,characterData,hi",
4053 ),
4054 (
4057 "var el=document.createElement('div'); el.setAttribute('data-x','1'); \
4058 var mo=new MutationObserver(function(){}); \
4059 mo.observe(el,{attributes:false, attributeOldValue:true}); \
4060 el.setAttribute('data-x','2'); var r=mo.takeRecords(); \
4061 r.length",
4062 "0",
4063 ),
4064 (
4069 "var el=document.createElement('div'); \
4070 var mo=new MutationObserver(function(){}); \
4071 mo.observe(el,{childList:true}); \
4072 el.innerHTML='<span>hi</span>'; var r=mo.takeRecords(); \
4073 r.length+','+r[0].type+','+r[0].addedNodes.length",
4074 "1,childList,1",
4075 ),
4076 (
4079 "var el=document.createElement('div'); \
4080 var mo=new MutationObserver(function(){}); \
4081 mo.observe(el,{childList:true}); \
4082 el.textContent='hi'; var r=mo.takeRecords(); \
4083 r.length+','+r[0].type+','+r[0].addedNodes.length",
4084 "1,childList,1",
4085 ),
4086 (
4094 "var el=document.createElement('div'); el.textContent='hi'; \
4095 var mo=new MutationObserver(function(){}); \
4096 mo.observe(el,{characterData:true, subtree:true}); \
4097 el.textContent='bye'; var r=mo.takeRecords(); \
4098 r.length+','+r[0].type",
4099 "1,characterData",
4100 ),
4101 (
4103 "var el=document.createElement('div'); el.textContent='hi'; \
4104 var mo=new MutationObserver(function(){}); \
4105 mo.observe(el,{characterData:true, characterDataOldValue:true, subtree:true}); \
4106 el.textContent='bye'; var r=mo.takeRecords(); \
4107 r[0].oldValue",
4108 "hi",
4109 ),
4110 (
4112 "var el=document.createElement('div'); el.textContent='hi'; \
4113 var mo=new MutationObserver(function(){}); \
4114 mo.observe(el,{characterData:true, subtree:true}); \
4115 el.textContent='hi'; var r=mo.takeRecords(); r.length",
4116 "0",
4117 ),
4118 (
4122 "var el=document.createElement('div'); el.textContent='hi'; \
4123 var mo=new MutationObserver(function(){}); \
4124 mo.observe(el,{childList:true}); \
4125 el.textContent='bye'; var r=mo.takeRecords(); r.length",
4126 "0",
4127 ),
4128 ("var o={}; Object.defineProperty(o,'x',{value:42,writable:true}); o.x", "42"),
4130 ("var o={_v:7}; Object.defineProperty(o,'v',{get:function(){return this._v*2;}}); o.v", "14"),
4132 ("var o={_x:0}; Object.defineProperty(o,'x',{get:function(){return this._x;},set:function(v){this._x=v+1;}}); o.x=9; o.x", "10"),
4134 ("var o={_s:''}; Object.defineProperty(o,'s',{set:function(v){this._s=v;}}); o.s='hi'; o._s", "hi"),
4136 ("var o={_v:7}; o.__defineGetter__('v', function(){return this._v*2;}); o.v", "14"),
4139 ("var o={_x:0}; o.__defineSetter__('x', function(v){this._x=v+1;}); o.x=9; o._x", "10"),
4140 (
4142 "var o={_x:1}; o.__defineGetter__('x', function(){return this._x;}); \
4143 o.__defineSetter__('x', function(v){this._x=v;}); o.x=5; o.x",
4144 "5",
4145 ),
4146 ("var o={}; o.__defineGetter__('v', function(){return 1;}); typeof o.__lookupGetter__('v')", "function"),
4147 ("var o={}; typeof o.__lookupGetter__('nope')", "undefined"),
4148 ("var o={}; Object.defineProperties(o,{a:{value:1},b:{value:2}}); o.a+o.b", "3"),
4150 ("var o={n:0}; Object.defineProperty(o,'next',{get:function(){return ++this.n;}}); o.next; o.next; o.next", "3"),
4152 ("var o={x:5}; Object.getOwnPropertyDescriptor(o,'x').value", "5"),
4154 ("var o={}; Object.defineProperty(o,'v',{get:function(){return 99;}}); typeof Object.getOwnPropertyDescriptor(o,'v').get", "function"),
4156 ("Object.getOwnPropertyDescriptor({x:1},'y')", "undefined"),
4158 ("var o={a:1}; Object.defineProperty(o,'b',{get:function(){return 2;}}); Object.getOwnPropertyDescriptors(o).a.value + Object.getOwnPropertyDescriptors(o).b.get()", "3"),
4160 ("var o={_v:7, get v(){return this._v*2;}}; o.v", "14"),
4164 ("var o={_x:0, get x(){return this._x;}, set x(v){this._x=v+1;}}; o.x=9; o.x", "10"),
4166 ("var o={get: 5}; o.get", "5"),
4169 ("var o={get(){return 7;}}; o.get()", "7"),
4170 (
4172 "class Circle { constructor(r){this.r=r;} get area(){return Math.round(Math.PI*this.r*this.r);} } new Circle(2).area",
4173 "13",
4174 ),
4175 (
4177 "class Box { constructor(){this._w=0;} get w(){return this._w;} set w(v){this._w=v<0?0:v;} } var b=new Box(); b.w=-5; b.w",
4178 "0",
4179 ),
4180 (
4182 "class Config { static get version(){return '1.0';} } Config.version",
4183 "1.0",
4184 ),
4185 ("var a=[1,2,3,4]; var r=a.splice(1,2); r.join(',')+'/'+a.join(',')", "2,3/1,4"),
4187 ("var a=[1,4]; a.splice(1,0,2,3); a.join(',')", "1,2,3,4"),
4189 ("[1,2,3,2,1].lastIndexOf(2)", "3"),
4191 ("[1,2,3,4,5].copyWithin(0,3).join(',')", "4,5,3,4,5"),
4193 ("[1,2,3,4,5].copyWithin(-2,0).join(',')", "1,2,3,1,2"),
4195 ("[1,2,3,4,5].copyWithin(0,3,4).join(',')", "4,2,3,4,5"),
4197 ("var a=[3,1,2]; var s=a.toSorted(); a[0]+'/'+s.join(',')", "3/1,2,3"),
4199 ("[undefined,3,undefined,1,2].sort((a,b)=>a-b).join(',')", "1,2,3,,"),
4201 ("[undefined,3,1,2].sort().join(',')", "1,2,3,"),
4202 ("[undefined,3,1,2].toSorted((a,b)=>a-b).join(',')", "1,2,3,"),
4203 ("[5]*2", "10"),
4205 ("[]+1", "1"),
4206 ("['5']-2", "3"),
4207 ("[1,2]*1", "NaN"),
4208 ("new Proxy([5],{})*2", "10"),
4212 ("+new Proxy([5],{})", "5"),
4213 ("[5]==5", "true"),
4216 ("[5]=='5'", "true"),
4217 ("''==[]", "true"),
4218 ("[1,2]==5", "false"),
4219 ("Number('0x1F')", "31"),
4221 ("Number('0o17')", "15"),
4222 ("Number('0b101')", "5"),
4223 ("+'0xff'", "255"),
4224 ("'abc'.normalize()", "abc"),
4227 ("'abc'.normalize('NFD')", "abc"),
4228 ("(function(){ try { 'x'.normalize('bogus'); return 'no-throw'; } catch(e) { return 'threw'; } })()", "threw"),
4229 ("'e\\u0301'.normalize('NFC') === '\\u00e9'", "true"),
4231 ("'\\u00e9'.normalize('NFD') === 'e\\u0301'", "true"),
4232 ("'\\u00e9'.normalize('NFC') === '\\u00e9'", "true"),
4233 ("var a=null; a?.['x']", "undefined"),
4237 ("var a=undefined; a?.[0]", "undefined"),
4238 ("var a=[1,2,3]; a?.[1]", "2"),
4239 ("var f=null; f?.['x'](1,2)", "undefined"),
4240 ("var a=null; a?.b.c", "undefined"),
4243 ("var a=undefined; a?.b.c.d", "undefined"),
4244 ("var a=null; a?.b[0].c", "undefined"),
4245 ("var a=null; a?.b()", "undefined"),
4246 ("var o={b:{c:5}}; o?.b.c", "5"),
4247 ("(function(){ function Base(){} Base.prototype.x=1; function D(){this.y=2;} D.prototype=Object.create(Base.prototype); var d=new D(); var ks=[]; for(var k in d) ks.push(k); return ks.sort().join(','); })()", "constructor,x,y"),
4250 ("(function(){ function Base(){} Base.prototype.x=1; function D(){this.x=99;} D.prototype=Object.create(Base.prototype); var d=new D(); var ks=[]; for(var k in d) ks.push(k); return ks.sort().join(','); })()", "constructor,x"),
4252 ("'x' in {get x(){return 1;}}", "true"),
4255 ("(function(){ var o={get x(){return 1;}}; var ks=[]; for(var k in o) ks.push(k); return ks.join(','); })()", "x"),
4256 ("Object.keys({get x(){return 1;}}).join(',')", "x"),
4258 ("Object.values({get x(){return 42;}}).join(',')", "42"),
4259 ("JSON.stringify(Object.entries({get x(){return 7;}}))", "[[\"x\",7]]"),
4260 ("Object.assign({}, {get x(){return 9;}}).x", "9"),
4261 ("JSON.stringify({get x(){return 5;}})", "{\"x\":5}"),
4263 ("({...{get x(){return 3;}}}).x", "3"),
4265 ("var s={get x(){return 1;}}; var o={...s, y:2}; o.x+','+o.y", "1,2"),
4266 ("(150).toExponential(2)", "1.50e+2"),
4268 ("(0.0012345).toExponential(3)", "1.235e-3"),
4269 ("(123.456).toPrecision(5)", "123.46"),
4270 ("(0.0001234).toPrecision(2)", "0.00012"),
4271 ("(123456).toPrecision(2)", "1.2e+5"),
4272 ("(5).valueOf()", "5"),
4273 ("(1).toFixed(0)", "1"),
4278 ("(1.5).toFixed(100).length", "102"),
4279 (
4280 "try { (1).toFixed(-1); 'no-throw' } catch(e) { 'threw' }",
4281 "threw",
4282 ),
4283 (
4284 "try { (1).toFixed(101); 'no-throw' } catch(e) { 'threw' }",
4285 "threw",
4286 ),
4287 ("(NaN).toFixed(2)", "NaN"),
4288 ("(Infinity).toFixed(2)", "Infinity"),
4289 ("[1,2,3].toLocaleString()", "1,2,3"),
4291 ("[1,null,undefined,2].toLocaleString()", "1,,,2"),
4292 ("(1234.5).toLocaleString()", "1,234.5"),
4295 ("(1234567).toLocaleString()", "1,234,567"),
4296 ("(123).toLocaleString()", "123"),
4297 ("(-1234567.89).toLocaleString()", "-1,234,567.89"),
4298 ("new Intl.NumberFormat().format(1234567)", "1,234,567"),
4301 ("new Intl.NumberFormat('en-US').format(-1234.5)", "-1,234.5"),
4302 ("typeof Intl.NumberFormat().format", "function"),
4303 ("(0).toLocaleString()", "0"),
4304 ("(NaN).toLocaleString()", "NaN"),
4305 ("(Infinity).toLocaleString()", "Infinity"),
4306 ("true.toString()", "true"),
4309 ("false.toString()", "false"),
4310 ("true.valueOf()", "true"),
4311 ("(false).valueOf() === false", "true"),
4312 ("function foo(a,b){} foo.name", "foo"),
4314 ("function foo(a,b){} foo.length", "2"),
4315 ("function foo(a,b=1,...c){} foo.length", "1"),
4316 ("(function(){}).length", "0"),
4317 ("Math.max.length", "0"),
4318 ("typeof Function.prototype", "object"),
4322 ("typeof Function.prototype.toString", "function"),
4323 ("function foo(){} Function.prototype.toString.call(foo).includes('foo')", "true"),
4324 ("function add(a,b){return a+b} Function.prototype.call.call(add, null, 2, 3)", "5"),
4325 ("var of = 7; of + 1", "8"),
4326 ("0x10000000000000000 === 18446744073709551616", "true"),
4327 ("function foo(a,b,c){} foo.bind(null).name", "bound foo"),
4328 ("function foo(a,b,c){} foo.bind(null).length", "3"),
4329 ("function foo(a,b,c){} foo.bind(null,1).length", "2"),
4330 ("function foo(a,b,c){} foo.bind(null,1,2,3,4).length", "0"),
4331 (
4334 "function foo(){} String(foo.bind(null)).includes('native code')",
4335 "true",
4336 ),
4337 ("Object.prototype.toString.call([1,2])", "[object Array]"),
4342 ("Object.prototype.toString.call({})", "[object Object]"),
4343 ("Object.prototype.toString.call(new Date())", "[object Date]"),
4344 ("Object.prototype.toString.call(/a/)", "[object RegExp]"),
4345 ("Object.prototype.toString.call(new Map())", "[object Map]"),
4346 ("Object.prototype.toString.call(new Set())", "[object Set]"),
4347 ("Object.prototype.toString.call(function(){})", "[object Function]"),
4348 ("Object.prototype.toString.call(null)", "[object Null]"),
4349 ("Object.prototype.toString.call(undefined)", "[object Undefined]"),
4350 (
4353 "class Foo { get [Symbol.toStringTag](){ return 'Foo'; } } Object.prototype.toString.call(new Foo())",
4354 "[object Foo]",
4355 ),
4356 (
4357 "var o={}; o['Symbol(Symbol.toStringTag)']='Bar'; Object.prototype.toString.call(o)",
4358 "[object Bar]",
4359 ),
4360 ("var f = function(){}; f.name", "f"),
4364 ("var g = () => {}; g.name", "g"),
4365 ("var h = function foo(){}; h.name", "foo"),
4367 ("({bar: function(){}}).bar.name", "bar"),
4369 ("({baz: () => {}}).baz.name", "baz"),
4370 ("({qux(){}}).qux.name", "qux"),
4373 ("var d=new Date(2020,0,1); var c=structuredClone(d); c.getTime()===d.getTime() && c!==d", "true"),
4376 ("var r=/abc/gi; var c=structuredClone(r); c.source+','+c.flags+','+(c!==r)", "abc,gi,true"),
4377 ("var o={get x(){return 1;}, y:2}; var {y, ...rest} = o; rest.x+','+rest.y", "1,undefined"),
4379 ("({get x(){return 1;}}).hasOwnProperty('x')", "true"),
4382 ("[1,2,3].hasOwnProperty(0)", "true"),
4383 ("[1,2,3].hasOwnProperty('length')", "true"),
4384 ("[1,2,3].hasOwnProperty(5)", "false"),
4385 ("Object.hasOwn({get x(){return 1;}}, 'x')", "true"),
4386 ("({}).toLocaleString()", "[object Object]"),
4387 ("[{}, {}].toLocaleString()", "[object Object],[object Object]"),
4388 ("Object.getOwnPropertyDescriptor([1,2,3], '0').value", "1"),
4391 ("Object.getOwnPropertyDescriptor([1,2,3], 'length').value", "3"),
4392 ("Object.keys(Object.getOwnPropertyDescriptors([1,2])).sort().join(',')", "0,1,length"),
4393 ("var a=[1,2,3]; Object.defineProperty(a,'0',{value:99}); a[0]", "99"),
4396 ("var a=[1,2]; Object.defineProperty(a,'5',{value:9}); a.length+','+a[5]", "6,9"),
4397 ("var a=[1,2,3]; Object.defineProperty(a,'length',{value:1}); a.join(',')", "1"),
4398 ("[...[1,2,3][Symbol.iterator]()].join(',')", "1,2,3"),
4402 ("var m=new Map([['a',1]]); [...m[Symbol.iterator]()][0].join(',')", "a,1"),
4403 ("[...new Set([1,2])[Symbol.iterator]()].join(',')", "1,2"),
4404 ("var it=[10,20].values(); it.next().value+','+it.next().value+','+it.next().done", "10,20,true"),
4408 ("var it=[1,2].entries(); it.next().value.join(',')", "0,1"),
4409 ("var it=[1,2].keys(); it.next().value+','+it.next().value", "0,1"),
4410 ("var it=new Map([['a',1]]).entries(); it.next().value.join(',')", "a,1"),
4411 ("var it=new Set([5,6]).values(); it.next().value+','+it.next().value", "5,6"),
4412 ("var it=[1].values(); it[Symbol.iterator]()===it", "true"),
4413 ("[...'ab'[Symbol.iterator]()].join(',')", "a,b"),
4415 ("var it='xy'[Symbol.iterator](); it.next().value+it.next().value+it.next().done", "xytrue"),
4416 ("Array.from([10,20].values()).join(',')", "10,20"),
4420 ("Array.from([1,2].entries()).map(e=>e.join(':')).join(',')", "0:1,1:2"),
4421 ("var m=new Map(new Map([['a',1]]).entries()); m.get('a')", "1"),
4422 ("var s=new Set([1,2,2,3].values()); [...s].join(',')", "1,2,3"),
4423 ("Object.keys([1,2].values()).length", "0"),
4426 ("JSON.stringify([1,2].values())", "{}"),
4427 ("Object.keys({...[1,2].values()}).length", "0"),
4428 ("new AggregateError([1,2],'m').errors.join(',')", "1,2"),
4432 ("new AggregateError([],'m') instanceof Error", "true"),
4433 (
4434 "await Promise.any([Promise.reject('a'),Promise.reject('b')]).catch(e => e.name+':'+e.errors.join(','))",
4435 "AggregateError:a,b",
4436 ),
4437 ("new Date('2024-01-15').getFullYear()+'-'+(new Date('2024-01-15').getMonth()+1)+'-'+new Date('2024-01-15').getDate()", "2024-1-15"),
4440 ("Date.parse('2024-01-15T00:00:00Z')", "1705276800000"),
4441 ("Date.parse('2024-01-15T02:00:00+02:00')", "1705276800000"),
4442 ("Date.parse('2024-01-15T09:00:00+0900')", "1705276800000"),
4444 ("Date.parse('2024-01-15T00:00:00+00')", "1705276800000"),
4445 ("new Date('2024-01-15T00:00:00.500Z').getTime()", "1705276800500"),
4446 ("isNaN(Date.parse('not a date'))", "true"),
4447 ("Date.parse('Mon, 15 Jan 2024 00:00:00 GMT')", "1705276800000"),
4451 ("Date.parse('15 Jan 2024 00:00:00 GMT')", "1705276800000"),
4452 ("Date.parse('Mon, 15 Jan 2024 02:00:00 +0200')", "1705276800000"),
4453 ("Date.UTC(2024, 0, 15) === Date.parse('2024-01-15T00:00:00Z')", "true"),
4455 ("new Date(Date.UTC(2024,0,15,10,30,0)).getUTCHours()", "10"),
4456 ("new Date(Date.UTC(2024,0)).getDate()", "1"),
4458 ("new Date('Mon, 15 Jan 2024 00:00:00 GMT').getFullYear()", "2024"),
4459 ("'2024-01-15'.match(/(?<year>\\d+)-(?<month>\\d+)-(?<day>\\d+)/).groups.year", "2024"),
4463 ("'2024-01-15'.match(/(?<year>\\d+)-(?<month>\\d+)-(?<day>\\d+)/).groups.month", "01"),
4464 ("/(?<a>x)(y)/.exec('xy')[2]", "y"),
4465 ("/(x)/.exec('x').groups", "undefined"),
4466 ("[...'a1 b2'.matchAll(/(?<letter>[a-z])(?<num>\\d)/g)].map(m=>m.groups.letter+m.groups.num).join(',')", "a1,b2"),
4467 ("'2024-01-15'.replace(/(?<y>\\d+)-(?<m>\\d+)-(?<d>\\d+)/, '$<d>/$<m>/$<y>')", "15/01/2024"),
4470 ("'abc'.replace(/b/, \"[$`|$']\")", "a[a|c]c"),
4471 ("'x'.replace(/(?<a>x)/, (m,a,off,str,groups)=>groups.a+'!')", "x!"),
4472 ("/\\u0041/.test('A')", "true"),
4475 ("/\\u{1F600}/u.test('\\u{1F600}')", "true"),
4476 ("/\\x41/.test('A')", "true"),
4477 ("'A1'.match(/\\u0041\\d/)[0]", "A1"),
4478 ("/[\\u0041-\\u005A]/.test('M')", "true"),
4480 ("/[\\x41-\\x5A]/.test('Z')", "true"),
4481 ("/[\\u0041-\\u005A]/.test('m')", "false"),
4482 ("'a1b2c'.split(/(\\d)/).join('|')", "a|1|b|2|c"),
4485 ("'axb'.split(/(x)|(y)/).join(',')", "a,x,,b"),
4486 ("'abc'.split(/b/).join(',')", "a,c"),
4487 ("class C { *gen(){ yield 1; yield 2; } } [...new C().gen()].join(',')", "1,2"),
4491 ("await (new (class C { async f(){ return 42; } })()).f()", "42"),
4492 ("class C { *gen(){ yield 'a'; } method(){ return 'm'; } } var c=new C(); [...c.gen()].join(',')+c.method()", "am"),
4493 ("[...{ *gen(){ yield 1; yield 2; } }.gen()].join(',')", "1,2"),
4494 ("await { async f(){ return 'ok'; } }.f()", "ok"),
4495 ("await (class C { static async f(){ return 7; } }).f()", "7"),
4497 ("class C { static *gen(){ yield 9; } } [...C.gen()].join(',')", "9"),
4498 ("class C { *[Symbol.iterator](){ yield 3; } } [...new C()].join(',')", "3"),
4499 ("({ async *gen(){}, method(){ return 'ok'; } }).method()", "ok"),
4500 ("var k='x'; var {[k]: v} = {x: 42}; v", "42"),
4503 ("var k='a'; var {[k]: v, y} = {a: 1, y: 2}; v+','+y", "1,2"),
4504 ("var k='n'; function f({[k]: val}){ return val; } f({n: 7})", "7"),
4505 ("({ async: 1, b: 2 }).async + ({ async: 1, b: 2 }).b", "3"),
4509 ("class C { async = 5; b = 6; } var c = new C(); c.async + c.b", "11"),
4510 ("class C { static = 5; b = 6; } var c = new C(); c.static + c.b", "11"),
4513 ("class C { static x = 1; static method(){ return 2; } } C.x + C.method()", "3"),
4514 ("var k='x'; var o={ get [k](){ return 42; } }; o.x", "42"),
4518 ("var k='y'; var o={y:0, set [k](v){ this._y=v; } }; o.y=5; o._y", "5"),
4519 ("var k='z'; class C { get [k](){ return 9; } } new C().z", "9"),
4520 ("var a=[]; for(let i=0;i<3;i++){ a.push(()=>i); } a.map(f=>f()).join(',')", "0,1,2"),
4524 ("var a=[]; for(var i=0;i<3;i++){ a.push(()=>i); } a.map(f=>f()).join(',')", "3,3,3"),
4525 ("var a=[]; for(let i=0;i<3;i++){ if(i===1) continue; a.push(()=>i); } a.map(f=>f()).join(',')", "0,2"),
4526 ("var a=[]; for(const x of [1,2,3]){ a.push(()=>x); } a.map(f=>f()).join(',')", "1,2,3"),
4528 ("var a=[]; for(var x of [1,2,3]){ a.push(()=>x); } a.map(f=>f()).join(',')", "3,3,3"),
4529 ("var a=[]; for(let k in {a:1,b:2}){ a.push(()=>k); } a.map(f=>f()).join(',')", "a,b"),
4530 ("new Proxy([1,2,3],{}).map(x=>x*2).join(',')", "2,4,6"),
4535 ("var p=new Proxy([1,2],{}); p.push(3); p.join(',')", "1,2,3"),
4536 ("new Proxy([5,6,7],{}).indexOf(6)", "1"),
4537 ("String(new Proxy([1,2,3], {}))", "1,2,3"),
4541 ("'' + new Proxy([7,8], {})", "7,8"),
4542 ("var p=new Proxy(new Map([['a',1]]),{}); p.get('a')", "1"),
4544 ("var p=new Proxy(new Set([1,2]),{}); p.add(3); [...p].join(',')", "1,2,3"),
4545 ("var o={}; var p=new Proxy(new WeakSet([o]),{}); p.has(o)", "true"),
4547 ("await new Proxy(Promise.resolve(5), {}).then(x=>x*2)", "10"),
4548 ("function* g(){ yield 1; yield 2; } var p=new Proxy(g(),{}); [...p].join(',')", "1,2"),
4549 ("String.fromCharCode(72,105)", "Hi"),
4552 ("String.fromCharCode(0xD83D,0xDE00)", "\u{1F600}"),
4553 ("String.fromCodePoint(0x1F600)", "\u{1F600}"),
4554 ("String.fromCodePoint(72,105)", "Hi"),
4555 ("Object.create(null, {x:{value:5}}).x", "5"),
4557 ("var o=Object.create(null, {y:{value:9}, z:{value:1}}); o.y + o.z", "10"),
4558 ("JSON.stringify({toJSON(){ return 42; }})", "42"),
4561 ("JSON.stringify({a: {toJSON(){ return 'x'; }}})", "{\"a\":\"x\"}"),
4562 ("JSON.stringify([{toJSON(){ return 1; }}, 2])", "[1,2]"),
4563 ("1_000_000", "1000000"),
4567 ("0x1_000", "4096"),
4568 ("1_000.5_5", "1000.55"),
4569 ("0o17", "15"),
4573 ("0b101", "5"),
4574 ("0o17 + 0b101", "20"),
4575 ("0b101n + 2n", "7"),
4576 ("'abc\\\ndef'", "abcdef"),
4579 ("'abc\\\r\ndef'.length", "6"),
4580 ("var a=[1,2,3]; var r=a.toReversed(); a[0]+'/'+r.join(',')", "1/3,2,1"),
4582 ("var a=[1,2,3]; var s=a.toSpliced(1,1,9); a.join(',')+'/'+s.join(',')", "1,2,3/1,9,3"),
4584 ("[1,2,3].toSpliced(1).join(',')", "1"),
4587 ("[1,2,3].toSpliced(1, undefined).join(',')", "1,2,3"),
4588 (
4592 "var a=[1,2]; a[Symbol.isConcatSpreadable]=false; [0].concat(a).length",
4593 "2",
4594 ),
4595 (
4598 "var o={0:'x',1:'y',length:2}; o[Symbol.isConcatSpreadable]=true; [0].concat(o).join(',')",
4599 "0,x,y",
4600 ),
4601 ("[1].concat([2,3],4).join(',')", "1,2,3,4"),
4603 (
4610 "var f=[].join; f.call({0:'a',1:'b',length:2}, '-')",
4611 "a-b",
4612 ),
4613 (
4617 "var o={length:0}; var f=[].push; f.call(o,'a','b')+','+o.length+','+o[0]+','+o[1]",
4618 "2,2,a,b",
4619 ),
4620 (
4621 "var o={0:'a',1:'b',length:2}; var f=[].pop; f.call(o)+','+o.length",
4622 "b,1",
4623 ),
4624 (
4625 "var o={0:'a',1:'b',length:2}; var f=[].shift; f.call(o)+','+o.length+','+o[0]",
4626 "a,1,b",
4627 ),
4628 (
4629 "var o={0:'a',length:1}; var f=[].unshift; f.call(o,'x','y')+','+o.length+','+o[0]+','+o[1]+','+o[2]",
4630 "3,3,x,y,a",
4631 ),
4632 ("[1,2,3].join('-')", "1-2-3"),
4634 (
4637 "var fact = function(n){ return n <= 1 ? 1 : n * arguments.callee(n - 1); }; fact(5)",
4638 "120",
4639 ),
4640 ("var g = function(){ return arguments.callee === g; }; g()", "true"),
4641 ("(function f(n){ return n<=1?1:n*f(n-1); })(5)", "120"),
4644 ("(function f(){ return typeof f; })()", "function"),
4645 ("(function f(){})(); typeof f", "undefined"),
4647 (
4651 "var s=[].slice; s.call({0:'a',1:'b',length:2}, 0, 1).join(',')",
4652 "a",
4653 ),
4654 (
4655 "var s=[].slice; s.call({0:'a',1:'b',2:'c',length:3}, 1).join(',')",
4656 "b,c",
4657 ),
4658 ("[1,2,3,4].slice(1,3).join(',')", "2,3"),
4660 (
4665 "var out=''; var fe=[].forEach; fe.call({0:'a',1:'b',length:2}, function(v){ out+=v }); out",
4666 "ab",
4667 ),
4668 (
4669 "var m=[].map; m.call({0:1,1:2,length:2}, function(v){ return v*2 }).join(',')",
4670 "2,4",
4671 ),
4672 (
4673 "var fl=[].filter; fl.call({0:1,1:2,2:3,length:3}, function(v){ return v>1 }).join(',')",
4674 "2,3",
4675 ),
4676 (
4677 "var io=[].indexOf; io.call({0:'a',1:'b',length:2}, 'b')",
4678 "1",
4679 ),
4680 (
4681 "var inc=[].includes; inc.call({0:'a',1:'b',length:2}, 'b')",
4682 "true",
4683 ),
4684 (
4687 "var r=[].reduce; r.call({0:1,1:2,2:3,length:3}, function(a,v){ return a+v }, 0)",
4688 "6",
4689 ),
4690 (
4691 "var fd=[].find; fd.call({0:1,1:2,2:3,length:3}, function(v){ return v>1 })",
4692 "2",
4693 ),
4694 (
4695 "var fi=[].findIndex; fi.call({0:1,1:2,2:3,length:3}, function(v){ return v>1 })",
4696 "1",
4697 ),
4698 (
4699 "var sm=[].some; sm.call({0:1,1:2,length:2}, function(v){ return v>1 })",
4700 "true",
4701 ),
4702 (
4703 "var ev=[].every; ev.call({0:1,1:2,length:2}, function(v){ return v>0 })",
4704 "true",
4705 ),
4706 (
4707 "var at=[].at; at.call({0:1,1:2,length:2}, -1)",
4708 "2",
4709 ),
4710 (
4711 "var fl=[].findLast; fl.call({0:1,1:2,length:2}, function(v){ return v<2 })",
4712 "1",
4713 ),
4714 (
4715 "var fli=[].findLastIndex; fli.call({0:1,1:2,length:2}, function(v){ return v<2 })",
4716 "0",
4717 ),
4718 (
4719 "var fm=[].flatMap; fm.call({0:1,1:2,length:2}, function(v){ return v*2 }).join(',')",
4720 "2,4",
4721 ),
4722 (
4723 "var rr=[].reduceRight; rr.call({0:1,1:2,length:2}, function(a,v){ return a+v })",
4724 "3",
4725 ),
4726 (
4727 "var lio=[].lastIndexOf; lio.call({0:1,1:1,length:2}, 1)",
4728 "1",
4729 ),
4730 (
4731 "var fla=[].flat; fla.call({0:1,1:[2,3],length:2}).join(',')",
4732 "1,2,3",
4733 ),
4734 (
4735 "var en=[].entries; var itr=en.call({0:1,1:2,length:2}); itr.next().value.join(',')",
4736 "0,1",
4737 ),
4738 (
4739 "var ky=[].keys; var itr=ky.call({0:1,1:2,length:2}); itr.next().value+','+itr.next().value",
4740 "0,1",
4741 ),
4742 (
4743 "var vl=[].values; var itr=vl.call({0:1,1:2,length:2}); itr.next().value+','+itr.next().value",
4744 "1,2",
4745 ),
4746 (
4747 "var tls=[].toLocaleString; tls.call({0:1,1:2,length:2})",
4748 "1,2",
4749 ),
4750 (
4751 "var o={0:1,1:2,length:2}; o[Symbol.isConcatSpreadable]=true; [].concat.call(o, 3).join(',')",
4752 "1,2,3",
4753 ),
4754 (
4755 "var o={0:1,1:2,length:2}; [].concat.call(o, 3).length",
4756 "2",
4757 ),
4758 (
4759 "var ts=[].toSorted; ts.call({0:3,1:1,length:2}).join(',')",
4760 "1,3",
4761 ),
4762 (
4763 "var tr=[].toReversed; tr.call({0:1,1:2,length:2}).join(',')",
4764 "2,1",
4765 ),
4766 (
4767 "var tsp=[].toSpliced; tsp.call({0:1,1:2,length:2}, 1, 0, 9).join(',')",
4768 "1,9,2",
4769 ),
4770 (
4771 "var w=[].with; w.call({0:1,1:2,length:2}, 0, 9).join(',')",
4772 "9,2",
4773 ),
4774 ("[1,2,3].map(function(v){return v*2}).join(',')", "2,4,6"),
4776 ("var a=[1,2,3]; var b=a.with(1,9); a[1]+'/'+b[1]", "2/9"),
4778 ("(function(){ try { throw new TypeError('bad'); } catch(e) { return e.name+':'+e.message; } })()", "TypeError:bad"),
4780 ("(function(){ try { throw new RangeError('oor'); } catch(e) { return e.name; } })()", "RangeError"),
4782 ("typeof new FinalizationRegistry(function(){}).register", "function"),
4784 ("var ok=false; requestIdleCallback(function(d){ ok = !d.didTimeout && d.timeRemaining()>0; }); ok", "true"),
4786 ("Object.hasOwn({x:1},'x')+','+Object.hasOwn({x:1},'y')", "true,false"),
4788 ("var g=Object.groupBy([1,2,3,4],function(n){return n%2===0?'e':'o'}); g.e.join(',')+'/'+g.o.join(',')", "2,4/1,3"),
4790 ("var m=Map.groupBy([1,2,3,4],function(n){return n%2===0?'e':'o'}); m.get('e').join(',')+'/'+m.get('o').join(',')", "2,4/1,3"),
4792 (
4793 "var kEven={}; var kOdd={}; var m=Map.groupBy([1,2,3],function(n){return n%2===0?kEven:kOdd}); m.get(kEven).join(',')+'/'+m.get(kOdd).join(',')",
4794 "2/1,3",
4795 ),
4796 ("Map.groupBy([1,2,3],function(n){return n}).size", "3"),
4797 (
4800 "var g=Object.groupBy(new Set([1,2,3,4]),function(n){return n%2===0?'e':'o'}); g.e.join(',')+'/'+g.o.join(',')",
4801 "2,4/1,3",
4802 ),
4803 (
4804 "function* gen(){yield 1;yield 2;yield 3;} var g=Object.groupBy(gen(),function(n){return n%2===0?'e':'o'}); g.e.join(',')+'/'+g.o.join(',')",
4805 "2/1,3",
4806 ),
4807 (
4808 "var m=Map.groupBy(new Set([1,2,3,4]),function(n){return n%2===0?'e':'o'}); m.get('e').join(',')+'/'+m.get('o').join(',')",
4809 "2,4/1,3",
4810 ),
4811 (
4815 "function* gen(){yield [1,'a'];yield [2,'b'];} var m=new Map(gen()); m.get(1)+','+m.get(2)",
4816 "a,b",
4817 ),
4818 (
4819 "function* gen(){yield 1;yield 2;yield 2;} [...new Set(gen())].join(',')",
4820 "1,2",
4821 ),
4822 (
4823 "function* gen(){yield ['a',1];} Object.fromEntries(gen()).a",
4824 "1",
4825 ),
4826 (
4827 "function* gen(){yield Promise.resolve(1);yield Promise.resolve(2);} await Promise.all(gen()).then(a => a.join(','))",
4828 "1,2",
4829 ),
4830 ("var a=new Uint8Array(3); a[0]=10; a[1]=20; a.length+','+a[0]+','+a[1]", "3,10,20"),
4832 ("Array.from(new Uint8Array([1,2,3])).join(',')", "1,2,3"),
4834 ("Uint8Array.from([4,5,6]).join(',')", "4,5,6"),
4836 (
4838 "function* gen(){yield 1;yield 2;yield 3;} new Uint8Array(gen()).join(',')",
4839 "1,2,3",
4840 ),
4841 (
4843 "function* gen(){yield 'a';yield 'b';} new AggregateError(gen(), 'msg').errors.join(',')",
4844 "a,b",
4845 ),
4846 ("var a=new Uint8Array([256,-1,300]); a.join(',')", "0,255,44"),
4848 (
4851 "try { new Uint8Array(-1); 'no-throw' } catch(e) { 'threw' }",
4852 "threw",
4853 ),
4854 (
4855 "try { new Float64Array(-3); 'no-throw' } catch(e) { 'threw' }",
4856 "threw",
4857 ),
4858 (
4864 "try { new Uint8Array(3).set([1,2,3], 5); 'no-throw' } catch(e) { 'threw' }",
4865 "threw",
4866 ),
4867 (
4868 "try { new Uint8Array(3).set([1,2], 2); 'no-throw' } catch(e) { 'threw' }",
4869 "threw",
4870 ),
4871 (
4872 "var a=new Uint8Array(3); a.set([9,9], 1); a.join(',')",
4874 "0,9,9",
4875 ),
4876 ("var a=new Uint8Array(4); a.set([9,9],1); a.join(',')", "0,9,9,0"),
4878 (
4880 "var a=new Uint8Array(3); a.set({0:5,1:6,length:2}); a.join(',')",
4881 "5,6,0",
4882 ),
4883 ("var a=new Uint8Array([1,2,3,4,5]); var s=a.slice(1,3); s.join(',')+'/'+a.length", "2,3/5"),
4885 ("var a=new Uint8Array(4); a.fill(7,1,3); a.join(',')", "0,7,7,0"),
4887 ("var a=new Uint8Array(5); a.byteLength+','+a.BYTES_PER_ELEMENT+','+a.buffer.byteLength", "5,1,5"),
4889 ("var b=new ArrayBuffer(8); new Uint8Array(b).length+','+b.byteLength", "8,8"),
4891 (
4894 "var b=new ArrayBuffer(4,{maxByteLength:16}); b.resizable+','+b.maxByteLength+','+b.byteLength",
4895 "true,16,4",
4896 ),
4897 ("var b=new ArrayBuffer(4); b.resizable+','+b.maxByteLength", "false,4"),
4898 (
4900 "var b=new ArrayBuffer(4,{maxByteLength:16}); b.resize(8); var u=new Uint8Array(b); b.byteLength+','+u.length",
4901 "8,8",
4902 ),
4903 (
4905 "var b=new ArrayBuffer(4,{maxByteLength:8}); try { b.resize(9); 'no throw'; } catch(e) { 'threw'; }",
4906 "threw",
4907 ),
4908 (
4910 "var b=new ArrayBuffer(4); try { b.resize(2); 'no throw'; } catch(e) { 'threw'; }",
4911 "threw",
4912 ),
4913 (
4917 "var b=new ArrayBuffer(4); var b2=b.transfer(); b.byteLength+','+b2.byteLength",
4918 "0,4",
4919 ),
4920 (
4922 "var b=new ArrayBuffer(4); b.transfer(); try { b.transfer(); 'no throw'; } catch(e) { 'threw'; }",
4923 "threw",
4924 ),
4925 (
4927 "var b=new ArrayBuffer(4,{maxByteLength:8}); var b2=b.transferToFixedLength(); b2.resizable",
4928 "false",
4929 ),
4930 (
4934 "var b=new ArrayBuffer(4,{maxByteLength:16}); var c=structuredClone(b); \
4935 c.resizable+','+c.maxByteLength+','+c.byteLength",
4936 "true,16,4",
4937 ),
4938 (
4939 "var b=new ArrayBuffer(4,{maxByteLength:16}); var c=structuredClone(b); \
4940 c.resize(8); c.byteLength",
4941 "8",
4942 ),
4943 ("new Uint8Array([72,101,108,108,111]).toBase64()", "SGVsbG8="),
4945 ("Array.from(Uint8Array.fromBase64('SGVsbG8=')).join(',')", "72,101,108,108,111"),
4946 ("new Uint8Array([222,173,190,239]).toHex()", "deadbeef"),
4947 ("Array.from(Uint8Array.fromHex('deadbeef')).join(',')", "222,173,190,239"),
4948 (
4950 "var a=new Uint8Array([1,2,3,255,0]); Array.from(Uint8Array.fromBase64(a.toBase64())).join(',')",
4951 "1,2,3,255,0",
4952 ),
4953 (
4954 "var a=new Uint8Array([1,2,3,255,0]); Array.from(Uint8Array.fromHex(a.toHex())).join(',')",
4955 "1,2,3,255,0",
4956 ),
4957 (
4959 "try { Uint8Array.fromHex('abc'); 'no-throw' } catch(e) { 'caught:' + e.name }",
4960 "caught:SyntaxError",
4961 ),
4962 (
4964 "var a=new Uint8Array(5); var r=a.setFromBase64('SGVsbG8='); Array.from(a).join(',')+'|'+r.read+'|'+r.written",
4965 "72,101,108,108,111|8|5",
4966 ),
4967 (
4968 "var a=new Uint8Array(4); var r=a.setFromHex('deadbeef'); Array.from(a).join(',')+'|'+r.read+'|'+r.written",
4969 "222,173,190,239|8|4",
4970 ),
4971 (
4972 "try { new Uint8Array(1).setFromHex('zz'); 'no-throw' } catch(e) { 'caught:' + e.name }",
4973 "caught:SyntaxError",
4974 ),
4975 ("var e=new TextEncoder().encode('AB'); e.length+','+e[0]+','+e[1]", "2,65,66"),
4977 ("new TextDecoder().decode(new TextEncoder().encode('hello'))", "hello"),
4979 (
4982 "var buf=new Uint8Array(5); var r=new TextEncoder().encodeInto('Hi', buf); \
4983 r.read+','+r.written+','+buf[0]+','+buf[1]",
4984 "2,2,72,105",
4985 ),
4986 (
4989 "var buf=new Uint8Array(1); var r=new TextEncoder().encodeInto('AB', buf); \
4990 r.read+','+r.written",
4991 "1,1",
4992 ),
4993 ("var a=new Int8Array([200,-100]); a.join(',')", "-56,-100"),
4995 ("var a=new Uint8ClampedArray([300,-50,128.6]); a.join(',')", "255,0,129"),
4997 ("var a=new Uint8ClampedArray([0.5,1.5,2.5,3.5]); a.join(',')", "0,2,2,4"),
5000 ("var a=new Int16Array([40000]); a[0]", "-25536"),
5002 ("var a=new Int8Array(1); a[0]=200; a[0]", "-56"),
5005 ("var a=new Uint8ClampedArray(1); a[0]=300; a[0]", "255"),
5006 ("var a=new Uint8ClampedArray(1); a[0]=-50; a[0]", "0"),
5007 ("var a=new Int16Array(1); a[0]=40000; a[0]", "-25536"),
5008 ("var a=new Uint16Array([70000]); a[0]", "4464"),
5009 ("var a=new Int32Array([4294967295]); a[0]", "-1"),
5011 ("var a=new Uint32Array([-1]); a[0]", "4294967295"),
5012 ("var a=new Float32Array([0.1]); a[0] !== 0.1", "true"),
5014 ("var a=new Float16Array([1.5]); a[0] === 1.5", "true"),
5016 ("var dv=new DataView(new ArrayBuffer(2)); dv.setFloat16(0, 2.5); dv.getFloat16(0)", "2.5"),
5017 ("var a=new Float64Array([0.1]); a[0] === 0.1", "true"),
5019 ("new Int16Array(1).BYTES_PER_ELEMENT+','+new Float64Array(1).BYTES_PER_ELEMENT", "2,8"),
5021 ("Int32Array.from([1,2,3]).join(',')", "1,2,3"),
5023 ("var a=new Uint16Array(3); a.set([1,2],1); a.join(',')", "0,1,2"),
5024 ("var a=new Int8Array([1,2,3,4]); a.slice(1,3).join(',')", "2,3"),
5025 ("var a=new Uint32Array(3); a.fill(5); a.join(',')", "5,5,5"),
5026 (
5030 "var a=new Int8Array([200,3,1]); var b=a.toSorted(); b.join(',')+','+b.BYTES_PER_ELEMENT",
5031 "-56,1,3,1",
5032 ),
5033 (
5034 "var a=new Int8Array([1,2,200]); var b=a.toReversed(); b.join(',')+','+b.BYTES_PER_ELEMENT",
5035 "-56,2,1,1",
5036 ),
5037 (
5038 "var a=new Int8Array([1,2,3]); var b=a.with(1,200); b.join(',')+','+b.BYTES_PER_ELEMENT",
5039 "1,-56,3,1",
5040 ),
5041 (
5044 "var a=new Int8Array([1,2,3]); var b=a.map(x => x + 200); b.join(',')+','+b.BYTES_PER_ELEMENT",
5045 "-55,-54,-53,1",
5046 ),
5047 (
5048 "var a=new Int8Array([1,2,3,4]); var b=a.filter(x => x % 2 === 0); b.join(',')+','+b.BYTES_PER_ELEMENT",
5049 "2,4,1",
5050 ),
5051 (
5054 "var dv=new DataView(new ArrayBuffer(4)); dv.setUint8(0,255); dv.getUint8(0)",
5055 "255",
5056 ),
5057 (
5059 "var dv=new DataView(new ArrayBuffer(4)); dv.setUint32(0,0x01020304); dv.getUint8(0)+','+dv.getUint8(3)",
5060 "1,4",
5061 ),
5062 (
5064 "var dv=new DataView(new ArrayBuffer(4)); dv.setUint32(0,0x01020304,true); dv.getUint8(0)+','+dv.getUint8(3)",
5065 "4,1",
5066 ),
5067 ("var dv=new DataView(new ArrayBuffer(2)); dv.setInt16(0,-1); dv.getUint16(0)", "65535"),
5069 ("var dv=new DataView(new ArrayBuffer(8)); dv.setFloat64(0,3.5); dv.getFloat64(0)", "3.5"),
5071 (
5073 "try { new DataView(new ArrayBuffer(1)).getUint32(0); 'no throw'; } catch(e) { 'threw'; }",
5074 "threw",
5075 ),
5076 ("new Blob(['hello', ' ', 'world']).size", "11"),
5079 ("new Blob(['abc'], {type:'text/plain'}).type", "text/plain"),
5080 ("await new Blob(['hello world']).text()", "hello world"),
5081 ("await new Blob(['hello world']).slice(0,5).text()", "hello"),
5082 (
5085 "var buf = await new Blob(['A']).arrayBuffer(); new DataView(buf).getUint8(0)",
5086 "65",
5087 ),
5088 (
5098 "var u = await new Blob(['AB']).bytes(); u.BYTES_PER_ELEMENT",
5099 "1",
5100 ),
5101 ("var u = await new Blob(['AB']).bytes(); u[0]+','+u[1]", "65,66"),
5102 ("new File(['hi'], 'a.txt').name", "a.txt"),
5105 ("new File(['hi'], 'a.txt', {type:'text/plain'}).type", "text/plain"),
5106 ("new File(['hello'], 'a.txt').size", "5"),
5107 ("await new File(['hello'], 'a.txt').text()", "hello"),
5108 ("await new File(['hello world'], 'a.txt').slice(0,5).text()", "hello"),
5110 ("new File(['x'], 'a.txt', {lastModified: 12345}).lastModified", "12345"),
5112 ("new File(['x'], 'a.txt').webkitRelativePath", ""),
5116 (
5120 "var c=structuredClone(new File(['hi'], 'a.txt', {lastModified: 12345})); \
5121 c.name + ',' + c.lastModified",
5122 "a.txt,12345",
5123 ),
5124 (
5125 "await structuredClone(new File(['hello'], 'a.txt')).text()",
5126 "hello",
5127 ),
5128 ("structuredClone(new Blob(['x'])).name", "undefined"),
5131 (
5135 "var r=new FileReader(); var out; r.onload=function(e){ out=e.target.result; }; \
5136 r.readAsText(new Blob(['hello'])); out",
5137 "hello",
5138 ),
5139 (
5140 "var r=new FileReader(); r.readAsText(new Blob(['x'])); r.readyState",
5141 "2",
5142 ),
5143 (
5144 "var r=new FileReader(); var buf; r.onload=function(e){ buf=e.target.result; }; \
5145 r.readAsArrayBuffer(new Blob(['A'])); new DataView(buf).getUint8(0)",
5146 "65",
5147 ),
5148 (
5149 "var r=new FileReader(); var url; r.onload=function(e){ url=e.target.result; }; \
5150 r.readAsDataURL(new Blob(['hi'], {type:'text/plain'})); url",
5151 "data:text/plain;base64,aGk=",
5152 ),
5153 (
5156 "var r=new FileReader(); var fired=false; r.addEventListener('load', ()=>fired=true); \
5157 r.readAsText(new Blob(['x'])); fired",
5158 "true",
5159 ),
5160 ("Notification.permission", "granted"),
5163 ("await Notification.requestPermission()", "granted"),
5164 (
5165 "var n = new Notification('hi', {body: 'world'}); n.title + ':' + n.body",
5166 "hi:world",
5167 ),
5168 ("typeof new Notification('x').close", "function"),
5169 (
5173 "var n = new Notification('x', {data: {id: 5}, requireInteraction: true, silent: true}); \
5174 n.data.id + ',' + n.requireInteraction + ',' + n.silent",
5175 "5,true,true",
5176 ),
5177 ("new Notification('x').dir", "auto"),
5178 ("new Notification('x').data", "null"),
5179 ("typeof new Notification('x').removeEventListener", "function"),
5180 (
5182 "var {promise, resolve} = Promise.withResolvers(); resolve(5); await promise",
5183 "5",
5184 ),
5185 (
5186 "var {promise, reject} = Promise.withResolvers(); reject('e'); await promise.catch(e => 'caught:' + e)",
5187 "caught:e",
5188 ),
5189 ("await Promise.try(() => 42)", "42"),
5191 (
5192 "await Promise.try(() => { throw 'boom' }).catch(e => 'caught:' + e)",
5193 "caught:boom",
5194 ),
5195 ("await Promise.try(() => Promise.resolve('ok'))", "ok"),
5196 ("await Promise.try((a, b) => a + b, 1, 2)", "3"),
5197 ("'abc'.isWellFormed()", "true"),
5199 ("'abc'.toWellFormed()", "abc"),
5200 (
5202 "var log=''; { using r = {[Symbol.dispose]: () => log+='d'}; log+='a' } log+='b'; log",
5203 "adb",
5204 ),
5205 (
5207 "var log=''; { using a = {[Symbol.dispose]: () => log+='A'}; using b = {[Symbol.dispose]: () => log+='B'} } log",
5208 "BA",
5209 ),
5210 (
5212 "var log=''; function f(){ { using r = {[Symbol.dispose]: () => log+='d'}; return 'a' } } var res=f(); log+res",
5213 "da",
5214 ),
5215 (
5217 "async function f(){ var log=''; { await using r = {[Symbol.asyncDispose]: async () => { log+='d' }}; log+='a' } return log } await f()",
5218 "ad",
5219 ),
5220 (
5222 "(await Array.fromAsync([Promise.resolve(1), 2, Promise.resolve(3)])).join(',')",
5223 "1,2,3",
5224 ),
5225 ("(await Array.fromAsync([1,2,3], x => x * 10)).join(',')", "10,20,30"),
5227 (
5230 "var caught=null; try { { using a = {[Symbol.dispose]: () => { throw 'A' }}; using b = {[Symbol.dispose]: () => { throw 'B' }} } } catch(e) { caught = e } caught.name + ':' + caught.error + ':' + caught.suppressed",
5231 "SuppressedError:A:B",
5232 ),
5233 (
5235 "async function f(){ var out=''; for await (const x of [Promise.resolve(1), 2, Promise.resolve(3)]) { out += x } return out } await f()",
5236 "123",
5237 ),
5238 (
5240 "async function f(){ var obj={}; obj[Symbol.asyncIterator]=function(){ var i=0; return {next:function(){ i++; if (i<=3) { return Promise.resolve({value:i,done:false}); } return Promise.resolve({value:undefined,done:true}); }}; }; var out=''; for await (const x of obj){ out += x } return out } await f()",
5241 "123",
5242 ),
5243 (
5248 "async function* g(){ yield 1; yield 2; yield 3; } typeof g()[Symbol.asyncIterator]",
5249 "function",
5250 ),
5251 (
5252 "async function* g(){ yield 1; yield 2; yield 3; } var it=g(); it[Symbol.asyncIterator]() === it",
5253 "true",
5254 ),
5255 (
5256 "async function* g(){ yield 1; yield 2; yield 3; } async function f(){ var out=''; for await (const x of g()) { out += x } return out } await f()",
5257 "123",
5258 ),
5259 (
5262 "function* g(){ yield 1; } typeof g()[Symbol.asyncIterator]",
5263 "undefined",
5264 ),
5265 (
5268 "async function* g(){ yield 1; throw 'boom'; } async function f(){ var out=''; try { for await (const x of g()) { out += x } } catch(e) { out += ':' + e } return out } await f()",
5269 "1:boom",
5270 ),
5271 ("var x; var out=''; for (x of [1,2,3]) { out += x } out", "123"),
5273 ("var x=0; for (x of [1,2,3]) {} x", "3"),
5275 ("var k; var out=''; for (k in {a:1,b:2}) { out += k } out", "ab"),
5277 (
5279 "var a,b; var out=''; for ([a,b] of [[1,2],[3,4]]) { out += a+','+b+';' } out",
5280 "1,2;3,4;",
5281 ),
5282 (
5284 "var a,b; var out=''; for ({a,b} of [{a:1,b:2},{a:3,b:4}]) { out += a+','+b+';' } out",
5285 "1,2;3,4;",
5286 ),
5287 ("var obj={p:0}; for (obj.p of [1,2,3]) {} obj.p", "3"),
5289 ("var arr=[0]; for (arr[0] of [7,8,9]) {} arr[0]", "9"),
5291 (
5296 "function* g(){yield 3;yield 4;} [...new Set([1,2,3]).union(g())].sort().join(',')",
5297 "1,2,3,4",
5298 ),
5299 (
5300 "function* g(){yield 2;yield 3;} [...new Set([1,2,3]).intersection(g())].sort().join(',')",
5301 "2,3",
5302 ),
5303 ("[...new Set([1,2,3]).union(new Set([3,4,5]))].sort().join(',')", "1,2,3,4,5"),
5304 ("[...new Set([1,2,3]).intersection(new Set([2,3,4]))].sort().join(',')", "2,3"),
5305 ("[...new Set([1,2,3]).difference(new Set([2,3]))].join(',')", "1"),
5306 (
5307 "[...new Set([1,2,3]).symmetricDifference(new Set([2,3,4]))].sort().join(',')",
5308 "1,4",
5309 ),
5310 ("new Set([1,2]).isSubsetOf(new Set([1,2,3]))", "true"),
5311 ("new Set([1,2,3]).isSupersetOf(new Set([1,2]))", "true"),
5312 ("new Set([1,2]).isDisjointFrom(new Set([3,4]))", "true"),
5313 ("new Set([1,2]).isDisjointFrom(new Set([2,3]))", "false"),
5314 ("function* g(){ yield 1; yield 2; yield 3; } g().map(x=>x*2).join(',')", "2,4,6"),
5317 (
5318 "function* g(){ yield 1; yield 2; yield 3; yield 4; } g().filter(x=>x%2===0).join(',')",
5319 "2,4",
5320 ),
5321 (
5322 "function* g(){ yield 1; yield 2; yield 3; yield 4; yield 5; } g().take(2).join(',')",
5323 "1,2",
5324 ),
5325 (
5326 "function* g(){ yield 1; yield 2; yield 3; yield 4; yield 5; } g().drop(3).join(',')",
5327 "4,5",
5328 ),
5329 (
5330 "function* g(){ yield 1; yield 2; } g().flatMap(x=>[x,x*10]).join(',')",
5331 "1,10,2,20",
5332 ),
5333 ("function* g(){ yield 1; yield 2; } g().toArray().join(',')", "1,2"),
5334 (
5335 "function* g(){ yield 1; yield 2; yield 3; } var s=0; g().forEach(x=>s+=x); s",
5336 "6",
5337 ),
5338 ("function* g(){ yield 1; yield 2; yield 3; } g().some(x=>x>2)", "true"),
5339 ("function* g(){ yield 1; yield 2; yield 3; } g().every(x=>x>0)", "true"),
5340 ("function* g(){ yield 1; yield 2; yield 3; } g().find(x=>x>1)", "2"),
5341 (
5342 "function* g(){ yield 1; yield 2; yield 3; } g().reduce((a,x)=>a+x,0)",
5343 "6",
5344 ),
5345 ("Iterator.from([1,2,3]).map(x=>x*2).join(',')", "2,4,6"),
5349 ("Iterator.from([1,2,3,4,5]).take(2).join(',')", "1,2"),
5350 ("Iterator.from([1,2,3,4,5]).drop(3).join(',')", "4,5"),
5351 ("Iterator.from(new Set([1,2,3])).toArray().join(',')", "1,2,3"),
5352 (
5353 "function* g(){ yield 1; yield 2; yield 3; } Iterator.from(g()).take(2).join(',')",
5354 "1,2",
5355 ),
5356 ("Iterator.concat([1,2], new Set([3,4]), [5]).toArray().join(',')", "1,2,3,4,5"),
5358 ("Iterator.concat(['a','b'], ['c']).take(2).toArray().join(',')", "a,b"),
5359 ("function Foo(){} new Foo() instanceof Foo", "true"),
5363 ("function Foo(){} function Bar(){} new Foo() instanceof Bar", "false"),
5364 ("class Animal{} class Dog extends Animal{} new Dog() instanceof Animal", "true"),
5365 ("class Animal{} class Dog extends Animal{} new Dog() instanceof Dog", "true"),
5366 ("1 instanceof Object", "false"),
5367 ("({}) instanceof Object", "false"),
5373 ("[] instanceof Array", "false"),
5374 ("new Error('boom').message", "boom"),
5381 ("new Error('boom').name", "Error"),
5382 ("new Error('boom') instanceof Error", "true"),
5383 ("new Error('boom').stack", "Error: boom"),
5387 ("new TypeError('x').stack", "TypeError: x"),
5388 ("typeof new Error().stack === 'string' && new Error().stack.length > 0", "true"),
5389 (
5390 "(function(){ try { null.foo; } catch(e) { return typeof e.stack; } })()",
5391 "string",
5392 ),
5393 ("new TypeError('x') instanceof Error", "true"),
5394 ("new TypeError('x') instanceof TypeError", "true"),
5395 ("new RangeError('x') instanceof TypeError", "false"),
5396 ("new Uint8Array(1) instanceof Uint8Array", "true"),
5397 ("new Int8Array(1) instanceof Int8Array", "true"),
5398 ("new Uint8Array(1) instanceof Int8Array", "false"),
5399 ("Object.getPrototypeOf(new Uint8Array(1)) === Uint8Array.prototype", "true"),
5400 ("Uint8Array.prototype.constructor === Uint8Array", "true"),
5401 (
5402 "try { null.x } catch(e) { e instanceof Error }",
5403 "true",
5404 ),
5405 (
5410 "class MyError extends Error { constructor(m){ super(m); this.name='MyError'; } } var e = new MyError('bad'); e.message + '/' + e.name",
5411 "bad/MyError",
5412 ),
5413 (
5414 "class MyError extends Error { constructor(m){ super(m); } } new MyError('x') instanceof Error",
5415 "true",
5416 ),
5417 (
5418 "class MyError extends Error { constructor(m){ super(m); } } new MyError('x') instanceof MyError",
5419 "true",
5420 ),
5421 (
5425 "class Even { static [Symbol.hasInstance](n){ return typeof n === 'number' && n % 2 === 0; } } (4 instanceof Even) + ',' + (3 instanceof Even)",
5426 "true,false",
5427 ),
5428 (
5429 "class AlwaysTrue { static [Symbol.hasInstance](x){ return true; } } ({} instanceof AlwaysTrue)",
5430 "true",
5431 ),
5432 ("Error.isError(new Error('x'))", "true"),
5435 ("Error.isError(new TypeError('x'))", "true"),
5436 (
5437 "class MyError extends Error { constructor(m){ super(m); } } Error.isError(new MyError('x'))",
5438 "true",
5439 ),
5440 ("Error.isError({message:'x'})", "false"),
5441 ("Error.isError(42)", "false"),
5442 ("Error.isError(undefined)", "false"),
5443 ("new Error('wrap', {cause: 'orig'}).cause", "orig"),
5446 ("typeof new Error('x').cause", "undefined"),
5447 ("new TypeError('t', {cause: 42}).cause", "42"),
5448 (
5449 "try { throw new Error('inner') } catch(e) { new Error('outer', {cause: e}).cause.message }",
5450 "inner",
5451 ),
5452 ("RegExp.escape('a.b*c')", "a\\.b\\*c"),
5455 ("new RegExp(RegExp.escape('1+1=2')).test('1+1=2')", "true"),
5456 (
5457 "new RegExp('^' + RegExp.escape('a.b') + '$').test('aXb')",
5458 "false",
5459 ),
5460 ("var r=/a/; r.compile('b'); r.test('b')", "true"),
5463 ("var r=/a/i; r.compile('a'); r.flags", ""),
5464 ("var r=/a/; r.compile('a','gi'); r.flags", "gi"),
5465 ("var r=/a/g; r.lastIndex=3; r.compile('b'); r.lastIndex", "0"),
5466 ("var r=/x/; var r2=r.compile('y'); r===r2", "true"),
5467 ("CSS.escape('a.b')", "a\\.b"),
5470 ("CSS.escape('.foo#bar')", "\\.foo\\#bar"),
5471 ("CSS.escape('123')", "\\31 23"),
5472 ("CSS.escape('-1')", "-\\31 "),
5473 ("CSS.escape('-')", "\\-"),
5474 ("CSS.escape('abc')", "abc"),
5475 ("CSS.supports('(display: grid)')", "true"),
5479 ("CSS.supports('display', 'grid')", "true"),
5480 ("CSS.supports('not (display: grid)')", "false"),
5481 (
5482 "CSS.supports('(display: grid) and (gap: 1rem)')",
5483 "true",
5484 ),
5485 (
5486 "CSS.supports('not (display: grid) or (gap: 1rem)')",
5487 "true",
5488 ),
5489 (
5492 "typeof document.createElement('audio').play().then",
5493 "function",
5494 ),
5495 ("typeof document.createElement('video').pause()", "undefined"),
5496 ("typeof document.createElement('audio').load()", "undefined"),
5497 ("document.createElement('video').canPlayType('video/mp4')", ""),
5498 ("document.createElement('div').role", "null"),
5501 (
5502 "var e=document.createElement('div'); e.role='button'; e.getAttribute('role')",
5503 "button",
5504 ),
5505 (
5506 "var e=document.createElement('div'); e.setAttribute('aria-label','x'); e.ariaLabel",
5507 "x",
5508 ),
5509 (
5510 "var e=document.createElement('div'); e.ariaExpanded='true'; \
5511 e.getAttribute('aria-expanded')",
5512 "true",
5513 ),
5514 (
5515 "var e=document.createElement('div'); e.ariaLabel='x'; e.ariaLabel=null; \
5516 e.hasAttribute('aria-label')",
5517 "false",
5518 ),
5519 (
5522 "var e=document.createElement('div'); e.ariaColCount='3'; \
5523 e.getAttribute('aria-colcount')",
5524 "3",
5525 ),
5526 (
5527 "var e=document.createElement('div'); e.setAttribute('aria-rowindex','2'); \
5528 e.ariaRowIndex",
5529 "2",
5530 ),
5531 (
5532 "var e=document.createElement('div'); e.ariaSetSize='5'; e.ariaPosInSet='2'; \
5533 e.ariaSetSize + ',' + e.ariaPosInSet",
5534 "5,2",
5535 ),
5536 (
5537 "var e=document.createElement('div'); e.ariaLevel='1'; e.getAttribute('aria-level')",
5538 "1",
5539 ),
5540 ("'ab'.repeat(3)", "ababab"),
5543 ("'x'.repeat(0)", ""),
5544 (
5545 "try { 'x'.repeat(-1); 'no-throw' } catch(e) { 'threw' }",
5546 "threw",
5547 ),
5548 (
5549 "try { 'x'.repeat(Infinity); 'no-throw' } catch(e) { 'threw' }",
5550 "threw",
5551 ),
5552 ("eval('1 + 2 * 3')", "7"),
5555 ("eval(42)", "42"),
5556 ("var x = 10; eval('x = x + 5'); x", "15"),
5557 ("new Function('a', 'b', 'return a + b')(3, 4)", "7"),
5558 ("new Function('return 1 + 1')()", "2"),
5559 (
5560 "typeof new Function('a', 'return a * 2')",
5561 "function",
5562 ),
5563 ("[1,2,3].values().map(x => x * 2).toArray().join(',')", "2,4,6"),
5566 ("[1,2,3,4].values().filter(x => x % 2 === 0).toArray().join(',')", "2,4"),
5567 ("[1,2,3,4,5].values().take(2).toArray().join(',')", "1,2"),
5568 ("[1,2,3,4,5].values().drop(3).toArray().join(',')", "4,5"),
5569 (
5570 "[1,2,3].values().map(x => x + 1).filter(x => x > 2).toArray().join(',')",
5571 "3,4",
5572 ),
5573 (
5574 "var s=''; [1,2,3].values().forEach(x => s += x); s",
5575 "123",
5576 ),
5577 ("[1,2,3,4].values().reduce((a,b) => a + b)", "10"),
5578 ("[1,2,3].values().reduce((a,b) => a + b, 10)", "16"),
5579 ("[1,2,3].values().some(x => x > 2)", "true"),
5583 ("[1,2,3].values().some(x => x > 5)", "false"),
5584 ("[1,2,3].values().every(x => x > 0)", "true"),
5585 ("[1,2,3].values().every(x => x > 1)", "false"),
5586 ("[1,2,3,4].values().find(x => x % 2 === 0)", "2"),
5587 ("typeof [1,2,3].values().find(x => x > 5)", "undefined"),
5588 (
5590 "[1,2,3].values().flatMap(x => [x, x * 10]).toArray().join(',')",
5591 "1,10,2,20,3,30",
5592 ),
5593 (
5596 "function* dup(x){ yield x; yield x*10; } [1,2].values().flatMap(x => dup(x)).toArray().join(',')",
5597 "1,10,2,20",
5598 ),
5599 (
5602 "function Foo(){} Object.getPrototypeOf(new Foo()) === Foo.prototype",
5603 "true",
5604 ),
5605 (
5606 "var a={}; var b={x:1}; Object.setPrototypeOf(a,b); a.x",
5607 "1",
5608 ),
5609 (
5613 "var a={}; Object.setPrototypeOf(a,a); a.nope",
5614 "undefined",
5615 ),
5616 (
5617 "var a={}; var b={}; Object.setPrototypeOf(a,b); Object.setPrototypeOf(b,a); a.nope",
5618 "undefined",
5619 ),
5620 (
5621 "var a={}; Object.setPrototypeOf(a,a); ('nope' in a)",
5622 "false",
5623 ),
5624 (
5625 "var a={}; Object.setPrototypeOf(a,a); a.x=1; a.x",
5626 "1",
5627 ),
5628 (
5629 "var a={}; Object.setPrototypeOf(a,a); var ks=[]; for (var k in a) { ks.push(k); } ks.length",
5630 "0",
5631 ),
5632 ("var a={}; var b={x:1}; a.__proto__ = b; a.x", "1"),
5636 ("var b={x:1}; var a=Object.create(b); a.__proto__ === b", "true"),
5637 ("({}).__proto__ === null", "true"),
5638 ("var a={}; a.__proto__ = null; a.__proto__", "null"),
5639 ("var p={x:5}; var o={__proto__: p}; o.x", "5"),
5642 ("var p={x:5}; var o={__proto__: p}; Object.keys(o).includes('__proto__')", "false"),
5643 ("var o={['__proto__']: 5}; o.__proto__", "5"),
5645 ("function Foo(){} Foo.prototype.isPrototypeOf(new Foo())", "true"),
5647 ("({}).isPrototypeOf({})", "false"),
5648 ("({x:1}).propertyIsEnumerable('x')", "true"),
5649 ("({x:1}).propertyIsEnumerable('y')", "false"),
5650 ("function f(a,b){ return this.x+a+b; } f.call({x:10}, 1, 2)", "13"),
5653 ("function f(a,b){ return this.x+a+b; } f.apply({x:10}, [1,2])", "13"),
5654 (
5658 "function f(a,b){ return this.x+a+b; } f.apply({x:10}, {0:1,1:2,length:2})",
5659 "13",
5660 ),
5661 (
5662 "function f(a,b){ return this.x+a+b; } var g = f.bind({x:10}, 1); g(2)",
5663 "13",
5664 ),
5665 (
5666 "function f(){ return this.x; } var g = f.bind({x:5}); g.call({x:99})",
5667 "5",
5668 ),
5669 (
5675 "var r; function Foo(){ r = new.target === Foo; } new Foo(); r",
5676 "true",
5677 ),
5678 ("function Foo(){ return new.target === Foo; } Foo()", "false"),
5679 (
5680 "function Foo(){ return typeof new.target; } Foo()",
5681 "undefined",
5682 ),
5683 (
5684 "class Foo { constructor(){ this.isNew = new.target === Foo; } } new Foo().isNew",
5685 "true",
5686 ),
5687 (
5690 "var r; function Foo(){ var f = () => { r = new.target === Foo; }; f(); } new Foo(); r",
5691 "true",
5692 ),
5693 (
5696 "try { throw {message:'boom', code:42}; } catch({message, code}) { message + '/' + code; }",
5697 "boom/42",
5698 ),
5699 (
5700 "try { throw [1,2,3]; } catch([a,,c]) { a + '/' + c; }",
5701 "1/3",
5702 ),
5703 ("try { throw 'x'; } catch(e) { e; }", "x"),
5704 (
5708 "class C { ['foo' + 'bar'](){ return 42; } } new C().foobar()",
5709 "42",
5710 ),
5711 (
5716 "class Range { constructor(n){ this.n = n; } [Symbol.iterator](){ var i=0, n=this.n; return { next(){ return i<n ? {value:i++, done:false} : {value:undefined, done:true}; } }; } } var s=''; for (const x of new Range(4)) { s += x; } s",
5717 "0123",
5718 ),
5719 (
5720 "class Range { constructor(n){ this.n = n; } [Symbol.iterator](){ var i=0, n=this.n; return { next(){ return i<n ? {value:i++, done:false} : {value:undefined, done:true}; } }; } } [...new Range(3)].join(',')",
5721 "0,1,2",
5722 ),
5723 (
5727 "var o={a:1}; o[Symbol.iterator]=function(){}; Object.keys(o).join(',')",
5728 "a",
5729 ),
5730 (
5731 "var o={a:1}; o[Symbol.iterator]=function(){}; Object.values(o).join(',')",
5732 "1",
5733 ),
5734 (
5735 "var o={a:1}; o[Symbol.iterator]=function(){}; JSON.stringify(o)",
5736 "{\"a\":1}",
5737 ),
5738 (
5739 "var o={a:1}; o[Symbol.iterator]=function(){}; var k=''; for (const x in o) { k+=x; } k",
5740 "a",
5741 ),
5742 (
5746 "new Date(2024, 0, 15, 10, 30, 45, 500).toISOString()",
5747 "2024-01-15T10:30:45.500Z",
5748 ),
5749 ("new Date(0).toISOString()", "1970-01-01T00:00:00.000Z"),
5750 (
5754 "new Date(2024, 0, 15, 10, 30, 45, 500).toDateString()",
5755 "2024-01-15",
5756 ),
5757 (
5758 "new Date(2024, 0, 15, 10, 30, 45, 500).toTimeString()",
5759 "10:30:45",
5760 ),
5761 (
5762 "new Date(2024, 0, 15).toLocaleDateString()",
5763 "2024-01-15",
5764 ),
5765 ("new Date(2024, 0, 15).toLocaleTimeString()", "00:00:00"),
5766 ("new Date(2024, 0, 1).getFullYear()", "2024"),
5767 ("new Date(2024, 5, 15).getMonth()", "5"),
5768 ("new Date(2024, 0, 1).getDay()", "1"), ("typeof new Date().getTimezoneOffset()", "number"),
5771 ("new Date().getTimezoneOffset()", "0"),
5772 (
5776 "var d=new Date(2024,0,15); d.setFullYear(2025); d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()",
5777 "2025-1-15",
5778 ),
5779 ("new Date(2024,0,1).getYear()", "124"),
5781 ("var d=new Date(2024,0,1); d.setYear(5); d.getFullYear()", "1905"),
5784 ("var d=new Date(2024,0,1); d.setYear(2030); d.getFullYear()", "2030"),
5785 (
5786 "var d=new Date(2024,0,15); d.setMonth(5); d.getMonth()",
5787 "5",
5788 ),
5789 (
5790 "var d=new Date(2024,0,15); d.setDate(d.getDate()+1); d.getDate()",
5791 "16",
5792 ),
5793 (
5795 "var d=new Date(2024,0,31); d.setDate(d.getDate()+1); (d.getMonth()+1)+'-'+d.getDate()",
5796 "2-1",
5797 ),
5798 (
5799 "var d=new Date(2024,0,15,10,20,30); d.setHours(23); d.getHours()+':'+d.getMinutes()+':'+d.getSeconds()",
5800 "23:20:30",
5801 ),
5802 (
5803 "var d=new Date(2024,0,15,10,20,30); d.setMinutes(5); d.getMinutes()",
5804 "5",
5805 ),
5806 (
5807 "var d=new Date(2024,0,15,10,20,30); d.setSeconds(59); d.getSeconds()",
5808 "59",
5809 ),
5810 (
5811 "var d=new Date(2024,0,15); d.setMilliseconds(123); d.getMilliseconds()",
5812 "123",
5813 ),
5814 (
5815 "var d=new Date(0); d.setTime(5000); d.getTime()",
5816 "5000",
5817 ),
5818 (
5820 "var d=new Date(0); var r=d.setFullYear(2000); r === d.getTime()",
5821 "true",
5822 ),
5823 ("new Date(1000) - new Date(0)", "1000"),
5828 ("new Date(0) < new Date(1000)", "true"),
5829 ("+new Date(500)", "500"),
5830 ("typeof Date.now()", "number"),
5831 ("var o = {x:1}; delete o.x; 'x' in o", "false"),
5835 ("var o = {x:1, y:2}; delete o.x; o.y", "2"),
5836 ("var k='x'; var o = {x:1}; delete o[k]; 'x' in o", "false"),
5837 ("var a=[1,2,3]; delete a[1]; a[1]", "undefined"),
5838 ("var a=[1,2,3]; delete a[1]; a.length", "3"),
5839 ("delete 5", "true"),
5840 ("var s=''; (s+='a', s+='b', s+='c'); s", "abc"),
5843 ("var x=(1,2,3); x", "3"),
5844 (
5845 "var s=''; for (var i=0,j=10; i<3; i++,j--) { s += i+':'+j+' '; } s",
5846 "0:10 1:9 2:8 ",
5847 ),
5848 ("var a; var b; (a=1, b=a+1); a+','+b", "1,2"),
5849 (
5852 "function* g(){ try { yield 1; yield 2; } catch(e) { yield 'caught:'+e; } } var it=g(); it.next(); it.throw('boom').value",
5853 "caught:boom",
5854 ),
5855 (
5856 "function* g(){ yield 1; yield 2; } var it=g(); it.next(); var r; try { it.throw('x'); } catch(e) { r = 'propagated:'+e; } r",
5857 "propagated:x",
5858 ),
5859 ("'A'.codePointAt(0)", "65"),
5861 ("'ABC'.codePointAt(5)", "undefined"),
5862 ("'a'.localeCompare('b')", "-1"),
5863 ("'b'.localeCompare('a')", "1"),
5864 ("'a'.localeCompare('a')", "0"),
5865 ("'Hello World'.substr(6)", "World"),
5868 ("'Hello World'.substr(0, 5)", "Hello"),
5869 ("'Hello World'.substr(-5)", "World"),
5870 ("'Hello World'.substr(-5, 3)", "Wor"),
5871 (
5875 "class C { static x; static { C.x = 1 + 2; } } C.x",
5876 "3",
5877 ),
5878 (
5879 "class C { static x = 10; static { C.x += 5; } } C.x",
5880 "15",
5881 ),
5882 (
5884 "class C { static log=''; static { C.log+='a'; } static { C.log+='b'; } } C.log",
5885 "ab",
5886 ),
5887 ("[1,[2,3]].flat().join(',')", "1,2,3"),
5891 ("[1,[2,[3,[4]]]].flat(2).join(',')", "1,2,3,4"),
5892 ("[1,[2,[3,[4,[5]]]]].flat(Infinity).join(',')", "1,2,3,4,5"),
5893 ("var a=[1]; a.push(a); a.flat(Infinity); 'ok'", "ok"),
5900 ("[1,[2,[3]]].flat(0).length", "2"),
5902 ("var o={x:1}; Object.freeze(o); o.x=2; o.x", "1"),
5905 ("var o={x:1}; Object.freeze(o); o.y=2; 'y' in o", "false"),
5906 ("var o={x:1}; Object.freeze(o); delete o.x; o.x", "1"),
5907 ("var o={x:1}; Object.isFrozen(o)", "false"),
5908 ("var o={x:1}; Object.freeze(o); Object.isFrozen(o)", "true"),
5909 ("Object.isFrozen(5)", "true"),
5910 ("var o={x:1}; Object.seal(o); o.x=2; o.x", "2"),
5912 ("var o={x:1}; Object.seal(o); o.y=2; 'y' in o", "false"),
5913 ("var o={x:1}; Object.seal(o); delete o.x; 'x' in o", "true"),
5914 ("var o={x:1}; Object.isSealed(o)", "false"),
5915 ("var o={x:1}; Object.seal(o); Object.isSealed(o)", "true"),
5916 (
5917 "var o={x:1}; Object.preventExtensions(o); o.y=2; 'y' in o",
5918 "false",
5919 ),
5920 (
5921 "var o={x:1}; Object.preventExtensions(o); o.x=5; delete o.x; 'x' in o",
5922 "false",
5923 ),
5924 ("var o={x:1}; Object.isExtensible(o)", "true"),
5925 (
5926 "var o={x:1}; Object.preventExtensions(o); Object.isExtensible(o)",
5927 "false",
5928 ),
5929 ("Array.isArray(new Proxy([1,2], {}))", "true"),
5932 ("Array.isArray(new Proxy({}, {}))", "false"),
5933 ("Array.isArray(new Int8Array([1,2]))", "false"),
5937 ("Array.isArray([1,2])", "true"),
5938 ("Object.keys(new Proxy({a:1,b:2}, {})).sort().join(',')", "a,b"),
5942 ("Object.values(new Proxy({a:1,b:2}, {})).sort().join(',')", "1,2"),
5943 (
5944 "Object.entries(new Proxy({a:1}, {})).map(e=>e[0]+':'+e[1]).join(',')",
5945 "a:1",
5946 ),
5947 ("JSON.stringify(new Proxy({a:1,b:2}, {}))", "{\"a\":1,\"b\":2}"),
5949 (
5953 "var s=''; for (const x of new Proxy([1,2,3], {})) { s += x; } s",
5954 "123",
5955 ),
5956 ("[...new Proxy([1,2,3], {})].join(',')", "1,2,3"),
5957 (
5961 "var t = Object.assign({}, new Proxy({a:1,b:2}, {})); t.a+','+t.b",
5962 "1,2",
5963 ),
5964 (
5965 "var t = Object.assign({}, [10,20,30]); t[0]+','+t[1]+','+t[2]",
5966 "10,20,30",
5967 ),
5968 (
5971 "var o={x:1}; Object.freeze(o); Reflect.deleteProperty(o,'x')",
5972 "false",
5973 ),
5974 ("var o={x:1}; Reflect.deleteProperty(o,'x')", "true"),
5975 (
5978 "var o={x:1}; Object.freeze(o); Reflect.set(o,'x',2)",
5979 "false",
5980 ),
5981 ("var o={x:1}; Reflect.set(o,'x',2); o.x", "2"),
5982 ("[NaN].includes(NaN)", "true"),
5985 ("[NaN].indexOf(NaN)", "-1"),
5986 ("[1,2,NaN].includes(NaN)", "true"),
5987 ("[1,2,3].includes(2)", "true"),
5988 ("[1,2,3].includes(5)", "false"),
5989 (
5992 "var ctx={mul:10}; [1,2,3].map(function(x){return x*this.mul;}, ctx).join(',')",
5993 "10,20,30",
5994 ),
5995 (
5996 "var ctx={min:2}; [1,2,3].filter(function(x){return x>this.min;}, ctx).join(',')",
5997 "3",
5998 ),
5999 (
6000 "var ctx={sum:0}; [1,2,3].forEach(function(x){this.sum+=x;}, ctx); ctx.sum",
6001 "6",
6002 ),
6003 (
6004 "var ctx={target:2}; [1,2,3].find(function(x){return x===this.target;}, ctx)",
6005 "2",
6006 ),
6007 (
6008 "var ctx={target:5}; [1,2,3].some(function(x){return x===this.target;}, ctx)",
6009 "false",
6010 ),
6011 (
6012 "var ctx={min:0}; [1,2,3].every(function(x){return x>this.min;}, ctx)",
6013 "true",
6014 ),
6015 (
6018 "var ctx={sum:0}; var m=new Map([['a',1],['b',2]]); m.forEach(function(v){this.sum+=v;}, ctx); ctx.sum",
6019 "3",
6020 ),
6021 (
6022 "var ctx={sum:0}; var s=new Set([1,2,3]); s.forEach(function(v){this.sum+=v;}, ctx); ctx.sum",
6023 "6",
6024 ),
6025 (
6026 "var ctx={mul:2}; Array.from([1,2,3], function(x){return x*this.mul;}, ctx).join(',')",
6027 "2,4,6",
6028 ),
6029 (
6032 "JSON.stringify({a:1,b:2}, null, 2)",
6033 "{\n \"a\": 1,\n \"b\": 2\n}",
6034 ),
6035 ("JSON.stringify([1,2], null, 2)", "[\n 1,\n 2\n]"),
6036 ("JSON.stringify({}, null, 2)", "{}"),
6037 ("JSON.stringify([], null, 2)", "[]"),
6038 ("JSON.stringify({a:1}, null, '\\t')", "{\n\t\"a\": 1\n}"),
6039 ("JSON.stringify({a:1,b:2})", "{\"a\":1,\"b\":2}"),
6041 (
6044 "try { JSON.stringify(10n); 'no-throw' } catch(e) { 'caught:' + e.name }",
6045 "caught:Error",
6046 ),
6047 (
6048 "try { JSON.stringify({a:10n}); 'no-throw' } catch(e) { 'caught' }",
6049 "caught",
6050 ),
6051 ("JSON.stringify({a:1,b:2,c:3}, ['a','c'])", "{\"a\":1,\"c\":3}"),
6053 (
6054 "JSON.stringify({a:1,b:2}, function(k,v){ return typeof v === 'number' ? v*10 : v; })",
6055 "{\"a\":10,\"b\":20}",
6056 ),
6057 ("JSON.stringify([1,2,3], ['a'])", "[1,2,3]"),
6060 (
6063 "JSON.parse('{\"a\":1,\"b\":2}', function(k,v){ return typeof v === 'number' ? v*10 : v; }).a",
6064 "10",
6065 ),
6066 (
6067 "var r = JSON.parse('{\"a\":1,\"b\":2}', function(k,v){ return k==='b' ? undefined : v; }); 'b' in r",
6068 "false",
6069 ),
6070 (
6071 "JSON.parse('[1,2,3]', function(k,v){ return typeof v === 'number' ? v+1 : v; }).join(',')",
6072 "2,3,4",
6073 ),
6074 ("JSON.parse('{\"a\":1}').a", "1"),
6075 ("'aaa'.replaceAll(/a/g, 'b')", "bbb"),
6079 (
6080 "try { 'aaa'.replaceAll(/a/, 'b'); 'no-throw' } catch(e) { 'threw' }",
6081 "threw",
6082 ),
6083 (
6084 "'a1b2'.replaceAll(/[0-9]/g, function(m){ return '['+m+']'; })",
6085 "a[1]b[2]",
6086 ),
6087 ("'aXaXa'.replaceAll('X', function(){ return '-'; })", "a-a-a"),
6088 ("'abc'.replaceAll('x', 'y')", "abc"),
6089 ("var a1 = 1, b1 = a1 + 1; b1", "2"),
6095 ("var s1 = 'xy', t1 = s1.length; t1", "2"),
6096 ("var h1 = [], p1 = '1.8.2', w1 = p1.trim; typeof w1", "function"),
6097 ("var q1 = [], r1 = q1.push; typeof r1", "function"),
6098 ("typeof String.prototype", "object"),
6102 ("typeof String.prototype.trim", "function"),
6103 ("typeof String.prototype.slice", "function"),
6104 ("String.prototype.trim.call(' x ')", "x"),
6105 ("String.prototype.toUpperCase.call('ab')", "AB"),
6106 ("' y '.trim()", "y"),
6108 ("typeof ({}).toString", "function"),
6114 ("typeof ({}).hasOwnProperty", "function"),
6115 ("typeof [].slice", "function"),
6116 ("typeof [].concat", "function"),
6117 ("typeof (function(){}).call", "function"),
6118 ("typeof (function(){}).apply", "function"),
6119 ("({}).toString.call([])", "[object Array]"),
6120 ("typeof Array.prototype.push", "function"),
6125 ("typeof Array.prototype.slice", "function"),
6126 ("typeof Array.prototype.indexOf", "function"),
6127 ("Array.prototype.slice.call([1,2,3], 1).join(',')", "2,3"),
6128 ("Array.prototype.indexOf.call([4,5,6], 5)", "1"),
6129 ("typeof Object.prototype.toString", "function"),
6131 ("typeof Object.prototype.hasOwnProperty", "function"),
6132 ("var d = document.createElement('div'); typeof d", "object"),
6136 ("var d2 = document.createElement('div'); typeof d2.style", "object"),
6137 (
6138 "var d3 = document.createElement('div'); d3.innerHTML = \"<a href='/a'>a</a>\"; d3.getElementsByTagName('a').length",
6139 "1",
6140 ),
6141 (
6142 "var d4 = document.createElement('div'); d4.innerHTML = \"<a href='/a'>a</a>\"; typeof d4.getElementsByTagName('a')[0]",
6143 "object",
6144 ),
6145 (
6146 "var d5 = document.createElement('div'); d5.innerHTML = \"<a href='/a'>a</a>\"; typeof d5.getElementsByTagName('a')[0].style",
6147 "object",
6148 ),
6149 (
6150 "var d6 = document.createElement('div'); d6.innerHTML = '<table></table><a href=\"/a\">a</a>'; d6.getElementsByTagName('*').length > 0",
6151 "true",
6152 ),
6153 (
6154 "var d7 = document.createElement('div'); d7.style.cssText = 'top:1px'; typeof d7.style.cssText",
6155 "string",
6156 ),
6157 (
6158 "var d8 = document.createElement('div'); d8.setAttribute('className','t'); d8.getAttribute('className')",
6159 "t",
6160 ),
6161 (
6166 "var e1 = document.createElement('div'); e1.innerHTML = '<link/><a href=\"/a\">a</a>'; e1.getElementsByTagName('a').length",
6167 "1",
6168 ),
6169 (
6170 "var e2 = document.createElement('div'); e2.innerHTML = '<table></table><a href=\"/a\">a</a>'; e2.getElementsByTagName('a').length",
6171 "1",
6172 ),
6173 (
6174 "var e3 = document.createElement('div'); e3.innerHTML = ' <a href=\"/a\">a</a>'; e3.getElementsByTagName('a').length",
6175 "1",
6176 ),
6177 (
6178 "var e4 = document.createElement('div'); e4.innerHTML = '<input type=\"checkbox\"/><a href=\"/a\">a</a>'; e4.getElementsByTagName('a').length",
6179 "1",
6180 ),
6181 (
6183 "var e5 = document.createElement('div'); e5.innerHTML = ' <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>'; e5.getElementsByTagName('a').length",
6184 "1",
6185 ),
6186 (
6187 "var e6 = document.createElement('div'); e6.innerHTML = ' <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>'; e6.getElementsByTagName('*').length > 0",
6188 "true",
6189 ),
6190 ("typeof window.document", "object"),
6194 ("typeof window.navigator", "object"),
6197 ("typeof window.navigator.userAgent", "string"),
6198 ("window.navigator === navigator", "true"),
6199 ("typeof window.location", "object"),
6200 ("typeof window.JSON", "object"),
6201 ("typeof window.Math", "object"),
6202 ("typeof window.XMLHttpRequest", "function"),
6203 ("window.myGlobal1 = 42; myGlobal1", "42"),
6208 ("window.myFn1 = function(){ return 'z'; }; myFn1()", "z"),
6209 ("window.mySelf1 = window; typeof mySelf1.document", "object"),
6210 ("window.shadow1 = 'w'; var shadow1 = 'v'; shadow1", "v"),
6212 ("Object.prototype.toString.call('x')", "[object String]"),
6217 ("Object.prototype.toString.call(1)", "[object Number]"),
6218 ("Object.prototype.toString.call(true)", "[object Boolean]"),
6219 ("Object.prototype.toString.call(null)", "[object Null]"),
6220 ("Object.prototype.toString.call(undefined)", "[object Undefined]"),
6221 ("Object.prototype.toString.call({})", "[object Object]"),
6222 ("Object.prototype.toString.call([])", "[object Array]"),
6223 ("Object.prototype.toString.call(function(){})", "[object Function]"),
6224 ("window.document === document", "true"),
6225 ("typeof window.document.createElement", "function"),
6226 (
6227 "var w1 = window.document.createElement('div'); typeof w1.style",
6228 "object",
6229 ),
6230 (
6231 "var w2 = window.document.createElement('div'); w2.innerHTML = ' <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>'; typeof w2.getElementsByTagName('a')[0]",
6232 "object",
6233 ),
6234 (
6236 "(function(a){ var e = a.document, n = e.createElement('div'); n.setAttribute('className','t'); n.innerHTML = ' <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>'; var d = n.getElementsByTagName('a')[0]; return typeof d; })(window)",
6237 "object",
6238 ),
6239 (
6244 "var o = {}; o[Symbol.replace] = function(s, r){ return 'X' + s + r; }; 'ab'.replaceAll(o, 'Z')",
6245 "XabZ",
6246 ),
6247 (
6248 "var o = {}; o[Symbol.matchAll] = function(s){ return ['m:' + s]; }; 'ab'.matchAll(o)[0]",
6249 "m:ab",
6250 ),
6251 (
6253 "try { 'aaa'.matchAll(/a/); 'no-throw' } catch(e) { 'threw' }",
6254 "threw",
6255 ),
6256 ("'a,b,c,d'.split(',', 2).join('|')", "a|b"),
6258 ("'a,b,c'.split(',', 0).length", "0"),
6259 ("'a1b2c3'.split(/[0-9]/, 2).join('|')", "a|b"),
6260 ("'a,b,c'.split(',').join('|')", "a|b|c"),
6261 (
6264 "try { 'aa'.matchAll(/a/); 'no-throw' } catch(e) { 'threw' }",
6265 "threw",
6266 ),
6267 (
6268 "[...'a1b2'.matchAll(/[0-9]/g)].map(m=>m[0]).join(',')",
6269 "1,2",
6270 ),
6271 (
6274 "var a={x:1}; a.self=a; var c=structuredClone(a); c.self===c",
6275 "true",
6276 ),
6277 ("var a={x:1}; a.self=a; var c=structuredClone(a); c.x", "1"),
6278 (
6280 "var shared={v:1}; var o={a:shared,b:shared}; var c=structuredClone(o); c.a===c.b",
6281 "true",
6282 ),
6283 (
6287 "try { var a={}; a.self=a; JSON.stringify(a); 'no-throw' } catch(e) { 'threw' }",
6288 "threw",
6289 ),
6290 (
6292 "var cur={}; for(var i=0;i<40;i++){ cur={child:cur}; } try { JSON.stringify(cur); 'no-throw' } catch(e) { 'depth-exceeded' }",
6293 "depth-exceeded",
6294 ),
6295 (
6296 "var shared={v:1}; JSON.stringify({a:shared,b:shared})",
6297 "{\"a\":{\"v\":1},\"b\":{\"v\":1}}",
6298 ),
6299 (
6303 "var a={}; a.self=a; console.log(a); 'ok'",
6304 "ok",
6305 ),
6306 (
6307 "var a=[1,2]; a.push(a); console.log(a); 'ok'",
6308 "ok",
6309 ),
6310 (
6316 "console.log(new Proxy([1,2,3], {})); 'ok'",
6317 "ok",
6318 ),
6319 ("var a=[1]; a.push(a); a.join()", "1,1,"),
6326 ("var a=[1]; a.push(a); String(a); 'ok'", "ok"),
6327 ("var a=[1]; a.push(a); `${a}`; 'ok'", "ok"),
6328 ("(255).toString(16)", "ff"),
6331 ("(8).toString(2)", "1000"),
6332 ("(255).toString()", "255"),
6333 ("(-255).toString(16)", "-ff"),
6334 ("(0).toString(2)", "0"),
6335 (
6336 "try { (1).toString(1); 'no-throw' } catch(e) { 'threw' }",
6337 "threw",
6338 ),
6339 ("parseInt('0xFF')", "255"),
6342 ("parseInt('0xFF', 16)", "255"),
6343 ("parseInt('FF', 16)", "255"),
6344 ("parseInt('10')", "10"),
6345 ("parseInt('-0x10')", "-16"),
6346 ("parseInt('10', 2)", "2"),
6347 ("Number.parseFloat === parseFloat", "true"),
6351 ("Number.parseInt === parseInt", "true"),
6352 ("Number.parseFloat.name", "parseFloat"),
6353 ("Number.parseInt.name", "parseInt"),
6354 (
6358 "JSON.stringify(new Date(0))",
6359 "\"1970-01-01T00:00:00.000Z\"",
6360 ),
6361 (
6362 "JSON.stringify({d: new Date(0)})",
6363 "{\"d\":\"1970-01-01T00:00:00.000Z\"}",
6364 ),
6365 ("'' + new Date(0)", "1970-01-01T00:00:00.000Z"),
6368 ("`date=${new Date(0)}`", "date=1970-01-01T00:00:00.000Z"),
6369 (
6371 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); o.x = 2; o.x",
6372 "1",
6373 ),
6374 (
6375 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); delete o.x",
6376 "false",
6377 ),
6378 (
6379 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); Object.keys(o).length",
6380 "0",
6381 ),
6382 (
6383 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); var keys=[]; for(var k in o){ keys.push(k); } keys.length",
6384 "0",
6385 ),
6386 (
6387 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); JSON.stringify(o)",
6388 "{}",
6389 ),
6390 (
6391 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); ({...o}).x",
6392 "undefined",
6393 ),
6394 (
6395 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); Object.assign({}, o).x",
6396 "undefined",
6397 ),
6398 (
6399 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); Reflect.deleteProperty(o, 'x')",
6400 "false",
6401 ),
6402 (
6407 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigInt64(0, 123456789012345n); v.getBigInt64(0).toString()",
6408 "123456789012345",
6409 ),
6410 (
6411 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigInt64(0, -1n); v.getBigInt64(0).toString()",
6412 "-1",
6413 ),
6414 (
6415 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigUint64(0, -1n); v.getBigUint64(0).toString()",
6416 "18446744073709551615",
6417 ),
6418 (
6419 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigInt64(0, 1n, true); v.getBigInt64(0, true).toString()",
6420 "1",
6421 ),
6422 (
6426 "JSON.stringify({n: JSON.rawJSON('123456789012345678901234567890')})",
6427 "{\"n\":123456789012345678901234567890}",
6428 ),
6429 ("JSON.isRawJSON(JSON.rawJSON('42'))", "true"),
6430 ("JSON.isRawJSON({rawJSON: '42'})", "false"),
6431 ("JSON.isRawJSON(42)", "false"),
6432 (
6433 "(function(){ try { JSON.rawJSON(' 1'); return 'no-throw'; } catch(e) { return e instanceof Error; } })()",
6434 "true",
6435 ),
6436 (
6437 "(function(){ try { JSON.rawJSON('not json'); return 'no-throw'; } catch(e) { return e instanceof Error; } })()",
6438 "true",
6439 ),
6440 (
6446 "var b=document.createElement('button'); b.command='show-modal'; b.command",
6447 "show-modal",
6448 ),
6449 (
6450 "document.createElement('button').commandForElement",
6451 "null",
6452 ),
6453 (
6462 "var t=document.createElement('div'); t.setAttribute('id','cfe-target'); var b=document.createElement('button'); b.commandForElement=t; b.getAttribute('commandfor')",
6463 "cfe-target",
6464 ),
6465 (
6475 "Object.keys({y:1,x:2,a:3}).join(',')",
6476 "y,x,a",
6477 ),
6478 (
6479 "var o={}; delete o.x; o.b=1; o.a=2; o.c=3; delete o.a; o.a=4; Object.keys(o).join(',')",
6480 "b,c,a",
6481 ),
6482 (
6483 "Object.keys({2:'b',1:'a',10:'c'}).join(',')",
6484 "1,2,10",
6485 ),
6486 (
6487 "Object.keys({10:'c',y:1,2:'b',x:2}).join(',')",
6488 "2,10,y,x",
6489 ),
6490 (
6491 "Object.values({10:'c',y:1,2:'b',x:2}).join(',')",
6492 "b,c,1,2",
6493 ),
6494 (
6495 "var res=[]; for(var k in {10:'c',y:1,2:'b',x:2}){ res.push(k); } res.join(',')",
6496 "2,10,y,x",
6497 ),
6498 (
6499 "JSON.stringify({10:'c',y:1,2:'b',x:2})",
6500 "{\"2\":\"b\",\"10\":\"c\",\"y\":1,\"x\":2}",
6501 ),
6502 (
6503 "Object.keys({...{10:'c',y:1,2:'b',x:2}}).join(',')",
6504 "2,10,y,x",
6505 ),
6506 (
6507 "Object.keys(Object.assign({}, {10:'c',y:1,2:'b',x:2})).join(',')",
6508 "2,10,y,x",
6509 ),
6510 (
6511 "Object.entries({2:'b',y:1,1:'a'}).map(e=>e.join(':')).join(',')",
6512 "1:a,2:b,y:1",
6513 ),
6514 (
6517 "Object.keys({'01':'x', 1:'y'}).join(',')",
6518 "1,01",
6519 ),
6520 (
6522 "typeof Intl",
6523 "object",
6524 ),
6525 (
6526 "Intl.getCanonicalLocales('ja-JP').join(',')",
6527 "ja-JP",
6528 ),
6529 (
6535 "new Intl.NumberFormat('ja-JP').format(123456)",
6536 "123,456",
6537 ),
6538 (
6539 "new Intl.DateTimeFormat('ja-JP').resolvedOptions().locale",
6540 "ja-JP",
6541 ),
6542 (
6543 "new Intl.Collator().compare('a', 'b')",
6544 "-1",
6545 ),
6546 (
6547 "new Intl.PluralRules().select(1)",
6548 "one",
6549 ),
6550 (
6551 "new Intl.RelativeTimeFormat().format(-1, 'day')",
6552 "1 days ago",
6553 ),
6554 (
6555 "new Intl.ListFormat().format(['a', 'b'])",
6556 "a, b",
6557 ),
6558 (
6559 "new Intl.DisplayNames(['en'], {type: 'language'}).of('ja')",
6560 "ja",
6561 ),
6562 (
6564 "new RegExp('a', 'u').unicode",
6565 "true",
6566 ),
6567 (
6568 "new RegExp('a', 'v').unicodeSets",
6569 "true",
6570 ),
6571 (
6572 "/\\p{Letter}/u.test('A')",
6573 "true",
6574 ),
6575 (
6576 "/\\p{Number}/u.test('9')",
6577 "true",
6578 ),
6579 (
6581 "var finRan = false; function* g() { try { yield 1; } finally { finRan = true; } } var it = g(); it.next(); it.return(42); finRan",
6582 "true",
6583 ),
6584 (
6592 "typeof Object.create(null).hasOwnProperty",
6593 "undefined",
6594 ),
6595 (
6596 "typeof Object.create(null).toString",
6597 "undefined",
6598 ),
6599 (
6600 "Object.getPrototypeOf(Object.create(null))",
6601 "null",
6602 ),
6603 (
6607 "typeof {}.hasOwnProperty",
6608 "function",
6609 ),
6610 (
6611 "typeof Object.groupBy([1,2,3], x=>x%2).hasOwnProperty",
6612 "undefined",
6613 ),
6614 (
6615 "var o={}; Object.setPrototypeOf(o, null); typeof o.toString",
6616 "undefined",
6617 ),
6618 (
6621 "var o={}; Object.setPrototypeOf(o, null); Object.setPrototypeOf(o, Object.prototype); typeof o.hasOwnProperty",
6622 "function",
6623 ),
6624 (
6632 "await crypto.subtle.digest('SHA-256', new TextEncoder().encode('')).then(buf => Array.from(new Uint8Array(buf)).map(b=>b.toString(16).padStart(2,'0')).join(''))",
6633 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
6634 ),
6635 (
6636 "await crypto.subtle.digest('SHA-256', new TextEncoder().encode('abc')).then(buf => Array.from(new Uint8Array(buf)).map(b=>b.toString(16).padStart(2,'0')).join(''))",
6637 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
6638 ),
6639 (
6640 "await crypto.subtle.digest('SHA-256', new TextEncoder().encode('The quick brown fox jumps over the lazy dog')).then(buf => Array.from(new Uint8Array(buf)).map(b=>b.toString(16).padStart(2,'0')).join(''))",
6641 "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
6642 ),
6643 (
6646 "await crypto.subtle.digest({name: 'SHA-256'}, new TextEncoder().encode('abc')).then(buf => Array.from(new Uint8Array(buf)).map(b=>b.toString(16).padStart(2,'0')).join(''))",
6647 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
6648 ),
6649 (
6651 "await crypto.subtle.digest('SHA-1', new TextEncoder().encode('x')).then(() => 'resolved', () => 'rejected')",
6652 "rejected",
6653 ),
6654 (
6660 "new TextDecoder().decode(new TextEncoder().encode('hello').buffer)",
6661 "hello",
6662 ),
6663 (
6664 "new TextDecoder().decode(new Uint8Array([65,116,109,79,83]).buffer)",
6665 "AtmOS",
6666 ),
6667 (
6671 "new TextDecoder().decode(new DataView(new TextEncoder().encode('AtmOS').buffer))",
6672 "AtmOS",
6673 ),
6674 (
6675 "await crypto.subtle.digest('SHA-256', new DataView(new TextEncoder().encode('abc').buffer)).then(buf => Array.from(new Uint8Array(buf)).map(b=>b.toString(16).padStart(2,'0')).join(''))",
6676 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
6677 ),
6678 (
6679 "new Uint8Array(new DataView(new Uint8Array([65,66,67]).buffer)).join('')",
6680 "656667",
6681 ),
6682 (
6684 "'が'.normalize('NFD') === 'か\\u3099'",
6685 "true",
6686 ),
6687 (
6688 "'か\\u3099'.normalize('NFC')",
6689 "が",
6690 ),
6691 (
6692 "'パ'.normalize('NFD') === 'ハ\\u309A'",
6693 "true",
6694 ),
6695 (
6696 "'ハ\\u309A'.normalize('NFC')",
6697 "パ",
6698 ),
6699 (
6707 "var a = []; var cur = a; for (var i = 0; i < 40; i++) { var n = []; cur.push(n); cur = n; } try { structuredClone(a); 'ok'; } catch (e) { e.name; }",
6708 "DataCloneError",
6709 ),
6710 (
6714 "var a = []; for (var i = 0; i < 50; i++) { a.push({v: i}); } var c = structuredClone(a); c.length === 50 && c[49].v === 49",
6715 "true",
6716 ),
6717 (
6722 "(function(){ var s = '['.repeat(20) + '0' + ']'.repeat(20); try { JSON.parse(s); return 'ok'; } catch (e) { return 'error'; } })()",
6723 "ok",
6724 ),
6725 (
6727 "var d=document.createElement('div'); var r='none'; d.onchange=function(){r='ok';}; d.dispatchEvent(new Event('change')); r",
6728 "ok",
6729 ),
6730 (
6732 "var p=document.createElement('div'); p.innerHTML='<span id=x>old</span>'; var s=p.children[0]; s.outerHTML='<b id=y>new</b>'; p.children[0].tagName+','+p.children[0].id",
6733 "B,y",
6734 ),
6735 ];
6736 let mut passed = 0;
6737 let mut total = cases.len();
6738 for (src, expect) in cases {
6739 let mut rt = JsRuntime::new();
6740 match rt.eval(src) {
6741 Ok(v) if &v.to_js_string() == expect => passed += 1,
6742 Ok(v) => crate::println!(
6743 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
6744 src,
6745 v.to_js_string(),
6746 expect
6747 ),
6748 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
6749 }
6750 }
6751
6752 {
6754 total += 1;
6755 let mut rt = JsRuntime::new();
6756 let _ = rt.eval("var n=0; var id=setInterval(function(){n++;}, 10);");
6757 match rt.eval("n > 0") {
6758 Ok(v) if v.to_js_string() == "true" => passed += 1,
6759 Ok(v) => crate::println!(
6760 "JS_SELFTEST FAIL: `setInterval` => n > 0 is `{}` (want true)",
6761 v.to_js_string()
6762 ),
6763 Err(e) => crate::println!("JS_SELFTEST ERR: `setInterval` => {}", e),
6764 }
6765 }
6766 {
6767 total += 1;
6768 let mut rt = JsRuntime::new();
6769 let _ = rt.eval("var n=0; var id=setInterval(function(){n++;}, 10); clearInterval(id);");
6770 match rt.eval("n") {
6771 Ok(v) if v.to_js_string() == "0" => passed += 1,
6772 Ok(v) => crate::println!(
6773 "JS_SELFTEST FAIL: `clearInterval` => n is `{}` (want 0)",
6774 v.to_js_string()
6775 ),
6776 Err(e) => crate::println!("JS_SELFTEST ERR: `clearInterval` => {}", e),
6777 }
6778 }
6779 {
6786 total += 1;
6787 let mut rt = JsRuntime::new();
6788 let _ = rt.eval(
6789 "var n=0; var target=50; var inc=target/100; \
6790 var id=setInterval(function(){ \
6791 n+=inc; \
6792 if (n>=target) { n=target; clearInterval(id); } \
6793 }, 1);",
6794 );
6795 match rt.eval("n") {
6796 Ok(v) if v.to_js_string() == "50" => passed += 1,
6797 Ok(v) => crate::println!(
6798 "JS_SELFTEST FAIL: setInterval 統計カウンター模擬 => n is `{}` (want 50)",
6799 v.to_js_string()
6800 ),
6801 Err(e) => crate::println!("JS_SELFTEST ERR: setInterval 統計カウンター模擬 => {}", e),
6802 }
6803 }
6804 {
6807 total += 1;
6808 let mut rt = JsRuntime::new();
6809 let _ = rt.eval(
6810 "var fired=false; var s=AbortSignal.timeout(0); s.addEventListener('abort', function(){fired=true;});",
6811 );
6812 match rt.eval("fired + ',' + s.reason.name") {
6816 Ok(v) if v.to_js_string() == "true,TimeoutError" => passed += 1,
6817 Ok(v) => crate::println!(
6818 "JS_SELFTEST FAIL: `AbortSignal.timeout` => `{}` (want `true,TimeoutError`)",
6819 v.to_js_string()
6820 ),
6821 Err(e) => crate::println!("JS_SELFTEST ERR: `AbortSignal.timeout` => {}", e),
6822 }
6823 }
6824
6825 let dom_html = "<div id='out'>0</div><p class='msg'>hi</p><button id='b' class='x'>go</button>";
6827 let dom_cases: &[(&str, &str)] = &[
6828 ("document.getElementById('out').textContent", "0"),
6829 ("var e=document.getElementById('out'); e.textContent='42'; e.textContent", "42"),
6830 ("document.getElementById('out').tagName", "DIV"),
6831 ("document.querySelector('.msg').textContent", "hi"),
6832 ("document.querySelectorAll('div').length", "1"),
6833 ("document.getElementById('b').classList.contains('x')", "true"),
6834 ("var e=document.getElementById('b'); e.classList.add('y'); e.classList.contains('y')", "true"),
6835 ("var e=document.getElementById('b'); e.classList.toggle('x'); e.classList.contains('x')", "false"),
6836 ("var e=document.getElementById('out'); e.style.color='red'; e.style.color", "red"),
6837 ("document.getElementById('missing') === null", "true"),
6838 ("document.getElementById('b').getAttribute('id')", "b"),
6839 ("document.children.length", "1"),
6844 ("document.children[0] === document.documentElement", "true"),
6845 ("document.childElementCount", "1"),
6846 ("var n=0; document.getElementById('b').addEventListener('click', () => n++); n", "0"),
6848 ("document.createElement('DIV').tagName", "DIV"),
6850 ("var d=document.createElement('div'); d.textContent='hi'; d.textContent", "hi"),
6851 ("var d=document.createElement('div'); d.textContent='hi'; d.textContent=null; d.textContent===''", "true"),
6853 ("var d=document.createElement('div'); d.innerHTML='<b>x</b>'; d.innerHTML=undefined; d.innerHTML===''", "true"),
6854 ("var c=document.getElementById('out'); var s=document.createElement('span'); s.textContent='X'; c.appendChild(s); c.textContent", "0X"),
6855 ("var c=document.getElementById('out'); c.innerHTML='<b>Y</b>'; c.textContent", "Y"),
6856 ("var c=document.getElementById('out'); var i=document.createElement('i'); c.appendChild(i); document.querySelector('i') === null", "false"),
6857 ("var c=document.getElementById('out'); c.innerHTML='<span class=z>1</span><span class=z>2</span>'; document.querySelectorAll('.z').length", "2"),
6858 ("var c=document.getElementById('out'); var t=document.createTextNode('TT'); c.appendChild(t); c.textContent", "0TT"),
6859 ("var c=document.getElementById('out'); c.appendChild(document.createElement('em')); document.querySelector('em').remove(); document.querySelector('em') === null", "true"),
6860 (
6868 "var a=document.createElement('div'); var b=document.getElementById('out'); a.ariaActiveDescendantElement=b; a.getAttribute('aria-activedescendant')+'|'+(a.ariaActiveDescendantElement===b)",
6869 "out|true",
6870 ),
6871 (
6877 "var a=document.createElement('div'); var b1=document.getElementById('out'); var b2=document.getElementById('b'); a.ariaLabelledByElements=[b1,b2]; a.getAttribute('aria-labelledby')+'|'+a.ariaLabelledByElements.length+'|'+(a.ariaLabelledByElements[0]===b1)+'|'+(a.ariaLabelledByElements[1]===b2)",
6878 "out b|2|true|true",
6879 ),
6880 (
6881 "document.createElement('div').ariaDescribedByElements.length",
6882 "0",
6883 ),
6884 (
6889 "var p1=document.createElement('div'); var p2=document.createElement('div'); var m=document.createElement('span'); p1.appendChild(m); var r=document.createElement('b'); p2.appendChild(r); p2.moveBefore(m, r); m.parentNode===p2 && p2.firstChild===m && p1.children.length",
6890 "0",
6891 ),
6892 (
6893 "var p=document.createElement('div'); var a=document.createElement('i'); var b=document.createElement('b'); p.appendChild(a); p.appendChild(b); p.moveBefore(b, a); p.firstChild===b",
6894 "true",
6895 ),
6896 (
6897 "var p1=document.createElement('div'); var p2=document.createElement('div'); var m=document.createElement('span'); var other=document.createElement('b'); p1.appendChild(m); p2.appendChild(other); try { p1.moveBefore(m, other); 'no-throw'; } catch(e) { e.name; }",
6898 "NotFoundError",
6899 ),
6900 ];
6901 total += dom_cases.len();
6902 for (src, expect) in dom_cases {
6903 let mut rt = JsRuntime::new();
6904 rt.dom
6905 .borrow_mut()
6906 .build_from(&crate::os_lib::dom::parse_html(dom_html));
6907 match rt.eval(src) {
6908 Ok(v) if &v.to_js_string() == expect => passed += 1,
6909 Ok(v) => crate::println!(
6910 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
6911 src,
6912 v.to_js_string(),
6913 expect
6914 ),
6915 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
6916 }
6917 }
6918
6919 let dom2_html = "<div id='wrap' class='container'><p id='t' class='a b' data-k='v'>x</p><span id='s'>y</span></div>";
6921 let dom2_cases: &[(&str, &str)] = &[
6922 ("document.getElementById('t').hasAttribute('class')", "true"),
6923 ("document.getElementById('t').hasAttribute('nope')", "false"),
6924 ("document.getElementById('t').getAttribute('data-k')", "v"),
6925 ("var e=document.getElementById('t'); e.removeAttribute('class'); e.hasAttribute('class')", "false"),
6926 ("document.getElementById('t').matches('.a')", "true"),
6927 ("document.getElementById('t').matches('.z')", "false"),
6928 ("document.getElementById('t').matches('p')", "true"),
6929 ("document.getElementById('t').closest('.container').id", "wrap"),
6930 ("document.getElementById('t').closest('#wrap').id", "wrap"),
6931 ("document.getElementById('t').closest('p').id", "t"),
6932 ("document.getElementById('t').closest('.nope') === null", "true"),
6933 ("document.getElementById('wrap').querySelector('.a').id", "t"),
6934 ("document.getElementById('wrap').querySelector('span').id", "s"),
6935 ("document.getElementById('wrap').querySelectorAll('*').length", "2"),
6936 ("document.getElementById('t').matches('p.a')", "true"),
6939 ("document.getElementById('t').matches('p.z')", "false"),
6940 ("document.getElementById('t').matches('p.a.b')", "true"),
6941 ("document.getElementById('t').matches('[data-k]')", "true"),
6943 ("document.getElementById('t').matches('[data-k=v]')", "true"),
6944 ("document.getElementById('t').matches('[data-k=x]')", "false"),
6945 ("document.getElementById('t').matches('[data-k^=v]')", "true"),
6946 ("document.getElementById('t').matches('#wrap p')", "true"),
6948 ("document.getElementById('t').matches('#wrap > p')", "true"),
6949 ("document.getElementById('t').matches('#wrap > span')", "false"),
6950 ("document.getElementById('s').matches('p ~ span')", "true"),
6952 ("document.getElementById('s').matches('span ~ span')", "false"),
6953 ("document.getElementById('wrap').querySelector('p.a').id", "t"),
6955 ("document.getElementById('wrap').querySelectorAll('[data-k]').length", "1"),
6956 ("document.getElementById('t').matches(':not(span)')", "true"),
6958 ("document.getElementById('t').matches(':not(p)')", "false"),
6959 ("document.getElementById('t').matches('p:not(.z)')", "true"),
6960 ("document.getElementById('t').matches('p:not(.a)')", "false"),
6961 ("document.getElementById('wrap').querySelectorAll(':not(span)').length", "1"),
6962 ("document.getElementById('wrap').querySelectorAll(':scope > p').length", "1"),
6966 ("document.getElementById('wrap').querySelectorAll(':scope > p')[0].id", "t"),
6967 ("document.getElementById('wrap').querySelector(':scope > span').id", "s"),
6968 ("document.getElementById('wrap').querySelectorAll(':scope > .nope').length", "0"),
6969 ("document.getElementById('t').matches(':scope')", "true"),
6970 ("document.getElementById('t').closest(':scope').id", "t"),
6971 ("document.getElementById('t').matches(':first-child')", "true"),
6973 ("document.getElementById('t').matches(':last-child')", "false"),
6974 ("document.getElementById('s').matches(':last-child')", "true"),
6975 ("document.getElementById('t').matches(':only-child')", "false"),
6976 ("document.getElementById('t').matches(':nth-child(1)')", "true"),
6977 ("document.getElementById('s').matches(':nth-child(2)')", "true"),
6978 ("document.getElementById('t').matches(':nth-child(odd)')", "true"),
6979 ("document.getElementById('s').matches(':nth-child(odd)')", "false"),
6980 ("document.getElementById('s').matches(':nth-child(2n)')", "true"),
6981 ("document.getElementById('s').matches(':nth-last-child(1)')", "true"),
6984 ("document.getElementById('t').matches(':nth-last-child(1)')", "false"),
6985 ("document.getElementById('t').matches(':nth-last-child(2)')", "true"),
6986 ("document.getElementById('s').matches(':nth-last-child(odd)')", "true"),
6987 (
6994 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot1a'>a</p><span id='ot1b'>b</span><p id='ot1c'>c</p><p id='ot1d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot1a').matches(':first-of-type')",
6995 "true",
6996 ),
6997 (
6998 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot2a'>a</p><span id='ot2b'>b</span><p id='ot2c'>c</p><p id='ot2d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot2d').matches(':last-of-type')",
6999 "true",
7000 ),
7001 (
7002 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot3a'>a</p><span id='ot3b'>b</span><p id='ot3c'>c</p><p id='ot3d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot3c').matches(':last-of-type')",
7003 "false",
7004 ),
7005 (
7006 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot4a'>a</p><span id='ot4b'>b</span><p id='ot4c'>c</p><p id='ot4d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot4b').matches(':only-of-type')",
7007 "true",
7008 ),
7009 (
7010 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot5a'>a</p><span id='ot5b'>b</span><p id='ot5c'>c</p><p id='ot5d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot5a').matches(':only-of-type')",
7011 "false",
7012 ),
7013 (
7014 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot6a'>a</p><span id='ot6b'>b</span><p id='ot6c'>c</p><p id='ot6d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot6c').matches(':nth-of-type(2)')",
7015 "true",
7016 ),
7017 (
7018 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot7a'>a</p><span id='ot7b'>b</span><p id='ot7c'>c</p><p id='ot7d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot7a').matches(':nth-of-type(2)')",
7019 "false",
7020 ),
7021 (
7024 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot8a'>a</p><span id='ot8b'>b</span><p id='ot8c'>c</p><p id='ot8d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot8d').matches(':nth-last-of-type(1)')",
7025 "true",
7026 ),
7027 (
7028 "var w=document.createElement('div'); w.innerHTML=\"<p id='ot9a'>a</p><span id='ot9b'>b</span><p id='ot9c'>c</p><p id='ot9d'>d</p>\"; document.getElementById('wrap').appendChild(w); document.getElementById('ot9a').matches(':nth-last-of-type(3)')",
7029 "true",
7030 ),
7031 ("document.getElementById('t').matches(':is(.z, .a)')", "true"),
7034 ("document.getElementById('t').matches(':is(.z, .y)')", "false"),
7035 ("document.getElementById('t').matches(':where(span, p.a)')", "true"),
7036 ("document.getElementById('s').matches(':is(span)')", "true"),
7037 ("document.getElementById('t').parentElement.id", "wrap"),
7038 ("document.getElementById('wrap').children.length", "2"),
7039 ("document.getElementById('wrap').childElementCount", "2"),
7040 ("document.getElementById('wrap').hasChildNodes()", "true"),
7042 ("document.createElement('div').hasChildNodes()", "false"),
7043 (
7048 "document.createElementNS('http://www.w3.org/2000/svg', 'circle').tagName",
7049 "CIRCLE",
7050 ),
7051 (
7052 "var e=document.createElementNS('http://www.w3.org/2000/svg', 'rect'); \
7053 e.setAttribute('width', '10'); e.getAttribute('width')",
7054 "10",
7055 ),
7056 ("document.getElementById('wrap').firstElementChild.id", "t"),
7057 ("document.getElementById('wrap').lastElementChild.id", "s"),
7058 ("document.getElementById('t').nextElementSibling.id", "s"),
7059 ("document.getElementById('s').previousElementSibling.id", "t"),
7060 ("document.getElementById('wrap').getAttributeNames().join(',')", "id,class"),
7061 ("document.getElementById('wrap').attributes.length", "2"),
7064 ("document.getElementById('wrap').attributes[0].name", "id"),
7065 ("document.getElementById('wrap').attributes[0].value", "wrap"),
7066 ("document.getElementById('wrap').getAttributeNode('id').value", "wrap"),
7069 ("document.getElementById('wrap').getAttributeNode('missing')", "null"),
7070 (
7071 "var e=document.getElementById('wrap'); \
7072 e.setAttributeNode({name:'data-x', value:'1'}); e.getAttribute('data-x')",
7073 "1",
7074 ),
7075 (
7076 "var e=document.getElementById('wrap'); var a=e.getAttributeNode('id'); \
7077 e.removeAttributeNode(a); e.hasAttribute('id')",
7078 "false",
7079 ),
7080 ("document.createAttribute('DATA-X').name", "data-x"),
7084 ("document.createAttribute('data-x').value", ""),
7085 ("document.createAttribute('data-x').ownerElement", "null"),
7086 (
7087 "var e=document.getElementById('wrap'); var a=document.createAttribute('data-y'); \
7088 a.value='42'; e.setAttributeNode(a); e.getAttribute('data-y')",
7089 "42",
7090 ),
7091 ("document.fullscreenElement", "null"),
7095 ("document.fullscreenEnabled", "true"),
7096 (
7097 "var e=document.getElementById('wrap'); e.requestFullscreen(); document.fullscreenElement===e",
7098 "true",
7099 ),
7100 (
7101 "var e=document.getElementById('wrap'); e.requestFullscreen(); document.exitFullscreen(); document.fullscreenElement",
7102 "null",
7103 ),
7104 ("document.pointerLockElement", "null"),
7108 (
7109 "var e=document.getElementById('wrap'); e.requestPointerLock(); document.pointerLockElement===e",
7110 "true",
7111 ),
7112 (
7113 "var e=document.getElementById('wrap'); e.requestPointerLock(); document.exitPointerLock(); document.pointerLockElement",
7114 "null",
7115 ),
7116 ("document.pictureInPictureElement", "null"),
7121 ("document.pictureInPictureEnabled", "true"),
7122 (
7123 "var e=document.getElementById('wrap'); e.requestPictureInPicture(); \
7124 document.pictureInPictureElement===e",
7125 "true",
7126 ),
7127 (
7128 "var e=document.getElementById('wrap'); e.requestPictureInPicture(); \
7129 document.exitPictureInPicture(); document.pictureInPictureElement",
7130 "null",
7131 ),
7132 (
7135 "document.createTreeWalker(document.getElementById('wrap')).currentNode.id",
7136 "wrap",
7137 ),
7138 (
7139 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7140 tw.firstChild(); tw.currentNode.id",
7141 "t",
7142 ),
7143 (
7144 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7145 tw.firstChild(); tw.nextSibling(); tw.currentNode.id",
7146 "s",
7147 ),
7148 (
7149 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7150 tw.firstChild(); tw.nextSibling(); tw.parentNode(); tw.currentNode.id",
7151 "wrap",
7152 ),
7153 (
7154 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7155 tw.nextNode(); tw.currentNode.id",
7156 "t",
7157 ),
7158 (
7159 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7160 var r=tw.parentNode(); r === null && tw.currentNode.id === 'wrap'",
7161 "true",
7162 ),
7163 (
7166 "document.createNodeIterator(document.getElementById('wrap')).nextNode().id",
7167 "wrap",
7168 ),
7169 (
7170 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7171 ni.nextNode(); ni.nextNode().id",
7172 "t",
7173 ),
7174 (
7177 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7178 ni.nextNode(); ni.nextNode(); ni.nextNode().nodeValue",
7179 "x",
7180 ),
7181 (
7182 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7183 ni.nextNode(); ni.nextNode(); ni.nextNode(); ni.nextNode().id",
7184 "s",
7185 ),
7186 (
7187 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7188 ni.nextNode(); ni.nextNode(); ni.nextNode(); ni.nextNode(); ni.nextNode(); \
7189 ni.nextNode() === null",
7190 "true",
7191 ),
7192 (
7193 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7194 ni.nextNode(); ni.nextNode(); ni.previousNode().id",
7195 "t",
7196 ),
7197 (
7198 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7199 ni.nextNode(); ni.nextNode(); ni.previousNode(); ni.previousNode().id",
7200 "wrap",
7201 ),
7202 ("document.getElementById('wrap').contentEditable", "inherit"),
7205 ("document.getElementById('wrap').isContentEditable", "false"),
7206 (
7207 "var e=document.getElementById('wrap'); e.contentEditable='true'; \
7208 e.contentEditable + ',' + e.isContentEditable",
7209 "true,true",
7210 ),
7211 (
7212 "var e=document.getElementById('wrap'); e.contentEditable='plaintext-only'; \
7213 e.contentEditable + ',' + e.isContentEditable",
7214 "plaintext-only,true",
7215 ),
7216 (
7217 "var e=document.getElementById('wrap'); e.contentEditable='bogus'; e.contentEditable",
7218 "inherit",
7219 ),
7220 ("document.designMode", "off"),
7221 ("document.getElementById('wrap').spellcheck", "true"),
7225 (
7226 "var e=document.getElementById('wrap'); e.spellcheck=false; e.spellcheck",
7227 "false",
7228 ),
7229 ("document.getElementById('wrap').inputMode", ""),
7230 (
7231 "var e=document.getElementById('wrap'); e.inputMode='numeric'; e.inputMode",
7232 "numeric",
7233 ),
7234 (
7235 "var e=document.getElementById('wrap'); e.enterKeyHint='search'; e.enterKeyHint",
7236 "search",
7237 ),
7238 (
7243 "var e=document.getElementById('wrap'); e.autocapitalize='words'; e.autocapitalize",
7244 "words",
7245 ),
7246 ("document.createElement('div').popover", "null"),
7247 (
7248 "var e=document.createElement('div'); e.popover='manual'; e.popover",
7249 "manual",
7250 ),
7251 (
7252 "var e=document.createElement('div'); e.popover='auto'; e.popover=null; e.popover",
7253 "null",
7254 ),
7255 (
7259 "var b=document.createElement('button'); b.setAttribute('popovertarget','wrap'); \
7260 b.popoverTargetElement === document.getElementById('wrap')",
7261 "true",
7262 ),
7263 ("document.createElement('button').popoverTargetElement", "null"),
7264 (
7265 "var b=document.createElement('button'); b.popoverTargetElement = document.getElementById('wrap'); \
7266 b.getAttribute('popovertarget')",
7267 "wrap",
7268 ),
7269 (
7270 "var b=document.createElement('button'); b.popoverTargetAction='hide'; b.popoverTargetAction",
7271 "hide",
7272 ),
7273 ("document.createElement('input').list", "null"),
7276 (
7277 "var i=document.createElement('input'); i.setAttribute('list','missing'); i.list",
7278 "null",
7279 ),
7280 (
7281 "var dl=document.createElement('datalist'); dl.id='opts'; \
7282 document.getElementById('wrap').appendChild(dl); \
7283 var i=document.createElement('input'); i.setAttribute('list','opts'); \
7284 i.list === dl",
7285 "true",
7286 ),
7287 (
7288 "var d=document.createElement('div'); d.id='notdl'; \
7289 document.getElementById('wrap').appendChild(d); \
7290 var i=document.createElement('input'); i.setAttribute('list','notdl'); i.list",
7291 "null",
7292 ),
7293 ("document.createElement('a').relList.length", "0"),
7296 (
7297 "var a=document.createElement('a'); a.rel='noopener noreferrer'; \
7298 a.relList.join(',')",
7299 "noopener,noreferrer",
7300 ),
7301 (
7302 "var a=document.createElement('a'); a.rel='noopener noreferrer'; \
7303 a.relList.includes('noreferrer')",
7304 "true",
7305 ),
7306 (
7309 "var a=document.createElement('a'); a.referrerPolicy='no-referrer'; \
7310 a.referrerPolicy",
7311 "no-referrer",
7312 ),
7313 (
7314 "var i=document.createElement('img'); i.loading='lazy'; i.loading",
7315 "lazy",
7316 ),
7317 (
7318 "var i=document.createElement('img'); i.decoding='async'; i.decoding",
7319 "async",
7320 ),
7321 (
7322 "var f=document.createElement('iframe'); f.allow='camera'; f.allow",
7323 "camera",
7324 ),
7325 ("document.createElement('iframe').sandbox.length", "0"),
7326 (
7327 "var f=document.createElement('iframe'); \
7328 f.setAttribute('sandbox','allow-scripts allow-forms'); \
7329 f.sandbox.join(',')",
7330 "allow-scripts,allow-forms",
7331 ),
7332 ("document.createElement('img').crossOrigin", "null"),
7336 (
7337 "var i=document.createElement('img'); i.crossOrigin='anonymous'; i.crossOrigin",
7338 "anonymous",
7339 ),
7340 ("document.createElement('img').fetchPriority", "auto"),
7341 (
7342 "var i=document.createElement('img'); i.fetchPriority='high'; i.fetchPriority",
7343 "high",
7344 ),
7345 (
7346 "var s=document.createElement('script'); s.integrity='sha256-x'; s.integrity",
7347 "sha256-x",
7348 ),
7349 (
7350 "var s=document.createElement('script'); s.async=true; s.async + ',' + \
7351 s.hasAttribute('async')",
7352 "true,true",
7353 ),
7354 (
7355 "var s=document.createElement('script'); s.defer=true; s.defer=false; s.defer",
7356 "false",
7357 ),
7358 (
7359 "var s=document.createElement('script'); s.noModule=true; s.noModule",
7360 "true",
7361 ),
7362 (
7366 "var i=document.createElement('img'); i.srcset='a.jpg 1x, b.jpg 2x'; i.srcset",
7367 "a.jpg 1x, b.jpg 2x",
7368 ),
7369 (
7370 "var i=document.createElement('img'); i.sizes='(max-width:600px) 480px'; i.sizes",
7371 "(max-width:600px) 480px",
7372 ),
7373 (
7374 "var l=document.createElement('link'); l.media='print'; l.media",
7375 "print",
7376 ),
7377 (
7378 "var i=document.createElement('img'); i.useMap='#m'; i.useMap",
7379 "#m",
7380 ),
7381 ("document.createElement('img').isMap", "false"),
7382 (
7383 "var i=document.createElement('img'); i.isMap=true; i.hasAttribute('ismap')",
7384 "true",
7385 ),
7386 (
7387 "var i=document.createElement('img'); i.src='a.jpg'; i.currentSrc",
7388 "a.jpg",
7389 ),
7390 ("document.createElement('img').complete", "false"),
7395 (
7396 "var i=document.createElement('img'); i.src='a.jpg'; i.complete",
7397 "true",
7398 ),
7399 (
7400 "var i=document.createElement('img'); i.src='a.jpg'; i.naturalWidth + ',' + i.naturalHeight",
7401 "0,0",
7402 ),
7403 (
7404 "var i=document.createElement('img'); i.src='a.jpg'; \
7405 await i.decode().then(() => 'ok')",
7406 "ok",
7407 ),
7408 (
7409 "var i=document.createElement('img'); \
7410 await i.decode().catch(e => e.name)",
7411 "EncodingError",
7412 ),
7413 ("document.createElement('video').autoplay", "false"),
7417 (
7418 "var v=document.createElement('video'); v.autoplay=true; v.autoplay + \
7419 ',' + v.hasAttribute('autoplay')",
7420 "true,true",
7421 ),
7422 (
7423 "var v=document.createElement('video'); v.controls=true; v.controls=false; \
7424 v.controls",
7425 "false",
7426 ),
7427 (
7428 "var v=document.createElement('video'); v.loop=true; v.loop",
7429 "true",
7430 ),
7431 (
7432 "var v=document.createElement('video'); v.muted=true; v.muted",
7433 "true",
7434 ),
7435 (
7436 "var v=document.createElement('video'); v.playsInline=true; \
7437 v.hasAttribute('playsinline')",
7438 "true",
7439 ),
7440 (
7441 "var v=document.createElement('video'); v.preload='auto'; v.preload",
7442 "auto",
7443 ),
7444 (
7445 "var v=document.createElement('video'); v.poster='p.jpg'; v.poster",
7446 "p.jpg",
7447 ),
7448 (
7449 "var a=document.createElement('a'); a.ping='https://x'; a.ping",
7450 "https://x",
7451 ),
7452 (
7453 "var a=document.createElement('a'); a.hreflang='en'; a.hreflang",
7454 "en",
7455 ),
7456 ("document.createElement('video').paused", "true"),
7460 (
7461 "var v=document.createElement('video'); await v.play(); v.paused",
7462 "false",
7463 ),
7464 (
7465 "var v=document.createElement('video'); await v.play(); v.pause(); v.paused",
7466 "true",
7467 ),
7468 (
7469 "var v=document.createElement('video'); v.currentTime=12.5; v.currentTime",
7470 "12.5",
7471 ),
7472 (
7473 "var v=document.createElement('video'); Number.isNaN(v.duration)",
7474 "true",
7475 ),
7476 ("document.createElement('video').volume", "1"),
7477 (
7478 "var v=document.createElement('video'); v.volume=0.5; v.volume",
7479 "0.5",
7480 ),
7481 (
7482 "var v=document.createElement('video'); v.volume=5; v.volume",
7483 "1",
7484 ),
7485 (
7486 "var v=document.createElement('video'); v.playbackRate=2; v.playbackRate",
7487 "2",
7488 ),
7489 (
7493 "var v=document.createElement('video'); var log=[]; \
7494 v.addEventListener('play', ()=>log.push('play')); \
7495 v.addEventListener('playing', ()=>log.push('playing')); \
7496 await v.play(); log.join(',')",
7497 "play,playing",
7498 ),
7499 (
7500 "var v=document.createElement('video'); var n=0; \
7501 v.addEventListener('pause', ()=>n++); \
7502 await v.play(); v.pause(); v.pause(); n",
7503 "1",
7504 ),
7505 (
7506 "var v=document.createElement('video'); var n=0; \
7507 v.addEventListener('play', ()=>n++); \
7508 await v.play(); await v.play(); n",
7509 "1",
7510 ),
7511 (
7515 "var v=document.createElement('video'); var f=false; \
7516 v.addEventListener('seeked', ()=>f=true); v.currentTime=5; f",
7517 "true",
7518 ),
7519 (
7520 "var v=document.createElement('video'); var f=false; \
7521 v.addEventListener('volumechange', ()=>f=true); v.volume=0.3; f",
7522 "true",
7523 ),
7524 (
7525 "var v=document.createElement('video'); var f=false; \
7526 v.addEventListener('volumechange', ()=>f=true); v.muted=true; f",
7527 "true",
7528 ),
7529 (
7530 "var v=document.createElement('video'); var f=false; \
7531 v.addEventListener('ratechange', ()=>f=true); v.playbackRate=1.5; f",
7532 "true",
7533 ),
7534 ("document.createElement('video').readyState", "0"),
7538 ("document.createElement('video').networkState", "0"),
7539 (
7540 "var v=document.createElement('video'); v.src='a.mp4'; v.networkState",
7541 "3",
7542 ),
7543 ("document.createElement('video').error", "null"),
7544 ("document.createElement('video').buffered.length", "0"),
7549 ("document.createElement('video').seekable.length", "0"),
7550 (
7551 "try { document.createElement('video').buffered.start(0); 'no-throw' } \
7552 catch(e) { 'threw' }",
7553 "threw",
7554 ),
7555 ("document.createElement('video').defaultPlaybackRate", "1"),
7556 (
7557 "var v=document.createElement('video'); v.defaultPlaybackRate=1.5; \
7558 v.defaultPlaybackRate + ',' + v.playbackRate",
7559 "1.5,1",
7560 ),
7561 (
7565 "document.createElement('div').getAnimations().length",
7566 "0",
7567 ),
7568 (
7569 "var e=document.createElement('div'); e.animate([], 100); \
7570 e.getAnimations().length",
7571 "0",
7572 ),
7573 ("document.getAnimations().length", "0"),
7574 (
7578 "var a=document.createElement('div').animate([],100); \
7579 typeof a.reverse + ',' + typeof a.finish + ',' + a.playbackRate",
7580 "function,function,1",
7581 ),
7582 (
7583 "var a=document.createElement('div').animate([],100); a.reverse(); a.finish(); a.playbackRate=2; a.playbackRate",
7584 "2",
7585 ),
7586 (
7589 "var s=document.createElement('script'); s.nonce='abc123'; s.nonce",
7590 "abc123",
7591 ),
7592 (
7596 "var s=document.getSelection(); s.collapse(document.body, 0); \
7597 s.anchorNode + ',' + s.type",
7598 "null,None",
7599 ),
7600 (
7601 "var s=document.getSelection(); s.containsNode(document.body)",
7602 "false",
7603 ),
7604 (
7608 "typeof document.getSelection().removeRange",
7609 "function",
7610 ),
7611 (
7612 "document.getSelection().removeRange(document.createRange())",
7613 "undefined",
7614 ),
7615 (
7616 "try { document.getSelection().getRangeAt(0); 'no-throw' } \
7617 catch(e) { 'threw' }",
7618 "threw",
7619 ),
7620 (
7624 "var r=document.createRange(); r.setStart(document.body, 0); \
7625 r.collapsed + ',' + r.toString()",
7626 "true,",
7627 ),
7628 (
7629 "var r=document.createRange(); var r2=r.cloneRange(); \
7630 r2.collapsed",
7631 "true",
7632 ),
7633 (
7634 "document.createRange().isPointInRange(document.body, 0)",
7635 "false",
7636 ),
7637 (
7638 "document.designMode='on'; document.designMode",
7639 "on",
7640 ),
7641 ("document.getElementById('wrap').hasAttributes()", "true"),
7644 ("document.createElement('div').hasAttributes()", "false"),
7645 ("var e=document.getElementById('wrap'); e.isSameNode(e)", "true"),
7647 (
7648 "document.getElementById('wrap').isSameNode(document.getElementById('t'))",
7649 "false",
7650 ),
7651 (
7652 "var a=document.createElement('div'); a.id='x'; var b=document.createElement('div'); b.id='x'; a.isEqualNode(b)",
7653 "true",
7654 ),
7655 (
7656 "var a=document.createElement('div'); a.id='x'; var b=document.createElement('div'); b.id='y'; a.isEqualNode(b)",
7657 "false",
7658 ),
7659 (
7662 "var d=document.createElement('div'); d.appendChild(document.createTextNode('a')); d.appendChild(document.createTextNode('b')); d.normalize(); d.childNodes.length",
7663 "1",
7664 ),
7665 (
7666 "var d=document.createElement('div'); d.appendChild(document.createTextNode('a')); d.appendChild(document.createTextNode('b')); d.normalize(); d.textContent",
7667 "ab",
7668 ),
7669 (
7670 "var d=document.createElement('div'); d.appendChild(document.createTextNode('')); d.normalize(); d.childNodes.length",
7671 "0",
7672 ),
7673 ("typeof document.createDocumentFragment", "function"),
7676 (
7677 "var f=document.createDocumentFragment(); f.appendChild(document.createElement('span')); f.appendChild(document.createElement('em')); var d=document.createElement('div'); d.appendChild(f); d.children.length+','+d.children[0].tagName+','+d.children[1].tagName",
7678 "2,SPAN,EM",
7679 ),
7680 (
7682 "var f=document.createDocumentFragment(); f.appendChild(document.createElement('span')); var d=document.createElement('div'); d.appendChild(f); f.childNodes.length",
7683 "0",
7684 ),
7685 ("document.getElementsByTagName('p').length", "1"),
7687 ("document.getElementsByClassName('a')[0].id", "t"),
7688 ("document.getElementsByTagName('span')[0].id", "s"),
7689 (
7692 "document.getElementById('wrap').getElementsByClassName('a')[0].id",
7693 "t",
7694 ),
7695 (
7696 "document.getElementById('wrap').getElementsByTagName('span')[0].id",
7697 "s",
7698 ),
7699 (
7700 "document.getElementById('s').getElementsByClassName('a').length",
7701 "0",
7702 ),
7703 ("document.getElementsByTagNameNS('*', 'span')[0].id", "s"),
7705 (
7706 "document.getElementById('wrap').getElementsByTagNameNS(null, 'span')[0].id",
7707 "s",
7708 ),
7709 (
7710 "document.getElementById('wrap').getAttributeNodeNS(null, 'id').value",
7711 "wrap",
7712 ),
7713 (
7714 "document.getElementById('wrap').getAttributeNodeNS('http://www.w3.org/1999/xhtml', 'missing') === null",
7715 "true",
7716 ),
7717 (
7721 "var a=document.createElement('input'); a.setAttribute('name','q'); \
7722 var b=document.createElement('input'); b.setAttribute('name','q'); \
7723 var wrap=document.getElementById('wrap'); \
7724 wrap.appendChild(a); wrap.appendChild(b); \
7725 document.getElementsByName('q').length",
7726 "2",
7727 ),
7728 ("document.getElementsByName('no-such-name').length", "0"),
7729 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='ap'; w.append(n); w.lastElementChild.id", "ap"),
7731 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='pp'; w.prepend(n); w.firstElementChild.id", "pp"),
7732 ("var n=document.createElement('b'); n.id='bf'; document.getElementById('t').before(n); document.getElementById('t').previousElementSibling.id", "bf"),
7733 ("var n=document.createElement('b'); n.id='af'; document.getElementById('t').after(n); document.getElementById('t').nextElementSibling.id", "af"),
7734 ("var n=document.createElement('b'); n.id='rw'; document.getElementById('s').replaceWith(n); document.getElementById('wrap').lastElementChild.id", "rw"),
7735 ("var w=document.getElementById('wrap'); w.append('TXT'); w.textContent.indexOf('TXT') >= 0", "true"),
7736 (
7739 "var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='rc'; w.replaceChildren(n); w.children.length + ',' + w.firstElementChild.id",
7740 "1,rc",
7741 ),
7742 (
7743 "var w=document.getElementById('wrap'); w.replaceChildren(); w.children.length",
7744 "0",
7745 ),
7746 (
7749 "var w=document.getElementById('wrap'); w.scrollTo(0, 50); w.scrollTop",
7750 "50",
7751 ),
7752 (
7753 "var w=document.getElementById('wrap'); w.scrollTo({top: 30}); w.scrollTop",
7754 "30",
7755 ),
7756 (
7757 "var w=document.getElementById('wrap'); w.scrollTop=10; w.scrollBy(0, 5); w.scrollTop",
7758 "15",
7759 ),
7760 ("document.getElementById('t').classList.length", "2"),
7762 ("document.getElementById('t').classList.value", "a b"),
7763 ("document.getElementById('t').classList.item(0)", "a"),
7764 ("document.getElementById('t').classList.toString()", "a b"),
7765 ("var w=document.getElementById('wrap'); w.insertAdjacentHTML('beforeend','<i id=iah>z</i>'); document.getElementById('iah').tagName", "I"),
7767 ("var w=document.getElementById('wrap'); w.insertAdjacentHTML('beforeEnd','<b id=iahc>z</b>'); document.getElementById('iahc').tagName", "B"),
7770 ("var t=document.getElementById('t'); t.insertAdjacentHTML('afterend','<u id=iae>q</u>'); t.nextElementSibling.id", "iae"),
7771 ("var t=document.getElementById('t'); var n=document.createElement('b'); n.id='iel'; t.insertAdjacentElement('beforebegin', n); t.previousElementSibling.id", "iel"),
7772 ("var t=document.getElementById('t'); t.toggleAttribute('hidden'); t.hasAttribute('hidden')", "true"),
7773 ("var t=document.getElementById('t'); t.toggleAttribute('hidden'); t.toggleAttribute('hidden'); t.hasAttribute('hidden')", "false"),
7774 ("var t=document.getElementById('t'); t.toggleAttribute('hidden', true); t.hasAttribute('hidden')", "true"),
7775 ("var t=document.getElementById('t'); t.toggleAttribute('hidden', true); t.toggleAttribute('hidden', false); t.hasAttribute('hidden')", "false"),
7776 ("var d=document.createElement('dialog'); d.open", "false"),
7778 ("var d=document.createElement('dialog'); d.show(); d.open", "true"),
7779 ("var d=document.createElement('dialog'); d.showModal(); d.open", "true"),
7780 ("var d=document.createElement('dialog'); d.show(); d.hasAttribute('_modal')", "false"),
7785 ("var d=document.createElement('dialog'); d.showModal(); d.hasAttribute('_modal')", "true"),
7786 ("var d=document.createElement('dialog'); d.showModal(); d.close(); d.hasAttribute('_modal')", "false"),
7787 ("var d=document.createElement('dialog'); d.show(); d.close(); d.open", "false"),
7788 ("var d=document.createElement('dialog'); d.show(); d.close('ok'); d.returnValue", "ok"),
7789 (
7790 "var d=document.createElement('dialog'); var closed=false; d.addEventListener('close', function(){ closed=true; }); d.show(); d.close(); closed",
7791 "true",
7792 ),
7793 ("var d=document.createElement('dialog'); d.open=true; d.hasAttribute('open')", "true"),
7794 ("var e=document.createElement('div'); e.togglePopover()", "true"),
7798 (
7799 "var e=document.createElement('div'); e.togglePopover(); e.togglePopover()",
7800 "false",
7801 ),
7802 (
7803 "var e=document.createElement('div'); e.togglePopover(true); e.togglePopover(true)",
7804 "true",
7805 ),
7806 (
7807 "var e=document.createElement('div'); e.showPopover(); e.togglePopover()",
7808 "false",
7809 ),
7810 (
7815 "var e=document.createElement('div'); var n=0; \
7816 e.addEventListener('toggle', () => n++); e.showPopover(); e.hidePopover(); n",
7817 "2",
7818 ),
7819 (
7820 "var e=document.createElement('div'); var n=0; \
7821 e.addEventListener('toggle', () => n++); e.togglePopover(); n",
7822 "1",
7823 ),
7824 (
7827 "var e=document.createElement('div'); var s=''; \
7828 e.addEventListener('toggle', ev => s=ev.oldState+'>'+ev.newState); \
7829 e.showPopover(); s",
7830 "closed>open",
7831 ),
7832 (
7833 "var e=document.createElement('div'); var s=''; \
7834 e.addEventListener('toggle', ev => s=ev.oldState+'>'+ev.newState); \
7835 e.showPopover(); e.hidePopover(); s",
7836 "open>closed",
7837 ),
7838 (
7842 "var e=document.createElement('div'); var n=0; \
7843 e.addEventListener('beforetoggle', () => n++); e.showPopover(); n",
7844 "1",
7845 ),
7846 (
7847 "var e=document.createElement('div'); var toggled=false; \
7848 e.addEventListener('beforetoggle', ev => ev.preventDefault()); \
7849 e.addEventListener('toggle', () => toggled=true); \
7850 e.showPopover(); toggled",
7851 "false",
7852 ),
7853 (
7854 "var e=document.createElement('div'); \
7855 e.addEventListener('beforetoggle', ev => ev.preventDefault()); \
7856 e.showPopover(); e.togglePopover()",
7857 "false",
7858 ),
7859 ("var t=document.createElement('div'); t.inert", "false"),
7861 ("var t=document.createElement('div'); t.setAttribute('inert',''); t.inert", "true"),
7862 ("var t=document.createElement('div'); t.inert=true; t.hasAttribute('inert')", "true"),
7863 ("var t=document.createElement('div'); t.inert=true; t.inert=false; t.hasAttribute('inert')", "false"),
7864 (
7866 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; tpl.content.children.length",
7867 "1",
7868 ),
7869 (
7870 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; tpl.content.firstChild.textContent",
7871 "hi",
7872 ),
7873 (
7875 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f=tpl.content; tpl.children.length",
7876 "0",
7877 ),
7878 (
7880 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f1=tpl.content; var f2=tpl.content; f1===f2",
7881 "true",
7882 ),
7883 (
7885 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var host=document.createElement('div'); host.appendChild(tpl.content); host.children.length",
7886 "1",
7887 ),
7888 (
7893 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; \
7894 var imported=document.importNode(tpl.content, true); \
7895 var host=document.createElement('div'); host.appendChild(imported); \
7896 host.children.length + ',' + tpl.content.children.length",
7897 "1,1",
7898 ),
7899 (
7900 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; \
7901 document.importNode(tpl.content, true).firstChild.textContent",
7902 "hi",
7903 ),
7904 (
7905 "var host1=document.createElement('div'); var host2=document.createElement('div'); \
7906 var child=document.createElement('span'); host1.appendChild(child); \
7907 document.adoptNode(child); host2.appendChild(child); \
7908 host1.children.length + ',' + host2.children.length",
7909 "0,1",
7910 ),
7911 (
7916 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f=tpl.content; \
7917 var clone=tpl.cloneNode(true); clone.content===tpl.content",
7918 "false",
7919 ),
7920 (
7921 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f=tpl.content; \
7922 var clone=tpl.cloneNode(true); clone.content.children.length+','+tpl.content.children.length",
7923 "1,1",
7924 ),
7925 (
7929 "var tpl=document.createElement('template'); tpl.innerHTML='hi'; var f=tpl.content; tpl.outerHTML",
7930 "<template></template>",
7931 ),
7932 (
7933 "var tpl=document.createElement('template'); tpl.innerHTML='hi'; var f=tpl.content; \
7934 tpl.getAttributeNames().join(',')",
7935 "",
7936 ),
7937 ("document.createElement('progress').value", "0"),
7940 ("document.createElement('progress').max", "1"),
7941 ("var p=document.createElement('progress'); p.setAttribute('value','30'); p.setAttribute('max','50'); p.value+'/'+p.max", "30/50"),
7942 ("var p=document.createElement('progress'); p.value=40; p.getAttribute('value')", "40"),
7943 ("document.createElement('meter').min", "0"),
7944 ("var m=document.createElement('meter'); m.setAttribute('value','5'); typeof m.value", "number"),
7945 ("var i=document.createElement('input'); i.type='number'; i.value='42'; i.valueAsNumber", "42"),
7947 ("var i=document.createElement('input'); i.type='text'; i.value='42'; isNaN(i.valueAsNumber)", "true"),
7948 ("var i=document.createElement('input'); i.type='number'; i.valueAsNumber=7; i.value", "7"),
7949 ("var i=document.createElement('input'); i.type='number'; i.value='5'; i.valueAsNumber=NaN; i.value", ""),
7950 (
7953 "var i=document.createElement('input'); i.type='date'; i.value='2024-03-15'; \
7954 i.valueAsDate.getUTCFullYear()+'-'+(i.valueAsDate.getUTCMonth()+1)+'-'+i.valueAsDate.getUTCDate()",
7955 "2024-3-15",
7956 ),
7957 ("var i=document.createElement('input'); i.type='text'; i.value='2024-03-15'; i.valueAsDate", "null"),
7958 (
7959 "var i=document.createElement('input'); i.type='date'; i.valueAsDate=new Date(Date.UTC(2024,2,15)); i.value",
7960 "2024-03-15",
7961 ),
7962 (
7963 "var i=document.createElement('input'); i.type='month'; i.valueAsDate=new Date(Date.UTC(2024,2,15)); i.value",
7964 "2024-03",
7965 ),
7966 (
7967 "var i=document.createElement('input'); i.type='date'; i.value='x'; i.valueAsDate=null; i.value",
7968 "",
7969 ),
7970 (
7974 "var i=document.createElement('input'); i.type='date'; \
7975 i.setAttribute('value','not-a-date'); i.value",
7976 "",
7977 ),
7978 (
7979 "var i=document.createElement('input'); i.type='date'; \
7980 i.setAttribute('value','2026-07-18'); i.value",
7981 "2026-07-18",
7982 ),
7983 (
7984 "var i=document.createElement('input'); i.type='month'; \
7985 i.setAttribute('value','garbage'); i.value",
7986 "",
7987 ),
7988 (
7989 "var i=document.createElement('input'); i.type='datetime-local'; \
7990 i.setAttribute('value','2026-07-18T14:30'); i.value",
7991 "2026-07-18T14:30",
7992 ),
7993 ("var e=document.createElement('div'); e.setAttributeNS(null,'data-k','v'); e.getAttribute('data-k')", "v"),
7996 ("var e=document.createElement('div'); e.setAttribute('data-k','v'); e.getAttributeNS(null,'data-k')", "v"),
7997 ("var e=document.createElement('div'); e.setAttributeNS(null,'data-k','v'); e.hasAttributeNS(null,'data-k')", "true"),
7998 (
7999 "var e=document.createElement('div'); e.setAttributeNS(null,'data-k','v'); e.removeAttributeNS(null,'data-k'); e.hasAttribute('data-k')",
8000 "false",
8001 ),
8002 (
8004 "var p=document.createElement('div'); var c=document.createElement('span'); p.appendChild(c); c.getRootNode()===p",
8005 "true",
8006 ),
8007 (
8009 "document.getElementById('t').getRootNode()===document.getElementById('wrap').getRootNode()",
8010 "true",
8011 ),
8012 ("var e=document.createElement('div'); e.getRootNode()===e", "true"),
8014 ("var e=document.createElement('div'); e.lookupNamespaceURI('svg')", "null"),
8018 ("var e=document.createElement('div'); e.lookupPrefix('http://www.w3.org/2000/svg')", "null"),
8019 ("var e=document.createElement('div'); e.isDefaultNamespace(null)", "true"),
8020 ("var e=document.createElement('div'); e.isDefaultNamespace('http://www.w3.org/2000/svg')", "false"),
8021 ("document.getElementById('t').nodeType", "1"),
8023 ("document.getElementById('t').nodeName", "P"),
8024 ("document.getElementById('t').hidden", "false"),
8025 ("var e=document.getElementById('t'); e.toggleAttribute('hidden'); e.hidden", "true"),
8026 ("document.getElementById('t').dataset.k", "v"),
8029 ("var e=document.getElementById('t'); e.dataset.userId='42'; e.getAttribute('data-user-id')", "42"),
8030 ("var e=document.getElementById('t'); e.setAttribute('data-foo-bar','9'); e.dataset.fooBar", "9"),
8031 ("document.getElementById('t').dataset.missing === undefined", "true"),
8032 (
8035 "var e=document.getElementById('t'); e.dataset.temp='x'; delete e.dataset.temp; e.dataset.temp === undefined",
8036 "true",
8037 ),
8038 (
8039 "var e=document.getElementById('t'); e.dataset.userId='42'; delete e.dataset.userId; e.hasAttribute('data-user-id')",
8040 "false",
8041 ),
8042 (
8044 "var e=document.getElementById('t'); e.style.color='red'; delete e.style.color; e.style.color",
8045 "",
8046 ),
8047 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='n'; w.insertBefore(n, document.getElementById('s')); w.children[1].id", "n"),
8049 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); w.insertBefore(n, null); w.lastElementChild.tagName", "B"),
8050 ("var w=document.getElementById('wrap'); var n=document.createElement('i'); n.id='ni'; w.replaceChild(n, document.getElementById('s')); w.lastElementChild.id", "ni"),
8052 ("var w=document.getElementById('wrap'); var n=document.createElement('i'); var old=w.replaceChild(n, document.getElementById('s')); old.id", "s"),
8053 (
8059 "var w=document.getElementById('wrap'); var outsider=document.createElement('div'); \
8060 var n=document.createElement('b'); \
8061 try { w.insertBefore(n, outsider); 'no-throw' } catch(e) { e.name }",
8062 "NotFoundError",
8063 ),
8064 (
8065 "var w=document.getElementById('wrap'); var outsider=document.createElement('div'); \
8066 var n=document.createElement('b'); \
8067 try { w.replaceChild(n, outsider); 'no-throw' } catch(e) { e.name }",
8068 "NotFoundError",
8069 ),
8070 (
8071 "var w=document.getElementById('wrap'); var outsider=document.createElement('div'); \
8072 try { w.removeChild(outsider); 'no-throw' } catch(e) { e.name }",
8073 "NotFoundError",
8074 ),
8075 ("document.getElementById('t').cloneNode(true).textContent", "x"),
8077 ("var c=document.getElementById('t').cloneNode(false); c.tagName + ':' + c.children.length", "P:0"),
8078 ("document.getElementById('t').cloneNode(true).parentElement === null", "true"),
8079 ("var e=document.getElementById('t'); e.classList.replace('a','z'); e.classList.contains('z') + ',' + e.classList.contains('a')", "true,false"),
8081 ("document.getElementById('t').classList.replace('nope','z')", "false"),
8082 (
8084 "var e=document.getElementById('t'); e.classList.toggle('force-on', true); e.classList.contains('force-on')",
8085 "true",
8086 ),
8087 (
8088 "var e=document.getElementById('t'); e.classList.add('force-off'); e.classList.toggle('force-off', false); e.classList.contains('force-off')",
8089 "false",
8090 ),
8091 (
8093 "var e=document.createElement('div'); e.classList.add('c1', 'c2', 'c3'); e.className",
8094 "c1 c2 c3",
8095 ),
8096 (
8097 "var e=document.createElement('div'); e.classList.add('c1', 'c2', 'c3'); e.classList.remove('c1', 'c3'); e.className",
8098 "c2",
8099 ),
8100 (
8101 "var e=document.createElement('div'); e.classList.supports('foo')",
8102 "false",
8103 ),
8104 (
8112 "var e=document.createElement('div'); e.id='wm'; e.webkitMatchesSelector('#wm')",
8113 "true",
8114 ),
8115 (
8116 "document.execCommand('copy')",
8117 "true",
8118 ),
8119 (
8122 "var e=document.createElement('div'); e.className='a b c'; var out=[]; for (const c of e.classList) out.push(c); out.join(',')",
8123 "a,b,c",
8124 ),
8125 (
8126 "var e=document.createElement('div'); e.className='x y'; [...e.classList].join(',')",
8127 "x,y",
8128 ),
8129 (
8130 "var e=document.createElement('div'); e.className='p q'; var out=''; e.classList.forEach(function(c,i){out+=i+':'+c+' '}); out.trim()",
8131 "0:p 1:q",
8132 ),
8133 (
8137 "var e=document.createElement('div'); e.className='r s'; var out=[]; for (const [i,c] of e.classList.entries()) out.push(i+':'+c); out.join(',')",
8138 "0:r,1:s",
8139 ),
8140 (
8141 "var e=document.createElement('div'); e.className='r s'; [...e.classList.keys()].join(',')",
8142 "0,1",
8143 ),
8144 (
8145 "var e=document.createElement('div'); e.className='r s'; [...e.classList.values()].join(',')",
8146 "r,s",
8147 ),
8148 ("[1,2,3].with(1, 'x').join(',')", "1,x,3"),
8151 ("[1,2,3].with(-1, 'x').join(',')", "1,2,x"),
8152 (
8153 "try { [1,2,3].with(5, 'x'); 'no-throw' } catch(e) { 'threw' }",
8154 "threw",
8155 ),
8156 (
8161 "var e=document.getElementById('t'); e.style.setProperty('color','red'); e.style.color",
8162 "red",
8163 ),
8164 (
8165 "var e=document.getElementById('t'); e.style.setProperty('--my-var','10px'); e.style.getPropertyValue('--my-var')",
8166 "10px",
8167 ),
8168 (
8169 "var e=document.getElementById('t'); e.style.setProperty('color','blue'); e.style.removeProperty('color'); e.style.color",
8170 "",
8171 ),
8172 (
8175 "var e=document.getElementById('t'); e.style.setProperty('color','red','important'); e.style.getPropertyPriority('color')",
8176 "important",
8177 ),
8178 (
8181 "var e=document.getElementById('t'); e.style.setProperty('color','red','important'); e.style.color",
8182 "red",
8183 ),
8184 (
8185 "var e=document.getElementById('t'); e.style.setProperty('color','red'); e.style.getPropertyPriority('color')",
8186 "",
8187 ),
8188 (
8192 "var e=document.getElementById('t'); e.style.cssText='color: red; font-size: 12px'; e.style.length",
8193 "2",
8194 ),
8195 (
8196 "var e=document.getElementById('t'); e.style.cssText='color: red; font-size: 12px'; \
8197 e.style.item(0)+','+e.style.item(1)",
8198 "color,font-size",
8199 ),
8200 ("document.getElementById('t').style.length", "0"),
8201 (
8204 "var e=document.getElementById('t'); e.style.cssFloat='left'; e.style.float",
8205 "left",
8206 ),
8207 (
8208 "var e=document.getElementById('t'); e.style.float='right'; e.style.cssFloat",
8209 "right",
8210 ),
8211 (
8214 "var e=document.getElementById('t'); e.style.cssText='color: red; font-size: 12px'; e.style.color+','+e.style.fontSize",
8215 "red,12px",
8216 ),
8217 (
8218 "var e=document.getElementById('t'); e.style.color='blue'; e.style.fontSize='10px'; e.style.cssText",
8219 "color: blue; font-size: 10px",
8220 ),
8221 (
8224 "var e=document.getElementById('t'); e.innerHTML='<b>bold</b>text'; e.innerHTML",
8225 "<b>bold</b>text",
8226 ),
8227 (
8228 "var e=document.getElementById('t'); e.innerHTML='hi'; e.outerHTML",
8229 "<p id=\"t\" class=\"a b\" data-k=\"v\">hi</p>",
8230 ),
8231 (
8235 "var e=document.getElementById('t'); e.innerHTML='a<b>x</b>'; e.childNodes.length+','+e.firstChild.nodeType+','+e.lastChild.nodeType",
8236 "2,3,1",
8237 ),
8238 (
8239 "var e=document.getElementById('t'); e.innerHTML='a<b>x</b>'; e.firstChild.nextSibling.nodeName",
8240 "B",
8241 ),
8242 (
8245 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.nodeValue",
8246 "hello",
8247 ),
8248 (
8249 "var e=document.getElementById('t'); e.innerHTML='hello'; e.nodeValue === null",
8250 "true",
8251 ),
8252 (
8253 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.nodeValue='bye'; e.textContent",
8254 "bye",
8255 ),
8256 (
8261 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.data",
8262 "hello",
8263 ),
8264 (
8265 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.length",
8266 "5",
8267 ),
8268 (
8269 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.data='world'; e.textContent",
8270 "world",
8271 ),
8272 (
8273 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.appendData(' world'); e.textContent",
8274 "hello world",
8275 ),
8276 (
8277 "var e=document.getElementById('t'); e.innerHTML='hello world'; e.firstChild.deleteData(5,6); e.textContent",
8278 "hello",
8279 ),
8280 (
8281 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.insertData(5,' world'); e.textContent",
8282 "hello world",
8283 ),
8284 (
8285 "var e=document.getElementById('t'); e.innerHTML='hello world'; e.firstChild.replaceData(6,5,'there'); e.textContent",
8286 "hello there",
8287 ),
8288 (
8289 "var e=document.getElementById('t'); e.innerHTML='hello world'; e.firstChild.substringData(6,5)",
8290 "world",
8291 ),
8292 (
8298 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8299 try { e.firstChild.deleteData(99,1); 'no-throw' } catch(e) { e.name }",
8300 "IndexSizeError",
8301 ),
8302 (
8303 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8304 try { e.firstChild.insertData(99,'x'); 'no-throw' } catch(e) { e.name }",
8305 "IndexSizeError",
8306 ),
8307 (
8308 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8309 try { e.firstChild.replaceData(99,1,'x'); 'no-throw' } catch(e) { e.name }",
8310 "IndexSizeError",
8311 ),
8312 (
8313 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8314 try { e.firstChild.substringData(99,1); 'no-throw' } catch(e) { e.name }",
8315 "IndexSizeError",
8316 ),
8317 (
8318 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8319 try { e.firstChild.splitText(99); 'no-throw' } catch(e) { e.name }",
8320 "IndexSizeError",
8321 ),
8322 (
8323 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8325 e.firstChild.insertData(2,'!'); e.textContent",
8326 "hi!",
8327 ),
8328 (
8332 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8333 var t1=e.firstChild; var t2=t1.splitText(5); t1.data+'|'+t2.data",
8334 "hello| world",
8335 ),
8336 (
8337 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8338 var t1=e.firstChild; t1.splitText(5); e.childNodes.length",
8339 "2",
8340 ),
8341 (
8342 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8343 var t1=e.firstChild; var t2=t1.splitText(5); t2.nextSibling===null && t2.previousSibling===t1",
8344 "true",
8345 ),
8346 (
8350 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8351 var t1=e.firstChild; var t2=t1.splitText(5); t1.wholeText+'|'+t2.wholeText",
8352 "hello world|hello world",
8353 ),
8354 (
8355 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.wholeText",
8356 "hello",
8357 ),
8358 (
8362 "var t=document.createElement('table'); \
8363 t.insertRow(); t.insertRow(); t.rows.length",
8364 "2",
8365 ),
8366 (
8367 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); r.insertCell(); \
8368 r.cells.length",
8369 "2",
8370 ),
8371 (
8372 "var t=document.createElement('table'); \
8373 var r0=t.insertRow(); var r1=t.insertRow(); var rmid=t.insertRow(1); \
8374 rmid===t.rows[1]",
8375 "true",
8376 ),
8377 (
8378 "var t=document.createElement('table'); t.insertRow(); t.insertRow(); t.deleteRow(0); \
8379 t.rows.length",
8380 "1",
8381 ),
8382 (
8383 "var t=document.createElement('table'); var r=t.insertRow(); \
8384 r.insertCell(); var mid=r.insertCell(); r.insertCell(); \
8385 mid===r.cells[1]",
8386 "true",
8387 ),
8388 (
8389 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); r.insertCell(); \
8390 r.deleteCell(0); r.cells.length",
8391 "1",
8392 ),
8393 (
8394 "var t=document.createElement('table'); t.insertRow(); var r=t.insertRow(); r.rowIndex",
8395 "1",
8396 ),
8397 (
8398 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); var c=r.insertCell(); c.cellIndex",
8399 "1",
8400 ),
8401 (
8407 "var t=document.createElement('table'); t.insertRow(); \
8408 try { t.insertRow(5); 'no-throw' } catch(e) { e.name }",
8409 "IndexSizeError",
8410 ),
8411 (
8412 "var t=document.createElement('table'); t.insertRow(); \
8413 try { t.deleteRow(5); 'no-throw' } catch(e) { e.name }",
8414 "IndexSizeError",
8415 ),
8416 (
8417 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); \
8418 try { r.insertCell(5); 'no-throw' } catch(e) { e.name }",
8419 "IndexSizeError",
8420 ),
8421 (
8422 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); \
8423 try { r.deleteCell(5); 'no-throw' } catch(e) { e.name }",
8424 "IndexSizeError",
8425 ),
8426 (
8427 "var t=document.createElement('table'); t.insertRow(); \
8430 t.insertRow(1); t.insertRow(-1); t.rows.length",
8431 "3",
8432 ),
8433 (
8439 "var t=document.createElement('table'); \
8440 var h=t.createTHead(); h.insertRow(); h.insertRow(); \
8441 var b=document.createElement('tbody'); t.appendChild(b); \
8442 b.insertRow(); var r=b.insertRow(); b.insertRow(); \
8443 r.rowIndex + ',' + r.sectionRowIndex",
8444 "3,1",
8445 ),
8446 (
8451 "var t=document.createElement('table'); var b=document.createElement('tbody'); \
8452 t.appendChild(b); b.insertRow(); b.insertRow(); b.rows.length",
8453 "2",
8454 ),
8455 (
8458 "var t=document.createElement('table'); t.insertRow(); var r=t.insertRow(); \
8459 r.rowIndex + ',' + r.sectionRowIndex",
8460 "1,1",
8461 ),
8462 ("document.createElement('table').tHead", "null"),
8467 (
8468 "var t=document.createElement('table'); var h=t.createTHead(); h===t.tHead && h.tagName",
8469 "THEAD",
8470 ),
8471 (
8472 "var t=document.createElement('table'); var h1=t.createTHead(); var h2=t.createTHead(); h1===h2",
8473 "true",
8474 ),
8475 (
8476 "var t=document.createElement('table'); t.createTHead(); t.deleteTHead(); t.tHead",
8477 "null",
8478 ),
8479 (
8480 "var t=document.createElement('table'); var f=t.createTFoot(); f===t.tFoot && f.tagName",
8481 "TFOOT",
8482 ),
8483 (
8484 "var t=document.createElement('table'); var c=t.createCaption(); c===t.caption && c.tagName",
8485 "CAPTION",
8486 ),
8487 (
8488 "var t=document.createElement('table'); t.appendChild(document.createElement('tbody')); \
8489 t.appendChild(document.createElement('tbody')); t.tBodies.length",
8490 "2",
8491 ),
8492 (
8494 "document.createElement('div').isConnected",
8495 "false",
8496 ),
8497 (
8498 "document.getElementById('t').isConnected",
8499 "true",
8500 ),
8501 (
8502 "var e=document.getElementById('t'); e.remove(); e.isConnected",
8503 "false",
8504 ),
8505 (
8509 "document.createElement('div').nodeType === Node.ELEMENT_NODE",
8510 "true",
8511 ),
8512 ("Node.TEXT_NODE", "3"),
8513 ("Node.COMMENT_NODE", "8"),
8514 ("var c=document.createComment('test'); c.nodeType", "8"),
8515 ("var c=document.createComment('test'); c.nodeName", "#comment"),
8516 ("var c=document.createComment('test'); c.nodeValue", "test"),
8517 ("var c=document.createComment('test'); c.data", "test"),
8518 ("var c=document.createComment('test'); c.length", "4"),
8519 ("var c=document.createComment('test'); c.nodeValue='new'; c.nodeValue", "new"),
8520 ("var c=document.createComment('test'); c.data='new'; c.data", "new"),
8521 ("var c=document.createComment('test'); c.textContent", "test"),
8522 ("var c=document.createComment('test'); c.textContent='new'; c.textContent", "new"),
8523 (
8524 "var d=document.createElement('div'); var c=document.createComment('foo'); d.appendChild(c); d.innerHTML",
8525 "<!--foo-->",
8526 ),
8527 (
8528 "var t=document.getElementById('t'); var s=document.createElement('style'); s.textContent='div { color: red; }'; t.appendChild(s); var sheet=document.styleSheets[0]; sheet.cssRules.length",
8529 "1",
8530 ),
8531 (
8532 "var t=document.getElementById('t'); var s=document.createElement('style'); s.textContent='div { color: red; }'; t.appendChild(s); var sheet=document.styleSheets[0]; sheet.cssRules[0].cssText",
8533 "div { color: red; }",
8534 ),
8535 (
8536 "var t=document.getElementById('t'); var s=document.createElement('style'); s.textContent='div { color: red; }'; t.appendChild(s); var sheet=document.styleSheets[0]; sheet.cssRules[0].selectorText",
8537 "div",
8538 ),
8539 (
8540 "var t=document.getElementById('t'); var s=document.createElement('style'); s.textContent='div { color: red; }'; t.appendChild(s); var sheet=document.styleSheets[0]; sheet.insertRule('span { color: blue; }', 1); sheet.cssRules.length",
8541 "2",
8542 ),
8543 (
8544 "var t=document.getElementById('t'); var s=document.createElement('style'); s.textContent='div { color: red; }'; t.appendChild(s); var sheet=document.styleSheets[0]; sheet.insertRule('span { color: blue; }', 1); sheet.cssRules[1].cssText",
8545 "span { color: blue; }",
8546 ),
8547 (
8548 "var t=document.getElementById('t'); var s=document.createElement('style'); s.textContent='div { color: red; }'; t.appendChild(s); var sheet=document.styleSheets[0]; sheet.insertRule('span { color: blue; }', 1); sheet.deleteRule(0); sheet.cssRules.length",
8549 "1",
8550 ),
8551 (
8552 "var t=document.getElementById('t'); var s=document.createElement('style'); s.textContent='div { color: red; }'; t.appendChild(s); var sheet=document.styleSheets[0]; sheet.insertRule('span { color: blue; }', 1); sheet.deleteRule(0); sheet.cssRules[0].cssText",
8553 "span { color: blue; }",
8554 ),
8555 ("document.title = 'Hello'; document.title", "Hello"),
8560 (
8563 "var e=document.createElement('p'); e.lang='ja'; e.lang",
8564 "ja",
8565 ),
8566 (
8567 "var e=document.createElement('p'); e.dir='rtl'; e.dir",
8568 "rtl",
8569 ),
8570 (
8571 "var e=document.createElement('p'); e.setAttribute('lang','fr'); e.lang",
8572 "fr",
8573 ),
8574 (
8579 "var e=document.createElement('p'); e.title='tip'; e.title",
8580 "tip",
8581 ),
8582 (
8583 "var e=document.createElement('p'); e.setAttribute('title','x'); e.title",
8584 "x",
8585 ),
8586 (
8587 "var e=document.createElement('p'); e.accessKey='k'; e.getAttribute('accesskey')",
8588 "k",
8589 ),
8590 ("document.createElement('p').translate", "true"),
8592 (
8593 "var e=document.createElement('p'); e.setAttribute('translate','no'); e.translate",
8594 "false",
8595 ),
8596 (
8597 "var e=document.createElement('p'); e.translate=false; e.getAttribute('translate')",
8598 "no",
8599 ),
8600 ("document.createElement('div').draggable", "false"),
8603 (
8604 "var e=document.createElement('div'); e.draggable=true; e.getAttribute('draggable')",
8605 "true",
8606 ),
8607 (
8608 "var e=document.createElement('div'); e.setAttribute('draggable','true'); e.draggable",
8609 "true",
8610 ),
8611 (
8614 "var e=document.createElement('div'); e.slot='header'; e.getAttribute('slot')",
8615 "header",
8616 ),
8617 (
8620 "document.createElement('div') instanceof HTMLDivElement",
8621 "true",
8622 ),
8623 (
8624 "document.createElement('div') instanceof HTMLElement",
8625 "true",
8626 ),
8627 (
8628 "document.createElement('div') instanceof Element",
8629 "true",
8630 ),
8631 (
8632 "document.createElement('div') instanceof Node",
8633 "true",
8634 ),
8635 (
8636 "document.createElement('div') instanceof HTMLInputElement",
8637 "false",
8638 ),
8639 (
8640 "document.createElement('input') instanceof HTMLInputElement",
8641 "true",
8642 ),
8643 (
8644 "document.createElement('input') instanceof HTMLElement",
8645 "true",
8646 ),
8647 (
8648 "document.createElement('form') instanceof HTMLFormElement",
8649 "true",
8650 ),
8651 (
8652 "document.createElement('div').constructor === HTMLDivElement",
8653 "true",
8654 ),
8655 (
8656 "try { new Node(); false; } catch(e) { e instanceof TypeError }",
8657 "true",
8658 ),
8659 (
8660 "try { new HTMLElement(); false; } catch(e) { e instanceof TypeError }",
8661 "true",
8662 ),
8663 (
8664 "var e=document.createElement('div'); e.setAttribute('slot','footer'); e.slot",
8665 "footer",
8666 ),
8667 (
8670 "document.createElement('div').tabIndex",
8671 "-1",
8672 ),
8673 (
8674 "var e=document.createElement('div'); e.tabIndex=3; e.tabIndex",
8675 "3",
8676 ),
8677 (
8678 "var e=document.createElement('div'); e.tabIndex=2; e.getAttribute('tabindex')",
8679 "2",
8680 ),
8681 (
8684 "var e=document.createElement('div'); e.hidden=true; e.hidden",
8685 "true",
8686 ),
8687 (
8688 "var e=document.createElement('div'); e.hidden=true; e.hasAttribute('hidden')",
8689 "true",
8690 ),
8691 (
8692 "var e=document.createElement('div'); e.hidden=true; e.hidden=false; e.hidden",
8693 "false",
8694 ),
8695 (
8698 "var f=document.createElement('form'); f.noValidate=true; f.noValidate",
8699 "true",
8700 ),
8701 (
8702 "var f=document.createElement('form'); f.noValidate=true; f.hasAttribute('novalidate')",
8703 "true",
8704 ),
8705 (
8706 "document.createElement('form').noValidate",
8707 "false",
8708 ),
8709 (
8712 "var f=document.createElement('form'); var i=document.createElement('input'); f.appendChild(i); f.elements.length",
8713 "1",
8714 ),
8715 (
8716 "var f=document.createElement('form'); var i=document.createElement('input'); i.name='x'; f.appendChild(i); f.elements[0].name",
8717 "x",
8718 ),
8719 (
8723 "var f=document.createElement('form'); var i=document.createElement('input'); \
8724 var s=document.createElement('select'); f.appendChild(i); f.appendChild(s); \
8725 f.length + ',' + f.elements.length",
8726 "2,2",
8727 ),
8728 (
8729 "document.createElement('form').length",
8730 "0",
8731 ),
8732 (
8736 "var fs=document.createElement('fieldset'); var i=document.createElement('input'); \
8737 fs.appendChild(i); fs.elements.length",
8738 "1",
8739 ),
8740 (
8741 "document.createElement('fieldset').elements.length",
8742 "0",
8743 ),
8744 ("document.createElement('fieldset').type", "fieldset"),
8748 (
8749 "var fs=document.createElement('fieldset'); fs.setAttribute('type','x'); fs.type",
8750 "fieldset",
8751 ),
8752 ("document.createElement('select').type", "select-one"),
8757 (
8758 "var s=document.createElement('select'); s.multiple=true; s.type",
8759 "select-multiple",
8760 ),
8761 ("document.createElement('button').type", "submit"),
8766 ("document.createElement('textarea').type", "textarea"),
8770 (
8771 "var b=document.createElement('button'); b.setAttribute('type','reset'); b.type",
8772 "reset",
8773 ),
8774 (
8775 "var b=document.createElement('button'); b.setAttribute('type','button'); b.type",
8776 "button",
8777 ),
8778 (
8779 "var b=document.createElement('button'); b.setAttribute('type','bogus'); b.type",
8780 "submit",
8781 ),
8782 ("document.createElement('input').type", "text"),
8788 (
8789 "var i=document.createElement('input'); i.setAttribute('type','checkbox'); i.type",
8790 "checkbox",
8791 ),
8792 (
8793 "var i=document.createElement('input'); i.setAttribute('type','DATE'); i.type",
8794 "date",
8795 ),
8796 (
8797 "var i=document.createElement('input'); i.setAttribute('type','bogus'); i.type",
8798 "text",
8799 ),
8800 (
8808 "var f=document.createElement('form'); f.id='ff'; var i=document.createElement('input'); f.appendChild(i); i.form.id",
8809 "ff",
8810 ),
8811 (
8812 "document.createElement('input').form === null",
8813 "true",
8814 ),
8815 (
8818 "var i=document.createElement('input'); i.id='u'; var l=document.createElement('label'); l.setAttribute('for','u'); i.labels.length",
8819 "1",
8820 ),
8821 (
8822 "var l=document.createElement('label'); var i=document.createElement('input'); l.appendChild(i); i.labels.length",
8823 "1",
8824 ),
8825 (
8826 "document.createElement('input').labels.length",
8827 "0",
8828 ),
8829 (
8831 "var i=document.createElement('input'); i.id='v'; var l=document.createElement('label'); l.setAttribute('for','v'); l.control.id",
8832 "v",
8833 ),
8834 (
8835 "var l=document.createElement('label'); var i=document.createElement('input'); i.name='y'; l.appendChild(i); l.control.name",
8836 "y",
8837 ),
8838 (
8839 "document.createElement('label').control === null",
8840 "true",
8841 ),
8842 (
8845 "var w=document.getElementById('wrap'); var t=document.getElementById('t'); w.contains(t)+','+t.contains(w)+','+t.contains(t)",
8846 "true,false,true",
8847 ),
8848 (
8851 "var t=document.getElementById('t'); t.compareDocumentPosition(t)",
8852 "0",
8853 ),
8854 (
8855 "var w=document.getElementById('wrap'); var t=document.getElementById('t'); t.compareDocumentPosition(w)",
8856 "10",
8857 ),
8858 (
8859 "var w=document.getElementById('wrap'); var t=document.getElementById('t'); w.compareDocumentPosition(t)",
8860 "20",
8861 ),
8862 (
8863 "var t=document.getElementById('t'); var s=document.getElementById('s'); t.compareDocumentPosition(s)",
8864 "4",
8865 ),
8866 (
8867 "var t=document.getElementById('t'); var s=document.getElementById('s'); s.compareDocumentPosition(t)",
8868 "2",
8869 ),
8870 (
8874 "var e=document.getElementById('t'); var clicked=false; e.addEventListener('click', function(){ clicked=true; }); e.click(); clicked",
8875 "true",
8876 ),
8877 ("document.scrollingElement.tagName", "HTML"),
8880 ("document.scrollingElement === document.documentElement", "true"),
8881 (
8885 "document.getElementById('t').focus(); document.activeElement.id",
8886 "t",
8887 ),
8888 (
8889 "document.getElementById('t').focus(); document.getElementById('t') === document.activeElement",
8890 "true",
8891 ),
8892 (
8893 "document.getElementById('t').focus(); document.getElementById('s').focus(); document.activeElement.id",
8894 "s",
8895 ),
8896 (
8897 "document.getElementById('t').focus(); document.getElementById('t').blur(); \
8898 document.getElementById('t') === document.activeElement",
8899 "false",
8900 ),
8901 (
8902 "var log=''; document.getElementById('t').addEventListener('focus', ()=>log+='f'); \
8903 document.getElementById('t').addEventListener('blur', ()=>log+='b'); \
8904 document.getElementById('t').focus(); document.getElementById('s').focus(); log",
8905 "fb",
8906 ),
8907 (
8908 "var n=0; document.getElementById('t').addEventListener('focus', ()=>n++); \
8909 document.getElementById('t').focus(); document.getElementById('t').focus(); n",
8910 "1",
8911 ),
8912 ];
8913 total += dom2_cases.len();
8914 for (src, expect) in dom2_cases {
8915 let mut rt = JsRuntime::new();
8916 rt.dom
8917 .borrow_mut()
8918 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
8919 match rt.eval(src) {
8920 Ok(v) if &v.to_js_string() == expect => passed += 1,
8921 Ok(v) => crate::println!(
8922 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
8923 src,
8924 v.to_js_string(),
8925 expect
8926 ),
8927 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
8928 }
8929 }
8930 let ev_html = "<div id='outer'><div id='mid'><button id='btn'>go</button></div></div>";
8937 let event_cases: &[(&str, &str)] = &[
8938 ("var n=0; var b=document.getElementById('btn'); b.addEventListener('click', function(){ n++; }); b.dispatchEvent({type:'click'}); n", "1"),
8940 ("var s=''; var b=document.getElementById('btn'); b.addEventListener('click', ()=>s+='a'); b.addEventListener('click', ()=>s+='b'); b.dispatchEvent({type:'click'}); s", "ab"),
8942 ("var n=0; var f=()=>n++; var b=document.getElementById('btn'); b.addEventListener('click', f); b.removeEventListener('click', f); b.dispatchEvent({type:'click'}); n", "0"),
8944 ("var s=''; document.getElementById('outer').addEventListener('click', ()=>s+='O'); document.getElementById('mid').addEventListener('click', ()=>s+='M'); document.getElementById('btn').addEventListener('click', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "BMO"),
8946 ("var t=''; document.getElementById('outer').addEventListener('click', function(e){ t = e.target.id + '/' + e.currentTarget.id; }); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); t", "btn/outer"),
8948 ("var s=''; document.getElementById('outer').addEventListener('click', ()=>s+='O'); document.getElementById('btn').addEventListener('click', function(e){ s+='B'; e.stopPropagation(); }); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "B"),
8950 ("var s=''; var b=document.getElementById('btn'); b.addEventListener('click', function(e){ s+='1'; e.stopImmediatePropagation(); }); b.addEventListener('click', ()=>s+='2'); b.dispatchEvent({type:'click'}); s", "1"),
8952 ("var b=document.getElementById('btn'); b.addEventListener('click', e=>e.preventDefault()); b.dispatchEvent({type:'click'})", "false"),
8954 ("var b=document.getElementById('btn'); b.addEventListener('click', ()=>{}); b.dispatchEvent({type:'click'})", "true"),
8956 ("var d=false; var b=document.getElementById('btn'); b.addEventListener('click', function(e){ e.preventDefault(); d=e.defaultPrevented; }); b.dispatchEvent({type:'click'}); d", "true"),
8958 ("var n=0; var b=document.getElementById('btn'); b.addEventListener('click', ()=>n++, {once:true}); b.dispatchEvent({type:'click'}); b.dispatchEvent({type:'click'}); n", "1"),
8960 ("var s=''; document.getElementById('outer').addEventListener('click', ()=>s+='C', true); document.getElementById('btn').addEventListener('click', ()=>s+='T'); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "CT"),
8962 ("var ty=''; var b=document.getElementById('btn'); b.addEventListener('custom', function(e){ ty=e.type; }); b.dispatchEvent({type:'custom'}); ty", "custom"),
8964 ("var d=0; var b=document.getElementById('btn'); b.addEventListener('ping', function(e){ d=e.detail; }); b.dispatchEvent({type:'ping', detail:7}); d", "7"),
8966 ("var n=0; var b=document.getElementById('btn'); b.addEventListener('mouseover', ()=>n++); b.dispatchEvent({type:'click'}); n", "0"),
8968 ("var s=''; document.getElementById('outer').addEventListener('foo', ()=>s+='O'); document.getElementById('btn').addEventListener('foo', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'foo'}); s", "BO"),
8971 ("var s=''; document.addEventListener('click', ()=>s+='D'); document.getElementById('btn').addEventListener('click', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "BD"),
8977 ("var s=''; document.addEventListener('click', ()=>s+='D'); document.getElementById('btn').addEventListener('click', function(e){ s+='B'; e.stopPropagation(); }); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "B"),
8979 ("var n=0; var f=()=>n++; document.addEventListener('click', f); document.removeEventListener('click', f); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); n", "0"),
8981 ("var r=''; document.addEventListener('click', function(e){ r = e.target.id + '/' + (e.currentTarget === document); }); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); r", "btn/true"),
8983 ("var n=0; document.addEventListener('click', ()=>n++); document.dispatchEvent(new Event('click')); n", "1"),
8986 ("var s=''; document.addEventListener('click', ()=>s+='D', true); document.getElementById('outer').addEventListener('click', ()=>s+='O', true); document.getElementById('btn').addEventListener('click', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "DOB"),
8995 ("var s=''; document.addEventListener('click', ()=>s+='C', true); document.addEventListener('click', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "CB"),
8997 ];
8998 total += event_cases.len();
8999 for (src, expect) in event_cases {
9000 let mut rt = JsRuntime::new();
9001 rt.dom
9002 .borrow_mut()
9003 .build_from(&crate::os_lib::dom::parse_html(ev_html));
9004 match rt.eval(src) {
9005 Ok(v) if &v.to_js_string() == expect => passed += 1,
9006 Ok(v) => crate::println!(
9007 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9008 src,
9009 v.to_js_string(),
9010 expect
9011 ),
9012 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9013 }
9014 }
9015
9016 {
9018 let fd_html = "<form id='f'>\
9019 <input name='user' value='alice'>\
9020 <input name='nope'>\
9021 <input type='checkbox' name='agree' value='yes' checked>\
9022 <input type='checkbox' name='news' value='1'>\
9023 <input type='radio' name='plan' value='free'>\
9024 <input type='radio' name='plan' value='pro' checked>\
9025 <input type='submit' name='btn' value='go'>\
9026 <select name='color' value='green'><option value='red'>R</option><option value='green'>G</option></select>\
9027 <textarea name='bio'>hello</textarea>\
9028 </form>";
9029 let fd_cases: &[(&str, &str)] = &[
9030 (
9033 "new FormData(document.getElementById('f')).get('user')",
9034 "alice",
9035 ),
9036 (
9037 "new FormData(document.getElementById('f')).get('agree')",
9038 "yes",
9039 ),
9040 (
9041 "new FormData(document.getElementById('f')).get('plan')",
9042 "pro",
9043 ),
9044 (
9045 "var f=new FormData(document.getElementById('f')); f.has('news')+','+f.has('btn')",
9046 "false,false",
9047 ),
9048 ];
9049 total += fd_cases.len();
9050 for (src, expect) in fd_cases {
9051 let mut rt = JsRuntime::new();
9052 rt.dom
9053 .borrow_mut()
9054 .build_from(&crate::os_lib::dom::parse_html(fd_html));
9055 match rt.eval(src) {
9056 Ok(v) if &v.to_js_string() == expect => passed += 1,
9057 Ok(v) => crate::println!(
9058 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9059 src,
9060 v.to_js_string(),
9061 expect
9062 ),
9063 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9064 }
9065 }
9066 }
9067 {
9068 let fd2_html = "<form id='f6'>\
9074 <input name='inside' value='a'>\
9075 <fieldset disabled><input name='hidden_by_fieldset' value='b'></fieldset>\
9076 </form>\
9077 <input name='outside' form='f6' value='c'>\
9078 <input name='not_associated' value='d'>";
9079 let fd2_cases: &[(&str, &str)] = &[
9080 (
9081 "new FormData(document.getElementById('f6')).get('inside')",
9082 "a",
9083 ),
9084 (
9085 "new FormData(document.getElementById('f6')).get('outside')",
9086 "c",
9087 ),
9088 (
9089 "var f=new FormData(document.getElementById('f6')); f.has('hidden_by_fieldset')",
9090 "false",
9091 ),
9092 (
9093 "var f=new FormData(document.getElementById('f6')); f.has('not_associated')",
9094 "false",
9095 ),
9096 (
9100 "document.getElementById('f6').elements.length",
9101 "3",
9102 ),
9103 ];
9104 total += fd2_cases.len();
9105 for (src, expect) in fd2_cases {
9106 let mut rt = JsRuntime::new();
9107 rt.dom
9108 .borrow_mut()
9109 .build_from(&crate::os_lib::dom::parse_html(fd2_html));
9110 match rt.eval(src) {
9111 Ok(v) if &v.to_js_string() == expect => passed += 1,
9112 Ok(v) => crate::println!(
9113 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9114 src,
9115 v.to_js_string(),
9116 expect
9117 ),
9118 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9119 }
9120 }
9121 }
9122 {
9126 let sm_html = "<form id='f2'>\
9127 <select name='tags' multiple>\
9128 <option value='a' selected>A</option>\
9129 <option value='b'>B</option>\
9130 <option value='c' selected>C</option>\
9131 </select>\
9132 </form>";
9133 let sm_cases: &[(&str, &str)] = &[
9134 (
9135 "new FormData(document.getElementById('f2')).getAll('tags').join(',')",
9136 "a,c",
9137 ),
9138 (
9139 "document.querySelector('select').selectedOptions.length",
9140 "2",
9141 ),
9142 (
9143 "Array.from(document.querySelector('select').selectedOptions).map(o => o.value).join(',')",
9144 "a,c",
9145 ),
9146 (
9149 "document.querySelector('select').options.length",
9150 "3",
9151 ),
9152 (
9153 "Array.from(document.querySelector('select').options).map(o => o.value).join(',')",
9154 "a,b,c",
9155 ),
9156 (
9159 "var s=document.querySelector('select'); \
9160 var o=new Option('D','d'); o.id='optd'; s.options.add(o); \
9161 s.options.length + ':' + s.options[3].value",
9162 "4:d",
9163 ),
9164 (
9165 "var s=document.querySelector('select'); s.options.remove(1); \
9166 Array.from(s.options).map(o => o.value).join(',')",
9167 "a,c",
9168 ),
9169 (
9170 "document.querySelector('select').options.namedItem('nope')",
9171 "null",
9172 ),
9173 (
9174 "var s=document.querySelector('select'); s.options.item(0).value",
9175 "a",
9176 ),
9177 (
9178 "var s=document.querySelector('select'); s.options.selectedIndex=1; s.selectedIndex",
9179 "1",
9180 ),
9181 (
9182 "var s=document.querySelector('select'); s.selectedIndex=2; s.options.selectedIndex",
9183 "2",
9184 ),
9185 ];
9186 total += sm_cases.len();
9187 for (src, expect) in sm_cases {
9188 let mut rt = JsRuntime::new();
9189 rt.dom
9190 .borrow_mut()
9191 .build_from(&crate::os_lib::dom::parse_html(sm_html));
9192 match rt.eval(src) {
9193 Ok(v) if &v.to_js_string() == expect => passed += 1,
9194 Ok(v) => crate::println!(
9195 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9196 src,
9197 v.to_js_string(),
9198 expect
9199 ),
9200 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9201 }
9202 }
9203 }
9204 let og_html = "<form id='f3'><select name='fruit'><optgroup label='Citrus'><option value='lemon'>Lemon</option><option value='lime' selected>Lime</option></optgroup><optgroup label='Berries'><option value='straw'>Strawberry</option></optgroup></select></form>";
9215 let og_cases: &[(&str, &str)] = &[
9216 (
9217 "document.querySelector('select').options.length",
9218 "3",
9219 ),
9220 (
9221 "Array.from(document.querySelector('select').options).map(o => o.value).join(',')",
9222 "lemon,lime,straw",
9223 ),
9224 (
9225 "document.querySelector('select').selectedOptions.length",
9226 "1",
9227 ),
9228 (
9229 "document.querySelector('select').value",
9230 "lime",
9231 ),
9232 ];
9233 total += og_cases.len();
9234 {
9235 for (src, expect) in og_cases {
9236 let mut rt = JsRuntime::new();
9237 rt.dom
9238 .borrow_mut()
9239 .build_from(&crate::os_lib::dom::parse_html(og_html));
9240 match rt.eval(src) {
9241 Ok(v) if &v.to_js_string() == expect => passed += 1,
9242 Ok(v) => crate::println!(
9243 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9244 src,
9245 v.to_js_string(),
9246 expect
9247 ),
9248 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9249 }
9250 }
9251 }
9252 {
9255 let title_cases: &[(&str, &str, &str)] = &[
9256 (
9258 "<html><head><title>old</title></head><body></body></html>",
9259 "document.title",
9260 "old",
9261 ),
9262 (
9263 "<html><head><title>old</title></head><body></body></html>",
9264 "document.title='new'; document.querySelector('title').textContent",
9265 "new",
9266 ),
9267 (
9269 "<html><head></head><body></body></html>",
9270 "document.title='created'; document.querySelector('title').textContent",
9271 "created",
9272 ),
9273 ];
9274 total += title_cases.len();
9275 for (html, src, expect) in title_cases {
9276 let mut rt = JsRuntime::new();
9277 rt.dom
9278 .borrow_mut()
9279 .build_from(&crate::os_lib::dom::parse_html(html));
9280 match rt.eval(src) {
9281 Ok(v) if &v.to_js_string() == expect => passed += 1,
9282 Ok(v) => crate::println!(
9283 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9284 src,
9285 v.to_js_string(),
9286 expect
9287 ),
9288 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9289 }
9290 }
9291 }
9292 {
9295 let coll_html = "<html><body>\
9296 <form id='f1'></form><form id='f2'></form>\
9297 <img src='a.png'><img src='b.png'><img src='c.png'>\
9298 <script>1</script>\
9299 <a href='x.html'>x</a><a name='top'>anchor</a>\
9300 <area href='y.html' alt='y'>\
9301 <embed src='z.swf'>\
9302 </body></html>";
9303 let coll_cases: &[(&str, &str)] = &[
9304 ("document.forms.length", "2"),
9305 ("document.images.length", "3"),
9306 ("document.scripts.length", "1"),
9307 ("document.links.length", "2"),
9310 ("document.anchors.length", "1"),
9312 ("document.embeds.length", "1"),
9316 ("document.plugins.length", "1"),
9317 ("document.applets.length", "0"),
9318 ];
9319 total += coll_cases.len();
9320 for (src, expect) in coll_cases {
9321 let mut rt = JsRuntime::new();
9322 rt.dom
9323 .borrow_mut()
9324 .build_from(&crate::os_lib::dom::parse_html(coll_html));
9325 match rt.eval(src) {
9326 Ok(v) if &v.to_js_string() == expect => passed += 1,
9327 Ok(v) => crate::println!(
9328 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9329 src,
9330 v.to_js_string(),
9331 expect
9332 ),
9333 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9334 }
9335 }
9336 }
9337 {
9339 let rect_checks: &[(&str, &str)] = &[
9340 (
9341 "document.getElementById('t').getBoundingClientRect().width",
9342 "30",
9343 ),
9344 (
9345 "document.getElementById('t').getBoundingClientRect().height",
9346 "40",
9347 ),
9348 (
9349 "document.getElementById('t').getBoundingClientRect().left",
9350 "10",
9351 ),
9352 (
9353 "document.getElementById('t').getBoundingClientRect().bottom",
9354 "60",
9355 ),
9356 ("document.getElementById('t').offsetWidth", "30"),
9357 ("document.getElementById('t').offsetTop", "20"),
9358 ("document.getElementById('t').clientWidth", "22"),
9360 ("document.getElementById('t').clientHeight", "34"),
9362 ("document.getElementById('t').clientLeft", "5"),
9364 ("document.getElementById('t').clientTop", "2"),
9366 ("document.getElementById('t').getClientRects().length", "1"),
9370 (
9371 "document.getElementById('t').getClientRects()[0].width",
9372 "30",
9373 ),
9374 ("document.getElementById('s').getClientRects().length", "0"),
9376 (
9379 "document.getElementById('t').offsetParent",
9380 "null",
9381 ),
9382 (
9383 "document.getElementById('wrap').style.position='relative'; \
9384 document.getElementById('t').offsetParent.id",
9385 "wrap",
9386 ),
9387 ];
9388 total += rect_checks.len();
9389 for (src, expect) in rect_checks {
9390 let mut rt = JsRuntime::new();
9391 rt.dom
9392 .borrow_mut()
9393 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9394 let idx = rt.dom.borrow().get_element_by_id("t");
9396 if let Some(i) = idx {
9397 rt.dom.borrow_mut().set_rect(i, 10, 20, 30, 40);
9398 rt.dom.borrow_mut().set_border_widths(i, 2, 3, 4, 5); }
9400 match rt.eval(src) {
9401 Ok(v) if &v.to_js_string() == expect => passed += 1,
9402 Ok(v) => crate::println!(
9403 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9404 src,
9405 v.to_js_string(),
9406 expect
9407 ),
9408 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9409 }
9410 }
9411 }
9412
9413 {
9417 let point_checks: &[(&str, &str)] = &[
9418 ("document.elementFromPoint(20, 15).id", "t"),
9419 ("document.elementFromPoint(5, 5).id", "wrap"),
9420 ("document.elementFromPoint(500, 500)", "null"),
9421 (
9422 "document.elementsFromPoint(20, 15).map(e => e.id).join(',')",
9423 "t,wrap",
9424 ),
9425 ];
9426 total += point_checks.len();
9427 for (src, expect) in point_checks {
9428 let mut rt = JsRuntime::new();
9429 rt.dom
9430 .borrow_mut()
9431 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9432 let wrap_idx = rt.dom.borrow().get_element_by_id("wrap");
9435 if let Some(i) = wrap_idx {
9436 rt.dom.borrow_mut().set_rect(i, 0, 0, 100, 100);
9437 }
9438 let t_idx = rt.dom.borrow().get_element_by_id("t");
9439 if let Some(i) = t_idx {
9440 rt.dom.borrow_mut().set_rect(i, 10, 10, 30, 20);
9441 }
9442 match rt.eval(src) {
9443 Ok(v) if &v.to_js_string() == expect => passed += 1,
9444 Ok(v) => crate::println!(
9445 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9446 src,
9447 v.to_js_string(),
9448 expect
9449 ),
9450 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9451 }
9452 }
9453 }
9454
9455 {
9457 let cs_checks: &[(&str, &str)] = &[
9458 ("getComputedStyle(document.getElementById('t')).color", "red"),
9459 ("getComputedStyle(document.getElementById('t')).backgroundColor", "blue"),
9460 ("getComputedStyle(document.getElementById('t')).getPropertyValue('background-color')", "blue"),
9461 ("window.getComputedStyle(document.getElementById('t')).fontSize", "16px"),
9462 ];
9463 total += cs_checks.len();
9464 for (src, expect) in cs_checks {
9465 let mut rt = JsRuntime::new();
9466 rt.dom
9467 .borrow_mut()
9468 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9469 let idx = rt.dom.borrow().get_element_by_id("t");
9470 if let Some(i) = idx {
9471 let mut d = rt.dom.borrow_mut();
9472 d.set_computed_style(i, "color", "red");
9473 d.set_computed_style(i, "background-color", "blue");
9474 d.set_computed_style(i, "font-size", "16px");
9475 }
9476 match rt.eval(src) {
9477 Ok(v) if &v.to_js_string() == expect => passed += 1,
9478 Ok(v) => crate::println!(
9479 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9480 src,
9481 v.to_js_string(),
9482 expect
9483 ),
9484 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9485 }
9486 }
9487 }
9488
9489 {
9491 let cv_checks: &[(&str, &str, &[(&str, &str, &str)])] = &[
9492 (
9493 "document.getElementById('t').checkVisibility()",
9494 "true",
9495 &[],
9496 ),
9497 (
9498 "document.getElementById('t').checkVisibility()",
9499 "false",
9500 &[("t", "display", "none")],
9501 ),
9502 (
9503 "document.getElementById('t').checkVisibility()",
9504 "false",
9505 &[("wrap", "display", "none")],
9506 ),
9507 (
9508 "document.getElementById('t').checkVisibility()",
9509 "false",
9510 &[("t", "visibility", "hidden")],
9511 ),
9512 ];
9513 total += cv_checks.len();
9514 for (src, expect, styles) in cv_checks {
9515 let mut rt = JsRuntime::new();
9516 rt.dom
9517 .borrow_mut()
9518 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9519 for (id, prop, val) in *styles {
9520 let idx = rt.dom.borrow().get_element_by_id(id);
9521 if let Some(i) = idx {
9522 rt.dom.borrow_mut().set_computed_style(i, prop, val);
9523 }
9524 }
9525 match rt.eval(src) {
9526 Ok(v) if &v.to_js_string() == expect => passed += 1,
9527 Ok(v) => crate::println!(
9528 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9529 src,
9530 v.to_js_string(),
9531 expect
9532 ),
9533 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9534 }
9535 }
9536 }
9537
9538 {
9540 total += 1;
9541 let mut rt = JsRuntime::new();
9542 rt.dom
9543 .borrow_mut()
9544 .build_from(&crate::os_lib::dom::parse_html(dom_html));
9545 let _ = rt.eval("var clicks=0; document.getElementById('b').addEventListener('click', () => { clicks++; document.getElementById('out').textContent = 'clicked ' + clicks; });");
9546 let bidx = rt.dom.borrow().get_element_by_id("b");
9547 if let Some(i) = bidx {
9548 rt.dispatch_click(i);
9549 rt.dispatch_click(i);
9550 }
9551 match rt.eval("clicks + ':' + document.getElementById('out').textContent") {
9552 Ok(v) if v.to_js_string() == "2:clicked 2" => passed += 1,
9553 Ok(v) => crate::println!(
9554 "JS_SELFTEST FAIL: click dispatch => `{}` (want `2:clicked 2`)",
9555 v.to_js_string()
9556 ),
9557 Err(e) => crate::println!("JS_SELFTEST ERR: click dispatch => {}", e),
9558 }
9559 }
9560
9561 let event_html = "<div id='par'><button id='btn'>go</button></div>";
9563 let event_checks: &[(&str, &str, &str)] = &[
9564 ("var L=''; document.getElementById('par').addEventListener('click', function(e){ L += 'par('+e.target.id+','+e.currentTarget.id+')'; });",
9566 "L", "par(btn,par)"),
9567 ("var L=''; document.getElementById('btn').addEventListener('click', function(){ L+='btn'; }); document.getElementById('par').addEventListener('click', function(){ L+='-par'; });",
9569 "L", "btn-par"),
9570 ("var L=''; document.getElementById('btn').addEventListener('click', function(e){ L+='btn'; e.stopPropagation(); }); document.getElementById('par').addEventListener('click', function(){ L+='-par'; });",
9572 "L", "btn"),
9573 ("var L=''; document.getElementById('btn').addEventListener('click', function(e){ e.preventDefault(); L += e.defaultPrevented; });",
9575 "L", "true"),
9576 ("var L=''; document.getElementById('btn').addEventListener('click', function(e){ L+='1'; e.stopImmediatePropagation(); }); document.getElementById('btn').addEventListener('click', function(){ L+='2'; });",
9578 "L", "1"),
9579 ("var L=''; document.getElementById('par').addEventListener('click', function(){ L+='cap'; }, true); document.getElementById('btn').addEventListener('click', function(){ L+='-tgt'; }); document.getElementById('par').addEventListener('click', function(){ L+='-bub'; });",
9581 "L", "cap-tgt-bub"),
9582 ("var P=''; document.getElementById('par').addEventListener('click', function(e){ P+=e.eventPhase; }, true); document.getElementById('btn').addEventListener('click', function(e){ P+=e.eventPhase; }); document.getElementById('par').addEventListener('click', function(e){ P+=e.eventPhase; });",
9584 "P", "123"),
9585 ("var N=0; document.getElementById('btn').addEventListener('click', function(){ N++; }, {once:true}); N",
9587 "N", "1"),
9588 ("var L=''; function h(){ L+='x'; } document.getElementById('btn').addEventListener('click', h); document.getElementById('btn').removeEventListener('click', h);",
9590 "L", ""),
9591 ("var C=''; document.getElementById('btn').addEventListener('click', function(e){ var p=e.composedPath(); C=p[0].id+','+p[1].id; });",
9593 "C", "btn,par"),
9594 ];
9595 total += event_checks.len();
9596 for (setup, read, expect) in event_checks {
9597 let mut rt = JsRuntime::new();
9598 rt.dom
9599 .borrow_mut()
9600 .build_from(&crate::os_lib::dom::parse_html(event_html));
9601 let _ = rt.eval(setup);
9602 let bidx = rt.dom.borrow().get_element_by_id("btn");
9603 if let Some(i) = bidx {
9604 rt.dispatch_click(i);
9605 }
9606 match rt.eval(read) {
9607 Ok(v) if &v.to_js_string() == expect => passed += 1,
9608 Ok(v) => crate::println!(
9609 "JS_SELFTEST FAIL: event `{}` => `{}` (want `{}`)",
9610 read,
9611 v.to_js_string(),
9612 expect
9613 ),
9614 Err(e) => crate::println!("JS_SELFTEST ERR: event `{}` => {}", read, e),
9615 }
9616 }
9617
9618 {
9623 total += 1;
9624 let mut rt = JsRuntime::new();
9625 rt.dom
9626 .borrow_mut()
9627 .build_from(&crate::os_lib::dom::parse_html(event_html));
9628 let _ = rt.eval(
9629 "var L=''; \
9630 document.getElementById('btn').addEventListener('foo', function(e){ L+='btn:'+e.type; }); \
9631 document.getElementById('par').addEventListener('foo', function(){ L+='-par'; }); \
9632 document.getElementById('btn').dispatchEvent(new Event('foo', {bubbles:true}));",
9633 );
9634 match rt.eval("L") {
9635 Ok(v) if v.to_js_string() == "btn:foo-par" => passed += 1,
9636 Ok(v) => crate::println!(
9637 "JS_SELFTEST FAIL: dispatchEvent => `{}` (want `btn:foo-par`)",
9638 v.to_js_string()
9639 ),
9640 Err(e) => crate::println!("JS_SELFTEST ERR: dispatchEvent => {}", e),
9641 }
9642 }
9643
9644 {
9647 total += 1;
9648 let mut rt = JsRuntime::new();
9649 rt.dom
9650 .borrow_mut()
9651 .build_from(&crate::os_lib::dom::parse_html(event_html));
9652 let _ = rt.eval(
9653 "var L=''; \
9654 document.getElementById('btn').addEventListener('foo', function(e){ L+='btn:'+e.type; }); \
9655 document.getElementById('par').addEventListener('foo', function(){ L+='-par'; }); \
9656 document.getElementById('btn').dispatchEvent(new Event('foo'));",
9657 );
9658 match rt.eval("L") {
9659 Ok(v) if v.to_js_string() == "btn:foo" => passed += 1,
9660 Ok(v) => crate::println!(
9661 "JS_SELFTEST FAIL: dispatchEvent non-bubbling => `{}` (want `btn:foo`)",
9662 v.to_js_string()
9663 ),
9664 Err(e) => crate::println!("JS_SELFTEST ERR: dispatchEvent non-bubbling => {}", e),
9665 }
9666 }
9667
9668 {
9671 total += 1;
9672 let mut rt = JsRuntime::new();
9673 rt.dom
9674 .borrow_mut()
9675 .build_from(&crate::os_lib::dom::parse_html(event_html));
9676 let _ = rt.eval(
9677 "var L=''; \
9678 document.getElementById('btn').addEventListener('foo', function(e){ L+='btn:'+e.type; }); \
9679 document.getElementById('par').addEventListener('foo', function(){ L+='-par'; }); \
9680 document.getElementById('btn').dispatchEvent(new CustomEvent('foo', {bubbles:true}));",
9681 );
9682 match rt.eval("L") {
9683 Ok(v) if v.to_js_string() == "btn:foo-par" => passed += 1,
9684 Ok(v) => crate::println!(
9685 "JS_SELFTEST FAIL: CustomEvent bubbles => `{}` (want `btn:foo-par`)",
9686 v.to_js_string()
9687 ),
9688 Err(e) => crate::println!("JS_SELFTEST ERR: CustomEvent bubbles => {}", e),
9689 }
9690 }
9691
9692 {
9694 total += 1;
9695 let mut rt = JsRuntime::new();
9696 rt.dom
9697 .borrow_mut()
9698 .build_from(&crate::os_lib::dom::parse_html(event_html));
9699 let _ = rt.eval(
9700 "var N=0; document.getElementById('btn').addEventListener('foo', function(){ N++; }, {once:true}); \
9701 document.getElementById('btn').dispatchEvent(new Event('foo')); \
9702 document.getElementById('btn').dispatchEvent(new Event('foo')); \
9703 document.getElementById('btn').dispatchEvent(new Event('foo'));",
9704 );
9705 match rt.eval("N") {
9706 Ok(v) if v.to_js_string() == "1" => passed += 1,
9707 Ok(v) => crate::println!(
9708 "JS_SELFTEST FAIL: once dispatch => `{}` (want `1`)",
9709 v.to_js_string()
9710 ),
9711 Err(e) => crate::println!("JS_SELFTEST ERR: once dispatch => {}", e),
9712 }
9713 }
9714
9715 {
9721 total += 1;
9722 let mut rt = JsRuntime::new();
9723 rt.dom
9724 .borrow_mut()
9725 .build_from(&crate::os_lib::dom::parse_html(event_html));
9726 let _ = rt.eval(
9727 "document.getElementById('btn').addEventListener('foo', function(e){ e.preventDefault(); }); \
9728 var R = document.getElementById('btn').dispatchEvent(new Event('foo', {cancelable:true}));",
9729 );
9730 match rt.eval("R") {
9731 Ok(v) if v.to_js_string() == "false" => passed += 1,
9732 Ok(v) => crate::println!(
9733 "JS_SELFTEST FAIL: dispatchEvent return => `{}` (want `false`)",
9734 v.to_js_string()
9735 ),
9736 Err(e) => crate::println!("JS_SELFTEST ERR: dispatchEvent return => {}", e),
9737 }
9738 }
9739
9740 let change_html = "<form><input id='cb' type='checkbox'><select id='sel'><option value='a'>A</option><option value='b'>B</option></select></form>";
9743 let mut change_passed = 0usize;
9744 {
9745 total += 1;
9746 let mut rt = JsRuntime::new();
9747 rt.dom
9748 .borrow_mut()
9749 .build_from(&crate::os_lib::dom::parse_html(change_html));
9750 let _ = rt.eval("var c=0; document.getElementById('cb').addEventListener('change', function(){ c++; });");
9751 let cidx = rt.dom.borrow().get_element_by_id("cb");
9752 if let Some(i) = cidx {
9753 rt.dispatch_event(i, "change");
9754 rt.dispatch_event(i, "change");
9755 }
9756 match rt.eval("c") {
9757 Ok(v) if v.to_js_string() == "2" => change_passed += 1,
9758 Ok(v) => crate::println!(
9759 "JS_SELFTEST FAIL: change count => `{}` (want `2`)",
9760 v.to_js_string()
9761 ),
9762 Err(e) => crate::println!("JS_SELFTEST ERR: change count => {}", e),
9763 }
9764 }
9765 {
9766 total += 1;
9767 let mut rt = JsRuntime::new();
9769 rt.dom
9770 .borrow_mut()
9771 .build_from(&crate::os_lib::dom::parse_html(change_html));
9772 let _ = rt.eval("var t=''; document.getElementById('sel').addEventListener('change', function(e){ t=e.target.id; });");
9773 let sidx = rt.dom.borrow().get_element_by_id("sel");
9774 if let Some(i) = sidx {
9775 rt.dispatch_event(i, "change");
9776 }
9777 match rt.eval("t") {
9778 Ok(v) if v.to_js_string() == "sel" => change_passed += 1,
9779 Ok(v) => crate::println!(
9780 "JS_SELFTEST FAIL: change target => `{}` (want `sel`)",
9781 v.to_js_string()
9782 ),
9783 Err(e) => crate::println!("JS_SELFTEST ERR: change target => {}", e),
9784 }
9785 }
9786 passed += change_passed;
9787
9788 {
9789 let kev_html = "<div id='par'><input id='inp'></div>";
9790 {
9792 total += 1;
9793 let mut rt = JsRuntime::new();
9794 rt.dom
9795 .borrow_mut()
9796 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9797 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('keydown', function(e){ L = e.type + ':' + e.key; });");
9798 let idx = rt.dom.borrow().get_element_by_id("inp");
9799 if let Some(i) = idx {
9800 rt.dispatch_key(i, "keydown", "x");
9801 }
9802 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "keydown:x" {
9803 passed += 1;
9804 } else {
9805 crate::println!("JS_SELFTEST FAIL: keydown e.key");
9806 }
9807 }
9808 {
9810 total += 1;
9811 let mut rt = JsRuntime::new();
9812 rt.dom
9813 .borrow_mut()
9814 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9815 let _ = rt.eval("var L=''; document.getElementById('par').addEventListener('keydown', function(e){ L = 'par:' + e.target.id; });");
9816 let idx = rt.dom.borrow().get_element_by_id("inp");
9817 if let Some(i) = idx {
9818 rt.dispatch_key(i, "keydown", "a");
9819 }
9820 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "par:inp" {
9821 passed += 1;
9822 } else {
9823 crate::println!("JS_SELFTEST FAIL: keydown bubbling");
9824 }
9825 }
9826 {
9828 total += 1;
9829 let mut rt = JsRuntime::new();
9830 rt.dom
9831 .borrow_mut()
9832 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9833 let _ = rt.eval("document.getElementById('inp').addEventListener('keydown', function(e){ e.preventDefault(); });");
9834 let idx = rt.dom.borrow().get_element_by_id("inp");
9835 let prevented = idx
9836 .map(|i| rt.dispatch_key(i, "keydown", "a").1)
9837 .unwrap_or(false);
9838 if prevented {
9839 passed += 1;
9840 } else {
9841 crate::println!("JS_SELFTEST FAIL: keydown preventDefault");
9842 }
9843 }
9844 {
9846 total += 1;
9847 let mut rt = JsRuntime::new();
9848 rt.dom
9849 .borrow_mut()
9850 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9851 let _ = rt.eval("var N=0; document.getElementById('inp').addEventListener('input', function(){ N++; });");
9852 let idx = rt.dom.borrow().get_element_by_id("inp");
9853 if let Some(i) = idx {
9854 rt.dispatch_event(i, "input");
9855 }
9856 if rt.eval("N").map(|v| v.to_js_string()).unwrap_or_default() == "1" {
9857 passed += 1;
9858 } else {
9859 crate::println!("JS_SELFTEST FAIL: input event");
9860 }
9861 }
9862 {
9864 total += 1;
9865 let mut rt = JsRuntime::new();
9866 rt.dom
9867 .borrow_mut()
9868 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9869 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('focus', function(e){ L = e.type; });");
9870 let idx = rt.dom.borrow().get_element_by_id("inp");
9871 if let Some(i) = idx {
9872 rt.dispatch_event(i, "focus");
9873 }
9874 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "focus" {
9875 passed += 1;
9876 } else {
9877 crate::println!("JS_SELFTEST FAIL: focus event");
9878 }
9879 }
9880 {
9882 total += 1;
9883 let mut rt = JsRuntime::new();
9884 rt.dom
9885 .borrow_mut()
9886 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9887 let _ = rt.eval("var L=''; document.getElementById('par').addEventListener('blur', function(e){ L = 'blur:' + e.target.id; });");
9888 let idx = rt.dom.borrow().get_element_by_id("inp");
9889 if let Some(i) = idx {
9890 rt.dispatch_event(i, "blur");
9891 }
9892 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "blur:inp" {
9893 passed += 1;
9894 } else {
9895 crate::println!("JS_SELFTEST FAIL: blur bubbling");
9896 }
9897 }
9898 {
9900 total += 1;
9901 let mut rt = JsRuntime::new();
9902 rt.dom
9903 .borrow_mut()
9904 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9905 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('change', function(e){ L = e.type; });");
9906 let idx = rt.dom.borrow().get_element_by_id("inp");
9907 if let Some(i) = idx {
9908 rt.dispatch_event(i, "change");
9909 }
9910 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "change" {
9911 passed += 1;
9912 } else {
9913 crate::println!("JS_SELFTEST FAIL: change event");
9914 }
9915 }
9916 let form_html = "<form id='f'><input id='inp2'></form>";
9918 {
9919 total += 1;
9920 let mut rt = JsRuntime::new();
9921 rt.dom
9922 .borrow_mut()
9923 .build_from(&crate::os_lib::dom::parse_html(form_html));
9924 let _ = rt.eval("var S=0; document.getElementById('f').addEventListener('submit', function(){ S++; });");
9925 let idx = rt.dom.borrow().get_element_by_id("f");
9926 if let Some(i) = idx {
9927 rt.dispatch_event_with(i, "submit", &[]);
9928 }
9929 if rt.eval("S").map(|v| v.to_js_string()).unwrap_or_default() == "1" {
9930 passed += 1;
9931 } else {
9932 crate::println!("JS_SELFTEST FAIL: submit event");
9933 }
9934 }
9935 {
9936 total += 1;
9937 let mut rt = JsRuntime::new();
9938 rt.dom
9939 .borrow_mut()
9940 .build_from(&crate::os_lib::dom::parse_html(form_html));
9941 let _ = rt.eval("document.getElementById('f').addEventListener('submit', function(e){ e.preventDefault(); });");
9942 let idx = rt.dom.borrow().get_element_by_id("f");
9943 let prevented = idx
9944 .map(|i| rt.dispatch_event_with(i, "submit", &[]).1)
9945 .unwrap_or(false);
9946 if prevented {
9947 passed += 1;
9948 } else {
9949 crate::println!("JS_SELFTEST FAIL: submit preventDefault");
9950 }
9951 }
9952 {
9954 total += 1;
9955 let mut rt = JsRuntime::new();
9956 rt.dom
9957 .borrow_mut()
9958 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9959 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('mouseover', function(e){ L = e.type; });");
9960 let idx = rt.dom.borrow().get_element_by_id("inp");
9961 if let Some(i) = idx {
9962 rt.dispatch_event(i, "mouseover");
9963 }
9964 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "mouseover" {
9965 passed += 1;
9966 } else {
9967 crate::println!("JS_SELFTEST FAIL: mouseover event");
9968 }
9969 }
9970 {
9972 total += 1;
9973 let mut rt = JsRuntime::new();
9974 rt.dom
9975 .borrow_mut()
9976 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9977 let _ = rt.eval("var L=''; document.getElementById('par').addEventListener('mouseout', function(e){ L = 'out:' + e.target.id; });");
9978 let idx = rt.dom.borrow().get_element_by_id("inp");
9979 if let Some(i) = idx {
9980 rt.dispatch_event(i, "mouseout");
9981 }
9982 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "out:inp" {
9983 passed += 1;
9984 } else {
9985 crate::println!("JS_SELFTEST FAIL: mouseout bubbling");
9986 }
9987 }
9988 {
9990 total += 1;
9991 let mut rt = JsRuntime::new();
9992 rt.dom
9993 .borrow_mut()
9994 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9995 let _ = rt.eval("var N=0; document.getElementById('inp').addEventListener('mousemove', function(){ N++; });");
9996 let idx = rt.dom.borrow().get_element_by_id("inp");
9997 if let Some(i) = idx {
9998 rt.dispatch_event(i, "mousemove");
9999 rt.dispatch_event(i, "mousemove");
10000 }
10001 if rt.eval("N").map(|v| v.to_js_string()).unwrap_or_default() == "2" {
10002 passed += 1;
10003 } else {
10004 crate::println!("JS_SELFTEST FAIL: mousemove event");
10005 }
10006 }
10007 {
10009 total += 1;
10010 let mut rt = JsRuntime::new();
10011 rt.dom
10012 .borrow_mut()
10013 .build_from(&crate::os_lib::dom::parse_html(kev_html));
10014 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('click', function(e){ L = e.clientX + ',' + e.clientY; });");
10015 let idx = rt.dom.borrow().get_element_by_id("inp");
10016 if let Some(i) = idx {
10017 rt.dispatch_mouse(i, "click", 42, 17);
10018 }
10019 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "42,17" {
10020 passed += 1;
10021 } else {
10022 crate::println!("JS_SELFTEST FAIL: mouse clientX/clientY");
10023 }
10024 }
10025 }
10026
10027 let location_cases: &[(&str, &str)] = &[
10029 ("location.href", "https://example.com/foo/bar?q=1#h"),
10030 ("location.protocol", "https:"),
10031 ("location.host", "example.com"),
10032 ("location.hostname", "example.com"),
10033 ("location.pathname", "/foo/bar"),
10034 ("location.search", "?q=1"),
10035 ("location.hash", "#h"),
10036 ("location.origin", "https://example.com"),
10037 ("window.location.href", "https://example.com/foo/bar?q=1#h"),
10038 ("document.location.pathname", "/foo/bar"),
10039 ("location.toString()", "https://example.com/foo/bar?q=1#h"),
10040 ("window.location === document.location", "true"),
10041 (
10051 "location.protocol='http:'; location._pending_location",
10052 "http://example.com/foo/bar?q=1",
10053 ),
10054 (
10055 "location.protocol='https:'; location.host='example.com'; \
10056 location.hostname='other.com'; location._pending_location",
10057 "https://other.com/foo/bar?q=1",
10058 ),
10059 (
10060 "location.host='example.com'; location.port='8080'; location._pending_location",
10061 "https://example.com:8080/foo/bar?q=1",
10062 ),
10063 (
10064 "location.host='new.com:9090'; location._pending_location",
10065 "https://new.com:9090/foo/bar?q=1",
10066 ),
10067 (
10068 "location.host='new.com:9090'; location.hostname + ',' + location.port",
10069 "new.com,9090",
10070 ),
10071 (
10075 "var a=document.createElement('a'); a.setAttribute('href','/p3'); a.href",
10076 "https://example.com/p3",
10077 ),
10078 (
10079 "var i=document.createElement('img'); i.setAttribute('src','x.png'); i.src",
10080 "https://example.com/foo/x.png",
10081 ),
10082 (
10083 "var a=document.createElement('a'); a.setAttribute('href','https://o.com/z'); a.href",
10084 "https://o.com/z",
10085 ),
10086 ("document.URL", "https://example.com/foo/bar?q=1#h"),
10089 ("document.documentURI", "https://example.com/foo/bar?q=1#h"),
10090 (
10091 "document.createElement('div').baseURI",
10092 "https://example.com/foo/bar?q=1#h",
10093 ),
10094 ("document.readyState", "complete"),
10097 (
10100 "document.cookie='ck_a=1'; document.cookie='ck_b=2; path=/'; document.cookie",
10101 "ck_a=1; ck_b=2",
10102 ),
10103 (
10107 "await cookieStore.set('cs_x', '1'); (await cookieStore.get('cs_x')).value",
10108 "1",
10109 ),
10110 ("(await cookieStore.get('cs_missing'))", "null"),
10111 (
10112 "await cookieStore.set('cs_y', '2'); \
10113 (await cookieStore.getAll('cs_y')).map(c => c.name+'='+c.value).join(',')",
10114 "cs_y=2",
10115 ),
10116 (
10117 "await cookieStore.set('cs_z', '3'); await cookieStore.delete('cs_z'); \
10118 (await cookieStore.get('cs_z'))",
10119 "null",
10120 ),
10121 (
10122 "await cookieStore.set({name:'cs_w', value:'4'}); (await cookieStore.get('cs_w')).value",
10123 "4",
10124 ),
10125 ("document.hidden", "false"),
10128 ("document.visibilityState", "visible"),
10129 ];
10130 total += location_cases.len();
10131 {
10132 let mut rt = JsRuntime::new();
10133 rt.set_page_url("https://example.com/foo/bar?q=1#h");
10134 for (src, expect) in location_cases {
10135 match rt.eval(src) {
10136 Ok(v) if &v.to_js_string() == expect => passed += 1,
10137 Ok(v) => crate::println!(
10138 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
10139 src,
10140 v.to_js_string(),
10141 expect
10142 ),
10143 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
10144 }
10145 }
10146 }
10147
10148 let history_cases: &[(&str, &str)] = &[
10150 (
10151 "history.pushState({a:1},'','/p2'); location.pathname",
10152 "/p2",
10153 ),
10154 (
10155 "history.pushState({},'','/p2'); location.href",
10156 "https://example.com/p2",
10157 ),
10158 ("history.pushState({a:9},'','/p2'); history.state.a", "9"),
10159 (
10160 "var n=history.length; history.pushState({},'','/x'); history.length - n",
10161 "1",
10162 ),
10163 (
10164 "var n=history.length; history.replaceState({},'','/y'); history.length - n",
10165 "0",
10166 ),
10167 (
10168 "history.replaceState({},'','about.html'); location.pathname",
10169 "/foo/about.html",
10170 ),
10171 ("typeof history.pushState", "function"),
10172 ("typeof history.back", "function"),
10173 ];
10174 total += history_cases.len();
10175 for (src, expect) in history_cases {
10176 let mut rt = JsRuntime::new();
10177 rt.set_page_url("https://example.com/foo/bar");
10178 match rt.eval(src) {
10179 Ok(v) if &v.to_js_string() == expect => passed += 1,
10180 Ok(v) => crate::println!(
10181 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
10182 src,
10183 v.to_js_string(),
10184 expect
10185 ),
10186 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
10187 }
10188 }
10189
10190 let resolve_cases: &[(&str, &str, &str)] = &[
10192 ("http://h.com/a/b.html", "/api", "http://h.com/api"),
10193 ("http://h.com/a/b.html", "x.json", "http://h.com/a/x.json"),
10194 ("http://h.com/a/", "x.json", "http://h.com/a/x.json"),
10195 (
10196 "http://h.com/a/b.html",
10197 "https://o.com/z",
10198 "https://o.com/z",
10199 ),
10200 ("http://h.com/a/b.html", "data:,hi", "data:,hi"),
10201 ("https://h.com/", "/p/q", "https://h.com/p/q"),
10202 ("http://h.com", "y", "http://h.com/y"),
10203 ("", "/api", "/api"),
10204 ("https://h.com/a/b/c", "../style.css", "https://h.com/a/style.css"),
10206 ("https://h.com/a/b/c", "./style.css", "https://h.com/a/b/style.css"),
10207 ("https://h.com/a/b/c/d", "../../x", "https://h.com/a/x"),
10208 ];
10209 total += resolve_cases.len();
10210 for (base, url, expect) in resolve_cases {
10211 let got = builtins::resolve_url(base, url);
10212 if &got == expect {
10213 passed += 1;
10214 } else {
10215 crate::println!(
10216 "JS_SELFTEST FAIL: resolve_url({:?},{:?}) => `{}` (want `{}`)",
10217 base,
10218 url,
10219 got,
10220 expect
10221 );
10222 }
10223 }
10224
10225 let validity_cases: &[(&str, &str, &str)] = &[
10227 ("<input id='a' required value=''>", "document.getElementById('a').checkValidity()", "false"),
10229 ("<input id='a' required value='x'>", "document.getElementById('a').checkValidity()", "true"),
10230 ("<input id='a' value='hi'>", "document.getElementById('a').checkValidity()", "true"),
10231 ("<input id='a' type='email' value='nope'>", "document.getElementById('a').checkValidity()", "false"),
10232 ("<input id='a' type='email' value='x@y.com'>", "document.getElementById('a').checkValidity()", "true"),
10233 ("<input id='a' type='number' min='5' value='3'>", "document.getElementById('a').checkValidity()", "false"),
10234 ("<input id='a' type='number' min='5' value='9'>", "document.getElementById('a').checkValidity()", "true"),
10235 ("<input id='a' minlength='3' value='ab'>", "document.getElementById('a').checkValidity()", "false"),
10236 ("<input id='a' maxlength='2' value='abc'>", "document.getElementById('a').checkValidity()", "false"),
10237 ("<input id='a' value='ok'>", "var e=document.getElementById('a'); e.setCustomValidity('bad'); e.checkValidity()", "false"),
10238 ("<input id='a' value='ok'>", "var e=document.getElementById('a'); e.setCustomValidity('bad'); e.setCustomValidity(''); e.checkValidity()", "true"),
10239 ("<input id='a' required value=''>", "document.getElementById('a').validity.valueMissing", "true"),
10240 ("<input id='a' required value='x'>", "document.getElementById('a').validity.valid", "true"),
10241 ("<input id='a' value='hi'>", "document.getElementById('a').willValidate", "true"),
10242 ("<input id='a' type='submit'>", "document.getElementById('a').willValidate", "false"),
10243 ("<input id='a' pattern='[0-9]{3}' value='123'>", "document.getElementById('a').checkValidity()", "true"),
10247 ("<input id='a' pattern='[0-9]{3}' value='ab'>", "document.getElementById('a').checkValidity()", "false"),
10248 ("<input id='a' pattern='\\d+' value='123'>", "document.getElementById('a').checkValidity()", "true"),
10249 ("<input id='a' pattern='\\d+' value='abc'>", "document.getElementById('a').checkValidity()", "false"),
10250 ("<input id='a' pattern='[0-9]{3}' value=''>", "document.getElementById('a').checkValidity()", "true"),
10252 ("<input id='a' type='number' step='2' value='4'>", "document.getElementById('a').checkValidity()", "true"),
10254 ("<input id='a' type='number' step='2' value='3'>", "document.getElementById('a').checkValidity()", "false"),
10255 ("<input id='a' type='number' min='1' step='2' value='5'>", "document.getElementById('a').checkValidity()", "true"),
10257 ("<input id='a' type='number' min='1' step='2' value='4'>", "document.getElementById('a').checkValidity()", "false"),
10258 ("<input id='a' type='number' step='any' value='3.14159'>", "document.getElementById('a').checkValidity()", "true"),
10260 ("<input id='a' pattern='[0-9]{3}' value='ab'>", "document.getElementById('a').validity.patternMismatch", "true"),
10265 ("<input id='a' pattern='[0-9]{3}' value='123'>", "document.getElementById('a').validity.patternMismatch", "false"),
10266 ("<input id='a' type='email' value='nope'>", "document.getElementById('a').validity.typeMismatch", "true"),
10267 ("<input id='a' type='number' min='5' value='3'>", "document.getElementById('a').validity.rangeUnderflow", "true"),
10268 ("<input id='a' type='number' max='5' value='9'>", "document.getElementById('a').validity.rangeOverflow", "true"),
10269 ("<input id='a' type='number' step='2' value='3'>", "document.getElementById('a').validity.stepMismatch", "true"),
10270 ("<input id='a' maxlength='2' value='abc'>", "document.getElementById('a').validity.tooLong", "true"),
10271 ("<input id='a' minlength='3' value='ab'>", "document.getElementById('a').validity.tooShort", "true"),
10272 ("<input id='a' type='number' value='abc'>", "document.getElementById('a').validity.badInput", "true"),
10273 (
10276 "<form id='f3'><input required value=''></form>",
10277 "document.getElementById('f3').checkValidity()",
10278 "false",
10279 ),
10280 (
10281 "<form id='f3'><input required value='x'></form>",
10282 "document.getElementById('f3').checkValidity()",
10283 "true",
10284 ),
10285 (
10286 "<form id='f3'><input required value='x'><input type='email' value='nope'></form>",
10287 "document.getElementById('f3').checkValidity()",
10288 "false",
10289 ),
10290 (
10297 "<select id='a' required><option value='x' selected>X</option></select>",
10298 "document.getElementById('a').checkValidity()",
10299 "true",
10300 ),
10301 (
10302 "<select id='a' required><option value='x' selected>X</option></select>",
10303 "document.getElementById('a').validity.valueMissing",
10304 "false",
10305 ),
10306 (
10307 "<textarea id='a' required>hello</textarea>",
10308 "document.getElementById('a').checkValidity()",
10309 "true",
10310 ),
10311 (
10312 "<textarea id='a' required></textarea>",
10313 "document.getElementById('a').checkValidity()",
10314 "false",
10315 ),
10316 (
10317 "<form id='f4'><select required><option value='x' selected>X</option></select></form>",
10318 "document.getElementById('f4').checkValidity()",
10319 "true",
10320 ),
10321 (
10327 "<input id='a' type='checkbox' required>",
10328 "document.getElementById('a').checkValidity()",
10329 "false",
10330 ),
10331 (
10332 "<input id='a' type='checkbox' required checked>",
10333 "document.getElementById('a').checkValidity()",
10334 "true",
10335 ),
10336 (
10337 "<input id='a' type='checkbox' value='yes' required>",
10338 "document.getElementById('a').validity.valueMissing",
10339 "true",
10340 ),
10341 (
10342 "<input id='a' type='checkbox' required checked>",
10343 "document.getElementById('a').validity.valueMissing",
10344 "false",
10345 ),
10346 (
10349 "<input id='a' type='radio' name='g' required><input type='radio' name='g' checked>",
10350 "document.getElementById('a').checkValidity()",
10351 "true",
10352 ),
10353 (
10354 "<input id='a' type='radio' name='g' required><input type='radio' name='g'>",
10355 "document.getElementById('a').checkValidity()",
10356 "false",
10357 ),
10358 (
10363 "<input id='a' type='range' min='0' max='10' value='20'>",
10364 "document.getElementById('a').validity.rangeOverflow",
10365 "true",
10366 ),
10367 (
10368 "<input id='a' type='range' min='0' max='10' value='-5'>",
10369 "document.getElementById('a').validity.rangeUnderflow",
10370 "true",
10371 ),
10372 (
10373 "<input id='a' type='range' min='0' max='10' value='5'>",
10374 "document.getElementById('a').checkValidity()",
10375 "true",
10376 ),
10377 (
10378 "<input id='a' type='range' min='0' max='10' step='2' value='3'>",
10379 "document.getElementById('a').validity.stepMismatch",
10380 "true",
10381 ),
10382 (
10387 "<input id='a' type='date' value='2026-07-17'>",
10388 "document.getElementById('a').validity.typeMismatch",
10389 "false",
10390 ),
10391 (
10392 "<input id='a' type='date' value='not-a-date'>",
10393 "document.getElementById('a').validity.typeMismatch",
10394 "true",
10395 ),
10396 (
10397 "<input id='a' type='month' value='2026-07'>",
10398 "document.getElementById('a').checkValidity()",
10399 "true",
10400 ),
10401 (
10402 "<input id='a' type='date' value='2026-13-99'>",
10403 "document.getElementById('a').checkValidity()",
10404 "false",
10405 ),
10406 (
10410 "<input id='a' type='email' multiple value='a@b.com,c@d.com'>",
10411 "document.getElementById('a').checkValidity()",
10412 "true",
10413 ),
10414 (
10415 "<input id='a' type='email' multiple value='a@b.com, c@d.com'>",
10416 "document.getElementById('a').checkValidity()",
10417 "true",
10418 ),
10419 (
10420 "<input id='a' type='email' multiple value='a@b.com,nope'>",
10421 "document.getElementById('a').checkValidity()",
10422 "false",
10423 ),
10424 (
10425 "<input id='a' type='email' value='a@b.com,c@d.com'>",
10427 "document.getElementById('a').checkValidity()",
10428 "false",
10429 ),
10430 (
10433 "<input id='a' type='date' min='2026-01-01' max='2026-12-31' value='2025-12-31'>",
10434 "document.getElementById('a').validity.rangeUnderflow",
10435 "true",
10436 ),
10437 (
10438 "<input id='a' type='date' min='2026-01-01' max='2026-12-31' value='2027-01-01'>",
10439 "document.getElementById('a').validity.rangeOverflow",
10440 "true",
10441 ),
10442 (
10443 "<input id='a' type='date' min='2026-01-01' max='2026-12-31' value='2026-06-15'>",
10444 "document.getElementById('a').checkValidity()",
10445 "true",
10446 ),
10447 (
10448 "<input id='a' type='month' min='2026-03' max='2026-09' value='2026-01'>",
10449 "document.getElementById('a').checkValidity()",
10450 "false",
10451 ),
10452 (
10457 "<fieldset disabled><input id='a' required></fieldset>",
10458 "document.getElementById('a').disabled",
10459 "true",
10460 ),
10461 (
10462 "<fieldset disabled><input id='a' required></fieldset>",
10463 "document.getElementById('a').checkValidity()",
10464 "true",
10465 ),
10466 (
10467 "<fieldset><input id='a' required></fieldset>",
10468 "document.getElementById('a').disabled",
10469 "false",
10470 ),
10471 (
10472 "<fieldset disabled><input id='a' required value=''></fieldset>",
10475 "document.getElementById('a').validity.valueMissing",
10476 "false",
10477 ),
10478 (
10484 "<form id='f5'></form><input id='a' form='f5'>",
10485 "document.getElementById('a').form === document.getElementById('f5')",
10486 "true",
10487 ),
10488 (
10489 "<form id='f5'></form><input id='a' form='f5' required>",
10490 "document.getElementById('f5').checkValidity()",
10491 "false",
10492 ),
10493 (
10494 "<form id='f5'></form><input id='a' form='f5' required value='x'>",
10495 "document.getElementById('f5').checkValidity()",
10496 "true",
10497 ),
10498 (
10499 "<div><input id='a'></div>",
10501 "document.getElementById('a').form",
10502 "null",
10503 ),
10504 (
10509 "<input id='a' type='datetime-local' value='2026-07-17T14:30'>",
10510 "document.getElementById('a').validity.typeMismatch",
10511 "false",
10512 ),
10513 (
10514 "<input id='a' type='datetime-local' value='not-a-datetime'>",
10515 "document.getElementById('a').checkValidity()",
10516 "false",
10517 ),
10518 (
10519 "<input id='a' type='datetime-local' min='2026-01-01T00:00' max='2026-12-31T23:59' value='2025-06-01T00:00'>",
10520 "document.getElementById('a').validity.rangeUnderflow",
10521 "true",
10522 ),
10523 (
10529 "<details id='a' name='g' open></details><details id='b' name='g' open></details>",
10530 "document.getElementById('a').open+','+document.getElementById('b').open",
10531 "false,true",
10532 ),
10533 (
10534 "<details id='a' name='g' open></details><details id='b' open></details>",
10535 "document.getElementById('a').open+','+document.getElementById('b').open",
10536 "true,true",
10537 ),
10538 (
10541 "<div id='wrap'><p id='t' name='foo'></p><span id='s'></span></div>",
10542 "document.getElementById('wrap').children.item(0).id + ',' + document.getElementById('wrap').children.namedItem('s').tagName + ',' + document.getElementById('wrap').children.namedItem('foo').id",
10543 "t,SPAN,t",
10544 ),
10545 (
10546 "<div id='wrap'><span></span></div>",
10547 "String(document.getElementById('wrap').children.item(99))",
10548 "null",
10549 ),
10550 (
10551 "<form id='f'><input id='i' name='user'></form>",
10552 "document.getElementById('f').elements.item(0).id + ',' + document.getElementById('f').elements.namedItem('user').id",
10553 "i,i",
10554 ),
10555 (
10556 "<form id='f'><input type='radio' name='r' value='v1'><input type='radio' name='r' value='v2' checked></form>",
10557 "var f=document.getElementById('f'); var list=f.elements.namedItem('r'); var v1=list.value; var len=list.length; list.value='v1'; var v2=list.value; var c0=list[0].checked; v1+','+len+','+v2+','+c0",
10558 "v2,2,v1,true",
10559 ),
10560 (
10561 "<div id='d' class='a b'></div>",
10562 "var d=document.getElementById('d'); var v=d.classList.value; d.classList.value='c d'; v+','+d.className",
10563 "a b,c d",
10564 ),
10565 ];
10566 total += validity_cases.len();
10567 for (html, src, expect) in validity_cases {
10568 let mut rt = JsRuntime::new();
10569 rt.dom
10570 .borrow_mut()
10571 .build_from(&crate::os_lib::dom::parse_html(html));
10572 match rt.eval(src) {
10573 Ok(v) if &v.to_js_string() == expect => passed += 1,
10574 Ok(v) => crate::println!(
10575 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
10576 src,
10577 v.to_js_string(),
10578 expect
10579 ),
10580 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
10581 }
10582 }
10583
10584 {
10587 let math_src = "export const PI = 3; export function sq(x){ return x*x; } \
10589 const e = 2; export { e as E };";
10590 let greet_src = "export default function(n){ return 'hi ' + n; } \
10592 export const lang = 'ja';";
10593 let index_src = "export { PI, sq } from 'math'; export * from 'math';";
10595 let cyc_a = "import { bVal } from 'cycb'; export const aVal = 10; \
10597 export function getB(){ return bVal; }";
10598 let cyc_b = "import { aVal } from 'cyca'; export const bVal = 20;";
10599
10600 let module_checks: &[(&str, &str)] = &[
10601 ("import { PI, sq } from 'math'; sq(PI)", "9"),
10603 ("import { E } from 'math'; E", "2"),
10605 ("import greet from 'greet'; greet('bob')", "hi bob"),
10607 ("import greet, { lang } from 'greet'; greet(lang)", "hi ja"),
10609 ("import * as M from 'math'; M.sq(4) + M.PI", "19"),
10611 ("import { PI } from 'index'; PI", "3"),
10613 ("import { sq } from 'index'; sq(5)", "25"),
10615 ("import { getB } from 'cyca'; getB()", "20"),
10617 ("import 'math'; 42", "42"),
10619 ];
10620 total += module_checks.len();
10621 for (src, expect) in module_checks {
10622 let mut rt = JsRuntime::new();
10623 rt.define_module("math", math_src);
10624 rt.define_module("greet", greet_src);
10625 rt.define_module("index", index_src);
10626 rt.define_module("cyca", cyc_a);
10627 rt.define_module("cycb", cyc_b);
10628 match rt.eval(src) {
10629 Ok(v) if &v.to_js_string() == expect => passed += 1,
10630 Ok(v) => crate::println!(
10631 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
10632 src,
10633 v.to_js_string(),
10634 expect
10635 ),
10636 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
10637 }
10638 }
10639 }
10640
10641 {
10650 total += 1;
10651 let mut rt = JsRuntime::new();
10652 let _ = rt.eval("window.scrollTo(0, 120);");
10653 let y = rt.dom.borrow().pending_scroll_abs_y;
10654 if y == Some(120) {
10655 passed += 1;
10656 } else {
10657 crate::println!(
10658 "JS_SELFTEST FAIL: window.scrollTo pending_scroll_abs_y => `{:?}` (want `Some(120)`)",
10659 y
10660 );
10661 }
10662 }
10663 {
10664 total += 1;
10665 let mut rt = JsRuntime::new();
10666 let _ = rt.eval("window.scrollBy(0, 30); window.scrollBy(0, 15);");
10667 let dy = rt.dom.borrow().pending_scroll_by_y;
10668 if dy == Some(45) {
10669 passed += 1;
10670 } else {
10671 crate::println!(
10672 "JS_SELFTEST FAIL: window.scrollBy pending_scroll_by_y (累積) => `{:?}` (want `Some(45)`)",
10673 dy
10674 );
10675 }
10676 }
10677 {
10685 total += 1;
10686 let mut rt = JsRuntime::new();
10687 rt.dom
10688 .borrow_mut()
10689 .build_from(&crate::os_lib::dom::parse_html("<div id='t'></div>"));
10690 let idx = rt.dom.borrow().get_element_by_id("t");
10691 if let Some(i) = idx {
10692 rt.dom.borrow_mut().set_rect(i, 0, 250, 100, 50);
10693 }
10694 let _ = rt.eval("document.getElementById('t').scrollIntoView();");
10695 let y = rt.dom.borrow().pending_scroll_abs_y;
10696 if y == Some(250) {
10697 passed += 1;
10698 } else {
10699 crate::println!(
10700 "JS_SELFTEST FAIL: element.scrollIntoView pending_scroll_abs_y => `{:?}` (want `Some(250)`)",
10701 y
10702 );
10703 }
10704 }
10705
10706 let dom_parser_cases: &[(&str, &str)] = &[
10707 (
10708 "var p = new DOMParser(); var doc = p.parseFromString('<div id=\"dp\">hello</div>', 'text/html'); doc.getElementById('dp').textContent",
10709 "hello",
10710 ),
10711 ];
10712 total += dom_parser_cases.len();
10713 for (code, expect) in dom_parser_cases {
10714 let mut rt = JsRuntime::new();
10715 let res = rt.eval(code);
10716 let got = res.map(|v| v.to_js_string()).unwrap_or_else(|e| alloc::format!("ERR: {:?}", e));
10717 if &got == expect {
10718 passed += 1;
10719 } else {
10720 crate::println!(
10721 "JS_SELFTEST FAIL: DOMParser code {:?} => `{}` (want `{}`)",
10722 code,
10723 got,
10724 expect
10725 );
10726 }
10727 }
10728
10729 let geom_web_cases = [
10731 ("const m = new DOMMatrix([1,0,0,1,10,20]); m.a === 1 && m.e === 10", "true"),
10732 ("const m = new DOMMatrix(); m.translateSelf(10, 20); m.e === 10 && m.f === 20", "true"),
10733 ("const m = new DOMMatrix(); m.scaleSelf(2, 3); m.a === 2 && m.d === 3", "true"),
10734 ("const m = new DOMMatrix(); const p = new DOMPoint(5, 10); const p2 = m.translate(10, 20).transformPoint(p); p2.x === 15 && p2.y === 30", "true"),
10735 ("const m2 = DOMMatrix.fromMatrix({a: 2, d: 3, e: 5, f: 10}); m2.a === 2 && m2.e === 5", "true"),
10736 ("const p3 = new DOMPoint(1, 2).matrixTransform(new DOMMatrix([2,0,0,3,10,20])); p3.x === 12 && p3.y === 26", "true"),
10737 ("const pat = new URLPattern({ pathname: '/api/*' }); pat.test('/api/users')", "true"),
10738 ("const res = new URLPattern({ pathname: '/users/:id' }).exec('https://example.com/users/42'); res.pathname.groups.id", "42"),
10739 ("const it = Iterator.concat([1, 2], [3, 4]); it.toArray().join(',')", "1,2,3,4"),
10740 ("const it = Iterator.from([10, 20, 30]); it.take(2).toArray().join(',')", "10,20"),
10741 ("new Intl.DurationFormat('en', {style:'long'}).format({hours:1, minutes:30})", "1 hour, 30 minutes"),
10742 ("new Intl.DurationFormat('en').resolvedOptions().locale", "en-US"),
10743 ("Iterator.range(1, 5).toArray().join(',')", "1,2,3,4"),
10744 ("Iterator.range(0, 10, 2).toArray().join(',')", "0,2,4,6,8"),
10745 ("Iterator.range(5, 1, -1).toArray().join(',')", "5,4,3,2"),
10746 ];
10747 total += geom_web_cases.len();
10748 for (code, expect) in geom_web_cases {
10749 let mut rt = JsRuntime::new();
10750 let res = rt.eval(code);
10751 let got = res.map(|v| v.to_js_string()).unwrap_or_else(|e| alloc::format!("ERR: {:?}", e));
10752 if &got == expect {
10753 passed += 1;
10754 } else {
10755 crate::println!(
10756 "JS_SELFTEST FAIL: Geom/Web API code {:?} => `{}` (want `{}`)",
10757 code,
10758 got,
10759 expect
10760 );
10761 }
10762 }
10763
10764 let template_html = r#"<div><template id="tmpl"><span>Hello</span></template></div>"#;
10765 let template_cases = [
10766 ("document.createElement('template') instanceof HTMLTemplateElement", "true"),
10767 ("const t = document.createElement('template'); t.content.nodeType === 11", "true"),
10768 ("const t = document.getElementById('tmpl'); t.content.childNodes.length", "1"),
10769 ("const t = document.getElementById('tmpl'); t.content.children[0].tagName", "SPAN"),
10770 ("const t = document.getElementById('tmpl'); const f = t.content.cloneNode(true); f.nodeType === 11 && f.children[0].textContent === 'Hello'", "true"),
10771 ("const s = document.createElement('select'); const o = document.createElement('option'); o.value='v1'; o.text='t1'; s.add(o); s.options.length === 1 && s.value === 'v1'", "true"),
10772 ("const u = new URL('https://www.sugi-lab.net/?a=1'); u.searchParams.set('b', '2'); u.search === '?a=1&b=2'", "true"),
10773 ("const div = document.createElement('div'); div.setAttribute('id', 'd1'); const c = div.cloneNode(true); c.id === 'd1' && c !== div", "true"),
10774 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx !== null && ctx.canvas === cv", "true"),
10775 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.measureText('test').width > 0", "true"),
10776 ("const cv = document.createElement('canvas'); cv.toDataURL().startsWith('data:image/png;base64,')", "true"),
10777 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.lineWidth = 10; ctx.reset(); ctx.lineWidth === 1", "true"),
10778 ("const p = new Path2D('M10 10 H 90 V 90 H 10 Z'); typeof p.moveTo === 'function' && typeof p.roundRect === 'function'", "true"),
10779 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); const p = new Path2D('M 10 10 H 90 V 90 Z'); ctx.fill(p); ctx.stroke(p); ctx.clip(p); true", "true"),
10780 ("const p1 = new Path2D(); p1.rect(0, 0, 10, 10); const p2 = new Path2D(p1); p2.addPath(p1); typeof p2.closePath === 'function'", "true"),
10781 ("const div = document.createElement('div'); div.getRootNode() === div", "true"),
10782 ("const div = document.getElementById('tmpl'); div.getRootNode() === document", "true"),
10783 ("const el = document.createElement('div'); document.adoptNode(el) === el", "true"),
10784 ("const el = document.createElement('div'); document.importNode(el, true) !== null", "true"),
10785 ("ArrayBuffer.isView(new Uint8Array(5)) && !ArrayBuffer.isView(new ArrayBuffer(5))", "true"),
10786 ("Math.clamp(15, 0, 10) === 10 && Math.clamp(-5, 0, 10) === 0 && Math.clamp(5, 0, 10) === 5", "true"),
10787 ("const io = new IntersectionObserver(()=>{}); typeof io.takeRecords === 'function' && io.takeRecords().length === 0", "true"),
10788 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.fillStyle = 'red'; ctx.save(); ctx.fillStyle = 'blue'; ctx.restore(); ctx.fillStyle === 'red'", "true"),
10789 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.strokeStyle = 'green'; ctx.font = '24px serif'; ctx.save(); ctx.strokeStyle = 'purple'; ctx.font = '12px sans-serif'; ctx.restore(); ctx.strokeStyle === 'green' && ctx.font === '24px serif'", "true"),
10790 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); typeof ctx.strokeText === 'function'", "true"),
10791 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.imageSmoothingEnabled === true", "true"),
10792 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.imageSmoothingEnabled = false; ctx.imageSmoothingEnabled === false", "true"),
10793 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.imageSmoothingEnabled = false; ctx.save(); ctx.imageSmoothingEnabled = true; ctx.restore(); ctx.imageSmoothingEnabled === false", "true"),
10794 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); const g = ctx.createLinearGradient(0, 0, 100, 0); g.addColorStop(0, 'red'); g.addColorStop(1, 'blue'); ctx.fillStyle = g; typeof ctx.fillRect === 'function'", "true"),
10795 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); const g = ctx.createRadialGradient(50, 50, 0, 50, 50, 50); g.addColorStop(0, 'white'); g.addColorStop(1, 'black'); ctx.fillStyle = g; ctx.fillRect(0, 0, 100, 100); true", "true"),
10796 ];
10797 total += template_cases.len();
10798 for (src, expect) in template_cases {
10799 let mut rt = JsRuntime::new();
10800 rt.dom
10801 .borrow_mut()
10802 .build_from(&crate::os_lib::dom::parse_html(template_html));
10803 match rt.eval(src) {
10804 Ok(v) if &v.to_js_string() == expect => passed += 1,
10805 Ok(v) => crate::println!(
10806 "JS_SELFTEST FAIL: Template test `{}` => `{}` (want `{}`)",
10807 src,
10808 v.to_js_string(),
10809 expect
10810 ),
10811 Err(e) => crate::println!("JS_SELFTEST ERR: Template test `{}` => {}", src, e),
10812 }
10813 }
10814
10815 (passed, total)
10816}
10817
10818
10819
10820