|
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 && Boolean(uploadProgressively), function (files, hasDir) { |
920 |
| - if (hasDir) { |
| 892 | + itemsToFiles(e.dataTransfer.items, canMkdir && Boolean(uploadProgressively)).then(function (result) { |
| 893 | + var files = result.files; |
| 894 | + if (result.hasDir) { |
921 | 895 | switchToDirMode();
|
922 | 896 | uploadProgressively(files);
|
923 | 897 | } else {
|
|
929 | 903 | form.submit();
|
930 | 904 | }
|
931 | 905 | }
|
932 |
| - }, function () { |
933 |
| - typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage(); |
| 906 | + }, function (err) { |
| 907 | + if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) { |
| 908 | + showUploadDirFailMessage(); |
| 909 | + } |
934 | 910 | });
|
935 | 911 | }
|
936 | 912 |
|
|
1023 | 999 | return;
|
1024 | 1000 | }
|
1025 | 1001 |
|
1026 |
| - itemsToFiles(items, canMkdir, function (files, hasDir) { |
| 1002 | + itemsToFiles(items, canMkdir).then(function (result) { |
| 1003 | + var files = result.files; |
1027 | 1004 | // for pasted text
|
1028 | 1005 | if (!files.length) {
|
1029 | 1006 | generatePastedFiles(data);
|
|
1040 | 1017 | }
|
1041 | 1018 |
|
1042 | 1019 | // pasted real files
|
1043 |
| - if (hasDir) { |
| 1020 | + if (result.hasDir) { |
1044 | 1021 | switchToDirMode();
|
1045 | 1022 | } else {
|
1046 | 1023 | switchToFileMode();
|
1047 | 1024 | }
|
1048 | 1025 | uploadProgressively(files);
|
1049 |
| - }, function () { |
1050 |
| - typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage(); |
| 1026 | + }, function (err) { |
| 1027 | + if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) { |
| 1028 | + showUploadDirFailMessage(); |
| 1029 | + } |
1051 | 1030 | });
|
1052 | 1031 | });
|
1053 | 1032 | }
|
|
0 commit comments