Merge pull request #617 from aurimasv/content-handler

Content handlers
This commit is contained in:
Dan Stillman 2015-01-30 04:09:03 -05:00
commit f04b641f3c
2 changed files with 231 additions and 160 deletions

View File

@ -55,30 +55,50 @@ Zotero.MIMETypeHandler = new function () {
_observers = []; _observers = [];
if(Zotero.Prefs.get("parseEndNoteMIMETypes")) { if(Zotero.Prefs.get("parseEndNoteMIMETypes")) {
this.addHandler("application/x-endnote-refer", _importHandler, true); this.registerMetadataHandlers();
this.addHandler("application/x-research-info-systems", _importHandler, true);
this.addHandler("application/x-inst-for-scientific-info", _importHandler, true);
this.addHandler("text/x-bibtex", _importHandler, true);
this.addHandler("application/x-bibtex", _importHandler, true);
//
// And some non-standard ones
//
this.addHandler("text/x-research-info-systems", _importHandler, true);
// Nature uses this one
this.addHandler("text/application/x-research-info-systems", _importHandler, true);
// Cell uses this one
this.addHandler("text/ris", _importHandler, true);
// Not even trying
this.addHandler("ris", _importHandler, true);
} }
Zotero.Prefs.registerObserver("parseEndNoteMIMETypes", function(val) {
if (val) this.registerMetadataHandlers();
else this.unregisterMetadataHandlers();
}.bind(this));
this.addHandler("application/vnd.citationstyles.style+xml", function(a1, a2) { Zotero.Styles.install(a1, a2) }); this.addHandler("application/vnd.citationstyles.style+xml", function(a1, a2) { Zotero.Styles.install(a1, a2) });
this.addHandler("text/x-csl", function(a1, a2) { Zotero.Styles.install(a1, a2) }); // deprecated this.addHandler("text/x-csl", function(a1, a2) { Zotero.Styles.install(a1, a2) }); // deprecated
this.addHandler("application/x-zotero-schema", Zotero.Schema.importSchema); this.addHandler("application/x-zotero-schema", Zotero.Schema.importSchema);
this.addHandler("application/x-zotero-settings", Zotero.Prefs.importSettings); this.addHandler("application/x-zotero-settings", Zotero.Prefs.importSettings);
} }
// MIME types that Zotero should handle when parseEndNoteMIMETypes preference
// is enabled
var metadataMIMETypes = [
"application/x-endnote-refer", "application/x-research-info-systems",
"application/x-inst-for-scientific-info",
"text/x-bibtex", "application/x-bibtex",
// Non-standard
"text/x-research-info-systems",
"text/application/x-research-info-systems", // Nature serves this
"text/ris", // Cell serves this
"ris" // Not even trying
];
/**
* Registers MIME types for parseEndNoteMIMETypes preference
*/
this.registerMetadataHandlers = function() {
for (var i=0; i<metadataMIMETypes.length; i++) {
this.addHandler(metadataMIMETypes[i], _importHandler, true);
}
}
/**
* Unregisters MIME types for parseEndNoteMIMETypes preference
*/
this.unregisterMetadataHandlers = function() {
for (var i=0; i<metadataMIMETypes.length; i++) {
this.removeHandler(metadataMIMETypes[i]);
}
}
/** /**
* Adds a handler to handle a specific MIME type * Adds a handler to handle a specific MIME type
* @param {String} type MIME type to handle * @param {String} type MIME type to handle
@ -92,6 +112,18 @@ Zotero.MIMETypeHandler = new function () {
_ignoreContentDispositionTypes.push(type); _ignoreContentDispositionTypes.push(type);
} }
/**
* Removes a handler for a specific MIME type
* @param {String} type MIME type to handle
*/
this.removeHandler = function(type) {
delete _typeHandlers[type];
var i = _ignoreContentDispositionTypes.indexOf(type);
if (i != -1) {
_ignoreContentDispositionTypes.splice(i, 1);
}
}
/** /**
* Adds an observer to inspect and possibly modify page headers * Adds an observer to inspect and possibly modify page headers
*/ */
@ -107,7 +139,10 @@ Zotero.MIMETypeHandler = new function () {
*/ */
function _importHandler(string, uri, contentType, channel) { function _importHandler(string, uri, contentType, channel) {
var win = channel.notificationCallbacks.getInterface(Components.interfaces.nsIDOMWindow).top; var win = channel.notificationCallbacks.getInterface(Components.interfaces.nsIDOMWindow).top;
if(!win) throw "Attempt to import from a channel without an attached document refused"; if(!win) {
Zotero.debug("Attempt to import from a channel without an attached document refused");
return false;
}
var hostPort = channel.URI.hostPort.replace(";", "_", "g"); var hostPort = channel.URI.hostPort.replace(";", "_", "g");
@ -129,7 +164,7 @@ Zotero.MIMETypeHandler = new function () {
bag.setPropertyAsBool("allowTabModal", true); bag.setPropertyAsBool("allowTabModal", true);
var continueDownload = prompt.confirmCheck(title, text, checkMsg, checkValue); var continueDownload = prompt.confirmCheck(title, text, checkMsg, checkValue);
if(!continueDownload) return; if(!continueDownload) return false;
if(checkValue.value) { if(checkValue.value) {
// add to allowed sites if desired // add to allowed sites if desired
Zotero.Prefs.set("ingester.allowedSites", allowedSitesString+";"+hostPort); Zotero.Prefs.set("ingester.allowedSites", allowedSitesString+";"+hostPort);
@ -148,12 +183,14 @@ Zotero.MIMETypeHandler = new function () {
var translators = translation.getTranslators(); var translators = translation.getTranslators();
if(!translators.length) { if(!translators.length) {
// we lied. we can't really translate this file. // we lied. we can't really translate this file.
throw "No translator found for handled RIS, Refer or ISI file" Zotero.debug("No translator found to handle this file");
return false;
} }
// translate using first available // translate using first available
translation.setTranslator(translators[0]); translation.setTranslator(translators[0]);
frontWindow.Zotero_Browser.performTranslation(translation); frontWindow.Zotero_Browser.performTranslation(translation);
return true;
} }
/** /**
@ -300,11 +337,16 @@ Zotero.MIMETypeHandler = new function () {
convStream.close(); convStream.close();
inputStream.close(); inputStream.close();
var handled = false;
try { try {
_typeHandlers[this._contentType](readString, (this._request.name ? this._request.name : null), handled = _typeHandlers[this._contentType](readString, (this._request.name ? this._request.name : null),
this._contentType, channel); this._contentType, channel);
} catch(e) { } catch(e) {
// if there was an error, handle using nsIExternalHelperAppService Zotero.debug(e);
}
if (!handled) {
// handle using nsIExternalHelperAppService
var externalHelperAppService = Components.classes["@mozilla.org/uriloader/external-helper-app-service;1"]. var externalHelperAppService = Components.classes["@mozilla.org/uriloader/external-helper-app-service;1"].
getService(Components.interfaces.nsIExternalHelperAppService); getService(Components.interfaces.nsIExternalHelperAppService);
var frontWindow = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]. var frontWindow = Components.classes["@mozilla.org/embedcomp/window-watcher;1"].
@ -317,10 +359,6 @@ Zotero.MIMETypeHandler = new function () {
streamListener.onDataAvailable(this._request, context, inputStream, 0, this._storageStream.length); streamListener.onDataAvailable(this._request, context, inputStream, 0, this._storageStream.length);
streamListener.onStopRequest(channel, context, status); streamListener.onStopRequest(channel, context, status);
} }
this._storageStream.close();
// then throw our error
throw e;
} }
this._storageStream.close(); this._storageStream.close();

View File

@ -2291,33 +2291,9 @@ Zotero.Prefs = new function(){
// TODO: parse settings XML // TODO: parse settings XML
} }
// Handlers for some Zotero preferences
// var _handlers = [
// Methods to register a preferences observer [ "statusBarIcon", function(val) {
//
function register(){
this.prefBranch.QueryInterface(Components.interfaces.nsIPrefBranch2);
this.prefBranch.addObserver("", this, false);
}
function unregister(){
if (!this.prefBranch){
return;
}
this.prefBranch.removeObserver("", this);
}
function observe(subject, topic, data){
if(topic!="nsPref:changed"){
return;
}
try {
// subject is the nsIPrefBranch we're observing (after appropriate QI)
// data is the name of the pref that's been changed (relative to subject)
switch (data) {
case "statusBarIcon":
var doc = Components.classes["@mozilla.org/appshell/window-mediator;1"] var doc = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator) .getService(Components.interfaces.nsIWindowMediator)
.getMostRecentWindow("navigator:browser").document; .getMostRecentWindow("navigator:browser").document;
@ -2336,7 +2312,7 @@ Zotero.Prefs = new function(){
var toolbar = Zotero.getAncestorByTagName(icon, "toolbar"); var toolbar = Zotero.getAncestorByTagName(icon, "toolbar");
inAddonBar = toolbar == addonBar; inAddonBar = toolbar == addonBar;
} }
var val = this.get("statusBarIcon");
if (val == 0) { if (val == 0) {
// If showing in add-on bar, hide // If showing in add-on bar, hide
if (!icon || !inAddonBar) { if (!icon || !inAddonBar) {
@ -2377,54 +2353,54 @@ Zotero.Prefs = new function(){
icon.removeAttribute("compact"); icon.removeAttribute("compact");
} }
} }
break; }],
[ "automaticScraperUpdates", function(val) {
case "automaticScraperUpdates": if (val){
if (this.get('automaticScraperUpdates')){
Zotero.Schema.updateFromRepository(); Zotero.Schema.updateFromRepository();
} }
else { else {
Zotero.Schema.stopRepositoryTimer(); Zotero.Schema.stopRepositoryTimer();
} }
break; }],
[ "note.fontSize", function(val) {
case "note.fontSize":
var val = this.get('note.fontSize');
if (val < 6) { if (val < 6) {
this.set('note.fontSize', 11); Zotero.Prefs.set('note.fontSize', 11);
} }
break; }],
[ "zoteroDotOrgVersionHeader", function(val) {
case "zoteroDotOrgVersionHeader": if (val) {
if (this.get("zoteroDotOrgVersionHeader")) {
Zotero.VersionHeader.register(); Zotero.VersionHeader.register();
} }
else { else {
Zotero.VersionHeader.unregister(); Zotero.VersionHeader.unregister();
} }
break; }],
[ "zoteroDotOrgVersionHeader", function(val) {
case "sync.autoSync": if (val) {
if (this.get("sync.autoSync")) { Zotero.VersionHeader.register();
}
else {
Zotero.VersionHeader.unregister();
}
}],
[ "sync.autoSync", function(val) {
if (val) {
Zotero.Sync.Runner.IdleListener.register(); Zotero.Sync.Runner.IdleListener.register();
} }
else { else {
Zotero.Sync.Runner.IdleListener.unregister(); Zotero.Sync.Runner.IdleListener.unregister();
} }
break; }],
[ "sync.fulltext.enabled", function(val) {
// TEMP if (val) {
case "sync.fulltext.enabled":
if (this.get("sync.fulltext.enabled")) {
// Disable downgrades if full-text sync is enabled, since otherwise // Disable downgrades if full-text sync is enabled, since otherwise
// we could miss full-text content updates // we could miss full-text content updates
if (Zotero.DB.valueQuery("SELECT version FROM version WHERE schema='userdata'") < 77) { if (Zotero.DB.valueQuery("SELECT version FROM version WHERE schema='userdata'") < 77) {
Zotero.DB.query("UPDATE version SET version=77 WHERE schema='userdata'"); Zotero.DB.query("UPDATE version SET version=77 WHERE schema='userdata'");
} }
} }
break; }],
[ "search.quicksearch-mode", function(val) {
case "search.quicksearch-mode":
var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"]
.getService(Components.interfaces.nsIWindowMediator); .getService(Components.interfaces.nsIWindowMediator);
var enumerator = wm.getEnumerator("navigator:browser"); var enumerator = wm.getEnumerator("navigator:browser");
@ -2440,15 +2416,72 @@ Zotero.Prefs = new function(){
if (!win.Zotero) continue; if (!win.Zotero) continue;
Zotero.updateQuickSearchBox(win.document); Zotero.updateQuickSearchBox(win.document);
} }
break; }]
];
//
// Methods to register a preferences observer
//
function register(){
this.prefBranch.QueryInterface(Components.interfaces.nsIPrefBranch2);
this.prefBranch.addObserver("", this, false);
// Register pre-set handlers
for (var i=0; i<_handlers.length; i++) {
this.registerObserver(_handlers[i][0], _handlers[i][1]);
}
} }
function unregister(){
if (!this.prefBranch){
return;
}
this.prefBranch.removeObserver("", this);
}
/**
* @param {nsIPrefBranch} subject The nsIPrefBranch we're observing (after appropriate QI)
* @param {String} topic The string defined by NS_PREFBRANCH_PREFCHANGE_TOPIC_ID
* @param {String} data The name of the pref that's been changed (relative to subject)
*/
function observe(subject, topic, data){
if (topic != "nsPref:changed" || !_observers[data] || !_observers[data].length) {
return;
}
var obs = _observers[data];
for (var i=0; i<obs.length; i++) {
try {
obs[i](this.get(data));
} }
catch (e) { catch (e) {
Zotero.debug("Error while executing preference observer handler for " + data);
Zotero.debug(e); Zotero.debug(e);
throw (e);
} }
} }
}
var _observers = {};
this.registerObserver = function(name, handler) {
_observers[name] = _observers[name] || [];
_observers[name].push(handler);
}
this.unregisterObserver = function(name, handler) {
var obs = _observers[name];
if (!obs) {
Zotero.debug("No preferences observer registered for " + name);
return;
}
var i = obs.indexOf(handler);
if (i == -1) {
Zotero.debug("Handler was not registered for preference " + name);
return;
}
obs.splice(i, 1);
}
} }