|
41 | 41 |
|
42 | 42 | var lastFocused; |
43 | 43 |
|
| 44 | + var errLacksMkdir = new Error("mkdir permission is not enabled") |
| 45 | + |
44 | 46 | function enableFilter() { |
45 | 47 | var filter = document.body.querySelector('.filter'); |
46 | 48 | if (!filter) return; |
|
432 | 434 |
|
433 | 435 | function enhanceUpload() { |
434 | 436 | var upload = document.body.querySelector('.upload'); |
435 | | - if (!upload) { |
436 | | - return; |
437 | | - } |
| 437 | + if (!upload) return; |
| 438 | + |
438 | 439 | var form = upload.querySelector('form'); |
439 | | - if (!form) { |
440 | | - return; |
441 | | - } |
| 440 | + if (!form) return; |
| 441 | + |
442 | 442 | var fileInput = form.querySelector('.file'); |
443 | | - if (!fileInput) { |
444 | | - return; |
445 | | - } |
| 443 | + if (!fileInput) return; |
446 | 444 |
|
447 | 445 | var uploadType = document.body.querySelector('.upload-type'); |
448 | | - if (!uploadType) { |
449 | | - return; |
450 | | - } |
| 446 | + if (!uploadType) return; |
451 | 447 |
|
452 | 448 | var file = 'file'; |
453 | 449 | var dirFile = 'dirfile'; |
|
476 | 472 | var handleKindFile = 'file'; |
477 | 473 | var handleKindDir = 'directory'; |
478 | 474 | var permDescriptor = {mode: 'read'}; |
479 | | - itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) { |
| 475 | + itemsToFiles = function (dataTransferItems, canMkdir) { |
480 | 476 | function resultsToFiles(results, files, dirPath) { |
481 | 477 | return Promise.all(results.map(function (result) { |
482 | 478 | var handle = result.value; |
|
524 | 520 | var files = []; |
525 | 521 | var hasDir = false; |
526 | 522 |
|
527 | | - var items = Array.prototype.slice.call(dataTransferItems); |
528 | | - Promise.all(items.map(function (item) { |
| 523 | + return Promise.all(Array.from(dataTransferItems).map(function (item) { |
529 | 524 | return item.getAsFileSystemHandle(); |
530 | 525 | })).then(function (handles) { |
531 | 526 | handles = handles.filter(Boolean); // undefined for pasted content |
532 | 527 | hasDir = handles.some(function (handle) { |
533 | 528 | return handle.kind === handleKindDir; |
534 | 529 | }); |
535 | 530 | if (hasDir && !canMkdir) { |
536 | | - return onLacksMkdir(); |
| 531 | + throw errLacksMkdir; |
537 | 532 | } |
538 | 533 | var handleResults = handles.map(function (handle) { |
539 | 534 | return {value: handle, done: false}; |
540 | 535 | }); |
541 | | - resultsToFiles(handleResults, files, '').then(function () { |
542 | | - onDone(files, hasDir); |
| 536 | + return resultsToFiles(handleResults, files, '').then(function () { |
| 537 | + return {files: files, hasDir: hasDir}; |
543 | 538 | }); |
544 | 539 | }); |
545 | 540 | } |
546 | 541 | } else { |
547 | | - itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) { |
548 | | - function entriesToFiles(entries, files, onLevelDone) { |
549 | | - var len = entries.length; |
550 | | - var cb = 0; |
551 | | - if (!len) return onLevelDone(); |
552 | | - |
553 | | - function increaseCb() { |
554 | | - cb++; |
555 | | - if (cb === len) { |
556 | | - onLevelDone(); |
557 | | - } |
558 | | - } |
559 | | - |
560 | | - function dirReaderToFiles(dirReader, files, onAllRead) { |
561 | | - dirReader.readEntries(function (subEntries) { |
562 | | - if (!subEntries.length) return onAllRead(); |
563 | | - entriesToFiles(subEntries, files, function () { |
564 | | - dirReaderToFiles(dirReader, files, onAllRead); |
565 | | - }); |
566 | | - }, onAllRead); |
567 | | - } |
568 | | - |
569 | | - entries.forEach(function (entry) { |
570 | | - if (entry.isFile) { |
571 | | - var relativePath = entry.fullPath; |
572 | | - if (relativePath[0] === '/') { |
573 | | - relativePath = relativePath.substring(1); |
| 542 | + itemsToFiles = function (dataTransferItems, canMkdir) { |
| 543 | + function entriesToFiles(entries, files) { |
| 544 | + return Promise.all(entries.map(function (entry) { |
| 545 | + return new Promise(function (resolve) { |
| 546 | + if (entry.isFile) { |
| 547 | + var relativePath = entry.fullPath; |
| 548 | + if (relativePath[0] === '/') { |
| 549 | + relativePath = relativePath.slice(1); |
| 550 | + } |
| 551 | + entry.file(function (file) { |
| 552 | + files.push({file: file, relativePath: relativePath}); |
| 553 | + resolve(); |
| 554 | + }, function (err) { |
| 555 | + logError(err); |
| 556 | + resolve() |
| 557 | + }); |
| 558 | + } else if (entry.isDirectory) { |
| 559 | + var dirReader = entry.createReader() |
| 560 | + var onReadSubEntries = function (subEntries) { |
| 561 | + if (!subEntries.length) resolve(); |
| 562 | + entriesToFiles(subEntries, files).then(function () { |
| 563 | + dirReader.readEntries(onReadSubEntries); |
| 564 | + }); |
| 565 | + } |
| 566 | + dirReader.readEntries(onReadSubEntries); |
574 | 567 | } |
575 | | - entry.file(function (file) { |
576 | | - files.push({file: file, relativePath: relativePath}); |
577 | | - increaseCb(); |
578 | | - }, function (err) { |
579 | | - increaseCb(); |
580 | | - logError(err); |
581 | | - }); |
582 | | - } else if (entry.isDirectory) { |
583 | | - var dirReader = entry.createReader(); |
584 | | - dirReaderToFiles(dirReader, files, increaseCb); |
585 | | - } |
586 | | - }); |
| 568 | + }) |
| 569 | + })); |
587 | 570 | } |
588 | 571 |
|
| 572 | + var entries = []; |
589 | 573 | var files = []; |
590 | 574 | var hasDir = false; |
591 | 575 |
|
592 | | - var entries = []; |
593 | | - for (var i = 0, len = dataTransferItems.length; i < len; i++) { |
| 576 | + for (var i = 0; i < dataTransferItems.length; i++) { |
594 | 577 | var item = dataTransferItems[i]; |
595 | 578 | var entry = item.webkitGetAsEntry(); |
596 | 579 | if (!entry) { // undefined for pasted text |
|
606 | 589 | if (canMkdir) { |
607 | 590 | entries.push(entry); |
608 | 591 | } else { |
609 | | - return onLacksMkdir(); |
| 592 | + return Promise.reject(errLacksMkdir); |
610 | 593 | } |
611 | 594 | } |
612 | 595 | } |
613 | 596 |
|
614 | | - entriesToFiles(entries, files, function () { |
615 | | - onDone(files, hasDir); |
| 597 | + return entriesToFiles(entries, files).then(function () { |
| 598 | + return {files: files, hasDir: hasDir}; |
616 | 599 | }); |
617 | 600 | } |
618 | 601 | } |
619 | 602 |
|
620 | | - function dataTransferToFiles(dataTransfer, canMkdir, onDone, onLacksMkdir) { |
621 | | - itemsToFiles(dataTransfer.items, canMkdir, function (files, hasDir) { |
622 | | - // ancient Browser |
623 | | - if (files.length === 0 && dataTransfer.files && dataTransfer.files.length) { |
624 | | - files = Array.prototype.slice.call(dataTransfer.files); |
625 | | - } |
626 | | - onDone(files, hasDir); |
627 | | - }, onLacksMkdir); |
628 | | - } |
629 | | - |
630 | 603 | var switchToFileMode = noop; |
631 | 604 | var switchToDirMode = noop; |
632 | 605 |
|
|
916 | 889 | return; |
917 | 890 | } |
918 | 891 |
|
919 | | - dataTransferToFiles(e.dataTransfer, canMkdir, function (files, hasDir) { |
920 | | - if (hasDir) { |
| 892 | + itemsToFiles(e.dataTransfer.items, canMkdir).then(function (result) { |
| 893 | + var files = result.files; |
| 894 | + if (result.hasDir) { |
921 | 895 | switchToDirMode(); |
922 | 896 | uploadProgressively(files); |
923 | 897 | } else { |
924 | 898 | switchToFileMode(); |
925 | 899 | uploadProgressively(files); |
926 | 900 | } |
927 | | - }, function () { |
928 | | - typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage(); |
| 901 | + }, function (err) { |
| 902 | + if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) { |
| 903 | + showUploadDirFailMessage(); |
| 904 | + } |
929 | 905 | }); |
930 | 906 | } |
931 | 907 |
|
|
1015 | 991 | return; |
1016 | 992 | } |
1017 | 993 |
|
1018 | | - itemsToFiles(items, canMkdir, function (files, hasDir) { |
| 994 | + itemsToFiles(items, canMkdir).then(function (result) { |
| 995 | + var files = result.files; |
1019 | 996 | // for pasted text |
1020 | 997 | if (!files.length) { |
1021 | 998 | generatePastedFiles(data); |
|
1032 | 1009 | } |
1033 | 1010 |
|
1034 | 1011 | // pasted real files |
1035 | | - if (hasDir) { |
| 1012 | + if (result.hasDir) { |
1036 | 1013 | switchToDirMode(); |
1037 | 1014 | } else { |
1038 | 1015 | switchToFileMode(); |
1039 | 1016 | } |
1040 | 1017 | uploadProgressively(files); |
1041 | | - }, function () { |
1042 | | - typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage(); |
| 1018 | + }, function (err) { |
| 1019 | + if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) { |
| 1020 | + showUploadDirFailMessage(); |
| 1021 | + } |
1043 | 1022 | }); |
1044 | 1023 | }); |
1045 | 1024 | } |
|
0 commit comments