Commit 10061548 authored by benchan@chromium.org's avatar benchan@chromium.org

Make CrOS file manager determine .tar.gz/.tar.bz2 file type properly.

This CL modifies the FileType.getType function in the CrOS file manager
extension to use RegExp patterns to check for the type of a given file
URI, such that it determines .tar.bz and .tar.bz2 properly.

BUG=chromium-os:26952
TEST=Tested the following:
1. Verify that CrOS file manager correctly shows all the file types
   listed in FileType.types.
2. Use the built-in JavaScript profiler to profile FileType.getType
   with 1000 .html files (the last entry in FileType.types), and
   make sure that there is no noticable slowdown in FileType.getType.

Review URL: http://codereview.chromium.org/9478014

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@124027 0039d316-1c4b-4281-b951-d872f2087c98
parent 5c81df10
......@@ -7,62 +7,75 @@
*/
var FileType = {};
FileType.types = {
FileType.types = [
// Images
'jpeg': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'JPEG'},
'jpg': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'JPEG'},
'bmp': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'BMP'},
'gif': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'GIF'},
'ico': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'ICO'},
'png': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'PNG'},
'webp': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'WebP'},
{type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'JPEG',
pattern: /\.jpe?g$/i},
{type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'BMP',
pattern: /\.bmp$/i},
{type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'GIF',
pattern: /\.gif$/i},
{type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'ICO',
pattern: /\.ico$/i},
{type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'PNG',
pattern: /\.png$/i},
{type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'WebP',
pattern: /\.webp$/i},
// Video
'3gp': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: '3GP'},
'avi': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'AVI'},
'mov': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'QuickTime'},
'mp4': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'},
'm4v': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'},
'mpg': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'},
'mpeg': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'},
'mpg4': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'},
'mpeg4': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'},
'ogm': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG'},
'ogv': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG'},
'ogx': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG'},
'webm': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'WebM'},
{type: 'video', name: 'VIDEO_FILE_TYPE', subtype: '3GP',
pattern: /\.3gp$/i},
{type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'AVI',
pattern: /\.avi$/i},
{type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'QuickTime',
pattern: /\.mov$/i},
{type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG',
pattern: /\.m(p4|4v|pg|peg|pg4|peg4)$/i},
{type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG',
pattern: /\.og(m|v|x)$/i},
{type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'WebM',
pattern: /\.webm$/i},
// Audio
'flac': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'FLAC'},
'mp3': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MP3'},
'm4a': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MPEG'},
'oga': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'OGG'},
'ogg': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'OGG'},
'wav': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'WAV'},
{type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'FLAC',
pattern: /\.flac$/i},
{type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MP3',
pattern: /\.mp3$/i},
{type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MPEG',
pattern: /\.m4a$/i},
{type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'OGG',
pattern: /\.og(a|g)$/i},
{type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'WAV',
pattern: /\.wav$/i},
// Text
'pod': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'POD'},
'rst': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'RST'},
'txt': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'TXT'},
'log': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'LOG'},
{type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'POD',
pattern: /\.pod$/i},
{type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'RST',
pattern: /\.rst$/i},
{type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'TXT',
pattern: /\.txt$/i},
{type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'LOG',
pattern: /\.log$/i},
// Others
'zip': {type: 'archive', name: 'ZIP_ARCHIVE_FILE_TYPE'},
'rar': {type: 'archive', name: 'RAR_ARCHIVE_FILE_TYPE'},
'tar': {type: 'archive', name: 'TAR_ARCHIVE_FILE_TYPE'},
'tar.bz2': {type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE'},
'tbz': {type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE'},
'tbz2': {type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE'},
'tar.gz': {type: 'archive', name: 'TAR_GZIP_ARCHIVE_FILE_TYPE'},
'tgz': {type: 'archive', name: 'TAR_GZIP_ARCHIVE_FILE_TYPE'},
// Archive
{type: 'archive', name: 'ZIP_ARCHIVE_FILE_TYPE', subtype:'ZIP',
pattern: /\.zip$/i},
{type: 'archive', name: 'RAR_ARCHIVE_FILE_TYPE', subtype:'RAR',
pattern: /\.rar$/i},
{type: 'archive', name: 'TAR_ARCHIVE_FILE_TYPE', subtype:'TAR',
pattern: /\.tar$/i},
{type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE', subtype:'TBZ2',
pattern: /\.(tar.bz2|tbz|tbz2)$/i},
{type: 'archive', name: 'TAR_GZIP_ARCHIVE_FILE_TYPE', subtype:'TGZ',
pattern: /\.(tar.|t)gz$/i},
'pdf': {type: 'text', icon: 'pdf', name: 'PDF_DOCUMENT_FILE_TYPE',
subtype: 'PDF'},
'html': {type: 'text', icon: 'html', name: 'HTML_DOCUMENT_FILE_TYPE',
subtype: 'HTML'},
'htm': {type: 'text', icon: 'html', name: 'HTML_DOCUMENT_FILE_TYPE',
subtype: 'HTML'}
};
// Others
{type: 'text', icon: 'pdf', name: 'PDF_DOCUMENT_FILE_TYPE', subtype: 'PDF',
pattern: /\.pdf$/i},
{type: 'text', icon: 'html', name: 'HTML_DOCUMENT_FILE_TYPE', subtype: 'HTML',
pattern: /\.html?$/i}
];
FileType.previewArt = {
'audio': 'images/filetype_large_audio.png',
......@@ -73,22 +86,18 @@ FileType.previewArt = {
};
/**
* Extract extension from the file name and convert it to lower case.
* Get the file type object that matches a given url.
*
* @param {string} url
* @return {string}
* @return {Object} The matching file type object or an empty object.
*/
FileType.getFileExtension_ = function (url) {
var extIndex = url.lastIndexOf('.');
if (extIndex < 0)
return '';
return url.substr(extIndex + 1).toLowerCase();
};
FileType.getType = function(url) {
var extension = FileType.getFileExtension_(url);
if (extension in FileType.types)
return FileType.types[extension];
var types = FileType.types;
for (var i = 0; i < types.length; i++) {
if (types[i].pattern.test(url)) {
return types[i];
}
}
return {};
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment