From 34b9291a1502d5c01a648d0c5244db52de850bda Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?=
Date: Wed, 20 May 2015 16:40:10 +0200
Subject: [PATCH 1/5] Source editor's editable should be used to extract range
from itself. Otherwise warnings are logged because extractHtmlFromRange uses
editable.editor.createRange().
---
plugins/clipboard/plugin.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/plugins/clipboard/plugin.js b/plugins/clipboard/plugin.js
index 66388803f10..a0e9d4f7783 100644
--- a/plugins/clipboard/plugin.js
+++ b/plugins/clipboard/plugin.js
@@ -1394,7 +1394,7 @@
// Remove dragged content and make a snapshot.
dataTransfer.sourceEditor.fire( 'saveSnapshot' );
- editable.extractHtmlFromRange( dragRange );
+ dataTransfer.sourceEditor.editable().extractHtmlFromRange( dragRange );
dataTransfer.sourceEditor.getSelection().reset();
dataTransfer.sourceEditor.fire( 'saveSnapshot' );
From 4e5d694546eb2e596b589191d72a70a251a9fdf4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?=
Date: Thu, 21 May 2015 15:52:27 +0200
Subject: [PATCH 2/5] Tests: Weird things were happening because multiple
elements with the same id existed in the document.
---
tests/plugins/clipboard/drop.js | 158 ++++++++++++++++----------------
1 file changed, 80 insertions(+), 78 deletions(-)
diff --git a/tests/plugins/clipboard/drop.js b/tests/plugins/clipboard/drop.js
index 682f800354e..78c61b0e4b0 100644
--- a/tests/plugins/clipboard/drop.js
+++ b/tests/plugins/clipboard/drop.js
@@ -195,14 +195,14 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Header1
' +
+ bot.setHtmlWithSelection( 'Header1
' +
'Lorem ipsum [dolor] sit amet.
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'h1' ).getChild( 0 ),
+ element: editor.editable().findOne( '.h1' ).getChild( 0 ),
offset: 7,
expectedTransferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
expectedText: 'dolor',
@@ -210,11 +210,11 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'dolor'
}, null, function() {
- assert.areSame( 'Header1dolor^
Lorem ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Header1dolor^
Lorem ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
editor.execCommand( 'undo' );
- assert.areSame( 'Header1
Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
+ assert.areSame( 'Header1
Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
} );
},
@@ -222,13 +222,13 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem ipsum [dolor] sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem ipsum [dolor] sit amet.
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 6,
expectedTransferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
expectedText: 'dolor',
@@ -236,11 +236,11 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'dolor'
}, null, function() {
- assert.areSame( 'Lorem dolor^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem dolor^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
editor.execCommand( 'undo' );
- assert.areSame( 'Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
+ assert.areSame( 'Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
} );
},
@@ -248,13 +248,13 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 2 ),
+ element: editor.editable().findOne( '.p' ).getChild( 2 ),
offset: 11,
expectedTransferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
expectedText: 'ipsum',
@@ -262,18 +262,18 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'ipsum'
}, null, function() {
- assert.areSame( 'Lorem dolor sit ipsum^amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem dolor sit ipsum^amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
editor.execCommand( 'undo' );
- assert.areSame( 'Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
+ assert.areSame( 'Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
} );
},
'test drop after range end': function( editor ) {
var evt = bender.tools.mockDropEvent();
- setWithHtml( editor, 'lor{em ipsum} dolor sit amet.
' );
+ setWithHtml( editor, 'lor{em ipsum} dolor sit amet.
' );
editor.resetUndo();
drag( editor, evt );
@@ -281,8 +281,8 @@ var testsForMultipleEditor = {
drop( editor, evt, {
// IE8 split text node anyway so we need different drop position there.
element: CKEDITOR.env.ie && CKEDITOR.env.version == 8 ?
- editor.document.getById( 'p' ).getChild( 2 ) :
- editor.document.getById( 'p' ).getChild( 1 ),
+ editor.editable().findOne( '.p' ).getChild( 2 ) :
+ editor.editable().findOne( '.p' ).getChild( 1 ),
offset: CKEDITOR.env.ie && CKEDITOR.env.version == 8 ?
11 :
17,
@@ -292,11 +292,11 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'em ipsum'
}, null, function() {
- assert.isInnerHtmlMatching( 'lor dolor sit em ipsum^amet.@
', getWithHtml( editor ), htmlMatchOpts, 'after drop' );
+ assert.isInnerHtmlMatching( 'lor dolor sit em ipsum^amet.@
', getWithHtml( editor ), htmlMatchOpts, 'after drop' );
editor.execCommand( 'undo' );
- assert.isInnerHtmlMatching( 'lorem ipsum dolor sit ^amet.@
', getWithHtml( editor ), htmlMatchOpts, 'after undo' );
+ assert.isInnerHtmlMatching( 'lorem ipsum dolor sit ^amet.@
', getWithHtml( editor ), htmlMatchOpts, 'after undo' );
} );
},
@@ -304,13 +304,13 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 2 ),
+ element: editor.editable().findOne( '.p' ).getChild( 2 ),
offset: 16,
expectedTransferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
expectedText: 'ipsum',
@@ -318,11 +318,11 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'ipsum'
}, null, function() {
- assert.areSame( 'Lorem dolor sit amet.ipsum^
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem dolor sit amet.ipsum^
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
editor.execCommand( 'undo' );
- assert.areSame( 'Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
+ assert.areSame( 'Lorem ipsum dolor sit amet.
', editor.getData(), 'after undo' );
} );
},
@@ -330,13 +330,13 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 0,
expectedTransferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
expectedText: 'ipsum',
@@ -344,11 +344,11 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'ipsum'
}, null, function() {
- assert.isInnerHtmlMatching( 'ipsum^Lorem dolor sit amet.@
', getWithHtml( editor ), htmlMatchOpts, 'after drop' );
+ assert.isInnerHtmlMatching( 'ipsum^Lorem dolor sit amet.@
', getWithHtml( editor ), htmlMatchOpts, 'after drop' );
editor.execCommand( 'undo' );
- assert.isInnerHtmlMatching( 'Lorem ipsum dolor sit amet.@
', editor.getData(), htmlMatchOpts, 'after undo' );
+ assert.isInnerHtmlMatching( 'Lorem ipsum dolor sit amet.@
', editor.getData(), htmlMatchOpts, 'after undo' );
} );
},
@@ -357,13 +357,13 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem [ipsum] dolor sit amet.
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 1 ),
+ element: editor.editable().findOne( '.p' ).getChild( 1 ),
offset: 4,
expectedTransferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
expectedText: 'ipsum',
@@ -372,7 +372,7 @@ var testsForMultipleEditor = {
expectedDataValue: 'ipsum'
}, null, function() {
assert.isInnerHtmlMatching(
- 'Lorem dolor sit' +
+ 'Lorem dolor sit' +
'ipsum' + ( ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) ? '^' : '^
' ) + ' amet.@
',
getWithHtml( editor ), htmlMatchOpts, 'after drop' );
} );
@@ -382,13 +382,13 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem ipsum sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem ipsum sit amet.
' );
editor.resetUndo();
evt.$.dataTransfer.setData( 'Text', 'dolor' );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 6,
expectedTransferType: CKEDITOR.DATA_TRANSFER_EXTERNAL,
expectedText: 'dolor',
@@ -396,11 +396,11 @@ var testsForMultipleEditor = {
expectedDataType: 'text',
expectedDataValue: 'dolor'
}, null, function() {
- assert.areSame( 'Lorem dolor^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem dolor^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
editor.execCommand( 'undo' );
- assert.areSame( 'Lorem ipsum sit amet.
', editor.getData(), 'after undo' );
+ assert.areSame( 'Lorem ipsum sit amet.
', editor.getData(), 'after undo' );
assert.isNull( CKEDITOR.plugins.clipboard.dragData, 'dragData should be reset' );
} );
@@ -411,7 +411,7 @@ var testsForMultipleEditor = {
bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem ipsum sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem ipsum sit amet.
' );
editor.resetUndo();
if ( isCustomDataTypesSupported ) {
@@ -421,7 +421,7 @@ var testsForMultipleEditor = {
}
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 6,
expectedTransferType: CKEDITOR.DATA_TRANSFER_EXTERNAL,
expectedText: !isCustomDataTypesSupported ? 'dolor' : '',
@@ -430,14 +430,14 @@ var testsForMultipleEditor = {
expectedDataValue: !isCustomDataTypesSupported ? '<b>dolor</b>' : 'dolor'
}, null, function() {
if ( isCustomDataTypesSupported ) {
- assert.areSame( 'Lorem dolor^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem dolor^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
} else {
- assert.areSame( 'Lorem <b>dolor</b>^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem <b>dolor</b>^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
}
editor.execCommand( 'undo' );
- assert.areSame( 'Lorem ipsum sit amet.
', editor.getData(), 'after undo' );
+ assert.areSame( 'Lorem ipsum sit amet.
', editor.getData(), 'after undo' );
assert.isNull( CKEDITOR.plugins.clipboard.dragData, 'dragData should be reset' );
} );
@@ -447,16 +447,16 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( 'Lorem ^ipsum sit amet.
' );
+ bot.setHtmlWithSelection( 'Lorem ^ipsum sit amet.
' );
editor.resetUndo();
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 6,
expectedBeforePasteEventCount: 1,
expectedPasteEventCount: 0
}, null, function() {
- assert.areSame( 'Lorem ^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem ^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
assert.isNull( CKEDITOR.plugins.clipboard.dragData, 'dragData should be reset' );
} );
@@ -468,15 +468,15 @@ var testsForMultipleEditor = {
botCross = bender.editorBots.cross,
editorCross = botCross.editor;
- setWithHtml( bot.editor, '{}Lorem ipsum sit amet.
' );
- setWithHtml( botCross.editor, 'Lorem {ipsum dolor }sit amet.
' );
+ setWithHtml( bot.editor, '{}Lorem ipsum sit amet.
' );
+ setWithHtml( botCross.editor, 'Lorem {ipsum dolor }sit amet.
' );
bot.editor.resetUndo();
botCross.editor.resetUndo();
drag( editorCross, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 6,
expectedTransferType: CKEDITOR.DATA_TRANSFER_CROSS_EDITORS,
expectedText: 'ipsum dolor ',
@@ -484,14 +484,14 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'ipsum dolor '
}, null, function() {
- assert.areSame( 'Lorem ipsum dolor ^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
- assert.areSame( 'Lorem sit amet.
', editorCross.getData(), 'after drop - editor cross' );
+ assert.areSame( 'Lorem ipsum dolor ^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'Lorem sit amet.
', editorCross.getData(), 'after drop - editor cross' );
editor.execCommand( 'undo' );
editorCross.execCommand( 'undo' );
- assert.areSame( 'Lorem ipsum sit amet.
', editor.getData(), 'after undo' );
- assert.areSame( 'Lorem ipsum dolor sit amet.
', editorCross.getData(), 'after undo - editor cross' );
+ assert.areSame( 'Lorem ipsum sit amet.
', editor.getData(), 'after undo' );
+ assert.areSame( 'Lorem ipsum dolor sit amet.
', editorCross.getData(), 'after undo - editor cross' );
} );
},
@@ -500,37 +500,39 @@ var testsForMultipleEditor = {
evt = bender.tools.mockDropEvent();
bot.setHtmlWithSelection( 'x' +
- 'x[drag1]xx' +
- 'drag2x' +
- 'drop1x' +
- 'drop2x
' );
+ 'x[drag1]xx' +
+ 'drag2x' +
+ 'drop1x' +
+ 'drop2x
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'drop1' ).getChild( 0 ),
+ element: editor.editable().findOne( '.drop1' ).getChild( 0 ),
offset: 0,
expectedTransferType: CKEDITOR.DATA_TRANSFER_INTERNAL,
expectedText: 'drag1',
- expectedHtml: 'drag1',
+ expectedHtml: 'drag1',
expectedDataType: 'html',
- expectedDataValue: 'drag1'
+ expectedDataValue: 'drag1'
}, function( evt ) {
if ( !( CKEDITOR.env.ie && CKEDITOR.env.version == 8 ) && !CKEDITOR.env.safari ) {
- assert.areSame( editor.document.getById( 'drag1' ), evt.data.dragRange.startContainer, 'dropRange.startContainer' );
+ assert.areSame( editor.editable().findOne( '.drag1' ), evt.data.dragRange.startContainer, 'dropRange.startContainer' );
assert.areSame( 1, evt.data.dragRange.startOffset, 'dropRange.startOffset' );
}
- evt.data.dragRange.selectNodeContents( editor.document.getById( 'drag2' ) );
- evt.data.dropRange.setStart( editor.document.getById( 'drop2' ), 4 );
+ evt.data.dragRange.selectNodeContents( editor.editable().findOne( '.drag2' ) );
+ evt.data.dropRange.setStart( editor.editable().findOne( '.drop2' ), 4 );
evt.data.dropRange.collapse( true );
}, function() {
- assert.areSame( 'xxdrag1xxxdrop1xdrop2drag1^x
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( 'xxdrag1xxxdrop1xdrop2drag1^x
',
+ bender.tools.getHtmlWithSelection( editor ), 'after drop' );
editor.execCommand( 'undo' );
- assert.areSame( 'xxdrag1xxdrag2xdrop1xdrop2x
', editor.getData(), 'after undo' );
+ assert.areSame( 'xxdrag1xxdrag2xdrop1xdrop2x
',
+ editor.getData(), 'after undo' );
} );
},
@@ -538,19 +540,19 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( '^foo
' );
+ bot.setHtmlWithSelection( '^foo
' );
editor.resetUndo();
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 0,
expectedPasteEventCount: 0
}, function() {
return false;
}, function() {
- assert.areSame( '^foo
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
+ assert.areSame( '^foo
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
} );
}
},
@@ -609,8 +611,8 @@ var testsForMultipleEditor = {
p, text;
// Create DOM
- bot.setHtmlWithSelection( 'lorem ipsum sit amet.
' );
- p = editor.document.getById( 'p' );
+ bot.setHtmlWithSelection( 'lorem ipsum sit amet.
' );
+ p = editor.editable().findOne( '.p' );
// Set drag range.
dragRange.setStart( p.getChild( 0 ), 11 );
@@ -631,9 +633,9 @@ var testsForMultipleEditor = {
// Asserts.
assert.areSame( 1, p.getChildCount() );
dragRange.select();
- assert.isInnerHtmlMatching( 'lorem ipsum^ sit amet.@
', getWithHtml( editor ), htmlMatchOpts );
+ assert.isInnerHtmlMatching( 'lorem ipsum^ sit amet.@
', getWithHtml( editor ), htmlMatchOpts );
dropRange.select();
- assert.isInnerHtmlMatching( 'lorem^ ipsum sit amet.@
', getWithHtml( editor ), htmlMatchOpts );
+ assert.isInnerHtmlMatching( 'lorem^ ipsum sit amet.@
', getWithHtml( editor ), htmlMatchOpts );
},
'test isDropRangeAffectedByDragRange 1': function() {
@@ -644,8 +646,8 @@ var testsForMultipleEditor = {
p;
// "Lorem[1] ipsum[2] sit amet."
- bot.setHtmlWithSelection( 'Lorem ipsum sit amet.
' );
- p = editor.document.getById( 'p' );
+ bot.setHtmlWithSelection( 'Lorem ipsum sit amet.
' );
+ p = editor.editable().findOne( '.p' );
dragRange.setStart( p.getChild( 0 ), 5 );
dragRange.collapse( true );
@@ -664,8 +666,8 @@ var testsForMultipleEditor = {
p, text;
// "Lorem " [1] " ipsum" [2] "sit amet."
- bot.setHtmlWithSelection( 'Lorem
' );
- p = editor.document.getById( 'p' );
+ bot.setHtmlWithSelection( 'Lorem
' );
+ p = editor.editable().findOne( '.p' );
text = new CKEDITOR.dom.text( ' ipsum' );
text.insertAfter( p.getChild( 0 ) );
text = new CKEDITOR.dom.text( ' sit amet.' );
@@ -688,8 +690,8 @@ var testsForMultipleEditor = {
p, text;
// "Lorem[1] ipsum" [2] "sit amet."
- bot.setHtmlWithSelection( 'Lorem ipsum
' );
- p = editor.document.getById( 'p' );
+ bot.setHtmlWithSelection( 'Lorem ipsum
' );
+ p = editor.editable().findOne( '.p' );
text = new CKEDITOR.dom.text( ' sit amet.' );
text.insertAfter( p.getChild( 0 ) );
@@ -824,7 +826,7 @@ var testsForMultipleEditor = {
evt = bender.tools.mockDropEvent(),
dragstartData, dropData, dragendData;
- bot.setHtmlWithSelection( '^foo
' );
+ bot.setHtmlWithSelection( '^foo
' );
editor.resetUndo();
editor.once( 'dragstart', function( evt ) {
@@ -843,7 +845,7 @@ var testsForMultipleEditor = {
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 0,
expectedPasteEventCount: 0
}, function() {
@@ -891,7 +893,7 @@ var testsForMultipleEditor = {
evt = bender.tools.mockDropEvent(),
dragstartData, dropData, dragendData;
- bot.setHtmlWithSelection( '^foo
' );
+ bot.setHtmlWithSelection( '^foo
' );
editor.resetUndo();
editor.once( 'dragstart', function( evt ) {
@@ -910,7 +912,7 @@ var testsForMultipleEditor = {
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 0,
expectedPasteEventCount: 0
}, function() {
@@ -930,7 +932,7 @@ var testsForMultipleEditor = {
bot = this.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent();
- bot.setHtmlWithSelection( '^foo
' );
+ bot.setHtmlWithSelection( '^foo
' );
editor.resetUndo();
editor.once( 'beforePaste', function() {
@@ -940,7 +942,7 @@ var testsForMultipleEditor = {
drag( editor, evt );
drop( editor, evt, {
- element: editor.document.getById( 'p' ).getChild( 0 ),
+ element: editor.editable().findOne( '.p' ).getChild( 0 ),
offset: 0,
expectedBeforePasteEventCount: 1,
expectedPasteEventCount: 0
From d8c1d29df26fc8b9306955d069e8b1a0dff7d2d9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?=
Date: Thu, 21 May 2015 17:18:15 +0200
Subject: [PATCH 3/5] Prevented errors related to range containers and also
improved the snapshot stack and the current selection in the source editor.
---
plugins/clipboard/plugin.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/plugins/clipboard/plugin.js b/plugins/clipboard/plugin.js
index a0e9d4f7783..03b199daf2a 100644
--- a/plugins/clipboard/plugin.js
+++ b/plugins/clipboard/plugin.js
@@ -1396,7 +1396,9 @@
dataTransfer.sourceEditor.editable().extractHtmlFromRange( dragRange );
- dataTransfer.sourceEditor.getSelection().reset();
+ // Make some selection before saving snapshot, otherwise error will be thrown, because
+ // there will be no valid selection after content is removed.
+ dataTransfer.sourceEditor.getSelection().selectRanges( [ dragRange ] );
dataTransfer.sourceEditor.fire( 'saveSnapshot' );
}
From 002af96e0070c18dbda262572c2cb8979a9586b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?=
Date: Fri, 29 May 2015 10:12:51 +0200
Subject: [PATCH 4/5] Tests: Added assertions that extractHtmlFromRange is
called on the source editable.
---
tests/plugins/clipboard/drop.js | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/tests/plugins/clipboard/drop.js b/tests/plugins/clipboard/drop.js
index 78c61b0e4b0..ad705416fdb 100644
--- a/tests/plugins/clipboard/drop.js
+++ b/tests/plugins/clipboard/drop.js
@@ -466,7 +466,8 @@ var testsForMultipleEditor = {
var bot = bender.editorBots[ editor.name ],
evt = bender.tools.mockDropEvent(),
botCross = bender.editorBots.cross,
- editorCross = botCross.editor;
+ editorCross = botCross.editor,
+ extractRangeSpy = sinon.spy( editorCross.editable(), 'extractHtmlFromRange' );
setWithHtml( bot.editor, '{}Lorem ipsum sit amet.
' );
setWithHtml( botCross.editor, 'Lorem {ipsum dolor }sit amet.
' );
@@ -484,9 +485,13 @@ var testsForMultipleEditor = {
expectedDataType: 'html',
expectedDataValue: 'ipsum dolor '
}, null, function() {
+ extractRangeSpy.restore();
+
assert.areSame( 'Lorem ipsum dolor ^ipsum sit amet.
', bender.tools.getHtmlWithSelection( editor ), 'after drop' );
assert.areSame( 'Lorem sit amet.
', editorCross.getData(), 'after drop - editor cross' );
+ assert.isTrue( extractRangeSpy.called, 'extractHtmlFromRange was called on the source editor\'s editable' );
+
editor.execCommand( 'undo' );
editorCross.execCommand( 'undo' );
From cf279dcad49d92154ddeebc842beb2193373e878 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Piotrek=20Koszuli=C5=84ski?=
Date: Fri, 29 May 2015 10:29:50 +0200
Subject: [PATCH 5/5] Tests: Added assertion checking selection in the source
editor.
---
tests/plugins/clipboard/drop.js | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/tests/plugins/clipboard/drop.js b/tests/plugins/clipboard/drop.js
index ad705416fdb..a1357c34975 100644
--- a/tests/plugins/clipboard/drop.js
+++ b/tests/plugins/clipboard/drop.js
@@ -492,6 +492,12 @@ var testsForMultipleEditor = {
assert.isTrue( extractRangeSpy.called, 'extractHtmlFromRange was called on the source editor\'s editable' );
+ assert.isInnerHtmlMatching(
+ 'Lorem ^sit amet.@
',
+ bender.tools.selection.getWithHtml( editorCross ),
+ htmlMatchOpts,
+ 'selection was set in the source editor' );
+
editor.execCommand( 'undo' );
editorCross.execCommand( 'undo' );