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