diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css index 6ae867d01..fafe83e69 100644 --- a/chrome/content/zotero-platform/mac/overlay.css +++ b/chrome/content/zotero-platform/mac/overlay.css @@ -57,6 +57,11 @@ -moz-padding-start: 8px; } +#zotero-tb-sync-warning[error=true] +{ + margin-bottom: 2px; +} + .zotero-tb-button[open="true"] > .toolbarbutton-icon, .zotero-tb-button:hover:active > .toolbarbutton-icon, #zotero-pane-stack[fullscreenmode="true"] #zotero-tb-fullscreen > .toolbarbutton-icon { diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js index c3fd037b6..e74caae33 100644 --- a/chrome/content/zotero/xpcom/storage.js +++ b/chrome/content/zotero/xpcom/storage.js @@ -888,8 +888,7 @@ Zotero.Sync.Storage = new function () { destFile.QueryInterface(Components.interfaces.nsILocalFile); destFile.setRelativeDescriptor(parentDir, fileName); if (destFile.exists()) { - var msg = "ZIP entry '" + fileName + "' " - + " already exists"; + var msg = "ZIP entry '" + fileName + "' " + "already exists"; Zotero.debug(msg, 2); Components.utils.reportError(msg + " in " + funcName); continue; @@ -984,7 +983,22 @@ Zotero.Sync.Storage = new function () { if (file.isFile()) { Zotero.debug("Deleting existing file " + file.leafName); - file.remove(false); + try { + file.remove(false); + } + catch (e) { + if (e.name == 'NS_ERROR_FILE_ACCESS_DENIED') { + Zotero.debug(e); + + // TODO: localize + var msg = "The file '" + file.leafName + "' is in use and cannot " + + "be updated. Please close the file or restart your computer " + + "and try syncing again."; + throw (msg); + } + + throw (e); + } } else if (file.isDirectory()) { Zotero.debug("Deleting existing directory " + file.leafName); diff --git a/chrome/content/zotero/xpcom/storage/zfs.js b/chrome/content/zotero/xpcom/storage/zfs.js index 3ef901319..4a2bc951f 100644 --- a/chrome/content/zotero/xpcom/storage/zfs.js +++ b/chrome/content/zotero/xpcom/storage/zfs.js @@ -190,6 +190,11 @@ Zotero.Sync.Storage.Session.ZFS.prototype.downloadFile = function (request) { else { destFile.append(item.key + '.tmp'); } + + if (destFile.exists()) { + destFile.remove(false); + } + // saveURI() below appears not to create empty files for Content-Length: 0, // so we create one here just in case destFile.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0644); @@ -252,8 +257,7 @@ Zotero.Sync.Storage.Session.ZFS.prototype.downloadFile = function (request) { var wbp = Components .classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"] .createInstance(nsIWBP); - wbp.persistFlags = nsIWBP.PERSIST_FLAGS_BYPASS_CACHE - | nsIWBP.PERSIST_FLAGS_REPLACE_EXISTING_FILES; + wbp.persistFlags = nsIWBP.PERSIST_FLAGS_BYPASS_CACHE; wbp.progressListener = listener; wbp.saveURI(uri, null, null, null, null, destFile); } diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css index 1c29370a0..58fba9cf5 100644 --- a/chrome/skin/default/zotero/overlay.css +++ b/chrome/skin/default/zotero/overlay.css @@ -221,7 +221,6 @@ #zotero-tb-sync-warning[error=true] { list-style-image: url(chrome://zotero/skin/exclamation.png); - margin-bottom: 2px; } #zotero-tb-sync {