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.
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;
},
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('<root></root>'),
+ 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() {