From d086a928802d1517174d467bb674e84b51e24637 Mon Sep 17 00:00:00 2001 From: Comandeer Date: Tue, 30 Aug 2016 13:32:25 +0200 Subject: [PATCH 1/9] Fixed codestyle issues. --- core/selection.js | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/core/selection.js b/core/selection.js index e1b9f786c69..869aa7c5251 100644 --- a/core/selection.js +++ b/core/selection.js @@ -4,6 +4,12 @@ */ ( function() { + var isMSSelection = typeof window.getSelection != 'function', + nextRev = 1, + // #13816 + fillingCharSequence = CKEDITOR.tools.repeat( '\u200b', 7 ), + fillingCharSequenceRegExp = new RegExp( fillingCharSequence + '( )?', 'g' ); + // #### checkSelectionChange : START // The selection change check basically saves the element parent tree of @@ -621,6 +627,9 @@ // the normal behavior on old IEs. (#1659, #7932) if ( doc.$.compatMode != 'BackCompat' ) { if ( CKEDITOR.env.ie7Compat || CKEDITOR.env.ie6Compat ) { + var textRng, + startRng; + html.on( 'mousedown', function( evt ) { evt = evt.data; @@ -663,11 +672,11 @@ evt.$.y < html.$.clientHeight && evt.$.x < html.$.clientWidth ) { // Start to build the text range. - var textRng = body.$.createTextRange(); + textRng = body.$.createTextRange(); moveRangeToPoint( textRng, evt.$.clientX, evt.$.clientY ); // Records the dragging start of the above text range. - var startRng = textRng.duplicate(); + startRng = textRng.duplicate(); html.on( 'mousemove', onHover ); outerDoc.on( 'mouseup', onSelectEnd ); @@ -1050,9 +1059,6 @@ */ CKEDITOR.SELECTION_ELEMENT = 3; - var isMSSelection = typeof window.getSelection != 'function', - nextRev = 1; - /** * Manipulates the selection within a DOM element. If the current browser selection * spans outside of the element, an empty selection object is returned. @@ -1153,10 +1159,6 @@ var styleObjectElements = { img: 1, hr: 1, li: 1, table: 1, tr: 1, td: 1, th: 1, embed: 1, object: 1, ol: 1, ul: 1, a: 1, input: 1, form: 1, select: 1, textarea: 1, button: 1, fieldset: 1, thead: 1, tfoot: 1 }; - // #13816 - var fillingCharSequence = CKEDITOR.tools.repeat( '\u200b', 7 ), - fillingCharSequenceRegExp = new RegExp( fillingCharSequence + '( )?', 'g' ); - CKEDITOR.tools.extend( CKEDITOR.dom.selection, { _removeFillingCharSequenceString: removeFillingCharSequenceString, _createFillingCharSequenceNode: createFillingCharSequenceNode, From 3e48c95f582b1121b19b0dfa96e7da6d6badf186 Mon Sep 17 00:00:00 2001 From: Comandeer Date: Tue, 30 Aug 2016 13:40:39 +0200 Subject: [PATCH 2/9] Fixed issues with focusing widget for the first time. --- core/selection.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/selection.js b/core/selection.js index 869aa7c5251..8e22eda4147 100644 --- a/core/selection.js +++ b/core/selection.js @@ -244,7 +244,7 @@ // Creates cke_hidden_sel container and puts real selection there. function hideSelection( editor, ariaLabel ) { var content = ariaLabel || ' ', - style = CKEDITOR.env.ie ? 'display:none' : 'position:fixed;top:0;left:-1000px', + style = CKEDITOR.env.ie && CKEDITOR.env.version < 14 ? 'display:none' : 'position:fixed;top:0;left:-1000px', hiddenEl = CKEDITOR.dom.element.createFromHtml( '
' + content + '
', editor.document ); From 8f2c979a77beb46e336ab8e3f4fc349bd63d8625 Mon Sep 17 00:00:00 2001 From: Comandeer Date: Wed, 31 Aug 2016 14:33:49 +0200 Subject: [PATCH 3/9] Fixed codestyle issues. --- plugins/wysiwygarea/plugin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/wysiwygarea/plugin.js b/plugins/wysiwygarea/plugin.js index 35984c2e0de..3d23079faaf 100644 --- a/plugins/wysiwygarea/plugin.js +++ b/plugins/wysiwygarea/plugin.js @@ -9,6 +9,8 @@ */ ( function() { + var framedWysiwyg; + CKEDITOR.plugins.add( 'wysiwygarea', { init: function( editor ) { if ( editor.config.fullPage ) { @@ -289,6 +291,8 @@ // 2. On keyup remove all elements that were not marked // as non-superfluous (which means they must have had appeared in the meantime). + // Also we should preserve all temporary elements inserted by editor – otherwise we'd likely + // leak fake selection's content into editable due to removing hidden selection container (#14831). editable.attachListener( editable, 'keyup', function() { var elements = doc.getElementsByTag( tagName ); if ( lockRetain ) { @@ -301,7 +305,7 @@ } } - var framedWysiwyg = CKEDITOR.tools.createClass( { + framedWysiwyg = CKEDITOR.tools.createClass( { $: function() { this.base.apply( this, arguments ); From cb75a560c1e16ffba6840e5f6834929671c1902c Mon Sep 17 00:00:00 2001 From: Comandeer Date: Wed, 31 Aug 2016 14:35:41 +0200 Subject: [PATCH 4/9] removeSuperfluousElement should ignore editor's temporary elements. --- plugins/wysiwygarea/plugin.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/wysiwygarea/plugin.js b/plugins/wysiwygarea/plugin.js index 3d23079faaf..4fe3d17ca9f 100644 --- a/plugins/wysiwygarea/plugin.js +++ b/plugins/wysiwygarea/plugin.js @@ -296,7 +296,8 @@ editable.attachListener( editable, 'keyup', function() { var elements = doc.getElementsByTag( tagName ); if ( lockRetain ) { - if ( elements.count() == 1 && !elements.getItem( 0 ).getCustomData( 'retain' ) ) { + if ( elements.count() == 1 && !elements.getItem( 0 ).getCustomData( 'retain' ) && + !elements.getItem( 0 ).hasAttribute( 'data-cke-temp' ) ) { elements.getItem( 0 ).remove( 1 ); } lockRetain = false; From 19f826b754876f65e07bbd619552998e1fb1b9a5 Mon Sep 17 00:00:00 2001 From: Comandeer Date: Wed, 31 Aug 2016 14:36:12 +0200 Subject: [PATCH 5/9] Added unit test for not removing [data-cke-temp] elements. --- .../plugins/wysiwygarea/superfluouselement.js | 54 ++++++++++++++++++- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/tests/plugins/wysiwygarea/superfluouselement.js b/tests/plugins/wysiwygarea/superfluouselement.js index ae65231e480..82bde3fd338 100644 --- a/tests/plugins/wysiwygarea/superfluouselement.js +++ b/tests/plugins/wysiwygarea/superfluouselement.js @@ -176,6 +176,56 @@ bender.test( { } ); } ); wait(); - } + }, + + // #14831 + 'Test not removing [data-cke-temp]
when typing': function() { + if ( !CKEDITOR.env.edge || CKEDITOR.env.version < 14 ) { + assert.ignore(); + } + + var editor = this.editor; + + editor.setData( '', function() { + resume( function() { + bender.tools.setHtmlWithSelection( editor, '^' ); + + // Expected behaviour: + // keydown <- mark divs for retention, disable marking + // keydown <- do nothing + // ... + // keyup <- remove not marked divs, enable marking + // keyup <- do nothing + // ... + editor.editable().fire( 'keydown', new CKEDITOR.dom.event( { + keyCode: 75, + ctrlKey: false, + shiftKey: false + } ) ); -} ); \ No newline at end of file + bender.tools.setHtmlWithSelection( editor, '
k^
' ); + + editor.editable().fire( 'keydown', new CKEDITOR.dom.event( { + keyCode: 76, + ctrlKey: false, + shiftKey: false + } ) ); + + editor.editable().fire( 'keydown', new CKEDITOR.dom.event( { + keyCode: 77, + ctrlKey: false, + shiftKey: false + } ) ); + + editor.editable().fire( 'keyup', new CKEDITOR.dom.event( {} ) ); + + editor.editable().fire( 'keyup', new CKEDITOR.dom.event( {} ) ); + + editor.editable().fire( 'keyup', new CKEDITOR.dom.event( {} ) ); + + assert.isInnerHtmlMatching( '
k^
', bender.tools.getHtmlWithSelection( editor ) ); + } ); + } ); + wait(); + } +} ); From ecd1a13cd6c4f29ebf6cda004a33991b3173bd48 Mon Sep 17 00:00:00 2001 From: Comandeer Date: Wed, 31 Aug 2016 14:36:48 +0200 Subject: [PATCH 6/9] Added manual test. --- .../selection/manual/edgefakewysiwygarea.html | 13 +++++++++++++ .../core/selection/manual/edgefakewysiwygarea.md | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 tests/core/selection/manual/edgefakewysiwygarea.html create mode 100644 tests/core/selection/manual/edgefakewysiwygarea.md diff --git a/tests/core/selection/manual/edgefakewysiwygarea.html b/tests/core/selection/manual/edgefakewysiwygarea.html new file mode 100644 index 00000000000..995574379ac --- /dev/null +++ b/tests/core/selection/manual/edgefakewysiwygarea.html @@ -0,0 +1,13 @@ +

Editor 1:

+ + +

Editor 2:

+

[[placeholder]] foo bar

+ + diff --git a/tests/core/selection/manual/edgefakewysiwygarea.md b/tests/core/selection/manual/edgefakewysiwygarea.md new file mode 100644 index 00000000000..49d1f8c0db9 --- /dev/null +++ b/tests/core/selection/manual/edgefakewysiwygarea.md @@ -0,0 +1,16 @@ +@bender-tags: selection, fake, widget, 4.5.11, tc, 14831 +@bender-ui: collapsed +@bender-ckeditor-plugins: wysiwygarea, placeholder, basicstyles, toolbar, floatingspace + +###ONLY IN EDGE 14+### + +1. Click the placeholder widget. +2. Press `Ctrl+B` to bold it. + +**Expected results:** + +* After pressing `Ctrl+B` widget becomes bold. + +**Unexpected results:** + +* After pressing `Ctrl+B` "placeholder placeholder widget" is added to the editable and the selection is moved to the end of the new added text. From 325d054cb30782db5b3a802905e701ad16b3b19e Mon Sep 17 00:00:00 2001 From: Comandeer Date: Wed, 31 Aug 2016 14:37:09 +0200 Subject: [PATCH 7/9] Small tweak of fake selection's tests. --- tests/core/selection/fake.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/core/selection/fake.js b/tests/core/selection/fake.js index 1202c735f6a..9db6710cc99 100644 --- a/tests/core/selection/fake.js +++ b/tests/core/selection/fake.js @@ -109,7 +109,12 @@ bender.test( { 'Reset fake-selection': function() { var editor = this.editor; - bender.tools.setHtmlWithSelection( editor, '

[foo bar]

' ); + // Edge behaves very weird if there's element selection inside paragraph in this test. + if ( !CKEDITOR.env.edge || CKEDITOR.env.version < 14 ) { + bender.tools.setHtmlWithSelection( editor, '

[foo bar]

' ); + } else { + bender.tools.setHtmlWithSelection( editor, '

{foo bar}

' ); + } var span = editor.document.getById( 'bar' ), sel = editor.getSelection(); From 30ef500529680b79e1095024c1256c65fbd2b447 Mon Sep 17 00:00:00 2001 From: "m.lewandowski" Date: Wed, 31 Aug 2016 16:53:54 +0200 Subject: [PATCH 8/9] Simplified unit test code. --- tests/core/selection/fake.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/core/selection/fake.js b/tests/core/selection/fake.js index 9db6710cc99..70c7a282d11 100644 --- a/tests/core/selection/fake.js +++ b/tests/core/selection/fake.js @@ -107,14 +107,15 @@ bender.test( { }, 'Reset fake-selection': function() { - var editor = this.editor; + var editor = this.editor, + inputHtml = '

{foo bar}

'; // Edge behaves very weird if there's element selection inside paragraph in this test. if ( !CKEDITOR.env.edge || CKEDITOR.env.version < 14 ) { - bender.tools.setHtmlWithSelection( editor, '

[foo bar]

' ); - } else { - bender.tools.setHtmlWithSelection( editor, '

{foo bar}

' ); + inputHtml = '

[foo bar]

'; } + + bender.tools.setHtmlWithSelection( editor, inputHtml ); var span = editor.document.getById( 'bar' ), sel = editor.getSelection(); From 07452ec45f4cc1e346ce016e5ed1ef0ba586cc86 Mon Sep 17 00:00:00 2001 From: "m.lewandowski" Date: Thu, 1 Sep 2016 11:53:31 +0200 Subject: [PATCH 9/9] Fixed markup formatting. --- tests/core/selection/manual/edgefakewysiwygarea.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/core/selection/manual/edgefakewysiwygarea.md b/tests/core/selection/manual/edgefakewysiwygarea.md index 49d1f8c0db9..876352a253c 100644 --- a/tests/core/selection/manual/edgefakewysiwygarea.md +++ b/tests/core/selection/manual/edgefakewysiwygarea.md @@ -2,7 +2,7 @@ @bender-ui: collapsed @bender-ckeditor-plugins: wysiwygarea, placeholder, basicstyles, toolbar, floatingspace -###ONLY IN EDGE 14+### +### ONLY IN EDGE 14+ 1. Click the placeholder widget. 2. Press `Ctrl+B` to bold it.