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

Reply via email to