|
704 | 704 | getDropFiles: function (evt, callback){
|
705 | 705 | var
|
706 | 706 | files = []
|
707 |
| - , items = [] |
| 707 | + , all = [] |
| 708 | + , items |
708 | 709 | , dataTransfer = _getDataTransfer(evt)
|
709 | 710 | , transFiles = dataTransfer.files
|
710 | 711 | , transItems = dataTransfer.items
|
711 | 712 | , entrySupport = _isArray(transItems) && transItems[0] && _getAsEntry(transItems[0])
|
712 |
| - , queue = api.queue(function (){ callback(files); }) |
| 713 | + , queue = api.queue(function (){ callback(files, all); }) |
713 | 714 | ;
|
714 | 715 |
|
715 | 716 | if( entrySupport ){
|
|
735 | 736 | if( _isEntry(entry) ){
|
736 | 737 | // OSX filesystems use Unicode Normalization Form D (NFD),
|
737 | 738 | // and entry.file(…) can't read the files with the same names
|
738 |
| - if ( entry.isDirectory || (entry.isFile && file.name == file.name.normalize('NFC')) ) { |
| 739 | + if( entry.isDirectory || (entry.isFile && file.name == file.name.normalize('NFC')) ){ |
739 | 740 | items[i] = entry;
|
740 |
| - } else { |
| 741 | + } |
| 742 | + else { |
741 | 743 | items[i] = file;
|
742 | 744 | }
|
743 | 745 | }
|
|
754 | 756 | items = transFiles;
|
755 | 757 | }
|
756 | 758 |
|
757 |
| - _each(items, function (item){ |
| 759 | + _each(items || [], function (item){ |
758 | 760 | queue.inc();
|
759 | 761 |
|
760 | 762 | try {
|
761 | 763 | if( entrySupport && _isEntry(item) ){
|
762 |
| - _readEntryAsFiles(item, function (err, entryFiles){ |
| 764 | + _readEntryAsFiles(item, function (err, entryFiles, allEntries){ |
763 | 765 | if( err ){
|
764 | 766 | api.log('[err] getDropFiles:', err);
|
765 | 767 | } else {
|
766 | 768 | files.push.apply(files, entryFiles);
|
767 | 769 | }
|
| 770 | + all.push.apply(all, allEntries); |
| 771 | + |
768 | 772 | queue.next();
|
769 | 773 | });
|
770 | 774 | }
|
771 | 775 | else {
|
772 |
| - _isRegularFile(item, function (yes){ |
773 |
| - yes && files.push(item); |
| 776 | + _isRegularFile(item, function (yes, err){ |
| 777 | + if( yes ){ |
| 778 | + files.push(item); |
| 779 | + } |
| 780 | + else { |
| 781 | + item.error = err; |
| 782 | + } |
| 783 | + all.push(item); |
| 784 | + |
774 | 785 | queue.next();
|
775 | 786 | });
|
776 | 787 | }
|
|
1494 | 1505 | if( !file.type && (safari || ((file.size % 4096) === 0 && (file.size <= 102400))) ){
|
1495 | 1506 | if( FileReader ){
|
1496 | 1507 | try {
|
1497 |
| - var Reader = new FileReader(); |
| 1508 | + var reader = new FileReader(); |
1498 | 1509 |
|
1499 |
| - _one(Reader, _readerEvents, function (evt){ |
| 1510 | + _one(reader, _readerEvents, function (evt){ |
1500 | 1511 | var isFile = evt.type != 'error';
|
1501 |
| - callback(isFile); |
1502 | 1512 | if( isFile ){
|
1503 |
| - Reader.abort(); |
| 1513 | + reader.abort(); |
| 1514 | + callback(isFile); |
| 1515 | + } |
| 1516 | + else { |
| 1517 | + callback(false, reader.error); |
1504 | 1518 | }
|
1505 | 1519 | });
|
1506 | 1520 |
|
1507 |
| - Reader.readAsDataURL(file); |
| 1521 | + reader.readAsDataURL(file); |
1508 | 1522 | } catch( err ){
|
1509 |
| - callback(false); |
| 1523 | + callback(false, err); |
1510 | 1524 | }
|
1511 | 1525 | }
|
1512 | 1526 | else {
|
1513 |
| - callback(null); |
| 1527 | + callback(null, new Error('FileReader is not supported')); |
1514 | 1528 | }
|
1515 | 1529 | }
|
1516 | 1530 | else {
|
|
1535 | 1549 | function _readEntryAsFiles(entry, callback){
|
1536 | 1550 | if( !entry ){
|
1537 | 1551 | // error
|
1538 |
| - callback('invalid entry'); |
| 1552 | + var err = new Error('invalid entry'); |
| 1553 | + entry = new Object(entry); |
| 1554 | + entry.error = err; |
| 1555 | + callback(err.message, [], [entry]); |
1539 | 1556 | }
|
1540 | 1557 | else if( entry.isFile ){
|
1541 | 1558 | // Read as file
|
1542 |
| - entry.file(function(file){ |
| 1559 | + entry.file(function (file){ |
1543 | 1560 | // success
|
1544 | 1561 | file.fullPath = entry.fullPath;
|
1545 |
| - callback(false, [file]); |
| 1562 | + callback(false, [file], [file]); |
1546 | 1563 | }, function (err){
|
1547 | 1564 | // error
|
1548 |
| - callback('FileError.code: '+err.code); |
| 1565 | + entry.error = err; |
| 1566 | + callback('FileError.code: ' + err.code, [], [entry]); |
1549 | 1567 | });
|
1550 | 1568 | }
|
1551 | 1569 | else if( entry.isDirectory ){
|
1552 |
| - var reader = entry.createReader(), result = []; |
1553 |
| - |
1554 |
| - var onerror = function() { |
| 1570 | + var |
| 1571 | + reader = entry.createReader() |
| 1572 | + , firstAttempt = true |
| 1573 | + , files = [] |
| 1574 | + , all = [entry] |
| 1575 | + ; |
| 1576 | + |
| 1577 | + var onerror = function (err){ |
1555 | 1578 | // error
|
1556 |
| - callback('directory_reader'); |
| 1579 | + entry.error = err; |
| 1580 | + callback('DirectoryError.code: ' + err.code, files, all); |
1557 | 1581 | };
|
1558 |
| - var ondone = function ondone(entries) { |
| 1582 | + var ondone = function ondone(entries){ |
| 1583 | + if( firstAttempt ){ |
| 1584 | + firstAttempt = false; |
| 1585 | + if( !entries.length ){ |
| 1586 | + entry.error = new Error('directory is empty'); |
| 1587 | + } |
| 1588 | + } |
| 1589 | + |
1559 | 1590 | // success
|
1560 |
| - if ( entries.length ) { |
| 1591 | + if( entries.length ){ |
1561 | 1592 | api.afor(entries, function (next, entry){
|
1562 |
| - _readEntryAsFiles(entry, function (err, files){ |
| 1593 | + _readEntryAsFiles(entry, function (err, entryFiles, allEntries){ |
1563 | 1594 | if( !err ){
|
1564 |
| - result = result.concat(files); |
| 1595 | + files = files.concat(entryFiles); |
1565 | 1596 | }
|
| 1597 | + all = all.concat(allEntries); |
1566 | 1598 |
|
1567 | 1599 | if( next ){
|
1568 | 1600 | next();
|
|
1574 | 1606 | });
|
1575 | 1607 | }
|
1576 | 1608 | else {
|
1577 |
| - callback(false, result); |
| 1609 | + callback(false, files, all); |
1578 | 1610 | }
|
1579 | 1611 | };
|
1580 | 1612 |
|
|
0 commit comments