commit 6021214b062c329a35cff3ac898f00668723fb4a
parent 7eac0e1820f9003010541af1e1c9ab9383dd5312
Author: Simon Kornblith <simon@simonster.com>
Date: Fri, 17 Feb 2012 23:10:18 -0500
Further restructuring of error handling
Diffstat:
1 file changed, 128 insertions(+), 78 deletions(-)
diff --git a/chrome/content/zotero/xpcom/integration.js b/chrome/content/zotero/xpcom/integration.js
@@ -1246,7 +1246,10 @@ Zotero.Integration.Fields.prototype._retrieveFields = function() {
* Shows an error if a field code is corrupted
* @param {Exception} e The exception thrown
* @param {Field} field The Zotero field object
+ * @param {Function} callback The callback passed to updateSession
+ * @param {Function} errorCallback The error callback passed to updateSession
* @param {Integer} i The field index
+ * @return {Boolean} Whether to continue updating the session
*/
Zotero.Integration.Fields.prototype._showCorruptFieldError = function(e, field, callback, errorCallback, i) {
Zotero.logError(e);
@@ -1278,6 +1281,58 @@ Zotero.Integration.Fields.prototype._showCorruptFieldError = function(e, field,
}
/**
+ * Shows an error if a field code is missing
+ * @param {Exception} e The exception thrown
+ * @param {Exception} e The exception thrown
+ * @param {Field} field The Zotero field object
+ * @param {Function} callback The callback passed to updateSession
+ * @param {Function} errorCallback The error callback passed to updateSession
+ * @param {Integer} i The field index
+ * @return {Boolean} Whether to continue updating the session
+ */
+Zotero.Integration.Fields.prototype._showMissingItemError = function(e, field, callback, errorCallback, i) {
+ // First, check if we've already decided to remove field codes from these
+ var reselect = true;
+ for each(var reselectKey in e.reselectKeys) {
+ if(this._deleteKeys[reselectKey]) {
+ this._removeCodeFields.push(i);
+ return true;
+ }
+ }
+
+ // Ask user what to do with this item
+ if(e.citationLength == 1) {
+ var msg = Zotero.getString("integration.missingItem.single");
+ } else {
+ var msg = Zotero.getString("integration.missingItem.multiple", (e.citationIndex+1).toString());
+ }
+ msg += '\n\n'+Zotero.getString('integration.missingItem.description');
+ field.select();
+ this._doc.activate();
+ var result = this._doc.displayAlert(msg, 1, 3);
+ if(result == 0) { // Cancel
+ throw new Zotero.Integration.UserCancelledException();
+ } else if(result == 1) { // No
+ for each(var reselectKey in e.reselectKeys) {
+ this._deleteKeys[reselectKey] = true;
+ }
+ this._removeCodeFields.push(i);
+ return true;
+ } else { // Yes
+ // Display reselect item dialog
+ var me = this;
+ var oldCurrentWindow = Zotero.Integration.currentWindow;
+ this._session.reselectItem(this._doc, e, function() {
+ // Now try again
+ Zotero.Integration.currentWindow = oldCurrentWindow;
+ me._doc.activate();
+ me._processFields(me._fields, callback, errorCallback, i);
+ });
+ return false;
+ }
+}
+
+/**
* Updates Zotero.Integration.Session attached to Zotero.Integration.Fields in line with document
*/
Zotero.Integration.Fields.prototype.updateSession = function(callback, errorCallback) {
@@ -1305,22 +1360,28 @@ Zotero.Integration.Fields.prototype.updateSession = function(callback, errorCall
try {
me._session.loadBibliographyData(me._bibliographyData);
} catch(e) {
- if(errorCallback && !errorCallback(e)) {
- } else if(e instanceof Zotero.Integration.CorruptFieldException) {
- var msg = Zotero.getString("integration.corruptBibliography")+'\n\n'+
- Zotero.getString('integration.corruptBibliography.description');
- var result = me._doc.displayAlert(msg,
- Components.interfaces.zoteroIntegrationDocument.DIALOG_ICON_CAUTION,
- Components.interfaces.zoteroIntegrationDocument.DIALOG_BUTTONS_OK_CANCEL);
- if(result == 0) {
- throw e;
+ var defaultHandler = function() {
+ if(e instanceof Zotero.Integration.CorruptFieldException) {
+ var msg = Zotero.getString("integration.corruptBibliography")+'\n\n'+
+ Zotero.getString('integration.corruptBibliography.description');
+ var result = me._doc.displayAlert(msg,
+ Components.interfaces.zoteroIntegrationDocument.DIALOG_ICON_CAUTION,
+ Components.interfaces.zoteroIntegrationDocument.DIALOG_BUTTONS_OK_CANCEL);
+ if(result == 0) {
+ throw e;
+ } else {
+ me._bibliographyData = "";
+ me._session.bibliographyHasChanged = true;
+ me._session.bibliographyDataHasChanged = true;
+ }
} else {
- me._bibliographyData = "";
- me._session.bibliographyHasChanged = true;
- me._session.bibliographyDataHasChanged = true;
+ throw e;
}
- } else {
- throw e;
+ };
+ if(errorCallback) {
+ if(!errorCallback(e, defaultHandler)) return;
+ } else if(!defaultHandler()) {
+ return;
}
}
}
@@ -1351,13 +1412,26 @@ Zotero.Integration.Fields.prototype.updateSession = function(callback, errorCall
Zotero.Integration.Fields.prototype._processFields = function(fields, callback, errorCallback, i) {
if(!i) i = 0;
+ var me = this;
for(var n = fields.length; i<n; i++) {
var field = fields[i];
try {
var fieldCode = field.getCode();
} catch(e) {
- if(!this._showCorruptFieldError(e, field, callback, errorCallback, i)) return;
+ var defaultHandler = function() {
+ return me._showCorruptFieldError(e, field, callback, errorCallback, i);
+ };
+
+ if(errorCallback) {
+ if(errorCallback(e, defaultHandler)) {
+ continue;
+ } else {
+ return;
+ }
+ } else if(!defaultHandler()) {
+ return;
+ }
}
var [type, content] = this.getCodeTypeAndContent(fieldCode);
@@ -1366,53 +1440,24 @@ Zotero.Integration.Fields.prototype._processFields = function(fields, callback,
try {
this._session.addCitation(i, noteIndex, content);
} catch(e) {
- if(errorCallback && !errorCallback(e)) {
- } else if(e instanceof Zotero.Integration.MissingItemException) {
- // First, check if we've already decided to remove field codes from these
- var reselect = true;
- for each(var reselectKey in e.reselectKeys) {
- if(this._deleteKeys[reselectKey]) {
- this._removeCodeFields.push(i);
- reselect = false;
- break;
- }
+ var defaultHandler = function() {
+ if(e instanceof Zotero.Integration.MissingItemException) {
+ return me._showMissingItemError(e, field, callback, errorCallback, i);
+ } else if(e instanceof Zotero.Integration.CorruptFieldException) {
+ return me._showCorruptFieldError(e, field, callback, errorCallback, i);
+ } else {
+ throw e;
}
-
- if(reselect) {
- // Ask user what to do with this item
- if(e.citationLength == 1) {
- var msg = Zotero.getString("integration.missingItem.single");
- } else {
- var msg = Zotero.getString("integration.missingItem.multiple", (e.citationIndex+1).toString());
- }
- msg += '\n\n'+Zotero.getString('integration.missingItem.description');
- field.select();
- this._doc.activate();
- var result = this._doc.displayAlert(msg, 1, 3);
- if(result == 0) { // Cancel
- throw new Zotero.Integration.UserCancelledException();
- } else if(result == 1) { // No
- for each(var reselectKey in e.reselectKeys) {
- this._deleteKeys[reselectKey] = true;
- }
- this._removeCodeFields.push(i);
- } else { // Yes
- // Display reselect item dialog
- var me = this;
- var oldCurrentWindow = Zotero.Integration.currentWindow;
- this._session.reselectItem(this._doc, e, function() {
- // Now try again
- Zotero.Integration.currentWindow = oldCurrentWindow;
- me._doc.activate();
- me._processFields(fields, callback, errorCallback, i);
- });
- return;
- }
+ };
+
+ if(errorCallback) {
+ if(errorCallback(e, defaultHandler)) {
+ continue;
+ } else {
+ return;
}
- } else if(e instanceof Zotero.Integration.CorruptFieldException) {
- if(!this._showCorruptFieldError(e, field, callback, errorCallback, i)) return;
- } else {
- throw e;
+ } if(!defaultHandler()) {
+ return;
}
}
} else if(type === INTEGRATION_TYPE_BIBLIOGRAPHY) {
@@ -1716,6 +1761,26 @@ Zotero.Integration.CitationEditInterface = function(citation, field, fields, ses
Zotero.Integration.CitationEditInterface.prototype = {
/**
+ * Handles an error in updateSession
+ */
+ "_errorHandler":function(e, defaultHandler) {
+ Zotero.debug('Integration.CitationEditInterface: Error "'+e.toString()+'" caught by handler');
+ if(this._haveAccepted) {
+ try {
+ return defaultHandler();
+ } catch(e) {
+ if(e instanceof Zotero.Integration.UserCancelledException) {
+ this._field.delete();
+ }
+ throw e;
+ }
+ } else {
+ this._errorOccurred = true;
+ return true;
+ }
+ },
+
+ /**
* Run a function when the session information has been updated
* @param {Function} sessionUpdatedCallback
*/
@@ -1736,23 +1801,7 @@ Zotero.Integration.CitationEditInterface.prototype = {
}
me._sessionUpdated = true;
delete me._sessionCallbackQueue;
- }, function(e) {
- if(e instanceof Zotero.Integration.MissingItemException
- || e instanceof Zotero.Integration.CorruptFieldException) {
- if(me._haveAccepted) {
- // If accept button has been pressed, go ahead and show errors
- return true;
- } else {
- // If not, suppress errors and we will show them later
- me._errorOccurred = true;
- return false;
- }
- } else {
- // If not a MissingItemException or CorruptFieldException, go ahead and show
- // the error now. This shouldn't happen!
- return true;
- }
- });
+ }, function(e, defaultHandler) { return me._errorHandler(e, defaultHandler) });
}
},
@@ -1799,8 +1848,9 @@ Zotero.Integration.CitationEditInterface.prototype = {
Zotero.setTimeout(function() {
me._fields.updateSession(function() {
me._errorOccurred = false;
+ me._sessionUpdated = true;
me.accept(progressCallback, true);
- });
+ }, function(e, defaultHandler) { return me._errorHandler(e, defaultHandler) });
}, 0);
return;
}