2006-10-04 17:16:56 +00:00
|
|
|
/*
|
|
|
|
***** BEGIN LICENSE BLOCK *****
|
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
Copyright © 2009 Center for History and New Media
|
|
|
|
George Mason University, Fairfax, Virginia, USA
|
|
|
|
http://zotero.org
|
2006-10-04 17:16:56 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
This file is part of Zotero.
|
2006-10-04 17:16:56 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
Zotero is free software: you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
2006-10-04 17:16:56 +00:00
|
|
|
|
2009-12-28 09:47:49 +00:00
|
|
|
Zotero is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with Zotero. If not, see <http://www.gnu.org/licenses/>.
|
2006-10-04 17:16:56 +00:00
|
|
|
|
|
|
|
***** END LICENSE BLOCK *****
|
|
|
|
*/
|
|
|
|
|
2006-10-02 23:15:27 +00:00
|
|
|
Zotero.MIME = new function(){
|
2007-10-23 07:11:59 +00:00
|
|
|
this.isTextType = isTextType;
|
2006-08-19 20:51:01 +00:00
|
|
|
this.isExternalTextExtension = isExternalTextExtension;
|
2007-10-23 07:11:59 +00:00
|
|
|
this.getPrimaryExtension = getPrimaryExtension;
|
2006-08-19 20:51:01 +00:00
|
|
|
this.sniffForMIMEType = sniffForMIMEType;
|
|
|
|
this.sniffForBinary = sniffForBinary;
|
|
|
|
this.getMIMETypeFromData = getMIMETypeFromData;
|
|
|
|
this.getMIMETypeFromFile = getMIMETypeFromFile;
|
2007-10-23 07:11:59 +00:00
|
|
|
this.hasNativeHandler = hasNativeHandler;
|
2006-08-19 20:51:01 +00:00
|
|
|
this.hasInternalHandler = hasInternalHandler;
|
|
|
|
this.fileHasInternalHandler = fileHasInternalHandler;
|
|
|
|
|
|
|
|
// Magic numbers
|
|
|
|
var _snifferEntries = [
|
2011-01-07 04:10:52 +00:00
|
|
|
["%PDF-", "application/pdf"],
|
2007-10-23 07:11:59 +00:00
|
|
|
["%!PS-Adobe-", 'application/postscript', 0],
|
|
|
|
["%! PS-Adobe-", 'application/postscript', 0],
|
Merged revisions 2190-2192,2194,2196-2199,2202-2205,2209,2212,2214-2215,2227-2228,2230,2232-2243,2245,2247-2256,2263-2272,2276,2278-2279,2281,2284-2286,2292,2296-2297,2299-2302,2304-2305,2309-2310,2314,2317-2323,2325-2329,2331-2337,2339,2341-2342,2344,2347-2366,2370-2371,2373-2377,2379-2391,2393-2402,2405-2410,2413,2415-2416,2418,2420-2421,2423,2427-2429,2431-2433,2437,2440-2441,2443-2450,2453,2455-2459,2461-2467,2471,2475-2480,2482-2490,2493,2495-2499,2501-2506,2511,2513-2519,2521,2525-2536,2540,2543-2553,2555-2559,2561-2576,2578,2580-2603,2606-2609,2611-2616,2618-2620,2624-2630,2632-2633 to trunk via svnmerge from 1.0 branch
2008-05-05 07:19:34 +00:00
|
|
|
["\uFFFD\uFFFD\x11\u0871\x1A\uFFFD\x00\x00", "application/msword", 0],
|
2007-10-23 07:11:59 +00:00
|
|
|
["From", 'text/plain', 0],
|
|
|
|
[">From", 'text/plain', 0],
|
|
|
|
["#!", 'text/plain', 0],
|
|
|
|
["<?xml", 'text/xml', 0],
|
|
|
|
["<!DOCTYPE html", 'text/html', 0],
|
|
|
|
["<html", 'text/html', 0],
|
Merged revisions 2190-2192,2194,2196-2199,2202-2205,2209,2212,2214-2215,2227-2228,2230,2232-2243,2245,2247-2256,2263-2272,2276,2278-2279,2281,2284-2286,2292,2296-2297,2299-2302,2304-2305,2309-2310,2314,2317-2323,2325-2329,2331-2337,2339,2341-2342,2344,2347-2366,2370-2371,2373-2377,2379-2391,2393-2402,2405-2410,2413,2415-2416,2418,2420-2421,2423,2427-2429,2431-2433,2437,2440-2441,2443-2450,2453,2455-2459,2461-2467,2471,2475-2480,2482-2490,2493,2495-2499,2501-2506,2511,2513-2519,2521,2525-2536,2540,2543-2553,2555-2559,2561-2576,2578,2580-2603,2606-2609,2611-2616,2618-2620,2624-2630,2632-2633 to trunk via svnmerge from 1.0 branch
2008-05-05 07:19:34 +00:00
|
|
|
["\uFFFD\uFFFD\uFFFD\uFFFD", 'image/jpeg', 0],
|
2007-10-23 07:11:59 +00:00
|
|
|
["GIF8", 'image/gif', 0],
|
Merged revisions 2190-2192,2194,2196-2199,2202-2205,2209,2212,2214-2215,2227-2228,2230,2232-2243,2245,2247-2256,2263-2272,2276,2278-2279,2281,2284-2286,2292,2296-2297,2299-2302,2304-2305,2309-2310,2314,2317-2323,2325-2329,2331-2337,2339,2341-2342,2344,2347-2366,2370-2371,2373-2377,2379-2391,2393-2402,2405-2410,2413,2415-2416,2418,2420-2421,2423,2427-2429,2431-2433,2437,2440-2441,2443-2450,2453,2455-2459,2461-2467,2471,2475-2480,2482-2490,2493,2495-2499,2501-2506,2511,2513-2519,2521,2525-2536,2540,2543-2553,2555-2559,2561-2576,2578,2580-2603,2606-2609,2611-2616,2618-2620,2624-2630,2632-2633 to trunk via svnmerge from 1.0 branch
2008-05-05 07:19:34 +00:00
|
|
|
["\uFFFDPNG", 'image/png', 0],
|
|
|
|
["PK\x03\x04", "application/vnd.oasis.opendocument.text", 0],
|
|
|
|
["JFIF", 'image/jpeg'],
|
|
|
|
["FLV", "video/x-flv", 0]
|
|
|
|
|
2006-08-19 20:51:01 +00:00
|
|
|
];
|
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
var _textTypes = {
|
|
|
|
'application/xhtml+xml': true,
|
|
|
|
'application/xml': true,
|
|
|
|
'application/x-javascript': true
|
|
|
|
};
|
|
|
|
|
2006-08-19 20:51:01 +00:00
|
|
|
// MIME types handled natively by Gecko
|
|
|
|
// DEBUG: There's definitely a better way of getting these
|
|
|
|
var _nativeMIMETypes = {
|
|
|
|
'text/html': true,
|
2007-10-23 07:11:59 +00:00
|
|
|
'text/css': true,
|
2006-08-19 20:51:01 +00:00
|
|
|
'image/jpeg': true,
|
|
|
|
'image/gif': true,
|
Merged revisions 3080-3081,3084,3087-3088,3090,3092,3099-3103,3113-3114,3132,3134-3143,3145,3148-3151,3154-3159,3165,3174,3194,3234-3235,3239-3240,3244,3246-3254,3258-3262,3268,3270,3274,3279,3286-3288,3294-3295 from 1.0 branch via svnmerge
2008-09-01 01:54:00 +00:00
|
|
|
'image/png': true,
|
|
|
|
'image/svg+xml': true,
|
2006-08-19 20:51:01 +00:00
|
|
|
'text/xml': true,
|
2007-10-23 07:11:59 +00:00
|
|
|
'application/xhtml+xml': true,
|
|
|
|
'application/xml': true,
|
2006-08-19 20:51:01 +00:00
|
|
|
'text/plain': true,
|
|
|
|
'application/x-javascript': true
|
|
|
|
};
|
|
|
|
|
|
|
|
// Extensions of text files (generally XML) to force to be external
|
|
|
|
var _externalTextExtensions = {
|
Merged revisions 2190-2192,2194,2196-2199,2202-2205,2209,2212,2214-2215,2227-2228,2230,2232-2243,2245,2247-2256,2263-2272,2276,2278-2279,2281,2284-2286,2292,2296-2297,2299-2302,2304-2305,2309-2310,2314,2317-2323,2325-2329,2331-2337,2339,2341-2342,2344,2347-2366,2370-2371,2373-2377,2379-2391,2393-2402,2405-2410,2413,2415-2416,2418,2420-2421,2423,2427-2429,2431-2433,2437,2440-2441,2443-2450,2453,2455-2459,2461-2467,2471,2475-2480,2482-2490,2493,2495-2499,2501-2506,2511,2513-2519,2521,2525-2536,2540,2543-2553,2555-2559,2561-2576,2578,2580-2603,2606-2609,2611-2616,2618-2620,2624-2630,2632-2633 to trunk via svnmerge from 1.0 branch
2008-05-05 07:19:34 +00:00
|
|
|
graffle: true,
|
2009-09-02 18:00:16 +00:00
|
|
|
mm: true,
|
2009-11-25 01:31:31 +00:00
|
|
|
opml: true,
|
|
|
|
bib: true
|
2006-08-19 20:51:01 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
|
|
|
|
function isTextType(mimeType) {
|
|
|
|
return mimeType.substr(0, 5) == 'text/' || _textTypes[mimeType];
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-08-19 20:51:01 +00:00
|
|
|
/*
|
|
|
|
* Check if file extension should be forced to open externally
|
|
|
|
*/
|
|
|
|
function isExternalTextExtension(ext){
|
2009-09-17 20:00:33 +00:00
|
|
|
return typeof _externalTextExtensions[ext] != 'undefined';
|
2006-08-19 20:51:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
/*
|
|
|
|
* Our own wrapper around the MIME service's getPrimaryExtension() that
|
|
|
|
* works a little better
|
|
|
|
*/
|
|
|
|
function getPrimaryExtension(mimeType, ext) {
|
|
|
|
// Enforce some extensions
|
|
|
|
switch (mimeType) {
|
|
|
|
case 'text/html':
|
|
|
|
return 'html';
|
Merged revisions 2190-2192,2194,2196-2199,2202-2205,2209,2212,2214-2215,2227-2228,2230,2232-2243,2245,2247-2256,2263-2272,2276,2278-2279,2281,2284-2286,2292,2296-2297,2299-2302,2304-2305,2309-2310,2314,2317-2323,2325-2329,2331-2337,2339,2341-2342,2344,2347-2366,2370-2371,2373-2377,2379-2391,2393-2402,2405-2410,2413,2415-2416,2418,2420-2421,2423,2427-2429,2431-2433,2437,2440-2441,2443-2450,2453,2455-2459,2461-2467,2471,2475-2480,2482-2490,2493,2495-2499,2501-2506,2511,2513-2519,2521,2525-2536,2540,2543-2553,2555-2559,2561-2576,2578,2580-2603,2606-2609,2611-2616,2618-2620,2624-2630,2632-2633 to trunk via svnmerge from 1.0 branch
2008-05-05 07:19:34 +00:00
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
case 'application/pdf':
|
Merged revisions 2190-2192,2194,2196-2199,2202-2205,2209,2212,2214-2215,2227-2228,2230,2232-2243,2245,2247-2256,2263-2272,2276,2278-2279,2281,2284-2286,2292,2296-2297,2299-2302,2304-2305,2309-2310,2314,2317-2323,2325-2329,2331-2337,2339,2341-2342,2344,2347-2366,2370-2371,2373-2377,2379-2391,2393-2402,2405-2410,2413,2415-2416,2418,2420-2421,2423,2427-2429,2431-2433,2437,2440-2441,2443-2450,2453,2455-2459,2461-2467,2471,2475-2480,2482-2490,2493,2495-2499,2501-2506,2511,2513-2519,2521,2525-2536,2540,2543-2553,2555-2559,2561-2576,2578,2580-2603,2606-2609,2611-2616,2618-2620,2624-2630,2632-2633 to trunk via svnmerge from 1.0 branch
2008-05-05 07:19:34 +00:00
|
|
|
case 'application/x-pdf':
|
|
|
|
case 'application/acrobat':
|
|
|
|
case 'applications/vnd.pdf':
|
|
|
|
case 'text/pdf':
|
|
|
|
case 'text/x-pdf':
|
2007-10-23 07:11:59 +00:00
|
|
|
return 'pdf';
|
Merged revisions 2190-2192,2194,2196-2199,2202-2205,2209,2212,2214-2215,2227-2228,2230,2232-2243,2245,2247-2256,2263-2272,2276,2278-2279,2281,2284-2286,2292,2296-2297,2299-2302,2304-2305,2309-2310,2314,2317-2323,2325-2329,2331-2337,2339,2341-2342,2344,2347-2366,2370-2371,2373-2377,2379-2391,2393-2402,2405-2410,2413,2415-2416,2418,2420-2421,2423,2427-2429,2431-2433,2437,2440-2441,2443-2450,2453,2455-2459,2461-2467,2471,2475-2480,2482-2490,2493,2495-2499,2501-2506,2511,2513-2519,2521,2525-2536,2540,2543-2553,2555-2559,2561-2576,2578,2580-2603,2606-2609,2611-2616,2618-2620,2624-2630,2632-2633 to trunk via svnmerge from 1.0 branch
2008-05-05 07:19:34 +00:00
|
|
|
|
|
|
|
case 'image/jpg':
|
|
|
|
case 'image/jpeg':
|
|
|
|
return 'jpg';
|
|
|
|
|
|
|
|
case 'image/gif':
|
|
|
|
return 'gif';
|
|
|
|
|
|
|
|
case 'application/msword':
|
|
|
|
case 'application/doc':
|
|
|
|
case 'application/vnd.msword':
|
|
|
|
case 'application/vnd.ms-word':
|
|
|
|
case 'application/winword':
|
|
|
|
case 'application/word':
|
|
|
|
case 'application/x-msw6':
|
|
|
|
case 'application/x-msword':
|
|
|
|
return 'doc';
|
|
|
|
|
|
|
|
case 'application/vnd.oasis.opendocument.text':
|
|
|
|
case 'application/x-vnd.oasis.opendocument.text':
|
|
|
|
return 'odt';
|
|
|
|
|
|
|
|
case 'video/flv':
|
|
|
|
case 'video/x-flv':
|
|
|
|
return 'flv';
|
|
|
|
|
|
|
|
case 'image/tif':
|
|
|
|
case 'image/tiff':
|
|
|
|
case 'image/tif':
|
|
|
|
case 'image/x-tif':
|
|
|
|
case 'image/tiff':
|
|
|
|
case 'image/x-tiff':
|
|
|
|
case 'application/tif':
|
|
|
|
case 'application/x-tif':
|
|
|
|
case 'application/tiff':
|
|
|
|
case 'application/x-tiff':
|
|
|
|
return 'tiff';
|
|
|
|
|
|
|
|
case 'application/zip':
|
|
|
|
case 'application/x-zip':
|
|
|
|
case 'application/x-zip-compressed':
|
|
|
|
case 'application/x-compress':
|
|
|
|
case 'application/x-compressed':
|
|
|
|
case 'multipart/x-zip':
|
|
|
|
return 'zip';
|
|
|
|
|
|
|
|
case 'video/quicktime':
|
|
|
|
case 'video/x-quicktime':
|
|
|
|
return 'mov';
|
|
|
|
|
|
|
|
case 'video/avi':
|
|
|
|
case 'video/msvideo':
|
|
|
|
case 'video/x-msvideo':
|
|
|
|
return 'avi';
|
|
|
|
|
|
|
|
case 'audio/wav':
|
|
|
|
case 'audio/x-wav':
|
|
|
|
case 'audio/wave':
|
|
|
|
return 'wav';
|
|
|
|
|
|
|
|
case 'audio/aiff':
|
|
|
|
case 'audio/x-aiff':
|
|
|
|
case 'sound/aiff':
|
|
|
|
return 'aiff';
|
2007-10-23 07:11:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
ext = Components.classes["@mozilla.org/mime;1"]
|
|
|
|
.getService(Components.interfaces.nsIMIMEService)
|
|
|
|
.getPrimaryExtension(mimeType, ext);
|
|
|
|
}
|
|
|
|
// nsIMIMEService.getPrimaryExtension() doesn't work on Linux and
|
|
|
|
// throws an error if it can't find an extension
|
|
|
|
catch (e) {}
|
|
|
|
|
|
|
|
return ext ? ext : '';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-08-19 20:51:01 +00:00
|
|
|
/*
|
|
|
|
* Searches string for magic numbers
|
|
|
|
*/
|
|
|
|
function sniffForMIMEType(str){
|
|
|
|
for (var i in _snifferEntries){
|
2007-10-23 07:11:59 +00:00
|
|
|
var match = false;
|
|
|
|
// If an offset is defined, match only from there
|
|
|
|
if (typeof _snifferEntries[i][2] != 'undefined') {
|
|
|
|
if (str.substr(i[2]).indexOf(_snifferEntries[i][0]) == 0) {
|
|
|
|
match = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// Otherwise allow match anywhere in sample
|
|
|
|
// (128 bytes from getSample() by default)
|
|
|
|
else if (str.indexOf(_snifferEntries[i][0]) != -1) {
|
|
|
|
match = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (match) {
|
2006-08-19 20:51:01 +00:00
|
|
|
return _snifferEntries[i][1];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Searches string for embedded nulls
|
|
|
|
*
|
|
|
|
* Returns 'application/octet-stream' or 'text/plain'
|
|
|
|
*/
|
|
|
|
function sniffForBinary(str){
|
|
|
|
for (var i=0; i<str.length; i++){
|
|
|
|
if (!_isTextCharacter(str.charAt(i))){
|
|
|
|
return 'application/octet-stream';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return 'text/plain';
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Try to determine the MIME type of a string, using a few different
|
|
|
|
* techniques
|
|
|
|
*
|
|
|
|
* ext is an optional file extension hint if data sniffing is unsuccessful
|
|
|
|
*/
|
|
|
|
function getMIMETypeFromData(str, ext){
|
2007-10-23 07:11:59 +00:00
|
|
|
var mimeType = sniffForMIMEType(str);
|
2006-08-19 20:51:01 +00:00
|
|
|
if (mimeType){
|
2006-10-02 23:15:27 +00:00
|
|
|
Zotero.debug('Detected MIME type ' + mimeType);
|
2006-08-19 20:51:01 +00:00
|
|
|
return mimeType;
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
2007-10-23 07:11:59 +00:00
|
|
|
if (ext) {
|
|
|
|
var mimeType = Components.classes["@mozilla.org/uriloader/external-helper-app-service;1"]
|
|
|
|
.getService(Components.interfaces.nsIMIMEService).getTypeFromExtension(ext);
|
|
|
|
Zotero.debug('Got MIME type ' + mimeType + ' from extension');
|
|
|
|
return mimeType;
|
|
|
|
}
|
2006-08-19 20:51:01 +00:00
|
|
|
}
|
2007-10-23 07:11:59 +00:00
|
|
|
catch (e) {}
|
|
|
|
|
|
|
|
var mimeType = sniffForBinary(str);
|
|
|
|
Zotero.debug('Cannot determine MIME type from magic number or extension -- settling for ' + mimeType);
|
|
|
|
return mimeType;
|
2006-08-19 20:51:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Try to determine the MIME type of the file, using a few different
|
|
|
|
* techniques
|
|
|
|
*/
|
|
|
|
function getMIMETypeFromFile(file){
|
2006-10-02 23:15:27 +00:00
|
|
|
var str = Zotero.File.getSample(file);
|
|
|
|
var ext = Zotero.File.getExtension(file);
|
2006-08-19 20:51:01 +00:00
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
return getMIMETypeFromData(str, ext);
|
2006-08-19 20:51:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2009-05-28 09:52:52 +00:00
|
|
|
this.getMIMETypeFromURL = function (url, callback) {
|
2010-10-25 00:58:47 +00:00
|
|
|
Zotero.HTTP.doHead(url, function(xmlhttp) {
|
2009-05-28 09:52:52 +00:00
|
|
|
if (xmlhttp.status != 200 && xmlhttp.status != 204) {
|
|
|
|
Zotero.debug("Attachment HEAD request returned with status code "
|
|
|
|
+ xmlhttp.status + " in Zotero.MIME.getMIMETypeFromURL()", 2);
|
|
|
|
var mimeType = '';
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
var mimeType = xmlhttp.channel.contentType;
|
|
|
|
}
|
|
|
|
|
|
|
|
var nsIURL = Components.classes["@mozilla.org/network/standard-url;1"]
|
|
|
|
.createInstance(Components.interfaces.nsIURL);
|
|
|
|
nsIURL.spec = url;
|
|
|
|
|
|
|
|
// Override MIME type to application/pdf if extension is .pdf --
|
|
|
|
// workaround for sites that respond to the HEAD request with an
|
|
|
|
// invalid MIME type (https://www.zotero.org/trac/ticket/460)
|
|
|
|
//
|
|
|
|
// Downloaded file is inspected in attachment code and deleted if actually HTML
|
|
|
|
if (nsIURL.fileName.match(/pdf$/) || url.match(/pdf$/)) {
|
|
|
|
mimeType = 'application/pdf';
|
|
|
|
}
|
|
|
|
|
|
|
|
var ext = nsIURL.fileExtension;
|
|
|
|
var hasNativeHandler = Zotero.MIME.hasNativeHandler(mimeType, ext)
|
|
|
|
|
|
|
|
callback(mimeType, hasNativeHandler);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2006-08-19 20:51:01 +00:00
|
|
|
/*
|
2007-10-23 07:11:59 +00:00
|
|
|
* Determine if a MIME type can be handled natively
|
|
|
|
* or if it needs to be passed off to a plugin or external helper app
|
2006-08-19 20:51:01 +00:00
|
|
|
*
|
2009-09-17 20:00:33 +00:00
|
|
|
* ext is an optional extension hint (only needed for text files
|
2006-08-19 20:51:01 +00:00
|
|
|
* that should be forced to open externally)
|
|
|
|
*
|
|
|
|
* Note: it certainly seems there should be a more native way of doing this
|
|
|
|
* without replicating all the Mozilla functionality
|
|
|
|
*
|
|
|
|
* Note: nsIMIMEInfo provides a hasDefaultHandler() method, but it doesn't
|
|
|
|
* do what we need
|
|
|
|
*/
|
2007-10-23 07:11:59 +00:00
|
|
|
function hasNativeHandler(mimeType, ext) {
|
2009-09-17 20:00:33 +00:00
|
|
|
if (mimeType.match(/^text\//)) {
|
2007-10-23 07:11:59 +00:00
|
|
|
if (isExternalTextExtension(ext)){
|
2009-11-25 01:31:31 +00:00
|
|
|
Zotero.debug(mimeType + " file has extension '" + ext + "' that should be handled externally");
|
2006-08-19 20:51:01 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_nativeMIMETypes[mimeType]){
|
2006-10-02 23:15:27 +00:00
|
|
|
Zotero.debug('MIME type ' + mimeType + ' can be handled natively');
|
2006-08-19 20:51:01 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2007-10-23 07:11:59 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Determine if a MIME type can be handled internally
|
|
|
|
* or if it needs to be passed off to an external helper app
|
|
|
|
*
|
|
|
|
* Similar to hasNativeHandler() but also includes plugins
|
|
|
|
*/
|
|
|
|
function hasInternalHandler(mimeType, ext) {
|
|
|
|
var isNative = hasNativeHandler(mimeType, ext);
|
|
|
|
if (isNative !== null) {
|
|
|
|
return isNative;
|
|
|
|
}
|
|
|
|
|
2006-08-19 20:51:01 +00:00
|
|
|
// Is there a better way to get to navigator?
|
|
|
|
var types = Components.classes["@mozilla.org/appshell/appShellService;1"]
|
|
|
|
.getService(Components.interfaces.nsIAppShellService)
|
|
|
|
.hiddenDOMWindow.navigator.mimeTypes;
|
|
|
|
|
|
|
|
for (var i in types){
|
2007-10-23 07:11:59 +00:00
|
|
|
if (types[i].type && types[i].type == mimeType){
|
2006-10-02 23:15:27 +00:00
|
|
|
Zotero.debug('MIME type ' + mimeType + ' can be handled by plugins');
|
2006-08-19 20:51:01 +00:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-10 23:56:24 +00:00
|
|
|
Zotero.debug('MIME type ' + mimeType + ' cannot be handled internally');
|
2006-08-19 20:51:01 +00:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function fileHasInternalHandler(file){
|
2007-10-23 07:11:59 +00:00
|
|
|
var mimeType = getMIMETypeFromFile(file);
|
2006-10-02 23:15:27 +00:00
|
|
|
var ext = Zotero.File.getExtension(file);
|
2007-10-23 07:11:59 +00:00
|
|
|
return hasInternalHandler(mimeType, ext);
|
2006-08-19 20:51:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Detect whether a character is text
|
|
|
|
*
|
|
|
|
* Based on RFC 2046 Section 4.1.2. Treat any char 0-31
|
|
|
|
* except the 9-13 range (\t, \n, \v, \f, \r) and char 27 (used by
|
|
|
|
* encodings like Shift_JIS) as non-text
|
|
|
|
*
|
|
|
|
* This is the logic used by the Mozilla sniffer.
|
|
|
|
*/
|
|
|
|
function _isTextCharacter(chr){
|
|
|
|
var chr = chr.charCodeAt(0);
|
|
|
|
return chr > 31 || (9 <= chr && chr <=13 ) || chr == 27;
|
|
|
|
}
|
|
|
|
}
|