From: Aleksander Ɓukasz Date: Wed, 19 Mar 2014 12:16:53 +0000 (+0100) Subject: smartxml: Automatically rollback transaction on error thrown X-Git-Url: https://git.mdrn.pl/fnpeditor.git/commitdiff_plain/95d7d373a581746ce68ada33dd890ecc385245ed smartxml: Automatically rollback transaction on error thrown This works for: - implicit transactions created for transformations run when there is no transaction in progress - transactions started by Document.transaction call It won't work for transactions started by Document.transactionStart. --- diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index 31faef0..663b332 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -586,7 +586,12 @@ $.extend(Document.prototype, Backbone.Events, { transaction: function(callback, context, metadata) { var toret; this.startTransaction(metadata); - toret = callback.call(context); + try { + toret = callback.call(context); + } catch(e) { + this.rollbackTransaction(); + throw e; + } this.endTransaction(); return toret; }, diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index c792cf9..d1eaf22 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -1660,6 +1660,21 @@ describe('smartxml', function() { expect(doc.undoStack.length).to.equal(0, 'nothing to undo'); expect(doc.root.contents().length).to.equal(0); }); + + it('rollbacks and rethrow if error gets thrown', function() { + var doc = getDocumentFromXML(''), + err = new Error(); + + expect(function() { + doc.transaction(function() { + doc.root.append({tagName: 'div'}); + throw err; + }); + }).to.throw(err); + + expect(doc.root.contents().length).to.equal(0); + expect(doc.undoStack.length).to.equal(0); + }); }); describe('Regression tests', function() {