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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy