Display a more user-friendly error for integration errors
This commit is contained in:
		
					parent
					
						
							
								71f9420cff
							
						
					
				
			
			
				commit
				
					
						0cb056c994
					
				
			
		
					 2 changed files with 60 additions and 44 deletions
				
			
		| 
						 | 
				
			
			@ -204,7 +204,7 @@ Zotero.Integration = new function() {
 | 
			
		|||
			throw new Zotero.Exception.Alert("integration.error.notInstalled",
 | 
			
		||||
				[], "integration.error.title");
 | 
			
		||||
		}	
 | 
			
		||||
	},
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Executes an integration command, first checking to make sure that versions are compatible
 | 
			
		||||
| 
						 | 
				
			
			@ -253,48 +253,9 @@ Zotero.Integration = new function() {
 | 
			
		|||
		}
 | 
			
		||||
		catch (e) {
 | 
			
		||||
			if (!(e instanceof Zotero.Exception.UserCancelled)) {
 | 
			
		||||
				try {
 | 
			
		||||
					var displayError = null;
 | 
			
		||||
					if(e instanceof Zotero.Exception.Alert) {
 | 
			
		||||
						displayError = e.message;
 | 
			
		||||
					} else {
 | 
			
		||||
						if(e.toString().indexOf("ExceptionAlreadyDisplayed") === -1) {
 | 
			
		||||
							displayError = Zotero.getString("integration.error.generic")+"\n\n"+(e.message || e.toString());
 | 
			
		||||
				Zotero.Integration._handleCommandError(document, e);
 | 
			
		||||
			}
 | 
			
		||||
						if(e.stack) {
 | 
			
		||||
							Zotero.debug(e.stack);
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
					if(displayError) {
 | 
			
		||||
						if (Zotero.Integration.currentSession && Zotero.Integration.currentSession.progressBar) {
 | 
			
		||||
							Zotero.Promise.delay(5).then(function() {
 | 
			
		||||
								Zotero.Integration.currentSession.progressBar.hide();
 | 
			
		||||
							});
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
						var showErrorInFirefox = !document;
 | 
			
		||||
						
 | 
			
		||||
						if(document) {
 | 
			
		||||
							try {
 | 
			
		||||
								await document.activate();
 | 
			
		||||
								await document.displayAlert(displayError, DIALOG_ICON_STOP, DIALOG_BUTTONS_OK);
 | 
			
		||||
							} catch(e) {
 | 
			
		||||
								showErrorInFirefox = true;
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
						
 | 
			
		||||
						if(showErrorInFirefox) {
 | 
			
		||||
							Zotero.Utilities.Internal.activate();
 | 
			
		||||
							Components.classes["@mozilla.org/embedcomp/prompt-service;1"]
 | 
			
		||||
								.getService(Components.interfaces.nsIPromptService)
 | 
			
		||||
								.alert(null, Zotero.getString("integration.error.title"), displayError);
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
				} finally {
 | 
			
		||||
					Zotero.logError(e);
 | 
			
		||||
				}
 | 
			
		||||
			} else {
 | 
			
		||||
			else {
 | 
			
		||||
				// If user cancels we should still write the currently assigned session ID
 | 
			
		||||
				await document.setDocumentData(session.data.serialize());
 | 
			
		||||
			}
 | 
			
		||||
| 
						 | 
				
			
			@ -341,6 +302,60 @@ Zotero.Integration = new function() {
 | 
			
		|||
		}
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
	this._handleCommandError = async function (document, e) {
 | 
			
		||||
		try {
 | 
			
		||||
			const supportURL = "https://www.zotero.org/support/kb/debugging_broken_documents";
 | 
			
		||||
			var displayError;
 | 
			
		||||
			if (e instanceof Zotero.Exception.Alert) {
 | 
			
		||||
				displayError = e.message;
 | 
			
		||||
			}
 | 
			
		||||
			else {
 | 
			
		||||
				if (e.toString().indexOf("ExceptionAlreadyDisplayed") === -1) {
 | 
			
		||||
					displayError = Zotero.getString("integration.error.generic")
 | 
			
		||||
						+ "\n\n" + Zotero.getString("integration.error.seeTroubleshootingInfo");
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				if (e.stack) {
 | 
			
		||||
					Zotero.debug(e.stack);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			if (Zotero.Integration.currentSession && Zotero.Integration.currentSession.progressBar) {
 | 
			
		||||
				Zotero.Promise.delay(5).then(() =>
 | 
			
		||||
					Zotero.Integration.currentSession.progressBar.hide());
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			
 | 
			
		||||
			// display alerts in the document processor
 | 
			
		||||
			if (document) {
 | 
			
		||||
				try {
 | 
			
		||||
					await document.activate();
 | 
			
		||||
					let index = await document.displayAlert(displayError, DIALOG_ICON_STOP, DIALOG_BUTTONS_YES_NO);
 | 
			
		||||
					if (index == 1) {
 | 
			
		||||
						Zotero.launchURL(supportURL);
 | 
			
		||||
					}
 | 
			
		||||
					return;
 | 
			
		||||
				}
 | 
			
		||||
				catch (e) {
 | 
			
		||||
					Zotero.debug("Integration: An error occurred while trying to display an alert. Falling back to Zotero");
 | 
			
		||||
					Zotero.logError(e);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			
 | 
			
		||||
			Zotero.Utilities.Internal.activate();
 | 
			
		||||
			let ps = Services.prompt;
 | 
			
		||||
			let index = ps.confirm(null, Zotero.getString('integration.error.title'), displayError);
 | 
			
		||||
			if (index == 1) {
 | 
			
		||||
				Zotero.launchURL(supportURL);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		finally {
 | 
			
		||||
			Zotero.logError(e);
 | 
			
		||||
		}
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Displays a dialog in a modal-like fashion without hanging the thread 
 | 
			
		||||
	 * @param {String} url The chrome:// URI of the window
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -873,6 +873,7 @@ integration.error.styleNotFound = The citation style %S could not be found.
 | 
			
		|||
integration.error.macWordSBPermissionsMissing.title = Missing Permission
 | 
			
		||||
integration.error.macWordSBPermissionsMissing = Zotero does not have permission to control Word. To grant this permission:\n\n1) Open System Preferences\n2) Click on “Security & Privacy”\n3) Select the “Privacy” tab\n4) Find and select “Automation” on the left\n5) Check the checkbox for “Microsoft Word” under “Zotero”\n6) Restart Word
 | 
			
		||||
integration.error.macWordSBPermissionsMissing.pre2016 = If “Microsoft Word” does not appear under “Automation”, make sure you are running Word 2011 version 14.7.7 or later.
 | 
			
		||||
integration.error.seeTroubleshootingInfo	= Would you like to see the troubleshooting instructions?
 | 
			
		||||
 | 
			
		||||
integration.replace						= Replace this Zotero field?
 | 
			
		||||
integration.missingItem.single			= The highlighted citation no longer exists in your Zotero database. Do you want to select a substitute item?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue