diff --git a/chrome/content/zotero/xpcom/data/dataObject.js b/chrome/content/zotero/xpcom/data/dataObject.js index 2fd72ed1d..7eaebb807 100644 --- a/chrome/content/zotero/xpcom/data/dataObject.js +++ b/chrome/content/zotero/xpcom/data/dataObject.js @@ -1154,7 +1154,7 @@ Zotero.DataObject.prototype.erase = Zotero.Promise.coroutine(function* (options) Zotero.DB.requireTransaction(); Zotero.DataObject.prototype._initErase.call(this, env); yield this._eraseData(env); - Zotero.DataObject.prototype._finalizeErase.call(this, env); + yield Zotero.DataObject.prototype._finalizeErase.call(this, env); } }); @@ -1176,7 +1176,10 @@ Zotero.DataObject.prototype._initErase = function (env) { } }; -Zotero.DataObject.prototype._finalizeErase = function (env) { +Zotero.DataObject.prototype._finalizeErase = Zotero.Promise.coroutine(function* (env) { + // Delete versions from sync cache + yield Zotero.Sync.Data.Local.deleteCacheObject(this.objectType, this._libraryID, this._key); + Zotero.DB.addCurrentCallback("commit", function () { this.ObjectsClass.unload(env.deletedObjectIDs || this.id); }.bind(this)); @@ -1189,7 +1192,7 @@ Zotero.DataObject.prototype._finalizeErase = function (env) { env.notifierData ); } -} +}); Zotero.DataObject.prototype.toResponseJSON = Zotero.Promise.coroutine(function* (options) { diff --git a/chrome/content/zotero/xpcom/sync/syncLocal.js b/chrome/content/zotero/xpcom/sync/syncLocal.js index 9710df39f..a5ba10f7a 100644 --- a/chrome/content/zotero/xpcom/sync/syncLocal.js +++ b/chrome/content/zotero/xpcom/sync/syncLocal.js @@ -492,6 +492,14 @@ Zotero.Sync.Data.Local = { }), + deleteCacheObject: function (objectType, libraryID, key) { + var sql = "DELETE FROM syncCache WHERE libraryID=? AND key=? " + + "AND syncObjectTypeID IN (SELECT syncObjectTypeID FROM " + + "syncObjectTypes WHERE name=?)";; + return Zotero.DB.queryAsync(sql, [libraryID, key, objectType]); + }, + + resolveConflicts: function (conflicts) { var io = { dataIn: { diff --git a/test/tests/dataObjectTest.js b/test/tests/dataObjectTest.js index c181aa211..34fe1a3e2 100644 --- a/test/tests/dataObjectTest.js +++ b/test/tests/dataObjectTest.js @@ -295,6 +295,21 @@ describe("Zotero.DataObject", function() { Zotero.Notifier.unregisterObserver(id); } }) + + it("should delete object versions from sync cache", function* () { + for (let type of types) { + let obj = yield createDataObject(type); + let libraryID = obj.libraryID; + let key = obj.key; + let json = yield obj.toJSON(); + yield Zotero.Sync.Data.Local.saveCacheObjects(type, libraryID, [json]); + yield obj.eraseTx(); + let versions = yield Zotero.Sync.Data.Local.getCacheObjectVersions( + type, libraryID, key + ); + assert.lengthOf(versions, 0); + } + }) }) describe("#updateVersion()", function() { diff --git a/test/tests/syncLocalTest.js b/test/tests/syncLocalTest.js index 8dd213d00..ce4280ee6 100644 --- a/test/tests/syncLocalTest.js +++ b/test/tests/syncLocalTest.js @@ -204,7 +204,7 @@ describe("Zotero.Sync.Data.Local", function() { var type = 'item'; var objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type); - // Create object in cache + // Create object, generate JSON, and delete var obj = yield createDataObject(type, { version: 10 }); var jsonData = yield obj.toJSON(); var key = jsonData.key = obj.key; @@ -214,16 +214,14 @@ describe("Zotero.Sync.Data.Local", function() { version: jsonData.version, data: jsonData }; - yield Zotero.Sync.Data.Local.saveCacheObjects(type, libraryID, [json]); + // Delete object locally + yield obj.eraseTx(); // Create new version in cache, simulating a download json.version = jsonData.version = 15; jsonData.title = Zotero.Utilities.randomString(); yield Zotero.Sync.Data.Local.saveCacheObjects(type, libraryID, [json]); - // Delete object locally - yield obj.eraseTx(); - waitForWindow('chrome://zotero/content/merge.xul', function (dialog) { var doc = dialog.document; var wizard = doc.documentElement; @@ -243,13 +241,13 @@ describe("Zotero.Sync.Data.Local", function() { assert.isFalse(obj); }) - it("should handle restore locally deleted item", function* () { + it("should restore locally deleted item", function* () { var libraryID = Zotero.Libraries.userLibraryID; var type = 'item'; var objectsClass = Zotero.DataObjectUtilities.getObjectsClassForObjectType(type); - // Create object in cache + // Create object, generate JSON, and delete var obj = yield createDataObject(type, { version: 10 }); var jsonData = yield obj.toJSON(); var key = jsonData.key = obj.key; @@ -259,16 +257,13 @@ describe("Zotero.Sync.Data.Local", function() { version: jsonData.version, data: jsonData }; - yield Zotero.Sync.Data.Local.saveCacheObjects(type, libraryID, [json]); + yield obj.eraseTx(); // Create new version in cache, simulating a download json.version = jsonData.version = 15; jsonData.title = Zotero.Utilities.randomString(); yield Zotero.Sync.Data.Local.saveCacheObjects(type, libraryID, [json]); - // Delete object locally - yield obj.eraseTx(); - waitForWindow('chrome://zotero/content/merge.xul', function (dialog) { var doc = dialog.document; var wizard = doc.documentElement;