Skip to content

Commit fbbffea

Browse files
committed
Merge pull request mailru#321 from Octane/hotfixes
fix mailru/FileAPI#318 store all dropped items
2 parents d7db788 + 38350b2 commit fbbffea

File tree

1 file changed

+60
-28
lines changed

1 file changed

+60
-28
lines changed

lib/FileAPI.core.js

Lines changed: 60 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -704,12 +704,13 @@
704704
getDropFiles: function (evt, callback){
705705
var
706706
files = []
707-
, items = []
707+
, all = []
708+
, items
708709
, dataTransfer = _getDataTransfer(evt)
709710
, transFiles = dataTransfer.files
710711
, transItems = dataTransfer.items
711712
, entrySupport = _isArray(transItems) && transItems[0] && _getAsEntry(transItems[0])
712-
, queue = api.queue(function (){ callback(files); })
713+
, queue = api.queue(function (){ callback(files, all); })
713714
;
714715

715716
if( entrySupport ){
@@ -735,9 +736,10 @@
735736
if( _isEntry(entry) ){
736737
// OSX filesystems use Unicode Normalization Form D (NFD),
737738
// 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')) ){
739740
items[i] = entry;
740-
} else {
741+
}
742+
else {
741743
items[i] = file;
742744
}
743745
}
@@ -754,23 +756,32 @@
754756
items = transFiles;
755757
}
756758

757-
_each(items, function (item){
759+
_each(items || [], function (item){
758760
queue.inc();
759761

760762
try {
761763
if( entrySupport && _isEntry(item) ){
762-
_readEntryAsFiles(item, function (err, entryFiles){
764+
_readEntryAsFiles(item, function (err, entryFiles, allEntries){
763765
if( err ){
764766
api.log('[err] getDropFiles:', err);
765767
} else {
766768
files.push.apply(files, entryFiles);
767769
}
770+
all.push.apply(all, allEntries);
771+
768772
queue.next();
769773
});
770774
}
771775
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+
774785
queue.next();
775786
});
776787
}
@@ -1494,23 +1505,26 @@
14941505
if( !file.type && (safari || ((file.size % 4096) === 0 && (file.size <= 102400))) ){
14951506
if( FileReader ){
14961507
try {
1497-
var Reader = new FileReader();
1508+
var reader = new FileReader();
14981509

1499-
_one(Reader, _readerEvents, function (evt){
1510+
_one(reader, _readerEvents, function (evt){
15001511
var isFile = evt.type != 'error';
1501-
callback(isFile);
15021512
if( isFile ){
1503-
Reader.abort();
1513+
reader.abort();
1514+
callback(isFile);
1515+
}
1516+
else {
1517+
callback(false, reader.error);
15041518
}
15051519
});
15061520

1507-
Reader.readAsDataURL(file);
1521+
reader.readAsDataURL(file);
15081522
} catch( err ){
1509-
callback(false);
1523+
callback(false, err);
15101524
}
15111525
}
15121526
else {
1513-
callback(null);
1527+
callback(null, new Error('FileReader is not supported'));
15141528
}
15151529
}
15161530
else {
@@ -1535,34 +1549,52 @@
15351549
function _readEntryAsFiles(entry, callback){
15361550
if( !entry ){
15371551
// 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]);
15391556
}
15401557
else if( entry.isFile ){
15411558
// Read as file
1542-
entry.file(function(file){
1559+
entry.file(function (file){
15431560
// success
15441561
file.fullPath = entry.fullPath;
1545-
callback(false, [file]);
1562+
callback(false, [file], [file]);
15461563
}, function (err){
15471564
// error
1548-
callback('FileError.code: '+err.code);
1565+
entry.error = err;
1566+
callback('FileError.code: ' + err.code, [], [entry]);
15491567
});
15501568
}
15511569
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){
15551578
// error
1556-
callback('directory_reader');
1579+
entry.error = err;
1580+
callback('DirectoryError.code: ' + err.code, files, all);
15571581
};
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+
15591590
// success
1560-
if ( entries.length ) {
1591+
if( entries.length ){
15611592
api.afor(entries, function (next, entry){
1562-
_readEntryAsFiles(entry, function (err, files){
1593+
_readEntryAsFiles(entry, function (err, entryFiles, allEntries){
15631594
if( !err ){
1564-
result = result.concat(files);
1595+
files = files.concat(entryFiles);
15651596
}
1597+
all = all.concat(allEntries);
15661598

15671599
if( next ){
15681600
next();
@@ -1574,7 +1606,7 @@
15741606
});
15751607
}
15761608
else {
1577-
callback(false, result);
1609+
callback(false, files, all);
15781610
}
15791611
};
15801612

0 commit comments

Comments
 (0)