blob: 4bf120060299745083c8f442a799052f46362520 [file] [log] [blame]
// Copyright 2024 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// META script=resources/controlled_frame_helpers.js
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);
// The test does not complete here. After the loadabort event, the
// frame should redirect to about:blank and send a loadstop event.
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);
}
});
};
// Verifies that navigation to a URL that is valid but not web-safe or
// pseudo-scheme fires loadabort and doesn't cause a crash.
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");