const makeBadSchemeCheck = function(test, badURL) {
return new Promise((resolve, reject) => {
try {
const frame = document.createElement('controlledframe');
let loadAbortCalled = false;
frame.addEventListener('loadabort', function(e) {
try {
assert_equals(e.reason, 'ERR_DISALLOWED_URL_SCHEME');
assert_equals(e.url, badURL);
loadAbortCalled = true;
} catch (e) {
reject(e);
}
});
frame.addEventListener('loadstop', function(e) {
try {
assert_equals(loadAbortCalled, true);
assert_equals(frame.src, 'about:blank');
resolve();
} catch (e) {
reject(e);
}
});
frame.addEventListener('exit', function() {
reject("Exit listener called. This indicates that the " +
"Controlled Frame's content crashed which should not occur.");
});
frame.src = badURL;
document.body.appendChild(frame);
} catch (e) {
reject(e);
}
});
};
promise_test(async (test) => {
return makeBadSchemeCheck(test, 'chrome://abc123/');
}, "Verify bad scheme chrome:// aborts, does not load");
promise_test(async (test) => {
return makeBadSchemeCheck(test, 'chrome-extension://abc123/');
}, "Verify bad scheme chrome-extension: aborts, does not load");
promise_test(async (test) => {
return makeBadSchemeCheck(test, 'chrome-untrusted://abc123/');
}, "Verify bad scheme chrome-untrusted: aborts, does not load");
promise_test(async (test) => {
return makeBadSchemeCheck(test, 'filesystem:http://abc123/temp.png/');
}, "Verify bad scheme filesystem: aborts, does not load");
promise_test(async (test) => {
return makeBadSchemeCheck(test, 'javascript://abc123/');
}, "Verify bad scheme javascript: aborts, does not load");
promise_test(async (test) => {
return makeBadSchemeCheck(test, 'ws://abc123/');
}, "Verify bad scheme ws: aborts, does not load");
promise_test(async (test) => {
return makeBadSchemeCheck(test, 'wss://abc123/');
}, "Verify bad scheme wss: aborts, does not load");