servo/tests/wpt/web-platform-tests/native-file-system/showPicker-errors.https.window.js

118 lines
No EOL
4.5 KiB
JavaScript

// META: script=resources/test-helpers.js
promise_test(async t => {
await promise_rejects_dom(t, 'SecurityError', self.showOpenFilePicker());
}, 'showOpenFilePicker: Showing a picker requires user activation.');
promise_test(async t => {
await promise_rejects_dom(t, 'SecurityError', self.showSaveFilePicker());
}, 'showSaveFilePicker: Showing a picker requires user activation.');
promise_test(async t => {
await promise_rejects_dom(t, 'SecurityError', self.showDirectoryPicker());
}, 'showDirectoryPicker: Showing a picker requires user activation.');
// TODO(mek): Add tests for cross-origin iframes, opaque origins, etc.
define_file_picker_error_tests('showOpenFilePicker');
define_file_picker_error_tests('showSaveFilePicker');
function define_file_picker_error_tests(showPickerMethod) {
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod]({excludeAcceptAllOption: true, types: []}));
}, showPickerMethod + ': File picker requires at least one accepted type.');
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod]({types: [{accept: {'': ['.foo']}}]}));
await promise_rejects_js(
t, TypeError,
self[showPickerMethod]({types: [{accept: {' ': ['.foo']}}]}));
}, showPickerMethod + ': MIME type can\'t be an empty string.');
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod]({types: [{accept: {'image': ['.foo']}}]}));
}, showPickerMethod + ': MIME type must have subtype.');
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod]({types: [{accept: {' /plain': ['.foo']}}]}));
}, showPickerMethod + ': MIME type can\'t have empty type.');
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod]({types: [{accept: {'image/ ': ['.foo']}}]}));
}, showPickerMethod + ': MIME type can\'t have empty subtype.');
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod](
{types: [{accept: {'text/plain;charset=utf8': ['.txt']}}]}));
}, showPickerMethod + ': MIME type can\'t have parameters.');
promise_test(async t => {
await promise_rejects_js(t, TypeError, self[showPickerMethod]({
types: [{accept: {'text>foo/plain': ['.txt']}}]
}));
}, showPickerMethod + ': MIME type can\'t have invalid characters in type.');
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod]({types: [{accept: {'text / plain': ['.txt']}}]}));
}, showPickerMethod + ': MIME type can\'t have whitespace in the middle.');
promise_test(
async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod](
{types: [{accept: {'text/plain>foo': ['.txt']}}]}));
},
showPickerMethod +
': MIME type can\'t have invalid characters in subtype.');
const invalid_extensions = {
'.extensiontoolong': 'extension length more than 16.',
'.txt.': 'extenstion ends with "."',
'txt': 'extenstion does not start with "."',
'.$txt' : 'illegal character "$"',
'.t<xt': 'illegal character "<"',
'.t/xt': 'illegal character "\"',
'.\txt': 'illegal character "/"',
'.txt\\': 'illegal characters "\\"',
'.txt?': 'illegal character "?"',
'.txt*': 'illegal character "*"',
'.{txt': 'illegal character "{"',
'.}txt': 'illegal character "}"',
' .txt': 'illegal whitespace at front of extension',
'. txt': 'illegal whitespace in extension',
'.txt ': 'illegal whitespace at end of extension',
'.\u202etxt\u202e' : 'illegal RTL character',
'.t\u00E6xt': 'non-ASCII character "æ"',
'.קום': 'non-ASCII character "קום"',
'.txt🙂': 'non-ASCII character "🙂"',
'.{txt}': 'illegal characters "{" and "}"',
}
for (const [extension, description] of Object.entries(invalid_extensions)) {
define_file_picker_extension_error_test(showPickerMethod, extension, description)
}
}
function define_file_picker_extension_error_test(showPickerMethod, extension, description) {
promise_test(async t => {
await promise_rejects_js(
t, TypeError,
self[showPickerMethod](
{ types: [{ accept: { 'text/plain': ['.txt', extension] } }] }));
}, showPickerMethod + ': invalid extension "' + extension + '". ' + description + ".");
}