Catrope has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/68607


Change subject: Fix selectNodes() bug with empty non-content branch nodes
......................................................................

Fix selectNodes() bug with empty non-content branch nodes

These kinds of empty nodes shouldn't occur since the converter fills
them with empty paragraphs, but selectNodes() should still behave
correctly for them.

Change-Id: Ia37f3db1c2a84b842e2311cf70642fa66af04d91
---
M modules/ve/test/dm/ve.dm.example.js
M modules/ve/ve.Document.js
2 files changed, 34 insertions(+), 3 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/07/68607/1

diff --git a/modules/ve/test/dm/ve.dm.example.js 
b/modules/ve/test/dm/ve.dm.example.js
index 4af8941..cf17704 100644
--- a/modules/ve/test/dm/ve.dm.example.js
+++ b/modules/ve/test/dm/ve.dm.example.js
@@ -693,6 +693,11 @@
        { 'type': '/paragraph' }
 ];
 
+ve.dm.example.emptyBranch = [
+       { 'type': 'table' },
+       { 'type': '/table' }
+];
+
 /**
  * Sample content data index.
  *
@@ -4103,5 +4108,23 @@
                        }
                ],
                'msg': 'zero-length range in text node after inline node'
+       },
+       {
+               'doc': 'emptyBranch',
+               'range': new ve.Range( 1 ),
+               'mode': 'leaves',
+               'expected': [
+                       // table
+                       {
+                               'node': [ 0],
+                               'range': new ve.Range( 1, 1 ),
+                               'index': 0,
+                               'indexInNode': 0,
+                               'nodeRange': new ve.Range( 1, 1 ),
+                               'nodeOuterRange': new ve.Range( 0, 2 ),
+                               'parentOuterRange': new ve.Range( 0, 2 )
+                       }
+               ],
+               'msg': 'Zero-length range in empty branch node'
        }
 ];
diff --git a/modules/ve/ve.Document.js b/modules/ve/ve.Document.js
index b528dba..aae7ba4 100644
--- a/modules/ve/ve.Document.js
+++ b/modules/ve/ve.Document.js
@@ -60,7 +60,8 @@
  * - `indexInNode`: If range is a zero-length range between two children of 
node,
  *   this is set to the index of the child following range (or to
  *   `node.children.length + 1` if range is between the last child and
- *   the end). Missing in all other cases.
+ *   the end). If range is a zero-length range inside an empty non-content 
branch node, this is 0.
+ *   Missing in all other cases.
  * - `nodeRange`: Range covering the inside of the entire node, not including 
wrapper
  * - `nodeOuterRange`: Range covering the entire node, including wrapper
  * - `parentOuterRange`: Outer range of node's parent. Missing if there is no 
parent
@@ -99,7 +100,8 @@
                parentRange,
                isWrapped,
                isPrevUnwrapped,
-               isNextUnwrapped;
+               isNextUnwrapped,
+               isEmptyBranch;
 
        mode = mode || 'leaves';
        if ( mode !== 'leaves' && mode !== 'branches' && mode !== 'covered' && 
mode !== 'siblings' ) {
@@ -141,6 +143,8 @@
                isPrevUnwrapped = prevNode ? !prevNode.isWrapped() : false;
                // Is there an unwrapped node right after this node?
                isNextUnwrapped = nextNode ? !nextNode.isWrapped() : false;
+               // Is this node an empty non-content branch node?
+               isEmptyBranch = node.getLength() === 0 && !node.isContent() && 
!node.canContainContent();
                // Is the start between prevNode's closing and node or between 
the parent's opening and node?
                startBetween = ( isWrapped ? start === left - 1 : start === 
left ) && !isPrevUnwrapped;
                // Is the end between node and nextNode's opening or between 
node and the parent's closing?
@@ -258,7 +262,7 @@
                                continue;
                        } else {
                                // node is a leaf node and the range is 
entirely inside it
-                               return [ {
+                               retval = [ {
                                        'node': node,
                                        'range': new ve.Range( start, end ),
                                        'index': currentFrame.index,
@@ -269,6 +273,10 @@
                                                parentRange.end + 
currentFrame.node.isWrapped()
                                        )
                                } ];
+                               if ( isEmptyBranch ) {
+                                       retval[0].indexInNode = 0;
+                               }
+                               return retval;
                        }
                } else if ( startInside ) {
                        if ( ( mode === 'leaves' ||

-- 
To view, visit https://gerrit.wikimedia.org/r/68607
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ia37f3db1c2a84b842e2311cf70642fa66af04d91
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Catrope <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to