Skip to content

Commit 7efe112

Browse files
committed
Always open dropped files if possible
1 parent 21e91f1 commit 7efe112

File tree

6 files changed

+90
-106
lines changed

6 files changed

+90
-106
lines changed

src/filesystem/impls/filer/ArchiveUtils.js

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ define(function (require, exports, module) {
5555
return false;
5656
}
5757

58-
function _refreshFilesystem(callback) {
58+
function _refreshFileTree(callback) {
5959
// Update the file tree to show the new files
6060
CommandManager.execute(Commands.FILE_REFRESH).always(callback);
6161
}
@@ -108,6 +108,10 @@ define(function (require, exports, module) {
108108
function decompress(path, callback) {
109109
var basedir = Path.dirname(path.absPath);
110110

111+
function writeFile() {
112+
FilerUtils.writeFileAsBinary(path.absPath, path.data, callback);
113+
}
114+
111115
if(path.isDirectory) {
112116
fs.mkdirp(path.absPath, callback);
113117
} else {
@@ -124,10 +128,10 @@ define(function (require, exports, module) {
124128
return callback(err);
125129
}
126130

127-
FilerUtils.writeFileAsBinary(path.absPath, path.data, callback);
131+
writeFile();
128132
});
129133
} else {
130-
FilerUtils.writeFileAsBinary(path.absPath, path.data, callback);
134+
writeFile();
131135
}
132136
});
133137
}
@@ -138,7 +142,7 @@ define(function (require, exports, module) {
138142
return callback(err);
139143
}
140144

141-
_refreshFilesystem(function(err) {
145+
_refreshFileTree(function(err) {
142146
if(err) {
143147
return callback(err);
144148
}
@@ -147,7 +151,8 @@ define(function (require, exports, module) {
147151
DefaultDialogs.DIALOG_ID_INFO,
148152
Strings.DND_SUCCESS_UNZIP_TITLE
149153
).getPromise().then(function() {
150-
callback(null);
154+
// We don't bother sending a list of files to open for archives.
155+
callback(null, []);
151156
}, callback);
152157
});
153158
});
@@ -272,7 +277,7 @@ define(function (require, exports, module) {
272277
untarWorker.terminate();
273278
untarWorker = null;
274279

275-
_refreshFilesystem(function(err) {
280+
_refreshFileTree(function(err) {
276281
if(err) {
277282
return callback(err);
278283
}
@@ -281,7 +286,8 @@ define(function (require, exports, module) {
281286
DefaultDialogs.DIALOG_ID_INFO,
282287
Strings.DND_SUCCESS_UNTAR_TITLE
283288
).getPromise().then(function() {
284-
callback(null);
289+
// We don't bother sending a list of files to open for archives.
290+
callback(null, []);
285291
}, callback);
286292
});
287293
}

src/filesystem/impls/filer/lib/LegacyFileImport.js

Lines changed: 25 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,9 @@ define(function (require, exports, module) {
3333
FileSystem = require("filesystem/FileSystem"),
3434
FileUtils = require("file/FileUtils"),
3535
Strings = require("strings"),
36-
Filer = require("filesystem/impls/filer/BracketsFiler"),
37-
Path = Filer.Path,
36+
FilerUtils = require("filesystem/impls/filer/FilerUtils"),
37+
Buffer = FilerUtils.Buffer,
38+
Path = FilerUtils.Path,
3839
Content = require("filesystem/impls/filer/lib/content"),
3940
ArchiveUtils = require("filesystem/impls/filer/ArchiveUtils");
4041

@@ -43,64 +44,58 @@ define(function (require, exports, module) {
4344
// We want event.dataTransfer.files for legacy browsers.
4445
LegacyFileImport.prototype.import = function(source, parentPath, callback) {
4546
var files = source instanceof DataTransfer ? source.files : source;
46-
var pathList = [];
47+
var pathsToOpen = [];
4748
var errorList = [];
4849

4950
if (!(files && files.length)) {
50-
return callback();
51+
return callback(null, []);
5152
}
5253

53-
function shouldOpenFile(filename, encoding) {
54-
return Content.isImage(Path.extname(filename)) || encoding === "utf8";
55-
}
56-
57-
function handleRegularFile(deferred, file, filename, buffer, encoding) {
54+
function handleRegularFile(deferred, filename, buffer) {
5855
// Don't write thing like .DS_Store, thumbs.db, etc.
5956
if(ArchiveUtils.skipFile(filename)) {
6057
deferred.resolve();
6158
return;
6259
}
6360

64-
file.write(buffer, {encoding: encoding}, function(err) {
65-
if (err) {
66-
errorList.push({path: filename, error: "unable to write file: " + err.message || ""});
61+
FilerUtils
62+
.writeFileAsBinary(filename, buffer)
63+
.done(function() {
64+
pathsToOpen.push(filename);
65+
deferred.resolve();
66+
})
67+
.fail(function(err) {
68+
errorList.push({path: filename, error: err.message || "unable to write file" });
6769
deferred.reject(err);
68-
return;
69-
}
70-
71-
// See if this file is worth trying to open in the editor or not
72-
if(shouldOpenFile(filename, encoding)) {
73-
pathList.push(filename);
74-
}
75-
76-
deferred.resolve();
77-
});
70+
});
7871
}
7972

8073
function handleZipFile(deferred, file, filename, buffer, encoding) {
8174
var basename = Path.basename(filename);
8275

83-
ArchiveUtils.unzip(buffer, { root: parentPath }, function(err) {
76+
ArchiveUtils.unzip(buffer, { root: parentPath }, function(err, unzippedPaths) {
8477
if (err) {
8578
errorList.push({path: filename, error: Strings.DND_ERROR_UNZIP});
8679
deferred.reject(err);
8780
return;
8881
}
8982

83+
pathsToOpen = pathsToOpen.concat(unzippedPaths);
9084
deferred.resolve();
9185
});
9286
}
9387

9488
function handleTarFile(deferred, file, filename, buffer, encoding) {
9589
var basename = Path.basename(filename);
9690

97-
ArchiveUtils.untar(buffer, { root: parentPath }, function(err) {
91+
ArchiveUtils.untar(buffer, { root: parentPath }, function(err, untarredPaths) {
9892
if (err) {
9993
errorList.push({path: filename, error: Strings.DND_ERROR_UNTAR});
10094
deferred.reject(err);
10195
return;
10296
}
10397

98+
pathsToOpen = pathsToOpen.concat(untarredPaths);
10499
deferred.resolve();
105100
});
106101
}
@@ -156,26 +151,16 @@ define(function (require, exports, module) {
156151
delete reader.onload;
157152

158153
var filename = Path.join(parentPath, item.name);
159-
var file = FileSystem.getFileForPath(filename);
160-
var ext = Path.extname(filename).toLowerCase();
161-
162-
// Create a Filer Buffer, and determine the proper encoding. We
163-
// use the extension, and also the OS provided mime type for clues.
164-
var buffer = new Filer.Buffer(e.target.result);
165-
var utf8FromExt = Content.isUTF8Encoded(ext);
166-
var utf8FromOS = Content.isTextType(item.type);
167-
var encoding = utf8FromExt || utf8FromOS ? 'utf8' : null;
168-
if(encoding === 'utf8') {
169-
buffer = buffer.toString();
170-
}
154+
var ext = FilerUtils.normalizeExtension(Path.extname(filename));
155+
var buffer = new Buffer(e.target.result);
171156

172157
// Special-case .zip files, so we can offer to extract the contents
173158
if(ext === ".zip") {
174-
handleZipFile(deferred, file, filename, buffer, encoding);
159+
handleZipFile(deferred, filename, buffer);
175160
} else if(ext === ".tar") {
176-
handleTarFile(deferred, file, filename, buffer, encoding);
161+
handleTarFile(deferred, filename, buffer);
177162
} else {
178-
handleRegularFile(deferred, file, filename, buffer, encoding);
163+
handleRegularFile(deferred, filename, buffer);
179164
}
180165
};
181166

@@ -193,7 +178,7 @@ define(function (require, exports, module) {
193178

194179
Async.doSequentially(prepareDropPaths(files), maybeImportFile, false)
195180
.done(function() {
196-
callback(null, pathList);
181+
callback(null, pathsToOpen);
197182
})
198183
.fail(function() {
199184
callback(errorList);

src/filesystem/impls/filer/lib/WebKitFileImport.js

Lines changed: 26 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ define(function (require, exports, module) {
3232
Async = require("utils/Async"),
3333
FileSystem = require("filesystem/FileSystem"),
3434
FileUtils = require("file/FileUtils"),
35+
FilerUtils = require("filesystem/impls/filer/FilerUtils"),
36+
Path = FilerUtils.Path,
37+
Buffer = FilerUtils.Buffer,
3538
Strings = require("strings"),
36-
Filer = require("filesystem/impls/filer/BracketsFiler"),
37-
Path = Filer.Path,
3839
Content = require("filesystem/impls/filer/lib/content"),
3940
ArchiveUtils = require("filesystem/impls/filer/ArchiveUtils");
4041

@@ -43,25 +44,21 @@ define(function (require, exports, module) {
4344
// We want event.dataTransfer.items for WebKit style browsers
4445
WebKitFileImport.prototype.import = function(source, parentPath, callback) {
4546
var items = source instanceof DataTransfer ? source.items : source;
46-
var pathList = [];
47+
var pathsToOpen = [];
4748
var errorList = [];
4849
var started = 0;
4950
var completed = 0;
5051

5152
if (!(items && items.length)) {
52-
return callback();
53-
}
54-
55-
function shouldOpenFile(filename, encoding) {
56-
return Content.isImage(Path.extname(filename)) || encoding === "utf8";
53+
return callback(null, []);
5754
}
5855

5956
function checkDone() {
6057
if(started === completed) {
6158
if(errorList.length) {
6259
callback(errorList);
6360
} else {
64-
callback(null, pathList);
61+
callback(null, pathsToOpen);
6562
}
6663
}
6764
}
@@ -123,44 +120,42 @@ define(function (require, exports, module) {
123120
});
124121
}
125122

126-
function handleRegularFile(deferred, file, filename, buffer, encoding) {
127-
file.write(buffer, {encoding: encoding}, function(err) {
128-
if (err) {
123+
function handleRegularFile(deferred, filename, buffer) {
124+
FilerUtils
125+
.writeFileAsBinary(filename, buffer)
126+
.done(function() {
127+
pathsToOpen.push(filename);
128+
onSuccess(deferred);
129+
})
130+
.fail(function(err) {
129131
onError(deferred, filename, err);
130-
return;
131-
}
132-
133-
// See if this file is worth trying to open in the editor or not
134-
if(shouldOpenFile(filename, encoding)) {
135-
pathList.push(filename);
136-
}
137-
138-
onSuccess(deferred);
139-
});
132+
});
140133
}
141134

142-
function handleZipFile(deferred, file, filename, buffer, encoding) {
135+
function handleZipFile(deferred, filename, buffer) {
143136
var basename = Path.basename(filename);
144137

145-
ArchiveUtils.unzip(buffer, { root: parentPath }, function(err) {
138+
ArchiveUtils.unzip(buffer, { root: parentPath }, function(err, unzippedPaths) {
146139
if (err) {
147140
onError(deferred, filename, new Error(Strings.DND_ERROR_UNZIP));
148141
return;
149142
}
150143

144+
pathsToOpen = pathsToOpen.concat(unzippedPaths);
151145
onSuccess(deferred);
152146
});
153147
}
154148

155-
function handleTarFile(deferred, file, filename, buffer, encoding) {
149+
function handleTarFile(deferred, filename, buffer) {
156150
var basename = Path.basename(filename);
157151

158-
ArchiveUtils.untar(buffer, { root: parentPath }, function(err) {
152+
ArchiveUtils.untar(buffer, { root: parentPath }, function(err, untarredPaths) {
159153
if (err) {
160154
onError(deferred, filename, new Error(Strings.DND_ERROR_UNTAR));
161155
return;
162156
}
163157

158+
pathsToOpen = pathsToOpen.concat(untarredPaths);
164159
onSuccess(deferred);
165160
});
166161
}
@@ -184,16 +179,8 @@ define(function (require, exports, module) {
184179
delete reader.onload;
185180

186181
var filename = Path.join(parentPath, entry.name);
187-
var file = FileSystem.getFileForPath(filename);
188-
var ext = Path.extname(filename).toLowerCase();
189-
190-
// Create a Filer Buffer, and determine the proper encoding.
191-
var buffer = new Filer.Buffer(e.target.result);
192-
var utf8FromExt = Content.isUTF8Encoded(ext);
193-
var encoding = utf8FromExt ? "utf8" : null;
194-
if(utf8FromExt) {
195-
buffer = buffer.toString();
196-
}
182+
var ext = FilerUtils.normalizeExtension(Path.extname(filename));
183+
var buffer = new Buffer(e.target.result);
197184

198185
// Don't bother writing things like .DS_Store, thumbs.db, etc.
199186
if(ArchiveUtils.skipFile(filename)) {
@@ -210,11 +197,11 @@ define(function (require, exports, module) {
210197

211198
// Special-case .zip files, so we can offer to extract the contents
212199
if(ext === ".zip") {
213-
handleZipFile(deferred, file, filename, buffer, encoding);
200+
handleZipFile(deferred, filename, buffer);
214201
} else if(ext === ".tar") {
215-
handleTarFile(deferred, file, filename, buffer, encoding);
202+
handleTarFile(deferred, filename, buffer);
216203
} else {
217-
handleRegularFile(deferred, file, filename, buffer, encoding);
204+
handleRegularFile(deferred, filename, buffer);
218205
}
219206
};
220207

src/filesystem/impls/filer/lib/content.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ define(function (require, exports, module) {
123123
}
124124

125125
module.exports = {
126+
mimeFromExt: function(ext) {
127+
return _lookupMimeType(ext);
128+
},
129+
130+
// Whether or not we can provide a useful editor for this, and should try to open.
131+
isEditable: function(ext) {
132+
return this.isUTF8Encoded(ext) ||
133+
this.isImage(ext) ||
134+
this.isAudio(ext) ||
135+
this.isVideo(ext) ||
136+
this.isFont(ext) ||
137+
this.isPDF(ext);
138+
},
139+
126140
isImage: function(ext) {
127141
var info = new FileInfo(ext);
128142
return info.type === "image";
@@ -193,9 +207,6 @@ define(function (require, exports, module) {
193207
}
194208
},
195209

196-
mimeFromExt: function(ext) {
197-
return _lookupMimeType(ext);
198-
},
199210

200211
// Whether or not this is a text/* mime type
201212
isTextType: function(mime) {

0 commit comments

Comments
 (0)