tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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');