showPicker-errors.https.window.js (5740B)
1 // META: script=resources/test-helpers.js 2 3 promise_test(async t => { 4 await promise_rejects_dom(t, 'SecurityError', self.showOpenFilePicker()); 5 }, 'showOpenFilePicker: Showing a picker requires user activation.'); 6 7 promise_test(async t => { 8 await promise_rejects_dom(t, 'SecurityError', self.showSaveFilePicker()); 9 }, 'showSaveFilePicker: Showing a picker requires user activation.'); 10 11 promise_test(async t => { 12 await promise_rejects_dom(t, 'SecurityError', self.showDirectoryPicker()); 13 }, 'showDirectoryPicker: Showing a picker requires user activation.'); 14 15 // TODO(mek): Add tests for cross-origin iframes, opaque origins, etc. 16 17 define_file_picker_error_tests('showOpenFilePicker'); 18 define_file_picker_error_tests('showSaveFilePicker'); 19 20 function define_file_picker_error_tests(showPickerMethod) { 21 promise_test(async t => { 22 await promise_rejects_js( 23 t, TypeError, 24 self[showPickerMethod]({excludeAcceptAllOption: true, types: []})); 25 }, showPickerMethod + ': File picker requires at least one accepted type.'); 26 27 promise_test(async t => { 28 await promise_rejects_js( 29 t, TypeError, 30 self[showPickerMethod]({types: [{accept: {'': ['.foo']}}]})); 31 await promise_rejects_js( 32 t, TypeError, 33 self[showPickerMethod]({types: [{accept: {' ': ['.foo']}}]})); 34 }, showPickerMethod + ': MIME type can\'t be an empty string.'); 35 36 promise_test(async t => { 37 await promise_rejects_js( 38 t, TypeError, 39 self[showPickerMethod]({types: [{accept: {'image': ['.foo']}}]})); 40 }, showPickerMethod + ': MIME type must have subtype.'); 41 42 promise_test(async t => { 43 await promise_rejects_js( 44 t, TypeError, 45 self[showPickerMethod]({types: [{accept: {' /plain': ['.foo']}}]})); 46 }, showPickerMethod + ': MIME type can\'t have empty type.'); 47 48 promise_test(async t => { 49 await promise_rejects_js( 50 t, TypeError, 51 self[showPickerMethod]({types: [{accept: {'image/ ': ['.foo']}}]})); 52 }, showPickerMethod + ': MIME type can\'t have empty subtype.'); 53 54 promise_test(async t => { 55 await promise_rejects_js( 56 t, TypeError, 57 self[showPickerMethod]( 58 {types: [{accept: {'text/plain;charset=utf8': ['.txt']}}]})); 59 }, showPickerMethod + ': MIME type can\'t have parameters.'); 60 61 promise_test(async t => { 62 await promise_rejects_js(t, TypeError, self[showPickerMethod]({ 63 types: [{accept: {'text>foo/plain': ['.txt']}}] 64 })); 65 }, showPickerMethod + ': MIME type can\'t have invalid characters in type.'); 66 67 promise_test(async t => { 68 await promise_rejects_js( 69 t, TypeError, 70 self[showPickerMethod]({types: [{accept: {'text / plain': ['.txt']}}]})); 71 }, showPickerMethod + ': MIME type can\'t have whitespace in the middle.'); 72 73 promise_test( 74 async t => { 75 await promise_rejects_js( 76 t, TypeError, 77 self[showPickerMethod]( 78 {types: [{accept: {'text/plain>foo': ['.txt']}}]})); 79 }, 80 showPickerMethod + 81 ': MIME type can\'t have invalid characters in subtype.'); 82 83 promise_test(async t => { 84 await promise_rejects_js(t, TypeError, self[showPickerMethod]({ 85 startIn: 'secrets', 86 })); 87 }, showPickerMethod + ': unknown well-known starting directory.'); 88 89 promise_test(async t => { 90 await promise_rejects_js(t, TypeError, self[showPickerMethod]({ 91 startIn: '', 92 })); 93 }, showPickerMethod + ': starting directory can\t be empty.'); 94 95 promise_test(async t => { 96 await promise_rejects_js(t, TypeError, self[showPickerMethod]({ 97 startIn: null, 98 })); 99 }, showPickerMethod + ': starting directory can\t be null.'); 100 101 promise_test(async t => { 102 await promise_rejects_js(t, TypeError, self[showPickerMethod]({ 103 id: "inv*l:d\\ chara<ters", 104 })); 105 }, showPickerMethod + ': starting directory ID contains invalid characters.'); 106 107 promise_test(async t => { 108 await promise_rejects_js(t, TypeError, self[showPickerMethod]({ 109 id: "id-length-cannot-exceed-32-characters", 110 })); 111 }, showPickerMethod + ': starting directory ID cannot exceed 32 characters.'); 112 113 const invalid_extensions = { 114 '.extensiontoolong': 'extension length more than 16.', 115 '.txt.': 'extenstion ends with "."', 116 'txt': 'extenstion does not start with "."', 117 '.$txt' : 'illegal character "$"', 118 '.t<xt': 'illegal character "<"', 119 '.t/xt': 'illegal character "\"', 120 '.\txt': 'illegal character "/"', 121 '.txt\\': 'illegal characters "\\"', 122 '.txt?': 'illegal character "?"', 123 '.txt*': 'illegal character "*"', 124 '.{txt': 'illegal character "{"', 125 '.}txt': 'illegal character "}"', 126 ' .txt': 'illegal whitespace at front of extension', 127 '. txt': 'illegal whitespace in extension', 128 '.txt ': 'illegal whitespace at end of extension', 129 '.\u202etxt\u202e' : 'illegal RTL character', 130 '.t\u00E6xt': 'non-ASCII character "æ"', 131 '.קום': 'non-ASCII character "קום"', 132 '.txt🙂': 'non-ASCII character "🙂"', 133 '.{txt}': 'illegal characters "{" and "}"', 134 } 135 136 for (const [extension, description] of Object.entries(invalid_extensions)) { 137 define_file_picker_extension_error_test(showPickerMethod, extension, description) 138 } 139 } 140 141 function define_file_picker_extension_error_test(showPickerMethod, extension, description) { 142 promise_test(async t => { 143 await promise_rejects_js( 144 t, TypeError, 145 self[showPickerMethod]( 146 { types: [{ accept: { 'text/plain': ['.txt', extension] } }] })); 147 }, showPickerMethod + ': invalid extension "' + extension + '". ' + description + "."); 148 }