FileSystemFileHandle-move.js (16192B)
1 // META: script=resources/test-helpers.js 2 3 'use strict'; 4 5 directory_test(async (t, root) => { 6 const handle = await createFileWithContents('file-before', 'foo', root); 7 await handle.move('file-after'); 8 9 assert_array_equals(await getSortedDirectoryEntries(root), ['file-after']); 10 assert_equals(await getFileContents(handle), 'foo'); 11 assert_equals(await getFileSize(handle), 3); 12 }, 'move(name) to rename a file'); 13 14 directory_test(async (t, root) => { 15 const handle = await createFileWithContents('file-before', 'foo', root); 16 await handle.move('file-after'); 17 const newhandle = await root.getFileHandle('file-after'); 18 assert_equals(await getFileContents(newhandle), 'foo'); 19 assert_equals(await getFileSize(newhandle), 3); 20 }, 'get a handle to a moved file'); 21 22 directory_test(async (t, root) => { 23 const handle = await createFileWithContents('file-before', 'foo', root); 24 await handle.move('file-before'); 25 26 assert_array_equals(await getSortedDirectoryEntries(root), ['file-before']); 27 assert_equals(await getFileContents(handle), 'foo'); 28 assert_equals(await getFileSize(handle), 3); 29 }, 'move(name) to rename a file the same name'); 30 31 directory_test(async (t, root) => { 32 const handle = await createFileWithContents('file-before', 'foo', root); 33 await promise_rejects_js(t, TypeError, handle.move('')); 34 35 assert_array_equals(await getSortedDirectoryEntries(root), ['file-before']); 36 assert_equals(await getFileContents(handle), 'foo'); 37 assert_equals(await getFileSize(handle), 3); 38 }, 'move("") to rename a file fails'); 39 40 directory_test(async (t, root) => { 41 const handle = await createFileWithContents('file-1', 'foo', root); 42 43 await handle.move('file-2'); 44 assert_array_equals(await getSortedDirectoryEntries(root), ['file-2']); 45 46 await handle.move('file-3'); 47 assert_array_equals(await getSortedDirectoryEntries(root), ['file-3']); 48 49 await handle.move('file-1'); 50 assert_array_equals(await getSortedDirectoryEntries(root), ['file-1']); 51 }, 'move(name) can be called multiple times'); 52 53 directory_test(async (t, root) => { 54 const handle = await createFileWithContents('file-before', 'foo', root); 55 await promise_rejects_js(t, TypeError, handle.move('test/test')); 56 await promise_rejects_js(t, TypeError, handle.move('test\\test')); 57 58 assert_array_equals(await getSortedDirectoryEntries(root), ['file-before']); 59 assert_equals(await getFileContents(handle), 'foo'); 60 assert_equals(await getFileSize(handle), 3); 61 }, 'move(name) with a name with path separators should fail'); 62 63 directory_test(async (t, root) => { 64 const handle = await createFileWithContents('file-before', 'abc', root); 65 66 // Cannot rename handle with an active writable. 67 const stream = await cleanup_writable(t, await handle.createWritable()); 68 await promise_rejects_dom( 69 t, 'NoModificationAllowedError', handle.move('file-after')); 70 71 // Can move handle once the writable is closed. 72 await stream.close(); 73 await handle.move('file-after'); 74 assert_array_equals(await getSortedDirectoryEntries(root), ['file-after']); 75 }, 'move(name) while the file has an open writable fails'); 76 77 directory_test(async (t, root) => { 78 const handle = await createFileWithContents('file-before', 'abc', root); 79 const handle_dest = await createFileWithContents('file-after', '123', root); 80 81 // Cannot overwrite a handle with an active writable. 82 const stream = await cleanup_writable(t, await handle_dest.createWritable()); 83 await promise_rejects_dom( 84 t, 'NoModificationAllowedError', handle.move('file-after')); 85 86 await stream.close(); 87 assert_array_equals( 88 await getSortedDirectoryEntries(root), ['file-after', 'file-before']); 89 }, 'move(name) while the destination file has an open writable fails'); 90 91 directory_test(async (t, root) => { 92 const handle = await createFileWithContents('file-before', 'abc', root); 93 const handle_dest = await createFileWithContents('file-after', '123', root); 94 95 await handle.move('file-after'); 96 assert_array_equals(await getSortedDirectoryEntries(root), ['file-after']); 97 assert_equals(await getFileContents(handle), 'abc'); 98 assert_equals(await getFileContents(handle_dest), 'abc'); 99 }, 'move(name) can overwrite an existing file'); 100 101 directory_test(async (t, root) => { 102 const handle = await createFileWithContents('file-before', 'foo', root); 103 await handle.move(root, 'file-after'); 104 105 assert_array_equals(await getSortedDirectoryEntries(root), ['file-after']); 106 assert_equals(await getFileContents(handle), 'foo'); 107 assert_equals(await getFileSize(handle), 3); 108 }, 'move(dir, name) to rename a file'); 109 110 directory_test(async (t, root) => { 111 const handle = await createFileWithContents('file-before', 'foo', root); 112 await handle.move(root, 'file-before'); 113 114 assert_array_equals(await getSortedDirectoryEntries(root), ['file-before']); 115 assert_equals(await getFileContents(handle), 'foo'); 116 assert_equals(await getFileSize(handle), 3); 117 }, 'move(dir, name) to rename a file the same name'); 118 119 directory_test(async (t, root) => { 120 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 121 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 122 const file = await createFileWithContents('file', 'abc', dir_src); 123 await file.move(dir_dest); 124 125 assert_array_equals( 126 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 127 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 128 assert_array_equals(await getSortedDirectoryEntries(dir_dest), ['file']); 129 assert_equals(await getFileContents(file), 'abc'); 130 assert_equals(await getFileSize(file), 3); 131 }, 'move(dir) to move a file to a new directory'); 132 133 directory_test(async (t, root) => { 134 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 135 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 136 const file = await createFileWithContents('file', 'abc', dir_src); 137 await promise_rejects_js(t, TypeError, file.move(dir_dest, '')); 138 139 assert_array_equals( 140 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 141 assert_array_equals(await getSortedDirectoryEntries(dir_src), ['file']); 142 assert_array_equals(await getSortedDirectoryEntries(dir_dest), []); 143 assert_equals(await getFileContents(file), 'abc'); 144 assert_equals(await getFileSize(file), 3); 145 }, 'move(dir, "") to move a file to a new directory fails'); 146 147 directory_test(async (t, root) => { 148 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 149 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 150 const file = await createFileWithContents('file-in-dir-src', 'abc', dir_src); 151 await file.move(dir_dest, 'file-in-dir-dest'); 152 153 assert_array_equals( 154 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 155 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 156 assert_array_equals( 157 await getSortedDirectoryEntries(dir_dest), ['file-in-dir-dest']); 158 assert_equals(await getFileContents(file), 'abc'); 159 assert_equals(await getFileSize(file), 3); 160 }, 'move(dir, name) to move a file to a new directory'); 161 162 directory_test(async (t, root) => { 163 const dir1 = await root.getDirectoryHandle('dir1', {create: true}); 164 const dir2 = await root.getDirectoryHandle('dir2', {create: true}); 165 const handle = await createFileWithContents('file', 'foo', root); 166 167 await handle.move(dir1); 168 assert_array_equals( 169 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 170 assert_array_equals(await getSortedDirectoryEntries(dir1), ['file']); 171 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 172 assert_equals(await getFileContents(handle), 'foo'); 173 174 await handle.move(dir2); 175 assert_array_equals( 176 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 177 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 178 assert_array_equals(await getSortedDirectoryEntries(dir2), ['file']); 179 assert_equals(await getFileContents(handle), 'foo'); 180 181 await handle.move(root); 182 assert_array_equals( 183 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/', 'file']); 184 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 185 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 186 assert_equals(await getFileContents(handle), 'foo'); 187 }, 'move(dir) can be called multiple times'); 188 189 directory_test(async (t, root) => { 190 const dir1 = await root.getDirectoryHandle('dir1', {create: true}); 191 const dir2 = await root.getDirectoryHandle('dir2', {create: true}); 192 const handle = await createFileWithContents('file', 'foo', root); 193 194 await handle.move(dir1, 'file-1'); 195 assert_array_equals( 196 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 197 assert_array_equals(await getSortedDirectoryEntries(dir1), ['file-1']); 198 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 199 assert_equals(await getFileContents(handle), 'foo'); 200 201 await handle.move(dir2, 'file-2'); 202 assert_array_equals( 203 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/']); 204 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 205 assert_array_equals(await getSortedDirectoryEntries(dir2), ['file-2']); 206 assert_equals(await getFileContents(handle), 'foo'); 207 208 await handle.move(root, 'file-3'); 209 assert_array_equals( 210 await getSortedDirectoryEntries(root), ['dir1/', 'dir2/', 'file-3']); 211 assert_array_equals(await getSortedDirectoryEntries(dir1), []); 212 assert_array_equals(await getSortedDirectoryEntries(dir2), []); 213 assert_equals(await getFileContents(handle), 'foo'); 214 }, 'move(dir, name) can be called multiple times'); 215 216 directory_test(async (t, root) => { 217 const handle = await createFileWithContents('file-before', 'foo', root); 218 await promise_rejects_js(t, TypeError, handle.move(root, '..')); 219 220 assert_array_equals(await getSortedDirectoryEntries(root), ['file-before']); 221 assert_equals(await getFileContents(handle), 'foo'); 222 assert_equals(await getFileSize(handle), 3); 223 }, 'move(dir, name) with a name with invalid characters should fail'); 224 225 directory_test(async (t, root) => { 226 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 227 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 228 const file = await createFileWithContents('file', 'abc', dir_src); 229 230 // Cannot move handle with an active writable. 231 const stream = await cleanup_writable(t, await file.createWritable()); 232 await promise_rejects_dom(t, 'NoModificationAllowedError', file.move(dir_dest)); 233 234 assert_array_equals( 235 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 236 // Assert the file hasn't been moved to the destination directory. 237 assert_array_equals(await getSortedDirectoryEntries(dir_dest), []); 238 239 // Can move handle once the writable is closed. 240 await stream.close(); 241 await file.move(dir_dest); 242 assert_array_equals( 243 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 244 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 245 assert_array_equals(await getSortedDirectoryEntries(dir_dest), ['file']); 246 }, 'move(dir) while the file has an open writable fails'); 247 248 directory_test(async (t, root) => { 249 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 250 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 251 const file = await createFileWithContents('file-before', 'abc', dir_src); 252 253 // Cannot move handle with an active writable. 254 const stream = await cleanup_writable(t, await file.createWritable()); 255 await promise_rejects_dom(t, 'NoModificationAllowedError', file.move(dir_dest)); 256 257 assert_array_equals( 258 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 259 // Assert the file hasn't been moved to the destination directory. 260 assert_array_equals(await getSortedDirectoryEntries(dir_dest), []); 261 262 // Can move handle once the writable is closed. 263 await stream.close(); 264 await file.move(dir_dest, 'file-after'); 265 assert_array_equals( 266 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 267 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 268 assert_array_equals( 269 await getSortedDirectoryEntries(dir_dest), ['file-after']); 270 }, 'move(dir, name) while the file has an open writable fails'); 271 272 directory_test(async (t, root) => { 273 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 274 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 275 const file = await createFileWithContents('file', 'abc', dir_src); 276 const file_dest = await createFileWithContents('file', '123', dir_dest); 277 278 // Cannot overwrite handle with an active writable. 279 const stream = await cleanup_writable(t, await file_dest.createWritable()); 280 await promise_rejects_dom(t, 'NoModificationAllowedError', file.move(dir_dest)); 281 282 assert_array_equals( 283 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 284 // Assert the file is still in the source directory. 285 assert_array_equals(await getSortedDirectoryEntries(dir_src), ['file']); 286 287 await stream.close(); 288 assert_array_equals(await getSortedDirectoryEntries(dir_dest), ['file']); 289 }, 'move(dir) while the destination file has an open writable fails'); 290 291 directory_test(async (t, root) => { 292 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 293 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 294 const file = await createFileWithContents('file', 'abc', dir_src); 295 const file_dest = await createFileWithContents('file', '123', dir_dest); 296 297 await file.move(dir_dest); 298 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 299 assert_array_equals(await getSortedDirectoryEntries(dir_dest), ['file']); 300 assert_equals(await getFileContents(file), 'abc'); 301 assert_equals(await getFileContents(file_dest), 'abc'); 302 }, 'move(dir) can overwrite an existing file'); 303 304 directory_test(async (t, root) => { 305 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 306 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 307 const file = await createFileWithContents('file-src', 'abc', dir_src); 308 const file_dest = await createFileWithContents('file-dest', '123', dir_dest); 309 310 // Cannot overwrite handle with an active writable. 311 const stream = await cleanup_writable(t, await file_dest.createWritable()); 312 await promise_rejects_dom( 313 t, 'NoModificationAllowedError', file.move(dir_dest, 'file-dest')); 314 315 assert_array_equals( 316 await getSortedDirectoryEntries(root), ['dir-dest/', 'dir-src/']); 317 // Assert the file is still in the source directory. 318 assert_array_equals(await getSortedDirectoryEntries(dir_src), ['file-src']); 319 320 await stream.close(); 321 assert_array_equals(await getSortedDirectoryEntries(dir_dest), ['file-dest']); 322 }, 'move(dir, name) while the destination file has an open writable fails'); 323 324 directory_test(async (t, root) => { 325 const dir_src = await root.getDirectoryHandle('dir-src', {create: true}); 326 const dir_dest = await root.getDirectoryHandle('dir-dest', {create: true}); 327 const file = await createFileWithContents('file-src', 'abc', dir_src); 328 const file_dest = await createFileWithContents('file-dest', '123', dir_dest); 329 330 await file.move(dir_dest, 'file-dest'); 331 332 // Assert the file has been moved to the destination directory and renamed. 333 assert_array_equals(await getSortedDirectoryEntries(dir_src), []); 334 assert_array_equals(await getSortedDirectoryEntries(dir_dest), ['file-dest']); 335 assert_equals(await getFileContents(file), 'abc'); 336 assert_equals(await getFileContents(file_dest), 'abc'); 337 }, 'move(dir, name) can overwrite an existing file'); 338 339 directory_test(async (t, root) => { 340 const handle = await createFileWithContents('file-to-move', '12345', root); 341 const handle2 = handle; 342 343 await handle.move('file-was-moved'); 344 345 assert_equals(await getFileContents(handle), '12345'); 346 assert_equals(await getFileSize(handle), 5); 347 assert_equals(await getFileContents(handle2), '12345'); 348 assert_equals(await getFileSize(handle2), 5); 349 350 assert_array_equals( 351 await getSortedDirectoryEntries(root), ['file-was-moved']); 352 }, 'FileSystemFileHandles are references, not paths');