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' );