diff --git a/bender.js b/bender.js
index aa7d55c9bce..8b07e0ce2f0 100644
--- a/bender.js
+++ b/bender.js
@@ -57,10 +57,7 @@ var config = {
'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace #9': 'env.safari',
'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace, merge #2': 'env.safari',
'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace, merge #3': 'env.safari',
- 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace, merge #8': 'env.safari',
-
- // IE8-10 (#12964)
- 'tests/core/editable/getextractselectedhtml#test extractHtmlFromRange: tables #20': 'env.ie && env.version < 11'
+ 'tests/core/editable/keystrokes/delbackspacequirks/collapsed#test backspace, merge #8': 'env.safari'
}
},
diff --git a/core/editable.js b/core/editable.js
index 483e4933a4c..e25cc77e5fe 100644
--- a/core/editable.js
+++ b/core/editable.js
@@ -2735,9 +2735,21 @@
editableRange,
walker = new CKEDITOR.dom.walker( range ),
startCell = range.startPath().contains( tableEditable ),
- endCell = range.endPath().contains( tableEditable );
+ endCell = range.endPath().contains( tableEditable ),
+ database = {};
walker.guard = function( node, leaving ) {
+ // Guard may be executed on some node boundaries multiple times,
+ // what results in creating more than one range for each selected cell. (#12964)
+ if ( node.type == CKEDITOR.NODE_ELEMENT ) {
+ var key = 'visited_' + ( leaving ? 'out' : 'in' );
+ if ( node.getCustomData( key ) ) {
+ return;
+ }
+
+ CKEDITOR.dom.element.setMarker( database, node, key, 1 );
+ }
+
// Handle partial selection in a cell in which the range starts:
//
x{xx | ...
// will store:
@@ -2771,6 +2783,9 @@
walker.lastForward();
+ // Clear all markers so next extraction will not be affected by this one.
+ CKEDITOR.dom.element.clearAllMarkers( database );
+
return contentsRanges;
function checkRemoveCellContents( node ) {
diff --git a/tests/_benderjs/ckeditor/static/tools.js b/tests/_benderjs/ckeditor/static/tools.js
index 594e1675239..d494551a9d6 100644
--- a/tests/_benderjs/ckeditor/static/tools.js
+++ b/tests/_benderjs/ckeditor/static/tools.js
@@ -1442,6 +1442,11 @@
fixZWS = ( 'fixZWS' in options ) ? options.fixZWS : true,
fixNbsp = ( 'fixNbsp' in options ) ? options.fixNbsp : true;
+ // On IE8- we need to get rid of expando attributes.
+ if ( CKEDITOR.env.ie && CKEDITOR.env.version < 9 ) {
+ innerHtml = innerHtml.replace( / data-cke-expando="[^"]*"/g, '' );
+ }
+
if ( options.compareSelection ) {
innerHtml = innerHtml.replace( selectionMarkers, '' );
}
diff --git a/tests/core/editable/getextracthtmlfromrange.js b/tests/core/editable/getextracthtmlfromrange.js
index d83456b0b96..602eb1b551e 100644
--- a/tests/core/editable/getextracthtmlfromrange.js
+++ b/tests/core/editable/getextracthtmlfromrange.js
@@ -1,4 +1,4 @@
-/* bender-tags: editor,unit */
+/* bender-tags: editor,unit,range */
( function() {
'use strict';
@@ -24,15 +24,6 @@
getWithHtml = bender.tools.range.getWithHtml,
img_src = '%BASE_PATH%_assets/img.gif';
- var tests = {
- init: function() {
- this.editables = {};
-
- for ( var e in this.editors )
- this.editables[ e ] = this.editors[ e ].editable();
- }
- };
-
//
// var playground = CKEDITOR.document.createElement( 'dl' );
// playground.on( 'paste', function( e ) {
@@ -110,6 +101,28 @@
// output HTML | @ | like compareInnerHtml (accept) | like compareInnerHtml (we use it for uncertain cases)
// | @! | like compareInnerHtml (expect) | like compareInnerHtml (we use it for empty blocks)
+ var tests = {
+ init: function() {
+ this.editables = {};
+
+ for ( var e in this.editors )
+ this.editables[ e ] = this.editors[ e ].editable();
+ },
+
+ 'test node markers are cleared': function() {
+ var html = decodeInputFillers( '' ),
+ expected = '',
+ editable = this.editables.inline,
+ range = setWithHtml( editable, html );
+
+ var docFragment = editable.extractHtmlFromRange( range );
+
+ assert.isInnerHtmlMatching( expected, docFragment.getHtml(), compareInnerHtmlOptions, 'Selected HTML' );
+ assert.isNull( editable.findOne( 'tr' ).getChild( 0 ).getCustomData( 'visited_out' ), '1st cell should not have a marker' );
+ assert.isNull( editable.findOne( 'tr' ).getChild( 1 ).getCustomData( 'visited_in' ), '2nd cell should not have a marker' );
+ }
+ };
+
addTests( {
'block': [
[ '{a}
', 'a', '[]@!
' ],
diff --git a/tests/utils/html/compareinnerhtml.js b/tests/utils/html/compareinnerhtml.js
index f50b823fc80..6d9e6fefe2c 100644
--- a/tests/utils/html/compareinnerhtml.js
+++ b/tests/utils/html/compareinnerhtml.js
@@ -154,6 +154,16 @@
htmlTools.compareInnerHtml( 'a', 'a', opts );
assert.areSame( strOpts, JSON.stringify( opts ), 'options object has not been modified' );
+ },
+
+ 'test on IE8 expando attributes are removed': function() {
+ if ( !CKEDITOR.env.ie || CKEDITOR.env.version > 8 ) {
+ assert.ignore();
+ }
+
+ assert.isTrue( htmlTools.compareInnerHtml(
+ 'foobar
',
+ 'foobar
' ) );
}
} );
} )();
\ No newline at end of file