this._currentTransaction = null;
},
- transaction: function(callback, context, metadata) {
+ transaction: function(callback, params) {
var toret;
- this.startTransaction(metadata);
+ params = params || {};
+ this.startTransaction(params.metadata);
try {
- toret = callback.call(context);
+ toret = callback.call(params.context || this);
} catch(e) {
+ if(params.error) {
+ params.error(e);
+ }
this.rollbackTransaction();
- throw e;
+ return;
}
this.endTransaction();
return toret;
expect(doc.root.contents().length).to.equal(0);
});
- it('rollbacks and rethrow if error gets thrown', function() {
+ it('rollbacks and calls error handleor if error gets thrown', function() {
var doc = getDocumentFromXML('<root></root>'),
- err = new Error();
+ err = new Error(),
+ spy = sinon.spy();
- expect(function() {
- doc.transaction(function() {
- doc.root.append({tagName: 'div'});
- throw err;
- });
- }).to.throw(err);
+ doc.transaction(function() {
+ doc.root.append({tagName: 'div'});
+ throw err;
+ }, {error: spy});
+ expect(spy.args[0][0]).to.equal(err);
expect(doc.root.contents().length).to.equal(0);
expect(doc.undoStack.length).to.equal(0);
});