Esanders has uploaded a new change for review.

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

Change subject: SurfaceFragment: Improve handling of delete all
......................................................................

SurfaceFragment: Improve handling of delete all

Instead of tring to see if the selection covers the entire
document before the delete, instead see if the entire document
has been removed after the delete.

Bug: T107553
Change-Id: I30c4ad2b45210fa97936d634a620705de2a47a46
---
M src/dm/ve.dm.SurfaceFragment.js
M tests/dm/ve.dm.SurfaceFragment.test.js
2 files changed, 49 insertions(+), 26 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/01/249801/1

diff --git a/src/dm/ve.dm.SurfaceFragment.js b/src/dm/ve.dm.SurfaceFragment.js
index 7fbedbe..d9f6a1c 100644
--- a/src/dm/ve.dm.SurfaceFragment.js
+++ b/src/dm/ve.dm.SurfaceFragment.js
@@ -867,21 +867,10 @@
                return this;
        }
 
-       // If selection spans entire document (selectAll) then
-       // replace with an empty paragraph
-       internalListRange = 
this.document.getInternalList().getListNode().getOuterRange();
-       if ( rangeToRemove.start === 0 && rangeToRemove.end >= 
internalListRange.start ) {
-               tx = ve.dm.Transaction.newFromReplacement( this.document, new 
ve.Range( 0, internalListRange.start ), [
-                       { type: 'paragraph' },
-                       { type: '/paragraph' }
-               ] );
-               this.change( tx );
-               rangeAfterRemove = new ve.Range( 1 );
-       } else {
-               tx = ve.dm.Transaction.newFromRemoval( this.document, 
rangeToRemove );
-               this.change( tx );
-               rangeAfterRemove = tx.translateRange( rangeToRemove );
-       }
+       tx = ve.dm.Transaction.newFromRemoval( this.document, rangeToRemove );
+       this.change( tx );
+       rangeAfterRemove = tx.translateRange( rangeToRemove );
+
        if ( !rangeAfterRemove.isCollapsed() ) {
                // If after processing removal transaction range is not 
collapsed it means that not
                // everything got merged nicely (at this moment transaction 
processor is capable of merging
@@ -949,14 +938,24 @@
                }
        }
 
-       // rangeAfterRemove is now guaranteed to be collapsed so make sure that 
it is a content offset
-       rangeAfterRemove = new ve.Range(
-               this.document.data.getNearestContentOffset(
-                       rangeAfterRemove.start,
-                       // If undefined (e.g. cut), default to backwards 
movement
-                       directionAfterDelete || -1
-               )
-       );
+       // If the document was wiped out create an empty paragraph
+       if ( !this.document.data.countNonInternalElements( 1 ) ) {
+               tx = ve.dm.Transaction.newFromInsertion( this.document, 0, [
+                       { type: 'paragraph' },
+                       { type: '/paragraph' }
+               ] );
+               this.change( tx );
+               rangeAfterRemove = new ve.Range( 1 );
+       } else {
+               // rangeAfterRemove is now guaranteed to be collapsed so make 
sure that it is a content offset
+               rangeAfterRemove = new ve.Range(
+                       this.document.data.getNearestContentOffset(
+                               rangeAfterRemove.start,
+                               // If undefined (e.g. cut), default to 
backwards movement
+                               directionAfterDelete || -1
+                       )
+               );
+       }
 
        this.change( [], new ve.dm.LinearSelection( this.getDocument(), 
rangeAfterRemove ) );
 
diff --git a/tests/dm/ve.dm.SurfaceFragment.test.js 
b/tests/dm/ve.dm.SurfaceFragment.test.js
index c44e2af..f0799f5 100644
--- a/tests/dm/ve.dm.SurfaceFragment.test.js
+++ b/tests/dm/ve.dm.SurfaceFragment.test.js
@@ -337,9 +337,7 @@
        var data, doc, surface, fragment;
 
        if ( html ) {
-               doc = new ve.dm.Document(
-                       ve.dm.converter.getModelFromDom( 
ve.createDocumentFromHtml( html ) )
-               );
+               doc = ve.dm.converter.getModelFromDom( 
ve.createDocumentFromHtml( html ) );
        } else {
                doc = ve.dm.example.createExampleDocument();
        }
@@ -404,6 +402,32 @@
                                },
                                expectedRange: new ve.Range( 1 ),
                                msg: 'Backspace after select all spanning 
entire document creates empty paragraph'
+                       },
+                       {
+                               html: '<div rel="ve:Alien">Foo</div><p>Bar</p>',
+                               range: new ve.Range( 0, 6 ),
+                               directionAfterRemove: -1,
+                               expectedData: function ( data ) {
+                                       data.splice( 0, 7,
+                                                       { type: 'paragraph' },
+                                                       { type: '/paragraph' }
+                                               );
+                               },
+                               expectedRange: new ve.Range( 1 ),
+                               msg: 'Delete all when document starts with a 
focusable node'
+                       },
+                       {
+                               html: '<div 
rel="ve:Alien">Foo</div><p>Bar</p><div rel="ve:Alien">Baz</div>',
+                               range: new ve.Range( 0, 9 ),
+                               directionAfterRemove: -1,
+                               expectedData: function ( data ) {
+                                       data.splice( 0, 9,
+                                                       { type: 'paragraph' },
+                                                       { type: '/paragraph' }
+                                               );
+                               },
+                               expectedRange: new ve.Range( 1 ),
+                               msg: 'Delete all when document starts and ends 
with a focusable node'
                        }
                ];
 

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I30c4ad2b45210fa97936d634a620705de2a47a46
Gerrit-PatchSet: 1
Gerrit-Project: VisualEditor/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

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

Reply via email to