Catrope has uploaded a new change for review. https://gerrit.wikimedia.org/r/98587
Change subject: Fix JS errors when inserting references ...................................................................... Fix JS errors when inserting references ve.ui.MWReferenceDialog.prototype.teardown: * Pass ranges rather than nodes to transaction builders * Don't do a removal in insertion mode, we know the removal range will be empty ve.dm.Transaction.newFromDocumentInsertion: * Correctly splice the edited internalItem into listData in the case that newDoc isn't a document slice of doc * Rename range to spliceItemRange for clarity * Introduce spliceListNodeRange and set it to either newDoc's listNodeRange or doc's depending on whether newDoc is a slice of doc Bug: 57683 Change-Id: Iae7de7701ae86bed89b707038407243d82249e1a --- M modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js M modules/ve/dm/ve.dm.Transaction.js 2 files changed, 23 insertions(+), 26 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor refs/changes/87/98587/1 diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js b/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js index 67dd955..0b3d1b7 100644 --- a/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js +++ b/modules/ve-mw/ui/dialogs/ve.ui.MWReferenceDialog.js @@ -244,7 +244,7 @@ * @inheritdoc */ ve.ui.MWReferenceDialog.prototype.teardown = function ( data ) { - var i, len, txs, item, newDoc, group, refGroup, listGroup, keyIndex, refNodes, + var i, len, txs, item, newDoc, group, refGroup, listGroup, keyIndex, refNodes, itemNodeRange, surfaceModel = this.surface.getModel(), // Store the original selection browsers may reset it after // the first model change. @@ -296,15 +296,10 @@ this.ref.refGroup = refGroup; } // Update internal node content + itemNodeRange = internalList.getItemNode( this.ref.listIndex ).getRange(); + surfaceModel.change( ve.dm.Transaction.newFromRemoval( doc, itemNodeRange, true ) ); surfaceModel.change( - ve.dm.Transaction.newFromRemoval( - doc, internalList.getItemNode( this.ref.listIndex ).getRange() - ) - ); - surfaceModel.change( - ve.dm.Transaction.newFromDocumentInsertion( - doc, internalList.getItemNode( this.ref.listIndex ).getRange().start, newDoc - ) + ve.dm.Transaction.newFromDocumentInsertion( doc, itemNodeRange.start, newDoc ) ); } @@ -322,15 +317,9 @@ item = internalList.getItemInsertion( this.ref.listGroup, this.ref.listKey, [] ); surfaceModel.change( item.transaction ); this.ref.listIndex = item.index; + itemNodeRange = internalList.getItemNode( this.ref.listIndex ).getRange(); surfaceModel.change( - ve.dm.Transaction.newFromRemoval( - doc, internalList.getItemNode( this.ref.listIndex ), newDoc, true - ) - ); - surfaceModel.change( - ve.dm.Transaction.newFromDocumentInsertion( - doc, internalList.getItemNode( this.ref.listIndex ), newDoc - ) + ve.dm.Transaction.newFromDocumentInsertion( doc, itemNodeRange.start, newDoc ) ); } // Add reference at cursor diff --git a/modules/ve/dm/ve.dm.Transaction.js b/modules/ve/dm/ve.dm.Transaction.js index 34fe19c..2e97981 100644 --- a/modules/ve/dm/ve.dm.Transaction.js +++ b/modules/ve/dm/ve.dm.Transaction.js @@ -167,7 +167,8 @@ * @returns {ve.dm.Transaction} Transaction that inserts the nodes and updates the internal list */ ve.dm.Transaction.newFromDocumentInsertion = function ( doc, offset, newDoc, newDocRange ) { - var i, len, merge, data, metadata, listData, listMetadata, oldEndOffset, newEndOffset, tx, insertion, range, + var i, len, merge, data, metadata, listData, listMetadata, oldEndOffset, newEndOffset, tx, + insertion, spliceItemRange, spliceListNodeRange, listNode = doc.internalList.getListNode(), listNodeRange = listNode.getRange(), newListNode = newDoc.internalList.getListNode(), @@ -265,18 +266,25 @@ i = 0; // Find item node in doc while ( - ( range = doc.internalList.getItemNode( i ).getRange() ) && - offset > range.end + ( spliceItemRange = doc.internalList.getItemNode( i ).getRange() ) && + offset > spliceItemRange.end ) { i++; } - // Get range from newDoc - range = newDoc.internalList.getItemNode( i ).getRange(); - ve.batchSplice( listData, range.start - newListNodeRange.start, - range.end - range.start, data.data ); - ve.batchSplice( listMetadata, range.start - newListNodeRange.start, - range.end - range.start, metadata.data ); + if ( newDoc.origDoc === doc ) { + // Get spliceItemRange from newDoc + spliceItemRange = newDoc.internalList.getItemNode( i ).getRange(); + spliceListNodeRange = newListNodeRange; + } else { + // Get spliceItemRange from doc; the while loop has already set it + spliceListNodeRange = listNodeRange; + } + ve.batchSplice( listData, spliceItemRange.start - spliceListNodeRange.start, + spliceItemRange.end - spliceItemRange.start, data.data ); + ve.batchSplice( listMetadata, spliceItemRange.start - spliceListNodeRange.start, + spliceItemRange.end - spliceItemRange.start, metadata.data ); + tx.pushRetain( listNodeRange.start ); tx.pushReplace( doc, listNodeRange.start, listNodeRange.end - listNodeRange.start, listData, listMetadata -- To view, visit https://gerrit.wikimedia.org/r/98587 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iae7de7701ae86bed89b707038407243d82249e1a Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/VisualEditor Gerrit-Branch: master Gerrit-Owner: Catrope <roan.katt...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits