Esanders has uploaded a new change for review.
https://gerrit.wikimedia.org/r/92424
Change subject: Tests for paste
......................................................................
Tests for paste
Simple test for ve.ce.Surface#afterPaste, and more extensive
tests for ve.dm.LinearData#sanitize.
Change-Id: Ic44c6f9abc969fd773b9af556df3e27dca2f9291
---
M modules/ve/test/ce/ve.ce.Surface.test.js
M modules/ve/test/dm/ve.dm.LinearData.test.js
2 files changed, 135 insertions(+), 0 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor
refs/changes/24/92424/1
diff --git a/modules/ve/test/ce/ve.ce.Surface.test.js
b/modules/ve/test/ce/ve.ce.Surface.test.js
index c6a85a6..69e3d1e 100644
--- a/modules/ve/test/ce/ve.ce.Surface.test.js
+++ b/modules/ve/test/ce/ve.ce.Surface.test.js
@@ -261,6 +261,66 @@
} );
+QUnit.test( 'afterPaste', function ( assert ) {
+ var i,
+ cases = [
+ {
+ 'documentHtml': '<p></p>',
+ 'range': new ve.Range( 1 ),
+ 'pasteTargetHtml': 'Foo',
+ 'pasteSpecial': false,
+ 'expectedRange': new ve.Range( 6 ),
+ 'expectedOps': [
+ [
+ {
+ 'type': 'replace',
+ 'insert': [
+ { 'type':
'paragraph', 'internal': { 'generated': 'wrapper' } },
+ 'F', 'o', 'o',
+ { 'type':
'/paragraph' }
+ ],
+ 'remove': []
+ },
+ { 'type': 'retain', 'length': 4
}
+ ]
+ ],
+ 'msg': 'Plain text paste into empty paragraph'
+ }
+ ];
+
+ QUnit.expect( cases.length * 2 );
+
+ function testRunner( documentHtml, pasteTargetHtml, range, expectedOps,
pasteSpecial, expectedRange, msg ) {
+ var i, txs, ops,
+ surface = ve.test.utils.createSurfaceFromHtml(
documentHtml ),
+ view = surface.getView(),
+ model = surface.getModel();
+
+ model.change( null, range );
+ view.pasteSpecial = pasteSpecial;
+ view.$pasteTarget.html( pasteTargetHtml );
+ view.afterPaste();
+ txs = model.getHistory()[0].stack;
+ ops = [];
+ for ( i = 0; i < txs.length; i++ ) {
+ ops.push( txs[i].getOperations() );
+ }
+ msg += ': ' + ( pasteSpecial ? 'paste special' : 'paste' );
+ assert.deepEqual( ops, expectedOps, msg + ': operations' );
+ assert.deepEqual( model.getSelection(), expectedRange, msg +
': range' );
+
+ surface.destroy();
+ }
+
+ for ( i = 0; i < cases.length; i++ ) {
+ testRunner(
+ cases[i].documentHtml, cases[i].pasteTargetHtml,
cases[i].range,
+ cases[i].expectedOps, cases[i].pasteSpecial,
cases[i].expectedRange, cases[i].msg
+ );
+ }
+
+} );
+
/* Methods with return values */
// TODO: ve.ce.Surface.static.getClipboardHash
// TODO: ve.ce.Surface#hasSlugAtOffset
diff --git a/modules/ve/test/dm/ve.dm.LinearData.test.js
b/modules/ve/test/dm/ve.dm.LinearData.test.js
index 6fd379e..b5d63c4 100644
--- a/modules/ve/test/dm/ve.dm.LinearData.test.js
+++ b/modules/ve/test/dm/ve.dm.LinearData.test.js
@@ -92,3 +92,78 @@
);
} );
+
+QUnit.test( 'sanitize', function ( assert ) {
+ var i, fullData, result, data,
+ store = new ve.dm.IndexValueStore(),
+ internalList = new ve.dm.InternalList(),
+ cases = [
+ {
+ 'html': '<p style="text-shadow: 0 0 1px
#000;">F<b>o</b>o</p>',
+ 'data': [
+ { 'type': 'paragraph' },
+ 'F', ['o', [0]], 'o',
+ { 'type': '/paragraph' },
+ { 'type': 'internalList' },
+ { 'type': '/internalList' }
+ ],
+ 'rules': { 'removeHtmlAttributes': true },
+ 'msg': 'HTML attributes removed'
+ },
+ {
+ 'html': '<p>B<abbr>a</abbr>r<img
src="Image.jpg"/></p>',
+ 'data': [
+ { 'type': 'paragraph' },
+ 'B', 'r',
+ { 'type': '/paragraph' },
+ { 'type': 'internalList' },
+ { 'type': '/internalList' }
+ ],
+ 'rules': { 'blacklist': ['alienInline','image']
},
+ 'msg': 'Blacklisted nodes removed'
+ },
+ {
+ 'html': '<p>B<i><b>a</b>z</i></p>',
+ 'data': [
+ { 'type': 'paragraph' },
+ 'B', 'a', 'z',
+ { 'type': '/paragraph' },
+ { 'type': 'internalList' },
+ { 'type': '/internalList' }
+ ],
+ 'plainText': true,
+ 'msg': 'Annotations removed in plainText mode'
+ },
+ {
+ 'html': '<p>Foo</p><p></p><h1></h1><p>Bar</p>',
+ 'data': [
+ { 'type': 'paragraph' },
+ 'F', 'o', 'o',
+ { 'type': '/paragraph' },
+ { 'type': 'paragraph' },
+ 'B', 'a', 'r',
+ { 'type': '/paragraph' },
+ { 'type': 'internalList' },
+ { 'type': '/internalList' }
+ ],
+ 'msg': 'Empty content nodes are stripped'
+ }
+ ];
+
+ QUnit.expect( cases.length );
+ for ( i = 0; i < cases.length; i++ ) {
+ fullData = ve.dm.converter.getDataFromDom(
ve.createDocumentFromHtml( cases[i].html ), store, internalList );
+ result = ve.dm.Document.static.splitData( fullData, true );
+ data = result.elementData;
+ data.sanitize( cases[i].rules || {}, cases[i].plainText );
+ assert.deepEqualWithDomElements( data.data, cases[i].data,
cases[i].msg );
+ }
+} );
+
+// TODO: ve.dm.LinearData.static.getType
+// TODO: ve.dm.LinearData.static.isElementData
+// TODO: ve.dm.LinearData.static.isOpenElementData
+// TODO: ve.dm.LinearData.static.isCloseElementData
+// TODO: ve.dm.LinearData#push
+// TODO: ve.dm.LinearData#getDataSlice
+// TODO: ve.dm.LinearData#clone
--
To view, visit https://gerrit.wikimedia.org/r/92424
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic44c6f9abc969fd773b9af556df3e27dca2f9291
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits