From 95d7d373a581746ce68ada33dd890ecc385245ed Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Wed, 19 Mar 2014 13:16:53 +0100 Subject: [PATCH] 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. --- src/smartxml/smartxml.js | 7 ++++++- src/smartxml/smartxml.test.js | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) 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() { -- 2.20.1