function create_window_in_test(t, srcdoc) {
let p = new Promise((resolve) => {
let f = document.createElement('iframe');
f.srcdoc = srcdoc ? srcdoc : '';
f.onload = (event) => {
let w = f.contentWindow;
t.add_cleanup(() => f.parentNode && f.remove());
resolve(w);
};
document.body.appendChild(f);
});
return p;
}
function test_with_window(f, name, srcdoc) {
promise_test((t) => {
return create_window_in_test(t, srcdoc)
.then((w) => {
f(w);
});
}, name);
}
function assert_array_equals_callback_invocations(actual, expected, description) {
assert_equals(actual.length, expected.length);
for (let len=actual.length, i=0; i<len; ++i) {
let callback = expected[i][0];
assert_equals(actual[i][0], expected[i][0], callback + ' callback should be invoked');
assert_equals(actual[i][1], expected[i][1], callback + ' should be invoked on the element ' + expected[i][1]);
assert_array_equals(actual[i][2], expected[i][2], callback + ' should be invoked with the arguments ' + expected[i][2]);
}
}
function assert_is_upgraded(element, className, description) {
assert_true(element.matches(':defined'), description);
assert_equals(Object.getPrototypeOf(element), className.prototype, description);
}
// Asserts that func synchronously invokes the error event handler in w.
// Captures and returns the error that is reported.
//
// Do not use this function directly; instead use one of assert_reports_js,
// assert_reports_dom, or assert_reports_exactly. Those functions also check
// that the error reported is the expected one.
function assert_reports_impl(w, func) {
let old_onerror = w.onerror;
let errors = [];
w.onerror = (event, source, line_number, column_number, error) => {
errors.push(error);
return true; // the error is handled
};
try {
func();
} catch (e) {
assert_unreached(`should report, not throw, an exception: ${e}`);
} finally {
w.onerror = old_onerror;
}
assert_equals(errors.length, 1, 'only one error should have been reported');
return errors[0];
}
// Asserts that func synchronously invokes the error event handler in w
// with the expected DOMException.
function assert_reports_dom(w, expected_error, func, description) {
const e = assert_reports_impl(w, func);
assert_throws_dom(expected_error, w.DOMException, () => { throw e; }, description);
}
// Asserts that func synchronously invokes the error event handler in w
// with the expected JavaScript error.
function assert_reports_js(w, expected_error, func, description) {
const e = assert_reports_impl(w, func);
assert_throws_js(expected_error, () => { throw e; }, description);
}
// Asserts that func synchronously invokes the error event handler in w
// with exactly the expected error.
function assert_reports_exactly(w, expected_error, func, description) {
const e = assert_reports_impl(w, func);
assert_throws_exactly(expected_error, () => { throw e; }, description);
}