Esanders has uploaded a new change for review.

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

Change subject: Use innerText for setting clipboard plain text
......................................................................

Use innerText for setting clipboard plain text

jQuery.text has no line breaks so is a poor way to set
clipboard text. innerText by specification is what the
user expects to be wrriten to the clipboard.

Change-Id: I5aabe57bfc2f06687e90f03ba67e8c2776dffe9e
---
M src/ce/ve.ce.Surface.js
M tests/ce/ve.ce.Surface.test.js
2 files changed, 43 insertions(+), 12 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/VisualEditor/VisualEditor 
refs/changes/45/300845/1

diff --git a/src/ce/ve.ce.Surface.js b/src/ce/ve.ce.Surface.js
index a2a3d9d..eef4942 100644
--- a/src/ce/ve.ce.Surface.js
+++ b/src/ce/ve.ce.Surface.js
@@ -1659,7 +1659,10 @@
                        clipboardData.setData( 'text/xcustom', clipboardKey );
                }
                clipboardData.setData( 'text/html', this.$pasteTarget.html() );
-               clipboardData.setData( 'text/plain', this.$pasteTarget.text() );
+               // innerText "approximates the text the user would get if they 
highlighted the
+               // contents of the element with the cursor and then copied to 
the clipboard." - MDN
+               // Use $.text as a fallback for Firefox <= 44
+               clipboardData.setData( 'text/plain', this.$pasteTarget[ 0 
].innerText || this.$pasteTarget.text() );
        } else {
                // Support: IE
                // If direct clipboard editing is not allowed, we must use the 
pasteTarget to
diff --git a/tests/ce/ve.ce.Surface.test.js b/tests/ce/ve.ce.Surface.test.js
index 100bae0..ff97782 100644
--- a/tests/ce/ve.ce.Surface.test.js
+++ b/tests/ce/ve.ce.Surface.test.js
@@ -1168,6 +1168,7 @@
 
 QUnit.test( 'onCopy', function ( assert ) {
        var i, testClipboardData,
+               count = 0,
                testEvent = {
                        originalEvent: {
                                clipboardData: {
@@ -1198,6 +1199,7 @@
                                expectedOriginalRange: new ve.Range( 1, 6 ),
                                expectedBalancedRange: new ve.Range( 1, 6 ),
                                expectedHtml: '<ol><li><p>g</p></li></ol>',
+                               expectedText: 'g\n\n',
                                msg: 'Copy list item'
                        },
                        {
@@ -1213,13 +1215,32 @@
                                                
'&quot;datatype&quot;:&quot;c&quot;,&quot;content&quot;:&quot;b&quot;}">' +
                                                'Foo' +
                                        '</p>',
+                               expectedText: 'Foo\n\n',
                                msg: 'RDFa attributes encoded into 
data-ve-attributes'
+                       },
+                       {
+                               rangeOrSelection: new ve.Range( 0, 61 ),
+                               expectedText: 
'abc\n\nd\n\ne\n\nf\n\ng\n\nhi\nj\n\nk\n\nl\n\nm\n\n',
+                               msg: 'Plain text of entire document'
                        }
                ];
 
-       QUnit.expect( cases.length * 5 );
+       for ( i = 0; i < cases.length; i++ ) {
+               count += 3;
+               if ( cases[ i ].expectedData ) {
+                       count++;
+               }
+               if ( cases[ i ].expectedHtml ) {
+                       count++;
+               }
+               if ( cases[ i ].expectedText ) {
+                       count++;
+               }
+       }
 
-       function testRunner( doc, rangeOrSelection, expectedData, 
expectedOriginalRange, expectedBalancedRange, expectedHtml, msg ) {
+       QUnit.expect( count );
+
+       function testRunner( doc, rangeOrSelection, expectedData, 
expectedOriginalRange, expectedBalancedRange, expectedHtml, expectedText, msg ) 
{
                var clipboardKey, slice,
                        view = ve.test.utils.createSurfaceViewFromDocument( doc 
|| ve.dm.example.createExampleDocument() ),
                        model = view.getModel();
@@ -1235,14 +1256,21 @@
 
                slice = view.clipboard.slice;
 
-               assert.equalLinearData( slice.data.data, expectedData, msg + ': 
data' );
-               assert.equalRange( slice.originalRange, expectedOriginalRange, 
msg + ': originalRange' );
-               assert.equalRange( slice.balancedRange, expectedBalancedRange, 
msg + ': balancedRange' );
-               assert.equalDomElement(
-                       $( '<div>' ).html( view.$pasteTarget.html() )[ 0 ],
-                       $( '<div>' ).html( expectedHtml )[ 0 ],
-                       msg + ': html'
-               );
+               assert.equalRange( slice.originalRange, expectedOriginalRange 
|| rangeOrSelection, msg + ': originalRange' );
+               assert.equalRange( slice.balancedRange, expectedBalancedRange 
|| rangeOrSelection, msg + ': balancedRange' );
+               if ( expectedData ) {
+                       assert.equalLinearData( slice.data.data, expectedData, 
msg + ': data' );
+               }
+               if ( expectedHtml ) {
+                       assert.equalDomElement(
+                               $( '<div>' ).html( testClipboardData[ 
'text/html' ] )[ 0 ],
+                               $( '<div>' ).html( expectedHtml )[ 0 ],
+                               msg + ': html'
+                       );
+               }
+               if ( expectedText ) {
+                       assert.strictEqual( testClipboardData[ 'text/plain' ], 
expectedText, msg + ': text' );
+               }
 
                view.destroy();
        }
@@ -1251,7 +1279,7 @@
                testRunner(
                        cases[ i ].doc, cases[ i ].rangeOrSelection, cases[ i 
].expectedData,
                        cases[ i ].expectedOriginalRange, cases[ i 
].expectedBalancedRange,
-                       cases[ i ].expectedHtml, cases[ i ].msg
+                       cases[ i ].expectedHtml, cases[ i ].expectedText, 
cases[ i ].msg
                );
        }
 

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

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