Esanders has uploaded a new change for review.

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

Change subject: Add clipboard tests and fix transclusion clipboard logic
......................................................................

Add clipboard tests and fix transclusion clipboard logic

Run isForClipboard path in MWTransclusion node
even if we have originalDomElements.

Change-Id: Ib5c77888ef41d26e827dbb9a20925e251527a99a
---
M modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
M modules/ve-mw/tests/dm/ve.dm.Converter.test.js
M modules/ve-mw/tests/dm/ve.dm.mwExample.js
3 files changed, 77 insertions(+), 21 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/44/192244/1

diff --git a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js 
b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
index 61cf5a2..e86d265 100644
--- a/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
+++ b/modules/ve-mw/dm/nodes/ve.dm.MWTransclusionNode.js
@@ -97,9 +97,18 @@
 };
 
 ve.dm.MWTransclusionNode.static.toDomElements = function ( dataElement, doc, 
converter ) {
-       var els, currentDom, i, len, wrapper, span,
+       var els, i, len, span,
                index = converter.getStore().indexOfHash( OO.getHash( [ 
this.getHashObject( dataElement ), undefined ] ) ),
                originalMw = dataElement.attributes.originalMw;
+
+       function wrapTextNode( node ) {
+               if ( node.nodeType === Node.TEXT_NODE ) {
+                       var wrapper = doc.createElement( 'span' );
+                       wrapper.appendChild( node );
+                       return wrapper;
+               }
+               return node;
+       }
 
        // If the transclusion is unchanged just send back the
        // original DOM elements so selser can skip over it
@@ -112,19 +121,15 @@
                // The object in the store is also used for CE rendering so 
return a copy
                els = ve.copyDomElements( dataElement.originalDomElements, doc 
);
        } else {
-               if ( dataElement.originalDomElements ) {
+               if ( converter.isForClipboard() && index !== null ) {
+                       // For the clipboard use the current DOM contents so 
the user has something
+                       // meaningful to paste into external applications
+                       els = ve.copyDomElements( converter.getStore().value( 
index ), doc );
+                       els[0] = wrapTextNode( els[0] );
+               } else if ( dataElement.originalDomElements ) {
                        els = [ doc.createElement( 
dataElement.originalDomElements[0].nodeName ) ];
                } else {
                        els = [ doc.createElement( 'span' ) ];
-                       if ( converter.isForClipboard() ) {
-                               // For the clipboard use the current DOM 
contents so the user has something
-                               // meaningful to paste into external 
applications
-                               currentDom = converter.getStore().value( index 
);
-                               if ( currentDom ) {
-                                       // Ignore currentDom[0] as that is the 
data-mw span we are recreating
-                                       els = els.concat( ve.copyDomElements( 
currentDom.slice( 1 ), doc ) );
-                               }
-                       }
                }
                // All we need to send back to Parsoid is the original 
transclusion marker, with a
                // reconstructed data-mw property.
@@ -153,11 +158,7 @@
                // ... and mark all but the first child as ignorable
                for ( i = 1, len = els.length; i < len; i++ ) {
                        // Wrap plain text nodes so we can give them an 
attribute
-                       if ( els[i].nodeType === Node.TEXT_NODE ) {
-                               wrapper = doc.createElement( 'span' );
-                               wrapper.appendChild( els[i] );
-                               els[i] = wrapper;
-                       }
+                       els[i] = wrapTextNode( els[i] );
                        els[i].setAttribute( 'data-ve-ignore', 'true' );
                }
        }
diff --git a/modules/ve-mw/tests/dm/ve.dm.Converter.test.js 
b/modules/ve-mw/tests/dm/ve.dm.Converter.test.js
index e7d84e5..7a51bf8 100644
--- a/modules/ve-mw/tests/dm/ve.dm.Converter.test.js
+++ b/modules/ve-mw/tests/dm/ve.dm.Converter.test.js
@@ -41,7 +41,7 @@
        var msg, caseItem,
                cases = ve.dm.mwExample.domToDataCases;
 
-       QUnit.expect( 2 * ve.getObjectKeys( cases ).length );
+       QUnit.expect( 3 * ve.getObjectKeys( cases ).length );
 
        ve.test.utils.modelRegistrySetup();
        for ( msg in cases ) {
diff --git a/modules/ve-mw/tests/dm/ve.dm.mwExample.js 
b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
index 45c6bd6..558e43b 100644
--- a/modules/ve-mw/tests/dm/ve.dm.mwExample.js
+++ b/modules/ve-mw/tests/dm/ve.dm.mwExample.js
@@ -32,12 +32,27 @@
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Test&quot;,&quot;href&quot;:&quot;./Template:Test&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;Hello,
 world!&quot;}},&quot;i&quot;:0}}]}"' +
                '>' +
                '</span>',
+       blockOpenClipboard:
+               '<div about="#mwt1" typeof="mw:Transclusion"' +
+                       ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Test&quot;,&quot;href&quot;:&quot;./Template:Test&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;Hello,
 world!&quot;}},&quot;i&quot;:0}}]}"' +
+                       ' data-ve-no-generated-contents="true"' +
+               '>' +
+                       '&nbsp;' +
+               '</div>',
        blockOpenFromDataModified:
                '<span typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Test&quot;,&quot;href&quot;:&quot;./Template:Test&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;Hello,
 globe!&quot;}},&quot;i&quot;:0}}]}"' +
                '>' +
                '</span>',
+       blockOpenModifiedClipboard:
+               '<span typeof="mw:Transclusion"' +
+                       ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Test&quot;,&quot;href&quot;:&quot;./Template:Test&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;Hello,
 globe!&quot;}},&quot;i&quot;:0}}]}"' +
+                       ' data-ve-no-generated-contents="true"' +
+               '>' +
+                       '&nbsp;' +
+               '</span>',
        blockContent: '<p about="#mwt1" data-parsoid="{}">Hello, world!</p>',
+       blockContentClipboard: '<p about="#mwt1" data-parsoid="{}" 
data-ve-ignore="true">Hello, world!</p>',
        inlineOpen:
                '<span about="#mwt1" typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline&quot;,&quot;href&quot;:&quot;./Template:Inline&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;1,234&quot;}},&quot;i&quot;:0}}]}"'
 +
@@ -50,10 +65,21 @@
                '<span typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline&quot;,&quot;href&quot;:&quot;./Template:Inline&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;1,234&quot;}},&quot;i&quot;:0}}]}"'
 +
                '>',
+       inlineOpenClipboard:
+               '<span about="#mwt1" typeof="mw:Transclusion"' +
+                       ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline&quot;,&quot;href&quot;:&quot;./Template:Inline&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;1,234&quot;}},&quot;i&quot;:0}}]}"'
 +
+                       ' data-ve-no-generated-contents="true"' +
+               '>',
        inlineOpenFromDataModified:
                '<span typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline&quot;,&quot;href&quot;:&quot;./Template:Inline&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;5,678&quot;}},&quot;i&quot;:0}}]}"'
 +
                '>',
+       inlineOpenModifiedClipboard:
+               '<span typeof="mw:Transclusion"' +
+                       ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline&quot;,&quot;href&quot;:&quot;./Template:Inline&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;5,678&quot;}},&quot;i&quot;:0}}]}"'
 +
+                       ' data-ve-no-generated-contents="true"' +
+               '>' +
+                       '&nbsp;',
        inlineContent: '$1,234.00',
        inlineClose: '</span>',
        mixed:
@@ -65,6 +91,12 @@
                '<span typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline&quot;,&quot;href&quot;:&quot;./Template:Inline&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;5,678&quot;}},&quot;i&quot;:0}}]}"'
 +
                '></span>',
+       mixedClipboard:
+               '<span typeof="mw:Transclusion"' +
+                       ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Inline&quot;,&quot;href&quot;:&quot;./Template:Inline&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;5,678&quot;}},&quot;i&quot;:0}}]}"'
 +
+                       ' data-ve-no-generated-contents="true"' +
+               '>&nbsp;</span>' +
+               '<span about="#mwt1" data-ve-ignore="true">Foo</span>',
        pairOne:
                '<p about="#mwt1" typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo&quot;}},&quot;i&quot;:0}}]}"
 data-parsoid="1"' +
@@ -77,6 +109,12 @@
                '<span typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo&quot;}},&quot;i&quot;:0}}]}"'
 +
                '></span>',
+       pairClipboard:
+               '<p about="#mwt1" typeof="mw:Transclusion"' +
+                       ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;foo&quot;}},&quot;i&quot;:0}}]}"'
 +
+                       ' data-parsoid="1"' +
+                       ' data-ve-no-generated-contents="true"' +
+               '>foo</p>',
        meta:
                '<link rel="mw:PageProp/Category" href="./Category:Page" 
about="#mwt1" typeof="mw:Transclusion"' +
                        ' 
data-mw="{&quot;parts&quot;:[{&quot;template&quot;:{&quot;target&quot;:{&quot;wt&quot;:&quot;Template:Echo&quot;,&quot;href&quot;:&quot;./Template:Echo&quot;},&quot;params&quot;:{&quot;1&quot;:{&quot;wt&quot;:&quot;[[Category:Page]]\\n[[Category:Book]]&quot;}},&quot;i&quot;:0}}]}">'
 +
@@ -861,7 +899,8 @@
                        ve.dm.mwExample.MWTransclusion.blockStoreItems
                ],
                normalizedBody: ve.dm.mwExample.MWTransclusion.blockOpen + 
ve.dm.mwExample.MWTransclusion.blockContent,
-               fromDataBody: ve.dm.mwExample.MWTransclusion.blockOpenFromData
+               fromDataBody: ve.dm.mwExample.MWTransclusion.blockOpenFromData,
+               clipboardBody: 
ve.dm.mwExample.MWTransclusion.blockOpenClipboard + 
ve.dm.mwExample.MWTransclusion.blockContentClipboard
        },
        'mw:Transclusion (block level - modified)': {
                body: ve.dm.mwExample.MWTransclusion.blockOpen + 
ve.dm.mwExample.MWTransclusion.blockContent,
@@ -878,7 +917,8 @@
                        
model.data.data[0].attributes.mw.parts[0].template.params['1'].wt = 'Hello, 
globe!';
                },
                normalizedBody: 
ve.dm.mwExample.MWTransclusion.blockOpenModified,
-               fromDataBody: 
ve.dm.mwExample.MWTransclusion.blockOpenFromDataModified
+               fromDataBody: 
ve.dm.mwExample.MWTransclusion.blockOpenFromDataModified,
+               clipboardBody: 
ve.dm.mwExample.MWTransclusion.blockOpenModifiedClipboard
        },
        'mw:Transclusion (inline)': {
                body: ve.dm.mwExample.MWTransclusion.inlineOpen + 
ve.dm.mwExample.MWTransclusion.inlineContent + 
ve.dm.mwExample.MWTransclusion.inlineClose,
@@ -894,7 +934,8 @@
                        ve.dm.mwExample.MWTransclusion.inlineStoreItems
                ],
                normalizedBody: ve.dm.mwExample.MWTransclusion.inlineOpen + 
ve.dm.mwExample.MWTransclusion.inlineContent + 
ve.dm.mwExample.MWTransclusion.inlineClose,
-               fromDataBody: ve.dm.mwExample.MWTransclusion.inlineOpenFromData 
+ ve.dm.mwExample.MWTransclusion.inlineClose
+               fromDataBody: ve.dm.mwExample.MWTransclusion.inlineOpenFromData 
+ ve.dm.mwExample.MWTransclusion.inlineClose,
+               clipboardBody: 
ve.dm.mwExample.MWTransclusion.inlineOpenClipboard + 
ve.dm.mwExample.MWTransclusion.inlineContent + 
ve.dm.mwExample.MWTransclusion.inlineClose
        },
        'mw:Transclusion (inline - modified)': {
                body: ve.dm.mwExample.MWTransclusion.inlineOpen + 
ve.dm.mwExample.MWTransclusion.inlineContent + 
ve.dm.mwExample.MWTransclusion.inlineClose,
@@ -913,11 +954,13 @@
                        
model.data.data[1].attributes.mw.parts[0].template.params['1'].wt = '5,678';
                },
                normalizedBody: 
ve.dm.mwExample.MWTransclusion.inlineOpenModified + 
ve.dm.mwExample.MWTransclusion.inlineClose,
-               fromDataBody: 
ve.dm.mwExample.MWTransclusion.inlineOpenFromDataModified + 
ve.dm.mwExample.MWTransclusion.inlineClose
+               fromDataBody: 
ve.dm.mwExample.MWTransclusion.inlineOpenFromDataModified + 
ve.dm.mwExample.MWTransclusion.inlineClose,
+               clipboardBody: 
ve.dm.mwExample.MWTransclusion.inlineOpenModifiedClipboard + 
ve.dm.mwExample.MWTransclusion.inlineClose
        },
        'two mw:Transclusion nodes with identical params but different 
htmlAttributes': {
                body: ve.dm.mwExample.MWTransclusion.pairOne + 
ve.dm.mwExample.MWTransclusion.pairTwo,
                fromDataBody: ve.dm.mwExample.MWTransclusion.pairFromData + 
ve.dm.mwExample.MWTransclusion.pairFromData,
+               clipboardBody: ve.dm.mwExample.MWTransclusion.pairClipboard + 
ve.dm.mwExample.MWTransclusion.pairClipboard,
                data: [
                        {
                                type: 'mwTransclusionBlock',
@@ -1266,6 +1309,11 @@
                        
'data-mw="{&quot;name&quot;:&quot;ref&quot;,&quot;body&quot;:' +
                        '{&quot;html&quot;:&quot;Foo<!-- bar 
-->&quot;},&quot;attrs&quot;:{}}" ' +
                        'typeof="mw:Extension/ref"></span></p>',
+               clipboardBody: '<p><span typeof="mw:Extension/ref" ' +
+                       'data-mw="{&quot;attrs&quot;:{},&quot;body&quot;:' +
+                       '{&quot;html&quot;:&quot;Foo<span 
rel=\\&quot;ve:Comment\\&quot; data-ve-comment=\\&quot; bar 
\\&quot;></span>&quot;},&quot;name&quot;:&quot;ref&quot;}" ' +
+                       '>' +
+                       '<sup>[1]</sup></span></p>',
                head: '<base href="http://example.com"; />',
                data: [
                        { type: 'paragraph' },
@@ -1522,12 +1570,19 @@
                        '<meta property="mw:bar" content="baz" /><!--barbaz-->' 
+
                        '<link rel="mw:PageProp/Category" 
href="./Category:Foo_foo#Bar baz%23quux" />' +
                        '<meta typeof="mw:Placeholder" data-parsoid="foobar" 
/>',
+               clipboardBody: '<span rel="ve:Comment" data-ve-comment=" No 
content conversion "></span><meta property="mw:ThisIsAnAlien" /><p>Foo' +
+                       '<link rel="mw:PageProp/Category" href="./Category:Bar" 
/>Bar' +
+                       '<meta property="mw:foo" content="bar" />Ba<span 
rel="ve:Comment" data-ve-comment=" inline "></span>z</p>' +
+                       '<meta property="mw:bar" content="baz" /><span 
rel="ve:Comment" data-ve-comment="barbaz"></span>' +
+                       '<link rel="mw:PageProp/Category" 
href="./Category:Foo_foo#Bar baz%23quux" />' +
+                       '<meta typeof="mw:Placeholder" data-parsoid="foobar" 
/>',
                head: '<base href="http://example.com"; />',
                data: ve.dm.mwExample.withMeta
        },
        'RDFa types spread across two attributes, about grouping is forced': {
                body: ve.dm.mwExample.MWTransclusion.mixed,
                fromDataBody: ve.dm.mwExample.MWTransclusion.mixedFromData,
+               clipboardBody: ve.dm.mwExample.MWTransclusion.mixedClipboard,
                data: [
                        { type: 'paragraph', internal: { generated: 'wrapper' } 
},
                        ve.dm.mwExample.MWTransclusion.mixedDataOpen,

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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ib5c77888ef41d26e827dbb9a20925e251527a99a
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

Reply via email to