event-handler-idl-attribute-realm.window.js (2498B)
1 setup({ allow_uncaught_exception: true }); 2 3 test(t => { 4 document.body.append(document.createElement("iframe"), document.createElement("iframe")); 5 t.add_cleanup(() => document.querySelectorAll("iframe").forEach(iframe => iframe.remove())); 6 7 const frame0Document = frames[0].document.documentElement; 8 const frame1Body = frames[1].document.body; 9 10 frame1Body.setAttribute("onclick", "void(0)"); 11 frame0Document.appendChild(frame1Body); 12 const get = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "onclick").get; 13 const f = get.call(frame1Body); 14 15 assert_equals(f.constructor, frames[0].Function, "The function must be created in the element's document's global"); 16 }, "Event handler IDL attributes must return a function from the element's document's realm"); 17 18 test(t => { 19 document.body.append(document.createElement("iframe"), document.createElement("iframe")); 20 t.add_cleanup(() => document.querySelectorAll("iframe").forEach(iframe => iframe.remove())); 21 22 const log = []; 23 window.addEventListener("error", t.step_func(e => { 24 log.push("error event in top / error object realm = " + getErrorRealm(e)); 25 }, { signal: t.get_signal() })); 26 frames[0].addEventListener("error", t.step_func(e => { 27 log.push("error event in frames[0] / error object realm = " + getErrorRealm(e)); 28 }, { signal: t.get_signal() })); 29 frames[1].addEventListener("error", t.step_func(e => { 30 log.push("error event in frames[1] / error object realm = " + getErrorRealm(e)); 31 }, { signal: t.get_signal() })); 32 33 const frame0Document = frames[0].document.documentElement; 34 const frame1Body = frames[1].document.body; 35 36 frame1Body.setAttribute("onmousedown", "1 *-* 'syntax error'"); 37 frame0Document.appendChild(frame1Body); 38 39 assert_array_equals(log, [], "No error events must be fired before calling the getter"); 40 41 const get = Object.getOwnPropertyDescriptor(HTMLElement.prototype, "onmousedown").get; 42 const f = get.call(frame1Body); 43 44 assert_array_equals(log, ["error event in frames[0] / error object realm = frames[0]"]); 45 assert_equals(f, null, "The returned value must be null"); 46 }, "Event handler IDL attribute compilation errors must be fired on the element's document's global"); 47 48 function getErrorRealm(event) { 49 const { error } = event; 50 51 if (error instanceof SyntaxError) { 52 return "top"; 53 } if (error instanceof frames[0].SyntaxError) { 54 return "frames[0]"; 55 } if (error instanceof frames[1].SyntaxError) { 56 return "frames[1]"; 57 } 58 return "unknown"; 59 }