Divec has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/405926 )
Change subject: ve.dm.Change: Truncate stores as well as transactions on conflict ...................................................................... ve.dm.Change: Truncate stores as well as transactions on conflict Change-Id: I5e07579ded9715384875a2d83498d54a9eb0f808 --- M src/dm/ve.dm.Change.js M tests/dm/ve.dm.Change.test.js 2 files changed, 43 insertions(+), 6 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor refs/changes/26/405926/1 diff --git a/src/dm/ve.dm.Change.js b/src/dm/ve.dm.Change.js index 5ff3bdf..a582371 100644 --- a/src/dm/ve.dm.Change.js +++ b/src/dm/ve.dm.Change.js @@ -432,6 +432,7 @@ if ( rebases[ 0 ] === null ) { rejected = uncommitted.mostRecent( uncommitted.start + i ); transactionsB.length = i; + storesB.length = i; selectionsB = {}; break bLoop; } @@ -658,16 +659,13 @@ */ ve.dm.Change.prototype.unapplyTo = function ( surface ) { var doc = surface.documentModel, - historyLength = doc.completeHistory.length - this.getLength(), - storeLength = doc.store.getLength(); - this.stores.forEach( function ( store ) { - storeLength -= store.getLength(); - } ); + historyLength = doc.completeHistory.length - this.getLength(); this.transactions.slice().reverse().forEach( function ( tx ) { surface.change( tx.reversed() ); } ); doc.completeHistory.length = historyLength; - doc.store.truncate( storeLength ); + doc.storeLengthAtHistoryLength.length = historyLength + 1; + doc.store.truncate( doc.storeLengthAtHistoryLength[ historyLength ] ); }; /** diff --git a/tests/dm/ve.dm.Change.test.js b/tests/dm/ve.dm.Change.test.js index dc9aea1..76f5855 100644 --- a/tests/dm/ve.dm.Change.test.js +++ b/tests/dm/ve.dm.Change.test.js @@ -276,6 +276,45 @@ ); } ); +QUnit.test( 'Rebase with conflicting annotations', function ( assert ) { + var setBold, remove, result, + origData = [ { type: 'paragraph' }, 'A', { type: '/paragraph' } ], + newSurface = function () { + return new ve.dm.Surface( + ve.dm.example.createExampleDocumentFromData( origData ) + ); + }, + surface = newSurface(), + doc = surface.documentModel, + TxRemove = ve.dm.TransactionBuilder.static.newFromRemoval, + TxAnnotate = ve.dm.TransactionBuilder.static.newFromAnnotation, + b = ve.dm.example.bold, + emptyStore = new ve.dm.IndexValueStore(), + bStore = new ve.dm.IndexValueStore( [ b ] ); + + assert.expect( 3 ); + + // Canonical history: text was removed + remove = new ve.dm.Change( 1, [ TxRemove( doc, new ve.Range( 1, 2 ) ) ], [ emptyStore ], {} ); + setBold = new ve.dm.Change( 1, [ TxAnnotate( doc, new ve.Range( 1, 2 ), 'set', b ) ], [ bStore ], {} ); + result = ve.dm.Change.static.rebaseUncommittedChange( remove, setBold ); + assert.deepEqual( + result.rebased.serialize(), + new ve.dm.Change( 2, [], [], {} ).serialize(), + 'Nothing got rebased' + ); + assert.deepEqual( + result.rejected.serialize(), + setBold.serialize(), + 'setBold got rejected' + ); + assert.deepEqual( + result.transposedHistory.serialize(), + remove.serialize(), + 'remove got transposed' + ); +} ); + QUnit.test( 'Serialize/deserialize', function ( assert ) { var origData = [ { type: 'paragraph' }, 'b', 'a', 'r', { type: '/paragraph' } ], newSurface = function () { -- To view, visit https://gerrit.wikimedia.org/r/405926 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I5e07579ded9715384875a2d83498d54a9eb0f808 Gerrit-PatchSet: 1 Gerrit-Project: VisualEditor/VisualEditor Gerrit-Branch: master Gerrit-Owner: Divec <da...@troi.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits