Esanders has uploaded a new change for review.

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

Change subject: Fix find and repalce viewport search
......................................................................

Fix find and repalce viewport search

We can't blindly point random offsets to getNearestContentOffset as if we
landed in a handlesOwnChildren/ingoreChildren node it will trigger an exception.

In those cases, traverse up the tree and use the node's outer range
to get an offset.

Bug: T96088
Change-Id: Ibf666d27b6288888d3dbfadaeb53ff2d46faa53d
---
M src/ce/ve.ce.Surface.js
M src/ve.Node.js
2 files changed, 25 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/89/205089/1

diff --git a/src/ce/ve.ce.Surface.js b/src/ce/ve.ce.Surface.js
index 29834db..8159e40 100644
--- a/src/ce/ve.ce.Surface.js
+++ b/src/ce/ve.ce.Surface.js
@@ -3691,16 +3691,34 @@
                bottom = top + this.$window.height() - 
this.surface.toolbarHeight + ( padding * 2 ),
                documentRange = new ve.Range( 0, 
this.getModel().getDocument().getInternalList().getListNode().getOuterRange().start
 );
 
+       function highestSkipChildrenNode( childNode ) {
+               var skipChildrenNode = null;
+               childNode.traverseUpstream( function ( node ) {
+                       if ( node.handlesOwnChildren() || 
node.shouldIgnoreChildren() ) {
+                               skipChildrenNode = node;
+                       }
+               } );
+               return skipChildrenNode;
+       }
+
        function binarySearch( offset, range, side ) {
-               var mid, rect,
+               var mid, rect, midNode, skipChildrenNode, nodeRange,
                        start = range.start,
                        end = range.end,
                        lastLength = Infinity;
                while ( range.getLength() < lastLength ) {
                        lastLength = range.getLength();
-                       mid = data.getNearestContentOffset(
-                               Math.round( ( range.start + range.end ) / 2 )
-                       );
+                       mid = Math.round( ( range.start + range.end ) / 2 );
+                       midNode = documentModel.documentNode.getNodeFromOffset( 
mid );
+                       skipChildrenNode = highestSkipChildrenNode( midNode );
+
+                       if ( skipChildrenNode ) {
+                               nodeRange = skipChildrenNode.getOuterRange();
+                               mid = side === 'top' ? nodeRange.end : 
nodeRange.start;
+                       } else {
+                               mid = data.getNearestContentOffset( mid );
+                       }
+
                        rect = surface.getSelectionBoundingRect( new 
ve.dm.LinearSelection( documentModel, new ve.Range( mid ) ) );
                        if ( rect[side] > offset ) {
                                end = mid;
diff --git a/src/ve.Node.js b/src/ve.Node.js
index 8cf4722..fb1c194 100644
--- a/src/ve.Node.js
+++ b/src/ve.Node.js
@@ -347,13 +347,15 @@
  *
  * @method
  * @param {Function} callback Callback method to be called for every traversed 
node. Returning false stops the traversal.
+ * @returns {ve.Node|null} Node which caused the traversal to stop, or null if 
it didn't
  */
 ve.Node.prototype.traverseUpstream = function ( callback ) {
        var node = this;
        while ( node ) {
                if ( callback( node ) === false ) {
-                       break;
+                       return node;
                }
                node = node.getParent();
        }
+       return null;
 };

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibf666d27b6288888d3dbfadaeb53ff2d46faa53d
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <esand...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to