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