diff --git a/chrome/content/zotero/xpcom/error.js b/chrome/content/zotero/xpcom/error.js index b92d6596b..d1305676d 100644 --- a/chrome/content/zotero/xpcom/error.js +++ b/chrome/content/zotero/xpcom/error.js @@ -26,7 +26,11 @@ Zotero.Error = function (message, error, data) { this.message = message; - this.data = data; + if (data) { + for (let prop in data) { + this[prop] = data[prop]; + } + } if (parseInt(error) == error) { this.error = error; } diff --git a/chrome/content/zotero/xpcom/storage/webdav.js b/chrome/content/zotero/xpcom/storage/webdav.js index 41dca035e..c3f624d15 100644 --- a/chrome/content/zotero/xpcom/storage/webdav.js +++ b/chrome/content/zotero/xpcom/storage/webdav.js @@ -1506,7 +1506,6 @@ Zotero.Sync.Storage.Mode.WebDAV.prototype = { msg, 0, { - dialogText: msg, dialogButtonText: buttonText, dialogButtonCallback: func } @@ -1520,7 +1519,6 @@ Zotero.Sync.Storage.Mode.WebDAV.prototype = { msg, 0, { - dialogText: msg, dialogButtonText: Zotero.getString('sync.storage.error.webdav.loadURL'), dialogButtonCallback: function () { var zp = Zotero.getActiveZoteroPane(); diff --git a/chrome/content/zotero/xpcom/storage/zfs.js b/chrome/content/zotero/xpcom/storage/zfs.js index a12853d5b..e1a939514 100644 --- a/chrome/content/zotero/xpcom/storage/zfs.js +++ b/chrome/content/zotero/xpcom/storage/zfs.js @@ -583,13 +583,15 @@ Zotero.Sync.Storage.Mode.ZFS.prototype = { } } - text += "\n\n" + filename + " (" + Math.round(file.fileSize / 1024) + "KB)"; + var filename = item.attachmentFilename; + var fileSize = (yield OS.File.stat(item.getFilePath())).size; + + text += "\n\n" + filename + " (" + Math.round(fileSize / 1024) + "KB)"; let e = new Zotero.Error( - Zotero.getString('sync.storage.error.zfs.fileWouldExceedQuota', filename), + text, "ZFS_OVER_QUOTA", { - dialogText: text, dialogButtonText: buttonText, dialogButtonCallback: buttonCallback } diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js index 02bf9bd15..38ba6cd80 100644 --- a/chrome/content/zotero/xpcom/sync.js +++ b/chrome/content/zotero/xpcom/sync.js @@ -301,7 +301,6 @@ Zotero.Sync.Server = new function () { msg, 0, { - dialogText: msg, dialogButtonText: Zotero.getString('pane.items.showItemInLibrary'), dialogButtonCallback: function () { var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] diff --git a/chrome/content/zotero/xpcom/sync/syncRunner.js b/chrome/content/zotero/xpcom/sync/syncRunner.js index bc7242bfa..ee7e6672e 100644 --- a/chrome/content/zotero/xpcom/sync/syncRunner.js +++ b/chrome/content/zotero/xpcom/sync/syncRunner.js @@ -854,7 +854,6 @@ Zotero.Sync.Runner_Module = function (options = {}) { // TODO: localize (=>done) and combine with below (=>?) var msg = Zotero.getString('sync.error.invalidLogin.text'); e.message = msg; - e.dialogText = msg; e.dialogButtonText = Zotero.getString('sync.openSyncPreferences'); e.dialogButtonCallback = function () { var wm = Components.classes["@mozilla.org/appshell/window-mediator;1"] @@ -1079,9 +1078,6 @@ Zotero.Sync.Runner_Module = function (options = {}) { e.parsed = true; e.errorType = e.errorType ? e.errorType : 'error'; - if (!e.data) { - e.data = {}; - } return e; } @@ -1159,7 +1155,7 @@ Zotero.Sync.Runner_Module = function (options = {}) { e.dialogButtonText = null; }*/ - if (e.data && e.dialogButtonText !== null) { + if (e.dialogButtonText !== null) { if (e.dialogButtonText === undefined) { var buttonText = Zotero.getString('errorReport.reportError'); var buttonCallback = function () { diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js index 032c0181c..e0ccde01f 100644 --- a/chrome/content/zotero/xpcom/utilities_internal.js +++ b/chrome/content/zotero/xpcom/utilities_internal.js @@ -380,22 +380,15 @@ Zotero.Utilities.Internal = { .getService(Components.interfaces.nsIPromptService); var message, buttonText, buttonCallback; - if (e.data) { - if (e.data.dialogText) { - message = e.data.dialogText; - } - if (typeof e.data.dialogButtonText != 'undefined') { - buttonText = e.data.dialogButtonText; - buttonCallback = e.data.dialogButtonCallback; - } + if (e.dialogButtonText !== undefined) { + buttonText = e.dialogButtonText; + buttonCallback = e.dialogButtonCallback; } - if (!message) { - if (e.message) { - message = e.message; - } - else { - message = e; - } + if (e.message) { + message = e.message; + } + else { + message = e; } if (typeof buttonText == 'undefined') { diff --git a/test/tests/syncRunnerTest.js b/test/tests/syncRunnerTest.js index abab4b71f..e8c1c04bc 100644 --- a/test/tests/syncRunnerTest.js +++ b/test/tests/syncRunnerTest.js @@ -799,6 +799,25 @@ describe("Zotero.Sync.Runner", function () { }); + it("should show a custom button in the error panel", function* () { + win = yield loadZoteroPane(); + var libraryID = Zotero.Libraries.userLibraryID; + + yield runner.sync({ + background: true + }); + + var doc = win.document; + var errorIcon = doc.getElementById('zotero-tb-sync-error'); + assert.isFalse(errorIcon.hidden); + errorIcon.click(); + var panel = win.document.getElementById('zotero-sync-error-panel'); + var buttons = panel.getElementsByTagName('button'); + assert.lengthOf(buttons, 1); + assert.equal(buttons[0].label, Zotero.getString('sync.openSyncPreferences')); + }); + + // TODO: Test multiple long tags and tags across libraries describe("Long Tag Fixer", function () { it("should split a tag", function* () { diff --git a/test/tests/zfsTest.js b/test/tests/zfsTest.js index 9d6750eb1..ca8bb76e2 100644 --- a/test/tests/zfsTest.js +++ b/test/tests/zfsTest.js @@ -821,5 +821,42 @@ describe("Zotero.Sync.Storage.Mode.ZFS", function () { assert.isFalse(result.remoteChanges); assert.isTrue(result.syncRequired); }) + + it("should handle 413 on quota limit", function* () { + var { engine, client, caller } = yield setup(); + var zfs = new Zotero.Sync.Storage.Mode.ZFS({ + apiClient: client + }) + + var file = getTestDataDirectory(); + file.append('test.png'); + var item = yield Zotero.Attachments.importFromFile({ file }); + item.version = 5; + item.synced = true; + yield item.saveTx(); + + server.respond(function (req) { + if (req.method == "POST" + && req.url == `${baseURL}users/1/items/${item.key}/file` + && req.requestBody.indexOf('upload=') == -1 + && req.requestHeaders["If-None-Match"] == "*") { + req.respond( + 413, + { + "Content-Type": "application/json", + "Last-Modified-Version": 10 + }, + "File would exceed quota (299.7 + 0.5 > 300)" + ); + } + }) + + var e = yield getPromiseError(zfs._processUploadFile({ + name: item.libraryKey + })); + assert.ok(e); + assert.equal(e.errorType, 'warning'); + assert.include(e.message, 'would exceed your'); + }) }) })