|
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;
|
|
523 | 519 |
|
524 | 520 | var files = [];
|
525 | 521 | var hasDir = false;
|
526 |
| - if (!dataTransferItems || !dataTransferItems.length) return onDone(files, hasDir); |
527 | 522 |
|
528 |
| - var items = Array.prototype.slice.call(dataTransferItems); |
529 |
| - Promise.all(items.map(function (item) { |
| 523 | + return Promise.all(Array.from(dataTransferItems).map(function (item) { |
530 | 524 | return item.getAsFileSystemHandle();
|
531 | 525 | })).then(function (handles) {
|
532 | 526 | handles = handles.filter(Boolean); // undefined for pasted content
|
533 | 527 | hasDir = handles.some(function (handle) {
|
534 | 528 | return handle.kind === handleKindDir;
|
535 | 529 | });
|
536 | 530 | if (hasDir && !canMkdir) {
|
537 |
| - return onLacksMkdir(); |
| 531 | + throw errLacksMkdir; |
538 | 532 | }
|
539 | 533 | var handleResults = handles.map(function (handle) {
|
540 | 534 | return {value: handle, done: false};
|
541 | 535 | });
|
542 |
| - resultsToFiles(handleResults, files, '').then(function () { |
543 |
| - onDone(files, hasDir); |
| 536 | + return resultsToFiles(handleResults, files, '').then(function () { |
| 537 | + return {files: files, hasDir: hasDir}; |
544 | 538 | });
|
545 | 539 | });
|
546 | 540 | }
|
547 | 541 | } else {
|
548 |
| - itemsToFiles = function (dataTransferItems, canMkdir, onDone, onLacksMkdir) { |
549 |
| - function entriesToFiles(entries, files, onLevelDone) { |
550 |
| - var len = entries.length; |
551 |
| - var cb = 0; |
552 |
| - if (!len) return onLevelDone(); |
553 |
| - |
554 |
| - function increaseCb() { |
555 |
| - cb++; |
556 |
| - if (cb === len) { |
557 |
| - onLevelDone(); |
558 |
| - } |
559 |
| - } |
560 |
| - |
561 |
| - function dirReaderToFiles(dirReader, files, onAllRead) { |
562 |
| - dirReader.readEntries(function (subEntries) { |
563 |
| - if (!subEntries.length) return onAllRead(); |
564 |
| - entriesToFiles(subEntries, files, function () { |
565 |
| - dirReaderToFiles(dirReader, files, onAllRead); |
566 |
| - }); |
567 |
| - }, onAllRead); |
568 |
| - } |
569 |
| - |
570 |
| - entries.forEach(function (entry) { |
571 |
| - if (entry.isFile) { |
572 |
| - var relativePath = entry.fullPath; |
573 |
| - if (relativePath[0] === '/') { |
574 |
| - 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 | + entry.createReader().readEntries(function (subEntries) { |
| 560 | + entriesToFiles(subEntries, files).then(resolve); |
| 561 | + }); |
575 | 562 | }
|
576 |
| - entry.file(function (file) { |
577 |
| - files.push({file: file, relativePath: relativePath}); |
578 |
| - increaseCb(); |
579 |
| - }, function (err) { |
580 |
| - increaseCb(); |
581 |
| - logError(err); |
582 |
| - }); |
583 |
| - } else if (entry.isDirectory) { |
584 |
| - var dirReader = entry.createReader(); |
585 |
| - dirReaderToFiles(dirReader, files, increaseCb); |
586 |
| - } |
587 |
| - }); |
| 563 | + }) |
| 564 | + })); |
588 | 565 | }
|
589 | 566 |
|
590 | 567 | var files = [];
|
591 | 568 | var hasDir = false;
|
592 |
| - if (!dataTransferItems || !dataTransferItems.length || !dataTransferItems[0].webkitGetAsEntry) return onDone(files, hasDir); |
593 | 569 |
|
594 | 570 | var entries = [];
|
595 |
| - for (var i = 0, len = dataTransferItems.length; i < len; i++) { |
| 571 | + for (var i = 0; i < dataTransferItems.length; i++) { |
596 | 572 | var item = dataTransferItems[i];
|
597 | 573 | var entry = item.webkitGetAsEntry();
|
598 | 574 | if (!entry) { // undefined for pasted text
|
|
608 | 584 | if (canMkdir) {
|
609 | 585 | entries.push(entry);
|
610 | 586 | } else {
|
611 |
| - return onLacksMkdir(); |
| 587 | + throw errLacksMkdir; |
612 | 588 | }
|
613 | 589 | }
|
614 | 590 | }
|
615 | 591 |
|
616 |
| - entriesToFiles(entries, files, function () { |
617 |
| - onDone(files, hasDir); |
| 592 | + return entriesToFiles(entries, files).then(function () { |
| 593 | + return {files: files, hasDir: hasDir}; |
618 | 594 | });
|
619 | 595 | }
|
620 | 596 | }
|
621 | 597 |
|
622 |
| - function dataTransferToFiles(dataTransfer, canMkdir, onDone, onLacksMkdir) { |
623 |
| - itemsToFiles(dataTransfer.items, canMkdir, function (files, hasDir) { |
624 |
| - // ancient Browser |
625 |
| - if (files.length === 0 && dataTransfer.files && dataTransfer.files.length) { |
626 |
| - files = Array.prototype.slice.call(dataTransfer.files); |
627 |
| - } |
628 |
| - onDone(files, hasDir); |
629 |
| - }, onLacksMkdir); |
630 |
| - } |
631 |
| - |
632 | 598 | var switchToFileMode = noop;
|
633 | 599 | var switchToDirMode = noop;
|
634 | 600 |
|
|
926 | 892 | return;
|
927 | 893 | }
|
928 | 894 |
|
929 |
| - dataTransferToFiles(e.dataTransfer, canMkdir && Boolean(uploadProgressively), function (files, hasDir) { |
930 |
| - if (hasDir) { |
| 895 | + itemsToFiles(e.dataTransfer.items, canMkdir && Boolean(uploadProgressively)).then(function (result) { |
| 896 | + var files = result.files; |
| 897 | + if (result.hasDir) { |
931 | 898 | switchToDirMode();
|
932 | 899 | uploadProgressively(files);
|
933 | 900 | } else {
|
|
939 | 906 | form.submit();
|
940 | 907 | }
|
941 | 908 | }
|
942 |
| - }, function () { |
943 |
| - typeof showUploadDirFailMessage !== strUndef && showUploadDirFailMessage(); |
| 909 | + }, function (err) { |
| 910 | + if (err === errLacksMkdir && typeof showUploadDirFailMessage !== strUndef) { |
| 911 | + showUploadDirFailMessage(); |
| 912 | + } |
944 | 913 | });
|
945 | 914 | }
|
946 | 915 |
|
|
0 commit comments