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