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 ("Array.prototype[Symbol.unscopables].includes", "true"),
365 ("Array.prototype[Symbol.unscopables].at", "true"),
366 ("var x=0; await new Promise(r => setTimeout(() => { x = 5; r(); }, 0)); x", "5"),
368 ("var done=false; await new Promise(r => setTimeout(() => { done = true; r(); }, 0)); done", "true"),
369 ("await new Promise(res => setTimeout(() => res(7), 0))", "7"),
370 ("typeof requestAnimationFrame", "function"),
372 ("var x=0; await new Promise(r => requestAnimationFrame(() => { x = 5; r(); })); x", "5"),
373 ("var ty=''; await new Promise(r => requestAnimationFrame(t => { ty = typeof t; r(); })); ty", "number"),
374 ("var L=''; requestAnimationFrame(() => L+='a'); var id=requestAnimationFrame(() => L+='b'); cancelAnimationFrame(id); await new Promise(r => requestAnimationFrame(() => r())); L", "a"),
375 ("localStorage.clear(); localStorage.setItem('a','1'); localStorage.getItem('a')", "1"),
377 ("localStorage.clear(); localStorage.getItem('missing')", "null"),
378 ("localStorage.clear(); localStorage.setItem('x','9'); localStorage.length", "1"),
379 ("localStorage.clear(); localStorage.setItem('a','1'); localStorage.removeItem('a'); localStorage.getItem('a')", "null"),
380 ("localStorage.clear(); localStorage.foo='bar'; localStorage.getItem('foo')", "bar"),
381 ("sessionStorage.clear(); sessionStorage.setItem('s','2'); sessionStorage.getItem('s')", "2"),
382 (
385 "localStorage.clear(); localStorage.foo='bar'; delete localStorage.foo; localStorage.getItem('foo')",
386 "null",
387 ),
388 (
391 "localStorage.clear(); localStorage.setItem('a','1'); localStorage.setItem('b','2'); Object.keys(localStorage).sort().join(',')",
392 "a,b",
393 ),
394 (
395 "localStorage.clear(); localStorage.setItem('a','1'); localStorage.setItem('b','2'); Object.values(localStorage).sort().join(',')",
396 "1,2",
397 ),
398 (
399 "localStorage.clear(); localStorage.setItem('a','1'); Object.entries(localStorage)[0].join(':')",
400 "a:1",
401 ),
402 (
403 "localStorage.clear(); localStorage.setItem('a','1'); localStorage.setItem('b','2'); var out=[]; for (var k in localStorage) out.push(k); out.sort().join(',')",
404 "a,b",
405 ),
406 (
407 "localStorage.clear(); localStorage.setItem('a','1'); Object.assign({}, localStorage).a",
408 "1",
409 ),
410 (
414 "var e=document.createElement('div'); e.dataset.userId='42'; e.dataset.fooBar='x'; Object.keys(e.dataset).sort().join(',')",
415 "fooBar,userId",
416 ),
417 (
418 "var e=document.createElement('div'); e.dataset.a='1'; e.dataset.b='2'; Object.values(e.dataset).sort().join(',')",
419 "1,2",
420 ),
421 (
422 "var e=document.createElement('div'); e.dataset.a='1'; Object.entries(e.dataset)[0].join(':')",
423 "a:1",
424 ),
425 (
426 "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(',')",
427 "a,b",
428 ),
429 (
430 "var e=document.createElement('div'); e.dataset.a='1'; Object.assign({}, e.dataset).a",
431 "1",
432 ),
433 (
437 "function tag(s, ...v){ return s.join('|') + '::' + v.join(','); } tag`a${1}b${2}c`",
438 "a|b|c::1,2",
439 ),
440 (
441 "var o={ tag(s){ return this===o ? s[0] : 'bad'; } }; o.tag`hi`",
442 "hi",
443 ),
444 ("String.raw`a\\nb`", "a\\nb"),
445 ("String.raw`x${1+1}y`", "x2y"),
446 (
448 "function tag(s){ return s[0] + '|' + s.raw[0]; } tag`a\\nb`",
449 "a\nb|a\\nb",
450 ),
451 ("Object.is(NaN, NaN)", "true"),
454 ("NaN === NaN", "false"),
455 ("Object.is(0, -0)", "false"),
456 ("0 === -0", "true"),
457 ("Object.is(1, 1)", "true"),
458 ("Object.is('a', 'a')", "true"),
459 ("Object.is({}, {})", "false"),
460 (
463 "var o={}; var p={x:1}; Reflect.setPrototypeOf(o,p); o.x",
464 "1",
465 ),
466 ("var o={}; Reflect.isExtensible(o)", "true"),
467 (
468 "var o={}; Reflect.preventExtensions(o); Reflect.isExtensible(o)",
469 "false",
470 ),
471 (
472 "Reflect.getOwnPropertyDescriptor({x:1}, 'x').value",
473 "1",
474 ),
475 ("[1,2,3,4,5].fill(0,1,3).join(',')", "1,0,0,4,5"),
478 ("[1,2,3,4,5].fill(9).join(',')", "9,9,9,9,9"),
479 ("[1,2,3,4,5].fill(0,-2).join(',')", "1,2,3,0,0"),
480 ("[1,2,3].fill(0,1).join(',')", "1,0,0"),
481 ("[1,2,3,2,1].indexOf(2, 2)", "3"),
484 ("[1,2,3].indexOf(1, 1)", "-1"),
485 ("[1,2,3].indexOf(2, -2)", "1"),
486 ("[1,2,3].includes(1, 1)", "false"),
487 ("[1,2,3].includes(2, 1)", "true"),
488 ("[1,2,1,2,1].lastIndexOf(2, 2)", "1"),
490 ("[1,2,3].lastIndexOf(3, 1)", "-1"),
491 ("[1,2,3].lastIndexOf(1, -1)", "0"),
492 ("[1,2,3,2].lastIndexOf(2)", "3"),
493 ("[5,1,2].lastIndexOf(5, NaN)", "0"),
496 ("[5,1,2].lastIndexOf(1, NaN)", "-1"),
497 ("new URLSearchParams('a=1&b=2').get('a')", "1"),
499 ("new URLSearchParams('?a=1&b=2').get('b')", "2"),
500 ("new URLSearchParams('a=1&a=2').getAll('a').join(',')", "1,2"),
501 ("new URLSearchParams('a=1').has('a') + ',' + new URLSearchParams('a=1').has('z')", "true,false"),
502 ("var p=new URLSearchParams('a=1'); p.append('b','2'); p.toString()", "a=1&b=2"),
503 ("var p=new URLSearchParams('a=1&b=2'); p.delete('a'); p.toString()", "b=2"),
504 ("var p=new URLSearchParams('a=1'); p.set('a','9'); p.get('a')", "9"),
505 ("new URLSearchParams([['a','1'],['b','2']]).toString()", "a=1&b=2"),
509 ("new URLSearchParams({a:'1',b:'2'}).toString()", "a=1&b=2"),
510 (
511 "var p1=new URLSearchParams('a=1&b=2'); new URLSearchParams(p1).toString()",
512 "a=1&b=2",
513 ),
514 ("new URLSearchParams('a=hello%20world').get('a')", "hello world"),
516 ("new URLSearchParams('a=hello+world').get('a')", "hello world"),
517 ("var p=new URLSearchParams(); p.set('a','hello world'); p.toString()", "a=hello+world"),
518 ("var p=new URLSearchParams(); p.set('a','a&b=c'); p.get('a')", "a&b=c"),
519 (
522 "[...new URLSearchParams('a=1&b=2').entries()].map(e=>e[0]+':'+e[1]).join(',')",
523 "a:1,b:2",
524 ),
525 ("new URLSearchParams('a=1&b=2').keys().join(',')", "a,b"),
526 ("new URLSearchParams('a=1&b=2').values().join(',')", "1,2"),
527 (
528 "var s=''; new URLSearchParams('a=1&b=2').forEach(function(v,k){ s+=k+'='+v+';'; }); s",
529 "a=1;b=2;",
530 ),
531 (
534 "var out=[]; for (const [k,v] of new URLSearchParams('a=1&b=2')) out.push(k+':'+v); out.join(',')",
535 "a:1,b:2",
536 ),
537 (
538 "var fd=new FormData(); fd.set('x','9'); var out=[]; for (const [k,v] of fd) out.push(k+':'+v); out.join(',')",
539 "x:9",
540 ),
541 ("new URLPattern('/users/:id').test('/users/123')", "true"),
543 ("new URLPattern({ pathname: '/about' }).test('/about')", "true"),
544 ("new URLPattern('/users/:id').exec('/users/123').pathname.input", "/users/123"),
545 ("new URLPattern('/admin/*').test('/users/123')", "false"),
546 ("encodeURIComponent('hello world')", "hello%20world"),
548 ("encodeURIComponent('a=1&b=2')", "a%3D1%26b%3D2"),
549 ("decodeURIComponent('hello%20world')", "hello world"),
550 ("decodeURIComponent(encodeURIComponent('日本語'))", "日本語"),
551 ("encodeURIComponent(\"!'()*\")", "!'()*"),
552 ("encodeURI('https://example.com/a b?x=1&y=2')", "https://example.com/a%20b?x=1&y=2"),
554 ("decodeURI('https://example.com/a%20b')", "https://example.com/a b"),
555 ("escape('a b?c')", "a%20b%3Fc"),
557 ("unescape(escape('a b?c'))", "a b?c"),
558 ("escape('日')", "%u65E5"),
560 ("unescape('%u65E5')", "日"),
561 ("'hi'.bold()", "<b>hi</b>"),
563 ("'hi'.italics()", "<i>hi</i>"),
564 ("'hi'.big()", "<big>hi</big>"),
565 ("'hi'.small()", "<small>hi</small>"),
566 ("'hi'.strike()", "<strike>hi</strike>"),
567 ("'hi'.sub()", "<sub>hi</sub>"),
568 ("'hi'.sup()", "<sup>hi</sup>"),
569 ("'hi'.fixed()", "<tt>hi</tt>"),
570 ("'hi'.blink()", "<blink>hi</blink>"),
571 ("'hi'.anchor('top')", "<a name=\"top\">hi</a>"),
572 ("'hi'.link('x.html')", "<a href=\"x.html\">hi</a>"),
573 ("'hi'.fontcolor('red')", "<font color=\"red\">hi</font>"),
574 ("'hi'.fontsize(3)", "<font size=\"3\">hi</font>"),
575 ("'hi'.anchor('a\"b')", "<a name=\"a"b\">hi</a>"),
577 ("' hi '.trimLeft()", "hi "),
580 ("' hi '.trimRight()", " hi"),
581 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); f.get('a')", "1"),
583 ("var f=new FormData(); f.append('a','1'); f.append('a','2'); f.getAll('a').join(',')", "1,2"),
584 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); f.toString()", "a=1&b=2"),
585 ("var f=new FormData(); f.append('a','1'); f.set('a','9'); f.get('a')", "9"),
586 ("var f=new FormData(); f.append('a','1'); f.has('a')+','+f.has('z')", "true,false"),
587 ("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"),
588 ("var f=new FormData(); f.append('a','1'); f.append('b','2'); f.keys().join(',')", "a,b"),
589 ("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;"),
590 ("new URL('https://e.com/p?x=1#h').pathname", "/p"),
592 ("new URL('https://e.com/p?x=1').searchParams.get('x')", "1"),
593 ("new URL('/a/b', 'https://e.com/x/y').href", "https://e.com/a/b"),
599 ("new URL('c', 'https://e.com/a/b').href", "https://e.com/a/c"),
600 ("new URL('https://user:pass@example.com/p').hostname", "example.com"),
604 ("new URL('https://user:pass@example.com/p').username", "user"),
605 ("new URL('https://user:pass@example.com/p').password", "pass"),
606 ("new URL('https://user:pass@example.com/p').origin", "https://example.com"),
607 ("new URL('https://example.com/p').username", ""),
609 (
613 "var u=new URL('https://a.com/x'); u.href='https://b.com/y?z=1'; u.hostname",
614 "b.com",
615 ),
616 (
617 "var u=new URL('https://a.com/x'); u.href='https://b.com/y?z=1'; u.pathname",
618 "/y",
619 ),
620 (
621 "var u=new URL('https://a.com/x'); u.href='https://b.com/y?z=1'; u.searchParams.get('z')",
622 "1",
623 ),
624 (
625 "var u=new URL('https://a.com/x'); var u2=u; u.href='https://b.com/y'; u2.href",
628 "https://b.com/y",
629 ),
630 (
635 "var u=new URL('https://a.com/x'); u.pathname='y'; u.href",
636 "https://a.com/y",
637 ),
638 (
639 "var u=new URL('https://a.com/x'); u.search='z=1'; u.href",
640 "https://a.com/x?z=1",
641 ),
642 (
643 "var u=new URL('https://a.com/x'); u.search='z=1'; u.searchParams.get('z')",
644 "1",
645 ),
646 (
647 "var u=new URL('https://a.com/x?old=1'); u.search='new=2'; u.href",
648 "https://a.com/x?new=2",
649 ),
650 (
651 "var u=new URL('https://a.com/x'); u.hash='frag'; u.href",
652 "https://a.com/x#frag",
653 ),
654 (
655 "var u=new URL('https://a.com/x?y=1#z'); u.search=''; u.hash=''; u.href",
657 "https://a.com/x",
658 ),
659 (
664 "var u=new URL('https://a.com:8080/x'); u.hostname='b.com'; u.href",
665 "https://b.com:8080/x",
666 ),
667 (
668 "var u=new URL('https://a.com:8080/x'); u.hostname='b.com'; u.origin",
669 "https://b.com:8080",
670 ),
671 (
672 "var u=new URL('https://a.com/x'); u.port='9090'; u.host",
673 "a.com:9090",
674 ),
675 (
676 "var u=new URL('https://a.com:8080/x'); u.host='c.com:7070'; u.hostname + ',' + u.port",
677 "c.com,7070",
678 ),
679 (
680 "var u=new URL('http://a.com/x'); u.protocol='https'; u.href",
681 "https://a.com/x",
682 ),
683 ("new URL('?x=2', 'https://e.com/a/b?x=1').href", "https://e.com/a/b?x=2"),
687 ("new URL('#frag', 'https://e.com/a/b?x=1').href", "https://e.com/a/b?x=1#frag"),
688 ("new URL('//cdn.example.com/x.js', 'https://e.com/a/b').href", "https://cdn.example.com/x.js"),
692 ("URL.canParse('https://example.com')", "true"),
694 ("URL.canParse('not a url')", "false"),
695 ("URL.canParse('/path', 'https://example.com')", "true"),
696 ("URL.canParse('/path')", "false"),
697 ("URL.parse('https://example.com/p').pathname", "/p"),
700 ("URL.parse('not a url') === null", "true"),
701 ("URL.parse('/path', 'https://example.com').host", "example.com"),
702 ("URL.parse('/path') === null", "true"),
703 ("URL.createObjectURL(new Blob(['x'])).startsWith('blob:')", "true"),
705 (
707 "URL.createObjectURL(new Blob(['x'])) === URL.createObjectURL(new Blob(['x']))",
708 "false",
709 ),
710 ("typeof URL.revokeObjectURL('blob:x')", "undefined"),
711 ("new URLSearchParams('a=1&b=2').size", "2"),
713 (
714 "var p=new URLSearchParams('a=1'); p.append('b','2'); p.size",
715 "2",
716 ),
717 (
718 "var p=new URLSearchParams('a=1&b=2'); p.delete('a'); p.size",
719 "1",
720 ),
721 ("new URLSearchParams('').size", "0"),
722 ("new URLSearchParams('a=1&a=2').has('a', '1')", "true"),
725 ("new URLSearchParams('a=1&a=2').has('a', '9')", "false"),
726 (
727 "var p=new URLSearchParams('a=1&a=2'); p.delete('a','1'); p.getAll('a').join(',')",
728 "2",
729 ),
730 (
731 "var p=new URLSearchParams('a=1&a=2'); p.delete('a'); p.getAll('a').join(',')",
732 "",
733 ),
734 (
736 "var p=new URLSearchParams('c=3&a=1&b=2'); p.sort(); p.toString()",
737 "a=1&b=2&c=3",
738 ),
739 (
740 "var p=new URLSearchParams('b=2&a=1&a=0'); p.sort(); p.getAll('a').join(',')",
741 "1,0",
742 ),
743 (
746 "var u=new URL('https://e.com/p?x=1'); u.searchParams.set('x','9'); u.toString()",
747 "https://e.com/p?x=9",
748 ),
749 (
750 "var u=new URL('https://e.com/p'); u.searchParams.append('a','1'); u.searchParams.append('b','2'); u.toString()",
751 "https://e.com/p?a=1&b=2",
752 ),
753 (
754 "var u=new URL('https://e.com/p?x=1#h'); u.searchParams.delete('x'); u.toString()",
755 "https://e.com/p#h",
756 ),
757 (
761 "JSON.stringify({u: new URL('https://e.com/p?x=1')})",
762 "{\"u\":\"https://e.com/p?x=1\"}",
763 ),
764 ("btoa('hello')", "aGVsbG8="),
766 ("atob('aGVsbG8=')", "hello"),
767 ("atob(btoa('AtmOS roundtrip'))", "AtmOS roundtrip"),
768 ("navigator.platform", "AtmOS"),
770 ("typeof navigator.userAgent", "string"),
771 ("navigator.onLine", "true"),
772 ("navigator.cookieEnabled", "true"),
775 ("navigator.hardwareConcurrency", "4"),
776 ("navigator.maxTouchPoints", "0"),
777 ("navigator.languages[0]", "ja-JP"),
778 ("navigator.webdriver", "false"),
779 (
783 "navigator.userAgentData.brands[0].brand + ',' + navigator.userAgentData.mobile + ',' + \
784 navigator.userAgentData.platform",
785 "AtmOSBrowser,false,AtmOS",
786 ),
787 (
788 "await navigator.userAgentData.getHighEntropyValues(['architecture','bitness']).then(v => \
789 v.architecture + ',' + v.bitness + ',' + v.platform)",
790 "arm,64,AtmOS",
791 ),
792 (
797 "await navigator.storage.estimate().then(e => typeof e.usage + ',' + typeof e.quota)",
798 "number,number",
799 ),
800 ("await navigator.storage.persist()", "true"),
801 ("await navigator.storage.persisted()", "true"),
802 ("typeof performance.now()", "number"),
803 ("performance.mark('a').entryType", "mark"),
807 (
808 "performance.mark('s1'); performance.mark('e1'); \
809 performance.measure('m1','s1','e1').entryType",
810 "measure",
811 ),
812 ("typeof performance.timeOrigin", "number"),
817 ("performance.timeOrigin >= 0", "true"),
818 (
821 "performance.mark('ge1'); performance.getEntries().some(e => e.name === 'ge1')",
822 "true",
823 ),
824 ("performance.mark('a'); performance.getEntriesByType('mark').length > 0", "true"),
825 ("performance.mark('a'); performance.getEntriesByName('a', 'mark').length", "1"),
826 (
827 "performance.mark('to-clear'); performance.clearMarks('to-clear'); \
828 performance.getEntriesByName('to-clear').length",
829 "0",
830 ),
831 (
832 "performance.mark('sX'); performance.mark('eX'); \
833 performance.measure('mX','sX','eX'); performance.clearMeasures(); \
834 performance.getEntriesByType('measure').length",
835 "0",
836 ),
837 (
840 "let got; new PerformanceObserver((list) => { got = list.getEntries()[0].name; }) \
841 .observe({entryTypes:['mark']}); performance.mark('obs1'); got",
842 "obs1",
843 ),
844 (
845 "let n = 0; new PerformanceObserver((list) => { n += list.getEntries().length; }) \
846 .observe({entryTypes:['measure']}); performance.mark('s2'); \
847 performance.mark('e2'); performance.measure('m2','s2','e2'); n",
848 "1",
849 ),
850 (
851 "let hit = false; let ob = new PerformanceObserver(() => { hit = true; }); \
852 ob.observe({entryTypes:['mark']}); ob.disconnect(); performance.mark('after-disconnect'); hit",
853 "false",
854 ),
855 (
858 "PerformanceObserver.supportedEntryTypes.join(',')",
859 "mark,measure",
860 ),
861 (
866 "let got; new PerformanceObserver((list) => { got = list.getEntries()[0].name; }) \
867 .observe({type:'mark'}); performance.mark('obs2'); got",
868 "obs2",
869 ),
870 (
871 "performance.mark('pre-existing'); let got=null; \
872 new PerformanceObserver((list) => { got = list.getEntries()[0].name; }) \
873 .observe({type:'mark', buffered:true}); got",
874 "pre-existing",
875 ),
876 (
877 "let n=0; new PerformanceObserver((list) => { n += list.getEntries().length; }) \
878 .observe({type:'mark'}); n",
879 "0",
880 ),
881 (
884 "let mc = new MessageChannel(); let got; \
885 mc.port2.onmessage = e => { got = e.data; }; \
886 mc.port1.postMessage('hi'); got",
887 "hi",
888 ),
889 (
890 "let mc2 = new MessageChannel(); let n = 0; \
891 mc2.port2.addEventListener('message', e => { n += e.data; }); \
892 mc2.port1.postMessage(1); mc2.port1.postMessage(2); n",
893 "3",
894 ),
895 (
896 "let mc3 = new MessageChannel(); let hit = false; \
897 mc3.port2.onmessage = () => { hit = true; }; \
898 mc3.port2.close(); mc3.port1.postMessage('x'); hit",
899 "false",
900 ),
901 (
904 "let a1 = new BroadcastChannel('ch'); let b1 = new BroadcastChannel('ch'); \
905 let got; b1.onmessage = e => { got = e.data; }; \
906 a1.postMessage('hi'); got",
907 "hi",
908 ),
909 (
910 "let a2 = new BroadcastChannel('ch2'); let selfHit = false; \
911 a2.onmessage = () => { selfHit = true; }; \
912 a2.postMessage('x'); selfHit",
913 "false",
914 ),
915 (
916 "let a3 = new BroadcastChannel('chX'); let b3 = new BroadcastChannel('chY'); \
917 let hit = false; b3.onmessage = () => { hit = true; }; \
918 a3.postMessage('x'); hit",
919 "false",
920 ),
921 ("typeof screen.width", "number"),
925 ("screen.width === window.innerWidth", "true"),
926 ("screen.availHeight === screen.height", "true"),
927 ("screen.colorDepth", "24"),
928 ("screen.orientation.type", "landscape-primary"),
929 ("window.screen === screen", "true"),
930 (
933 "typeof screen.orientation.lock('portrait-primary').then",
934 "function",
935 ),
936 (
937 "screen.orientation.lock('portrait-primary'); screen.orientation.type",
938 "portrait-primary",
939 ),
940 (
941 "screen.orientation.lock('portrait-primary'); screen.orientation.unlock(); \
942 screen.orientation.type",
943 "landscape-primary",
944 ),
945 (
949 "let got; window.onerror = (msg) => { got = msg; }; \
950 reportError(new Error('boom')); got",
951 "boom",
952 ),
953 (
954 "let ev; window.addEventListener('error', e => { ev = e; }); \
955 reportError(new Error('e2')); ev.error.message",
956 "e2",
957 ),
958 ("typeof reportError('plain string')", "undefined"),
959 ("confirm('are you sure?')", "true"),
965 ("window.confirm('are you sure?')", "true"),
966 ("prompt('name?', 'bob')", "bob"),
967 ("window.prompt('name?')", "null"),
968 ("typeof open", "function"),
973 ("open('https://example.com')", "null"),
974 ("window.open('https://example.com', '_blank')", "null"),
975 ("typeof close", "function"),
976 ("close(); window.close(); 'ok'", "ok"),
977 ("typeof stop", "function"),
981 ("stop(); window.stop(); 'ok'", "ok"),
982 ("typeof focus", "function"),
983 ("focus(); window.focus(); blur(); window.blur(); 'ok'", "ok"),
984 ("typeof window.getSelection", "function"),
991 ("typeof getSelection", "function"),
992 ("window.getSelection().toString()", ""),
993 ("self === window", "true"),
999 ("window.top === window", "true"),
1000 ("parent === window", "true"),
1001 ("window.frames === window", "true"),
1002 ("typeof window.name", "string"),
1003 (
1007 "document.createElement('iframe').contentWindow === window",
1008 "true",
1009 ),
1010 (
1011 "document.createElement('iframe').contentDocument === document",
1012 "true",
1013 ),
1014 (
1015 "document.createElement('div').contentWindow",
1016 "undefined",
1017 ),
1018 (
1022 "document.createElement('object').contentDocument === document",
1023 "true",
1024 ),
1025 (
1026 "document.createElement('object').contentWindow",
1027 "undefined",
1028 ),
1029 ("typeof navigator.sendBeacon", "function"),
1033 ("navigator.sendBeacon('data:,x')", "true"),
1034 ("navigator.sendBeacon('data:,x', 'payload')", "true"),
1035 (
1038 "var e=document.createElement('div'); e.setAttribute('id','x'); \
1039 e.setAttribute('class','a b'); e.innerHTML='hi2'; \
1040 new XMLSerializer().serializeToString(e) === e.outerHTML",
1041 "true",
1042 ),
1043 (
1044 "var e=document.createElement('span'); e.textContent='z'; \
1045 new XMLSerializer().serializeToString(e) === e.outerHTML",
1046 "true",
1047 ),
1048 ("typeof new XMLSerializer().serializeToString", "function"),
1049 (
1053 "await navigator.clipboard.writeText('hello'); await navigator.clipboard.readText()",
1054 "hello",
1055 ),
1056 ("typeof navigator.clipboard.writeText('x')", "object"),
1057 ("[10,20,30].at(-1)", "30"),
1059 ("[10,20,30].at(0)", "10"),
1060 ("[1,2,3].flatMap(x => [x, x*10]).join(',')", "1,10,2,20,3,30"),
1061 ("[1,2,3,4].findLast(x => x % 2 === 1)", "3"),
1062 ("[1,2,3,4].findLastIndex(x => x % 2 === 0)", "3"),
1063 ("'hello'.at(-1)", "o"),
1065 ("'hello'.at(1)", "e"),
1066 ("'hello world'.includes('world')", "true"),
1068 ("'hello'.startsWith('he')", "true"),
1069 ("'hello'.endsWith('lo')", "true"),
1070 (
1075 "try { 'x'.includes(/x/); 'no-throw' } catch(e) { 'threw' }",
1076 "threw",
1077 ),
1078 (
1079 "try { 'x'.startsWith(/x/); 'no-throw' } catch(e) { 'threw' }",
1080 "threw",
1081 ),
1082 (
1083 "try { 'x'.endsWith(/x/); 'no-throw' } catch(e) { 'threw' }",
1084 "threw",
1085 ),
1086 ("(await Promise.allSettled([Promise.resolve(1), Promise.reject('e')])).map(r => r.status).join(',')", "fulfilled,rejected"),
1088 ("await Promise.race([Promise.resolve('first'), Promise.resolve('second')])", "first"),
1089 ("await Promise.any([Promise.reject('x'), Promise.resolve('ok')])", "ok"),
1090 (
1093 "(await Promise.allSettled([{ then(r){ r(1); } }, { then(_,rj){ rj('e'); } }])).map(r => r.status).join(',')",
1094 "fulfilled,rejected",
1095 ),
1096 (
1097 "await Promise.race([{ then(r){ r('first'); } }, Promise.resolve('second')])",
1098 "first",
1099 ),
1100 (
1101 "await Promise.any([{ then(_,rj){ rj('x'); } }, { then(r){ r('ok'); } }])",
1102 "ok",
1103 ),
1104 ("new TextEncoder().encode('Hi').join(',')", "72,105"),
1106 ("new TextDecoder().decode([72,105])", "Hi"),
1107 ("new TextDecoder().decode(new TextEncoder().encode('AtmOS'))", "AtmOS"),
1108 ("new TextDecoder('utf-16le').encoding", "utf-16le"),
1111 ("new TextDecoder('utf-16be').encoding", "utf-16be"),
1112 ("new TextDecoder('utf-16le').decode([0x48,0x00,0x69,0x00])", "Hi"),
1114 ("new TextDecoder('utf-16be').decode([0x00,0x48,0x00,0x69])", "Hi"),
1115 ("new TextDecoder('utf-16').encoding", "utf-16le"),
1116 (
1121 "var d=new TextDecoder(); d.decode(new Uint8Array([0xE2,0x82]), {stream:true}) + \
1122 d.decode(new Uint8Array([0xAC]))",
1123 "€",
1124 ),
1125 ("new TextDecoder().decode(new Uint8Array([0xE2,0x82]))", "\u{FFFD}"),
1128 ("crypto.randomUUID().length", "36"),
1130 ("crypto.randomUUID().charAt(14)", "4"),
1131 ("crypto.getRandomValues([0,0,0]).length", "3"),
1132 (
1137 "crypto.getRandomValues(new Uint16Array(200)).some(v => v > 255)",
1138 "true",
1139 ),
1140 (
1142 "crypto.getRandomValues(new Uint8Array(50)).every(v => v >= 0 && v <= 255)",
1143 "true",
1144 ),
1145 ("var o={a:{b:1}}; var c=structuredClone(o); o.a.b=9; c.a.b", "1"),
1147 ("structuredClone([1,[2,3]])[1][0]", "2"),
1148 (
1154 "var c=structuredClone(new TypeError('x')); c instanceof Error && c instanceof TypeError",
1155 "true",
1156 ),
1157 ("structuredClone(new Error('boom')).message", "boom"),
1158 ("structuredClone(new TypeError('x')).stack", "TypeError: x"),
1159 (
1164 "try { structuredClone(function(){}); 'no-throw' } catch(e) { e.name }",
1165 "DataCloneError",
1166 ),
1167 (
1168 "try { structuredClone({fn: () => 1}); 'no-throw' } catch(e) { e.name }",
1169 "DataCloneError",
1170 ),
1171 ("structuredClone({a: 1, b: [2, 3]}).a", "1"),
1172 (
1180 "try { structuredClone(new URLSearchParams('a=1')); 'no-throw' } catch(e) { e.name }",
1181 "DataCloneError",
1182 ),
1183 (
1184 "try { structuredClone(new FormData()); 'no-throw' } catch(e) { e.name }",
1185 "DataCloneError",
1186 ),
1187 (
1188 "try { structuredClone(new Headers()); 'no-throw' } catch(e) { e.name }",
1189 "DataCloneError",
1190 ),
1191 (
1195 "try { structuredClone(Promise.resolve(1)); 'no-throw' } catch(e) { e.name }",
1196 "DataCloneError",
1197 ),
1198 (
1204 "try { structuredClone(new WeakMap()); 'no-throw' } catch(e) { e.name }",
1205 "DataCloneError",
1206 ),
1207 (
1208 "try { structuredClone(new WeakSet()); 'no-throw' } catch(e) { e.name }",
1209 "DataCloneError",
1210 ),
1211 (
1217 "try { structuredClone(new AbortController()); 'no-throw' } catch(e) { e.name }",
1218 "DataCloneError",
1219 ),
1220 (
1221 "try { structuredClone(new AbortController().signal); 'no-throw' } catch(e) { e.name }",
1222 "DataCloneError",
1223 ),
1224 (
1225 "try { structuredClone(new MessageChannel()); 'no-throw' } catch(e) { e.name }",
1226 "DataCloneError",
1227 ),
1228 (
1229 "try { structuredClone(new MessageChannel().port1); 'no-throw' } catch(e) { e.name }",
1230 "DataCloneError",
1231 ),
1232 (
1235 "var m=new Map([['a',1],['b',2]]); var c=structuredClone(m); m.set('a',99); c.get('a')+','+c.get('b')+','+c.size",
1236 "1,2,2",
1237 ),
1238 (
1239 "var s=new Set([1,2,3]); var c=structuredClone(s); s.add(4); c.has(4)+','+c.size",
1240 "false,3",
1241 ),
1242 ("var a=new Int8Array([200,-100]); var c=structuredClone(a); c.join(',')", "-56,-100"),
1247 (
1248 "var a=new Int8Array(1); var c=structuredClone(a); c.BYTES_PER_ELEMENT",
1249 "1",
1250 ),
1251 ("var a=new Int8Array(1); var c=structuredClone(a); c[0]=200; c[0]", "-56"),
1252 (
1253 "var a=new Int8Array([1,2]); var c=structuredClone(a); a[0]=9; c[0]",
1254 "1",
1255 ),
1256 (
1260 "var b=new ArrayBuffer(4); var c=structuredClone(b,{transfer:[b]}); b.detached+','+c.byteLength",
1261 "true,4",
1262 ),
1263 (
1268 "var b=new Blob(['hi']); var c=structuredClone(b); await c.text()",
1269 "hi",
1270 ),
1271 ("var b=new Blob(['hi']); var c=structuredClone(b); c.size", "2"),
1272 (
1273 "var dv=new DataView(new ArrayBuffer(1)); dv.setUint8(0,65); var c=structuredClone(dv); c.getUint8(0)",
1274 "65",
1275 ),
1276 (
1279 "var buf=new ArrayBuffer(4); var c=structuredClone(buf); c.byteLength",
1280 "4",
1281 ),
1282 (
1283 "var buf=new ArrayBuffer(4); var c=structuredClone(buf); typeof c.slice",
1284 "function",
1285 ),
1286 (
1292 "var p=new Proxy({a:1,b:2},{}); var c=structuredClone(p); c.a+','+c.b",
1293 "1,2",
1294 ),
1295 (
1296 "var t={a:1}; var p=new Proxy(t,{}); var c=structuredClone(p); t.a=99; c.a",
1297 "1",
1298 ),
1299 (
1300 "var buf = await new Blob(['A']).arrayBuffer(); var c=structuredClone(buf); new DataView(c).getUint8(0)",
1301 "65",
1302 ),
1303 ("Object.fromEntries([['a',1],['b',2]]).b", "2"),
1305 ("Object.getOwnPropertyNames({x:1,y:2}).join(',')", "x,y"),
1306 ("var o=Object.freeze({a:1}); o.a", "1"),
1307 ("Number.isInteger(5)", "true"),
1309 ("Number.isInteger(5.5)", "false"),
1310 ("Number.isInteger('5')", "false"),
1311 ("Number.isSafeInteger(9007199254740991)", "true"),
1312 ("Number.MAX_SAFE_INTEGER", "9007199254740991"),
1313 ("Number.isNaN(NaN) + ',' + Number.isNaN(5)", "true,false"),
1314 ("Number.MIN_VALUE > 0", "true"),
1318 ("Number.MIN_VALUE < Number.EPSILON", "true"),
1319 ("Number.isNaN(Number.NaN)", "true"),
1320 ("Math.hypot(3,4)", "5"),
1322 ("Math.log2(8)", "3"),
1323 ("Math.round(Math.log10(1000))", "3"),
1324 ("Math.round(Math.cbrt(27))", "3"),
1325 ("Math.atan2(0,5)", "0"),
1326 ("Math.fround(1.5)", "1.5"),
1328 ("Math.fround(1.1) !== 1.1", "true"),
1329 ("Math.f16round(1.5)", "1.5"),
1330 ("Math.f16round(1.337) !== 1.337", "true"),
1331 ("Math.sumPrecise([1, 2, 3])", "6"),
1332 ("Math.sumPrecise([0.1, 0.2])", "0.30000000000000004"),
1333 ("Math.sumPrecise([1, Infinity])", "Infinity"),
1334 ("isNaN(Math.sumPrecise([Infinity, -Infinity]))", "true"),
1335 ("isNaN(Math.sumPrecise([1, NaN]))", "true"),
1336 ("new Headers({'Set-Cookie':'a=1'}).getSetCookie().join(',')", "a=1"),
1337 ("var h=new Headers(); h.append('Set-Cookie','a=1'); h.append('Set-Cookie','b=2'); h.getSetCookie().join('; ')", "a=1; b=2"),
1338 ("Math.clz32(1)", "31"),
1339 ("Math.clz32(0)", "32"),
1340 ("Math.clz32(1000)", "22"),
1341 ("Math.imul(3,4)", "12"),
1342 ("Math.imul(0xffffffff, 5)", "-5"),
1343 ("Math.round(Math.sinh(0))", "0"),
1344 ("Math.cosh(0)", "1"),
1345 ("Math.tanh(0)", "0"),
1346 ("Math.asinh(0)", "0"),
1347 ("Math.acosh(1)", "0"),
1348 ("Math.atanh(0)", "0"),
1349 ("Math.round(Math.expm1(0))", "0"),
1350 ("Math.log1p(0)", "0"),
1351 ("Math.round(Math.LN2*1000)", "693"),
1352 ("Math.round(Math.LN10*1000)", "2303"),
1353 ("Math.round(Math.SQRT2*1000)", "1414"),
1354 ("Math.round(Math.SQRT1_2*1000)", "707"),
1355 ("var c=new AbortController(); var b=c.signal.aborted; c.abort(); b+','+c.signal.aborted", "false,true"),
1357 (
1360 "var c=new AbortController(); var fired=false; c.signal.addEventListener('abort', function(){fired=true;}); c.abort(); fired",
1361 "true",
1362 ),
1363 ("var c=new AbortController(); c.abort(); c.signal.reason.name", "AbortError"),
1364 ("var c=new AbortController(); c.abort('custom'); c.signal.reason", "custom"),
1365 (
1367 "var c=new AbortController(); var n=0; c.signal.addEventListener('abort', function(){n++;}); c.abort(); c.abort(); n",
1368 "1",
1369 ),
1370 ("AbortSignal.abort().aborted", "true"),
1373 ("AbortSignal.abort('why').reason", "why"),
1374 ("AbortSignal.abort().reason.name", "AbortError"),
1375 ("new DOMException('boom', 'NotFoundError').message", "boom"),
1378 ("new DOMException('boom', 'NotFoundError').name", "NotFoundError"),
1379 ("new DOMException('boom', 'NotFoundError').code", "8"),
1380 ("DOMException.NOT_FOUND_ERR", "8"),
1381 ("new DOMException().name", "Error"),
1382 ("new DOMException('x', 'CustomError').code", "0"),
1383 ("AbortSignal.abort().reason.code", "20"),
1386 (
1389 "var c=new AbortController(); var n=0; var fn=function(){n++;}; c.signal.addEventListener('abort', fn); c.signal.removeEventListener('abort', fn); c.abort(); n",
1390 "0",
1391 ),
1392 (
1393 "var c=new AbortController(); var n=0; c.signal.addEventListener('abort', function(){n++;}); c.signal.removeEventListener('abort', function(){}); c.abort(); n",
1394 "1",
1395 ),
1396 (
1398 "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",
1399 "false,true,two",
1400 ),
1401 (
1402 "var c1=new AbortController(); c1.abort('already'); AbortSignal.any([c1.signal]).reason",
1403 "already",
1404 ),
1405 ("var c=new AbortController(); c.signal.throwIfAborted()", "undefined"),
1407 (
1409 "var c=new AbortController(); c.abort('boom'); \
1410 var caught; try { c.signal.throwIfAborted(); } catch (e) { caught = e; } caught",
1411 "boom",
1412 ),
1413 (
1417 "var t=new EventTarget(); var log=''; t.addEventListener('x', ()=>log+='a'); t.addEventListener('x', ()=>log+='b'); t.dispatchEvent(new Event('x')); log",
1418 "ab",
1419 ),
1420 (
1421 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn); t.addEventListener('x', fn); t.dispatchEvent(new Event('x')); n",
1422 "1",
1423 ),
1424 (
1425 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn); t.removeEventListener('x', fn); t.dispatchEvent(new Event('x')); n",
1426 "0",
1427 ),
1428 (
1434 "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",
1435 "2",
1436 ),
1437 (
1440 "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",
1441 "1",
1442 ),
1443 (
1447 "var t=new EventTarget(); var c=new AbortController(); var n=0; \
1448 t.addEventListener('x', ()=>n++, {signal: c.signal}); \
1449 t.dispatchEvent(new Event('x')); c.abort(); t.dispatchEvent(new Event('x')); n",
1450 "1",
1451 ),
1452 (
1454 "var t=new EventTarget(); var c=new AbortController(); c.abort(); var n=0; \
1455 t.addEventListener('x', ()=>n++, {signal: c.signal}); \
1456 t.dispatchEvent(new Event('x')); n",
1457 "0",
1458 ),
1459 (
1461 "var el=document.createElement('div'); var c=new AbortController(); var n=0; \
1462 el.addEventListener('click', ()=>n++, {signal: c.signal}); \
1463 el.click(); c.abort(); el.click(); n",
1464 "1",
1465 ),
1466 (
1469 "var t=new EventTarget(); t.addEventListener('x', e => e.preventDefault()); t.dispatchEvent(new Event('x', {cancelable:true}))",
1470 "false",
1471 ),
1472 (
1473 "var t=new EventTarget(); t.addEventListener('x', e => e.preventDefault()); t.dispatchEvent(new Event('x'))",
1474 "true",
1475 ),
1476 (
1479 "var t=new EventTarget(); var r; t.addEventListener('x', e => { r = e.isTrusted; }); t.dispatchEvent(new Event('x')); r",
1480 "false",
1481 ),
1482 ("new Event('x', {composed: true}).composed", "true"),
1486 ("new Event('x').composed", "false"),
1487 (
1488 "new CustomEvent('x', {detail: 1, composed: true}).composed",
1489 "true",
1490 ),
1491 (
1495 "var t=new EventTarget(); var log=''; \
1496 t.addEventListener('x', e => { log+='a'; e.stopImmediatePropagation(); }); \
1497 t.addEventListener('x', () => { log+='b'; }); \
1498 t.dispatchEvent(new Event('x')); log",
1499 "a",
1500 ),
1501 (
1504 "var t=new EventTarget(); var n=0; t.addEventListener('x', ()=>n++, {once:true}); \
1505 t.dispatchEvent(new Event('x')); t.dispatchEvent(new Event('x')); n",
1506 "1",
1507 ),
1508 (
1510 "var t=new EventTarget(); var n=0; var fn=()=>n++; t.addEventListener('x', fn, {once:true}); \
1511 t.removeEventListener('x', fn); t.dispatchEvent(new Event('x')); n",
1512 "0",
1513 ),
1514 (
1517 "var t=new EventTarget(); var p; t.addEventListener('x', e => { p = e.composedPath(); }); \
1518 t.dispatchEvent(new Event('x')); p.length === 1 && p[0] === t",
1519 "true",
1520 ),
1521 ("new CustomEvent('x').composedPath().length", "0"),
1523 ("new KeyboardEvent('keydown', {key:'a', code:'KeyA'}).key", "a"),
1527 ("new KeyboardEvent('keydown', {key:'a', code:'KeyA'}).code", "KeyA"),
1528 (
1529 "var t=new EventTarget(); var got; \
1530 t.addEventListener('keydown', e => { got = e.ctrlKey + ':' + e.key; }); \
1531 t.dispatchEvent(new KeyboardEvent('keydown', {key:'Enter', ctrlKey:true})); got",
1532 "true:Enter",
1533 ),
1534 ("new MouseEvent('click', {clientX:10, clientY:20}).clientX", "10"),
1535 (
1536 "var t=new EventTarget(); var got; \
1537 t.addEventListener('click', e => { got = e.clientY + ':' + e.button; }); \
1538 t.dispatchEvent(new MouseEvent('click', {clientY:5, button:2})); got",
1539 "5:2",
1540 ),
1541 ("new MouseEvent('click').bubbles", "false"),
1542 ("new MouseEvent('click', {bubbles:true}).bubbles", "true"),
1543 ("new WheelEvent('wheel', {deltaY:100}).deltaY", "100"),
1546 ("new WheelEvent('wheel', {deltaY:1, clientX:5}).clientX", "5"),
1547 ("new WheelEvent('wheel').deltaMode", "0"),
1548 ("new FocusEvent('focusout', {relatedTarget: null}).relatedTarget === null", "true"),
1549 (
1550 "var t=new EventTarget(); var r=new EventTarget(); var got; \
1551 t.addEventListener('focusout', e => { got = e.relatedTarget; }); \
1552 t.dispatchEvent(new FocusEvent('focusout', {relatedTarget: r})); got === r",
1553 "true",
1554 ),
1555 ("new Touch({identifier:1, clientX:10, clientY:20}).clientX", "10"),
1559 ("new Touch({}).force", "1"),
1560 (
1561 "var t=new Touch({identifier:1}); \
1562 new TouchEvent('touchstart', {touches:[t], changedTouches:[t]}).touches[0] === t",
1563 "true",
1564 ),
1565 ("new CommandEvent('command', {command:'show-modal'}).command", "show-modal"),
1567 ("new CommandEvent('command', {source:null}).source === null", "true"),
1568 ("new ToggleEvent('toggle', {oldState:'closed', newState:'open'}).newState", "open"),
1569 ("new ToggleEvent('toggle').oldState", "closed"),
1570 ("new FormDataEvent('formdata', {formData:null}).formData === null", "true"),
1571
1572 ("new TouchEvent('touchend').changedTouches.length", "0"),
1573 (
1576 "new HashChangeEvent('hashchange', {oldURL:'a', newURL:'b'}).oldURL + ',' + \
1577 new HashChangeEvent('hashchange', {oldURL:'a', newURL:'b'}).newURL",
1578 "a,b",
1579 ),
1580 (
1581 "new HashChangeEvent('hashchange').type",
1582 "hashchange",
1583 ),
1584 (
1585 "new PageTransitionEvent('pageshow', {persisted:true}).persisted",
1586 "true",
1587 ),
1588 (
1592 "new PopStateEvent('popstate', {state:{a:1}}).state.a",
1593 "1",
1594 ),
1595 ("new PopStateEvent('popstate').state", "null"),
1596 (
1597 "var got=null; window.addEventListener('popstate', e => got = e.state); \
1598 window.dispatchEvent(new PopStateEvent('popstate', {state:'s'})); got",
1599 "s",
1600 ),
1601 (
1605 "var r=new DOMRect(10,20,30,40); \
1606 [r.x,r.y,r.width,r.height,r.left,r.top,r.right,r.bottom].join(',')",
1607 "10,20,30,40,10,20,40,60",
1608 ),
1609 ("new DOMRect().width", "0"),
1610 ("new DOMRectReadOnly(1,2,3,4).right", "4"),
1611 ("JSON.stringify(new DOMRect(1,2,3,4).toJSON()).includes('\"width\":3')", "true"),
1612 (
1614 "var p=new DOMPoint(1,2); p.x+','+p.y+','+p.z+','+p.w",
1615 "1,2,0,1",
1616 ),
1617 ("new DOMPoint(1,2,3,4).w", "4"),
1618 ("new DOMPointReadOnly().x", "0"),
1619 ("JSON.stringify(new DOMPoint(1,2).toJSON()).includes('\"y\":2')", "true"),
1620 ("new DOMPoint(10, 20).matrixTransform(new DOMMatrix().translate(5, 5)).x", "15"),
1621 ("new DOMMatrix().isIdentity", "true"),
1622 ("new DOMMatrix().is2D", "true"),
1623 ("new DOMMatrix([1,0,0,1,10,20]).toString()", "matrix(1, 0, 0, 1, 10, 20)"),
1624 ("new DOMMatrix().translate(10, 20).e", "10"),
1625 ("new DOMMatrix().scale(2, 3).d", "3"),
1626 ("DOMMatrix.fromFloat32Array(new Float32Array([1,0,0,1,10,20])).e", "10"),
1627 ("new DOMMatrix().rotate(90).b", "1"),
1628 ("new DOMMatrix([1,0,0,1,10,20]).invert().e", "-10"),
1629 ("new DOMMatrix().translateSelf(10, 20).e", "10"),
1630 ("new DOMMatrix().rotateSelf(90).b", "1"),
1631 ("new DOMMatrix().scaleSelf(2, 3).d", "3"),
1632 ("new DOMMatrix([1,0,0,1,10,20]).invertSelf().e", "-10"),
1633 ("DOMQuad.fromRect(new DOMRect(10, 20, 30, 40)).getBounds().width", "30"),
1634 ("DOMRect.fromRect({x: 5, y: 10, width: 15, height: 20}).width", "15"),
1635 ("DOMPoint.fromPoint({x: 3, y: 4, z: 5, w: 1}).z", "5"),
1636 ("'가'.normalize('NFD').normalize('NFC')", "가"),
1637
1638 (
1641 "var got=null; window.addEventListener('hashchange', e => got = e.newURL); \
1642 window.dispatchEvent(new HashChangeEvent('hashchange', {newURL:'x'})); got",
1643 "x",
1644 ),
1645 (
1646 "window.dispatchEvent(new Event('unknown-type'))",
1647 "true",
1648 ),
1649 (
1653 "var n=0; window.onhashchange = () => n++; \
1654 window.dispatchEvent(new HashChangeEvent('hashchange')); n",
1655 "1",
1656 ),
1657 (
1658 "var order=[]; window.onresize = () => order.push('on'); \
1659 window.addEventListener('resize', () => order.push('listener')); \
1660 window.dispatchEvent(new Event('resize')); order.join(',')",
1661 "on,listener",
1662 ),
1663 (
1667 "var n=0; var cb = () => n++; window.addEventListener('resize', cb); \
1668 window.removeEventListener('resize', cb); \
1669 window.dispatchEvent(new Event('resize')); n",
1670 "0",
1671 ),
1672 (
1673 "var log=[]; var cb1 = () => log.push('1'); var cb2 = () => log.push('2'); \
1674 window.addEventListener('resize', cb1); window.addEventListener('resize', cb2); \
1675 window.removeEventListener('resize', cb1); \
1676 window.dispatchEvent(new Event('resize')); log.join(',')",
1677 "2",
1678 ),
1679 (
1684 "typeof document.removeEventListener",
1685 "function",
1686 ),
1687 (
1688 "var n=0; var cb = () => n++; document.addEventListener('hashchange', cb); \
1689 document.removeEventListener('hashchange', cb); \
1690 window.dispatchEvent(new Event('hashchange')); n",
1691 "0",
1692 ),
1693 (
1696 "var got=null; document.addEventListener('hashchange', e => got = e.newURL); \
1697 document.dispatchEvent(new HashChangeEvent('hashchange', {newURL:'y'})); got",
1698 "y",
1699 ),
1700 (
1706 "window.addEventListener('resize', e => e.preventDefault()); \
1707 window.dispatchEvent(new Event('resize', {cancelable:true}))",
1708 "false",
1709 ),
1710 (
1711 "document.addEventListener('scroll', e => e.preventDefault()); \
1712 document.dispatchEvent(new Event('scroll', {cancelable:true}))",
1713 "false",
1714 ),
1715 (
1717 "window.addEventListener('popstate', () => {}); \
1718 window.dispatchEvent(new Event('popstate'))",
1719 "true",
1720 ),
1721 (
1725 "var t='none'; window.addEventListener('message', e => t = (e.target === window)); \
1726 window.dispatchEvent(new Event('message')); t",
1727 "true",
1728 ),
1729 (
1735 "var got=''; window.onerror = (msg, src, line, col) => { got = msg+'|'+src+'|'+line+'|'+col; }; \
1736 window.dispatchEvent(new ErrorEvent('error', {message:'boom', filename:'a.js', lineno:3, colno:7})); got",
1737 "boom|a.js|3|7",
1738 ),
1739 (
1742 "var n=0; window.addEventListener('online', () => n++); \
1743 window.dispatchEvent(new Event('online')); n",
1744 "1",
1745 ),
1746 (
1747 "var n=0; var cb = () => n++; window.addEventListener('offline', cb); \
1748 window.removeEventListener('offline', cb); \
1749 window.dispatchEvent(new Event('offline')); n",
1750 "0",
1751 ),
1752 (
1755 "var log=[]; \
1756 window.addEventListener('beforeunload', () => log.push('bu')); \
1757 window.addEventListener('unload', () => log.push('u')); \
1758 window.addEventListener('pageshow', () => log.push('ps')); \
1759 window.addEventListener('pagehide', () => log.push('ph')); \
1760 document.addEventListener('visibilitychange', () => log.push('vc')); \
1761 window.addEventListener('languagechange', () => log.push('lc')); \
1762 window.dispatchEvent(new Event('beforeunload')); \
1763 window.dispatchEvent(new Event('unload')); \
1764 window.dispatchEvent(new Event('pageshow')); \
1765 window.dispatchEvent(new Event('pagehide')); \
1766 document.dispatchEvent(new Event('visibilitychange')); \
1767 window.dispatchEvent(new Event('languagechange')); \
1768 log.join(',')",
1769 "bu,u,ps,ph,vc,lc",
1770 ),
1771 ("document.visibilityState", "visible"),
1774 ("document.hidden", "false"),
1775 ("document.characterSet", "UTF-8"),
1778 ("document.compatMode", "CSS1Compat"),
1779 ("document.contentType", "text/html"),
1780 ("document.doctype", "null"),
1781 ("document.currentScript", "null"),
1785 ("document.implementation.hasFeature('x','1.0')", "true"),
1790 (
1791 "var dt=document.implementation.createDocumentType('html',' ',''); dt.name+','+dt.nodeType",
1792 "html,10",
1793 ),
1794 (
1795 "var doc=document.implementation.createHTMLDocument('MyDoc'); doc.title+','+doc.nodeType",
1796 "MyDoc,9",
1797 ),
1798 (
1799 "var doc=document.implementation.createDocument('http://www.w3.org/1999/xhtml','html'); doc.qualifiedName+','+doc.nodeType",
1800 "html,9",
1801 ),
1802 (
1805 "var got=null; window.addEventListener('storage', e => got = e.key); \
1806 window.dispatchEvent(new StorageEvent('storage', {key:'k'})); got",
1807 "k",
1808 ),
1809 (
1813 "var n=0; document.addEventListener('readystatechange', () => n++); n",
1814 "1",
1815 ),
1816 ("window.print(); true", "true"),
1819 (
1820 "var log=[]; \
1821 window.addEventListener('beforeprint', () => log.push('bp')); \
1822 window.addEventListener('afterprint', () => log.push('ap')); \
1823 window.dispatchEvent(new Event('beforeprint')); \
1824 window.dispatchEvent(new Event('afterprint')); \
1825 log.join(',')",
1826 "bp,ap",
1827 ),
1828 ("new PointerEvent('pointerdown', {pointerId:7, pointerType:'touch'}).pointerId", "7"),
1831 ("new PointerEvent('pointerdown', {pointerType:'touch', clientX:9}).clientX", "9"),
1832 ("new PointerEvent('pointerdown').isPrimary", "false"),
1833 ("new PointerEvent('pointerdown', {isPrimary:true}).width", "1"),
1834 ("new InputEvent('input', {data:'a', inputType:'insertText'}).data", "a"),
1835 ("new InputEvent('input', {data:'a', inputType:'insertText'}).inputType", "insertText"),
1836 ("new InputEvent('beforeinput').isComposing", "false"),
1837 (
1840 "var e=document.createElement('div'); e.hasPointerCapture(1)",
1841 "false",
1842 ),
1843 (
1844 "var e=document.createElement('div'); e.setPointerCapture(1); e.hasPointerCapture(1)",
1845 "true",
1846 ),
1847 (
1848 "var e=document.createElement('div'); e.setPointerCapture(1); \
1849 e.releasePointerCapture(1); e.hasPointerCapture(1)",
1850 "false",
1851 ),
1852 (
1854 "var e=document.createElement('div'); e.setPointerCapture(1); e.hasPointerCapture(2)",
1855 "false",
1856 ),
1857 ("new ProgressEvent('progress', {loaded:50, total:100}).loaded", "50"),
1859 ("new ProgressEvent('progress', {lengthComputable:true}).lengthComputable", "true"),
1860 ("new ProgressEvent('progress').total", "0"),
1861 ("new StorageEvent('storage', {key:'k', newValue:'v'}).key", "k"),
1862 ("new StorageEvent('storage', {key:'k', newValue:'v'}).newValue", "v"),
1863 ("new StorageEvent('storage').oldValue === null", "true"),
1864 ("new CompositionEvent('compositionupdate', {data:'あ'}).data", "あ"),
1866 ("new CompositionEvent('compositionstart').data", ""),
1867 (
1868 "var t=new EventTarget(); var got; \
1869 t.addEventListener('paste', e => { got = e.clipboardData; }); \
1870 t.dispatchEvent(new ClipboardEvent('paste', {clipboardData:'X'})); got",
1871 "X",
1872 ),
1873 ("new ClipboardEvent('copy').clipboardData === null", "true"),
1874 ("new AnimationEvent('animationend', {animationName:'spin'}).animationName", "spin"),
1878 ("new AnimationEvent('animationend').elapsedTime", "0"),
1879 ("new TransitionEvent('transitionend', {propertyName:'opacity'}).propertyName", "opacity"),
1880 ("new DragEvent('drop', {dataTransfer:'X'}).dataTransfer", "X"),
1881 ("new DragEvent('drop', {clientX:3}).clientX", "3"),
1882 ("new SubmitEvent('submit', {submitter:'BTN'}).submitter", "BTN"),
1883 ("new SubmitEvent('submit').submitter === null", "true"),
1884 ("new MessageEvent('message', {data:'hi', origin:'https://a.com'}).data", "hi"),
1888 ("new MessageEvent('message', {data:'hi', origin:'https://a.com'}).origin", "https://a.com"),
1889 ("new MessageEvent('message').ports.length", "0"),
1890 ("new ErrorEvent('error', {message:'boom', lineno:5}).message", "boom"),
1891 ("new ErrorEvent('error', {message:'boom', lineno:5}).lineno", "5"),
1892 ("new ErrorEvent('error').error === null", "true"),
1893 (
1896 "var t=new EventTarget(); var ct, ph; \
1897 t.addEventListener('x', e => { ct = e.currentTarget; ph = e.eventPhase; }); \
1898 t.dispatchEvent(new Event('x')); ct === t && ph === 2",
1899 "true",
1900 ),
1901 (
1903 "var t=new EventTarget(); var e=new Event('x'); t.dispatchEvent(e); \
1904 e.currentTarget === null && e.eventPhase",
1905 "0",
1906 ),
1907 ("typeof new Event('x').timeStamp", "number"),
1910 (
1911 "var b=document.createElement('button'); var ts; \
1912 b.addEventListener('click', e => { ts = e.timeStamp; }); \
1913 b.dispatchEvent({type:'click'}); typeof ts",
1914 "number",
1915 ),
1916 (
1920 "var t=new EventTarget(); var r; \
1921 t.addEventListener('x', e => { e.returnValue = false; }); \
1922 r = t.dispatchEvent(new Event('x', {cancelable:true})); r",
1923 "false",
1924 ),
1925 (
1927 "var b=document.createElement('button'); var p=document.createElement('div'); \
1928 p.appendChild(b); var s=''; \
1929 p.addEventListener('click', ()=>s+='P'); \
1930 b.addEventListener('click', e => { s+='B'; e.cancelBubble = true; }); \
1931 b.dispatchEvent({type:'click', bubbles:true}); s",
1932 "B",
1933 ),
1934 (
1936 "var t=new EventTarget(); var se; \
1937 t.addEventListener('x', e => { se = e.srcElement; }); \
1938 t.dispatchEvent(new Event('x')); se === t",
1939 "true",
1940 ),
1941 (
1944 "Event.NONE + ',' + Event.CAPTURING_PHASE + ',' + Event.AT_TARGET + ',' + Event.BUBBLING_PHASE",
1945 "0,1,2,3",
1946 ),
1947 (
1948 "var t=new EventTarget(); var ph; \
1949 t.addEventListener('x', e => { ph = e.eventPhase === Event.AT_TARGET; }); \
1950 t.dispatchEvent(new Event('x')); ph",
1951 "true",
1952 ),
1953 (
1956 "var f=document.createElement('form'); var n=0; \
1957 f.addEventListener('submit', ()=>n++); f.requestSubmit(); n",
1958 "1",
1959 ),
1960 (
1962 "var f=document.createElement('form'); \
1963 f.addEventListener('submit', e=>e.preventDefault()); \
1964 typeof f.requestSubmit()",
1965 "undefined",
1966 ),
1967 ("var f=document.createElement('form'); f.submit(); true", "true"),
1970 (
1973 "var i=document.createElement('input'); i.type='date'; i.showPicker(); true",
1974 "true",
1975 ),
1976 (
1978 "var i=document.createElement('input'); i.type='number'; i.value='5'; \
1979 i.stepUp(); i.value",
1980 "6",
1981 ),
1982 ("var i=document.createElement('input'); i.type='number'; i.value='5'; i.stepDown(3); i.value", "2"),
1983 (
1985 "var i=document.createElement('input'); i.type='number'; i.value='0'; i.step='0.5'; \
1986 i.stepUp(); i.value",
1987 "0.5",
1988 ),
1989 (
1991 "var i=document.createElement('input'); i.type='number'; i.value='9'; i.max='10'; \
1992 i.stepUp(5); i.value",
1993 "10",
1994 ),
1995 ("String.fromCharCode(72,105)", "Hi"),
1997 ("String.fromCodePoint(65)", "A"),
1998 ("Array.of(1,2,3).join(',')", "1,2,3"),
1999 ("[...[10,20].keys()].join(',')", "0,1"),
2001 ("[...[10,20].values()].join(',')", "10,20"),
2002 ("[...[5,6].entries()].map(e => e[0]+':'+e[1]).join(',')", "0:5,1:6"),
2005 ("[1,2,3].reduceRight((a,b) => a+'-'+b)", "3-2-1"),
2006 ("[1,2,3,4].reduceRight((a,b) => a+b, 0)", "10"),
2007 ("document.title = 'AtmOS'; document.title", "AtmOS"),
2009 ("document.readyState", "complete"),
2010 ("document.compatMode", "CSS1Compat"),
2013 ("document.characterSet", "UTF-8"),
2014 ("document.charset", "UTF-8"),
2015 ("document.contentType", "text/html"),
2016 ("document.scrollingElement === document.documentElement", "true"),
2017 ("document.firstElementChild === document.documentElement", "true"),
2023 ("document.lastElementChild === document.documentElement", "true"),
2024 ("document.children.length", "0"),
2025 ("document.childElementCount", "0"),
2026 ("document.referrer", ""),
2029 (
2030 "/^\\d{2}\\/\\d{2}\\/\\d{4} \\d{2}:\\d{2}:\\d{2}$/.test(document.lastModified)",
2031 "true",
2032 ),
2033 ("typeof document.domain", "string"),
2034 ("typeof navigator.geolocation.getCurrentPosition", "function"),
2037 (
2038 "var code; navigator.geolocation.getCurrentPosition(() => {}, e => { code = e.code; }); \
2039 code === 1",
2040 "true",
2041 ),
2042 (
2043 "typeof navigator.geolocation.watchPosition(() => {}, () => {})",
2044 "number",
2045 ),
2046 ("typeof navigator.geolocation.clearWatch(1)", "undefined"),
2047 (
2050 "(await navigator.wakeLock.request('screen')).released",
2051 "false",
2052 ),
2053 ("(await navigator.wakeLock.request('screen')).type", "screen"),
2054 (
2055 "var s = await navigator.wakeLock.request('screen'); await s.release(); s.released",
2056 "true",
2057 ),
2058 ("navigator.canShare({title:'x'})", "false"),
2062 (
2063 "try { await navigator.share({title:'x'}); 'resolved' } \
2064 catch(e) { e.name }",
2065 "AbortError",
2066 ),
2067 (
2070 "try { await new EyeDropper().open(); 'resolved' } \
2071 catch(e) { e.name }",
2072 "AbortError",
2073 ),
2074 ("navigator.vibrate(200)", "true"),
2078 ("navigator.vibrate([100,50,100])", "true"),
2079 ("(await navigator.getBattery()).charging", "true"),
2083 ("(await navigator.getBattery()).level", "1"),
2084 ("(await navigator.getBattery()).chargingTime", "0"),
2085 ("navigator.connection.saveData", "false"),
2089 ("navigator.connection.effectiveType", "4g"),
2090 ("typeof navigator.connection.downlink", "number"),
2091 ("await navigator.locks.request('x', lock => lock.name)", "x"),
2095 ("await navigator.locks.request('x', lock => lock.mode)", "exclusive"),
2096 (
2097 "var ran=false; await navigator.locks.request('x', () => { ran=true; }); ran",
2098 "true",
2099 ),
2100 ("(await navigator.locks.query()).held.length", "0"),
2101 ("await document.hasStorageAccess()", "true"),
2105 ("typeof await document.requestStorageAccess()", "undefined"),
2106 (
2110 "await navigator.clipboard.write([new ClipboardItem({'text/plain': \
2111 new Blob(['hello-clip'], {type:'text/plain'})})]); \
2112 await navigator.clipboard.readText()",
2113 "hello-clip",
2114 ),
2115 (
2116 "await navigator.clipboard.writeText('via-text'); \
2117 (await navigator.clipboard.read())[0].types[0]",
2118 "text/plain",
2119 ),
2120 (
2121 "await navigator.clipboard.writeText('via-text2'); \
2122 var items = await navigator.clipboard.read(); \
2123 var blob = await items[0].getType('text/plain'); await blob.text()",
2124 "via-text2",
2125 ),
2126 (
2130 "(await navigator.permissions.query({name:'geolocation'})).state",
2131 "denied",
2132 ),
2133 (
2134 "(await navigator.permissions.query({name:'notifications'})).state",
2135 "granted",
2136 ),
2137 (
2138 "(await navigator.permissions.query({name:'camera'})).state",
2139 "denied",
2140 ),
2141 ("var seen=false; var io=new IntersectionObserver(entries => { seen=entries[0].isIntersecting; }); io.observe(document.body); seen", "true"),
2143 (
2146 "var e=null; var io=new IntersectionObserver(entries => { e=entries[0]; }); \
2147 io.observe(document.body); \
2148 typeof e.boundingClientRect.width + ',' + \
2149 (e.intersectionRect === e.boundingClientRect ? 'same' : 'diff') + ',' + \
2150 (e.rootBounds === null) + ',' + (typeof e.time)",
2151 "number,same,true,number",
2152 ),
2153 (
2158 "var io=new IntersectionObserver(()=>{}); \
2159 (io.root===null)+','+io.rootMargin+','+io.thresholds.join(',')",
2160 "true,0px 0px 0px 0px,0",
2161 ),
2162 (
2163 "var r=document.body; \
2164 var io=new IntersectionObserver(()=>{}, {root:r, rootMargin:'10px', threshold:0.5}); \
2165 (io.root===r)+','+io.rootMargin+','+io.thresholds.join(',')",
2166 "true,10px,0.5",
2167 ),
2168 (
2169 "var io=new IntersectionObserver(()=>{}, {threshold:[0,0.25,1]}); io.thresholds.join(',')",
2170 "0,0.25,1",
2171 ),
2172 (
2176 "var e=null; var ro=new ResizeObserver(entries => { e=entries[0]; }); \
2177 ro.observe(document.createElement('div')); \
2178 typeof e.contentRect.width + ',' + \
2179 Array.isArray(e.borderBoxSize) + ',' + \
2180 typeof e.borderBoxSize[0].inlineSize + ',' + \
2181 Array.isArray(e.contentBoxSize) + ',' + \
2182 typeof e.contentBoxSize[0].blockSize",
2183 "number,true,number,true,number",
2184 ),
2185 (
2190 "var e=null; var ro=new ResizeObserver(entries => { e=entries[0]; }); \
2191 ro.observe(document.createElement('div')); \
2192 Array.isArray(e.devicePixelContentBoxSize) + ',' + \
2193 typeof e.devicePixelContentBoxSize[0].inlineSize",
2194 "true,number",
2195 ),
2196 ("window.matchMedia('(max-width: 9999px)').matches", "true"),
2198 ("window.matchMedia('(max-width: 0px)').matches", "false"),
2199 ("window.matchMedia('(min-width: 1px)').matches", "true"),
2200 ("window.matchMedia('(prefers-color-scheme: light)').matches", "true"),
2204 ("window.matchMedia('(prefers-color-scheme: dark)').matches", "false"),
2205 ("typeof scrollY", "number"),
2207 ("scrollTo({top:100}); scrollY", "0"),
2208 ("var loaded=false; window.addEventListener('load', () => { loaded=true; }); loaded", "true"),
2210 (
2214 "var ready=false; document.addEventListener('DOMContentLoaded', () => { ready=true; }); ready",
2215 "true",
2216 ),
2217 (
2221 "var c=document.createElement('input'); c.type='checkbox'; c.checked",
2222 "false",
2223 ),
2224 (
2225 "var c=document.createElement('input'); c.type='checkbox'; c.checked=true; c.checked",
2226 "true",
2227 ),
2228 (
2229 "var c=document.createElement('input'); c.type='checkbox'; c.checked=true; c.checked=false; c.checked",
2230 "false",
2231 ),
2232 (
2236 "var f=document.createElement('input'); f.type='file'; f.files.length",
2237 "0",
2238 ),
2239 (
2240 "var f=document.createElement('input'); f.type='text'; f.files",
2241 "undefined",
2242 ),
2243 (
2249 "var f=document.createElement('input'); f.type='file'; \
2250 f.setAttribute('value','c:\\\\secret.txt'); f.value",
2251 "",
2252 ),
2253 (
2254 "var f=document.createElement('input'); f.type='file'; f.value='x'; f.value",
2255 "",
2256 ),
2257 (
2262 "var a=document.createElement('a'); a.href='https://sub.example.org:8080/x/y?z=1#top'; \
2263 [a.protocol,a.host,a.hostname,a.port,a.pathname,a.search,a.hash,a.origin].join('|')",
2264 "https:|sub.example.org:8080|sub.example.org|8080|/x/y|?z=1|#top|https://sub.example.org:8080",
2265 ),
2266 (
2267 "var a=document.createElement('area'); a.href='http://x.com/'; a.protocol",
2268 "http:",
2269 ),
2270 (
2273 "var c=document.createElement('input'); c.type='checkbox'; c.indeterminate",
2274 "false",
2275 ),
2276 (
2277 "var c=document.createElement('input'); c.type='checkbox'; c.indeterminate=true; c.indeterminate",
2278 "true",
2279 ),
2280 (
2281 "var c=document.createElement('input'); c.type='checkbox'; c.indeterminate=true; c.hasAttribute('indeterminate')",
2282 "false",
2283 ),
2284 (
2289 "var i=document.createElement('input'); i.selectionStart + ',' + i.selectionEnd + ',' + i.selectionDirection",
2290 "0,0,none",
2291 ),
2292 (
2293 "var i=document.createElement('input'); i.selectionStart=2; i.selectionEnd=5; i.selectionDirection='forward'; \
2294 i.selectionStart + ',' + i.selectionEnd + ',' + i.selectionDirection",
2295 "2,5,forward",
2296 ),
2297 (
2298 "var t=document.createElement('textarea'); t.value='hello'; t.textLength",
2299 "5",
2300 ),
2301 (
2305 "var i=document.createElement('input'); i.setSelectionRange(1,3,'forward'); \
2306 i.selectionStart + ',' + i.selectionEnd + ',' + i.selectionDirection",
2307 "1,3,forward",
2308 ),
2309 (
2310 "var i=document.createElement('input'); i.value='hello world'; \
2311 i.setRangeText('there', 6, 11); i.value",
2312 "hello there",
2313 ),
2314 (
2315 "var i=document.createElement('input'); i.value='hello world'; \
2316 i.setRangeText('there', 6, 11, 'select'); \
2317 i.value + '|' + i.selectionStart + ',' + i.selectionEnd",
2318 "hello there|6,11",
2319 ),
2320 (
2321 "var i=document.createElement('input'); i.value='hello world'; \
2322 i.selectionStart=0; i.selectionEnd=5; i.setRangeText('hi'); i.value",
2323 "hi world",
2324 ),
2325 (
2327 "var c=document.createElement('input'); c.type='checkbox'; c.click(); c.checked",
2328 "true",
2329 ),
2330 (
2331 "var c=document.createElement('input'); c.type='checkbox'; c.click(); c.click(); c.checked",
2332 "false",
2333 ),
2334 (
2335 "var r=document.createElement('input'); r.type='radio'; r.click(); r.checked",
2336 "true",
2337 ),
2338 (
2341 "document.createElement('div').ownerDocument === document",
2342 "true",
2343 ),
2344 (
2345 "typeof document.createElement('div').ownerDocument.createElement",
2346 "function",
2347 ),
2348 (
2352 "var r1=document.createElement('input'); r1.type='radio'; r1.name='g'; \
2353 var r2=document.createElement('input'); r2.type='radio'; r2.name='g'; \
2354 r1.click(); r2.click(); r1.checked + ',' + r2.checked",
2355 "false,true",
2356 ),
2357 (
2358 "var r1=document.createElement('input'); r1.type='radio'; r1.name='g2'; \
2359 var r2=document.createElement('input'); r2.type='radio'; r2.name='g2'; \
2360 r1.checked=true; r2.checked=true; r1.checked + ',' + r2.checked",
2361 "false,true",
2362 ),
2363 (
2365 "var r1=document.createElement('input'); r1.type='radio'; r1.name='ga'; \
2366 var r2=document.createElement('input'); r2.type='radio'; r2.name='gb'; \
2367 r1.click(); r2.click(); r1.checked + ',' + r2.checked",
2368 "true,true",
2369 ),
2370 (
2373 "var b=document.createElement('button'); b.disabled=true; b.disabled",
2374 "true",
2375 ),
2376 (
2377 "var b=document.createElement('button'); b.disabled=true; b.disabled=false; b.disabled",
2378 "false",
2379 ),
2380 (
2381 "var o=document.createElement('option'); o.selected=true; o.selected",
2382 "true",
2383 ),
2384 (
2387 "var o=document.createElement('option'); o.text='Label'; o.text",
2388 "Label",
2389 ),
2390 (
2391 "var o=document.createElement('option'); o.text='Label'; o.textContent",
2392 "Label",
2393 ),
2394 (
2398 "var o=document.createElement('option'); o.textContent='hi'; o.label",
2399 "hi",
2400 ),
2401 (
2402 "var o=document.createElement('option'); o.textContent='hi'; o.label='explicit'; o.label",
2403 "explicit",
2404 ),
2405 (
2406 "var g=document.createElement('optgroup'); g.textContent='hi'; g.label",
2407 "",
2408 ),
2409 (
2410 "var g=document.createElement('optgroup'); g.label='Group A'; g.label",
2411 "Group A",
2412 ),
2413 (
2416 "var i=document.createElement('input'); i.required=true; i.required",
2417 "true",
2418 ),
2419 (
2420 "var i=document.createElement('input'); i.readOnly=true; i.readOnly",
2421 "true",
2422 ),
2423 (
2424 "var s=document.createElement('select'); s.multiple=true; s.multiple",
2425 "true",
2426 ),
2427 (
2428 "var img=document.createElement('img'); img.src='a.png'; img.alt='pic'; img.src+','+img.alt",
2429 "a.png,pic",
2430 ),
2431 (
2432 "var a=document.createElement('a'); a.href='/x'; a.href",
2433 "/x",
2434 ),
2435 (
2438 "var l=document.createElement('label'); l.htmlFor='name'; l.htmlFor",
2439 "name",
2440 ),
2441 (
2442 "var f=document.createElement('form'); f.action='/submit'; f.method='post'; f.action+','+f.method",
2443 "/submit,post",
2444 ),
2445 ("document.createElement('form').method", "get"),
2449 (
2450 "var f=document.createElement('form'); f.setAttribute('method','DIALOG'); f.method",
2451 "dialog",
2452 ),
2453 (
2454 "var f=document.createElement('form'); f.setAttribute('method','bogus'); f.method",
2455 "get",
2456 ),
2457 (
2462 "document.createElement('form').enctype",
2463 "application/x-www-form-urlencoded",
2464 ),
2465 (
2466 "var f=document.createElement('form'); f.enctype='multipart/form-data'; f.enctype+','+f.encoding",
2467 "multipart/form-data,multipart/form-data",
2468 ),
2469 (
2470 "var f=document.createElement('form'); f.encoding='text/plain'; f.enctype",
2471 "text/plain",
2472 ),
2473 (
2477 "var f=document.createElement('form'); f.acceptCharset='UTF-8'; f.getAttribute('accept-charset')",
2478 "UTF-8",
2479 ),
2480 (
2481 "var f=document.createElement('form'); f.setAttribute('accept-charset','UTF-8'); f.acceptCharset",
2482 "UTF-8",
2483 ),
2484 (
2489 "var b=document.createElement('button'); b.formAction='/x'; b.getAttribute('formaction')",
2490 "/x",
2491 ),
2492 (
2493 "document.createElement('input').formEnctype",
2494 "application/x-www-form-urlencoded",
2495 ),
2496 (
2497 "var b=document.createElement('button'); b.formEnctype='multipart/form-data'; b.formEnctype",
2498 "multipart/form-data",
2499 ),
2500 ("document.createElement('button').formMethod", "get"),
2501 (
2502 "var i=document.createElement('input'); i.formMethod='post'; i.formMethod",
2503 "post",
2504 ),
2505 (
2506 "document.createElement('button').formNoValidate",
2507 "false",
2508 ),
2509 (
2510 "var b=document.createElement('button'); b.formNoValidate=true; b.getAttribute('formnovalidate')",
2511 "formnovalidate",
2512 ),
2513 (
2514 "var i=document.createElement('input'); i.formTarget='_blank'; i.formTarget",
2515 "_blank",
2516 ),
2517 (
2518 "var i=document.createElement('input'); i.defaultValue='hello'; i.defaultValue+','+i.getAttribute('value')",
2519 "hello,hello",
2520 ),
2521 (
2522 "var i=document.createElement('input'); i.defaultChecked=true; i.defaultChecked+','+i.hasAttribute('checked')",
2523 "true,true",
2524 ),
2525 (
2526 "var o=document.createElement('option'); o.defaultSelected=true; o.defaultSelected+','+o.hasAttribute('selected')",
2527 "true,true",
2528 ),
2529 ("document.createElement('img').loading", "auto"),
2533 (
2534 "var i=document.createElement('img'); i.loading='lazy'; i.loading",
2535 "lazy",
2536 ),
2537 (
2538 "var i=document.createElement('img'); i.setAttribute('loading','bogus'); i.loading",
2539 "auto",
2540 ),
2541 ("document.createElement('img').decoding", "auto"),
2542 (
2543 "var i=document.createElement('img'); i.decoding='sync'; i.decoding",
2544 "sync",
2545 ),
2546 (
2547 "var i=document.createElement('img'); i.setAttribute('decoding','bogus'); i.decoding",
2548 "auto",
2549 ),
2550 ("document.createElement('audio').preload", "metadata"),
2554 (
2555 "var v=document.createElement('video'); v.preload='none'; v.preload",
2556 "none",
2557 ),
2558 (
2559 "var v=document.createElement('video'); v.setAttribute('preload','bogus'); v.preload",
2560 "auto",
2561 ),
2562 ("document.createElement('textarea').wrap", "soft"),
2566 (
2567 "var t=document.createElement('textarea'); t.wrap='hard'; t.wrap",
2568 "hard",
2569 ),
2570 (
2571 "var t=document.createElement('textarea'); t.setAttribute('wrap','bogus'); t.wrap",
2572 "soft",
2573 ),
2574 ("document.createElement('track').kind", "subtitles"),
2578 (
2579 "var t=document.createElement('track'); t.kind='captions'; t.kind",
2580 "captions",
2581 ),
2582 (
2583 "var t=document.createElement('track'); t.setAttribute('kind','bogus'); t.kind",
2584 "metadata",
2585 ),
2586 (
2591 "var t=document.createElement('track'); t.label='English'; t.getAttribute('label')",
2592 "English",
2593 ),
2594 (
2595 "var t=document.createElement('track'); t.srclang='en'; t.srclang",
2596 "en",
2597 ),
2598 ("document.createElement('track').default", "false"),
2599 (
2600 "var t=document.createElement('track'); t.default=true; t.getAttribute('default')",
2601 "default",
2602 ),
2603 (
2606 "var l=document.createElement('link'); l.as='script'; l.getAttribute('as')",
2607 "script",
2608 ),
2609 (
2610 "var l=document.createElement('link'); l.setAttribute('as','style'); l.as",
2611 "style",
2612 ),
2613 (
2618 "document.createElement('video').videoWidth+','+document.createElement('video').videoHeight",
2619 "0,0",
2620 ),
2621 ("document.createElement('video').seeking", "false"),
2622 ("document.createElement('audio').seeking", "false"),
2623 ("document.createElement('select').size", "0"),
2627 (
2628 "var s=document.createElement('select'); s.size=5; s.size",
2629 "5",
2630 ),
2631 ("document.createElement('input').size", "20"),
2632 (
2633 "var i=document.createElement('input'); i.size=10; i.size",
2634 "10",
2635 ),
2636 (
2637 "var i=document.createElement('input'); i.setAttribute('size','0'); i.size",
2638 "20",
2639 ),
2640 ("document.createElement('textarea').rows", "2"),
2643 (
2644 "var t=document.createElement('textarea'); t.rows=8; t.rows",
2645 "8",
2646 ),
2647 ("document.createElement('textarea').cols", "20"),
2648 (
2649 "var t=document.createElement('textarea'); t.cols=40; t.cols",
2650 "40",
2651 ),
2652 (
2653 "var t=document.createElement('textarea'); t.setAttribute('rows','0'); t.rows",
2654 "2",
2655 ),
2656 (
2660 "var d=document.createElement('dialog'); d.open=true; d.requestClose('x'); \
2661 d.open+','+d.returnValue",
2662 "false,x",
2663 ),
2664 (
2665 "var d=document.createElement('dialog'); d.open=true; \
2666 d.addEventListener('cancel', e=>e.preventDefault()); d.requestClose(); d.open",
2667 "true",
2668 ),
2669 (
2670 "var d=document.createElement('dialog'); d.open=true; var fired=false; \
2671 d.addEventListener('close', ()=>fired=true); d.requestClose(); fired",
2672 "true",
2673 ),
2674 ("document.createElement('progress').position", "-1"),
2678 (
2679 "var p=document.createElement('progress'); p.max=10; p.value=5; p.position",
2680 "0.5",
2681 ),
2682 (
2683 "var p=document.createElement('progress'); p.value=1; p.position",
2684 "1",
2685 ),
2686 (
2691 "var o=document.createElement('output'); o.htmlFor='a b c'; \
2692 o.htmlFor.length+','+o.htmlFor[1]",
2693 "3,b",
2694 ),
2695 (
2696 "var o=document.createElement('output'); o.setAttribute('for','x y'); \
2697 Array.from(o.htmlFor).join(',')",
2698 "x,y",
2699 ),
2700 ("document.createElement('output').htmlFor.length", "0"),
2701 (
2707 "var c=document.createElement('input'); c.type='checkbox'; c.value",
2708 "on",
2709 ),
2710 (
2711 "var r=document.createElement('input'); r.type='radio'; r.value",
2712 "on",
2713 ),
2714 (
2715 "var c=document.createElement('input'); c.type='checkbox'; c.value='yes'; c.value",
2716 "yes",
2717 ),
2718 (
2719 "document.createElement('input').value",
2720 "",
2721 ),
2722 (
2727 "var c=document.createElement('input'); c.type='color'; c.value",
2728 "#000000",
2729 ),
2730 (
2731 "var c=document.createElement('input'); c.type='color'; c.value='#ff00aa'; c.value",
2732 "#ff00aa",
2733 ),
2734 (
2741 "var c=document.createElement('input'); c.type='color'; c.value='#FF00AA'; c.value",
2742 "#ff00aa",
2743 ),
2744 (
2745 "var c=document.createElement('input'); c.type='color'; c.value='red'; c.value",
2747 "#000000",
2748 ),
2749 (
2754 "var r=document.createElement('input'); r.type='range'; r.value",
2755 "50",
2756 ),
2757 (
2758 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; r.value",
2759 "5",
2760 ),
2761 (
2762 "var r=document.createElement('input'); r.type='range'; r.value='7'; r.value",
2763 "7",
2764 ),
2765 (
2766 "var r=document.createElement('input'); r.type='range'; r.min='5'; r.max='2'; r.value",
2767 "5",
2768 ),
2769 (
2774 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; r.value='999'; r.value",
2775 "10",
2776 ),
2777 (
2778 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; r.value='-5'; r.value",
2779 "0",
2780 ),
2781 (
2782 "var r=document.createElement('input'); r.type='range'; r.min='0'; r.max='10'; \
2785 r.setAttribute('value','999'); r.value",
2786 "10",
2787 ),
2788 (
2793 "var t=document.createElement('table'); var h=document.createElement('thead'); \
2794 t.tHead=h; t.tHead===h",
2795 "true",
2796 ),
2797 (
2798 "var t=document.createElement('table'); var h1=document.createElement('thead'); \
2799 var h2=document.createElement('thead'); t.tHead=h1; t.tHead=h2; \
2800 (t.tHead===h2)+','+t.children.length",
2801 "true,1",
2802 ),
2803 (
2804 "var t=document.createElement('table'); var h=document.createElement('thead'); \
2805 t.tHead=h; t.tHead=null; t.tHead",
2806 "null",
2807 ),
2808 (
2809 "var t=document.createElement('table'); var c=document.createElement('caption'); \
2810 var b=document.createElement('tbody'); t.appendChild(b); t.caption=c; \
2811 t.firstChild===c",
2812 "true",
2813 ),
2814 (
2817 "var s=document.createElement('select'); var o=document.createElement('option'); \
2818 s.add(o); s.options.length+','+(s.options[0]===o)",
2819 "1,true",
2820 ),
2821 (
2822 "var s=document.createElement('select'); var o1=document.createElement('option'); \
2823 var o2=document.createElement('option'); s.add(o1); s.add(o2, o1); \
2824 s.options[0]===o2",
2825 "true",
2826 ),
2827 ("document.createElement('video').played.length", "0"),
2830 ("document.createElement('audio').played.length", "0"),
2831 (
2836 "var d=document.createElement('div'); d.role='button'; d.getAttribute('role')",
2837 "button",
2838 ),
2839 (
2840 "var d=document.createElement('div'); d.setAttribute('role','tab'); d.role",
2841 "tab",
2842 ),
2843 (
2844 "var d=document.createElement('div'); d.ariaLabel='close'; d.getAttribute('aria-label')",
2845 "close",
2846 ),
2847 (
2848 "var d=document.createElement('div'); d.setAttribute('aria-hidden','true'); d.ariaHidden",
2849 "true",
2850 ),
2851 (
2852 "var d=document.createElement('div'); d.ariaValueNow='5'; d.getAttribute('aria-valuenow')",
2853 "5",
2854 ),
2855 (
2856 "var d=document.createElement('div'); d.ariaLabel='x'; d.ariaLabel=null; \
2857 d.getAttribute('aria-label')",
2858 "null",
2859 ),
2860 ("document.createElement('div').ariaLabel", "null"),
2861 (
2865 "var d=document.createElement('div'); d.textContent='hi'; d.outerText",
2866 "hi",
2867 ),
2868 (
2869 "var p=document.createElement('div'); var c=document.createElement('span'); \
2870 c.textContent='x'; p.appendChild(c); c.outerText='y'; p.textContent",
2871 "y",
2872 ),
2873 (
2874 "var p=document.createElement('div'); var c=document.createElement('span'); \
2875 p.appendChild(c); c.outerText='z'; p.children.length",
2876 "0",
2877 ),
2878 (
2882 "var d=document.createElement('div'); d.setAttribute('part','a b'); \
2883 d.part.length+','+d.part[1]",
2884 "2,b",
2885 ),
2886 ("document.createElement('div').part.length", "0"),
2887 (
2892 "var l=document.createElement('link'); l.setAttribute('sizes','16x16 32x32'); \
2893 l.sizes.length+','+l.sizes[1]",
2894 "2,32x32",
2895 ),
2896 (
2897 "var i=document.createElement('img'); i.sizes='(min-width: 600px) 50vw, 100vw'; i.sizes",
2898 "(min-width: 600px) 50vw, 100vw",
2899 ),
2900 (
2903 "var i=document.createElement('input'); i.accept='image/*'; i.getAttribute('accept')",
2904 "image/*",
2905 ),
2906 (
2907 "var i=document.createElement('input'); i.setAttribute('accept','.pdf,.doc'); i.accept",
2908 ".pdf,.doc",
2909 ),
2910 (
2914 "var s=document.createElement('script'); s.charset='utf-8'; s.getAttribute('charset')",
2915 "utf-8",
2916 ),
2917 (
2918 "var s=document.createElement('script'); s.setAttribute('charset','shift-jis'); s.charset",
2919 "shift-jis",
2920 ),
2921 (
2926 "var a=document.createElement('a'); a.href='https://x.com/p'; a.hostname='y.com'; a.href",
2927 "https://y.com/p",
2928 ),
2929 (
2930 "var a=document.createElement('a'); a.href='https://x.com/p'; a.protocol='http'; a.protocol",
2931 "http:",
2932 ),
2933 (
2934 "var a=document.createElement('a'); a.href='https://x.com/p'; a.pathname='q'; a.pathname",
2935 "/q",
2936 ),
2937 (
2938 "var a=document.createElement('a'); a.href='https://x.com/p'; a.search='x=1'; a.search",
2939 "?x=1",
2940 ),
2941 (
2942 "var a=document.createElement('a'); a.href='https://x.com/p'; a.hash='frag'; a.hash",
2943 "#frag",
2944 ),
2945 (
2946 "var a=document.createElement('a'); a.href='https://x.com:80/p'; a.host='y.com:90'; \
2947 a.hostname+','+a.port",
2948 "y.com,90",
2949 ),
2950 (
2951 "var a=document.createElement('a'); a.href='https://x.com/p'; a.username='u'; \
2952 a.password='pw'; a.href",
2953 "https://u:pw@x.com/p",
2954 ),
2955 ("document.createElement('output').willValidate", "false"),
2959 ("document.createElement('div').willValidate", "false"),
2960 ("document.createElement('fieldset').willValidate", "false"),
2961 ("document.createElement('input').willValidate", "true"),
2962 (
2963 "var b=document.createElement('button'); b.disabled=true; b.willValidate",
2964 "false",
2965 ),
2966 (
2972 "var o=document.createElement('output'); o.setAttribute('required','required'); \
2973 o.validity.valid",
2974 "true",
2975 ),
2976 (
2977 "var d=document.createElement('div'); d.setAttribute('required','required'); \
2978 d.validity.valueMissing",
2979 "false",
2980 ),
2981 (
2982 "var i=document.createElement('input'); i.setAttribute('required','required'); \
2983 i.validity.valueMissing",
2984 "true",
2985 ),
2986 (
2993 "var o=document.createElement('output'); o.setAttribute('required','required'); \
2994 o.checkValidity()",
2995 "true",
2996 ),
2997 (
2998 "var i=document.createElement('input'); i.setAttribute('required','required'); \
2999 i.checkValidity()",
3000 "false",
3001 ),
3002 (
3006 "document.createElement('video').disableRemotePlayback",
3007 "false",
3008 ),
3009 (
3010 "var v=document.createElement('video'); v.disableRemotePlayback=true; \
3011 v.getAttribute('disableremoteplayback')",
3012 "disableremoteplayback",
3013 ),
3014 (
3018 "var l=document.createElement('link'); l.setAttribute('blocking','render'); \
3019 l.blocking.length+','+l.blocking[0]",
3020 "1,render",
3021 ),
3022 ("document.createElement('script').blocking.length", "0"),
3023 (
3028 "var o=document.createElement('output'); o.textContent='42'; o.value",
3029 "42",
3030 ),
3031 (
3032 "var o=document.createElement('output'); o.textContent='42'; o.value='7'; o.value",
3033 "7",
3034 ),
3035 (
3036 "var o=document.createElement('output'); o.textContent='42'; o.value='7'; \
3037 o.textContent",
3038 "42",
3039 ),
3040 (
3044 "var q=document.createElement('video').getVideoPlaybackQuality(); \
3045 q.totalVideoFrames+','+q.droppedVideoFrames+','+q.corruptedVideoFrames",
3046 "0,0,0",
3047 ),
3048 (
3053 "document.createElement('div').namespaceURI",
3054 "http://www.w3.org/1999/xhtml",
3055 ),
3056 ("document.createElement('SPAN').localName", "span"),
3057 ("document.createElement('div').prefix", "null"),
3058 (
3059 "document.createTextNode('x').namespaceURI",
3060 "null",
3061 ),
3062 (
3063 "document.createTextNode('x').localName",
3064 "null",
3065 ),
3066 (
3070 "HTMLScriptElement.supports('classic')+','+HTMLScriptElement.supports('module')",
3071 "true,true",
3072 ),
3073 (
3074 "document.createElement('div').ariaActiveDescendantElement",
3075 "null",
3076 ),
3077 (
3078 "(function(){var a=document.createElement('div');a.setAttribute('aria-activedescendant','nope');return a.ariaActiveDescendantElement;})()",
3079 "null",
3080 ),
3081 (
3086 "var d=document.createElement('div'); d.innerHTML='<b>x</b>'; d.getHTML()",
3087 "<b>x</b>",
3088 ),
3089 (
3090 "var d=document.createElement('div'); d.setHTMLUnsafe('<i>y</i>'); d.innerHTML",
3091 "<i>y</i>",
3092 ),
3093 ("CSS.px(5).value+','+CSS.px(5).unit+','+CSS.px(5).toString()", "5,px,5px"),
3097 ("CSS.percent(50).toString()", "50%"),
3098 ("CSS.number(3).toString()", "3"),
3099 ("CSS.em(1.5).toString()", "1.5em"),
3100 ("CSS.rem(2).toString()", "2rem"),
3101 ("CSS.deg(90).toString()", "90deg"),
3102 ("HTMLScriptElement.supports('importmap')", "false"),
3103 ("HTMLScriptElement.supports('bogus')", "false"),
3104 (
3108 "(function(){var l=document.createElement('link');l.imageSrcset='a.jpg 1x, b.jpg 2x';l.imageSizes='100vw';return l.imageSrcset+'|'+l.imageSizes;})()",
3109 "a.jpg 1x, b.jpg 2x|100vw",
3110 ),
3111 (
3112 "document.createElement('link').imageSrcset+'|'+document.createElement('link').imageSizes",
3113 "|",
3114 ),
3115 (
3119 "(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;})()",
3120 "false,true,false",
3121 ),
3122 (
3127 "var a=document.createElement('area'); a.coords='0,0,10,10'; a.coords",
3128 "0,0,10,10",
3129 ),
3130 ("document.createElement('area').shape", "rect"),
3131 (
3132 "var a=document.createElement('area'); a.shape='circle'; a.shape",
3133 "circle",
3134 ),
3135 (
3136 "var a=document.createElement('area'); a.setAttribute('shape','circ'); a.shape",
3137 "circle",
3138 ),
3139 (
3140 "var a=document.createElement('area'); a.setAttribute('shape','polygon'); a.shape",
3141 "poly",
3142 ),
3143 ("document.createElement('ol').type", "1"),
3148 (
3149 "var o=document.createElement('ol'); o.type='A'; o.type",
3150 "A",
3151 ),
3152 (
3153 "var o=document.createElement('ol'); o.setAttribute('type','bogus'); o.type",
3154 "1",
3155 ),
3156 ("document.createElement('ol').start", "1"),
3157 (
3158 "var o=document.createElement('ol'); o.start=5; o.start",
3159 "5",
3160 ),
3161 (
3162 "document.createElement('ol').reversed",
3163 "false",
3164 ),
3165 (
3166 "var o=document.createElement('ol'); o.reversed=true; o.getAttribute('reversed')",
3167 "reversed",
3168 ),
3169 (
3173 "var m=document.createElement('meter'); m.min='2'; m.max='10'; m.low+','+m.high+','+m.optimum",
3174 "2,10,6",
3175 ),
3176 (
3177 "var m=document.createElement('meter'); m.max='10'; m.low='4'; m.low",
3178 "4",
3179 ),
3180 (
3181 "var m=document.createElement('meter'); m.max='10'; m.high='20'; m.high",
3182 "10",
3183 ),
3184 ("document.createElement('td').colSpan", "1"),
3188 (
3189 "var c=document.createElement('td'); c.colSpan=3; c.colSpan",
3190 "3",
3191 ),
3192 (
3193 "var c=document.createElement('td'); c.setAttribute('colspan','9999'); c.colSpan",
3194 "1000",
3195 ),
3196 ("document.createElement('th').rowSpan", "1"),
3197 (
3198 "var c=document.createElement('th'); c.rowSpan=0; c.rowSpan",
3199 "0",
3200 ),
3201 (
3205 "var c=document.createElement('td'); c.headers='h1 h2'; c.headers",
3206 "h1 h2",
3207 ),
3208 ("document.createElement('th').scope", ""),
3209 (
3210 "var t=document.createElement('th'); t.scope='col'; t.scope",
3211 "col",
3212 ),
3213 (
3214 "var t=document.createElement('th'); t.setAttribute('scope','bogus'); t.scope",
3215 "",
3216 ),
3217 (
3218 "var t=document.createElement('th'); t.abbr='Description'; t.abbr",
3219 "Description",
3220 ),
3221 ("document.createElement('col').span", "1"),
3224 (
3225 "var c=document.createElement('colgroup'); c.span=3; c.span",
3226 "3",
3227 ),
3228 (
3229 "var c=document.createElement('col'); c.setAttribute('span','9999'); c.span",
3230 "1000",
3231 ),
3232 (
3238 "var o=document.createElement('object'); o.data='/x'; o.getAttribute('data')",
3239 "/x",
3240 ),
3241 (
3242 "var t=document.createTextNode('hi'); t.data",
3243 "hi",
3244 ),
3245 (
3250 "var m=document.createElement('meta'); m.httpEquiv='refresh'; m.getAttribute('http-equiv')",
3251 "refresh",
3252 ),
3253 (
3254 "var m=document.createElement('meta'); m.setAttribute('http-equiv','refresh'); m.httpEquiv",
3255 "refresh",
3256 ),
3257 (
3258 "var m=document.createElement('meta'); m.content='width=device-width'; m.content",
3259 "width=device-width",
3260 ),
3261 (
3262 "var m=document.createElement('meta'); m.charset='utf-8'; m.charset",
3263 "utf-8",
3264 ),
3265 (
3269 "var b=document.createElement('blockquote'); b.cite='https://example.com'; b.getAttribute('cite')",
3270 "https://example.com",
3271 ),
3272 (
3273 "var t=document.createElement('time'); t.dateTime='2026-07-17'; t.getAttribute('datetime')",
3274 "2026-07-17",
3275 ),
3276 (
3277 "var i=document.createElement('ins'); i.setAttribute('datetime','2026-07-17'); i.dateTime",
3278 "2026-07-17",
3279 ),
3280 (
3283 "document.createElement('video').disablePictureInPicture",
3284 "false",
3285 ),
3286 (
3287 "var v=document.createElement('video'); v.disablePictureInPicture=true; v.getAttribute('disablepictureinpicture')",
3288 "disablepictureinpicture",
3289 ),
3290 (
3291 "var f=document.createElement('iframe'); f.allowFullscreen=true; f.getAttribute('allowfullscreen')",
3292 "allowfullscreen",
3293 ),
3294 (
3298 "document.createElement('canvas').width+','+document.createElement('canvas').height",
3299 "300,150",
3300 ),
3301 (
3302 "var c=document.createElement('canvas'); c.width=640; c.height=480; c.width+','+c.height",
3303 "640,480",
3304 ),
3305 (
3306 "document.createElement('img').width+','+document.createElement('img').height",
3307 "0,0",
3308 ),
3309 (
3310 "var v=document.createElement('video'); v.width=320; v.width",
3311 "320",
3312 ),
3313 (
3318 "var e=document.createElement('embed'); e.width='50%'; e.width",
3319 "50%",
3320 ),
3321 (
3322 "var o=document.createElement('object'); o.height='300'; o.height",
3323 "300",
3324 ),
3325 ("document.createElement('iframe').width", ""),
3326 (
3327 "var f=document.createElement('iframe'); f.setAttribute('width','640'); f.width",
3328 "640",
3329 ),
3330 (
3335 "var i=document.createElement('input'); i.defaultValue='hi'; i.getAttribute('value')",
3336 "hi",
3337 ),
3338 (
3339 "var i=document.createElement('input'); i.setAttribute('value','preset'); i.defaultValue",
3340 "preset",
3341 ),
3342 (
3343 "var i=document.createElement('input'); i.setAttribute('value','preset'); i.value='changed'; i.defaultValue",
3344 "preset",
3345 ),
3346 (
3347 "var i=document.createElement('input'); i.setAttribute('value','preset'); i.value='changed'; i.value",
3348 "changed",
3349 ),
3350 (
3351 "document.createElement('input').defaultChecked",
3352 "false",
3353 ),
3354 (
3355 "var i=document.createElement('input'); i.defaultChecked=true; i.getAttribute('checked')",
3356 "checked",
3357 ),
3358 (
3359 "var i=document.createElement('input'); i.defaultChecked=true; i.checked=false; i.defaultChecked",
3360 "true",
3361 ),
3362 (
3363 "document.createElement('option').defaultSelected",
3364 "false",
3365 ),
3366 (
3367 "var o=document.createElement('option'); o.defaultSelected=true; o.getAttribute('selected')",
3368 "selected",
3369 ),
3370 ("document.createElement('output').type", "output"),
3374 (
3375 "var o=document.createElement('output'); o.setAttribute('type','bogus'); o.type",
3376 "output",
3377 ),
3378 (
3381 "var f=document.createElement('iframe'); f.srcdoc='<p>hi</p>'; f.getAttribute('srcdoc')",
3382 "<p>hi</p>",
3383 ),
3384 (
3385 "var f=document.createElement('iframe'); f.setAttribute('srcdoc','<b>x</b>'); f.srcdoc",
3386 "<b>x</b>",
3387 ),
3388 ("document.createElement('li').value", "0"),
3393 (
3394 "var l=document.createElement('li'); l.value=5; l.value",
3395 "5",
3396 ),
3397 (
3398 "var l=document.createElement('li'); l.setAttribute('value','bogus'); l.value",
3399 "0",
3400 ),
3401 (
3404 "var i=document.createElement('input'); i.pattern='[0-9]+'; i.getAttribute('pattern')",
3405 "[0-9]+",
3406 ),
3407 (
3408 "var i=document.createElement('input'); i.setAttribute('pattern','[a-z]+'); i.pattern",
3409 "[a-z]+",
3410 ),
3411 (
3414 "var i=document.createElement('input'); i.capture='environment'; i.getAttribute('capture')",
3415 "environment",
3416 ),
3417 (
3418 "var i=document.createElement('input'); i.setAttribute('capture','user'); i.capture",
3419 "user",
3420 ),
3421 (
3425 "var i=document.createElement('input'); i.autocomplete='email'; i.getAttribute('autocomplete')",
3426 "email",
3427 ),
3428 (
3429 "var i=document.createElement('input'); i.setAttribute('autocomplete','off'); i.autocomplete",
3430 "off",
3431 ),
3432 (
3433 "document.createElement('input').autofocus",
3434 "false",
3435 ),
3436 (
3437 "var i=document.createElement('input'); i.autofocus=true; i.getAttribute('autofocus')",
3438 "autofocus",
3439 ),
3440 (
3441 "var i=document.createElement('input'); i.min='0'; i.max='10'; i.step='2'; i.min+','+i.max+','+i.step",
3442 "0,10,2",
3443 ),
3444 (
3445 "var i=document.createElement('input'); i.maxLength='5'; i.maxLength",
3446 "5",
3447 ),
3448 (
3453 "typeof document.createElement('input').maxLength",
3454 "number",
3455 ),
3456 (
3457 "document.createElement('input').maxLength",
3458 "-1",
3459 ),
3460 (
3461 "var i=document.createElement('input'); i.minLength=3; typeof i.minLength + ',' + i.minLength",
3462 "number,3",
3463 ),
3464 (
3465 "document.createElement('textarea').minLength",
3466 "-1",
3467 ),
3468 (
3469 "var a=document.createElement('a'); a.target='_blank'; a.rel='noopener'; a.download='f.txt'; a.target+','+a.rel+','+a.download",
3470 "_blank,noopener,f.txt",
3471 ),
3472 (
3473 "var i=document.createElement('input'); i.placeholder='enter name'; i.placeholder",
3474 "enter name",
3475 ),
3476 (
3477 "var d=document.createElement('details'); d.open",
3478 "false",
3479 ),
3480 (
3481 "var d=document.createElement('details'); d.open=true; d.open",
3482 "true",
3483 ),
3484 (
3485 "var d=document.createElement('details'); d.setAttribute('open',''); d.open",
3486 "true",
3487 ),
3488 (
3489 "var i=document.createElement('input'); i.name='email'; i.name",
3490 "email",
3491 ),
3492 (
3496 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.value",
3497 "a",
3498 ),
3499 (
3500 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.value='b'; s.value",
3501 "b",
3502 ),
3503 (
3504 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.value='b'; s.selectedIndex",
3505 "1",
3506 ),
3507 (
3508 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.selectedIndex=1; s.value",
3509 "b",
3510 ),
3511 (
3514 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.options[1].index",
3515 "1",
3516 ),
3517 (
3518 "document.createElement('option').index",
3519 "0",
3520 ),
3521 (
3524 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option><option value='b'>B</option>\"; s.length",
3525 "2",
3526 ),
3527 (
3528 "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",
3529 "1,a",
3530 ),
3531 (
3532 "var s=document.createElement('select'); s.length=2; s.options.length",
3533 "2",
3534 ),
3535 (
3540 "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",
3541 "1,b",
3542 ),
3543 (
3544 "var d=document.createElement('div'); var s=document.createElement('select'); d.appendChild(s); s.remove(); d.children.length",
3547 "0",
3548 ),
3549 (
3550 "var s=document.createElement('select'); s.innerHTML=\"<option value='a'>A</option>\"; s.remove(-1); s.options.length",
3553 "1",
3554 ),
3555 (
3559 "var t=document.createElement('textarea'); t.value='hi'; t.value",
3560 "hi",
3561 ),
3562 ("typeof console.table", "function"),
3563 ("typeof globalThis", "object"),
3564 ("typeof globalThis.document", "object"),
3565 ("typeof fetch", "function"),
3567 ("(await fetch('data:,hello')).status", "200"),
3568 ("(await fetch('data:,hello')).ok", "true"),
3569 ("await (await fetch('data:,hello world')).text()", "hello world"),
3570 ("await fetch('data:text/plain,abc').then(r => r.text())", "abc"),
3571 ("(await (await fetch('data:application/json,{\"a\":7,\"b\":[1,2]}')).json()).a", "7"),
3572 ("(await (await fetch('data:application/json,{\"a\":7,\"b\":[1,2]}')).json()).b.length", "2"),
3573 ("(await (await fetch('data:,hello')).blob()).size", "5"),
3575 ("await (await (await fetch('data:,hello')).blob()).text()", "hello"),
3576 (
3579 "var buf = await (await fetch('data:,A')).arrayBuffer(); new DataView(buf).getUint8(0)",
3580 "65",
3581 ),
3582 ("await fetch('ftp://x/y').then(() => 'ok', e => 'err:' + (e.message || e))", "err:fetch: only absolute http(s) and data URLs are supported"),
3583 ("(await fetch('data:,hi')).statusText", "OK"),
3587 (
3591 "var r = await fetch('data:,hello'); var c = r.clone(); (await c.text()) + ',' + (await r.text())",
3592 "hello,hello",
3593 ),
3594 ("(await fetch('data:,x')).clone().status", "200"),
3595 (
3598 "(await fetch('data:,hi')).url",
3599 "data:,hi",
3600 ),
3601 ("new Response('hi').status", "200"),
3604 ("await new Response('hi', {status: 201}).text()", "hi"),
3605 (
3606 "(await new Response(JSON.stringify({a:1}), {headers:{'content-type':'application/json'}}).json()).a",
3607 "1",
3608 ),
3609 ("(await Response.json({a:5}).json()).a", "5"),
3611 ("Response.json({}).headers.get('content-type')", "application/json"),
3612 ("Response.error().ok", "false"),
3614 ("Response.error().type", "error"),
3615 ("Response.redirect('https://e.com/x').status", "302"),
3617 ("Response.redirect('https://e.com/x', 301).headers.get('location')", "https://e.com/x"),
3618 (
3619 "(await fetch('data:,x')).clone().url",
3620 "data:,x",
3621 ),
3622 (
3625 "await fetch('data:,hi', {signal: AbortSignal.abort('why')}).then(() => 'no-throw', e => 'caught:' + e)",
3626 "caught:why",
3627 ),
3628 (
3629 "await fetch('data:,hi', {signal: new AbortController().signal}).then(r => r.status)",
3630 "200",
3631 ),
3632 ("new Request('data:,hi').url", "data:,hi"),
3635 ("new Request('data:,hi', {method:'POST'}).method", "POST"),
3636 (
3639 "new Request('data:,hi', {headers:{'X-Foo':'bar'}}).headers.get('x-foo')",
3640 "bar",
3641 ),
3642 ("typeof new Request('data:,hi').headers.get", "function"),
3643 ("(await fetch('data:,hi')).type", "basic"),
3645 ("(await fetch('data:,hi')).redirected", "false"),
3646 ("await fetch(new Request('data:,hello')).then(r => r.text())", "hello"),
3647 (
3648 "await fetch(new Request('data:,x'), {method:'GET'}).then(r => r.status)",
3649 "200",
3650 ),
3651 ("new Headers({'Content-Type':'text/plain'}).get('content-type')", "text/plain"),
3654 ("new Headers([['A','1'],['b','2']]).get('a')", "1"),
3658 ("new Headers().has('x')", "false"),
3659 (
3660 "var h=new Headers(); h.set('X-Foo','1'); h.has('x-foo')",
3661 "true",
3662 ),
3663 (
3664 "var h=new Headers(); h.append('a','1'); h.append('a','2'); h.get('a')",
3665 "1, 2",
3666 ),
3667 (
3668 "var h=new Headers({a:'1'}); h.delete('a'); h.has('a')",
3669 "false",
3670 ),
3671 (
3672 "var h=new Headers({a:'1',b:'2'}); var s=''; h.forEach(function(v,k){s+=k+'='+v+';'}); s",
3673 "a=1;b=2;",
3674 ),
3675 (
3678 "Array.from(new Headers({b:'2',a:'1'}).entries()).map(function(e){return e[0]+'='+e[1]}).join(',')",
3679 "a=1,b=2",
3680 ),
3681 ("Array.from(new Headers({a:'1',b:'2'}).keys()).join(',')", "a,b"),
3682 ("Array.from(new Headers({a:'1',b:'2'}).values()).join(',')", "1,2"),
3683 (
3684 "var s=''; for (var e of new Headers({a:'1',b:'2'})) { s += e[0]+e[1]; } s",
3685 "a1b2",
3686 ),
3687 (
3691 "typeof (await fetch('data:,hi')).headers.get",
3692 "function",
3693 ),
3694 (
3697 "var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.getResponseHeader('x') === null",
3698 "true",
3699 ),
3700 ("typeof XMLHttpRequest", "function"),
3702 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.responseText", "hi"),
3703 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.status", "200"),
3704 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.readyState", "4"),
3705 ("var x=new XMLHttpRequest(); x.open('GET','data:,hi'); x.send(); x.statusText", "OK"),
3708 ("var g=''; var x=new XMLHttpRequest(); x.onload=function(){g=x.responseText}; x.open('GET','data:,YO'); x.send(); g", "YO"),
3709 ("var g=''; var x=new XMLHttpRequest(); x.addEventListener('load',function(){g='L'+x.status}); x.open('GET','data:,q'); x.send(); g", "L200"),
3710 (
3713 "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",
3714 "",
3715 ),
3716 (
3717 "typeof new XMLHttpRequest().removeEventListener",
3718 "function",
3719 ),
3720 ("var x=new XMLHttpRequest(); x.open('GET','data:application/json,{\"n\":5}'); x.send(); JSON.parse(x.responseText).n", "5"),
3721 ("await (await fetch('data:,hi', {method:'POST', body:'x'})).text()", "hi"),
3723 ("(await fetch('data:,ok', {method:'POST', headers:{'Content-Type':'application/json'}, body:'{}'})).status", "200"),
3724 ("var x=new XMLHttpRequest(); x.open('POST','data:,ok'); x.setRequestHeader('Content-Type','application/json'); x.send('{\"a\":1}'); x.responseText", "ok"),
3725 ("var x=new XMLHttpRequest(); x.open('POST','data:,z'); x.send(); x.status", "200"),
3726 ("/\\d+/.test('abc123')", "true"),
3728 ("/^\\d+$/.test('abc')", "false"),
3729 ("'2026-06-15'.match(/(\\d+)-(\\d+)-(\\d+)/)[2]", "06"),
3730 ("'hello world'.replace(/o/g, '0')", "hell0 w0rld"),
3731 ("'a1b2c3'.replace(/\\d/g, m => '[' + m + ']')", "a[1]b[2]c[3]"),
3732 ("'one,two;three four'.split(/[,; ]/).join('|')", "one|two|three|four"),
3733 ("'foobarbaz'.match(/a/g).length", "2"),
3734 ("new RegExp('[A-Z]+').test('hello WORLD')", "true"),
3735 ("'Hello'.replace(/(\\w)(\\w+)/, '$2$1')", "elloH"),
3736 ("'price: $42'.match(/\\$(\\d+)/)[1]", "42"),
3737 ("/cat/i.test('CAT')", "true"),
3738 ("'a,b,,c'.split(/,/).length", "4"),
3739 ("/x/y.sticky", "true"),
3742 ("/x/g.sticky", "false"),
3743 ("/./s.dotAll", "true"),
3744 ("/./.dotAll", "false"),
3745 (
3746 "var re=/foo/y; re.lastIndex=3; re.test('xxxfoo')",
3747 "true",
3748 ),
3749 (
3750 "var re=/foo/y; re.lastIndex=2; re.test('xxxfoo')",
3751 "false",
3752 ),
3753 (
3754 "var re=/foo/y; var a=re.exec('foofoo').index; var b=re.exec('foofoo').index; a+','+b",
3755 "0,3",
3756 ),
3757 ("/x/d.hasIndices", "true"),
3760 ("/x/.hasIndices", "false"),
3761 (
3762 "var m=/(foo)(bar)/d.exec('xxfoobar'); m.indices[0].join(',')",
3763 "2,8",
3764 ),
3765 (
3766 "var m=/(foo)(bar)/d.exec('xxfoobar'); m.indices[1].join(',')+'/'+m.indices[2].join(',')",
3767 "2,5/5,8",
3768 ),
3769 (
3770 "var m=/(foo)(baz)?/d.exec('foo'); typeof m.indices[2]",
3771 "undefined",
3772 ),
3773 ("/x/.exec('x').indices", "undefined"),
3774 ("var n=0; var id=setInterval(function(){n++;}, 10); clearInterval(id); n", "0"),
3779 ("typeof window.innerWidth", "number"),
3781 ("typeof window.innerHeight", "number"),
3782 ("var x=new XMLHttpRequest(); x.open('PUT','data:text/plain,HELLO'); x.send('body'); x.status", "200"),
3786 ("var x=new XMLHttpRequest(); x.open('PUT','data:text/plain,HELLO'); x.send('body'); x.responseText", "HELLO"),
3787 ("var x=new XMLHttpRequest(); x.open('DELETE','data:text/plain,GONE'); x.send(); x.status", "200"),
3788 ("var x=new XMLHttpRequest(); x.open('DELETE','data:text/plain,GONE'); x.send(); x.responseText", "GONE"),
3789 ("var x=new XMLHttpRequest(); x.open('PATCH','data:text/plain,Pdata'); x.send('d'); x.responseText", "Pdata"),
3790 ("var x=new XMLHttpRequest(); x.open('put','data:text/plain,low'); x.send('b'); x.responseText", "low"),
3792 ("history.back(); history._pending_nav", "-1"),
3795 ("history.forward(); history._pending_nav", "1"),
3796 ("history.go(-2); history._pending_nav", "-2"),
3797 ("history.back(); history.back(); history._pending_nav", "-2"),
3798 ("history.go(0); history._pending_nav || 0", "0"),
3799 ("window.addEventListener('popstate', function(){}); window._popstate_listeners.length", "1"),
3801 ("window.addEventListener('scroll', function(){}); window._scroll_listeners.length", "1"),
3803 ("window.addEventListener('scroll', function(){}); window.addEventListener('scroll', function(){}); window._scroll_listeners.length", "2"),
3804 ("window.scrollY", "0"),
3806 (
3809 "var got=null; window.addEventListener('message', function(e){ got=e.data; }); \
3810 window.postMessage({x:1}); got.x",
3811 "1",
3812 ),
3813 (
3814 "var t=null; window.addEventListener('message', function(e){ t=e.type; }); \
3815 window.postMessage('hi'); t",
3816 "message",
3817 ),
3818 (
3822 "var c=new AbortController(); var n=0; \
3823 window.addEventListener('message', function(){n++;}, {signal: c.signal}); \
3824 window.postMessage('a'); c.abort(); window.postMessage('b'); n",
3825 "1",
3826 ),
3827 (
3829 "var c=new AbortController(); c.abort(); var n=0; \
3830 window.addEventListener('message', function(){n++;}, {signal: c.signal}); \
3831 window.postMessage('a'); n",
3832 "0",
3833 ),
3834 ("var p=new Proxy({}, {get:function(t,k){return 'G:'+k;}}); p.foo", "G:foo"),
3837 ("var p=new Proxy({a:42}, {}); p.a", "42"),
3839 ("var log=''; var p=new Proxy({}, {set:function(t,k,v){t['_'+k]=v;return true;}}); p.x=9; p._x", "9"),
3841 ("var p=new Proxy({}, {}); p.y=7; p.y", "7"),
3843 ("var p=new Proxy({}, {has:function(t,k){return k==='magic';}}); ('magic' in p)", "true"),
3845 ("var p=new Proxy({}, {has:function(t,k){return k==='magic';}}); ('other' in p)", "false"),
3846 ("var p=new Proxy({z:1}, {}); ('z' in p)", "true"),
3848 ("var p=new Proxy({z:1}, {}); ('w' in p)", "false"),
3849 (
3853 "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)",
3854 "a:false",
3855 ),
3856 ("var p=new Proxy({a:1}, {}); delete p.a; ('a' in p)", "false"),
3858 ("var p=new Proxy({a:1}, {}); delete p['a']; ('a' in p)", "false"),
3860 (
3864 "var t={}; var p=new Proxy(t, {}); Object.defineProperty(p, 'x', {value:5}); t.x",
3865 "5",
3866 ),
3867 (
3868 "var p=new Proxy({x:5}, {}); Object.getOwnPropertyDescriptor(p, 'x').value",
3869 "5",
3870 ),
3871 ("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"),
3873 ("var f=function(a,b){return a+b;}; var p=new Proxy(f, {}); p(3,4)", "7"),
3875 ("function C(){} var p=new Proxy(C, {construct:function(t,args){return {made:args[0]};}}); (new p(99)).made", "99"),
3877 ("function C(x){this.v=x;} var p=new Proxy(C, {}); (new p(5)).v", "5"),
3879 ("var o={a:1}; Reflect.set(o,'a',8); Reflect.get(o,'a')", "8"),
3881 ("Reflect.has({k:1},'k')", "true"),
3883 ("Reflect.has({k:1},'x')", "false"),
3884 ("var o={a:1,b:2}; Reflect.deleteProperty(o,'a'); ('a' in o)", "false"),
3886 ("Reflect.ownKeys({a:1,b:2,c:3}).length", "3"),
3888 ("var o={}; Reflect.defineProperty(o,'x',{value:42}); o.x", "42"),
3890 ("Reflect.apply(function(a,b){return a-b;}, null, [10,3])", "7"),
3892 (
3896 "Reflect.apply(function(a,b){return a-b;}, null, {0:10,1:3,length:2})",
3897 "7",
3898 ),
3899 ("function P(x){this.x=x;} Reflect.construct(P,[77]).x", "77"),
3901 (
3902 "function P(x){this.x=x;} Reflect.construct(P,{0:77,length:1}).x",
3903 "77",
3904 ),
3905 ("var base={greet:'hi'}; var o=Object.create(base); Reflect.get(o,'greet')", "hi"),
3907 ("var p=new Proxy({n:5}, {get:function(t,k){return Reflect.get(t,k)*2;}}); p.n", "10"),
3909 ("var p=new Proxy([10,20,30], {get:function(t,k){return Reflect.get(t,k);}}); p[1]", "20"),
3911 ("var inner=new Proxy({v:1},{get:function(t,k){return 100;}}); var outer=new Proxy(inner,{}); outer.v", "100"),
3913 ("var wm=new WeakMap(); var k={}; wm.set(k,42); wm.get(k)", "42"),
3915 ("var wm=new WeakMap(); var k={}; wm.set(k,1); wm.has(k)", "true"),
3916 ("var wm=new WeakMap(); var k={}; wm.set(k,1); wm.delete(k); wm.has(k)", "false"),
3917 ("var ws=new WeakSet(); var o={}; ws.add(o); ws.has(o)", "true"),
3919 ("var ws=new WeakSet(); var o={}; ws.add(o); ws.delete(o); ws.has(o)", "false"),
3920 (
3923 "try { new WeakMap().set(1,'x'); 'no-throw' } catch(e) { 'caught' }",
3924 "caught",
3925 ),
3926 (
3927 "try { new WeakSet().add('x'); 'no-throw' } catch(e) { 'caught' }",
3928 "caught",
3929 ),
3930 ("var k1={}; var wm=new WeakMap([[k1,1]]); wm.get(k1)", "1"),
3933 ("var o1={}; var ws=new WeakSet([o1]); ws.has(o1)", "true"),
3934 ("var o={v:7}; var wr=new WeakRef(o); wr.deref().v", "7"),
3936 ("typeof Symbol('x')", "string"),
3938 ("Symbol('a') === Symbol('a')", "false"),
3939 ("Symbol.for('x') === Symbol.for('x')", "true"),
3940 ("Symbol.keyFor(Symbol.for('mykey'))", "mykey"),
3942 ("typeof Symbol.keyFor(Symbol('local'))", "undefined"),
3943 ("typeof Symbol.iterator", "string"),
3944 ("typeof MutationObserver", "function"),
3946 ("var mo = new MutationObserver(function(){}); typeof mo.observe", "function"),
3948 ("var mo = new MutationObserver(function(){}); typeof mo.disconnect + ',' + typeof mo.takeRecords", "function,function"),
3950 ("var mo = new MutationObserver(function(){}); mo.takeRecords().length", "0"),
3952 (
3955 "var el=document.createElement('div'); el.setAttribute('foo','bar'); \
3956 var mo=new MutationObserver(function(){}); \
3957 mo.observe(el,{attributes:true,attributeOldValue:true}); \
3958 el.setAttribute('foo','baz'); var r=mo.takeRecords(); \
3959 r.length+','+r[0].attributeName+','+r[0].oldValue",
3960 "1,foo,bar",
3961 ),
3962 (
3965 "var el=document.createElement('div'); \
3966 var mo=new MutationObserver(function(){}); \
3967 mo.observe(el,{attributes:true,attributeFilter:['foo']}); \
3968 el.setAttribute('bar','x'); el.setAttribute('foo','y'); \
3969 var r=mo.takeRecords(); r.length+','+r[0].attributeName",
3970 "1,foo",
3971 ),
3972 (
3976 "var el=document.createElement('div'); el.setAttribute('foo','bar'); \
3977 var mo=new MutationObserver(function(){}); \
3978 mo.observe(el,{attributes:true,attributeOldValue:true}); \
3979 el.removeAttribute('foo'); var r=mo.takeRecords(); \
3980 r.length+','+r[0].attributeName+','+r[0].oldValue",
3981 "1,foo,bar",
3982 ),
3983 (
3988 "var el=document.createElement('div'); el.className='a'; \
3989 var mo=new MutationObserver(function(){}); \
3990 mo.observe(el,{attributes:true,attributeOldValue:true}); \
3991 el.classList.add('b'); var r=mo.takeRecords(); \
3992 r.length+','+r[0].attributeName+','+r[0].oldValue",
3993 "1,class,a",
3994 ),
3995 (
3996 "var el=document.createElement('div'); el.className='a b'; \
3997 var mo=new MutationObserver(function(){}); \
3998 mo.observe(el,{attributes:true,attributeOldValue:true}); \
3999 el.classList.remove('b'); var r=mo.takeRecords(); \
4000 r.length+','+r[0].attributeName+','+r[0].oldValue",
4001 "1,class,a b",
4002 ),
4003 (
4007 "var el=document.createElement('div'); el.style.color='red'; \
4008 var mo=new MutationObserver(function(){}); \
4009 mo.observe(el,{attributes:true,attributeOldValue:true}); \
4010 el.style.color='blue'; var r=mo.takeRecords(); \
4011 r.length+','+r[0].attributeName+','+r[0].oldValue",
4012 "1,style,color: red",
4013 ),
4014 (
4021 "var el=document.createElement('div'); el.setAttribute('data-x','1'); \
4022 var mo=new MutationObserver(function(){}); \
4023 mo.observe(el,{attributeOldValue:true}); \
4024 el.setAttribute('data-x','2'); var r=mo.takeRecords(); \
4025 r.length+','+r[0].type",
4026 "1,attributes",
4027 ),
4028 (
4030 "var el=document.createElement('div'); \
4031 var mo=new MutationObserver(function(){}); \
4032 mo.observe(el,{attributeFilter:['data-x']}); \
4033 el.setAttribute('data-x','1'); var r=mo.takeRecords(); \
4034 r.length",
4035 "1",
4036 ),
4037 (
4039 "var el=document.createElement('div'); el.textContent='hi'; \
4040 var mo=new MutationObserver(function(){}); \
4041 mo.observe(el,{characterDataOldValue:true, subtree:true}); \
4042 el.textContent='bye'; var r=mo.takeRecords(); \
4043 r.length+','+r[0].type+','+r[0].oldValue",
4044 "1,characterData,hi",
4045 ),
4046 (
4049 "var el=document.createElement('div'); el.setAttribute('data-x','1'); \
4050 var mo=new MutationObserver(function(){}); \
4051 mo.observe(el,{attributes:false, attributeOldValue:true}); \
4052 el.setAttribute('data-x','2'); var r=mo.takeRecords(); \
4053 r.length",
4054 "0",
4055 ),
4056 (
4061 "var el=document.createElement('div'); \
4062 var mo=new MutationObserver(function(){}); \
4063 mo.observe(el,{childList:true}); \
4064 el.innerHTML='<span>hi</span>'; var r=mo.takeRecords(); \
4065 r.length+','+r[0].type+','+r[0].addedNodes.length",
4066 "1,childList,1",
4067 ),
4068 (
4071 "var el=document.createElement('div'); \
4072 var mo=new MutationObserver(function(){}); \
4073 mo.observe(el,{childList:true}); \
4074 el.textContent='hi'; var r=mo.takeRecords(); \
4075 r.length+','+r[0].type+','+r[0].addedNodes.length",
4076 "1,childList,1",
4077 ),
4078 (
4086 "var el=document.createElement('div'); el.textContent='hi'; \
4087 var mo=new MutationObserver(function(){}); \
4088 mo.observe(el,{characterData:true, subtree:true}); \
4089 el.textContent='bye'; var r=mo.takeRecords(); \
4090 r.length+','+r[0].type",
4091 "1,characterData",
4092 ),
4093 (
4095 "var el=document.createElement('div'); el.textContent='hi'; \
4096 var mo=new MutationObserver(function(){}); \
4097 mo.observe(el,{characterData:true, characterDataOldValue:true, subtree:true}); \
4098 el.textContent='bye'; var r=mo.takeRecords(); \
4099 r[0].oldValue",
4100 "hi",
4101 ),
4102 (
4104 "var el=document.createElement('div'); el.textContent='hi'; \
4105 var mo=new MutationObserver(function(){}); \
4106 mo.observe(el,{characterData:true, subtree:true}); \
4107 el.textContent='hi'; var r=mo.takeRecords(); r.length",
4108 "0",
4109 ),
4110 (
4114 "var el=document.createElement('div'); el.textContent='hi'; \
4115 var mo=new MutationObserver(function(){}); \
4116 mo.observe(el,{childList:true}); \
4117 el.textContent='bye'; var r=mo.takeRecords(); r.length",
4118 "0",
4119 ),
4120 ("var o={}; Object.defineProperty(o,'x',{value:42,writable:true}); o.x", "42"),
4122 ("var o={_v:7}; Object.defineProperty(o,'v',{get:function(){return this._v*2;}}); o.v", "14"),
4124 ("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"),
4126 ("var o={_s:''}; Object.defineProperty(o,'s',{set:function(v){this._s=v;}}); o.s='hi'; o._s", "hi"),
4128 ("var o={_v:7}; o.__defineGetter__('v', function(){return this._v*2;}); o.v", "14"),
4131 ("var o={_x:0}; o.__defineSetter__('x', function(v){this._x=v+1;}); o.x=9; o._x", "10"),
4132 (
4134 "var o={_x:1}; o.__defineGetter__('x', function(){return this._x;}); \
4135 o.__defineSetter__('x', function(v){this._x=v;}); o.x=5; o.x",
4136 "5",
4137 ),
4138 ("var o={}; o.__defineGetter__('v', function(){return 1;}); typeof o.__lookupGetter__('v')", "function"),
4139 ("var o={}; typeof o.__lookupGetter__('nope')", "undefined"),
4140 ("var o={}; Object.defineProperties(o,{a:{value:1},b:{value:2}}); o.a+o.b", "3"),
4142 ("var o={n:0}; Object.defineProperty(o,'next',{get:function(){return ++this.n;}}); o.next; o.next; o.next", "3"),
4144 ("var o={x:5}; Object.getOwnPropertyDescriptor(o,'x').value", "5"),
4146 ("var o={}; Object.defineProperty(o,'v',{get:function(){return 99;}}); typeof Object.getOwnPropertyDescriptor(o,'v').get", "function"),
4148 ("Object.getOwnPropertyDescriptor({x:1},'y')", "undefined"),
4150 ("var o={a:1}; Object.defineProperty(o,'b',{get:function(){return 2;}}); Object.getOwnPropertyDescriptors(o).a.value + Object.getOwnPropertyDescriptors(o).b.get()", "3"),
4152 ("var o={_v:7, get v(){return this._v*2;}}; o.v", "14"),
4156 ("var o={_x:0, get x(){return this._x;}, set x(v){this._x=v+1;}}; o.x=9; o.x", "10"),
4158 ("var o={get: 5}; o.get", "5"),
4161 ("var o={get(){return 7;}}; o.get()", "7"),
4162 (
4164 "class Circle { constructor(r){this.r=r;} get area(){return Math.round(Math.PI*this.r*this.r);} } new Circle(2).area",
4165 "13",
4166 ),
4167 (
4169 "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",
4170 "0",
4171 ),
4172 (
4174 "class Config { static get version(){return '1.0';} } Config.version",
4175 "1.0",
4176 ),
4177 ("var a=[1,2,3,4]; var r=a.splice(1,2); r.join(',')+'/'+a.join(',')", "2,3/1,4"),
4179 ("var a=[1,4]; a.splice(1,0,2,3); a.join(',')", "1,2,3,4"),
4181 ("[1,2,3,2,1].lastIndexOf(2)", "3"),
4183 ("[1,2,3,4,5].copyWithin(0,3).join(',')", "4,5,3,4,5"),
4185 ("[1,2,3,4,5].copyWithin(-2,0).join(',')", "1,2,3,1,2"),
4187 ("[1,2,3,4,5].copyWithin(0,3,4).join(',')", "4,2,3,4,5"),
4189 ("var a=[3,1,2]; var s=a.toSorted(); a[0]+'/'+s.join(',')", "3/1,2,3"),
4191 ("[undefined,3,undefined,1,2].sort((a,b)=>a-b).join(',')", "1,2,3,,"),
4193 ("[undefined,3,1,2].sort().join(',')", "1,2,3,"),
4194 ("[undefined,3,1,2].toSorted((a,b)=>a-b).join(',')", "1,2,3,"),
4195 ("[5]*2", "10"),
4197 ("[]+1", "1"),
4198 ("['5']-2", "3"),
4199 ("[1,2]*1", "NaN"),
4200 ("new Proxy([5],{})*2", "10"),
4204 ("+new Proxy([5],{})", "5"),
4205 ("[5]==5", "true"),
4208 ("[5]=='5'", "true"),
4209 ("''==[]", "true"),
4210 ("[1,2]==5", "false"),
4211 ("Number('0x1F')", "31"),
4213 ("Number('0o17')", "15"),
4214 ("Number('0b101')", "5"),
4215 ("+'0xff'", "255"),
4216 ("'abc'.normalize()", "abc"),
4219 ("'abc'.normalize('NFD')", "abc"),
4220 ("(function(){ try { 'x'.normalize('bogus'); return 'no-throw'; } catch(e) { return 'threw'; } })()", "threw"),
4221 ("'e\\u0301'.normalize('NFC') === '\\u00e9'", "true"),
4223 ("'\\u00e9'.normalize('NFD') === 'e\\u0301'", "true"),
4224 ("'\\u00e9'.normalize('NFC') === '\\u00e9'", "true"),
4225 ("var a=null; a?.['x']", "undefined"),
4229 ("var a=undefined; a?.[0]", "undefined"),
4230 ("var a=[1,2,3]; a?.[1]", "2"),
4231 ("var f=null; f?.['x'](1,2)", "undefined"),
4232 ("var a=null; a?.b.c", "undefined"),
4235 ("var a=undefined; a?.b.c.d", "undefined"),
4236 ("var a=null; a?.b[0].c", "undefined"),
4237 ("var a=null; a?.b()", "undefined"),
4238 ("var o={b:{c:5}}; o?.b.c", "5"),
4239 ("(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"),
4242 ("(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"),
4244 ("'x' in {get x(){return 1;}}", "true"),
4247 ("(function(){ var o={get x(){return 1;}}; var ks=[]; for(var k in o) ks.push(k); return ks.join(','); })()", "x"),
4248 ("Object.keys({get x(){return 1;}}).join(',')", "x"),
4250 ("Object.values({get x(){return 42;}}).join(',')", "42"),
4251 ("JSON.stringify(Object.entries({get x(){return 7;}}))", "[[\"x\",7]]"),
4252 ("Object.assign({}, {get x(){return 9;}}).x", "9"),
4253 ("JSON.stringify({get x(){return 5;}})", "{\"x\":5}"),
4255 ("({...{get x(){return 3;}}}).x", "3"),
4257 ("var s={get x(){return 1;}}; var o={...s, y:2}; o.x+','+o.y", "1,2"),
4258 ("(150).toExponential(2)", "1.50e+2"),
4260 ("(0.0012345).toExponential(3)", "1.235e-3"),
4261 ("(123.456).toPrecision(5)", "123.46"),
4262 ("(0.0001234).toPrecision(2)", "0.00012"),
4263 ("(123456).toPrecision(2)", "1.2e+5"),
4264 ("(5).valueOf()", "5"),
4265 ("(1).toFixed(0)", "1"),
4270 ("(1.5).toFixed(100).length", "102"),
4271 (
4272 "try { (1).toFixed(-1); 'no-throw' } catch(e) { 'threw' }",
4273 "threw",
4274 ),
4275 (
4276 "try { (1).toFixed(101); 'no-throw' } catch(e) { 'threw' }",
4277 "threw",
4278 ),
4279 ("(NaN).toFixed(2)", "NaN"),
4280 ("(Infinity).toFixed(2)", "Infinity"),
4281 ("[1,2,3].toLocaleString()", "1,2,3"),
4283 ("[1,null,undefined,2].toLocaleString()", "1,,,2"),
4284 ("(1234.5).toLocaleString()", "1,234.5"),
4287 ("(1234567).toLocaleString()", "1,234,567"),
4288 ("(123).toLocaleString()", "123"),
4289 ("(-1234567.89).toLocaleString()", "-1,234,567.89"),
4290 ("new Intl.NumberFormat().format(1234567)", "1,234,567"),
4293 ("new Intl.NumberFormat('en-US').format(-1234.5)", "-1,234.5"),
4294 ("typeof Intl.NumberFormat().format", "function"),
4295 ("(0).toLocaleString()", "0"),
4296 ("(NaN).toLocaleString()", "NaN"),
4297 ("(Infinity).toLocaleString()", "Infinity"),
4298 ("true.toString()", "true"),
4301 ("false.toString()", "false"),
4302 ("true.valueOf()", "true"),
4303 ("(false).valueOf() === false", "true"),
4304 ("function foo(a,b){} foo.name", "foo"),
4306 ("function foo(a,b){} foo.length", "2"),
4307 ("function foo(a,b=1,...c){} foo.length", "1"),
4308 ("(function(){}).length", "0"),
4309 ("Math.max.length", "0"),
4310 ("function foo(a,b,c){} foo.bind(null).name", "bound foo"),
4313 ("function foo(a,b,c){} foo.bind(null).length", "3"),
4314 ("function foo(a,b,c){} foo.bind(null,1).length", "2"),
4315 ("function foo(a,b,c){} foo.bind(null,1,2,3,4).length", "0"),
4316 (
4319 "function foo(){} String(foo.bind(null)).includes('native code')",
4320 "true",
4321 ),
4322 ("Object.prototype.toString.call([1,2])", "[object Array]"),
4327 ("Object.prototype.toString.call({})", "[object Object]"),
4328 ("Object.prototype.toString.call(new Date())", "[object Date]"),
4329 ("Object.prototype.toString.call(/a/)", "[object RegExp]"),
4330 ("Object.prototype.toString.call(new Map())", "[object Map]"),
4331 ("Object.prototype.toString.call(new Set())", "[object Set]"),
4332 ("Object.prototype.toString.call(function(){})", "[object Function]"),
4333 ("Object.prototype.toString.call(null)", "[object Null]"),
4334 ("Object.prototype.toString.call(undefined)", "[object Undefined]"),
4335 (
4338 "class Foo { get [Symbol.toStringTag](){ return 'Foo'; } } Object.prototype.toString.call(new Foo())",
4339 "[object Foo]",
4340 ),
4341 (
4342 "var o={}; o['Symbol(Symbol.toStringTag)']='Bar'; Object.prototype.toString.call(o)",
4343 "[object Bar]",
4344 ),
4345 ("var f = function(){}; f.name", "f"),
4349 ("var g = () => {}; g.name", "g"),
4350 ("var h = function foo(){}; h.name", "foo"),
4352 ("({bar: function(){}}).bar.name", "bar"),
4354 ("({baz: () => {}}).baz.name", "baz"),
4355 ("({qux(){}}).qux.name", "qux"),
4358 ("var d=new Date(2020,0,1); var c=structuredClone(d); c.getTime()===d.getTime() && c!==d", "true"),
4361 ("var r=/abc/gi; var c=structuredClone(r); c.source+','+c.flags+','+(c!==r)", "abc,gi,true"),
4362 ("var o={get x(){return 1;}, y:2}; var {y, ...rest} = o; rest.x+','+rest.y", "1,undefined"),
4364 ("({get x(){return 1;}}).hasOwnProperty('x')", "true"),
4367 ("[1,2,3].hasOwnProperty(0)", "true"),
4368 ("[1,2,3].hasOwnProperty('length')", "true"),
4369 ("[1,2,3].hasOwnProperty(5)", "false"),
4370 ("Object.hasOwn({get x(){return 1;}}, 'x')", "true"),
4371 ("({}).toLocaleString()", "[object Object]"),
4372 ("[{}, {}].toLocaleString()", "[object Object],[object Object]"),
4373 ("Object.getOwnPropertyDescriptor([1,2,3], '0').value", "1"),
4376 ("Object.getOwnPropertyDescriptor([1,2,3], 'length').value", "3"),
4377 ("Object.keys(Object.getOwnPropertyDescriptors([1,2])).sort().join(',')", "0,1,length"),
4378 ("var a=[1,2,3]; Object.defineProperty(a,'0',{value:99}); a[0]", "99"),
4381 ("var a=[1,2]; Object.defineProperty(a,'5',{value:9}); a.length+','+a[5]", "6,9"),
4382 ("var a=[1,2,3]; Object.defineProperty(a,'length',{value:1}); a.join(',')", "1"),
4383 ("[...[1,2,3][Symbol.iterator]()].join(',')", "1,2,3"),
4387 ("var m=new Map([['a',1]]); [...m[Symbol.iterator]()][0].join(',')", "a,1"),
4388 ("[...new Set([1,2])[Symbol.iterator]()].join(',')", "1,2"),
4389 ("var it=[10,20].values(); it.next().value+','+it.next().value+','+it.next().done", "10,20,true"),
4393 ("var it=[1,2].entries(); it.next().value.join(',')", "0,1"),
4394 ("var it=[1,2].keys(); it.next().value+','+it.next().value", "0,1"),
4395 ("var it=new Map([['a',1]]).entries(); it.next().value.join(',')", "a,1"),
4396 ("var it=new Set([5,6]).values(); it.next().value+','+it.next().value", "5,6"),
4397 ("var it=[1].values(); it[Symbol.iterator]()===it", "true"),
4398 ("[...'ab'[Symbol.iterator]()].join(',')", "a,b"),
4400 ("var it='xy'[Symbol.iterator](); it.next().value+it.next().value+it.next().done", "xytrue"),
4401 ("Array.from([10,20].values()).join(',')", "10,20"),
4405 ("Array.from([1,2].entries()).map(e=>e.join(':')).join(',')", "0:1,1:2"),
4406 ("var m=new Map(new Map([['a',1]]).entries()); m.get('a')", "1"),
4407 ("var s=new Set([1,2,2,3].values()); [...s].join(',')", "1,2,3"),
4408 ("Object.keys([1,2].values()).length", "0"),
4411 ("JSON.stringify([1,2].values())", "{}"),
4412 ("Object.keys({...[1,2].values()}).length", "0"),
4413 ("new AggregateError([1,2],'m').errors.join(',')", "1,2"),
4417 ("new AggregateError([],'m') instanceof Error", "true"),
4418 (
4419 "await Promise.any([Promise.reject('a'),Promise.reject('b')]).catch(e => e.name+':'+e.errors.join(','))",
4420 "AggregateError:a,b",
4421 ),
4422 ("new Date('2024-01-15').getFullYear()+'-'+(new Date('2024-01-15').getMonth()+1)+'-'+new Date('2024-01-15').getDate()", "2024-1-15"),
4425 ("Date.parse('2024-01-15T00:00:00Z')", "1705276800000"),
4426 ("Date.parse('2024-01-15T02:00:00+02:00')", "1705276800000"),
4427 ("Date.parse('2024-01-15T09:00:00+0900')", "1705276800000"),
4429 ("Date.parse('2024-01-15T00:00:00+00')", "1705276800000"),
4430 ("new Date('2024-01-15T00:00:00.500Z').getTime()", "1705276800500"),
4431 ("isNaN(Date.parse('not a date'))", "true"),
4432 ("Date.parse('Mon, 15 Jan 2024 00:00:00 GMT')", "1705276800000"),
4436 ("Date.parse('15 Jan 2024 00:00:00 GMT')", "1705276800000"),
4437 ("Date.parse('Mon, 15 Jan 2024 02:00:00 +0200')", "1705276800000"),
4438 ("Date.UTC(2024, 0, 15) === Date.parse('2024-01-15T00:00:00Z')", "true"),
4440 ("new Date(Date.UTC(2024,0,15,10,30,0)).getUTCHours()", "10"),
4441 ("new Date(Date.UTC(2024,0)).getDate()", "1"),
4443 ("new Date('Mon, 15 Jan 2024 00:00:00 GMT').getFullYear()", "2024"),
4444 ("'2024-01-15'.match(/(?<year>\\d+)-(?<month>\\d+)-(?<day>\\d+)/).groups.year", "2024"),
4448 ("'2024-01-15'.match(/(?<year>\\d+)-(?<month>\\d+)-(?<day>\\d+)/).groups.month", "01"),
4449 ("/(?<a>x)(y)/.exec('xy')[2]", "y"),
4450 ("/(x)/.exec('x').groups", "undefined"),
4451 ("[...'a1 b2'.matchAll(/(?<letter>[a-z])(?<num>\\d)/g)].map(m=>m.groups.letter+m.groups.num).join(',')", "a1,b2"),
4452 ("'2024-01-15'.replace(/(?<y>\\d+)-(?<m>\\d+)-(?<d>\\d+)/, '$<d>/$<m>/$<y>')", "15/01/2024"),
4455 ("'abc'.replace(/b/, \"[$`|$']\")", "a[a|c]c"),
4456 ("'x'.replace(/(?<a>x)/, (m,a,off,str,groups)=>groups.a+'!')", "x!"),
4457 ("/\\u0041/.test('A')", "true"),
4460 ("/\\u{1F600}/u.test('\\u{1F600}')", "true"),
4461 ("/\\x41/.test('A')", "true"),
4462 ("'A1'.match(/\\u0041\\d/)[0]", "A1"),
4463 ("/[\\u0041-\\u005A]/.test('M')", "true"),
4465 ("/[\\x41-\\x5A]/.test('Z')", "true"),
4466 ("/[\\u0041-\\u005A]/.test('m')", "false"),
4467 ("'a1b2c'.split(/(\\d)/).join('|')", "a|1|b|2|c"),
4470 ("'axb'.split(/(x)|(y)/).join(',')", "a,x,,b"),
4471 ("'abc'.split(/b/).join(',')", "a,c"),
4472 ("class C { *gen(){ yield 1; yield 2; } } [...new C().gen()].join(',')", "1,2"),
4476 ("await (new (class C { async f(){ return 42; } })()).f()", "42"),
4477 ("class C { *gen(){ yield 'a'; } method(){ return 'm'; } } var c=new C(); [...c.gen()].join(',')+c.method()", "am"),
4478 ("[...{ *gen(){ yield 1; yield 2; } }.gen()].join(',')", "1,2"),
4479 ("await { async f(){ return 'ok'; } }.f()", "ok"),
4480 ("await (class C { static async f(){ return 7; } }).f()", "7"),
4482 ("class C { static *gen(){ yield 9; } } [...C.gen()].join(',')", "9"),
4483 ("class C { *[Symbol.iterator](){ yield 3; } } [...new C()].join(',')", "3"),
4484 ("({ async *gen(){}, method(){ return 'ok'; } }).method()", "ok"),
4485 ("var k='x'; var {[k]: v} = {x: 42}; v", "42"),
4488 ("var k='a'; var {[k]: v, y} = {a: 1, y: 2}; v+','+y", "1,2"),
4489 ("var k='n'; function f({[k]: val}){ return val; } f({n: 7})", "7"),
4490 ("({ async: 1, b: 2 }).async + ({ async: 1, b: 2 }).b", "3"),
4494 ("class C { async = 5; b = 6; } var c = new C(); c.async + c.b", "11"),
4495 ("class C { static = 5; b = 6; } var c = new C(); c.static + c.b", "11"),
4498 ("class C { static x = 1; static method(){ return 2; } } C.x + C.method()", "3"),
4499 ("var k='x'; var o={ get [k](){ return 42; } }; o.x", "42"),
4503 ("var k='y'; var o={y:0, set [k](v){ this._y=v; } }; o.y=5; o._y", "5"),
4504 ("var k='z'; class C { get [k](){ return 9; } } new C().z", "9"),
4505 ("var a=[]; for(let i=0;i<3;i++){ a.push(()=>i); } a.map(f=>f()).join(',')", "0,1,2"),
4509 ("var a=[]; for(var i=0;i<3;i++){ a.push(()=>i); } a.map(f=>f()).join(',')", "3,3,3"),
4510 ("var a=[]; for(let i=0;i<3;i++){ if(i===1) continue; a.push(()=>i); } a.map(f=>f()).join(',')", "0,2"),
4511 ("var a=[]; for(const x of [1,2,3]){ a.push(()=>x); } a.map(f=>f()).join(',')", "1,2,3"),
4513 ("var a=[]; for(var x of [1,2,3]){ a.push(()=>x); } a.map(f=>f()).join(',')", "3,3,3"),
4514 ("var a=[]; for(let k in {a:1,b:2}){ a.push(()=>k); } a.map(f=>f()).join(',')", "a,b"),
4515 ("new Proxy([1,2,3],{}).map(x=>x*2).join(',')", "2,4,6"),
4520 ("var p=new Proxy([1,2],{}); p.push(3); p.join(',')", "1,2,3"),
4521 ("new Proxy([5,6,7],{}).indexOf(6)", "1"),
4522 ("String(new Proxy([1,2,3], {}))", "1,2,3"),
4526 ("'' + new Proxy([7,8], {})", "7,8"),
4527 ("var p=new Proxy(new Map([['a',1]]),{}); p.get('a')", "1"),
4529 ("var p=new Proxy(new Set([1,2]),{}); p.add(3); [...p].join(',')", "1,2,3"),
4530 ("var o={}; var p=new Proxy(new WeakSet([o]),{}); p.has(o)", "true"),
4532 ("await new Proxy(Promise.resolve(5), {}).then(x=>x*2)", "10"),
4533 ("function* g(){ yield 1; yield 2; } var p=new Proxy(g(),{}); [...p].join(',')", "1,2"),
4534 ("String.fromCharCode(72,105)", "Hi"),
4537 ("String.fromCharCode(0xD83D,0xDE00)", "\u{1F600}"),
4538 ("String.fromCodePoint(0x1F600)", "\u{1F600}"),
4539 ("String.fromCodePoint(72,105)", "Hi"),
4540 ("Object.create(null, {x:{value:5}}).x", "5"),
4542 ("var o=Object.create(null, {y:{value:9}, z:{value:1}}); o.y + o.z", "10"),
4543 ("JSON.stringify({toJSON(){ return 42; }})", "42"),
4546 ("JSON.stringify({a: {toJSON(){ return 'x'; }}})", "{\"a\":\"x\"}"),
4547 ("JSON.stringify([{toJSON(){ return 1; }}, 2])", "[1,2]"),
4548 ("1_000_000", "1000000"),
4552 ("0x1_000", "4096"),
4553 ("1_000.5_5", "1000.55"),
4554 ("0o17", "15"),
4558 ("0b101", "5"),
4559 ("0o17 + 0b101", "20"),
4560 ("0b101n + 2n", "7"),
4561 ("'abc\\\ndef'", "abcdef"),
4564 ("'abc\\\r\ndef'.length", "6"),
4565 ("var a=[1,2,3]; var r=a.toReversed(); a[0]+'/'+r.join(',')", "1/3,2,1"),
4567 ("var a=[1,2,3]; var s=a.toSpliced(1,1,9); a.join(',')+'/'+s.join(',')", "1,2,3/1,9,3"),
4569 ("[1,2,3].toSpliced(1).join(',')", "1"),
4572 ("[1,2,3].toSpliced(1, undefined).join(',')", "1,2,3"),
4573 (
4577 "var a=[1,2]; a[Symbol.isConcatSpreadable]=false; [0].concat(a).length",
4578 "2",
4579 ),
4580 (
4583 "var o={0:'x',1:'y',length:2}; o[Symbol.isConcatSpreadable]=true; [0].concat(o).join(',')",
4584 "0,x,y",
4585 ),
4586 ("[1].concat([2,3],4).join(',')", "1,2,3,4"),
4588 (
4595 "var f=[].join; f.call({0:'a',1:'b',length:2}, '-')",
4596 "a-b",
4597 ),
4598 (
4602 "var o={length:0}; var f=[].push; f.call(o,'a','b')+','+o.length+','+o[0]+','+o[1]",
4603 "2,2,a,b",
4604 ),
4605 (
4606 "var o={0:'a',1:'b',length:2}; var f=[].pop; f.call(o)+','+o.length",
4607 "b,1",
4608 ),
4609 (
4610 "var o={0:'a',1:'b',length:2}; var f=[].shift; f.call(o)+','+o.length+','+o[0]",
4611 "a,1,b",
4612 ),
4613 (
4614 "var o={0:'a',length:1}; var f=[].unshift; f.call(o,'x','y')+','+o.length+','+o[0]+','+o[1]+','+o[2]",
4615 "3,3,x,y,a",
4616 ),
4617 ("[1,2,3].join('-')", "1-2-3"),
4619 (
4622 "var fact = function(n){ return n <= 1 ? 1 : n * arguments.callee(n - 1); }; fact(5)",
4623 "120",
4624 ),
4625 ("var g = function(){ return arguments.callee === g; }; g()", "true"),
4626 ("(function f(n){ return n<=1?1:n*f(n-1); })(5)", "120"),
4629 ("(function f(){ return typeof f; })()", "function"),
4630 ("(function f(){})(); typeof f", "undefined"),
4632 (
4636 "var s=[].slice; s.call({0:'a',1:'b',length:2}, 0, 1).join(',')",
4637 "a",
4638 ),
4639 (
4640 "var s=[].slice; s.call({0:'a',1:'b',2:'c',length:3}, 1).join(',')",
4641 "b,c",
4642 ),
4643 ("[1,2,3,4].slice(1,3).join(',')", "2,3"),
4645 (
4650 "var out=''; var fe=[].forEach; fe.call({0:'a',1:'b',length:2}, function(v){ out+=v }); out",
4651 "ab",
4652 ),
4653 (
4654 "var m=[].map; m.call({0:1,1:2,length:2}, function(v){ return v*2 }).join(',')",
4655 "2,4",
4656 ),
4657 (
4658 "var fl=[].filter; fl.call({0:1,1:2,2:3,length:3}, function(v){ return v>1 }).join(',')",
4659 "2,3",
4660 ),
4661 (
4662 "var io=[].indexOf; io.call({0:'a',1:'b',length:2}, 'b')",
4663 "1",
4664 ),
4665 (
4666 "var inc=[].includes; inc.call({0:'a',1:'b',length:2}, 'b')",
4667 "true",
4668 ),
4669 (
4672 "var r=[].reduce; r.call({0:1,1:2,2:3,length:3}, function(a,v){ return a+v }, 0)",
4673 "6",
4674 ),
4675 (
4676 "var fd=[].find; fd.call({0:1,1:2,2:3,length:3}, function(v){ return v>1 })",
4677 "2",
4678 ),
4679 (
4680 "var fi=[].findIndex; fi.call({0:1,1:2,2:3,length:3}, function(v){ return v>1 })",
4681 "1",
4682 ),
4683 (
4684 "var sm=[].some; sm.call({0:1,1:2,length:2}, function(v){ return v>1 })",
4685 "true",
4686 ),
4687 (
4688 "var ev=[].every; ev.call({0:1,1:2,length:2}, function(v){ return v>0 })",
4689 "true",
4690 ),
4691 (
4692 "var at=[].at; at.call({0:1,1:2,length:2}, -1)",
4693 "2",
4694 ),
4695 (
4696 "var fl=[].findLast; fl.call({0:1,1:2,length:2}, function(v){ return v<2 })",
4697 "1",
4698 ),
4699 (
4700 "var fli=[].findLastIndex; fli.call({0:1,1:2,length:2}, function(v){ return v<2 })",
4701 "0",
4702 ),
4703 (
4704 "var fm=[].flatMap; fm.call({0:1,1:2,length:2}, function(v){ return v*2 }).join(',')",
4705 "2,4",
4706 ),
4707 (
4708 "var rr=[].reduceRight; rr.call({0:1,1:2,length:2}, function(a,v){ return a+v })",
4709 "3",
4710 ),
4711 (
4712 "var lio=[].lastIndexOf; lio.call({0:1,1:1,length:2}, 1)",
4713 "1",
4714 ),
4715 (
4716 "var fla=[].flat; fla.call({0:1,1:[2,3],length:2}).join(',')",
4717 "1,2,3",
4718 ),
4719 (
4720 "var en=[].entries; var itr=en.call({0:1,1:2,length:2}); itr.next().value.join(',')",
4721 "0,1",
4722 ),
4723 (
4724 "var ky=[].keys; var itr=ky.call({0:1,1:2,length:2}); itr.next().value+','+itr.next().value",
4725 "0,1",
4726 ),
4727 (
4728 "var vl=[].values; var itr=vl.call({0:1,1:2,length:2}); itr.next().value+','+itr.next().value",
4729 "1,2",
4730 ),
4731 (
4732 "var tls=[].toLocaleString; tls.call({0:1,1:2,length:2})",
4733 "1,2",
4734 ),
4735 (
4736 "var o={0:1,1:2,length:2}; o[Symbol.isConcatSpreadable]=true; [].concat.call(o, 3).join(',')",
4737 "1,2,3",
4738 ),
4739 (
4740 "var o={0:1,1:2,length:2}; [].concat.call(o, 3).length",
4741 "2",
4742 ),
4743 (
4744 "var ts=[].toSorted; ts.call({0:3,1:1,length:2}).join(',')",
4745 "1,3",
4746 ),
4747 (
4748 "var tr=[].toReversed; tr.call({0:1,1:2,length:2}).join(',')",
4749 "2,1",
4750 ),
4751 (
4752 "var tsp=[].toSpliced; tsp.call({0:1,1:2,length:2}, 1, 0, 9).join(',')",
4753 "1,9,2",
4754 ),
4755 (
4756 "var w=[].with; w.call({0:1,1:2,length:2}, 0, 9).join(',')",
4757 "9,2",
4758 ),
4759 ("[1,2,3].map(function(v){return v*2}).join(',')", "2,4,6"),
4761 ("var a=[1,2,3]; var b=a.with(1,9); a[1]+'/'+b[1]", "2/9"),
4763 ("(function(){ try { throw new TypeError('bad'); } catch(e) { return e.name+':'+e.message; } })()", "TypeError:bad"),
4765 ("(function(){ try { throw new RangeError('oor'); } catch(e) { return e.name; } })()", "RangeError"),
4767 ("typeof new FinalizationRegistry(function(){}).register", "function"),
4769 ("var ok=false; requestIdleCallback(function(d){ ok = !d.didTimeout && d.timeRemaining()>0; }); ok", "true"),
4771 ("Object.hasOwn({x:1},'x')+','+Object.hasOwn({x:1},'y')", "true,false"),
4773 ("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"),
4775 ("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"),
4777 (
4778 "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(',')",
4779 "2/1,3",
4780 ),
4781 ("Map.groupBy([1,2,3],function(n){return n}).size", "3"),
4782 (
4785 "var g=Object.groupBy(new Set([1,2,3,4]),function(n){return n%2===0?'e':'o'}); g.e.join(',')+'/'+g.o.join(',')",
4786 "2,4/1,3",
4787 ),
4788 (
4789 "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(',')",
4790 "2/1,3",
4791 ),
4792 (
4793 "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(',')",
4794 "2,4/1,3",
4795 ),
4796 (
4800 "function* gen(){yield [1,'a'];yield [2,'b'];} var m=new Map(gen()); m.get(1)+','+m.get(2)",
4801 "a,b",
4802 ),
4803 (
4804 "function* gen(){yield 1;yield 2;yield 2;} [...new Set(gen())].join(',')",
4805 "1,2",
4806 ),
4807 (
4808 "function* gen(){yield ['a',1];} Object.fromEntries(gen()).a",
4809 "1",
4810 ),
4811 (
4812 "function* gen(){yield Promise.resolve(1);yield Promise.resolve(2);} await Promise.all(gen()).then(a => a.join(','))",
4813 "1,2",
4814 ),
4815 ("var a=new Uint8Array(3); a[0]=10; a[1]=20; a.length+','+a[0]+','+a[1]", "3,10,20"),
4817 ("Array.from(new Uint8Array([1,2,3])).join(',')", "1,2,3"),
4819 ("Uint8Array.from([4,5,6]).join(',')", "4,5,6"),
4821 (
4823 "function* gen(){yield 1;yield 2;yield 3;} new Uint8Array(gen()).join(',')",
4824 "1,2,3",
4825 ),
4826 (
4828 "function* gen(){yield 'a';yield 'b';} new AggregateError(gen(), 'msg').errors.join(',')",
4829 "a,b",
4830 ),
4831 ("var a=new Uint8Array([256,-1,300]); a.join(',')", "0,255,44"),
4833 (
4836 "try { new Uint8Array(-1); 'no-throw' } catch(e) { 'threw' }",
4837 "threw",
4838 ),
4839 (
4840 "try { new Float64Array(-3); 'no-throw' } catch(e) { 'threw' }",
4841 "threw",
4842 ),
4843 (
4849 "try { new Uint8Array(3).set([1,2,3], 5); 'no-throw' } catch(e) { 'threw' }",
4850 "threw",
4851 ),
4852 (
4853 "try { new Uint8Array(3).set([1,2], 2); 'no-throw' } catch(e) { 'threw' }",
4854 "threw",
4855 ),
4856 (
4857 "var a=new Uint8Array(3); a.set([9,9], 1); a.join(',')",
4859 "0,9,9",
4860 ),
4861 ("var a=new Uint8Array(4); a.set([9,9],1); a.join(',')", "0,9,9,0"),
4863 (
4865 "var a=new Uint8Array(3); a.set({0:5,1:6,length:2}); a.join(',')",
4866 "5,6,0",
4867 ),
4868 ("var a=new Uint8Array([1,2,3,4,5]); var s=a.slice(1,3); s.join(',')+'/'+a.length", "2,3/5"),
4870 ("var a=new Uint8Array(4); a.fill(7,1,3); a.join(',')", "0,7,7,0"),
4872 ("var a=new Uint8Array(5); a.byteLength+','+a.BYTES_PER_ELEMENT+','+a.buffer.byteLength", "5,1,5"),
4874 ("var b=new ArrayBuffer(8); new Uint8Array(b).length+','+b.byteLength", "8,8"),
4876 (
4879 "var b=new ArrayBuffer(4,{maxByteLength:16}); b.resizable+','+b.maxByteLength+','+b.byteLength",
4880 "true,16,4",
4881 ),
4882 ("var b=new ArrayBuffer(4); b.resizable+','+b.maxByteLength", "false,4"),
4883 (
4885 "var b=new ArrayBuffer(4,{maxByteLength:16}); b.resize(8); var u=new Uint8Array(b); b.byteLength+','+u.length",
4886 "8,8",
4887 ),
4888 (
4890 "var b=new ArrayBuffer(4,{maxByteLength:8}); try { b.resize(9); 'no throw'; } catch(e) { 'threw'; }",
4891 "threw",
4892 ),
4893 (
4895 "var b=new ArrayBuffer(4); try { b.resize(2); 'no throw'; } catch(e) { 'threw'; }",
4896 "threw",
4897 ),
4898 (
4902 "var b=new ArrayBuffer(4); var b2=b.transfer(); b.byteLength+','+b2.byteLength",
4903 "0,4",
4904 ),
4905 (
4907 "var b=new ArrayBuffer(4); b.transfer(); try { b.transfer(); 'no throw'; } catch(e) { 'threw'; }",
4908 "threw",
4909 ),
4910 (
4912 "var b=new ArrayBuffer(4,{maxByteLength:8}); var b2=b.transferToFixedLength(); b2.resizable",
4913 "false",
4914 ),
4915 (
4919 "var b=new ArrayBuffer(4,{maxByteLength:16}); var c=structuredClone(b); \
4920 c.resizable+','+c.maxByteLength+','+c.byteLength",
4921 "true,16,4",
4922 ),
4923 (
4924 "var b=new ArrayBuffer(4,{maxByteLength:16}); var c=structuredClone(b); \
4925 c.resize(8); c.byteLength",
4926 "8",
4927 ),
4928 ("new Uint8Array([72,101,108,108,111]).toBase64()", "SGVsbG8="),
4930 ("Array.from(Uint8Array.fromBase64('SGVsbG8=')).join(',')", "72,101,108,108,111"),
4931 ("new Uint8Array([222,173,190,239]).toHex()", "deadbeef"),
4932 ("Array.from(Uint8Array.fromHex('deadbeef')).join(',')", "222,173,190,239"),
4933 (
4935 "var a=new Uint8Array([1,2,3,255,0]); Array.from(Uint8Array.fromBase64(a.toBase64())).join(',')",
4936 "1,2,3,255,0",
4937 ),
4938 (
4939 "var a=new Uint8Array([1,2,3,255,0]); Array.from(Uint8Array.fromHex(a.toHex())).join(',')",
4940 "1,2,3,255,0",
4941 ),
4942 (
4944 "try { Uint8Array.fromHex('abc'); 'no-throw' } catch(e) { 'caught:' + e.name }",
4945 "caught:SyntaxError",
4946 ),
4947 (
4949 "var a=new Uint8Array(5); var r=a.setFromBase64('SGVsbG8='); Array.from(a).join(',')+'|'+r.read+'|'+r.written",
4950 "72,101,108,108,111|8|5",
4951 ),
4952 (
4953 "var a=new Uint8Array(4); var r=a.setFromHex('deadbeef'); Array.from(a).join(',')+'|'+r.read+'|'+r.written",
4954 "222,173,190,239|8|4",
4955 ),
4956 (
4957 "try { new Uint8Array(1).setFromHex('zz'); 'no-throw' } catch(e) { 'caught:' + e.name }",
4958 "caught:SyntaxError",
4959 ),
4960 ("var e=new TextEncoder().encode('AB'); e.length+','+e[0]+','+e[1]", "2,65,66"),
4962 ("new TextDecoder().decode(new TextEncoder().encode('hello'))", "hello"),
4964 (
4967 "var buf=new Uint8Array(5); var r=new TextEncoder().encodeInto('Hi', buf); \
4968 r.read+','+r.written+','+buf[0]+','+buf[1]",
4969 "2,2,72,105",
4970 ),
4971 (
4974 "var buf=new Uint8Array(1); var r=new TextEncoder().encodeInto('AB', buf); \
4975 r.read+','+r.written",
4976 "1,1",
4977 ),
4978 ("var a=new Int8Array([200,-100]); a.join(',')", "-56,-100"),
4980 ("var a=new Uint8ClampedArray([300,-50,128.6]); a.join(',')", "255,0,129"),
4982 ("var a=new Uint8ClampedArray([0.5,1.5,2.5,3.5]); a.join(',')", "0,2,2,4"),
4985 ("var a=new Int16Array([40000]); a[0]", "-25536"),
4987 ("var a=new Int8Array(1); a[0]=200; a[0]", "-56"),
4990 ("var a=new Uint8ClampedArray(1); a[0]=300; a[0]", "255"),
4991 ("var a=new Uint8ClampedArray(1); a[0]=-50; a[0]", "0"),
4992 ("var a=new Int16Array(1); a[0]=40000; a[0]", "-25536"),
4993 ("var a=new Uint16Array([70000]); a[0]", "4464"),
4994 ("var a=new Int32Array([4294967295]); a[0]", "-1"),
4996 ("var a=new Uint32Array([-1]); a[0]", "4294967295"),
4997 ("var a=new Float32Array([0.1]); a[0] !== 0.1", "true"),
4999 ("var a=new Float16Array([1.5]); a[0] === 1.5", "true"),
5001 ("var dv=new DataView(new ArrayBuffer(2)); dv.setFloat16(0, 2.5); dv.getFloat16(0)", "2.5"),
5002 ("var a=new Float64Array([0.1]); a[0] === 0.1", "true"),
5004 ("new Int16Array(1).BYTES_PER_ELEMENT+','+new Float64Array(1).BYTES_PER_ELEMENT", "2,8"),
5006 ("Int32Array.from([1,2,3]).join(',')", "1,2,3"),
5008 ("var a=new Uint16Array(3); a.set([1,2],1); a.join(',')", "0,1,2"),
5009 ("var a=new Int8Array([1,2,3,4]); a.slice(1,3).join(',')", "2,3"),
5010 ("var a=new Uint32Array(3); a.fill(5); a.join(',')", "5,5,5"),
5011 (
5015 "var a=new Int8Array([200,3,1]); var b=a.toSorted(); b.join(',')+','+b.BYTES_PER_ELEMENT",
5016 "-56,1,3,1",
5017 ),
5018 (
5019 "var a=new Int8Array([1,2,200]); var b=a.toReversed(); b.join(',')+','+b.BYTES_PER_ELEMENT",
5020 "-56,2,1,1",
5021 ),
5022 (
5023 "var a=new Int8Array([1,2,3]); var b=a.with(1,200); b.join(',')+','+b.BYTES_PER_ELEMENT",
5024 "1,-56,3,1",
5025 ),
5026 (
5029 "var a=new Int8Array([1,2,3]); var b=a.map(x => x + 200); b.join(',')+','+b.BYTES_PER_ELEMENT",
5030 "-55,-54,-53,1",
5031 ),
5032 (
5033 "var a=new Int8Array([1,2,3,4]); var b=a.filter(x => x % 2 === 0); b.join(',')+','+b.BYTES_PER_ELEMENT",
5034 "2,4,1",
5035 ),
5036 (
5039 "var dv=new DataView(new ArrayBuffer(4)); dv.setUint8(0,255); dv.getUint8(0)",
5040 "255",
5041 ),
5042 (
5044 "var dv=new DataView(new ArrayBuffer(4)); dv.setUint32(0,0x01020304); dv.getUint8(0)+','+dv.getUint8(3)",
5045 "1,4",
5046 ),
5047 (
5049 "var dv=new DataView(new ArrayBuffer(4)); dv.setUint32(0,0x01020304,true); dv.getUint8(0)+','+dv.getUint8(3)",
5050 "4,1",
5051 ),
5052 ("var dv=new DataView(new ArrayBuffer(2)); dv.setInt16(0,-1); dv.getUint16(0)", "65535"),
5054 ("var dv=new DataView(new ArrayBuffer(8)); dv.setFloat64(0,3.5); dv.getFloat64(0)", "3.5"),
5056 (
5058 "try { new DataView(new ArrayBuffer(1)).getUint32(0); 'no throw'; } catch(e) { 'threw'; }",
5059 "threw",
5060 ),
5061 ("new Blob(['hello', ' ', 'world']).size", "11"),
5064 ("new Blob(['abc'], {type:'text/plain'}).type", "text/plain"),
5065 ("await new Blob(['hello world']).text()", "hello world"),
5066 ("await new Blob(['hello world']).slice(0,5).text()", "hello"),
5067 (
5070 "var buf = await new Blob(['A']).arrayBuffer(); new DataView(buf).getUint8(0)",
5071 "65",
5072 ),
5073 (
5083 "var u = await new Blob(['AB']).bytes(); u.BYTES_PER_ELEMENT",
5084 "1",
5085 ),
5086 ("var u = await new Blob(['AB']).bytes(); u[0]+','+u[1]", "65,66"),
5087 ("new File(['hi'], 'a.txt').name", "a.txt"),
5090 ("new File(['hi'], 'a.txt', {type:'text/plain'}).type", "text/plain"),
5091 ("new File(['hello'], 'a.txt').size", "5"),
5092 ("await new File(['hello'], 'a.txt').text()", "hello"),
5093 ("await new File(['hello world'], 'a.txt').slice(0,5).text()", "hello"),
5095 ("new File(['x'], 'a.txt', {lastModified: 12345}).lastModified", "12345"),
5097 ("new File(['x'], 'a.txt').webkitRelativePath", ""),
5101 (
5105 "var c=structuredClone(new File(['hi'], 'a.txt', {lastModified: 12345})); \
5106 c.name + ',' + c.lastModified",
5107 "a.txt,12345",
5108 ),
5109 (
5110 "await structuredClone(new File(['hello'], 'a.txt')).text()",
5111 "hello",
5112 ),
5113 ("structuredClone(new Blob(['x'])).name", "undefined"),
5116 (
5120 "var r=new FileReader(); var out; r.onload=function(e){ out=e.target.result; }; \
5121 r.readAsText(new Blob(['hello'])); out",
5122 "hello",
5123 ),
5124 (
5125 "var r=new FileReader(); r.readAsText(new Blob(['x'])); r.readyState",
5126 "2",
5127 ),
5128 (
5129 "var r=new FileReader(); var buf; r.onload=function(e){ buf=e.target.result; }; \
5130 r.readAsArrayBuffer(new Blob(['A'])); new DataView(buf).getUint8(0)",
5131 "65",
5132 ),
5133 (
5134 "var r=new FileReader(); var url; r.onload=function(e){ url=e.target.result; }; \
5135 r.readAsDataURL(new Blob(['hi'], {type:'text/plain'})); url",
5136 "data:text/plain;base64,aGk=",
5137 ),
5138 (
5141 "var r=new FileReader(); var fired=false; r.addEventListener('load', ()=>fired=true); \
5142 r.readAsText(new Blob(['x'])); fired",
5143 "true",
5144 ),
5145 ("Notification.permission", "granted"),
5148 ("await Notification.requestPermission()", "granted"),
5149 (
5150 "var n = new Notification('hi', {body: 'world'}); n.title + ':' + n.body",
5151 "hi:world",
5152 ),
5153 ("typeof new Notification('x').close", "function"),
5154 (
5158 "var n = new Notification('x', {data: {id: 5}, requireInteraction: true, silent: true}); \
5159 n.data.id + ',' + n.requireInteraction + ',' + n.silent",
5160 "5,true,true",
5161 ),
5162 ("new Notification('x').dir", "auto"),
5163 ("new Notification('x').data", "null"),
5164 ("typeof new Notification('x').removeEventListener", "function"),
5165 (
5167 "var {promise, resolve} = Promise.withResolvers(); resolve(5); await promise",
5168 "5",
5169 ),
5170 (
5171 "var {promise, reject} = Promise.withResolvers(); reject('e'); await promise.catch(e => 'caught:' + e)",
5172 "caught:e",
5173 ),
5174 ("await Promise.try(() => 42)", "42"),
5176 (
5177 "await Promise.try(() => { throw 'boom' }).catch(e => 'caught:' + e)",
5178 "caught:boom",
5179 ),
5180 ("await Promise.try(() => Promise.resolve('ok'))", "ok"),
5181 ("await Promise.try((a, b) => a + b, 1, 2)", "3"),
5182 ("'abc'.isWellFormed()", "true"),
5184 ("'abc'.toWellFormed()", "abc"),
5185 (
5187 "var log=''; { using r = {[Symbol.dispose]: () => log+='d'}; log+='a' } log+='b'; log",
5188 "adb",
5189 ),
5190 (
5192 "var log=''; { using a = {[Symbol.dispose]: () => log+='A'}; using b = {[Symbol.dispose]: () => log+='B'} } log",
5193 "BA",
5194 ),
5195 (
5197 "var log=''; function f(){ { using r = {[Symbol.dispose]: () => log+='d'}; return 'a' } } var res=f(); log+res",
5198 "da",
5199 ),
5200 (
5202 "async function f(){ var log=''; { await using r = {[Symbol.asyncDispose]: async () => { log+='d' }}; log+='a' } return log } await f()",
5203 "ad",
5204 ),
5205 (
5207 "(await Array.fromAsync([Promise.resolve(1), 2, Promise.resolve(3)])).join(',')",
5208 "1,2,3",
5209 ),
5210 ("(await Array.fromAsync([1,2,3], x => x * 10)).join(',')", "10,20,30"),
5212 (
5215 "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",
5216 "SuppressedError:A:B",
5217 ),
5218 (
5220 "async function f(){ var out=''; for await (const x of [Promise.resolve(1), 2, Promise.resolve(3)]) { out += x } return out } await f()",
5221 "123",
5222 ),
5223 (
5225 "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()",
5226 "123",
5227 ),
5228 (
5233 "async function* g(){ yield 1; yield 2; yield 3; } typeof g()[Symbol.asyncIterator]",
5234 "function",
5235 ),
5236 (
5237 "async function* g(){ yield 1; yield 2; yield 3; } var it=g(); it[Symbol.asyncIterator]() === it",
5238 "true",
5239 ),
5240 (
5241 "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()",
5242 "123",
5243 ),
5244 (
5247 "function* g(){ yield 1; } typeof g()[Symbol.asyncIterator]",
5248 "undefined",
5249 ),
5250 (
5253 "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()",
5254 "1:boom",
5255 ),
5256 ("var x; var out=''; for (x of [1,2,3]) { out += x } out", "123"),
5258 ("var x=0; for (x of [1,2,3]) {} x", "3"),
5260 ("var k; var out=''; for (k in {a:1,b:2}) { out += k } out", "ab"),
5262 (
5264 "var a,b; var out=''; for ([a,b] of [[1,2],[3,4]]) { out += a+','+b+';' } out",
5265 "1,2;3,4;",
5266 ),
5267 (
5269 "var a,b; var out=''; for ({a,b} of [{a:1,b:2},{a:3,b:4}]) { out += a+','+b+';' } out",
5270 "1,2;3,4;",
5271 ),
5272 ("var obj={p:0}; for (obj.p of [1,2,3]) {} obj.p", "3"),
5274 ("var arr=[0]; for (arr[0] of [7,8,9]) {} arr[0]", "9"),
5276 (
5281 "function* g(){yield 3;yield 4;} [...new Set([1,2,3]).union(g())].sort().join(',')",
5282 "1,2,3,4",
5283 ),
5284 (
5285 "function* g(){yield 2;yield 3;} [...new Set([1,2,3]).intersection(g())].sort().join(',')",
5286 "2,3",
5287 ),
5288 ("[...new Set([1,2,3]).union(new Set([3,4,5]))].sort().join(',')", "1,2,3,4,5"),
5289 ("[...new Set([1,2,3]).intersection(new Set([2,3,4]))].sort().join(',')", "2,3"),
5290 ("[...new Set([1,2,3]).difference(new Set([2,3]))].join(',')", "1"),
5291 (
5292 "[...new Set([1,2,3]).symmetricDifference(new Set([2,3,4]))].sort().join(',')",
5293 "1,4",
5294 ),
5295 ("new Set([1,2]).isSubsetOf(new Set([1,2,3]))", "true"),
5296 ("new Set([1,2,3]).isSupersetOf(new Set([1,2]))", "true"),
5297 ("new Set([1,2]).isDisjointFrom(new Set([3,4]))", "true"),
5298 ("new Set([1,2]).isDisjointFrom(new Set([2,3]))", "false"),
5299 ("function* g(){ yield 1; yield 2; yield 3; } g().map(x=>x*2).join(',')", "2,4,6"),
5302 (
5303 "function* g(){ yield 1; yield 2; yield 3; yield 4; } g().filter(x=>x%2===0).join(',')",
5304 "2,4",
5305 ),
5306 (
5307 "function* g(){ yield 1; yield 2; yield 3; yield 4; yield 5; } g().take(2).join(',')",
5308 "1,2",
5309 ),
5310 (
5311 "function* g(){ yield 1; yield 2; yield 3; yield 4; yield 5; } g().drop(3).join(',')",
5312 "4,5",
5313 ),
5314 (
5315 "function* g(){ yield 1; yield 2; } g().flatMap(x=>[x,x*10]).join(',')",
5316 "1,10,2,20",
5317 ),
5318 ("function* g(){ yield 1; yield 2; } g().toArray().join(',')", "1,2"),
5319 (
5320 "function* g(){ yield 1; yield 2; yield 3; } var s=0; g().forEach(x=>s+=x); s",
5321 "6",
5322 ),
5323 ("function* g(){ yield 1; yield 2; yield 3; } g().some(x=>x>2)", "true"),
5324 ("function* g(){ yield 1; yield 2; yield 3; } g().every(x=>x>0)", "true"),
5325 ("function* g(){ yield 1; yield 2; yield 3; } g().find(x=>x>1)", "2"),
5326 (
5327 "function* g(){ yield 1; yield 2; yield 3; } g().reduce((a,x)=>a+x,0)",
5328 "6",
5329 ),
5330 ("Iterator.from([1,2,3]).map(x=>x*2).join(',')", "2,4,6"),
5334 ("Iterator.from([1,2,3,4,5]).take(2).join(',')", "1,2"),
5335 ("Iterator.from([1,2,3,4,5]).drop(3).join(',')", "4,5"),
5336 ("Iterator.from(new Set([1,2,3])).toArray().join(',')", "1,2,3"),
5337 (
5338 "function* g(){ yield 1; yield 2; yield 3; } Iterator.from(g()).take(2).join(',')",
5339 "1,2",
5340 ),
5341 ("Iterator.concat([1,2], new Set([3,4]), [5]).toArray().join(',')", "1,2,3,4,5"),
5343 ("Iterator.concat(['a','b'], ['c']).take(2).toArray().join(',')", "a,b"),
5344 ("function Foo(){} new Foo() instanceof Foo", "true"),
5348 ("function Foo(){} function Bar(){} new Foo() instanceof Bar", "false"),
5349 ("class Animal{} class Dog extends Animal{} new Dog() instanceof Animal", "true"),
5350 ("class Animal{} class Dog extends Animal{} new Dog() instanceof Dog", "true"),
5351 ("1 instanceof Object", "false"),
5352 ("({}) instanceof Object", "false"),
5358 ("[] instanceof Array", "false"),
5359 ("new Error('boom').message", "boom"),
5366 ("new Error('boom').name", "Error"),
5367 ("new Error('boom') instanceof Error", "true"),
5368 ("new Error('boom').stack", "Error: boom"),
5372 ("new TypeError('x').stack", "TypeError: x"),
5373 ("typeof new Error().stack === 'string' && new Error().stack.length > 0", "true"),
5374 (
5375 "(function(){ try { null.foo; } catch(e) { return typeof e.stack; } })()",
5376 "string",
5377 ),
5378 ("new TypeError('x') instanceof Error", "true"),
5379 ("new TypeError('x') instanceof TypeError", "true"),
5380 ("new RangeError('x') instanceof TypeError", "false"),
5381 ("new Uint8Array(1) instanceof Uint8Array", "true"),
5382 ("new Int8Array(1) instanceof Int8Array", "true"),
5383 ("new Uint8Array(1) instanceof Int8Array", "false"),
5384 ("Object.getPrototypeOf(new Uint8Array(1)) === Uint8Array.prototype", "true"),
5385 ("Uint8Array.prototype.constructor === Uint8Array", "true"),
5386 (
5387 "try { null.x } catch(e) { e instanceof Error }",
5388 "true",
5389 ),
5390 (
5395 "class MyError extends Error { constructor(m){ super(m); this.name='MyError'; } } var e = new MyError('bad'); e.message + '/' + e.name",
5396 "bad/MyError",
5397 ),
5398 (
5399 "class MyError extends Error { constructor(m){ super(m); } } new MyError('x') instanceof Error",
5400 "true",
5401 ),
5402 (
5403 "class MyError extends Error { constructor(m){ super(m); } } new MyError('x') instanceof MyError",
5404 "true",
5405 ),
5406 (
5410 "class Even { static [Symbol.hasInstance](n){ return typeof n === 'number' && n % 2 === 0; } } (4 instanceof Even) + ',' + (3 instanceof Even)",
5411 "true,false",
5412 ),
5413 (
5414 "class AlwaysTrue { static [Symbol.hasInstance](x){ return true; } } ({} instanceof AlwaysTrue)",
5415 "true",
5416 ),
5417 ("Error.isError(new Error('x'))", "true"),
5420 ("Error.isError(new TypeError('x'))", "true"),
5421 (
5422 "class MyError extends Error { constructor(m){ super(m); } } Error.isError(new MyError('x'))",
5423 "true",
5424 ),
5425 ("Error.isError({message:'x'})", "false"),
5426 ("Error.isError(42)", "false"),
5427 ("Error.isError(undefined)", "false"),
5428 ("new Error('wrap', {cause: 'orig'}).cause", "orig"),
5431 ("typeof new Error('x').cause", "undefined"),
5432 ("new TypeError('t', {cause: 42}).cause", "42"),
5433 (
5434 "try { throw new Error('inner') } catch(e) { new Error('outer', {cause: e}).cause.message }",
5435 "inner",
5436 ),
5437 ("RegExp.escape('a.b*c')", "a\\.b\\*c"),
5440 ("new RegExp(RegExp.escape('1+1=2')).test('1+1=2')", "true"),
5441 (
5442 "new RegExp('^' + RegExp.escape('a.b') + '$').test('aXb')",
5443 "false",
5444 ),
5445 ("var r=/a/; r.compile('b'); r.test('b')", "true"),
5448 ("var r=/a/i; r.compile('a'); r.flags", ""),
5449 ("var r=/a/; r.compile('a','gi'); r.flags", "gi"),
5450 ("var r=/a/g; r.lastIndex=3; r.compile('b'); r.lastIndex", "0"),
5451 ("var r=/x/; var r2=r.compile('y'); r===r2", "true"),
5452 ("CSS.escape('a.b')", "a\\.b"),
5455 ("CSS.escape('.foo#bar')", "\\.foo\\#bar"),
5456 ("CSS.escape('123')", "\\31 23"),
5457 ("CSS.escape('-1')", "-\\31 "),
5458 ("CSS.escape('-')", "\\-"),
5459 ("CSS.escape('abc')", "abc"),
5460 ("CSS.supports('(display: grid)')", "true"),
5464 ("CSS.supports('display', 'grid')", "true"),
5465 ("CSS.supports('not (display: grid)')", "false"),
5466 (
5467 "CSS.supports('(display: grid) and (gap: 1rem)')",
5468 "true",
5469 ),
5470 (
5471 "CSS.supports('not (display: grid) or (gap: 1rem)')",
5472 "true",
5473 ),
5474 (
5477 "typeof document.createElement('audio').play().then",
5478 "function",
5479 ),
5480 ("typeof document.createElement('video').pause()", "undefined"),
5481 ("typeof document.createElement('audio').load()", "undefined"),
5482 ("document.createElement('video').canPlayType('video/mp4')", ""),
5483 ("document.createElement('div').role", "null"),
5486 (
5487 "var e=document.createElement('div'); e.role='button'; e.getAttribute('role')",
5488 "button",
5489 ),
5490 (
5491 "var e=document.createElement('div'); e.setAttribute('aria-label','x'); e.ariaLabel",
5492 "x",
5493 ),
5494 (
5495 "var e=document.createElement('div'); e.ariaExpanded='true'; \
5496 e.getAttribute('aria-expanded')",
5497 "true",
5498 ),
5499 (
5500 "var e=document.createElement('div'); e.ariaLabel='x'; e.ariaLabel=null; \
5501 e.hasAttribute('aria-label')",
5502 "false",
5503 ),
5504 (
5507 "var e=document.createElement('div'); e.ariaColCount='3'; \
5508 e.getAttribute('aria-colcount')",
5509 "3",
5510 ),
5511 (
5512 "var e=document.createElement('div'); e.setAttribute('aria-rowindex','2'); \
5513 e.ariaRowIndex",
5514 "2",
5515 ),
5516 (
5517 "var e=document.createElement('div'); e.ariaSetSize='5'; e.ariaPosInSet='2'; \
5518 e.ariaSetSize + ',' + e.ariaPosInSet",
5519 "5,2",
5520 ),
5521 (
5522 "var e=document.createElement('div'); e.ariaLevel='1'; e.getAttribute('aria-level')",
5523 "1",
5524 ),
5525 ("'ab'.repeat(3)", "ababab"),
5528 ("'x'.repeat(0)", ""),
5529 (
5530 "try { 'x'.repeat(-1); 'no-throw' } catch(e) { 'threw' }",
5531 "threw",
5532 ),
5533 (
5534 "try { 'x'.repeat(Infinity); 'no-throw' } catch(e) { 'threw' }",
5535 "threw",
5536 ),
5537 ("eval('1 + 2 * 3')", "7"),
5540 ("eval(42)", "42"),
5541 ("var x = 10; eval('x = x + 5'); x", "15"),
5542 ("new Function('a', 'b', 'return a + b')(3, 4)", "7"),
5543 ("new Function('return 1 + 1')()", "2"),
5544 (
5545 "typeof new Function('a', 'return a * 2')",
5546 "function",
5547 ),
5548 ("[1,2,3].values().map(x => x * 2).toArray().join(',')", "2,4,6"),
5551 ("[1,2,3,4].values().filter(x => x % 2 === 0).toArray().join(',')", "2,4"),
5552 ("[1,2,3,4,5].values().take(2).toArray().join(',')", "1,2"),
5553 ("[1,2,3,4,5].values().drop(3).toArray().join(',')", "4,5"),
5554 (
5555 "[1,2,3].values().map(x => x + 1).filter(x => x > 2).toArray().join(',')",
5556 "3,4",
5557 ),
5558 (
5559 "var s=''; [1,2,3].values().forEach(x => s += x); s",
5560 "123",
5561 ),
5562 ("[1,2,3,4].values().reduce((a,b) => a + b)", "10"),
5563 ("[1,2,3].values().reduce((a,b) => a + b, 10)", "16"),
5564 ("[1,2,3].values().some(x => x > 2)", "true"),
5568 ("[1,2,3].values().some(x => x > 5)", "false"),
5569 ("[1,2,3].values().every(x => x > 0)", "true"),
5570 ("[1,2,3].values().every(x => x > 1)", "false"),
5571 ("[1,2,3,4].values().find(x => x % 2 === 0)", "2"),
5572 ("typeof [1,2,3].values().find(x => x > 5)", "undefined"),
5573 (
5575 "[1,2,3].values().flatMap(x => [x, x * 10]).toArray().join(',')",
5576 "1,10,2,20,3,30",
5577 ),
5578 (
5581 "function* dup(x){ yield x; yield x*10; } [1,2].values().flatMap(x => dup(x)).toArray().join(',')",
5582 "1,10,2,20",
5583 ),
5584 (
5587 "function Foo(){} Object.getPrototypeOf(new Foo()) === Foo.prototype",
5588 "true",
5589 ),
5590 (
5591 "var a={}; var b={x:1}; Object.setPrototypeOf(a,b); a.x",
5592 "1",
5593 ),
5594 (
5598 "var a={}; Object.setPrototypeOf(a,a); a.nope",
5599 "undefined",
5600 ),
5601 (
5602 "var a={}; var b={}; Object.setPrototypeOf(a,b); Object.setPrototypeOf(b,a); a.nope",
5603 "undefined",
5604 ),
5605 (
5606 "var a={}; Object.setPrototypeOf(a,a); ('nope' in a)",
5607 "false",
5608 ),
5609 (
5610 "var a={}; Object.setPrototypeOf(a,a); a.x=1; a.x",
5611 "1",
5612 ),
5613 (
5614 "var a={}; Object.setPrototypeOf(a,a); var ks=[]; for (var k in a) { ks.push(k); } ks.length",
5615 "0",
5616 ),
5617 ("var a={}; var b={x:1}; a.__proto__ = b; a.x", "1"),
5621 ("var b={x:1}; var a=Object.create(b); a.__proto__ === b", "true"),
5622 ("({}).__proto__ === null", "true"),
5623 ("var a={}; a.__proto__ = null; a.__proto__", "null"),
5624 ("var p={x:5}; var o={__proto__: p}; o.x", "5"),
5627 ("var p={x:5}; var o={__proto__: p}; Object.keys(o).includes('__proto__')", "false"),
5628 ("var o={['__proto__']: 5}; o.__proto__", "5"),
5630 ("function Foo(){} Foo.prototype.isPrototypeOf(new Foo())", "true"),
5632 ("({}).isPrototypeOf({})", "false"),
5633 ("({x:1}).propertyIsEnumerable('x')", "true"),
5634 ("({x:1}).propertyIsEnumerable('y')", "false"),
5635 ("function f(a,b){ return this.x+a+b; } f.call({x:10}, 1, 2)", "13"),
5638 ("function f(a,b){ return this.x+a+b; } f.apply({x:10}, [1,2])", "13"),
5639 (
5643 "function f(a,b){ return this.x+a+b; } f.apply({x:10}, {0:1,1:2,length:2})",
5644 "13",
5645 ),
5646 (
5647 "function f(a,b){ return this.x+a+b; } var g = f.bind({x:10}, 1); g(2)",
5648 "13",
5649 ),
5650 (
5651 "function f(){ return this.x; } var g = f.bind({x:5}); g.call({x:99})",
5652 "5",
5653 ),
5654 (
5660 "var r; function Foo(){ r = new.target === Foo; } new Foo(); r",
5661 "true",
5662 ),
5663 ("function Foo(){ return new.target === Foo; } Foo()", "false"),
5664 (
5665 "function Foo(){ return typeof new.target; } Foo()",
5666 "undefined",
5667 ),
5668 (
5669 "class Foo { constructor(){ this.isNew = new.target === Foo; } } new Foo().isNew",
5670 "true",
5671 ),
5672 (
5675 "var r; function Foo(){ var f = () => { r = new.target === Foo; }; f(); } new Foo(); r",
5676 "true",
5677 ),
5678 (
5681 "try { throw {message:'boom', code:42}; } catch({message, code}) { message + '/' + code; }",
5682 "boom/42",
5683 ),
5684 (
5685 "try { throw [1,2,3]; } catch([a,,c]) { a + '/' + c; }",
5686 "1/3",
5687 ),
5688 ("try { throw 'x'; } catch(e) { e; }", "x"),
5689 (
5693 "class C { ['foo' + 'bar'](){ return 42; } } new C().foobar()",
5694 "42",
5695 ),
5696 (
5701 "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",
5702 "0123",
5703 ),
5704 (
5705 "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(',')",
5706 "0,1,2",
5707 ),
5708 (
5712 "var o={a:1}; o[Symbol.iterator]=function(){}; Object.keys(o).join(',')",
5713 "a",
5714 ),
5715 (
5716 "var o={a:1}; o[Symbol.iterator]=function(){}; Object.values(o).join(',')",
5717 "1",
5718 ),
5719 (
5720 "var o={a:1}; o[Symbol.iterator]=function(){}; JSON.stringify(o)",
5721 "{\"a\":1}",
5722 ),
5723 (
5724 "var o={a:1}; o[Symbol.iterator]=function(){}; var k=''; for (const x in o) { k+=x; } k",
5725 "a",
5726 ),
5727 (
5731 "new Date(2024, 0, 15, 10, 30, 45, 500).toISOString()",
5732 "2024-01-15T10:30:45.500Z",
5733 ),
5734 ("new Date(0).toISOString()", "1970-01-01T00:00:00.000Z"),
5735 (
5739 "new Date(2024, 0, 15, 10, 30, 45, 500).toDateString()",
5740 "2024-01-15",
5741 ),
5742 (
5743 "new Date(2024, 0, 15, 10, 30, 45, 500).toTimeString()",
5744 "10:30:45",
5745 ),
5746 (
5747 "new Date(2024, 0, 15).toLocaleDateString()",
5748 "2024-01-15",
5749 ),
5750 ("new Date(2024, 0, 15).toLocaleTimeString()", "00:00:00"),
5751 ("new Date(2024, 0, 1).getFullYear()", "2024"),
5752 ("new Date(2024, 5, 15).getMonth()", "5"),
5753 ("new Date(2024, 0, 1).getDay()", "1"), ("typeof new Date().getTimezoneOffset()", "number"),
5756 ("new Date().getTimezoneOffset()", "0"),
5757 (
5761 "var d=new Date(2024,0,15); d.setFullYear(2025); d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()",
5762 "2025-1-15",
5763 ),
5764 ("new Date(2024,0,1).getYear()", "124"),
5766 ("var d=new Date(2024,0,1); d.setYear(5); d.getFullYear()", "1905"),
5769 ("var d=new Date(2024,0,1); d.setYear(2030); d.getFullYear()", "2030"),
5770 (
5771 "var d=new Date(2024,0,15); d.setMonth(5); d.getMonth()",
5772 "5",
5773 ),
5774 (
5775 "var d=new Date(2024,0,15); d.setDate(d.getDate()+1); d.getDate()",
5776 "16",
5777 ),
5778 (
5780 "var d=new Date(2024,0,31); d.setDate(d.getDate()+1); (d.getMonth()+1)+'-'+d.getDate()",
5781 "2-1",
5782 ),
5783 (
5784 "var d=new Date(2024,0,15,10,20,30); d.setHours(23); d.getHours()+':'+d.getMinutes()+':'+d.getSeconds()",
5785 "23:20:30",
5786 ),
5787 (
5788 "var d=new Date(2024,0,15,10,20,30); d.setMinutes(5); d.getMinutes()",
5789 "5",
5790 ),
5791 (
5792 "var d=new Date(2024,0,15,10,20,30); d.setSeconds(59); d.getSeconds()",
5793 "59",
5794 ),
5795 (
5796 "var d=new Date(2024,0,15); d.setMilliseconds(123); d.getMilliseconds()",
5797 "123",
5798 ),
5799 (
5800 "var d=new Date(0); d.setTime(5000); d.getTime()",
5801 "5000",
5802 ),
5803 (
5805 "var d=new Date(0); var r=d.setFullYear(2000); r === d.getTime()",
5806 "true",
5807 ),
5808 ("new Date(1000) - new Date(0)", "1000"),
5813 ("new Date(0) < new Date(1000)", "true"),
5814 ("+new Date(500)", "500"),
5815 ("typeof Date.now()", "number"),
5816 ("var o = {x:1}; delete o.x; 'x' in o", "false"),
5820 ("var o = {x:1, y:2}; delete o.x; o.y", "2"),
5821 ("var k='x'; var o = {x:1}; delete o[k]; 'x' in o", "false"),
5822 ("var a=[1,2,3]; delete a[1]; a[1]", "undefined"),
5823 ("var a=[1,2,3]; delete a[1]; a.length", "3"),
5824 ("delete 5", "true"),
5825 ("var s=''; (s+='a', s+='b', s+='c'); s", "abc"),
5828 ("var x=(1,2,3); x", "3"),
5829 (
5830 "var s=''; for (var i=0,j=10; i<3; i++,j--) { s += i+':'+j+' '; } s",
5831 "0:10 1:9 2:8 ",
5832 ),
5833 ("var a; var b; (a=1, b=a+1); a+','+b", "1,2"),
5834 (
5837 "function* g(){ try { yield 1; yield 2; } catch(e) { yield 'caught:'+e; } } var it=g(); it.next(); it.throw('boom').value",
5838 "caught:boom",
5839 ),
5840 (
5841 "function* g(){ yield 1; yield 2; } var it=g(); it.next(); var r; try { it.throw('x'); } catch(e) { r = 'propagated:'+e; } r",
5842 "propagated:x",
5843 ),
5844 ("'A'.codePointAt(0)", "65"),
5846 ("'ABC'.codePointAt(5)", "undefined"),
5847 ("'a'.localeCompare('b')", "-1"),
5848 ("'b'.localeCompare('a')", "1"),
5849 ("'a'.localeCompare('a')", "0"),
5850 ("'Hello World'.substr(6)", "World"),
5853 ("'Hello World'.substr(0, 5)", "Hello"),
5854 ("'Hello World'.substr(-5)", "World"),
5855 ("'Hello World'.substr(-5, 3)", "Wor"),
5856 (
5860 "class C { static x; static { C.x = 1 + 2; } } C.x",
5861 "3",
5862 ),
5863 (
5864 "class C { static x = 10; static { C.x += 5; } } C.x",
5865 "15",
5866 ),
5867 (
5869 "class C { static log=''; static { C.log+='a'; } static { C.log+='b'; } } C.log",
5870 "ab",
5871 ),
5872 ("[1,[2,3]].flat().join(',')", "1,2,3"),
5876 ("[1,[2,[3,[4]]]].flat(2).join(',')", "1,2,3,4"),
5877 ("[1,[2,[3,[4,[5]]]]].flat(Infinity).join(',')", "1,2,3,4,5"),
5878 ("var a=[1]; a.push(a); a.flat(Infinity); 'ok'", "ok"),
5885 ("[1,[2,[3]]].flat(0).length", "2"),
5887 ("var o={x:1}; Object.freeze(o); o.x=2; o.x", "1"),
5890 ("var o={x:1}; Object.freeze(o); o.y=2; 'y' in o", "false"),
5891 ("var o={x:1}; Object.freeze(o); delete o.x; o.x", "1"),
5892 ("var o={x:1}; Object.isFrozen(o)", "false"),
5893 ("var o={x:1}; Object.freeze(o); Object.isFrozen(o)", "true"),
5894 ("Object.isFrozen(5)", "true"),
5895 ("var o={x:1}; Object.seal(o); o.x=2; o.x", "2"),
5897 ("var o={x:1}; Object.seal(o); o.y=2; 'y' in o", "false"),
5898 ("var o={x:1}; Object.seal(o); delete o.x; 'x' in o", "true"),
5899 ("var o={x:1}; Object.isSealed(o)", "false"),
5900 ("var o={x:1}; Object.seal(o); Object.isSealed(o)", "true"),
5901 (
5902 "var o={x:1}; Object.preventExtensions(o); o.y=2; 'y' in o",
5903 "false",
5904 ),
5905 (
5906 "var o={x:1}; Object.preventExtensions(o); o.x=5; delete o.x; 'x' in o",
5907 "false",
5908 ),
5909 ("var o={x:1}; Object.isExtensible(o)", "true"),
5910 (
5911 "var o={x:1}; Object.preventExtensions(o); Object.isExtensible(o)",
5912 "false",
5913 ),
5914 ("Array.isArray(new Proxy([1,2], {}))", "true"),
5917 ("Array.isArray(new Proxy({}, {}))", "false"),
5918 ("Array.isArray(new Int8Array([1,2]))", "false"),
5922 ("Array.isArray([1,2])", "true"),
5923 ("Object.keys(new Proxy({a:1,b:2}, {})).sort().join(',')", "a,b"),
5927 ("Object.values(new Proxy({a:1,b:2}, {})).sort().join(',')", "1,2"),
5928 (
5929 "Object.entries(new Proxy({a:1}, {})).map(e=>e[0]+':'+e[1]).join(',')",
5930 "a:1",
5931 ),
5932 ("JSON.stringify(new Proxy({a:1,b:2}, {}))", "{\"a\":1,\"b\":2}"),
5934 (
5938 "var s=''; for (const x of new Proxy([1,2,3], {})) { s += x; } s",
5939 "123",
5940 ),
5941 ("[...new Proxy([1,2,3], {})].join(',')", "1,2,3"),
5942 (
5946 "var t = Object.assign({}, new Proxy({a:1,b:2}, {})); t.a+','+t.b",
5947 "1,2",
5948 ),
5949 (
5950 "var t = Object.assign({}, [10,20,30]); t[0]+','+t[1]+','+t[2]",
5951 "10,20,30",
5952 ),
5953 (
5956 "var o={x:1}; Object.freeze(o); Reflect.deleteProperty(o,'x')",
5957 "false",
5958 ),
5959 ("var o={x:1}; Reflect.deleteProperty(o,'x')", "true"),
5960 (
5963 "var o={x:1}; Object.freeze(o); Reflect.set(o,'x',2)",
5964 "false",
5965 ),
5966 ("var o={x:1}; Reflect.set(o,'x',2); o.x", "2"),
5967 ("[NaN].includes(NaN)", "true"),
5970 ("[NaN].indexOf(NaN)", "-1"),
5971 ("[1,2,NaN].includes(NaN)", "true"),
5972 ("[1,2,3].includes(2)", "true"),
5973 ("[1,2,3].includes(5)", "false"),
5974 (
5977 "var ctx={mul:10}; [1,2,3].map(function(x){return x*this.mul;}, ctx).join(',')",
5978 "10,20,30",
5979 ),
5980 (
5981 "var ctx={min:2}; [1,2,3].filter(function(x){return x>this.min;}, ctx).join(',')",
5982 "3",
5983 ),
5984 (
5985 "var ctx={sum:0}; [1,2,3].forEach(function(x){this.sum+=x;}, ctx); ctx.sum",
5986 "6",
5987 ),
5988 (
5989 "var ctx={target:2}; [1,2,3].find(function(x){return x===this.target;}, ctx)",
5990 "2",
5991 ),
5992 (
5993 "var ctx={target:5}; [1,2,3].some(function(x){return x===this.target;}, ctx)",
5994 "false",
5995 ),
5996 (
5997 "var ctx={min:0}; [1,2,3].every(function(x){return x>this.min;}, ctx)",
5998 "true",
5999 ),
6000 (
6003 "var ctx={sum:0}; var m=new Map([['a',1],['b',2]]); m.forEach(function(v){this.sum+=v;}, ctx); ctx.sum",
6004 "3",
6005 ),
6006 (
6007 "var ctx={sum:0}; var s=new Set([1,2,3]); s.forEach(function(v){this.sum+=v;}, ctx); ctx.sum",
6008 "6",
6009 ),
6010 (
6011 "var ctx={mul:2}; Array.from([1,2,3], function(x){return x*this.mul;}, ctx).join(',')",
6012 "2,4,6",
6013 ),
6014 (
6017 "JSON.stringify({a:1,b:2}, null, 2)",
6018 "{\n \"a\": 1,\n \"b\": 2\n}",
6019 ),
6020 ("JSON.stringify([1,2], null, 2)", "[\n 1,\n 2\n]"),
6021 ("JSON.stringify({}, null, 2)", "{}"),
6022 ("JSON.stringify([], null, 2)", "[]"),
6023 ("JSON.stringify({a:1}, null, '\\t')", "{\n\t\"a\": 1\n}"),
6024 ("JSON.stringify({a:1,b:2})", "{\"a\":1,\"b\":2}"),
6026 (
6029 "try { JSON.stringify(10n); 'no-throw' } catch(e) { 'caught:' + e.name }",
6030 "caught:Error",
6031 ),
6032 (
6033 "try { JSON.stringify({a:10n}); 'no-throw' } catch(e) { 'caught' }",
6034 "caught",
6035 ),
6036 ("JSON.stringify({a:1,b:2,c:3}, ['a','c'])", "{\"a\":1,\"c\":3}"),
6038 (
6039 "JSON.stringify({a:1,b:2}, function(k,v){ return typeof v === 'number' ? v*10 : v; })",
6040 "{\"a\":10,\"b\":20}",
6041 ),
6042 ("JSON.stringify([1,2,3], ['a'])", "[1,2,3]"),
6045 (
6048 "JSON.parse('{\"a\":1,\"b\":2}', function(k,v){ return typeof v === 'number' ? v*10 : v; }).a",
6049 "10",
6050 ),
6051 (
6052 "var r = JSON.parse('{\"a\":1,\"b\":2}', function(k,v){ return k==='b' ? undefined : v; }); 'b' in r",
6053 "false",
6054 ),
6055 (
6056 "JSON.parse('[1,2,3]', function(k,v){ return typeof v === 'number' ? v+1 : v; }).join(',')",
6057 "2,3,4",
6058 ),
6059 ("JSON.parse('{\"a\":1}').a", "1"),
6060 ("'aaa'.replaceAll(/a/g, 'b')", "bbb"),
6064 (
6065 "try { 'aaa'.replaceAll(/a/, 'b'); 'no-throw' } catch(e) { 'threw' }",
6066 "threw",
6067 ),
6068 (
6069 "'a1b2'.replaceAll(/[0-9]/g, function(m){ return '['+m+']'; })",
6070 "a[1]b[2]",
6071 ),
6072 ("'aXaXa'.replaceAll('X', function(){ return '-'; })", "a-a-a"),
6073 ("'abc'.replaceAll('x', 'y')", "abc"),
6074 ("var a1 = 1, b1 = a1 + 1; b1", "2"),
6080 ("var s1 = 'xy', t1 = s1.length; t1", "2"),
6081 ("var h1 = [], p1 = '1.8.2', w1 = p1.trim; typeof w1", "function"),
6082 ("var q1 = [], r1 = q1.push; typeof r1", "function"),
6083 ("typeof String.prototype", "object"),
6087 ("typeof String.prototype.trim", "function"),
6088 ("typeof String.prototype.slice", "function"),
6089 ("String.prototype.trim.call(' x ')", "x"),
6090 ("String.prototype.toUpperCase.call('ab')", "AB"),
6091 ("' y '.trim()", "y"),
6093 ("typeof ({}).toString", "function"),
6099 ("typeof ({}).hasOwnProperty", "function"),
6100 ("typeof [].slice", "function"),
6101 ("typeof [].concat", "function"),
6102 ("typeof (function(){}).call", "function"),
6103 ("typeof (function(){}).apply", "function"),
6104 ("({}).toString.call([])", "[object Array]"),
6105 ("typeof Array.prototype.push", "function"),
6110 ("typeof Array.prototype.slice", "function"),
6111 ("typeof Array.prototype.indexOf", "function"),
6112 ("Array.prototype.slice.call([1,2,3], 1).join(',')", "2,3"),
6113 ("Array.prototype.indexOf.call([4,5,6], 5)", "1"),
6114 ("typeof Object.prototype.toString", "function"),
6116 ("typeof Object.prototype.hasOwnProperty", "function"),
6117 ("var d = document.createElement('div'); typeof d", "object"),
6121 ("var d2 = document.createElement('div'); typeof d2.style", "object"),
6122 (
6123 "var d3 = document.createElement('div'); d3.innerHTML = \"<a href='/a'>a</a>\"; d3.getElementsByTagName('a').length",
6124 "1",
6125 ),
6126 (
6127 "var d4 = document.createElement('div'); d4.innerHTML = \"<a href='/a'>a</a>\"; typeof d4.getElementsByTagName('a')[0]",
6128 "object",
6129 ),
6130 (
6131 "var d5 = document.createElement('div'); d5.innerHTML = \"<a href='/a'>a</a>\"; typeof d5.getElementsByTagName('a')[0].style",
6132 "object",
6133 ),
6134 (
6135 "var d6 = document.createElement('div'); d6.innerHTML = '<table></table><a href=\"/a\">a</a>'; d6.getElementsByTagName('*').length > 0",
6136 "true",
6137 ),
6138 (
6139 "var d7 = document.createElement('div'); d7.style.cssText = 'top:1px'; typeof d7.style.cssText",
6140 "string",
6141 ),
6142 (
6143 "var d8 = document.createElement('div'); d8.setAttribute('className','t'); d8.getAttribute('className')",
6144 "t",
6145 ),
6146 (
6151 "var e1 = document.createElement('div'); e1.innerHTML = '<link/><a href=\"/a\">a</a>'; e1.getElementsByTagName('a').length",
6152 "1",
6153 ),
6154 (
6155 "var e2 = document.createElement('div'); e2.innerHTML = '<table></table><a href=\"/a\">a</a>'; e2.getElementsByTagName('a').length",
6156 "1",
6157 ),
6158 (
6159 "var e3 = document.createElement('div'); e3.innerHTML = ' <a href=\"/a\">a</a>'; e3.getElementsByTagName('a').length",
6160 "1",
6161 ),
6162 (
6163 "var e4 = document.createElement('div'); e4.innerHTML = '<input type=\"checkbox\"/><a href=\"/a\">a</a>'; e4.getElementsByTagName('a').length",
6164 "1",
6165 ),
6166 (
6168 "var e5 = document.createElement('div'); e5.innerHTML = ' <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>'; e5.getElementsByTagName('a').length",
6169 "1",
6170 ),
6171 (
6172 "var e6 = document.createElement('div'); e6.innerHTML = ' <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>'; e6.getElementsByTagName('*').length > 0",
6173 "true",
6174 ),
6175 ("typeof window.document", "object"),
6179 ("typeof window.navigator", "object"),
6182 ("typeof window.navigator.userAgent", "string"),
6183 ("window.navigator === navigator", "true"),
6184 ("typeof window.location", "object"),
6185 ("typeof window.JSON", "object"),
6186 ("typeof window.Math", "object"),
6187 ("typeof window.XMLHttpRequest", "function"),
6188 ("window.myGlobal1 = 42; myGlobal1", "42"),
6193 ("window.myFn1 = function(){ return 'z'; }; myFn1()", "z"),
6194 ("window.mySelf1 = window; typeof mySelf1.document", "object"),
6195 ("window.shadow1 = 'w'; var shadow1 = 'v'; shadow1", "v"),
6197 ("Object.prototype.toString.call('x')", "[object String]"),
6202 ("Object.prototype.toString.call(1)", "[object Number]"),
6203 ("Object.prototype.toString.call(true)", "[object Boolean]"),
6204 ("Object.prototype.toString.call(null)", "[object Null]"),
6205 ("Object.prototype.toString.call(undefined)", "[object Undefined]"),
6206 ("Object.prototype.toString.call({})", "[object Object]"),
6207 ("Object.prototype.toString.call([])", "[object Array]"),
6208 ("Object.prototype.toString.call(function(){})", "[object Function]"),
6209 ("window.document === document", "true"),
6210 ("typeof window.document.createElement", "function"),
6211 (
6212 "var w1 = window.document.createElement('div'); typeof w1.style",
6213 "object",
6214 ),
6215 (
6216 "var w2 = window.document.createElement('div'); w2.innerHTML = ' <link/><table></table><a href=\"/a\">a</a><input type=\"checkbox\"/>'; typeof w2.getElementsByTagName('a')[0]",
6217 "object",
6218 ),
6219 (
6221 "(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)",
6222 "object",
6223 ),
6224 (
6229 "var o = {}; o[Symbol.replace] = function(s, r){ return 'X' + s + r; }; 'ab'.replaceAll(o, 'Z')",
6230 "XabZ",
6231 ),
6232 (
6233 "var o = {}; o[Symbol.matchAll] = function(s){ return ['m:' + s]; }; 'ab'.matchAll(o)[0]",
6234 "m:ab",
6235 ),
6236 (
6238 "try { 'aaa'.matchAll(/a/); 'no-throw' } catch(e) { 'threw' }",
6239 "threw",
6240 ),
6241 ("'a,b,c,d'.split(',', 2).join('|')", "a|b"),
6243 ("'a,b,c'.split(',', 0).length", "0"),
6244 ("'a1b2c3'.split(/[0-9]/, 2).join('|')", "a|b"),
6245 ("'a,b,c'.split(',').join('|')", "a|b|c"),
6246 (
6249 "try { 'aa'.matchAll(/a/); 'no-throw' } catch(e) { 'threw' }",
6250 "threw",
6251 ),
6252 (
6253 "[...'a1b2'.matchAll(/[0-9]/g)].map(m=>m[0]).join(',')",
6254 "1,2",
6255 ),
6256 (
6259 "var a={x:1}; a.self=a; var c=structuredClone(a); c.self===c",
6260 "true",
6261 ),
6262 ("var a={x:1}; a.self=a; var c=structuredClone(a); c.x", "1"),
6263 (
6265 "var shared={v:1}; var o={a:shared,b:shared}; var c=structuredClone(o); c.a===c.b",
6266 "true",
6267 ),
6268 (
6272 "try { var a={}; a.self=a; JSON.stringify(a); 'no-throw' } catch(e) { 'threw' }",
6273 "threw",
6274 ),
6275 (
6277 "var cur={}; for(var i=0;i<40;i++){ cur={child:cur}; } try { JSON.stringify(cur); 'no-throw' } catch(e) { 'depth-exceeded' }",
6278 "depth-exceeded",
6279 ),
6280 (
6281 "var shared={v:1}; JSON.stringify({a:shared,b:shared})",
6282 "{\"a\":{\"v\":1},\"b\":{\"v\":1}}",
6283 ),
6284 (
6288 "var a={}; a.self=a; console.log(a); 'ok'",
6289 "ok",
6290 ),
6291 (
6292 "var a=[1,2]; a.push(a); console.log(a); 'ok'",
6293 "ok",
6294 ),
6295 (
6301 "console.log(new Proxy([1,2,3], {})); 'ok'",
6302 "ok",
6303 ),
6304 ("var a=[1]; a.push(a); a.join()", "1,1,"),
6311 ("var a=[1]; a.push(a); String(a); 'ok'", "ok"),
6312 ("var a=[1]; a.push(a); `${a}`; 'ok'", "ok"),
6313 ("(255).toString(16)", "ff"),
6316 ("(8).toString(2)", "1000"),
6317 ("(255).toString()", "255"),
6318 ("(-255).toString(16)", "-ff"),
6319 ("(0).toString(2)", "0"),
6320 (
6321 "try { (1).toString(1); 'no-throw' } catch(e) { 'threw' }",
6322 "threw",
6323 ),
6324 ("parseInt('0xFF')", "255"),
6327 ("parseInt('0xFF', 16)", "255"),
6328 ("parseInt('FF', 16)", "255"),
6329 ("parseInt('10')", "10"),
6330 ("parseInt('-0x10')", "-16"),
6331 ("parseInt('10', 2)", "2"),
6332 ("Number.parseFloat === parseFloat", "true"),
6336 ("Number.parseInt === parseInt", "true"),
6337 ("Number.parseFloat.name", "parseFloat"),
6338 ("Number.parseInt.name", "parseInt"),
6339 (
6343 "JSON.stringify(new Date(0))",
6344 "\"1970-01-01T00:00:00.000Z\"",
6345 ),
6346 (
6347 "JSON.stringify({d: new Date(0)})",
6348 "{\"d\":\"1970-01-01T00:00:00.000Z\"}",
6349 ),
6350 ("'' + new Date(0)", "1970-01-01T00:00:00.000Z"),
6353 ("`date=${new Date(0)}`", "date=1970-01-01T00:00:00.000Z"),
6354 (
6356 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); o.x = 2; o.x",
6357 "1",
6358 ),
6359 (
6360 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); delete o.x",
6361 "false",
6362 ),
6363 (
6364 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); Object.keys(o).length",
6365 "0",
6366 ),
6367 (
6368 "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",
6369 "0",
6370 ),
6371 (
6372 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); JSON.stringify(o)",
6373 "{}",
6374 ),
6375 (
6376 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); ({...o}).x",
6377 "undefined",
6378 ),
6379 (
6380 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); Object.assign({}, o).x",
6381 "undefined",
6382 ),
6383 (
6384 "var o={}; Object.defineProperty(o, 'x', {value: 1, writable: false, configurable: false, enumerable: false}); Reflect.deleteProperty(o, 'x')",
6385 "false",
6386 ),
6387 (
6392 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigInt64(0, 123456789012345n); v.getBigInt64(0).toString()",
6393 "123456789012345",
6394 ),
6395 (
6396 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigInt64(0, -1n); v.getBigInt64(0).toString()",
6397 "-1",
6398 ),
6399 (
6400 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigUint64(0, -1n); v.getBigUint64(0).toString()",
6401 "18446744073709551615",
6402 ),
6403 (
6404 "var b=new ArrayBuffer(8); var v=new DataView(b); v.setBigInt64(0, 1n, true); v.getBigInt64(0, true).toString()",
6405 "1",
6406 ),
6407 (
6411 "JSON.stringify({n: JSON.rawJSON('123456789012345678901234567890')})",
6412 "{\"n\":123456789012345678901234567890}",
6413 ),
6414 ("JSON.isRawJSON(JSON.rawJSON('42'))", "true"),
6415 ("JSON.isRawJSON({rawJSON: '42'})", "false"),
6416 ("JSON.isRawJSON(42)", "false"),
6417 (
6418 "(function(){ try { JSON.rawJSON(' 1'); return 'no-throw'; } catch(e) { return e instanceof Error; } })()",
6419 "true",
6420 ),
6421 (
6422 "(function(){ try { JSON.rawJSON('not json'); return 'no-throw'; } catch(e) { return e instanceof Error; } })()",
6423 "true",
6424 ),
6425 (
6431 "var b=document.createElement('button'); b.command='show-modal'; b.command",
6432 "show-modal",
6433 ),
6434 (
6435 "document.createElement('button').commandForElement",
6436 "null",
6437 ),
6438 (
6447 "var t=document.createElement('div'); t.setAttribute('id','cfe-target'); var b=document.createElement('button'); b.commandForElement=t; b.getAttribute('commandfor')",
6448 "cfe-target",
6449 ),
6450 (
6460 "Object.keys({y:1,x:2,a:3}).join(',')",
6461 "y,x,a",
6462 ),
6463 (
6464 "var o={}; delete o.x; o.b=1; o.a=2; o.c=3; delete o.a; o.a=4; Object.keys(o).join(',')",
6465 "b,c,a",
6466 ),
6467 (
6468 "Object.keys({2:'b',1:'a',10:'c'}).join(',')",
6469 "1,2,10",
6470 ),
6471 (
6472 "Object.keys({10:'c',y:1,2:'b',x:2}).join(',')",
6473 "2,10,y,x",
6474 ),
6475 (
6476 "Object.values({10:'c',y:1,2:'b',x:2}).join(',')",
6477 "b,c,1,2",
6478 ),
6479 (
6480 "var res=[]; for(var k in {10:'c',y:1,2:'b',x:2}){ res.push(k); } res.join(',')",
6481 "2,10,y,x",
6482 ),
6483 (
6484 "JSON.stringify({10:'c',y:1,2:'b',x:2})",
6485 "{\"2\":\"b\",\"10\":\"c\",\"y\":1,\"x\":2}",
6486 ),
6487 (
6488 "Object.keys({...{10:'c',y:1,2:'b',x:2}}).join(',')",
6489 "2,10,y,x",
6490 ),
6491 (
6492 "Object.keys(Object.assign({}, {10:'c',y:1,2:'b',x:2})).join(',')",
6493 "2,10,y,x",
6494 ),
6495 (
6496 "Object.entries({2:'b',y:1,1:'a'}).map(e=>e.join(':')).join(',')",
6497 "1:a,2:b,y:1",
6498 ),
6499 (
6502 "Object.keys({'01':'x', 1:'y'}).join(',')",
6503 "1,01",
6504 ),
6505 (
6507 "typeof Intl",
6508 "object",
6509 ),
6510 (
6511 "Intl.getCanonicalLocales('ja-JP').join(',')",
6512 "ja-JP",
6513 ),
6514 (
6520 "new Intl.NumberFormat('ja-JP').format(123456)",
6521 "123,456",
6522 ),
6523 (
6524 "new Intl.DateTimeFormat('ja-JP').resolvedOptions().locale",
6525 "ja-JP",
6526 ),
6527 (
6528 "new Intl.Collator().compare('a', 'b')",
6529 "-1",
6530 ),
6531 (
6532 "new Intl.PluralRules().select(1)",
6533 "one",
6534 ),
6535 (
6536 "new Intl.RelativeTimeFormat().format(-1, 'day')",
6537 "1 days ago",
6538 ),
6539 (
6540 "new Intl.ListFormat().format(['a', 'b'])",
6541 "a, b",
6542 ),
6543 (
6544 "new Intl.DisplayNames(['en'], {type: 'language'}).of('ja')",
6545 "ja",
6546 ),
6547 (
6549 "new RegExp('a', 'u').unicode",
6550 "true",
6551 ),
6552 (
6553 "new RegExp('a', 'v').unicodeSets",
6554 "true",
6555 ),
6556 (
6557 "/\\p{Letter}/u.test('A')",
6558 "true",
6559 ),
6560 (
6561 "/\\p{Number}/u.test('9')",
6562 "true",
6563 ),
6564 (
6566 "var finRan = false; function* g() { try { yield 1; } finally { finRan = true; } } var it = g(); it.next(); it.return(42); finRan",
6567 "true",
6568 ),
6569 (
6577 "typeof Object.create(null).hasOwnProperty",
6578 "undefined",
6579 ),
6580 (
6581 "typeof Object.create(null).toString",
6582 "undefined",
6583 ),
6584 (
6585 "Object.getPrototypeOf(Object.create(null))",
6586 "null",
6587 ),
6588 (
6592 "typeof {}.hasOwnProperty",
6593 "function",
6594 ),
6595 (
6596 "typeof Object.groupBy([1,2,3], x=>x%2).hasOwnProperty",
6597 "undefined",
6598 ),
6599 (
6600 "var o={}; Object.setPrototypeOf(o, null); typeof o.toString",
6601 "undefined",
6602 ),
6603 (
6606 "var o={}; Object.setPrototypeOf(o, null); Object.setPrototypeOf(o, Object.prototype); typeof o.hasOwnProperty",
6607 "function",
6608 ),
6609 (
6617 "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(''))",
6618 "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
6619 ),
6620 (
6621 "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(''))",
6622 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
6623 ),
6624 (
6625 "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(''))",
6626 "d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592",
6627 ),
6628 (
6631 "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(''))",
6632 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
6633 ),
6634 (
6636 "await crypto.subtle.digest('SHA-1', new TextEncoder().encode('x')).then(() => 'resolved', () => 'rejected')",
6637 "rejected",
6638 ),
6639 (
6645 "new TextDecoder().decode(new TextEncoder().encode('hello').buffer)",
6646 "hello",
6647 ),
6648 (
6649 "new TextDecoder().decode(new Uint8Array([65,116,109,79,83]).buffer)",
6650 "AtmOS",
6651 ),
6652 (
6656 "new TextDecoder().decode(new DataView(new TextEncoder().encode('AtmOS').buffer))",
6657 "AtmOS",
6658 ),
6659 (
6660 "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(''))",
6661 "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad",
6662 ),
6663 (
6664 "new Uint8Array(new DataView(new Uint8Array([65,66,67]).buffer)).join('')",
6665 "656667",
6666 ),
6667 (
6669 "'が'.normalize('NFD') === 'か\\u3099'",
6670 "true",
6671 ),
6672 (
6673 "'か\\u3099'.normalize('NFC')",
6674 "が",
6675 ),
6676 (
6677 "'パ'.normalize('NFD') === 'ハ\\u309A'",
6678 "true",
6679 ),
6680 (
6681 "'ハ\\u309A'.normalize('NFC')",
6682 "パ",
6683 ),
6684 (
6692 "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; }",
6693 "DataCloneError",
6694 ),
6695 (
6699 "var a = []; for (var i = 0; i < 50; i++) { a.push({v: i}); } var c = structuredClone(a); c.length === 50 && c[49].v === 49",
6700 "true",
6701 ),
6702 (
6707 "(function(){ var s = '['.repeat(20) + '0' + ']'.repeat(20); try { JSON.parse(s); return 'ok'; } catch (e) { return 'error'; } })()",
6708 "ok",
6709 ),
6710 (
6712 "var d=document.createElement('div'); var r='none'; d.onchange=function(){r='ok';}; d.dispatchEvent(new Event('change')); r",
6713 "ok",
6714 ),
6715 (
6717 "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",
6718 "B,y",
6719 ),
6720 ];
6721 let mut passed = 0;
6722 for (src, expect) in cases {
6723 let mut rt = JsRuntime::new();
6724 match rt.eval(src) {
6725 Ok(v) if &v.to_js_string() == expect => passed += 1,
6726 Ok(v) => crate::println!(
6727 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
6728 src,
6729 v.to_js_string(),
6730 expect
6731 ),
6732 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
6733 }
6734 }
6735
6736 {
6738 let mut rt = JsRuntime::new();
6739 let _ = rt.eval("var n=0; var id=setInterval(function(){n++;}, 10);");
6740 match rt.eval("n > 0") {
6741 Ok(v) if v.to_js_string() == "true" => passed += 1,
6742 Ok(v) => crate::println!(
6743 "JS_SELFTEST FAIL: `setInterval` => n > 0 is `{}` (want true)",
6744 v.to_js_string()
6745 ),
6746 Err(e) => crate::println!("JS_SELFTEST ERR: `setInterval` => {}", e),
6747 }
6748 }
6749 {
6750 let mut rt = JsRuntime::new();
6751 let _ = rt.eval("var n=0; var id=setInterval(function(){n++;}, 10); clearInterval(id);");
6752 match rt.eval("n") {
6753 Ok(v) if v.to_js_string() == "0" => passed += 1,
6754 Ok(v) => crate::println!(
6755 "JS_SELFTEST FAIL: `clearInterval` => n is `{}` (want 0)",
6756 v.to_js_string()
6757 ),
6758 Err(e) => crate::println!("JS_SELFTEST ERR: `clearInterval` => {}", e),
6759 }
6760 }
6761 {
6768 let mut rt = JsRuntime::new();
6769 let _ = rt.eval(
6770 "var n=0; var target=50; var inc=target/100; \
6771 var id=setInterval(function(){ \
6772 n+=inc; \
6773 if (n>=target) { n=target; clearInterval(id); } \
6774 }, 1);",
6775 );
6776 match rt.eval("n") {
6777 Ok(v) if v.to_js_string() == "50" => passed += 1,
6778 Ok(v) => crate::println!(
6779 "JS_SELFTEST FAIL: setInterval 統計カウンター模擬 => n is `{}` (want 50)",
6780 v.to_js_string()
6781 ),
6782 Err(e) => crate::println!("JS_SELFTEST ERR: setInterval 統計カウンター模擬 => {}", e),
6783 }
6784 }
6785 let abort_timeout_total = 1;
6788 {
6789 let mut rt = JsRuntime::new();
6790 let _ = rt.eval(
6791 "var fired=false; var s=AbortSignal.timeout(0); s.addEventListener('abort', function(){fired=true;});",
6792 );
6793 match rt.eval("fired + ',' + s.reason.name") {
6797 Ok(v) if v.to_js_string() == "true,TimeoutError" => passed += 1,
6798 Ok(v) => crate::println!(
6799 "JS_SELFTEST FAIL: `AbortSignal.timeout` => `{}` (want `true,TimeoutError`)",
6800 v.to_js_string()
6801 ),
6802 Err(e) => crate::println!("JS_SELFTEST ERR: `AbortSignal.timeout` => {}", e),
6803 }
6804 }
6805
6806 let dom_html = "<div id='out'>0</div><p class='msg'>hi</p><button id='b' class='x'>go</button>";
6808 let dom_cases: &[(&str, &str)] = &[
6809 ("document.getElementById('out').textContent", "0"),
6810 ("var e=document.getElementById('out'); e.textContent='42'; e.textContent", "42"),
6811 ("document.getElementById('out').tagName", "DIV"),
6812 ("document.querySelector('.msg').textContent", "hi"),
6813 ("document.querySelectorAll('div').length", "1"),
6814 ("document.getElementById('b').classList.contains('x')", "true"),
6815 ("var e=document.getElementById('b'); e.classList.add('y'); e.classList.contains('y')", "true"),
6816 ("var e=document.getElementById('b'); e.classList.toggle('x'); e.classList.contains('x')", "false"),
6817 ("var e=document.getElementById('out'); e.style.color='red'; e.style.color", "red"),
6818 ("document.getElementById('missing') === null", "true"),
6819 ("document.getElementById('b').getAttribute('id')", "b"),
6820 ("document.children.length", "1"),
6825 ("document.children[0] === document.documentElement", "true"),
6826 ("document.childElementCount", "1"),
6827 ("var n=0; document.getElementById('b').addEventListener('click', () => n++); n", "0"),
6829 ("document.createElement('DIV').tagName", "DIV"),
6831 ("var d=document.createElement('div'); d.textContent='hi'; d.textContent", "hi"),
6832 ("var d=document.createElement('div'); d.textContent='hi'; d.textContent=null; d.textContent===''", "true"),
6834 ("var d=document.createElement('div'); d.innerHTML='<b>x</b>'; d.innerHTML=undefined; d.innerHTML===''", "true"),
6835 ("var c=document.getElementById('out'); var s=document.createElement('span'); s.textContent='X'; c.appendChild(s); c.textContent", "0X"),
6836 ("var c=document.getElementById('out'); c.innerHTML='<b>Y</b>'; c.textContent", "Y"),
6837 ("var c=document.getElementById('out'); var i=document.createElement('i'); c.appendChild(i); document.querySelector('i') === null", "false"),
6838 ("var c=document.getElementById('out'); c.innerHTML='<span class=z>1</span><span class=z>2</span>'; document.querySelectorAll('.z').length", "2"),
6839 ("var c=document.getElementById('out'); var t=document.createTextNode('TT'); c.appendChild(t); c.textContent", "0TT"),
6840 ("var c=document.getElementById('out'); c.appendChild(document.createElement('em')); document.querySelector('em').remove(); document.querySelector('em') === null", "true"),
6841 (
6849 "var a=document.createElement('div'); var b=document.getElementById('out'); a.ariaActiveDescendantElement=b; a.getAttribute('aria-activedescendant')+'|'+(a.ariaActiveDescendantElement===b)",
6850 "out|true",
6851 ),
6852 (
6858 "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)",
6859 "out b|2|true|true",
6860 ),
6861 (
6862 "document.createElement('div').ariaDescribedByElements.length",
6863 "0",
6864 ),
6865 (
6870 "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",
6871 "0",
6872 ),
6873 (
6874 "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",
6875 "true",
6876 ),
6877 (
6878 "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; }",
6879 "NotFoundError",
6880 ),
6881 ];
6882 let total = cases.len() + dom_cases.len();
6883 for (src, expect) in dom_cases {
6884 let mut rt = JsRuntime::new();
6885 rt.dom
6886 .borrow_mut()
6887 .build_from(&crate::os_lib::dom::parse_html(dom_html));
6888 match rt.eval(src) {
6889 Ok(v) if &v.to_js_string() == expect => passed += 1,
6890 Ok(v) => crate::println!(
6891 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
6892 src,
6893 v.to_js_string(),
6894 expect
6895 ),
6896 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
6897 }
6898 }
6899
6900 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>";
6902 let dom2_cases: &[(&str, &str)] = &[
6903 ("document.getElementById('t').hasAttribute('class')", "true"),
6904 ("document.getElementById('t').hasAttribute('nope')", "false"),
6905 ("document.getElementById('t').getAttribute('data-k')", "v"),
6906 ("var e=document.getElementById('t'); e.removeAttribute('class'); e.hasAttribute('class')", "false"),
6907 ("document.getElementById('t').matches('.a')", "true"),
6908 ("document.getElementById('t').matches('.z')", "false"),
6909 ("document.getElementById('t').matches('p')", "true"),
6910 ("document.getElementById('t').closest('.container').id", "wrap"),
6911 ("document.getElementById('t').closest('#wrap').id", "wrap"),
6912 ("document.getElementById('t').closest('p').id", "t"),
6913 ("document.getElementById('t').closest('.nope') === null", "true"),
6914 ("document.getElementById('wrap').querySelector('.a').id", "t"),
6915 ("document.getElementById('wrap').querySelector('span').id", "s"),
6916 ("document.getElementById('wrap').querySelectorAll('*').length", "2"),
6917 ("document.getElementById('t').matches('p.a')", "true"),
6920 ("document.getElementById('t').matches('p.z')", "false"),
6921 ("document.getElementById('t').matches('p.a.b')", "true"),
6922 ("document.getElementById('t').matches('[data-k]')", "true"),
6924 ("document.getElementById('t').matches('[data-k=v]')", "true"),
6925 ("document.getElementById('t').matches('[data-k=x]')", "false"),
6926 ("document.getElementById('t').matches('[data-k^=v]')", "true"),
6927 ("document.getElementById('t').matches('#wrap p')", "true"),
6929 ("document.getElementById('t').matches('#wrap > p')", "true"),
6930 ("document.getElementById('t').matches('#wrap > span')", "false"),
6931 ("document.getElementById('s').matches('p ~ span')", "true"),
6933 ("document.getElementById('s').matches('span ~ span')", "false"),
6934 ("document.getElementById('wrap').querySelector('p.a').id", "t"),
6936 ("document.getElementById('wrap').querySelectorAll('[data-k]').length", "1"),
6937 ("document.getElementById('t').matches(':not(span)')", "true"),
6939 ("document.getElementById('t').matches(':not(p)')", "false"),
6940 ("document.getElementById('t').matches('p:not(.z)')", "true"),
6941 ("document.getElementById('t').matches('p:not(.a)')", "false"),
6942 ("document.getElementById('wrap').querySelectorAll(':not(span)').length", "1"),
6943 ("document.getElementById('wrap').querySelectorAll(':scope > p').length", "1"),
6947 ("document.getElementById('wrap').querySelectorAll(':scope > p')[0].id", "t"),
6948 ("document.getElementById('wrap').querySelector(':scope > span').id", "s"),
6949 ("document.getElementById('wrap').querySelectorAll(':scope > .nope').length", "0"),
6950 ("document.getElementById('t').matches(':scope')", "true"),
6951 ("document.getElementById('t').closest(':scope').id", "t"),
6952 ("document.getElementById('t').matches(':first-child')", "true"),
6954 ("document.getElementById('t').matches(':last-child')", "false"),
6955 ("document.getElementById('s').matches(':last-child')", "true"),
6956 ("document.getElementById('t').matches(':only-child')", "false"),
6957 ("document.getElementById('t').matches(':nth-child(1)')", "true"),
6958 ("document.getElementById('s').matches(':nth-child(2)')", "true"),
6959 ("document.getElementById('t').matches(':nth-child(odd)')", "true"),
6960 ("document.getElementById('s').matches(':nth-child(odd)')", "false"),
6961 ("document.getElementById('s').matches(':nth-child(2n)')", "true"),
6962 ("document.getElementById('s').matches(':nth-last-child(1)')", "true"),
6965 ("document.getElementById('t').matches(':nth-last-child(1)')", "false"),
6966 ("document.getElementById('t').matches(':nth-last-child(2)')", "true"),
6967 ("document.getElementById('s').matches(':nth-last-child(odd)')", "true"),
6968 (
6975 "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')",
6976 "true",
6977 ),
6978 (
6979 "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')",
6980 "true",
6981 ),
6982 (
6983 "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')",
6984 "false",
6985 ),
6986 (
6987 "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')",
6988 "true",
6989 ),
6990 (
6991 "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')",
6992 "false",
6993 ),
6994 (
6995 "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)')",
6996 "true",
6997 ),
6998 (
6999 "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)')",
7000 "false",
7001 ),
7002 (
7005 "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)')",
7006 "true",
7007 ),
7008 (
7009 "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)')",
7010 "true",
7011 ),
7012 ("document.getElementById('t').matches(':is(.z, .a)')", "true"),
7015 ("document.getElementById('t').matches(':is(.z, .y)')", "false"),
7016 ("document.getElementById('t').matches(':where(span, p.a)')", "true"),
7017 ("document.getElementById('s').matches(':is(span)')", "true"),
7018 ("document.getElementById('t').parentElement.id", "wrap"),
7019 ("document.getElementById('wrap').children.length", "2"),
7020 ("document.getElementById('wrap').childElementCount", "2"),
7021 ("document.getElementById('wrap').hasChildNodes()", "true"),
7023 ("document.createElement('div').hasChildNodes()", "false"),
7024 (
7029 "document.createElementNS('http://www.w3.org/2000/svg', 'circle').tagName",
7030 "CIRCLE",
7031 ),
7032 (
7033 "var e=document.createElementNS('http://www.w3.org/2000/svg', 'rect'); \
7034 e.setAttribute('width', '10'); e.getAttribute('width')",
7035 "10",
7036 ),
7037 ("document.getElementById('wrap').firstElementChild.id", "t"),
7038 ("document.getElementById('wrap').lastElementChild.id", "s"),
7039 ("document.getElementById('t').nextElementSibling.id", "s"),
7040 ("document.getElementById('s').previousElementSibling.id", "t"),
7041 ("document.getElementById('wrap').getAttributeNames().join(',')", "id,class"),
7042 ("document.getElementById('wrap').attributes.length", "2"),
7045 ("document.getElementById('wrap').attributes[0].name", "id"),
7046 ("document.getElementById('wrap').attributes[0].value", "wrap"),
7047 ("document.getElementById('wrap').getAttributeNode('id').value", "wrap"),
7050 ("document.getElementById('wrap').getAttributeNode('missing')", "null"),
7051 (
7052 "var e=document.getElementById('wrap'); \
7053 e.setAttributeNode({name:'data-x', value:'1'}); e.getAttribute('data-x')",
7054 "1",
7055 ),
7056 (
7057 "var e=document.getElementById('wrap'); var a=e.getAttributeNode('id'); \
7058 e.removeAttributeNode(a); e.hasAttribute('id')",
7059 "false",
7060 ),
7061 ("document.createAttribute('DATA-X').name", "data-x"),
7065 ("document.createAttribute('data-x').value", ""),
7066 ("document.createAttribute('data-x').ownerElement", "null"),
7067 (
7068 "var e=document.getElementById('wrap'); var a=document.createAttribute('data-y'); \
7069 a.value='42'; e.setAttributeNode(a); e.getAttribute('data-y')",
7070 "42",
7071 ),
7072 ("document.fullscreenElement", "null"),
7076 ("document.fullscreenEnabled", "true"),
7077 (
7078 "var e=document.getElementById('wrap'); e.requestFullscreen(); document.fullscreenElement===e",
7079 "true",
7080 ),
7081 (
7082 "var e=document.getElementById('wrap'); e.requestFullscreen(); document.exitFullscreen(); document.fullscreenElement",
7083 "null",
7084 ),
7085 ("document.pointerLockElement", "null"),
7089 (
7090 "var e=document.getElementById('wrap'); e.requestPointerLock(); document.pointerLockElement===e",
7091 "true",
7092 ),
7093 (
7094 "var e=document.getElementById('wrap'); e.requestPointerLock(); document.exitPointerLock(); document.pointerLockElement",
7095 "null",
7096 ),
7097 ("document.pictureInPictureElement", "null"),
7102 ("document.pictureInPictureEnabled", "true"),
7103 (
7104 "var e=document.getElementById('wrap'); e.requestPictureInPicture(); \
7105 document.pictureInPictureElement===e",
7106 "true",
7107 ),
7108 (
7109 "var e=document.getElementById('wrap'); e.requestPictureInPicture(); \
7110 document.exitPictureInPicture(); document.pictureInPictureElement",
7111 "null",
7112 ),
7113 (
7116 "document.createTreeWalker(document.getElementById('wrap')).currentNode.id",
7117 "wrap",
7118 ),
7119 (
7120 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7121 tw.firstChild(); tw.currentNode.id",
7122 "t",
7123 ),
7124 (
7125 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7126 tw.firstChild(); tw.nextSibling(); tw.currentNode.id",
7127 "s",
7128 ),
7129 (
7130 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7131 tw.firstChild(); tw.nextSibling(); tw.parentNode(); tw.currentNode.id",
7132 "wrap",
7133 ),
7134 (
7135 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7136 tw.nextNode(); tw.currentNode.id",
7137 "t",
7138 ),
7139 (
7140 "var tw=document.createTreeWalker(document.getElementById('wrap')); \
7141 var r=tw.parentNode(); r === null && tw.currentNode.id === 'wrap'",
7142 "true",
7143 ),
7144 (
7147 "document.createNodeIterator(document.getElementById('wrap')).nextNode().id",
7148 "wrap",
7149 ),
7150 (
7151 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7152 ni.nextNode(); ni.nextNode().id",
7153 "t",
7154 ),
7155 (
7158 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7159 ni.nextNode(); ni.nextNode(); ni.nextNode().nodeValue",
7160 "x",
7161 ),
7162 (
7163 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7164 ni.nextNode(); ni.nextNode(); ni.nextNode(); ni.nextNode().id",
7165 "s",
7166 ),
7167 (
7168 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7169 ni.nextNode(); ni.nextNode(); ni.nextNode(); ni.nextNode(); ni.nextNode(); \
7170 ni.nextNode() === null",
7171 "true",
7172 ),
7173 (
7174 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7175 ni.nextNode(); ni.nextNode(); ni.previousNode().id",
7176 "t",
7177 ),
7178 (
7179 "var ni=document.createNodeIterator(document.getElementById('wrap')); \
7180 ni.nextNode(); ni.nextNode(); ni.previousNode(); ni.previousNode().id",
7181 "wrap",
7182 ),
7183 ("document.getElementById('wrap').contentEditable", "inherit"),
7186 ("document.getElementById('wrap').isContentEditable", "false"),
7187 (
7188 "var e=document.getElementById('wrap'); e.contentEditable='true'; \
7189 e.contentEditable + ',' + e.isContentEditable",
7190 "true,true",
7191 ),
7192 (
7193 "var e=document.getElementById('wrap'); e.contentEditable='plaintext-only'; \
7194 e.contentEditable + ',' + e.isContentEditable",
7195 "plaintext-only,true",
7196 ),
7197 (
7198 "var e=document.getElementById('wrap'); e.contentEditable='bogus'; e.contentEditable",
7199 "inherit",
7200 ),
7201 ("document.designMode", "off"),
7202 ("document.getElementById('wrap').spellcheck", "true"),
7206 (
7207 "var e=document.getElementById('wrap'); e.spellcheck=false; e.spellcheck",
7208 "false",
7209 ),
7210 ("document.getElementById('wrap').inputMode", ""),
7211 (
7212 "var e=document.getElementById('wrap'); e.inputMode='numeric'; e.inputMode",
7213 "numeric",
7214 ),
7215 (
7216 "var e=document.getElementById('wrap'); e.enterKeyHint='search'; e.enterKeyHint",
7217 "search",
7218 ),
7219 (
7224 "var e=document.getElementById('wrap'); e.autocapitalize='words'; e.autocapitalize",
7225 "words",
7226 ),
7227 ("document.createElement('div').popover", "null"),
7228 (
7229 "var e=document.createElement('div'); e.popover='manual'; e.popover",
7230 "manual",
7231 ),
7232 (
7233 "var e=document.createElement('div'); e.popover='auto'; e.popover=null; e.popover",
7234 "null",
7235 ),
7236 (
7240 "var b=document.createElement('button'); b.setAttribute('popovertarget','wrap'); \
7241 b.popoverTargetElement === document.getElementById('wrap')",
7242 "true",
7243 ),
7244 ("document.createElement('button').popoverTargetElement", "null"),
7245 (
7246 "var b=document.createElement('button'); b.popoverTargetElement = document.getElementById('wrap'); \
7247 b.getAttribute('popovertarget')",
7248 "wrap",
7249 ),
7250 (
7251 "var b=document.createElement('button'); b.popoverTargetAction='hide'; b.popoverTargetAction",
7252 "hide",
7253 ),
7254 ("document.createElement('input').list", "null"),
7257 (
7258 "var i=document.createElement('input'); i.setAttribute('list','missing'); i.list",
7259 "null",
7260 ),
7261 (
7262 "var dl=document.createElement('datalist'); dl.id='opts'; \
7263 document.getElementById('wrap').appendChild(dl); \
7264 var i=document.createElement('input'); i.setAttribute('list','opts'); \
7265 i.list === dl",
7266 "true",
7267 ),
7268 (
7269 "var d=document.createElement('div'); d.id='notdl'; \
7270 document.getElementById('wrap').appendChild(d); \
7271 var i=document.createElement('input'); i.setAttribute('list','notdl'); i.list",
7272 "null",
7273 ),
7274 ("document.createElement('a').relList.length", "0"),
7277 (
7278 "var a=document.createElement('a'); a.rel='noopener noreferrer'; \
7279 a.relList.join(',')",
7280 "noopener,noreferrer",
7281 ),
7282 (
7283 "var a=document.createElement('a'); a.rel='noopener noreferrer'; \
7284 a.relList.includes('noreferrer')",
7285 "true",
7286 ),
7287 (
7290 "var a=document.createElement('a'); a.referrerPolicy='no-referrer'; \
7291 a.referrerPolicy",
7292 "no-referrer",
7293 ),
7294 (
7295 "var i=document.createElement('img'); i.loading='lazy'; i.loading",
7296 "lazy",
7297 ),
7298 (
7299 "var i=document.createElement('img'); i.decoding='async'; i.decoding",
7300 "async",
7301 ),
7302 (
7303 "var f=document.createElement('iframe'); f.allow='camera'; f.allow",
7304 "camera",
7305 ),
7306 ("document.createElement('iframe').sandbox.length", "0"),
7307 (
7308 "var f=document.createElement('iframe'); \
7309 f.setAttribute('sandbox','allow-scripts allow-forms'); \
7310 f.sandbox.join(',')",
7311 "allow-scripts,allow-forms",
7312 ),
7313 ("document.createElement('img').crossOrigin", "null"),
7317 (
7318 "var i=document.createElement('img'); i.crossOrigin='anonymous'; i.crossOrigin",
7319 "anonymous",
7320 ),
7321 ("document.createElement('img').fetchPriority", "auto"),
7322 (
7323 "var i=document.createElement('img'); i.fetchPriority='high'; i.fetchPriority",
7324 "high",
7325 ),
7326 (
7327 "var s=document.createElement('script'); s.integrity='sha256-x'; s.integrity",
7328 "sha256-x",
7329 ),
7330 (
7331 "var s=document.createElement('script'); s.async=true; s.async + ',' + \
7332 s.hasAttribute('async')",
7333 "true,true",
7334 ),
7335 (
7336 "var s=document.createElement('script'); s.defer=true; s.defer=false; s.defer",
7337 "false",
7338 ),
7339 (
7340 "var s=document.createElement('script'); s.noModule=true; s.noModule",
7341 "true",
7342 ),
7343 (
7347 "var i=document.createElement('img'); i.srcset='a.jpg 1x, b.jpg 2x'; i.srcset",
7348 "a.jpg 1x, b.jpg 2x",
7349 ),
7350 (
7351 "var i=document.createElement('img'); i.sizes='(max-width:600px) 480px'; i.sizes",
7352 "(max-width:600px) 480px",
7353 ),
7354 (
7355 "var l=document.createElement('link'); l.media='print'; l.media",
7356 "print",
7357 ),
7358 (
7359 "var i=document.createElement('img'); i.useMap='#m'; i.useMap",
7360 "#m",
7361 ),
7362 ("document.createElement('img').isMap", "false"),
7363 (
7364 "var i=document.createElement('img'); i.isMap=true; i.hasAttribute('ismap')",
7365 "true",
7366 ),
7367 (
7368 "var i=document.createElement('img'); i.src='a.jpg'; i.currentSrc",
7369 "a.jpg",
7370 ),
7371 ("document.createElement('img').complete", "false"),
7376 (
7377 "var i=document.createElement('img'); i.src='a.jpg'; i.complete",
7378 "true",
7379 ),
7380 (
7381 "var i=document.createElement('img'); i.src='a.jpg'; i.naturalWidth + ',' + i.naturalHeight",
7382 "0,0",
7383 ),
7384 (
7385 "var i=document.createElement('img'); i.src='a.jpg'; \
7386 await i.decode().then(() => 'ok')",
7387 "ok",
7388 ),
7389 (
7390 "var i=document.createElement('img'); \
7391 await i.decode().catch(e => e.name)",
7392 "EncodingError",
7393 ),
7394 ("document.createElement('video').autoplay", "false"),
7398 (
7399 "var v=document.createElement('video'); v.autoplay=true; v.autoplay + \
7400 ',' + v.hasAttribute('autoplay')",
7401 "true,true",
7402 ),
7403 (
7404 "var v=document.createElement('video'); v.controls=true; v.controls=false; \
7405 v.controls",
7406 "false",
7407 ),
7408 (
7409 "var v=document.createElement('video'); v.loop=true; v.loop",
7410 "true",
7411 ),
7412 (
7413 "var v=document.createElement('video'); v.muted=true; v.muted",
7414 "true",
7415 ),
7416 (
7417 "var v=document.createElement('video'); v.playsInline=true; \
7418 v.hasAttribute('playsinline')",
7419 "true",
7420 ),
7421 (
7422 "var v=document.createElement('video'); v.preload='auto'; v.preload",
7423 "auto",
7424 ),
7425 (
7426 "var v=document.createElement('video'); v.poster='p.jpg'; v.poster",
7427 "p.jpg",
7428 ),
7429 (
7430 "var a=document.createElement('a'); a.ping='https://x'; a.ping",
7431 "https://x",
7432 ),
7433 (
7434 "var a=document.createElement('a'); a.hreflang='en'; a.hreflang",
7435 "en",
7436 ),
7437 ("document.createElement('video').paused", "true"),
7441 (
7442 "var v=document.createElement('video'); await v.play(); v.paused",
7443 "false",
7444 ),
7445 (
7446 "var v=document.createElement('video'); await v.play(); v.pause(); v.paused",
7447 "true",
7448 ),
7449 (
7450 "var v=document.createElement('video'); v.currentTime=12.5; v.currentTime",
7451 "12.5",
7452 ),
7453 (
7454 "var v=document.createElement('video'); Number.isNaN(v.duration)",
7455 "true",
7456 ),
7457 ("document.createElement('video').volume", "1"),
7458 (
7459 "var v=document.createElement('video'); v.volume=0.5; v.volume",
7460 "0.5",
7461 ),
7462 (
7463 "var v=document.createElement('video'); v.volume=5; v.volume",
7464 "1",
7465 ),
7466 (
7467 "var v=document.createElement('video'); v.playbackRate=2; v.playbackRate",
7468 "2",
7469 ),
7470 (
7474 "var v=document.createElement('video'); var log=[]; \
7475 v.addEventListener('play', ()=>log.push('play')); \
7476 v.addEventListener('playing', ()=>log.push('playing')); \
7477 await v.play(); log.join(',')",
7478 "play,playing",
7479 ),
7480 (
7481 "var v=document.createElement('video'); var n=0; \
7482 v.addEventListener('pause', ()=>n++); \
7483 await v.play(); v.pause(); v.pause(); n",
7484 "1",
7485 ),
7486 (
7487 "var v=document.createElement('video'); var n=0; \
7488 v.addEventListener('play', ()=>n++); \
7489 await v.play(); await v.play(); n",
7490 "1",
7491 ),
7492 (
7496 "var v=document.createElement('video'); var f=false; \
7497 v.addEventListener('seeked', ()=>f=true); v.currentTime=5; f",
7498 "true",
7499 ),
7500 (
7501 "var v=document.createElement('video'); var f=false; \
7502 v.addEventListener('volumechange', ()=>f=true); v.volume=0.3; f",
7503 "true",
7504 ),
7505 (
7506 "var v=document.createElement('video'); var f=false; \
7507 v.addEventListener('volumechange', ()=>f=true); v.muted=true; f",
7508 "true",
7509 ),
7510 (
7511 "var v=document.createElement('video'); var f=false; \
7512 v.addEventListener('ratechange', ()=>f=true); v.playbackRate=1.5; f",
7513 "true",
7514 ),
7515 ("document.createElement('video').readyState", "0"),
7519 ("document.createElement('video').networkState", "0"),
7520 (
7521 "var v=document.createElement('video'); v.src='a.mp4'; v.networkState",
7522 "3",
7523 ),
7524 ("document.createElement('video').error", "null"),
7525 ("document.createElement('video').buffered.length", "0"),
7530 ("document.createElement('video').seekable.length", "0"),
7531 (
7532 "try { document.createElement('video').buffered.start(0); 'no-throw' } \
7533 catch(e) { 'threw' }",
7534 "threw",
7535 ),
7536 ("document.createElement('video').defaultPlaybackRate", "1"),
7537 (
7538 "var v=document.createElement('video'); v.defaultPlaybackRate=1.5; \
7539 v.defaultPlaybackRate + ',' + v.playbackRate",
7540 "1.5,1",
7541 ),
7542 (
7546 "document.createElement('div').getAnimations().length",
7547 "0",
7548 ),
7549 (
7550 "var e=document.createElement('div'); e.animate([], 100); \
7551 e.getAnimations().length",
7552 "0",
7553 ),
7554 ("document.getAnimations().length", "0"),
7555 (
7559 "var a=document.createElement('div').animate([],100); \
7560 typeof a.reverse + ',' + typeof a.finish + ',' + a.playbackRate",
7561 "function,function,1",
7562 ),
7563 (
7564 "var a=document.createElement('div').animate([],100); a.reverse(); a.finish(); a.playbackRate=2; a.playbackRate",
7565 "2",
7566 ),
7567 (
7570 "var s=document.createElement('script'); s.nonce='abc123'; s.nonce",
7571 "abc123",
7572 ),
7573 (
7577 "var s=document.getSelection(); s.collapse(document.body, 0); \
7578 s.anchorNode + ',' + s.type",
7579 "null,None",
7580 ),
7581 (
7582 "var s=document.getSelection(); s.containsNode(document.body)",
7583 "false",
7584 ),
7585 (
7589 "typeof document.getSelection().removeRange",
7590 "function",
7591 ),
7592 (
7593 "document.getSelection().removeRange(document.createRange())",
7594 "undefined",
7595 ),
7596 (
7597 "try { document.getSelection().getRangeAt(0); 'no-throw' } \
7598 catch(e) { 'threw' }",
7599 "threw",
7600 ),
7601 (
7605 "var r=document.createRange(); r.setStart(document.body, 0); \
7606 r.collapsed + ',' + r.toString()",
7607 "true,",
7608 ),
7609 (
7610 "var r=document.createRange(); var r2=r.cloneRange(); \
7611 r2.collapsed",
7612 "true",
7613 ),
7614 (
7615 "document.createRange().isPointInRange(document.body, 0)",
7616 "false",
7617 ),
7618 (
7619 "document.designMode='on'; document.designMode",
7620 "on",
7621 ),
7622 ("document.getElementById('wrap').hasAttributes()", "true"),
7625 ("document.createElement('div').hasAttributes()", "false"),
7626 ("var e=document.getElementById('wrap'); e.isSameNode(e)", "true"),
7628 (
7629 "document.getElementById('wrap').isSameNode(document.getElementById('t'))",
7630 "false",
7631 ),
7632 (
7633 "var a=document.createElement('div'); a.id='x'; var b=document.createElement('div'); b.id='x'; a.isEqualNode(b)",
7634 "true",
7635 ),
7636 (
7637 "var a=document.createElement('div'); a.id='x'; var b=document.createElement('div'); b.id='y'; a.isEqualNode(b)",
7638 "false",
7639 ),
7640 (
7643 "var d=document.createElement('div'); d.appendChild(document.createTextNode('a')); d.appendChild(document.createTextNode('b')); d.normalize(); d.childNodes.length",
7644 "1",
7645 ),
7646 (
7647 "var d=document.createElement('div'); d.appendChild(document.createTextNode('a')); d.appendChild(document.createTextNode('b')); d.normalize(); d.textContent",
7648 "ab",
7649 ),
7650 (
7651 "var d=document.createElement('div'); d.appendChild(document.createTextNode('')); d.normalize(); d.childNodes.length",
7652 "0",
7653 ),
7654 ("typeof document.createDocumentFragment", "function"),
7657 (
7658 "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",
7659 "2,SPAN,EM",
7660 ),
7661 (
7663 "var f=document.createDocumentFragment(); f.appendChild(document.createElement('span')); var d=document.createElement('div'); d.appendChild(f); f.childNodes.length",
7664 "0",
7665 ),
7666 ("document.getElementsByTagName('p').length", "1"),
7668 ("document.getElementsByClassName('a')[0].id", "t"),
7669 ("document.getElementsByTagName('span')[0].id", "s"),
7670 (
7673 "document.getElementById('wrap').getElementsByClassName('a')[0].id",
7674 "t",
7675 ),
7676 (
7677 "document.getElementById('wrap').getElementsByTagName('span')[0].id",
7678 "s",
7679 ),
7680 (
7681 "document.getElementById('s').getElementsByClassName('a').length",
7682 "0",
7683 ),
7684 ("document.getElementsByTagNameNS('*', 'span')[0].id", "s"),
7686 (
7687 "document.getElementById('wrap').getElementsByTagNameNS(null, 'span')[0].id",
7688 "s",
7689 ),
7690 (
7691 "document.getElementById('wrap').getAttributeNodeNS(null, 'id').value",
7692 "wrap",
7693 ),
7694 (
7695 "document.getElementById('wrap').getAttributeNodeNS('http://www.w3.org/1999/xhtml', 'missing') === null",
7696 "true",
7697 ),
7698 (
7702 "var a=document.createElement('input'); a.setAttribute('name','q'); \
7703 var b=document.createElement('input'); b.setAttribute('name','q'); \
7704 var wrap=document.getElementById('wrap'); \
7705 wrap.appendChild(a); wrap.appendChild(b); \
7706 document.getElementsByName('q').length",
7707 "2",
7708 ),
7709 ("document.getElementsByName('no-such-name').length", "0"),
7710 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='ap'; w.append(n); w.lastElementChild.id", "ap"),
7712 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='pp'; w.prepend(n); w.firstElementChild.id", "pp"),
7713 ("var n=document.createElement('b'); n.id='bf'; document.getElementById('t').before(n); document.getElementById('t').previousElementSibling.id", "bf"),
7714 ("var n=document.createElement('b'); n.id='af'; document.getElementById('t').after(n); document.getElementById('t').nextElementSibling.id", "af"),
7715 ("var n=document.createElement('b'); n.id='rw'; document.getElementById('s').replaceWith(n); document.getElementById('wrap').lastElementChild.id", "rw"),
7716 ("var w=document.getElementById('wrap'); w.append('TXT'); w.textContent.indexOf('TXT') >= 0", "true"),
7717 (
7720 "var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='rc'; w.replaceChildren(n); w.children.length + ',' + w.firstElementChild.id",
7721 "1,rc",
7722 ),
7723 (
7724 "var w=document.getElementById('wrap'); w.replaceChildren(); w.children.length",
7725 "0",
7726 ),
7727 (
7730 "var w=document.getElementById('wrap'); w.scrollTo(0, 50); w.scrollTop",
7731 "50",
7732 ),
7733 (
7734 "var w=document.getElementById('wrap'); w.scrollTo({top: 30}); w.scrollTop",
7735 "30",
7736 ),
7737 (
7738 "var w=document.getElementById('wrap'); w.scrollTop=10; w.scrollBy(0, 5); w.scrollTop",
7739 "15",
7740 ),
7741 ("document.getElementById('t').classList.length", "2"),
7743 ("document.getElementById('t').classList.value", "a b"),
7744 ("document.getElementById('t').classList.item(0)", "a"),
7745 ("document.getElementById('t').classList.toString()", "a b"),
7746 ("var w=document.getElementById('wrap'); w.insertAdjacentHTML('beforeend','<i id=iah>z</i>'); document.getElementById('iah').tagName", "I"),
7748 ("var w=document.getElementById('wrap'); w.insertAdjacentHTML('beforeEnd','<b id=iahc>z</b>'); document.getElementById('iahc').tagName", "B"),
7751 ("var t=document.getElementById('t'); t.insertAdjacentHTML('afterend','<u id=iae>q</u>'); t.nextElementSibling.id", "iae"),
7752 ("var t=document.getElementById('t'); var n=document.createElement('b'); n.id='iel'; t.insertAdjacentElement('beforebegin', n); t.previousElementSibling.id", "iel"),
7753 ("var t=document.getElementById('t'); t.toggleAttribute('hidden'); t.hasAttribute('hidden')", "true"),
7754 ("var t=document.getElementById('t'); t.toggleAttribute('hidden'); t.toggleAttribute('hidden'); t.hasAttribute('hidden')", "false"),
7755 ("var t=document.getElementById('t'); t.toggleAttribute('hidden', true); t.hasAttribute('hidden')", "true"),
7756 ("var t=document.getElementById('t'); t.toggleAttribute('hidden', true); t.toggleAttribute('hidden', false); t.hasAttribute('hidden')", "false"),
7757 ("var d=document.createElement('dialog'); d.open", "false"),
7759 ("var d=document.createElement('dialog'); d.show(); d.open", "true"),
7760 ("var d=document.createElement('dialog'); d.showModal(); d.open", "true"),
7761 ("var d=document.createElement('dialog'); d.show(); d.hasAttribute('_modal')", "false"),
7766 ("var d=document.createElement('dialog'); d.showModal(); d.hasAttribute('_modal')", "true"),
7767 ("var d=document.createElement('dialog'); d.showModal(); d.close(); d.hasAttribute('_modal')", "false"),
7768 ("var d=document.createElement('dialog'); d.show(); d.close(); d.open", "false"),
7769 ("var d=document.createElement('dialog'); d.show(); d.close('ok'); d.returnValue", "ok"),
7770 (
7771 "var d=document.createElement('dialog'); var closed=false; d.addEventListener('close', function(){ closed=true; }); d.show(); d.close(); closed",
7772 "true",
7773 ),
7774 ("var d=document.createElement('dialog'); d.open=true; d.hasAttribute('open')", "true"),
7775 ("var e=document.createElement('div'); e.togglePopover()", "true"),
7779 (
7780 "var e=document.createElement('div'); e.togglePopover(); e.togglePopover()",
7781 "false",
7782 ),
7783 (
7784 "var e=document.createElement('div'); e.togglePopover(true); e.togglePopover(true)",
7785 "true",
7786 ),
7787 (
7788 "var e=document.createElement('div'); e.showPopover(); e.togglePopover()",
7789 "false",
7790 ),
7791 (
7796 "var e=document.createElement('div'); var n=0; \
7797 e.addEventListener('toggle', () => n++); e.showPopover(); e.hidePopover(); n",
7798 "2",
7799 ),
7800 (
7801 "var e=document.createElement('div'); var n=0; \
7802 e.addEventListener('toggle', () => n++); e.togglePopover(); n",
7803 "1",
7804 ),
7805 (
7808 "var e=document.createElement('div'); var s=''; \
7809 e.addEventListener('toggle', ev => s=ev.oldState+'>'+ev.newState); \
7810 e.showPopover(); s",
7811 "closed>open",
7812 ),
7813 (
7814 "var e=document.createElement('div'); var s=''; \
7815 e.addEventListener('toggle', ev => s=ev.oldState+'>'+ev.newState); \
7816 e.showPopover(); e.hidePopover(); s",
7817 "open>closed",
7818 ),
7819 (
7823 "var e=document.createElement('div'); var n=0; \
7824 e.addEventListener('beforetoggle', () => n++); e.showPopover(); n",
7825 "1",
7826 ),
7827 (
7828 "var e=document.createElement('div'); var toggled=false; \
7829 e.addEventListener('beforetoggle', ev => ev.preventDefault()); \
7830 e.addEventListener('toggle', () => toggled=true); \
7831 e.showPopover(); toggled",
7832 "false",
7833 ),
7834 (
7835 "var e=document.createElement('div'); \
7836 e.addEventListener('beforetoggle', ev => ev.preventDefault()); \
7837 e.showPopover(); e.togglePopover()",
7838 "false",
7839 ),
7840 ("var t=document.createElement('div'); t.inert", "false"),
7842 ("var t=document.createElement('div'); t.setAttribute('inert',''); t.inert", "true"),
7843 ("var t=document.createElement('div'); t.inert=true; t.hasAttribute('inert')", "true"),
7844 ("var t=document.createElement('div'); t.inert=true; t.inert=false; t.hasAttribute('inert')", "false"),
7845 (
7847 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; tpl.content.children.length",
7848 "1",
7849 ),
7850 (
7851 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; tpl.content.firstChild.textContent",
7852 "hi",
7853 ),
7854 (
7856 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f=tpl.content; tpl.children.length",
7857 "0",
7858 ),
7859 (
7861 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f1=tpl.content; var f2=tpl.content; f1===f2",
7862 "true",
7863 ),
7864 (
7866 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var host=document.createElement('div'); host.appendChild(tpl.content); host.children.length",
7867 "1",
7868 ),
7869 (
7874 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; \
7875 var imported=document.importNode(tpl.content, true); \
7876 var host=document.createElement('div'); host.appendChild(imported); \
7877 host.children.length + ',' + tpl.content.children.length",
7878 "1,1",
7879 ),
7880 (
7881 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; \
7882 document.importNode(tpl.content, true).firstChild.textContent",
7883 "hi",
7884 ),
7885 (
7886 "var host1=document.createElement('div'); var host2=document.createElement('div'); \
7887 var child=document.createElement('span'); host1.appendChild(child); \
7888 document.adoptNode(child); host2.appendChild(child); \
7889 host1.children.length + ',' + host2.children.length",
7890 "0,1",
7891 ),
7892 (
7897 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f=tpl.content; \
7898 var clone=tpl.cloneNode(true); clone.content===tpl.content",
7899 "false",
7900 ),
7901 (
7902 "var tpl=document.createElement('template'); tpl.innerHTML='<p>hi</p>'; var f=tpl.content; \
7903 var clone=tpl.cloneNode(true); clone.content.children.length+','+tpl.content.children.length",
7904 "1,1",
7905 ),
7906 (
7910 "var tpl=document.createElement('template'); tpl.innerHTML='hi'; var f=tpl.content; tpl.outerHTML",
7911 "<template></template>",
7912 ),
7913 (
7914 "var tpl=document.createElement('template'); tpl.innerHTML='hi'; var f=tpl.content; \
7915 tpl.getAttributeNames().join(',')",
7916 "",
7917 ),
7918 ("document.createElement('progress').value", "0"),
7921 ("document.createElement('progress').max", "1"),
7922 ("var p=document.createElement('progress'); p.setAttribute('value','30'); p.setAttribute('max','50'); p.value+'/'+p.max", "30/50"),
7923 ("var p=document.createElement('progress'); p.value=40; p.getAttribute('value')", "40"),
7924 ("document.createElement('meter').min", "0"),
7925 ("var m=document.createElement('meter'); m.setAttribute('value','5'); typeof m.value", "number"),
7926 ("var i=document.createElement('input'); i.type='number'; i.value='42'; i.valueAsNumber", "42"),
7928 ("var i=document.createElement('input'); i.type='text'; i.value='42'; isNaN(i.valueAsNumber)", "true"),
7929 ("var i=document.createElement('input'); i.type='number'; i.valueAsNumber=7; i.value", "7"),
7930 ("var i=document.createElement('input'); i.type='number'; i.value='5'; i.valueAsNumber=NaN; i.value", ""),
7931 (
7934 "var i=document.createElement('input'); i.type='date'; i.value='2024-03-15'; \
7935 i.valueAsDate.getUTCFullYear()+'-'+(i.valueAsDate.getUTCMonth()+1)+'-'+i.valueAsDate.getUTCDate()",
7936 "2024-3-15",
7937 ),
7938 ("var i=document.createElement('input'); i.type='text'; i.value='2024-03-15'; i.valueAsDate", "null"),
7939 (
7940 "var i=document.createElement('input'); i.type='date'; i.valueAsDate=new Date(Date.UTC(2024,2,15)); i.value",
7941 "2024-03-15",
7942 ),
7943 (
7944 "var i=document.createElement('input'); i.type='month'; i.valueAsDate=new Date(Date.UTC(2024,2,15)); i.value",
7945 "2024-03",
7946 ),
7947 (
7948 "var i=document.createElement('input'); i.type='date'; i.value='x'; i.valueAsDate=null; i.value",
7949 "",
7950 ),
7951 (
7955 "var i=document.createElement('input'); i.type='date'; \
7956 i.setAttribute('value','not-a-date'); i.value",
7957 "",
7958 ),
7959 (
7960 "var i=document.createElement('input'); i.type='date'; \
7961 i.setAttribute('value','2026-07-18'); i.value",
7962 "2026-07-18",
7963 ),
7964 (
7965 "var i=document.createElement('input'); i.type='month'; \
7966 i.setAttribute('value','garbage'); i.value",
7967 "",
7968 ),
7969 (
7970 "var i=document.createElement('input'); i.type='datetime-local'; \
7971 i.setAttribute('value','2026-07-18T14:30'); i.value",
7972 "2026-07-18T14:30",
7973 ),
7974 ("var e=document.createElement('div'); e.setAttributeNS(null,'data-k','v'); e.getAttribute('data-k')", "v"),
7977 ("var e=document.createElement('div'); e.setAttribute('data-k','v'); e.getAttributeNS(null,'data-k')", "v"),
7978 ("var e=document.createElement('div'); e.setAttributeNS(null,'data-k','v'); e.hasAttributeNS(null,'data-k')", "true"),
7979 (
7980 "var e=document.createElement('div'); e.setAttributeNS(null,'data-k','v'); e.removeAttributeNS(null,'data-k'); e.hasAttribute('data-k')",
7981 "false",
7982 ),
7983 (
7985 "var p=document.createElement('div'); var c=document.createElement('span'); p.appendChild(c); c.getRootNode()===p",
7986 "true",
7987 ),
7988 (
7990 "document.getElementById('t').getRootNode()===document.getElementById('wrap').getRootNode()",
7991 "true",
7992 ),
7993 ("var e=document.createElement('div'); e.getRootNode()===e", "true"),
7995 ("var e=document.createElement('div'); e.lookupNamespaceURI('svg')", "null"),
7999 ("var e=document.createElement('div'); e.lookupPrefix('http://www.w3.org/2000/svg')", "null"),
8000 ("var e=document.createElement('div'); e.isDefaultNamespace(null)", "true"),
8001 ("var e=document.createElement('div'); e.isDefaultNamespace('http://www.w3.org/2000/svg')", "false"),
8002 ("document.getElementById('t').nodeType", "1"),
8004 ("document.getElementById('t').nodeName", "P"),
8005 ("document.getElementById('t').hidden", "false"),
8006 ("var e=document.getElementById('t'); e.toggleAttribute('hidden'); e.hidden", "true"),
8007 ("document.getElementById('t').dataset.k", "v"),
8010 ("var e=document.getElementById('t'); e.dataset.userId='42'; e.getAttribute('data-user-id')", "42"),
8011 ("var e=document.getElementById('t'); e.setAttribute('data-foo-bar','9'); e.dataset.fooBar", "9"),
8012 ("document.getElementById('t').dataset.missing === undefined", "true"),
8013 (
8016 "var e=document.getElementById('t'); e.dataset.temp='x'; delete e.dataset.temp; e.dataset.temp === undefined",
8017 "true",
8018 ),
8019 (
8020 "var e=document.getElementById('t'); e.dataset.userId='42'; delete e.dataset.userId; e.hasAttribute('data-user-id')",
8021 "false",
8022 ),
8023 (
8025 "var e=document.getElementById('t'); e.style.color='red'; delete e.style.color; e.style.color",
8026 "",
8027 ),
8028 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); n.id='n'; w.insertBefore(n, document.getElementById('s')); w.children[1].id", "n"),
8030 ("var w=document.getElementById('wrap'); var n=document.createElement('b'); w.insertBefore(n, null); w.lastElementChild.tagName", "B"),
8031 ("var w=document.getElementById('wrap'); var n=document.createElement('i'); n.id='ni'; w.replaceChild(n, document.getElementById('s')); w.lastElementChild.id", "ni"),
8033 ("var w=document.getElementById('wrap'); var n=document.createElement('i'); var old=w.replaceChild(n, document.getElementById('s')); old.id", "s"),
8034 (
8040 "var w=document.getElementById('wrap'); var outsider=document.createElement('div'); \
8041 var n=document.createElement('b'); \
8042 try { w.insertBefore(n, outsider); 'no-throw' } catch(e) { e.name }",
8043 "NotFoundError",
8044 ),
8045 (
8046 "var w=document.getElementById('wrap'); var outsider=document.createElement('div'); \
8047 var n=document.createElement('b'); \
8048 try { w.replaceChild(n, outsider); 'no-throw' } catch(e) { e.name }",
8049 "NotFoundError",
8050 ),
8051 (
8052 "var w=document.getElementById('wrap'); var outsider=document.createElement('div'); \
8053 try { w.removeChild(outsider); 'no-throw' } catch(e) { e.name }",
8054 "NotFoundError",
8055 ),
8056 ("document.getElementById('t').cloneNode(true).textContent", "x"),
8058 ("var c=document.getElementById('t').cloneNode(false); c.tagName + ':' + c.children.length", "P:0"),
8059 ("document.getElementById('t').cloneNode(true).parentElement === null", "true"),
8060 ("var e=document.getElementById('t'); e.classList.replace('a','z'); e.classList.contains('z') + ',' + e.classList.contains('a')", "true,false"),
8062 ("document.getElementById('t').classList.replace('nope','z')", "false"),
8063 (
8065 "var e=document.getElementById('t'); e.classList.toggle('force-on', true); e.classList.contains('force-on')",
8066 "true",
8067 ),
8068 (
8069 "var e=document.getElementById('t'); e.classList.add('force-off'); e.classList.toggle('force-off', false); e.classList.contains('force-off')",
8070 "false",
8071 ),
8072 (
8074 "var e=document.createElement('div'); e.classList.add('c1', 'c2', 'c3'); e.className",
8075 "c1 c2 c3",
8076 ),
8077 (
8078 "var e=document.createElement('div'); e.classList.add('c1', 'c2', 'c3'); e.classList.remove('c1', 'c3'); e.className",
8079 "c2",
8080 ),
8081 (
8082 "var e=document.createElement('div'); e.classList.supports('foo')",
8083 "false",
8084 ),
8085 (
8093 "var e=document.createElement('div'); e.id='wm'; e.webkitMatchesSelector('#wm')",
8094 "true",
8095 ),
8096 (
8097 "document.execCommand('copy')",
8098 "true",
8099 ),
8100 (
8103 "var e=document.createElement('div'); e.className='a b c'; var out=[]; for (const c of e.classList) out.push(c); out.join(',')",
8104 "a,b,c",
8105 ),
8106 (
8107 "var e=document.createElement('div'); e.className='x y'; [...e.classList].join(',')",
8108 "x,y",
8109 ),
8110 (
8111 "var e=document.createElement('div'); e.className='p q'; var out=''; e.classList.forEach(function(c,i){out+=i+':'+c+' '}); out.trim()",
8112 "0:p 1:q",
8113 ),
8114 (
8118 "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(',')",
8119 "0:r,1:s",
8120 ),
8121 (
8122 "var e=document.createElement('div'); e.className='r s'; [...e.classList.keys()].join(',')",
8123 "0,1",
8124 ),
8125 (
8126 "var e=document.createElement('div'); e.className='r s'; [...e.classList.values()].join(',')",
8127 "r,s",
8128 ),
8129 ("[1,2,3].with(1, 'x').join(',')", "1,x,3"),
8132 ("[1,2,3].with(-1, 'x').join(',')", "1,2,x"),
8133 (
8134 "try { [1,2,3].with(5, 'x'); 'no-throw' } catch(e) { 'threw' }",
8135 "threw",
8136 ),
8137 (
8142 "var e=document.getElementById('t'); e.style.setProperty('color','red'); e.style.color",
8143 "red",
8144 ),
8145 (
8146 "var e=document.getElementById('t'); e.style.setProperty('--my-var','10px'); e.style.getPropertyValue('--my-var')",
8147 "10px",
8148 ),
8149 (
8150 "var e=document.getElementById('t'); e.style.setProperty('color','blue'); e.style.removeProperty('color'); e.style.color",
8151 "",
8152 ),
8153 (
8156 "var e=document.getElementById('t'); e.style.setProperty('color','red','important'); e.style.getPropertyPriority('color')",
8157 "important",
8158 ),
8159 (
8162 "var e=document.getElementById('t'); e.style.setProperty('color','red','important'); e.style.color",
8163 "red",
8164 ),
8165 (
8166 "var e=document.getElementById('t'); e.style.setProperty('color','red'); e.style.getPropertyPriority('color')",
8167 "",
8168 ),
8169 (
8173 "var e=document.getElementById('t'); e.style.cssText='color: red; font-size: 12px'; e.style.length",
8174 "2",
8175 ),
8176 (
8177 "var e=document.getElementById('t'); e.style.cssText='color: red; font-size: 12px'; \
8178 e.style.item(0)+','+e.style.item(1)",
8179 "color,font-size",
8180 ),
8181 ("document.getElementById('t').style.length", "0"),
8182 (
8185 "var e=document.getElementById('t'); e.style.cssFloat='left'; e.style.float",
8186 "left",
8187 ),
8188 (
8189 "var e=document.getElementById('t'); e.style.float='right'; e.style.cssFloat",
8190 "right",
8191 ),
8192 (
8195 "var e=document.getElementById('t'); e.style.cssText='color: red; font-size: 12px'; e.style.color+','+e.style.fontSize",
8196 "red,12px",
8197 ),
8198 (
8199 "var e=document.getElementById('t'); e.style.color='blue'; e.style.fontSize='10px'; e.style.cssText",
8200 "color: blue; font-size: 10px",
8201 ),
8202 (
8205 "var e=document.getElementById('t'); e.innerHTML='<b>bold</b>text'; e.innerHTML",
8206 "<b>bold</b>text",
8207 ),
8208 (
8209 "var e=document.getElementById('t'); e.innerHTML='hi'; e.outerHTML",
8210 "<p id=\"t\" class=\"a b\" data-k=\"v\">hi</p>",
8211 ),
8212 (
8216 "var e=document.getElementById('t'); e.innerHTML='a<b>x</b>'; e.childNodes.length+','+e.firstChild.nodeType+','+e.lastChild.nodeType",
8217 "2,3,1",
8218 ),
8219 (
8220 "var e=document.getElementById('t'); e.innerHTML='a<b>x</b>'; e.firstChild.nextSibling.nodeName",
8221 "B",
8222 ),
8223 (
8226 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.nodeValue",
8227 "hello",
8228 ),
8229 (
8230 "var e=document.getElementById('t'); e.innerHTML='hello'; e.nodeValue === null",
8231 "true",
8232 ),
8233 (
8234 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.nodeValue='bye'; e.textContent",
8235 "bye",
8236 ),
8237 (
8242 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.data",
8243 "hello",
8244 ),
8245 (
8246 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.length",
8247 "5",
8248 ),
8249 (
8250 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.data='world'; e.textContent",
8251 "world",
8252 ),
8253 (
8254 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.appendData(' world'); e.textContent",
8255 "hello world",
8256 ),
8257 (
8258 "var e=document.getElementById('t'); e.innerHTML='hello world'; e.firstChild.deleteData(5,6); e.textContent",
8259 "hello",
8260 ),
8261 (
8262 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.insertData(5,' world'); e.textContent",
8263 "hello world",
8264 ),
8265 (
8266 "var e=document.getElementById('t'); e.innerHTML='hello world'; e.firstChild.replaceData(6,5,'there'); e.textContent",
8267 "hello there",
8268 ),
8269 (
8270 "var e=document.getElementById('t'); e.innerHTML='hello world'; e.firstChild.substringData(6,5)",
8271 "world",
8272 ),
8273 (
8279 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8280 try { e.firstChild.deleteData(99,1); 'no-throw' } catch(e) { e.name }",
8281 "IndexSizeError",
8282 ),
8283 (
8284 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8285 try { e.firstChild.insertData(99,'x'); 'no-throw' } catch(e) { e.name }",
8286 "IndexSizeError",
8287 ),
8288 (
8289 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8290 try { e.firstChild.replaceData(99,1,'x'); 'no-throw' } catch(e) { e.name }",
8291 "IndexSizeError",
8292 ),
8293 (
8294 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8295 try { e.firstChild.substringData(99,1); 'no-throw' } catch(e) { e.name }",
8296 "IndexSizeError",
8297 ),
8298 (
8299 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8300 try { e.firstChild.splitText(99); 'no-throw' } catch(e) { e.name }",
8301 "IndexSizeError",
8302 ),
8303 (
8304 "var e=document.getElementById('t'); e.innerHTML='hi'; \
8306 e.firstChild.insertData(2,'!'); e.textContent",
8307 "hi!",
8308 ),
8309 (
8313 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8314 var t1=e.firstChild; var t2=t1.splitText(5); t1.data+'|'+t2.data",
8315 "hello| world",
8316 ),
8317 (
8318 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8319 var t1=e.firstChild; t1.splitText(5); e.childNodes.length",
8320 "2",
8321 ),
8322 (
8323 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8324 var t1=e.firstChild; var t2=t1.splitText(5); t2.nextSibling===null && t2.previousSibling===t1",
8325 "true",
8326 ),
8327 (
8331 "var e=document.getElementById('t'); e.innerHTML='hello world'; \
8332 var t1=e.firstChild; var t2=t1.splitText(5); t1.wholeText+'|'+t2.wholeText",
8333 "hello world|hello world",
8334 ),
8335 (
8336 "var e=document.getElementById('t'); e.innerHTML='hello'; e.firstChild.wholeText",
8337 "hello",
8338 ),
8339 (
8343 "var t=document.createElement('table'); \
8344 t.insertRow(); t.insertRow(); t.rows.length",
8345 "2",
8346 ),
8347 (
8348 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); r.insertCell(); \
8349 r.cells.length",
8350 "2",
8351 ),
8352 (
8353 "var t=document.createElement('table'); \
8354 var r0=t.insertRow(); var r1=t.insertRow(); var rmid=t.insertRow(1); \
8355 rmid===t.rows[1]",
8356 "true",
8357 ),
8358 (
8359 "var t=document.createElement('table'); t.insertRow(); t.insertRow(); t.deleteRow(0); \
8360 t.rows.length",
8361 "1",
8362 ),
8363 (
8364 "var t=document.createElement('table'); var r=t.insertRow(); \
8365 r.insertCell(); var mid=r.insertCell(); r.insertCell(); \
8366 mid===r.cells[1]",
8367 "true",
8368 ),
8369 (
8370 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); r.insertCell(); \
8371 r.deleteCell(0); r.cells.length",
8372 "1",
8373 ),
8374 (
8375 "var t=document.createElement('table'); t.insertRow(); var r=t.insertRow(); r.rowIndex",
8376 "1",
8377 ),
8378 (
8379 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); var c=r.insertCell(); c.cellIndex",
8380 "1",
8381 ),
8382 (
8388 "var t=document.createElement('table'); t.insertRow(); \
8389 try { t.insertRow(5); 'no-throw' } catch(e) { e.name }",
8390 "IndexSizeError",
8391 ),
8392 (
8393 "var t=document.createElement('table'); t.insertRow(); \
8394 try { t.deleteRow(5); 'no-throw' } catch(e) { e.name }",
8395 "IndexSizeError",
8396 ),
8397 (
8398 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); \
8399 try { r.insertCell(5); 'no-throw' } catch(e) { e.name }",
8400 "IndexSizeError",
8401 ),
8402 (
8403 "var t=document.createElement('table'); var r=t.insertRow(); r.insertCell(); \
8404 try { r.deleteCell(5); 'no-throw' } catch(e) { e.name }",
8405 "IndexSizeError",
8406 ),
8407 (
8408 "var t=document.createElement('table'); t.insertRow(); \
8411 t.insertRow(1); t.insertRow(-1); t.rows.length",
8412 "3",
8413 ),
8414 (
8420 "var t=document.createElement('table'); \
8421 var h=t.createTHead(); h.insertRow(); h.insertRow(); \
8422 var b=document.createElement('tbody'); t.appendChild(b); \
8423 b.insertRow(); var r=b.insertRow(); b.insertRow(); \
8424 r.rowIndex + ',' + r.sectionRowIndex",
8425 "3,1",
8426 ),
8427 (
8432 "var t=document.createElement('table'); var b=document.createElement('tbody'); \
8433 t.appendChild(b); b.insertRow(); b.insertRow(); b.rows.length",
8434 "2",
8435 ),
8436 (
8439 "var t=document.createElement('table'); t.insertRow(); var r=t.insertRow(); \
8440 r.rowIndex + ',' + r.sectionRowIndex",
8441 "1,1",
8442 ),
8443 ("document.createElement('table').tHead", "null"),
8448 (
8449 "var t=document.createElement('table'); var h=t.createTHead(); h===t.tHead && h.tagName",
8450 "THEAD",
8451 ),
8452 (
8453 "var t=document.createElement('table'); var h1=t.createTHead(); var h2=t.createTHead(); h1===h2",
8454 "true",
8455 ),
8456 (
8457 "var t=document.createElement('table'); t.createTHead(); t.deleteTHead(); t.tHead",
8458 "null",
8459 ),
8460 (
8461 "var t=document.createElement('table'); var f=t.createTFoot(); f===t.tFoot && f.tagName",
8462 "TFOOT",
8463 ),
8464 (
8465 "var t=document.createElement('table'); var c=t.createCaption(); c===t.caption && c.tagName",
8466 "CAPTION",
8467 ),
8468 (
8469 "var t=document.createElement('table'); t.appendChild(document.createElement('tbody')); \
8470 t.appendChild(document.createElement('tbody')); t.tBodies.length",
8471 "2",
8472 ),
8473 (
8475 "document.createElement('div').isConnected",
8476 "false",
8477 ),
8478 (
8479 "document.getElementById('t').isConnected",
8480 "true",
8481 ),
8482 (
8483 "var e=document.getElementById('t'); e.remove(); e.isConnected",
8484 "false",
8485 ),
8486 (
8490 "document.createElement('div').nodeType === Node.ELEMENT_NODE",
8491 "true",
8492 ),
8493 ("Node.TEXT_NODE", "3"),
8494 ("Node.COMMENT_NODE", "8"),
8495 ("var c=document.createComment('test'); c.nodeType", "8"),
8496 ("var c=document.createComment('test'); c.nodeName", "#comment"),
8497 ("var c=document.createComment('test'); c.nodeValue", "test"),
8498 ("var c=document.createComment('test'); c.data", "test"),
8499 ("var c=document.createComment('test'); c.length", "4"),
8500 ("var c=document.createComment('test'); c.nodeValue='new'; c.nodeValue", "new"),
8501 ("var c=document.createComment('test'); c.data='new'; c.data", "new"),
8502 ("var c=document.createComment('test'); c.textContent", "test"),
8503 ("var c=document.createComment('test'); c.textContent='new'; c.textContent", "new"),
8504 (
8505 "var d=document.createElement('div'); var c=document.createComment('foo'); d.appendChild(c); d.innerHTML",
8506 "<!--foo-->",
8507 ),
8508 (
8509 "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",
8510 "1",
8511 ),
8512 (
8513 "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",
8514 "div { color: red; }",
8515 ),
8516 (
8517 "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",
8518 "div",
8519 ),
8520 (
8521 "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",
8522 "2",
8523 ),
8524 (
8525 "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",
8526 "span { color: blue; }",
8527 ),
8528 (
8529 "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",
8530 "1",
8531 ),
8532 (
8533 "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",
8534 "span { color: blue; }",
8535 ),
8536 ("document.title = 'Hello'; document.title", "Hello"),
8541 (
8544 "var e=document.createElement('p'); e.lang='ja'; e.lang",
8545 "ja",
8546 ),
8547 (
8548 "var e=document.createElement('p'); e.dir='rtl'; e.dir",
8549 "rtl",
8550 ),
8551 (
8552 "var e=document.createElement('p'); e.setAttribute('lang','fr'); e.lang",
8553 "fr",
8554 ),
8555 (
8560 "var e=document.createElement('p'); e.title='tip'; e.title",
8561 "tip",
8562 ),
8563 (
8564 "var e=document.createElement('p'); e.setAttribute('title','x'); e.title",
8565 "x",
8566 ),
8567 (
8568 "var e=document.createElement('p'); e.accessKey='k'; e.getAttribute('accesskey')",
8569 "k",
8570 ),
8571 ("document.createElement('p').translate", "true"),
8573 (
8574 "var e=document.createElement('p'); e.setAttribute('translate','no'); e.translate",
8575 "false",
8576 ),
8577 (
8578 "var e=document.createElement('p'); e.translate=false; e.getAttribute('translate')",
8579 "no",
8580 ),
8581 ("document.createElement('div').draggable", "false"),
8584 (
8585 "var e=document.createElement('div'); e.draggable=true; e.getAttribute('draggable')",
8586 "true",
8587 ),
8588 (
8589 "var e=document.createElement('div'); e.setAttribute('draggable','true'); e.draggable",
8590 "true",
8591 ),
8592 (
8595 "var e=document.createElement('div'); e.slot='header'; e.getAttribute('slot')",
8596 "header",
8597 ),
8598 (
8601 "document.createElement('div') instanceof HTMLDivElement",
8602 "true",
8603 ),
8604 (
8605 "document.createElement('div') instanceof HTMLElement",
8606 "true",
8607 ),
8608 (
8609 "document.createElement('div') instanceof Element",
8610 "true",
8611 ),
8612 (
8613 "document.createElement('div') instanceof Node",
8614 "true",
8615 ),
8616 (
8617 "document.createElement('div') instanceof HTMLInputElement",
8618 "false",
8619 ),
8620 (
8621 "document.createElement('input') instanceof HTMLInputElement",
8622 "true",
8623 ),
8624 (
8625 "document.createElement('input') instanceof HTMLElement",
8626 "true",
8627 ),
8628 (
8629 "document.createElement('form') instanceof HTMLFormElement",
8630 "true",
8631 ),
8632 (
8633 "document.createElement('div').constructor === HTMLDivElement",
8634 "true",
8635 ),
8636 (
8637 "try { new Node(); false; } catch(e) { e instanceof TypeError }",
8638 "true",
8639 ),
8640 (
8641 "try { new HTMLElement(); false; } catch(e) { e instanceof TypeError }",
8642 "true",
8643 ),
8644 (
8645 "var e=document.createElement('div'); e.setAttribute('slot','footer'); e.slot",
8646 "footer",
8647 ),
8648 (
8651 "document.createElement('div').tabIndex",
8652 "-1",
8653 ),
8654 (
8655 "var e=document.createElement('div'); e.tabIndex=3; e.tabIndex",
8656 "3",
8657 ),
8658 (
8659 "var e=document.createElement('div'); e.tabIndex=2; e.getAttribute('tabindex')",
8660 "2",
8661 ),
8662 (
8665 "var e=document.createElement('div'); e.hidden=true; e.hidden",
8666 "true",
8667 ),
8668 (
8669 "var e=document.createElement('div'); e.hidden=true; e.hasAttribute('hidden')",
8670 "true",
8671 ),
8672 (
8673 "var e=document.createElement('div'); e.hidden=true; e.hidden=false; e.hidden",
8674 "false",
8675 ),
8676 (
8679 "var f=document.createElement('form'); f.noValidate=true; f.noValidate",
8680 "true",
8681 ),
8682 (
8683 "var f=document.createElement('form'); f.noValidate=true; f.hasAttribute('novalidate')",
8684 "true",
8685 ),
8686 (
8687 "document.createElement('form').noValidate",
8688 "false",
8689 ),
8690 (
8693 "var f=document.createElement('form'); var i=document.createElement('input'); f.appendChild(i); f.elements.length",
8694 "1",
8695 ),
8696 (
8697 "var f=document.createElement('form'); var i=document.createElement('input'); i.name='x'; f.appendChild(i); f.elements[0].name",
8698 "x",
8699 ),
8700 (
8704 "var f=document.createElement('form'); var i=document.createElement('input'); \
8705 var s=document.createElement('select'); f.appendChild(i); f.appendChild(s); \
8706 f.length + ',' + f.elements.length",
8707 "2,2",
8708 ),
8709 (
8710 "document.createElement('form').length",
8711 "0",
8712 ),
8713 (
8717 "var fs=document.createElement('fieldset'); var i=document.createElement('input'); \
8718 fs.appendChild(i); fs.elements.length",
8719 "1",
8720 ),
8721 (
8722 "document.createElement('fieldset').elements.length",
8723 "0",
8724 ),
8725 ("document.createElement('fieldset').type", "fieldset"),
8729 (
8730 "var fs=document.createElement('fieldset'); fs.setAttribute('type','x'); fs.type",
8731 "fieldset",
8732 ),
8733 ("document.createElement('select').type", "select-one"),
8738 (
8739 "var s=document.createElement('select'); s.multiple=true; s.type",
8740 "select-multiple",
8741 ),
8742 ("document.createElement('button').type", "submit"),
8747 ("document.createElement('textarea').type", "textarea"),
8751 (
8752 "var b=document.createElement('button'); b.setAttribute('type','reset'); b.type",
8753 "reset",
8754 ),
8755 (
8756 "var b=document.createElement('button'); b.setAttribute('type','button'); b.type",
8757 "button",
8758 ),
8759 (
8760 "var b=document.createElement('button'); b.setAttribute('type','bogus'); b.type",
8761 "submit",
8762 ),
8763 ("document.createElement('input').type", "text"),
8769 (
8770 "var i=document.createElement('input'); i.setAttribute('type','checkbox'); i.type",
8771 "checkbox",
8772 ),
8773 (
8774 "var i=document.createElement('input'); i.setAttribute('type','DATE'); i.type",
8775 "date",
8776 ),
8777 (
8778 "var i=document.createElement('input'); i.setAttribute('type','bogus'); i.type",
8779 "text",
8780 ),
8781 (
8789 "var f=document.createElement('form'); f.id='ff'; var i=document.createElement('input'); f.appendChild(i); i.form.id",
8790 "ff",
8791 ),
8792 (
8793 "document.createElement('input').form === null",
8794 "true",
8795 ),
8796 (
8799 "var i=document.createElement('input'); i.id='u'; var l=document.createElement('label'); l.setAttribute('for','u'); i.labels.length",
8800 "1",
8801 ),
8802 (
8803 "var l=document.createElement('label'); var i=document.createElement('input'); l.appendChild(i); i.labels.length",
8804 "1",
8805 ),
8806 (
8807 "document.createElement('input').labels.length",
8808 "0",
8809 ),
8810 (
8812 "var i=document.createElement('input'); i.id='v'; var l=document.createElement('label'); l.setAttribute('for','v'); l.control.id",
8813 "v",
8814 ),
8815 (
8816 "var l=document.createElement('label'); var i=document.createElement('input'); i.name='y'; l.appendChild(i); l.control.name",
8817 "y",
8818 ),
8819 (
8820 "document.createElement('label').control === null",
8821 "true",
8822 ),
8823 (
8826 "var w=document.getElementById('wrap'); var t=document.getElementById('t'); w.contains(t)+','+t.contains(w)+','+t.contains(t)",
8827 "true,false,true",
8828 ),
8829 (
8832 "var t=document.getElementById('t'); t.compareDocumentPosition(t)",
8833 "0",
8834 ),
8835 (
8836 "var w=document.getElementById('wrap'); var t=document.getElementById('t'); t.compareDocumentPosition(w)",
8837 "10",
8838 ),
8839 (
8840 "var w=document.getElementById('wrap'); var t=document.getElementById('t'); w.compareDocumentPosition(t)",
8841 "20",
8842 ),
8843 (
8844 "var t=document.getElementById('t'); var s=document.getElementById('s'); t.compareDocumentPosition(s)",
8845 "4",
8846 ),
8847 (
8848 "var t=document.getElementById('t'); var s=document.getElementById('s'); s.compareDocumentPosition(t)",
8849 "2",
8850 ),
8851 (
8855 "var e=document.getElementById('t'); var clicked=false; e.addEventListener('click', function(){ clicked=true; }); e.click(); clicked",
8856 "true",
8857 ),
8858 ("document.scrollingElement.tagName", "HTML"),
8861 ("document.scrollingElement === document.documentElement", "true"),
8862 (
8866 "document.getElementById('t').focus(); document.activeElement.id",
8867 "t",
8868 ),
8869 (
8870 "document.getElementById('t').focus(); document.getElementById('t') === document.activeElement",
8871 "true",
8872 ),
8873 (
8874 "document.getElementById('t').focus(); document.getElementById('s').focus(); document.activeElement.id",
8875 "s",
8876 ),
8877 (
8878 "document.getElementById('t').focus(); document.getElementById('t').blur(); \
8879 document.getElementById('t') === document.activeElement",
8880 "false",
8881 ),
8882 (
8883 "var log=''; document.getElementById('t').addEventListener('focus', ()=>log+='f'); \
8884 document.getElementById('t').addEventListener('blur', ()=>log+='b'); \
8885 document.getElementById('t').focus(); document.getElementById('s').focus(); log",
8886 "fb",
8887 ),
8888 (
8889 "var n=0; document.getElementById('t').addEventListener('focus', ()=>n++); \
8890 document.getElementById('t').focus(); document.getElementById('t').focus(); n",
8891 "1",
8892 ),
8893 ];
8894 for (src, expect) in dom2_cases {
8895 let mut rt = JsRuntime::new();
8896 rt.dom
8897 .borrow_mut()
8898 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
8899 match rt.eval(src) {
8900 Ok(v) if &v.to_js_string() == expect => passed += 1,
8901 Ok(v) => crate::println!(
8902 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
8903 src,
8904 v.to_js_string(),
8905 expect
8906 ),
8907 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
8908 }
8909 }
8910 let ev_html = "<div id='outer'><div id='mid'><button id='btn'>go</button></div></div>";
8917 let event_cases: &[(&str, &str)] = &[
8918 ("var n=0; var b=document.getElementById('btn'); b.addEventListener('click', function(){ n++; }); b.dispatchEvent({type:'click'}); n", "1"),
8920 ("var s=''; var b=document.getElementById('btn'); b.addEventListener('click', ()=>s+='a'); b.addEventListener('click', ()=>s+='b'); b.dispatchEvent({type:'click'}); s", "ab"),
8922 ("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"),
8924 ("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"),
8926 ("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"),
8928 ("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"),
8930 ("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"),
8932 ("var b=document.getElementById('btn'); b.addEventListener('click', e=>e.preventDefault()); b.dispatchEvent({type:'click'})", "false"),
8934 ("var b=document.getElementById('btn'); b.addEventListener('click', ()=>{}); b.dispatchEvent({type:'click'})", "true"),
8936 ("var d=false; var b=document.getElementById('btn'); b.addEventListener('click', function(e){ e.preventDefault(); d=e.defaultPrevented; }); b.dispatchEvent({type:'click'}); d", "true"),
8938 ("var n=0; var b=document.getElementById('btn'); b.addEventListener('click', ()=>n++, {once:true}); b.dispatchEvent({type:'click'}); b.dispatchEvent({type:'click'}); n", "1"),
8940 ("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"),
8942 ("var ty=''; var b=document.getElementById('btn'); b.addEventListener('custom', function(e){ ty=e.type; }); b.dispatchEvent({type:'custom'}); ty", "custom"),
8944 ("var d=0; var b=document.getElementById('btn'); b.addEventListener('ping', function(e){ d=e.detail; }); b.dispatchEvent({type:'ping', detail:7}); d", "7"),
8946 ("var n=0; var b=document.getElementById('btn'); b.addEventListener('mouseover', ()=>n++); b.dispatchEvent({type:'click'}); n", "0"),
8948 ("var s=''; document.getElementById('outer').addEventListener('foo', ()=>s+='O'); document.getElementById('btn').addEventListener('foo', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'foo'}); s", "BO"),
8951 ("var s=''; document.addEventListener('click', ()=>s+='D'); document.getElementById('btn').addEventListener('click', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "BD"),
8957 ("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"),
8959 ("var n=0; var f=()=>n++; document.addEventListener('click', f); document.removeEventListener('click', f); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); n", "0"),
8961 ("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"),
8963 ("var n=0; document.addEventListener('click', ()=>n++); document.dispatchEvent(new Event('click')); n", "1"),
8966 ("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"),
8975 ("var s=''; document.addEventListener('click', ()=>s+='C', true); document.addEventListener('click', ()=>s+='B'); document.getElementById('btn').dispatchEvent({type:'click', bubbles:true}); s", "CB"),
8977 ];
8978 let event_total = event_cases.len();
8979 for (src, expect) in event_cases {
8980 let mut rt = JsRuntime::new();
8981 rt.dom
8982 .borrow_mut()
8983 .build_from(&crate::os_lib::dom::parse_html(ev_html));
8984 match rt.eval(src) {
8985 Ok(v) if &v.to_js_string() == expect => passed += 1,
8986 Ok(v) => crate::println!(
8987 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
8988 src,
8989 v.to_js_string(),
8990 expect
8991 ),
8992 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
8993 }
8994 }
8995
8996 let fd_form_total = 4;
8998 {
8999 let fd_html = "<form id='f'>\
9000 <input name='user' value='alice'>\
9001 <input name='nope'>\
9002 <input type='checkbox' name='agree' value='yes' checked>\
9003 <input type='checkbox' name='news' value='1'>\
9004 <input type='radio' name='plan' value='free'>\
9005 <input type='radio' name='plan' value='pro' checked>\
9006 <input type='submit' name='btn' value='go'>\
9007 <select name='color' value='green'><option value='red'>R</option><option value='green'>G</option></select>\
9008 <textarea name='bio'>hello</textarea>\
9009 </form>";
9010 let fd_cases: &[(&str, &str)] = &[
9011 (
9014 "new FormData(document.getElementById('f')).get('user')",
9015 "alice",
9016 ),
9017 (
9018 "new FormData(document.getElementById('f')).get('agree')",
9019 "yes",
9020 ),
9021 (
9022 "new FormData(document.getElementById('f')).get('plan')",
9023 "pro",
9024 ),
9025 (
9026 "var f=new FormData(document.getElementById('f')); f.has('news')+','+f.has('btn')",
9027 "false,false",
9028 ),
9029 ];
9030 for (src, expect) in fd_cases {
9031 let mut rt = JsRuntime::new();
9032 rt.dom
9033 .borrow_mut()
9034 .build_from(&crate::os_lib::dom::parse_html(fd_html));
9035 match rt.eval(src) {
9036 Ok(v) if &v.to_js_string() == expect => passed += 1,
9037 Ok(v) => crate::println!(
9038 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9039 src,
9040 v.to_js_string(),
9041 expect
9042 ),
9043 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9044 }
9045 }
9046 }
9047 let fd2_form_total = 5;
9048 {
9049 let fd2_html = "<form id='f6'>\
9055 <input name='inside' value='a'>\
9056 <fieldset disabled><input name='hidden_by_fieldset' value='b'></fieldset>\
9057 </form>\
9058 <input name='outside' form='f6' value='c'>\
9059 <input name='not_associated' value='d'>";
9060 let fd2_cases: &[(&str, &str)] = &[
9061 (
9062 "new FormData(document.getElementById('f6')).get('inside')",
9063 "a",
9064 ),
9065 (
9066 "new FormData(document.getElementById('f6')).get('outside')",
9067 "c",
9068 ),
9069 (
9070 "var f=new FormData(document.getElementById('f6')); f.has('hidden_by_fieldset')",
9071 "false",
9072 ),
9073 (
9074 "var f=new FormData(document.getElementById('f6')); f.has('not_associated')",
9075 "false",
9076 ),
9077 (
9081 "document.getElementById('f6').elements.length",
9082 "3",
9083 ),
9084 ];
9085 for (src, expect) in fd2_cases {
9086 let mut rt = JsRuntime::new();
9087 rt.dom
9088 .borrow_mut()
9089 .build_from(&crate::os_lib::dom::parse_html(fd2_html));
9090 match rt.eval(src) {
9091 Ok(v) if &v.to_js_string() == expect => passed += 1,
9092 Ok(v) => crate::println!(
9093 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9094 src,
9095 v.to_js_string(),
9096 expect
9097 ),
9098 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9099 }
9100 }
9101 }
9102 let select_multiple_total = 8;
9106 {
9107 let sm_html = "<form id='f2'>\
9108 <select name='tags' multiple>\
9109 <option value='a' selected>A</option>\
9110 <option value='b'>B</option>\
9111 <option value='c' selected>C</option>\
9112 </select>\
9113 </form>";
9114 let sm_cases: &[(&str, &str)] = &[
9115 (
9116 "new FormData(document.getElementById('f2')).getAll('tags').join(',')",
9117 "a,c",
9118 ),
9119 (
9120 "document.querySelector('select').selectedOptions.length",
9121 "2",
9122 ),
9123 (
9124 "Array.from(document.querySelector('select').selectedOptions).map(o => o.value).join(',')",
9125 "a,c",
9126 ),
9127 (
9130 "document.querySelector('select').options.length",
9131 "3",
9132 ),
9133 (
9134 "Array.from(document.querySelector('select').options).map(o => o.value).join(',')",
9135 "a,b,c",
9136 ),
9137 (
9140 "var s=document.querySelector('select'); \
9141 var o=new Option('D','d'); o.id='optd'; s.options.add(o); \
9142 s.options.length + ':' + s.options[3].value",
9143 "4:d",
9144 ),
9145 (
9146 "var s=document.querySelector('select'); s.options.remove(1); \
9147 Array.from(s.options).map(o => o.value).join(',')",
9148 "a,c",
9149 ),
9150 (
9151 "document.querySelector('select').options.namedItem('nope')",
9152 "null",
9153 ),
9154 (
9155 "var s=document.querySelector('select'); s.options.item(0).value",
9156 "a",
9157 ),
9158 (
9159 "var s=document.querySelector('select'); s.options.selectedIndex=1; s.selectedIndex",
9160 "1",
9161 ),
9162 (
9163 "var s=document.querySelector('select'); s.selectedIndex=2; s.options.selectedIndex",
9164 "2",
9165 ),
9166 ];
9167 for (src, expect) in sm_cases {
9168 let mut rt = JsRuntime::new();
9169 rt.dom
9170 .borrow_mut()
9171 .build_from(&crate::os_lib::dom::parse_html(sm_html));
9172 match rt.eval(src) {
9173 Ok(v) if &v.to_js_string() == expect => passed += 1,
9174 Ok(v) => crate::println!(
9175 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9176 src,
9177 v.to_js_string(),
9178 expect
9179 ),
9180 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9181 }
9182 }
9183 }
9184 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>";
9195 let og_cases: &[(&str, &str)] = &[
9196 (
9197 "document.querySelector('select').options.length",
9198 "3",
9199 ),
9200 (
9201 "Array.from(document.querySelector('select').options).map(o => o.value).join(',')",
9202 "lemon,lime,straw",
9203 ),
9204 (
9205 "document.querySelector('select').selectedOptions.length",
9206 "1",
9207 ),
9208 (
9209 "document.querySelector('select').value",
9210 "lime",
9211 ),
9212 ];
9213 let optgroup_total = og_cases.len();
9214 {
9215 for (src, expect) in og_cases {
9216 let mut rt = JsRuntime::new();
9217 rt.dom
9218 .borrow_mut()
9219 .build_from(&crate::os_lib::dom::parse_html(og_html));
9220 match rt.eval(src) {
9221 Ok(v) if &v.to_js_string() == expect => passed += 1,
9222 Ok(v) => crate::println!(
9223 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9224 src,
9225 v.to_js_string(),
9226 expect
9227 ),
9228 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9229 }
9230 }
9231 }
9232 let doc_title_total = 3;
9235 {
9236 let title_cases: &[(&str, &str, &str)] = &[
9237 (
9239 "<html><head><title>old</title></head><body></body></html>",
9240 "document.title",
9241 "old",
9242 ),
9243 (
9244 "<html><head><title>old</title></head><body></body></html>",
9245 "document.title='new'; document.querySelector('title').textContent",
9246 "new",
9247 ),
9248 (
9250 "<html><head></head><body></body></html>",
9251 "document.title='created'; document.querySelector('title').textContent",
9252 "created",
9253 ),
9254 ];
9255 for (html, src, expect) in title_cases {
9256 let mut rt = JsRuntime::new();
9257 rt.dom
9258 .borrow_mut()
9259 .build_from(&crate::os_lib::dom::parse_html(html));
9260 match rt.eval(src) {
9261 Ok(v) if &v.to_js_string() == expect => passed += 1,
9262 Ok(v) => crate::println!(
9263 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9264 src,
9265 v.to_js_string(),
9266 expect
9267 ),
9268 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9269 }
9270 }
9271 }
9272 let doc_collections_total = 8;
9275 {
9276 let coll_html = "<html><body>\
9277 <form id='f1'></form><form id='f2'></form>\
9278 <img src='a.png'><img src='b.png'><img src='c.png'>\
9279 <script>1</script>\
9280 <a href='x.html'>x</a><a name='top'>anchor</a>\
9281 <area href='y.html' alt='y'>\
9282 <embed src='z.swf'>\
9283 </body></html>";
9284 let coll_cases: &[(&str, &str)] = &[
9285 ("document.forms.length", "2"),
9286 ("document.images.length", "3"),
9287 ("document.scripts.length", "1"),
9288 ("document.links.length", "2"),
9291 ("document.anchors.length", "1"),
9293 ("document.embeds.length", "1"),
9297 ("document.plugins.length", "1"),
9298 ("document.applets.length", "0"),
9299 ];
9300 for (src, expect) in coll_cases {
9301 let mut rt = JsRuntime::new();
9302 rt.dom
9303 .borrow_mut()
9304 .build_from(&crate::os_lib::dom::parse_html(coll_html));
9305 match rt.eval(src) {
9306 Ok(v) if &v.to_js_string() == expect => passed += 1,
9307 Ok(v) => crate::println!(
9308 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9309 src,
9310 v.to_js_string(),
9311 expect
9312 ),
9313 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9314 }
9315 }
9316 }
9317 let rect_total = 15;
9319 {
9320 let rect_checks: &[(&str, &str)] = &[
9321 (
9322 "document.getElementById('t').getBoundingClientRect().width",
9323 "30",
9324 ),
9325 (
9326 "document.getElementById('t').getBoundingClientRect().height",
9327 "40",
9328 ),
9329 (
9330 "document.getElementById('t').getBoundingClientRect().left",
9331 "10",
9332 ),
9333 (
9334 "document.getElementById('t').getBoundingClientRect().bottom",
9335 "60",
9336 ),
9337 ("document.getElementById('t').offsetWidth", "30"),
9338 ("document.getElementById('t').offsetTop", "20"),
9339 ("document.getElementById('t').clientWidth", "22"),
9341 ("document.getElementById('t').clientHeight", "34"),
9343 ("document.getElementById('t').clientLeft", "5"),
9345 ("document.getElementById('t').clientTop", "2"),
9347 ("document.getElementById('t').getClientRects().length", "1"),
9351 (
9352 "document.getElementById('t').getClientRects()[0].width",
9353 "30",
9354 ),
9355 ("document.getElementById('s').getClientRects().length", "0"),
9357 (
9360 "document.getElementById('t').offsetParent",
9361 "null",
9362 ),
9363 (
9364 "document.getElementById('wrap').style.position='relative'; \
9365 document.getElementById('t').offsetParent.id",
9366 "wrap",
9367 ),
9368 ];
9369 for (src, expect) in rect_checks {
9370 let mut rt = JsRuntime::new();
9371 rt.dom
9372 .borrow_mut()
9373 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9374 let idx = rt.dom.borrow().get_element_by_id("t");
9376 if let Some(i) = idx {
9377 rt.dom.borrow_mut().set_rect(i, 10, 20, 30, 40);
9378 rt.dom.borrow_mut().set_border_widths(i, 2, 3, 4, 5); }
9380 match rt.eval(src) {
9381 Ok(v) if &v.to_js_string() == expect => passed += 1,
9382 Ok(v) => crate::println!(
9383 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9384 src,
9385 v.to_js_string(),
9386 expect
9387 ),
9388 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9389 }
9390 }
9391 }
9392
9393 let point_test_total = 4;
9397 {
9398 let point_checks: &[(&str, &str)] = &[
9399 ("document.elementFromPoint(20, 15).id", "t"),
9400 ("document.elementFromPoint(5, 5).id", "wrap"),
9401 ("document.elementFromPoint(500, 500)", "null"),
9402 (
9403 "document.elementsFromPoint(20, 15).map(e => e.id).join(',')",
9404 "t,wrap",
9405 ),
9406 ];
9407 for (src, expect) in point_checks {
9408 let mut rt = JsRuntime::new();
9409 rt.dom
9410 .borrow_mut()
9411 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9412 let wrap_idx = rt.dom.borrow().get_element_by_id("wrap");
9415 if let Some(i) = wrap_idx {
9416 rt.dom.borrow_mut().set_rect(i, 0, 0, 100, 100);
9417 }
9418 let t_idx = rt.dom.borrow().get_element_by_id("t");
9419 if let Some(i) = t_idx {
9420 rt.dom.borrow_mut().set_rect(i, 10, 10, 30, 20);
9421 }
9422 match rt.eval(src) {
9423 Ok(v) if &v.to_js_string() == expect => passed += 1,
9424 Ok(v) => crate::println!(
9425 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9426 src,
9427 v.to_js_string(),
9428 expect
9429 ),
9430 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9431 }
9432 }
9433 }
9434
9435 let computed_total = 4;
9437 {
9438 let cs_checks: &[(&str, &str)] = &[
9439 ("getComputedStyle(document.getElementById('t')).color", "red"),
9440 ("getComputedStyle(document.getElementById('t')).backgroundColor", "blue"),
9441 ("getComputedStyle(document.getElementById('t')).getPropertyValue('background-color')", "blue"),
9442 ("window.getComputedStyle(document.getElementById('t')).fontSize", "16px"),
9443 ];
9444 for (src, expect) in cs_checks {
9445 let mut rt = JsRuntime::new();
9446 rt.dom
9447 .borrow_mut()
9448 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9449 let idx = rt.dom.borrow().get_element_by_id("t");
9450 if let Some(i) = idx {
9451 let mut d = rt.dom.borrow_mut();
9452 d.set_computed_style(i, "color", "red");
9453 d.set_computed_style(i, "background-color", "blue");
9454 d.set_computed_style(i, "font-size", "16px");
9455 }
9456 match rt.eval(src) {
9457 Ok(v) if &v.to_js_string() == expect => passed += 1,
9458 Ok(v) => crate::println!(
9459 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9460 src,
9461 v.to_js_string(),
9462 expect
9463 ),
9464 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9465 }
9466 }
9467 }
9468
9469 let check_visibility_total = 4;
9471 {
9472 let cv_checks: &[(&str, &str, &[(&str, &str, &str)])] = &[
9473 (
9474 "document.getElementById('t').checkVisibility()",
9475 "true",
9476 &[],
9477 ),
9478 (
9479 "document.getElementById('t').checkVisibility()",
9480 "false",
9481 &[("t", "display", "none")],
9482 ),
9483 (
9484 "document.getElementById('t').checkVisibility()",
9485 "false",
9486 &[("wrap", "display", "none")],
9487 ),
9488 (
9489 "document.getElementById('t').checkVisibility()",
9490 "false",
9491 &[("t", "visibility", "hidden")],
9492 ),
9493 ];
9494 for (src, expect, styles) in cv_checks {
9495 let mut rt = JsRuntime::new();
9496 rt.dom
9497 .borrow_mut()
9498 .build_from(&crate::os_lib::dom::parse_html(dom2_html));
9499 for (id, prop, val) in *styles {
9500 let idx = rt.dom.borrow().get_element_by_id(id);
9501 if let Some(i) = idx {
9502 rt.dom.borrow_mut().set_computed_style(i, prop, val);
9503 }
9504 }
9505 match rt.eval(src) {
9506 Ok(v) if &v.to_js_string() == expect => passed += 1,
9507 Ok(v) => crate::println!(
9508 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
9509 src,
9510 v.to_js_string(),
9511 expect
9512 ),
9513 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
9514 }
9515 }
9516 }
9517
9518 {
9520 let mut rt = JsRuntime::new();
9521 rt.dom
9522 .borrow_mut()
9523 .build_from(&crate::os_lib::dom::parse_html(dom_html));
9524 let _ = rt.eval("var clicks=0; document.getElementById('b').addEventListener('click', () => { clicks++; document.getElementById('out').textContent = 'clicked ' + clicks; });");
9525 let bidx = rt.dom.borrow().get_element_by_id("b");
9526 if let Some(i) = bidx {
9527 rt.dispatch_click(i);
9528 rt.dispatch_click(i);
9529 }
9530 match rt.eval("clicks + ':' + document.getElementById('out').textContent") {
9531 Ok(v) if v.to_js_string() == "2:clicked 2" => passed += 1,
9532 Ok(v) => crate::println!(
9533 "JS_SELFTEST FAIL: click dispatch => `{}` (want `2:clicked 2`)",
9534 v.to_js_string()
9535 ),
9536 Err(e) => crate::println!("JS_SELFTEST ERR: click dispatch => {}", e),
9537 }
9538 }
9539
9540 let event_html = "<div id='par'><button id='btn'>go</button></div>";
9542 let event_checks: &[(&str, &str, &str)] = &[
9543 ("var L=''; document.getElementById('par').addEventListener('click', function(e){ L += 'par('+e.target.id+','+e.currentTarget.id+')'; });",
9545 "L", "par(btn,par)"),
9546 ("var L=''; document.getElementById('btn').addEventListener('click', function(){ L+='btn'; }); document.getElementById('par').addEventListener('click', function(){ L+='-par'; });",
9548 "L", "btn-par"),
9549 ("var L=''; document.getElementById('btn').addEventListener('click', function(e){ L+='btn'; e.stopPropagation(); }); document.getElementById('par').addEventListener('click', function(){ L+='-par'; });",
9551 "L", "btn"),
9552 ("var L=''; document.getElementById('btn').addEventListener('click', function(e){ e.preventDefault(); L += e.defaultPrevented; });",
9554 "L", "true"),
9555 ("var L=''; document.getElementById('btn').addEventListener('click', function(e){ L+='1'; e.stopImmediatePropagation(); }); document.getElementById('btn').addEventListener('click', function(){ L+='2'; });",
9557 "L", "1"),
9558 ("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'; });",
9560 "L", "cap-tgt-bub"),
9561 ("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; });",
9563 "P", "123"),
9564 ("var N=0; document.getElementById('btn').addEventListener('click', function(){ N++; }, {once:true}); N",
9566 "N", "1"),
9567 ("var L=''; function h(){ L+='x'; } document.getElementById('btn').addEventListener('click', h); document.getElementById('btn').removeEventListener('click', h);",
9569 "L", ""),
9570 ("var C=''; document.getElementById('btn').addEventListener('click', function(e){ var p=e.composedPath(); C=p[0].id+','+p[1].id; });",
9572 "C", "btn,par"),
9573 ];
9574 for (setup, read, expect) in event_checks {
9575 let mut rt = JsRuntime::new();
9576 rt.dom
9577 .borrow_mut()
9578 .build_from(&crate::os_lib::dom::parse_html(event_html));
9579 let _ = rt.eval(setup);
9580 let bidx = rt.dom.borrow().get_element_by_id("btn");
9581 if let Some(i) = bidx {
9582 rt.dispatch_click(i);
9583 }
9584 match rt.eval(read) {
9585 Ok(v) if &v.to_js_string() == expect => passed += 1,
9586 Ok(v) => crate::println!(
9587 "JS_SELFTEST FAIL: event `{}` => `{}` (want `{}`)",
9588 read,
9589 v.to_js_string(),
9590 expect
9591 ),
9592 Err(e) => crate::println!("JS_SELFTEST ERR: event `{}` => {}", read, e),
9593 }
9594 }
9595
9596 {
9601 let mut rt = JsRuntime::new();
9602 rt.dom
9603 .borrow_mut()
9604 .build_from(&crate::os_lib::dom::parse_html(event_html));
9605 let _ = rt.eval(
9606 "var L=''; \
9607 document.getElementById('btn').addEventListener('foo', function(e){ L+='btn:'+e.type; }); \
9608 document.getElementById('par').addEventListener('foo', function(){ L+='-par'; }); \
9609 document.getElementById('btn').dispatchEvent(new Event('foo', {bubbles:true}));",
9610 );
9611 match rt.eval("L") {
9612 Ok(v) if v.to_js_string() == "btn:foo-par" => passed += 1,
9613 Ok(v) => crate::println!(
9614 "JS_SELFTEST FAIL: dispatchEvent => `{}` (want `btn:foo-par`)",
9615 v.to_js_string()
9616 ),
9617 Err(e) => crate::println!("JS_SELFTEST ERR: dispatchEvent => {}", e),
9618 }
9619 }
9620
9621 {
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'));",
9633 );
9634 match rt.eval("L") {
9635 Ok(v) if v.to_js_string() == "btn:foo" => passed += 1,
9636 Ok(v) => crate::println!(
9637 "JS_SELFTEST FAIL: dispatchEvent non-bubbling => `{}` (want `btn:foo`)",
9638 v.to_js_string()
9639 ),
9640 Err(e) => crate::println!("JS_SELFTEST ERR: dispatchEvent non-bubbling => {}", e),
9641 }
9642 }
9643
9644 {
9647 let mut rt = JsRuntime::new();
9648 rt.dom
9649 .borrow_mut()
9650 .build_from(&crate::os_lib::dom::parse_html(event_html));
9651 let _ = rt.eval(
9652 "var L=''; \
9653 document.getElementById('btn').addEventListener('foo', function(e){ L+='btn:'+e.type; }); \
9654 document.getElementById('par').addEventListener('foo', function(){ L+='-par'; }); \
9655 document.getElementById('btn').dispatchEvent(new CustomEvent('foo', {bubbles:true}));",
9656 );
9657 match rt.eval("L") {
9658 Ok(v) if v.to_js_string() == "btn:foo-par" => passed += 1,
9659 Ok(v) => crate::println!(
9660 "JS_SELFTEST FAIL: CustomEvent bubbles => `{}` (want `btn:foo-par`)",
9661 v.to_js_string()
9662 ),
9663 Err(e) => crate::println!("JS_SELFTEST ERR: CustomEvent bubbles => {}", e),
9664 }
9665 }
9666
9667 {
9669 let mut rt = JsRuntime::new();
9670 rt.dom
9671 .borrow_mut()
9672 .build_from(&crate::os_lib::dom::parse_html(event_html));
9673 let _ = rt.eval(
9674 "var N=0; document.getElementById('btn').addEventListener('foo', function(){ N++; }, {once:true}); \
9675 document.getElementById('btn').dispatchEvent(new Event('foo')); \
9676 document.getElementById('btn').dispatchEvent(new Event('foo')); \
9677 document.getElementById('btn').dispatchEvent(new Event('foo'));",
9678 );
9679 match rt.eval("N") {
9680 Ok(v) if v.to_js_string() == "1" => passed += 1,
9681 Ok(v) => crate::println!(
9682 "JS_SELFTEST FAIL: once dispatch => `{}` (want `1`)",
9683 v.to_js_string()
9684 ),
9685 Err(e) => crate::println!("JS_SELFTEST ERR: once dispatch => {}", e),
9686 }
9687 }
9688
9689 {
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 "document.getElementById('btn').addEventListener('foo', function(e){ e.preventDefault(); }); \
9701 var R = document.getElementById('btn').dispatchEvent(new Event('foo', {cancelable:true}));",
9702 );
9703 match rt.eval("R") {
9704 Ok(v) if v.to_js_string() == "false" => passed += 1,
9705 Ok(v) => crate::println!(
9706 "JS_SELFTEST FAIL: dispatchEvent return => `{}` (want `false`)",
9707 v.to_js_string()
9708 ),
9709 Err(e) => crate::println!("JS_SELFTEST ERR: dispatchEvent return => {}", e),
9710 }
9711 }
9712
9713 let change_html = "<form><input id='cb' type='checkbox'><select id='sel'><option value='a'>A</option><option value='b'>B</option></select></form>";
9716 let mut change_passed = 0usize;
9717 {
9718 let mut rt = JsRuntime::new();
9719 rt.dom
9720 .borrow_mut()
9721 .build_from(&crate::os_lib::dom::parse_html(change_html));
9722 let _ = rt.eval("var c=0; document.getElementById('cb').addEventListener('change', function(){ c++; });");
9723 let cidx = rt.dom.borrow().get_element_by_id("cb");
9724 if let Some(i) = cidx {
9725 rt.dispatch_event(i, "change");
9726 rt.dispatch_event(i, "change");
9727 }
9728 match rt.eval("c") {
9729 Ok(v) if v.to_js_string() == "2" => change_passed += 1,
9730 Ok(v) => crate::println!(
9731 "JS_SELFTEST FAIL: change count => `{}` (want `2`)",
9732 v.to_js_string()
9733 ),
9734 Err(e) => crate::println!("JS_SELFTEST ERR: change count => {}", e),
9735 }
9736 }
9737 {
9738 let mut rt = JsRuntime::new();
9740 rt.dom
9741 .borrow_mut()
9742 .build_from(&crate::os_lib::dom::parse_html(change_html));
9743 let _ = rt.eval("var t=''; document.getElementById('sel').addEventListener('change', function(e){ t=e.target.id; });");
9744 let sidx = rt.dom.borrow().get_element_by_id("sel");
9745 if let Some(i) = sidx {
9746 rt.dispatch_event(i, "change");
9747 }
9748 match rt.eval("t") {
9749 Ok(v) if v.to_js_string() == "sel" => change_passed += 1,
9750 Ok(v) => crate::println!(
9751 "JS_SELFTEST FAIL: change target => `{}` (want `sel`)",
9752 v.to_js_string()
9753 ),
9754 Err(e) => crate::println!("JS_SELFTEST ERR: change target => {}", e),
9755 }
9756 }
9757 passed += change_passed;
9758
9759 let key_event_total = 13;
9760 {
9761 let kev_html = "<div id='par'><input id='inp'></div>";
9762 {
9764 let mut rt = JsRuntime::new();
9765 rt.dom
9766 .borrow_mut()
9767 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9768 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('keydown', function(e){ L = e.type + ':' + e.key; });");
9769 let idx = rt.dom.borrow().get_element_by_id("inp");
9770 if let Some(i) = idx {
9771 rt.dispatch_key(i, "keydown", "x");
9772 }
9773 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "keydown:x" {
9774 passed += 1;
9775 } else {
9776 crate::println!("JS_SELFTEST FAIL: keydown e.key");
9777 }
9778 }
9779 {
9781 let mut rt = JsRuntime::new();
9782 rt.dom
9783 .borrow_mut()
9784 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9785 let _ = rt.eval("var L=''; document.getElementById('par').addEventListener('keydown', function(e){ L = 'par:' + e.target.id; });");
9786 let idx = rt.dom.borrow().get_element_by_id("inp");
9787 if let Some(i) = idx {
9788 rt.dispatch_key(i, "keydown", "a");
9789 }
9790 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "par:inp" {
9791 passed += 1;
9792 } else {
9793 crate::println!("JS_SELFTEST FAIL: keydown bubbling");
9794 }
9795 }
9796 {
9798 let mut rt = JsRuntime::new();
9799 rt.dom
9800 .borrow_mut()
9801 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9802 let _ = rt.eval("document.getElementById('inp').addEventListener('keydown', function(e){ e.preventDefault(); });");
9803 let idx = rt.dom.borrow().get_element_by_id("inp");
9804 let prevented = idx
9805 .map(|i| rt.dispatch_key(i, "keydown", "a").1)
9806 .unwrap_or(false);
9807 if prevented {
9808 passed += 1;
9809 } else {
9810 crate::println!("JS_SELFTEST FAIL: keydown preventDefault");
9811 }
9812 }
9813 {
9815 let mut rt = JsRuntime::new();
9816 rt.dom
9817 .borrow_mut()
9818 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9819 let _ = rt.eval("var N=0; document.getElementById('inp').addEventListener('input', function(){ N++; });");
9820 let idx = rt.dom.borrow().get_element_by_id("inp");
9821 if let Some(i) = idx {
9822 rt.dispatch_event(i, "input");
9823 }
9824 if rt.eval("N").map(|v| v.to_js_string()).unwrap_or_default() == "1" {
9825 passed += 1;
9826 } else {
9827 crate::println!("JS_SELFTEST FAIL: input event");
9828 }
9829 }
9830 {
9832 let mut rt = JsRuntime::new();
9833 rt.dom
9834 .borrow_mut()
9835 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9836 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('focus', function(e){ L = e.type; });");
9837 let idx = rt.dom.borrow().get_element_by_id("inp");
9838 if let Some(i) = idx {
9839 rt.dispatch_event(i, "focus");
9840 }
9841 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "focus" {
9842 passed += 1;
9843 } else {
9844 crate::println!("JS_SELFTEST FAIL: focus event");
9845 }
9846 }
9847 {
9849 let mut rt = JsRuntime::new();
9850 rt.dom
9851 .borrow_mut()
9852 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9853 let _ = rt.eval("var L=''; document.getElementById('par').addEventListener('blur', function(e){ L = 'blur:' + e.target.id; });");
9854 let idx = rt.dom.borrow().get_element_by_id("inp");
9855 if let Some(i) = idx {
9856 rt.dispatch_event(i, "blur");
9857 }
9858 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "blur:inp" {
9859 passed += 1;
9860 } else {
9861 crate::println!("JS_SELFTEST FAIL: blur bubbling");
9862 }
9863 }
9864 {
9866 let mut rt = JsRuntime::new();
9867 rt.dom
9868 .borrow_mut()
9869 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9870 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('change', function(e){ L = e.type; });");
9871 let idx = rt.dom.borrow().get_element_by_id("inp");
9872 if let Some(i) = idx {
9873 rt.dispatch_event(i, "change");
9874 }
9875 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "change" {
9876 passed += 1;
9877 } else {
9878 crate::println!("JS_SELFTEST FAIL: change event");
9879 }
9880 }
9881 let form_html = "<form id='f'><input id='inp2'></form>";
9883 {
9884 let mut rt = JsRuntime::new();
9885 rt.dom
9886 .borrow_mut()
9887 .build_from(&crate::os_lib::dom::parse_html(form_html));
9888 let _ = rt.eval("var S=0; document.getElementById('f').addEventListener('submit', function(){ S++; });");
9889 let idx = rt.dom.borrow().get_element_by_id("f");
9890 if let Some(i) = idx {
9891 rt.dispatch_event_with(i, "submit", &[]);
9892 }
9893 if rt.eval("S").map(|v| v.to_js_string()).unwrap_or_default() == "1" {
9894 passed += 1;
9895 } else {
9896 crate::println!("JS_SELFTEST FAIL: submit event");
9897 }
9898 }
9899 {
9900 let mut rt = JsRuntime::new();
9901 rt.dom
9902 .borrow_mut()
9903 .build_from(&crate::os_lib::dom::parse_html(form_html));
9904 let _ = rt.eval("document.getElementById('f').addEventListener('submit', function(e){ e.preventDefault(); });");
9905 let idx = rt.dom.borrow().get_element_by_id("f");
9906 let prevented = idx
9907 .map(|i| rt.dispatch_event_with(i, "submit", &[]).1)
9908 .unwrap_or(false);
9909 if prevented {
9910 passed += 1;
9911 } else {
9912 crate::println!("JS_SELFTEST FAIL: submit preventDefault");
9913 }
9914 }
9915 {
9917 let mut rt = JsRuntime::new();
9918 rt.dom
9919 .borrow_mut()
9920 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9921 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('mouseover', function(e){ L = e.type; });");
9922 let idx = rt.dom.borrow().get_element_by_id("inp");
9923 if let Some(i) = idx {
9924 rt.dispatch_event(i, "mouseover");
9925 }
9926 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "mouseover" {
9927 passed += 1;
9928 } else {
9929 crate::println!("JS_SELFTEST FAIL: mouseover event");
9930 }
9931 }
9932 {
9934 let mut rt = JsRuntime::new();
9935 rt.dom
9936 .borrow_mut()
9937 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9938 let _ = rt.eval("var L=''; document.getElementById('par').addEventListener('mouseout', function(e){ L = 'out:' + e.target.id; });");
9939 let idx = rt.dom.borrow().get_element_by_id("inp");
9940 if let Some(i) = idx {
9941 rt.dispatch_event(i, "mouseout");
9942 }
9943 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "out:inp" {
9944 passed += 1;
9945 } else {
9946 crate::println!("JS_SELFTEST FAIL: mouseout bubbling");
9947 }
9948 }
9949 {
9951 let mut rt = JsRuntime::new();
9952 rt.dom
9953 .borrow_mut()
9954 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9955 let _ = rt.eval("var N=0; document.getElementById('inp').addEventListener('mousemove', function(){ N++; });");
9956 let idx = rt.dom.borrow().get_element_by_id("inp");
9957 if let Some(i) = idx {
9958 rt.dispatch_event(i, "mousemove");
9959 rt.dispatch_event(i, "mousemove");
9960 }
9961 if rt.eval("N").map(|v| v.to_js_string()).unwrap_or_default() == "2" {
9962 passed += 1;
9963 } else {
9964 crate::println!("JS_SELFTEST FAIL: mousemove event");
9965 }
9966 }
9967 {
9969 let mut rt = JsRuntime::new();
9970 rt.dom
9971 .borrow_mut()
9972 .build_from(&crate::os_lib::dom::parse_html(kev_html));
9973 let _ = rt.eval("var L=''; document.getElementById('inp').addEventListener('click', function(e){ L = e.clientX + ',' + e.clientY; });");
9974 let idx = rt.dom.borrow().get_element_by_id("inp");
9975 if let Some(i) = idx {
9976 rt.dispatch_mouse(i, "click", 42, 17);
9977 }
9978 if rt.eval("L").map(|v| v.to_js_string()).unwrap_or_default() == "42,17" {
9979 passed += 1;
9980 } else {
9981 crate::println!("JS_SELFTEST FAIL: mouse clientX/clientY");
9982 }
9983 }
9984 }
9985
9986 let location_cases: &[(&str, &str)] = &[
9988 ("location.href", "https://example.com/foo/bar?q=1#h"),
9989 ("location.protocol", "https:"),
9990 ("location.host", "example.com"),
9991 ("location.hostname", "example.com"),
9992 ("location.pathname", "/foo/bar"),
9993 ("location.search", "?q=1"),
9994 ("location.hash", "#h"),
9995 ("location.origin", "https://example.com"),
9996 ("window.location.href", "https://example.com/foo/bar?q=1#h"),
9997 ("document.location.pathname", "/foo/bar"),
9998 ("location.toString()", "https://example.com/foo/bar?q=1#h"),
9999 ("window.location === document.location", "true"),
10000 (
10010 "location.protocol='http:'; location._pending_location",
10011 "http://example.com/foo/bar?q=1",
10012 ),
10013 (
10014 "location.protocol='https:'; location.host='example.com'; \
10015 location.hostname='other.com'; location._pending_location",
10016 "https://other.com/foo/bar?q=1",
10017 ),
10018 (
10019 "location.host='example.com'; location.port='8080'; location._pending_location",
10020 "https://example.com:8080/foo/bar?q=1",
10021 ),
10022 (
10023 "location.host='new.com:9090'; location._pending_location",
10024 "https://new.com:9090/foo/bar?q=1",
10025 ),
10026 (
10027 "location.host='new.com:9090'; location.hostname + ',' + location.port",
10028 "new.com,9090",
10029 ),
10030 (
10034 "var a=document.createElement('a'); a.setAttribute('href','/p3'); a.href",
10035 "https://example.com/p3",
10036 ),
10037 (
10038 "var i=document.createElement('img'); i.setAttribute('src','x.png'); i.src",
10039 "https://example.com/foo/x.png",
10040 ),
10041 (
10042 "var a=document.createElement('a'); a.setAttribute('href','https://o.com/z'); a.href",
10043 "https://o.com/z",
10044 ),
10045 ("document.URL", "https://example.com/foo/bar?q=1#h"),
10048 ("document.documentURI", "https://example.com/foo/bar?q=1#h"),
10049 (
10050 "document.createElement('div').baseURI",
10051 "https://example.com/foo/bar?q=1#h",
10052 ),
10053 ("document.readyState", "complete"),
10056 (
10059 "document.cookie='ck_a=1'; document.cookie='ck_b=2; path=/'; document.cookie",
10060 "ck_a=1; ck_b=2",
10061 ),
10062 (
10066 "await cookieStore.set('cs_x', '1'); (await cookieStore.get('cs_x')).value",
10067 "1",
10068 ),
10069 ("(await cookieStore.get('cs_missing'))", "null"),
10070 (
10071 "await cookieStore.set('cs_y', '2'); \
10072 (await cookieStore.getAll('cs_y')).map(c => c.name+'='+c.value).join(',')",
10073 "cs_y=2",
10074 ),
10075 (
10076 "await cookieStore.set('cs_z', '3'); await cookieStore.delete('cs_z'); \
10077 (await cookieStore.get('cs_z'))",
10078 "null",
10079 ),
10080 (
10081 "await cookieStore.set({name:'cs_w', value:'4'}); (await cookieStore.get('cs_w')).value",
10082 "4",
10083 ),
10084 ("document.hidden", "false"),
10087 ("document.visibilityState", "visible"),
10088 ];
10089 {
10090 let mut rt = JsRuntime::new();
10091 rt.set_page_url("https://example.com/foo/bar?q=1#h");
10092 for (src, expect) in location_cases {
10093 match rt.eval(src) {
10094 Ok(v) if &v.to_js_string() == expect => passed += 1,
10095 Ok(v) => crate::println!(
10096 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
10097 src,
10098 v.to_js_string(),
10099 expect
10100 ),
10101 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
10102 }
10103 }
10104 }
10105
10106 let history_cases: &[(&str, &str)] = &[
10108 (
10109 "history.pushState({a:1},'','/p2'); location.pathname",
10110 "/p2",
10111 ),
10112 (
10113 "history.pushState({},'','/p2'); location.href",
10114 "https://example.com/p2",
10115 ),
10116 ("history.pushState({a:9},'','/p2'); history.state.a", "9"),
10117 (
10118 "var n=history.length; history.pushState({},'','/x'); history.length - n",
10119 "1",
10120 ),
10121 (
10122 "var n=history.length; history.replaceState({},'','/y'); history.length - n",
10123 "0",
10124 ),
10125 (
10126 "history.replaceState({},'','about.html'); location.pathname",
10127 "/foo/about.html",
10128 ),
10129 ("typeof history.pushState", "function"),
10130 ("typeof history.back", "function"),
10131 ];
10132 for (src, expect) in history_cases {
10133 let mut rt = JsRuntime::new();
10134 rt.set_page_url("https://example.com/foo/bar");
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 let resolve_cases: &[(&str, &str, &str)] = &[
10149 ("http://h.com/a/b.html", "/api", "http://h.com/api"),
10150 ("http://h.com/a/b.html", "x.json", "http://h.com/a/x.json"),
10151 ("http://h.com/a/", "x.json", "http://h.com/a/x.json"),
10152 (
10153 "http://h.com/a/b.html",
10154 "https://o.com/z",
10155 "https://o.com/z",
10156 ),
10157 ("http://h.com/a/b.html", "data:,hi", "data:,hi"),
10158 ("https://h.com/", "/p/q", "https://h.com/p/q"),
10159 ("http://h.com", "y", "http://h.com/y"),
10160 ("", "/api", "/api"),
10161 ("https://h.com/a/b/c", "../style.css", "https://h.com/a/style.css"),
10163 ("https://h.com/a/b/c", "./style.css", "https://h.com/a/b/style.css"),
10164 ("https://h.com/a/b/c/d", "../../x", "https://h.com/a/x"),
10165 ];
10166 let mut rpassed = 0;
10167 for (base, url, expect) in resolve_cases {
10168 let got = builtins::resolve_url(base, url);
10169 if &got == expect {
10170 rpassed += 1;
10171 } else {
10172 crate::println!(
10173 "JS_SELFTEST FAIL: resolve_url({:?},{:?}) => `{}` (want `{}`)",
10174 base,
10175 url,
10176 got,
10177 expect
10178 );
10179 }
10180 }
10181
10182 let validity_cases: &[(&str, &str, &str)] = &[
10184 ("<input id='a' required value=''>", "document.getElementById('a').checkValidity()", "false"),
10186 ("<input id='a' required value='x'>", "document.getElementById('a').checkValidity()", "true"),
10187 ("<input id='a' value='hi'>", "document.getElementById('a').checkValidity()", "true"),
10188 ("<input id='a' type='email' value='nope'>", "document.getElementById('a').checkValidity()", "false"),
10189 ("<input id='a' type='email' value='x@y.com'>", "document.getElementById('a').checkValidity()", "true"),
10190 ("<input id='a' type='number' min='5' value='3'>", "document.getElementById('a').checkValidity()", "false"),
10191 ("<input id='a' type='number' min='5' value='9'>", "document.getElementById('a').checkValidity()", "true"),
10192 ("<input id='a' minlength='3' value='ab'>", "document.getElementById('a').checkValidity()", "false"),
10193 ("<input id='a' maxlength='2' value='abc'>", "document.getElementById('a').checkValidity()", "false"),
10194 ("<input id='a' value='ok'>", "var e=document.getElementById('a'); e.setCustomValidity('bad'); e.checkValidity()", "false"),
10195 ("<input id='a' value='ok'>", "var e=document.getElementById('a'); e.setCustomValidity('bad'); e.setCustomValidity(''); e.checkValidity()", "true"),
10196 ("<input id='a' required value=''>", "document.getElementById('a').validity.valueMissing", "true"),
10197 ("<input id='a' required value='x'>", "document.getElementById('a').validity.valid", "true"),
10198 ("<input id='a' value='hi'>", "document.getElementById('a').willValidate", "true"),
10199 ("<input id='a' type='submit'>", "document.getElementById('a').willValidate", "false"),
10200 ("<input id='a' pattern='[0-9]{3}' value='123'>", "document.getElementById('a').checkValidity()", "true"),
10204 ("<input id='a' pattern='[0-9]{3}' value='ab'>", "document.getElementById('a').checkValidity()", "false"),
10205 ("<input id='a' pattern='\\d+' value='123'>", "document.getElementById('a').checkValidity()", "true"),
10206 ("<input id='a' pattern='\\d+' value='abc'>", "document.getElementById('a').checkValidity()", "false"),
10207 ("<input id='a' pattern='[0-9]{3}' value=''>", "document.getElementById('a').checkValidity()", "true"),
10209 ("<input id='a' type='number' step='2' value='4'>", "document.getElementById('a').checkValidity()", "true"),
10211 ("<input id='a' type='number' step='2' value='3'>", "document.getElementById('a').checkValidity()", "false"),
10212 ("<input id='a' type='number' min='1' step='2' value='5'>", "document.getElementById('a').checkValidity()", "true"),
10214 ("<input id='a' type='number' min='1' step='2' value='4'>", "document.getElementById('a').checkValidity()", "false"),
10215 ("<input id='a' type='number' step='any' value='3.14159'>", "document.getElementById('a').checkValidity()", "true"),
10217 ("<input id='a' pattern='[0-9]{3}' value='ab'>", "document.getElementById('a').validity.patternMismatch", "true"),
10222 ("<input id='a' pattern='[0-9]{3}' value='123'>", "document.getElementById('a').validity.patternMismatch", "false"),
10223 ("<input id='a' type='email' value='nope'>", "document.getElementById('a').validity.typeMismatch", "true"),
10224 ("<input id='a' type='number' min='5' value='3'>", "document.getElementById('a').validity.rangeUnderflow", "true"),
10225 ("<input id='a' type='number' max='5' value='9'>", "document.getElementById('a').validity.rangeOverflow", "true"),
10226 ("<input id='a' type='number' step='2' value='3'>", "document.getElementById('a').validity.stepMismatch", "true"),
10227 ("<input id='a' maxlength='2' value='abc'>", "document.getElementById('a').validity.tooLong", "true"),
10228 ("<input id='a' minlength='3' value='ab'>", "document.getElementById('a').validity.tooShort", "true"),
10229 ("<input id='a' type='number' value='abc'>", "document.getElementById('a').validity.badInput", "true"),
10230 (
10233 "<form id='f3'><input required value=''></form>",
10234 "document.getElementById('f3').checkValidity()",
10235 "false",
10236 ),
10237 (
10238 "<form id='f3'><input required value='x'></form>",
10239 "document.getElementById('f3').checkValidity()",
10240 "true",
10241 ),
10242 (
10243 "<form id='f3'><input required value='x'><input type='email' value='nope'></form>",
10244 "document.getElementById('f3').checkValidity()",
10245 "false",
10246 ),
10247 (
10254 "<select id='a' required><option value='x' selected>X</option></select>",
10255 "document.getElementById('a').checkValidity()",
10256 "true",
10257 ),
10258 (
10259 "<select id='a' required><option value='x' selected>X</option></select>",
10260 "document.getElementById('a').validity.valueMissing",
10261 "false",
10262 ),
10263 (
10264 "<textarea id='a' required>hello</textarea>",
10265 "document.getElementById('a').checkValidity()",
10266 "true",
10267 ),
10268 (
10269 "<textarea id='a' required></textarea>",
10270 "document.getElementById('a').checkValidity()",
10271 "false",
10272 ),
10273 (
10274 "<form id='f4'><select required><option value='x' selected>X</option></select></form>",
10275 "document.getElementById('f4').checkValidity()",
10276 "true",
10277 ),
10278 (
10284 "<input id='a' type='checkbox' required>",
10285 "document.getElementById('a').checkValidity()",
10286 "false",
10287 ),
10288 (
10289 "<input id='a' type='checkbox' required checked>",
10290 "document.getElementById('a').checkValidity()",
10291 "true",
10292 ),
10293 (
10294 "<input id='a' type='checkbox' value='yes' required>",
10295 "document.getElementById('a').validity.valueMissing",
10296 "true",
10297 ),
10298 (
10299 "<input id='a' type='checkbox' required checked>",
10300 "document.getElementById('a').validity.valueMissing",
10301 "false",
10302 ),
10303 (
10306 "<input id='a' type='radio' name='g' required><input type='radio' name='g' checked>",
10307 "document.getElementById('a').checkValidity()",
10308 "true",
10309 ),
10310 (
10311 "<input id='a' type='radio' name='g' required><input type='radio' name='g'>",
10312 "document.getElementById('a').checkValidity()",
10313 "false",
10314 ),
10315 (
10320 "<input id='a' type='range' min='0' max='10' value='20'>",
10321 "document.getElementById('a').validity.rangeOverflow",
10322 "true",
10323 ),
10324 (
10325 "<input id='a' type='range' min='0' max='10' value='-5'>",
10326 "document.getElementById('a').validity.rangeUnderflow",
10327 "true",
10328 ),
10329 (
10330 "<input id='a' type='range' min='0' max='10' value='5'>",
10331 "document.getElementById('a').checkValidity()",
10332 "true",
10333 ),
10334 (
10335 "<input id='a' type='range' min='0' max='10' step='2' value='3'>",
10336 "document.getElementById('a').validity.stepMismatch",
10337 "true",
10338 ),
10339 (
10344 "<input id='a' type='date' value='2026-07-17'>",
10345 "document.getElementById('a').validity.typeMismatch",
10346 "false",
10347 ),
10348 (
10349 "<input id='a' type='date' value='not-a-date'>",
10350 "document.getElementById('a').validity.typeMismatch",
10351 "true",
10352 ),
10353 (
10354 "<input id='a' type='month' value='2026-07'>",
10355 "document.getElementById('a').checkValidity()",
10356 "true",
10357 ),
10358 (
10359 "<input id='a' type='date' value='2026-13-99'>",
10360 "document.getElementById('a').checkValidity()",
10361 "false",
10362 ),
10363 (
10367 "<input id='a' type='email' multiple value='a@b.com,c@d.com'>",
10368 "document.getElementById('a').checkValidity()",
10369 "true",
10370 ),
10371 (
10372 "<input id='a' type='email' multiple value='a@b.com, c@d.com'>",
10373 "document.getElementById('a').checkValidity()",
10374 "true",
10375 ),
10376 (
10377 "<input id='a' type='email' multiple value='a@b.com,nope'>",
10378 "document.getElementById('a').checkValidity()",
10379 "false",
10380 ),
10381 (
10382 "<input id='a' type='email' value='a@b.com,c@d.com'>",
10384 "document.getElementById('a').checkValidity()",
10385 "false",
10386 ),
10387 (
10390 "<input id='a' type='date' min='2026-01-01' max='2026-12-31' value='2025-12-31'>",
10391 "document.getElementById('a').validity.rangeUnderflow",
10392 "true",
10393 ),
10394 (
10395 "<input id='a' type='date' min='2026-01-01' max='2026-12-31' value='2027-01-01'>",
10396 "document.getElementById('a').validity.rangeOverflow",
10397 "true",
10398 ),
10399 (
10400 "<input id='a' type='date' min='2026-01-01' max='2026-12-31' value='2026-06-15'>",
10401 "document.getElementById('a').checkValidity()",
10402 "true",
10403 ),
10404 (
10405 "<input id='a' type='month' min='2026-03' max='2026-09' value='2026-01'>",
10406 "document.getElementById('a').checkValidity()",
10407 "false",
10408 ),
10409 (
10414 "<fieldset disabled><input id='a' required></fieldset>",
10415 "document.getElementById('a').disabled",
10416 "true",
10417 ),
10418 (
10419 "<fieldset disabled><input id='a' required></fieldset>",
10420 "document.getElementById('a').checkValidity()",
10421 "true",
10422 ),
10423 (
10424 "<fieldset><input id='a' required></fieldset>",
10425 "document.getElementById('a').disabled",
10426 "false",
10427 ),
10428 (
10429 "<fieldset disabled><input id='a' required value=''></fieldset>",
10432 "document.getElementById('a').validity.valueMissing",
10433 "false",
10434 ),
10435 (
10441 "<form id='f5'></form><input id='a' form='f5'>",
10442 "document.getElementById('a').form === document.getElementById('f5')",
10443 "true",
10444 ),
10445 (
10446 "<form id='f5'></form><input id='a' form='f5' required>",
10447 "document.getElementById('f5').checkValidity()",
10448 "false",
10449 ),
10450 (
10451 "<form id='f5'></form><input id='a' form='f5' required value='x'>",
10452 "document.getElementById('f5').checkValidity()",
10453 "true",
10454 ),
10455 (
10456 "<div><input id='a'></div>",
10458 "document.getElementById('a').form",
10459 "null",
10460 ),
10461 (
10466 "<input id='a' type='datetime-local' value='2026-07-17T14:30'>",
10467 "document.getElementById('a').validity.typeMismatch",
10468 "false",
10469 ),
10470 (
10471 "<input id='a' type='datetime-local' value='not-a-datetime'>",
10472 "document.getElementById('a').checkValidity()",
10473 "false",
10474 ),
10475 (
10476 "<input id='a' type='datetime-local' min='2026-01-01T00:00' max='2026-12-31T23:59' value='2025-06-01T00:00'>",
10477 "document.getElementById('a').validity.rangeUnderflow",
10478 "true",
10479 ),
10480 (
10486 "<details id='a' name='g' open></details><details id='b' name='g' open></details>",
10487 "document.getElementById('a').open+','+document.getElementById('b').open",
10488 "false,true",
10489 ),
10490 (
10491 "<details id='a' name='g' open></details><details id='b' open></details>",
10492 "document.getElementById('a').open+','+document.getElementById('b').open",
10493 "true,true",
10494 ),
10495 (
10498 "<div id='wrap'><p id='t' name='foo'></p><span id='s'></span></div>",
10499 "document.getElementById('wrap').children.item(0).id + ',' + document.getElementById('wrap').children.namedItem('s').tagName + ',' + document.getElementById('wrap').children.namedItem('foo').id",
10500 "t,SPAN,t",
10501 ),
10502 (
10503 "<div id='wrap'><span></span></div>",
10504 "String(document.getElementById('wrap').children.item(99))",
10505 "null",
10506 ),
10507 (
10508 "<form id='f'><input id='i' name='user'></form>",
10509 "document.getElementById('f').elements.item(0).id + ',' + document.getElementById('f').elements.namedItem('user').id",
10510 "i,i",
10511 ),
10512 (
10513 "<form id='f'><input type='radio' name='r' value='v1'><input type='radio' name='r' value='v2' checked></form>",
10514 "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",
10515 "v2,2,v1,true",
10516 ),
10517 (
10518 "<div id='d' class='a b'></div>",
10519 "var d=document.getElementById('d'); var v=d.classList.value; d.classList.value='c d'; v+','+d.className",
10520 "a b,c d",
10521 ),
10522 ];
10523 for (html, src, expect) in validity_cases {
10524 let mut rt = JsRuntime::new();
10525 rt.dom
10526 .borrow_mut()
10527 .build_from(&crate::os_lib::dom::parse_html(html));
10528 match rt.eval(src) {
10529 Ok(v) if &v.to_js_string() == expect => passed += 1,
10530 Ok(v) => crate::println!(
10531 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
10532 src,
10533 v.to_js_string(),
10534 expect
10535 ),
10536 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
10537 }
10538 }
10539
10540 let module_total = 9;
10543 {
10544 let math_src = "export const PI = 3; export function sq(x){ return x*x; } \
10546 const e = 2; export { e as E };";
10547 let greet_src = "export default function(n){ return 'hi ' + n; } \
10549 export const lang = 'ja';";
10550 let index_src = "export { PI, sq } from 'math'; export * from 'math';";
10552 let cyc_a = "import { bVal } from 'cycb'; export const aVal = 10; \
10554 export function getB(){ return bVal; }";
10555 let cyc_b = "import { aVal } from 'cyca'; export const bVal = 20;";
10556
10557 let module_checks: &[(&str, &str)] = &[
10558 ("import { PI, sq } from 'math'; sq(PI)", "9"),
10560 ("import { E } from 'math'; E", "2"),
10562 ("import greet from 'greet'; greet('bob')", "hi bob"),
10564 ("import greet, { lang } from 'greet'; greet(lang)", "hi ja"),
10566 ("import * as M from 'math'; M.sq(4) + M.PI", "19"),
10568 ("import { PI } from 'index'; PI", "3"),
10570 ("import { sq } from 'index'; sq(5)", "25"),
10572 ("import { getB } from 'cyca'; getB()", "20"),
10574 ("import 'math'; 42", "42"),
10576 ];
10577 for (src, expect) in module_checks {
10578 let mut rt = JsRuntime::new();
10579 rt.define_module("math", math_src);
10580 rt.define_module("greet", greet_src);
10581 rt.define_module("index", index_src);
10582 rt.define_module("cyca", cyc_a);
10583 rt.define_module("cycb", cyc_b);
10584 match rt.eval(src) {
10585 Ok(v) if &v.to_js_string() == expect => passed += 1,
10586 Ok(v) => crate::println!(
10587 "JS_SELFTEST FAIL: `{}` => `{}` (want `{}`)",
10588 src,
10589 v.to_js_string(),
10590 expect
10591 ),
10592 Err(e) => crate::println!("JS_SELFTEST ERR: `{}` => {}", src, e),
10593 }
10594 }
10595 }
10596
10597 let scroll_bridge_total = 3;
10606 {
10607 let mut rt = JsRuntime::new();
10608 let _ = rt.eval("window.scrollTo(0, 120);");
10609 let y = rt.dom.borrow().pending_scroll_abs_y;
10610 if y == Some(120) {
10611 passed += 1;
10612 } else {
10613 crate::println!(
10614 "JS_SELFTEST FAIL: window.scrollTo pending_scroll_abs_y => `{:?}` (want `Some(120)`)",
10615 y
10616 );
10617 }
10618 }
10619 {
10620 let mut rt = JsRuntime::new();
10621 let _ = rt.eval("window.scrollBy(0, 30); window.scrollBy(0, 15);");
10622 let dy = rt.dom.borrow().pending_scroll_by_y;
10623 if dy == Some(45) {
10624 passed += 1;
10625 } else {
10626 crate::println!(
10627 "JS_SELFTEST FAIL: window.scrollBy pending_scroll_by_y (累積) => `{:?}` (want `Some(45)`)",
10628 dy
10629 );
10630 }
10631 }
10632 {
10640 let mut rt = JsRuntime::new();
10641 rt.dom
10642 .borrow_mut()
10643 .build_from(&crate::os_lib::dom::parse_html("<div id='t'></div>"));
10644 let idx = rt.dom.borrow().get_element_by_id("t");
10645 if let Some(i) = idx {
10646 rt.dom.borrow_mut().set_rect(i, 0, 250, 100, 50);
10647 }
10648 let _ = rt.eval("document.getElementById('t').scrollIntoView();");
10649 let y = rt.dom.borrow().pending_scroll_abs_y;
10650 if y == Some(250) {
10651 passed += 1;
10652 } else {
10653 crate::println!(
10654 "JS_SELFTEST FAIL: element.scrollIntoView pending_scroll_abs_y => `{:?}` (want `Some(250)`)",
10655 y
10656 );
10657 }
10658 }
10659
10660 let dom_parser_cases: &[(&str, &str)] = &[
10661 (
10662 "var p = new DOMParser(); var doc = p.parseFromString('<div id=\"dp\">hello</div>', 'text/html'); doc.getElementById('dp').textContent",
10663 "hello",
10664 ),
10665 ];
10666 let mut dom_parser_passed = 0;
10667 for (code, expect) in dom_parser_cases {
10668 let mut rt = JsRuntime::new();
10669 let res = rt.eval(code);
10670 let got = res.map(|v| v.to_js_string()).unwrap_or_else(|e| alloc::format!("ERR: {:?}", e));
10671 if &got == expect {
10672 dom_parser_passed += 1;
10673 } else {
10674 crate::println!(
10675 "JS_SELFTEST FAIL: DOMParser code {:?} => `{}` (want `{}`)",
10676 code,
10677 got,
10678 expect
10679 );
10680 }
10681 }
10682
10683 let geom_web_cases = [
10685 ("const m = new DOMMatrix([1,0,0,1,10,20]); m.a === 1 && m.e === 10", "true"),
10686 ("const m = new DOMMatrix(); m.translateSelf(10, 20); m.e === 10 && m.f === 20", "true"),
10687 ("const m = new DOMMatrix(); m.scaleSelf(2, 3); m.a === 2 && m.d === 3", "true"),
10688 ("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"),
10689 ("const m2 = DOMMatrix.fromMatrix({a: 2, d: 3, e: 5, f: 10}); m2.a === 2 && m2.e === 5", "true"),
10690 ("const p3 = new DOMPoint(1, 2).matrixTransform(new DOMMatrix([2,0,0,3,10,20])); p3.x === 12 && p3.y === 26", "true"),
10691 ("const pat = new URLPattern({ pathname: '/api/*' }); pat.test('/api/users')", "true"),
10692 ("const res = new URLPattern({ pathname: '/users/:id' }).exec('https://example.com/users/42'); res.pathname.groups.id", "42"),
10693 ("const it = Iterator.concat([1, 2], [3, 4]); it.toArray().join(',')", "1,2,3,4"),
10694 ("const it = Iterator.from([10, 20, 30]); it.take(2).toArray().join(',')", "10,20"),
10695 ("new Intl.DurationFormat('en', {style:'long'}).format({hours:1, minutes:30})", "1 hour, 30 minutes"),
10696 ("new Intl.DurationFormat('en').resolvedOptions().locale", "en-US"),
10697 ("Iterator.range(1, 5).toArray().join(',')", "1,2,3,4"),
10698 ("Iterator.range(0, 10, 2).toArray().join(',')", "0,2,4,6,8"),
10699 ("Iterator.range(5, 1, -1).toArray().join(',')", "5,4,3,2"),
10700 ];
10701 let mut geom_web_passed = 0;
10702 for (code, expect) in geom_web_cases {
10703 let mut rt = JsRuntime::new();
10704 let res = rt.eval(code);
10705 let got = res.map(|v| v.to_js_string()).unwrap_or_else(|e| alloc::format!("ERR: {:?}", e));
10706 if &got == expect {
10707 geom_web_passed += 1;
10708 } else {
10709 crate::println!(
10710 "JS_SELFTEST FAIL: Geom/Web API code {:?} => `{}` (want `{}`)",
10711 code,
10712 got,
10713 expect
10714 );
10715 }
10716 }
10717
10718 let template_html = r#"<div><template id="tmpl"><span>Hello</span></template></div>"#;
10719 let template_cases = [
10720 ("document.createElement('template') instanceof HTMLTemplateElement", "true"),
10721 ("const t = document.createElement('template'); t.content.nodeType === 11", "true"),
10722 ("const t = document.getElementById('tmpl'); t.content.childNodes.length", "1"),
10723 ("const t = document.getElementById('tmpl'); t.content.children[0].tagName", "SPAN"),
10724 ("const t = document.getElementById('tmpl'); const f = t.content.cloneNode(true); f.nodeType === 11 && f.children[0].textContent === 'Hello'", "true"),
10725 ("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"),
10726 ("const u = new URL('https://www.sugi-lab.net/?a=1'); u.searchParams.set('b', '2'); u.search === '?a=1&b=2'", "true"),
10727 ("const div = document.createElement('div'); div.setAttribute('id', 'd1'); const c = div.cloneNode(true); c.id === 'd1' && c !== div", "true"),
10728 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx !== null && ctx.canvas === cv", "true"),
10729 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.measureText('test').width > 0", "true"),
10730 ("const cv = document.createElement('canvas'); cv.toDataURL().startsWith('data:image/png;base64,')", "true"),
10731 ("const cv = document.createElement('canvas'); const ctx = cv.getContext('2d'); ctx.lineWidth = 10; ctx.reset(); ctx.lineWidth === 1", "true"),
10732 ("const p = new Path2D('M10 10 H 90 V 90 H 10 Z'); typeof p.moveTo === 'function' && typeof p.roundRect === 'function'", "true"),
10733 ("const div = document.createElement('div'); div.getRootNode() === div", "true"),
10734 ("const div = document.getElementById('tmpl'); div.getRootNode() === document", "true"),
10735 ("const el = document.createElement('div'); document.adoptNode(el) === el", "true"),
10736 ("const el = document.createElement('div'); document.importNode(el, true) !== null", "true"),
10737 ("ArrayBuffer.isView(new Uint8Array(5)) && !ArrayBuffer.isView(new ArrayBuffer(5))", "true"),
10738 ("Math.clamp(15, 0, 10) === 10 && Math.clamp(-5, 0, 10) === 0 && Math.clamp(5, 0, 10) === 5", "true"),
10739 ("const io = new IntersectionObserver(()=>{}); typeof io.takeRecords === 'function' && io.takeRecords().length === 0", "true"),
10740 ];
10741 let mut template_passed = 0;
10742 for (src, expect) in template_cases {
10743 let mut rt = JsRuntime::new();
10744 rt.dom
10745 .borrow_mut()
10746 .build_from(&crate::os_lib::dom::parse_html(template_html));
10747 match rt.eval(src) {
10748 Ok(v) if &v.to_js_string() == expect => template_passed += 1,
10749 Ok(v) => crate::println!(
10750 "JS_SELFTEST FAIL: Template test `{}` => `{}` (want `{}`)",
10751 src,
10752 v.to_js_string(),
10753 expect
10754 ),
10755 Err(e) => crate::println!("JS_SELFTEST ERR: Template test `{}` => {}", src, e),
10756 }
10757 }
10758
10759 (
10760 passed + rpassed + dom_parser_passed + geom_web_passed + template_passed,
10761 total
10762 + scroll_bridge_total
10763 + dom2_cases.len()
10764 + event_total
10765 + fd_form_total
10766 + fd2_form_total
10767 + select_multiple_total
10768 + optgroup_total
10769 + doc_title_total
10770 + doc_collections_total
10771 + rect_total
10772 + point_test_total
10773 + computed_total
10774 + check_visibility_total
10775 + event_checks.len()
10776 + 8 + 3 + abort_timeout_total
10779 + key_event_total
10780 + location_cases.len()
10781 + history_cases.len()
10782 + resolve_cases.len()
10783 + validity_cases.len()
10784 + dom_parser_cases.len()
10785 + geom_web_cases.len()
10786 + template_cases.len()
10787 + module_total,
10788 )
10789}
10790
10791
10792
10793