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 @@ ...@@ -7,62 +7,75 @@
*/ */
var FileType = {}; var FileType = {};
FileType.types = { FileType.types = [
// Images // Images
'jpeg': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'JPEG'}, {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'JPEG',
'jpg': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'JPEG'}, pattern: /\.jpe?g$/i},
'bmp': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'BMP'}, {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'BMP',
'gif': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'GIF'}, pattern: /\.bmp$/i},
'ico': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'ICO'}, {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'GIF',
'png': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'PNG'}, pattern: /\.gif$/i},
'webp': {type: 'image', name: 'IMAGE_FILE_TYPE', subtype: 'WebP'}, {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 // Video
'3gp': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: '3GP'}, {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: '3GP',
'avi': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'AVI'}, pattern: /\.3gp$/i},
'mov': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'QuickTime'}, {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'AVI',
'mp4': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'}, pattern: /\.avi$/i},
'm4v': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'}, {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'QuickTime',
'mpg': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'}, pattern: /\.mov$/i},
'mpeg': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'}, {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG',
'mpg4': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'}, pattern: /\.m(p4|4v|pg|peg|pg4|peg4)$/i},
'mpeg4': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'MPEG'}, {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG',
'ogm': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG'}, pattern: /\.og(m|v|x)$/i},
'ogv': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG'}, {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'WebM',
'ogx': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'OGG'}, pattern: /\.webm$/i},
'webm': {type: 'video', name: 'VIDEO_FILE_TYPE', subtype: 'WebM'},
// Audio // Audio
'flac': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'FLAC'}, {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'FLAC',
'mp3': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MP3'}, pattern: /\.flac$/i},
'm4a': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MPEG'}, {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MP3',
'oga': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'OGG'}, pattern: /\.mp3$/i},
'ogg': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'OGG'}, {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'MPEG',
'wav': {type: 'audio', name: 'AUDIO_FILE_TYPE', subtype: 'WAV'}, 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 // Text
'pod': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'POD'}, {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'POD',
'rst': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'RST'}, pattern: /\.pod$/i},
'txt': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'TXT'}, {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'RST',
'log': {type: 'text', name: 'PLAIN_TEXT_FILE_TYPE', subtype: 'LOG'}, 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 // Archive
'zip': {type: 'archive', name: 'ZIP_ARCHIVE_FILE_TYPE'}, {type: 'archive', name: 'ZIP_ARCHIVE_FILE_TYPE', subtype:'ZIP',
'rar': {type: 'archive', name: 'RAR_ARCHIVE_FILE_TYPE'}, pattern: /\.zip$/i},
'tar': {type: 'archive', name: 'TAR_ARCHIVE_FILE_TYPE'}, {type: 'archive', name: 'RAR_ARCHIVE_FILE_TYPE', subtype:'RAR',
'tar.bz2': {type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE'}, pattern: /\.rar$/i},
'tbz': {type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE'}, {type: 'archive', name: 'TAR_ARCHIVE_FILE_TYPE', subtype:'TAR',
'tbz2': {type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE'}, pattern: /\.tar$/i},
'tar.gz': {type: 'archive', name: 'TAR_GZIP_ARCHIVE_FILE_TYPE'}, {type: 'archive', name: 'TAR_BZIP2_ARCHIVE_FILE_TYPE', subtype:'TBZ2',
'tgz': {type: 'archive', name: 'TAR_GZIP_ARCHIVE_FILE_TYPE'}, 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', // Others
subtype: 'PDF'}, {type: 'text', icon: 'pdf', name: 'PDF_DOCUMENT_FILE_TYPE', subtype: 'PDF',
'html': {type: 'text', icon: 'html', name: 'HTML_DOCUMENT_FILE_TYPE', pattern: /\.pdf$/i},
subtype: 'HTML'}, {type: 'text', icon: 'html', name: 'HTML_DOCUMENT_FILE_TYPE', subtype: 'HTML',
'htm': {type: 'text', icon: 'html', name: 'HTML_DOCUMENT_FILE_TYPE', pattern: /\.html?$/i}
subtype: 'HTML'} ];
};
FileType.previewArt = { FileType.previewArt = {
'audio': 'images/filetype_large_audio.png', 'audio': 'images/filetype_large_audio.png',
...@@ -73,22 +86,18 @@ FileType.previewArt = { ...@@ -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 * @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) { FileType.getType = function(url) {
var extension = FileType.getFileExtension_(url); var types = FileType.types;
if (extension in FileType.types) for (var i = 0; i < types.length; i++) {
return FileType.types[extension]; if (types[i].pattern.test(url)) {
return types[i];
}
}
return {}; 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