From f63769e206281f306f6c2cb937358837da450185 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Wed, 2 Apr 2014 21:22:47 +0200 Subject: [PATCH] smartxml: transaction rollback fix Not resetting transformationLevel counter on rollback caused subsequent top level transformations to not being pushed to undo stack which broke undo in that scenario. --- src/smartxml/smartxml.js | 1 + src/smartxml/smartxml.test.js | 23 +++++++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/smartxml/smartxml.js b/src/smartxml/smartxml.js index c23e06d..7d3f332 100644 --- a/src/smartxml/smartxml.js +++ b/src/smartxml/smartxml.js @@ -581,6 +581,7 @@ $.extend(Document.prototype, Backbone.Events, { this.replaceRoot(this._rollbackBackup); this._rollbackBackup = null; this._currentTransaction = null; + this._transformationLevel = 0; }, transaction: function(callback, params) { diff --git a/src/smartxml/smartxml.test.js b/src/smartxml/smartxml.test.js index e4e2724..5d1ca3e 100644 --- a/src/smartxml/smartxml.test.js +++ b/src/smartxml/smartxml.test.js @@ -1679,6 +1679,29 @@ describe('smartxml', function() { doc.redo(); expect(doc.root.getAttr('t')).to.equal('1'); }); + it('can perform undo of an operation performed after automatic transaction rollback', function() { + var doc = getDocumentFromXML('
'), + extension = {document: {transformations: { + throwingTransformation: function() { throw new Error(); } + }}}; + + doc.registerExtension(extension); + + doc.throwingTransformation(); + + doc.transaction(function() { + doc.root.setAttr('x', '2'); + }); + + expect(doc.undoStack.length).to.equal(1); + expect(doc.root.getAttr('x')).to.equal('2'); + + doc.undo(); + + expect(doc.undoStack.length).to.equal(0); + expect(doc.root.getAttr('x')).to.be.undefined; + + }); }); }); -- 2.20.1