From 7941ad9ed193f0597d3d512980f298596d5749fa Mon Sep 17 00:00:00 2001 From: "m.lewandowski" Date: Tue, 13 Oct 2015 23:59:25 +0200 Subject: [PATCH 01/14] CKEDITOR.tools.parseCssText will no longer strip quotes from font-family value. --- core/tools.js | 5 ++--- tests/core/tools.js | 27 ++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/core/tools.js b/core/tools.js index afbbc1cea64..c41a9b4b68a 100644 --- a/core/tools.js +++ b/core/tools.js @@ -1028,10 +1028,9 @@ styleText.replace( /"/g, '"' ).replace( /\s*([^:;\s]+)\s*:\s*([^;]+)\s*(?=;|$)/g, function( match, name, value ) { if ( normalize ) { name = name.toLowerCase(); - // Normalize font-family property, ignore quotes and being case insensitive. (#7322) - // http://www.w3.org/TR/css3-fonts/#font-family-the-font-family-property + // Drop extra whitespacing from font-family. if ( name == 'font-family' ) - value = value.toLowerCase().replace( /["']/g, '' ).replace( /\s*,\s*/g, ',' ); + value = value.replace( /\s*,\s*/g, ',' ); value = CKEDITOR.tools.trim( value ); } diff --git a/tests/core/tools.js b/tests/core/tools.js index b0f0b4f4baf..c9ea24d0871 100644 --- a/tests/core/tools.js +++ b/tests/core/tools.js @@ -11,6 +11,12 @@ var htmlEncode = CKEDITOR.tools.htmlEncode, htmlDecode = CKEDITOR.tools.htmlDecode; + function assertNormalizeCssText( expected, input, message ) { + return function() { + assert.areSame( expected, CKEDITOR.tools.normalizeCssText( input ), message ); + }; + } + bender.test( { assertNormalizedCssText: function( expected, elementId, msg ) { assert.areSame( expected, CKEDITOR.tools.normalizeCssText( @@ -298,7 +304,7 @@ this.assertNormalizedCssText( 'color:red;font-size:10px;width:10.5em;', 'style1', 'order, lowercase and white spaces' ); - this.assertNormalizedCssText( 'color:red;font-family:arial black,helvetica,georgia;', 'style2', 'font names' ); + this.assertNormalizedCssText( 'color:red;font-family:\'Arial Black\',helvetica,"Georgia";', 'style2', 'font names' ); }, testNormalizeCssText2: function() { @@ -332,6 +338,25 @@ n( 'color: red; width: 10px; margin: 0.5em; float: left', true ), 'various' ); }, + // (#10750) + testNormalizeCssTextFonts1: assertNormalizeCssText( 'font-family:"crazy font";', 'font-family: "crazy font";', + 'quoted font name' ), + testNormalizeCssTextFonts2: assertNormalizeCssText( 'font-family:\'crazy font\';', 'font-family: \'crazy font\';', + 'single-quoted font name' ), + testNormalizeCssTextFonts3: assertNormalizeCssText( 'font-family:serif;', 'font-family: serif;', + 'generic-family name is not escaped' ), + testNormalizeCssTextFonts4: assertNormalizeCssText( 'font-family:"foo",serif;', 'font-family: "foo", serif;', + 'family-name and generic-family mix' ), + testNormalizeCssTextFonts5: assertNormalizeCssText( 'font-family:"FFo baR";', 'font-family: "FFo baR";', + 'letter casing sensivity' ), + // It's also possible to use font named as any generic-family member as long as it's enclosed within quotes. + testNormalizeCssTextFonts6: assertNormalizeCssText( 'font-family:"serif";', 'font-family:"serif";', + 'accept generic-family token as family-name' ), + testNormalizeCssTextFonts7: assertNormalizeCssText( 'font-family:my-cool-font;', 'font-family:my-cool-font;', + 'unquoted family name with hyphen' ), + testNormalizeCssTextFonts8: assertNormalizeCssText( 'font-family:"Space font";', 'font-family:"Space font";', + 'font name with multiple spaces' ), + testConvertRgbToHex: function() { var c = CKEDITOR.tools.convertRgbToHex; From 0ab01f74973c2c1e5d0bd083f7a13d9f4afb3cc4 Mon Sep 17 00:00:00 2001 From: "m.lewandowski" Date: Wed, 14 Oct 2015 00:16:45 +0200 Subject: [PATCH 02/14] Removed redundant TCs. --- tests/core/tools.html | 2 -- tests/core/tools.js | 14 +++----------- 2 files changed, 3 insertions(+), 13 deletions(-) delete mode 100644 tests/core/tools.html diff --git a/tests/core/tools.html b/tests/core/tools.html deleted file mode 100644 index 43debe58743..00000000000 --- a/tests/core/tools.html +++ /dev/null @@ -1,2 +0,0 @@ -
-
\ No newline at end of file diff --git a/tests/core/tools.js b/tests/core/tools.js index c9ea24d0871..023bb5f30f1 100644 --- a/tests/core/tools.js +++ b/tests/core/tools.js @@ -18,11 +18,6 @@ } bender.test( { - assertNormalizedCssText: function( expected, elementId, msg ) { - assert.areSame( expected, CKEDITOR.tools.normalizeCssText( - CKEDITOR.document.getById( elementId ).getAttribute( 'style' ) ), msg ); - }, - test_extend: function() { function fakeFn() {} @@ -300,12 +295,7 @@ assert.isTrue( c instanceof A && c instanceof B && c instanceof C, 'check instanceof both A & B & C' ); }, - testNormalizeCssText: function() { - this.assertNormalizedCssText( - 'color:red;font-size:10px;width:10.5em;', 'style1', 'order, lowercase and white spaces' ); - - this.assertNormalizedCssText( 'color:red;font-family:\'Arial Black\',helvetica,"Georgia";', 'style2', 'font names' ); - }, + testNormalizeCssText: assertNormalizeCssText( 'color:red;font-size:10px;width:10.5em;', ' width: 10.5em ; COLOR : red; font-size:10px ; ', 'order, lowercase and white spaces' ), testNormalizeCssText2: function() { var n = CKEDITOR.tools.normalizeCssText; @@ -338,6 +328,8 @@ n( 'color: red; width: 10px; margin: 0.5em; float: left', true ), 'various' ); }, + testQuoteEntity: assertNormalizeCssText( 'font-family:"foo";', 'font-family: "foo";', '' ), + // (#10750) testNormalizeCssTextFonts1: assertNormalizeCssText( 'font-family:"crazy font";', 'font-family: "crazy font";', 'quoted font name' ), From a229f0953a3bf98e47c87a6e4bf50c3b6654506a Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Fri, 1 Jul 2016 15:50:59 +0200 Subject: [PATCH 03/14] Tests: refactor tests. --- tests/core/tools.js | 36 ++++++++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/tests/core/tools.js b/tests/core/tools.js index 023bb5f30f1..5748ffb4e06 100644 --- a/tests/core/tools.js +++ b/tests/core/tools.js @@ -331,24 +331,44 @@ testQuoteEntity: assertNormalizeCssText( 'font-family:"foo";', 'font-family: "foo";', '' ), // (#10750) - testNormalizeCssTextFonts1: assertNormalizeCssText( 'font-family:"crazy font";', 'font-family: "crazy font";', + 'test Normalize double quote': assertNormalizeCssText( 'font-family:"crazy font";', 'font-family: "crazy font";', 'quoted font name' ), - testNormalizeCssTextFonts2: assertNormalizeCssText( 'font-family:\'crazy font\';', 'font-family: \'crazy font\';', + 'test Normalize single quote': assertNormalizeCssText( 'font-family:\'crazy font\';', 'font-family: \'crazy font\';', 'single-quoted font name' ), - testNormalizeCssTextFonts3: assertNormalizeCssText( 'font-family:serif;', 'font-family: serif;', + + 'test Normalize generic family name serif': assertNormalizeCssText( 'font-family:serif;', 'font-family: serif;', + 'generic-family name is not escaped' ), + 'test Normalize generic family name sans-serif': assertNormalizeCssText( 'font-family:sans-serif;', 'font-family: sans-serif;', + 'generic-family name is not escaped' ), + 'test Normalize generic family name cursive': assertNormalizeCssText( 'font-family:cursive;', 'font-family: cursive;', + 'generic-family name is not escaped' ), + 'test Normalize generic family name fantasy': assertNormalizeCssText( 'font-family:fantasy;', 'font-family: fantasy;', + 'generic-family name is not escaped' ), + 'test Normalize generic family name monospace': assertNormalizeCssText( 'font-family:monospace;', 'font-family: monospace;', 'generic-family name is not escaped' ), - testNormalizeCssTextFonts4: assertNormalizeCssText( 'font-family:"foo",serif;', 'font-family: "foo", serif;', + + 'test Normalize generic and non-generic mix': assertNormalizeCssText( 'font-family:"foo",serif;', 'font-family: "foo", serif;', 'family-name and generic-family mix' ), - testNormalizeCssTextFonts5: assertNormalizeCssText( 'font-family:"FFo baR";', 'font-family: "FFo baR";', + 'test Normalize letter casing sensitivity': assertNormalizeCssText( 'font-family:"FFo baR";', 'font-family: "FFo baR";', 'letter casing sensivity' ), // It's also possible to use font named as any generic-family member as long as it's enclosed within quotes. - testNormalizeCssTextFonts6: assertNormalizeCssText( 'font-family:"serif";', 'font-family:"serif";', + 'test Normalize generic-family token as family-name': assertNormalizeCssText( 'font-family:"serif";', 'font-family:"serif";', 'accept generic-family token as family-name' ), - testNormalizeCssTextFonts7: assertNormalizeCssText( 'font-family:my-cool-font;', 'font-family:my-cool-font;', + 'test Normalize unquoted family name with hyphen': assertNormalizeCssText( 'font-family:my-cool-font;', 'font-family:my-cool-font;', 'unquoted family name with hyphen' ), - testNormalizeCssTextFonts8: assertNormalizeCssText( 'font-family:"Space font";', 'font-family:"Space font";', + 'test Normalize font name with multiple spaces': assertNormalizeCssText( 'font-family:"Space font";', 'font-family:"Space font";', 'font name with multiple spaces' ), + 'test Normalize family name with quotes': assertNormalizeCssText( 'font-family:"\'Sarcasm\'";', 'font-family:"\'Sarcasm\'";', + 'family name with quotes' ), + 'test Normalize family name with special characters': assertNormalizeCssText( 'font-family:"\'This is -!$ custom Font\'";', 'font-family:"\'This is -!$ custom Font\'";', + 'family name with special characters' ), + + // If there's a syntax error in the style - just leave it like that. + 'test Normalize syntax error': assertNormalizeCssText( 'font-family:"crazy font",;', 'font-family:"crazy font",;', + 'style syntax error' ), + + testConvertRgbToHex: function() { var c = CKEDITOR.tools.convertRgbToHex; From e0041df0edb6b900882c1a9cff0265fec0d87eab Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Mon, 4 Jul 2016 11:35:19 +0200 Subject: [PATCH 04/14] Refactor: De-Morgan's-law this. --- core/style.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/core/style.js b/core/style.js index af6bc4a1a73..bbe47f41706 100644 --- a/core/style.js +++ b/core/style.js @@ -1801,8 +1801,15 @@ CKEDITOR.STYLE_OBJECT = 3; target = CKEDITOR.tools.parseCssText( target, true ); for ( var name in source ) { - if ( !( name in target && ( target[ name ] == source[ name ] || source[ name ] == 'inherit' || target[ name ] == 'inherit' ) ) ) + if ( !( name in target ) ) { return false; + } + + if ( !( ( target[ name ] == source[ name ] || + source[ name ] == 'inherit' || + target[ name ] == 'inherit' ) ) ) { + return false; + } } return true; } From 624f28f24b4350c9e1c783e5126b7c063e244061 Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Mon, 4 Jul 2016 11:57:26 +0200 Subject: [PATCH 05/14] Compare the font-family style more liberally. --- core/style.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core/style.js b/core/style.js index bbe47f41706..42d016e4745 100644 --- a/core/style.js +++ b/core/style.js @@ -1795,6 +1795,10 @@ CKEDITOR.STYLE_OBJECT = 3; // @param {Object/String} source // @param {Object/String} target function compareCssText( source, target ) { + var stripQuotes = function( string ) { + return string.replace( /["']/g, '' ); + }; + if ( typeof source == 'string' ) source = CKEDITOR.tools.parseCssText( source ); if ( typeof target == 'string' ) @@ -1805,7 +1809,7 @@ CKEDITOR.STYLE_OBJECT = 3; return false; } - if ( !( ( target[ name ] == source[ name ] || + if ( !( ( stripQuotes( target[ name ] ) == stripQuotes( source[ name ] ) || source[ name ] == 'inherit' || target[ name ] == 'inherit' ) ) ) { return false; From d9555cef36a6da6d3041d66fc4d4a2383783f5d8 Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Wed, 6 Jul 2016 10:19:09 +0200 Subject: [PATCH 06/14] Tests: fix font size in tests. --- tests/plugins/font/font.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/plugins/font/font.js b/tests/plugins/font/font.js index 7cb8feedc55..38c1ac7ad4c 100644 --- a/tests/plugins/font/font.js +++ b/tests/plugins/font/font.js @@ -12,8 +12,8 @@ var htmlMatchingOpts = { fixStyles: true }, - ffArial = 'font-family:arial,helvetica,sans-serif', - ffCS = 'font-family:comic sans ms,cursive'; + ffArial = 'font-family:Arial,Helvetica,sans-serif', + ffCS = 'font-family:Comic Sans MS,cursive'; bender.test( { 'test apply font size (collapsed selection)': function() { From 33294285b0bf9d2bc446e305e58176663c4b937f Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Wed, 6 Jul 2016 13:59:48 +0200 Subject: [PATCH 07/14] Tests: add manual test. --- tests/plugins/font/manual/quotedfont.html | 13 +++++++++++++ tests/plugins/font/manual/quotedfont.md | 11 +++++++++++ 2 files changed, 24 insertions(+) create mode 100644 tests/plugins/font/manual/quotedfont.html create mode 100644 tests/plugins/font/manual/quotedfont.md diff --git a/tests/plugins/font/manual/quotedfont.html b/tests/plugins/font/manual/quotedfont.html new file mode 100644 index 00000000000..761bd953bd3 --- /dev/null +++ b/tests/plugins/font/manual/quotedfont.html @@ -0,0 +1,13 @@ +
+

A paragraph with default font.

+

This is styled part.

+
+ diff --git a/tests/plugins/font/manual/quotedfont.md b/tests/plugins/font/manual/quotedfont.md new file mode 100644 index 00000000000..c49c67f89e3 --- /dev/null +++ b/tests/plugins/font/manual/quotedfont.md @@ -0,0 +1,11 @@ +@bender-tags: 4.4.6, tc +@bender-ui: collapsed +@bender-ckeditor-plugins: wysiwygarea, toolbar, font, enterkey, elementspath, sourcearea + +1. Click on the second paragraph. + * The font name in the combo box should be set. + +1. Switch to source mode. + * Somewhere in the source should be a `font-family` style with the value `font-family: 'Univers LT Std', sans-serif;` + +This test should pass regardless of whether `Univers LT Std` is available. From 778b42e3434feb7d8f484157f17f5b3a92c192fd Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Fri, 8 Jul 2016 11:44:44 +0200 Subject: [PATCH 08/14] Added doc string. --- core/style.js | 1 + 1 file changed, 1 insertion(+) diff --git a/core/style.js b/core/style.js index 42d016e4745..e529e893beb 100644 --- a/core/style.js +++ b/core/style.js @@ -1794,6 +1794,7 @@ CKEDITOR.STYLE_OBJECT = 3; // is treated as a wildcard which will match any value. // @param {Object/String} source // @param {Object/String} target + // @returns {Boolean} function compareCssText( source, target ) { var stripQuotes = function( string ) { return string.replace( /["']/g, '' ); From 7b3b2b4725c36d87afa943277f9b3ca085f5f7b3 Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Mon, 11 Jul 2016 15:10:37 +0200 Subject: [PATCH 09/14] Tests: test ignoring quotes. --- tests/core/style/checkelementmatch.html | 1 + tests/core/style/checkelementmatch.js | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/tests/core/style/checkelementmatch.html b/tests/core/style/checkelementmatch.html index d6f2f49ff41..4b788d372a5 100644 --- a/tests/core/style/checkelementmatch.html +++ b/tests/core/style/checkelementmatch.html @@ -2,3 +2,4 @@

Italic

Subtitle

Special container
Yellow +Font diff --git a/tests/core/style/checkelementmatch.js b/tests/core/style/checkelementmatch.js index 041da59b41f..7c6846abfc8 100644 --- a/tests/core/style/checkelementmatch.js +++ b/tests/core/style/checkelementmatch.js @@ -21,6 +21,12 @@ assert.isTrue( stylesYellow.checkElementMatch( CKEDITOR.document.getById( 'yellow' ), true ), 'Yellow styles match (short).' ); assert.isTrue( stylesYellowUpper.checkElementMatch( CKEDITOR.document.getById( 'yellow' ), true ), 'Yellow styles match (long, upper-case).' ); assert.isTrue( stylesYellowUpperShort.checkElementMatch( CKEDITOR.document.getById( 'yellow' ), true ), 'Yellow styles match (short, upper-case).' ); + }, + 'test styles font-family ignore quotes': function() { + var styleFontMatch = new CKEDITOR.style( { element: 'span', attributes: { 'style': 'font-family:Univers LT Std;' } } ), + styleFontNoMatch = new CKEDITOR.style( { element: 'span', attributes: { 'style': 'font-family:Verdana;' } } ); + assert.isTrue( styleFontMatch.checkElementMatch( CKEDITOR.document.getById( 'font' ), true ), 'Font styles match.' ); + assert.isFalse( styleFontNoMatch.checkElementMatch( CKEDITOR.document.getById( 'font' ), true ), 'Font styles match.' ); } } ); } )(); From 3e648cb19394c5852d75f6acdb81d8239cde995d Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Mon, 11 Jul 2016 15:15:20 +0200 Subject: [PATCH 10/14] Tests: update tags in manual test. --- tests/plugins/font/manual/quotedfont.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/plugins/font/manual/quotedfont.md b/tests/plugins/font/manual/quotedfont.md index c49c67f89e3..08b703d3a4d 100644 --- a/tests/plugins/font/manual/quotedfont.md +++ b/tests/plugins/font/manual/quotedfont.md @@ -1,4 +1,4 @@ -@bender-tags: 4.4.6, tc +@bender-tags: 4.5.10, tc, 10750 @bender-ui: collapsed @bender-ckeditor-plugins: wysiwygarea, toolbar, font, enterkey, elementspath, sourcearea From 8d7f2cfd16c19fafb3492a23f77a515d42f3a2f7 Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Mon, 11 Jul 2016 15:15:47 +0200 Subject: [PATCH 11/14] Tests: fix unit test. --- tests/core/style/checkelementremovable.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/core/style/checkelementremovable.js b/tests/core/style/checkelementremovable.js index e913bd552e9..7aa0d965363 100644 --- a/tests/core/style/checkelementremovable.js +++ b/tests/core/style/checkelementremovable.js @@ -83,10 +83,10 @@ bender.test( { }, test_checkElementRemovable_fontFamily: function() { - var element = CKEDITOR.dom.element.createFromHtml( 'Test Font', doc ); + var element = CKEDITOR.dom.element.createFromHtml( 'Test Font', doc ); playground.append( element ); var style = new CKEDITOR.style( { element: 'span', styles: { 'font-family': '#(family)' } }, { family: 'Georgia, serif;' } ); assert.isTrue( style.checkElementRemovable( element, true ) ); } -} ); \ No newline at end of file +} ); From 152ef070c1afca0cf866135e4c50b0766cfd449e Mon Sep 17 00:00:00 2001 From: Tadeusz Piskozub Date: Mon, 11 Jul 2016 15:17:08 +0200 Subject: [PATCH 12/14] Strip quotes only from font-family styles. --- core/style.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core/style.js b/core/style.js index e529e893beb..7a624cb2029 100644 --- a/core/style.js +++ b/core/style.js @@ -1797,8 +1797,11 @@ CKEDITOR.STYLE_OBJECT = 3; // @returns {Boolean} function compareCssText( source, target ) { var stripQuotes = function( string ) { - return string.replace( /["']/g, '' ); - }; + return string.replace( /["']/g, '' ); + }, + pass = function( string ) { + return string; + }; if ( typeof source == 'string' ) source = CKEDITOR.tools.parseCssText( source ); @@ -1810,9 +1813,11 @@ CKEDITOR.STYLE_OBJECT = 3; return false; } - if ( !( ( stripQuotes( target[ name ] ) == stripQuotes( source[ name ] ) || + var filter = name.toLowerCase() == 'font-family' ? stripQuotes : pass; + + if ( !( filter( target[ name ] ) == filter( source[ name ] ) || source[ name ] == 'inherit' || - target[ name ] == 'inherit' ) ) ) { + target[ name ] == 'inherit' ) ) { return false; } } From c12ff8127169dfd009175f81b89de486e910582b Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Mon, 11 Jul 2016 17:14:17 +0200 Subject: [PATCH 13/14] Simplified the filter in compareCssText function. --- core/style.js | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/core/style.js b/core/style.js index 7a624cb2029..eba2bb6b0c6 100644 --- a/core/style.js +++ b/core/style.js @@ -1796,12 +1796,10 @@ CKEDITOR.STYLE_OBJECT = 3; // @param {Object/String} target // @returns {Boolean} function compareCssText( source, target ) { - var stripQuotes = function( string ) { - return string.replace( /["']/g, '' ); - }, - pass = function( string ) { - return string; - }; + function filter( string, propertyName ) { + // In case of font-families we'll skip quotes. (#10750) + return propertyName.toLowerCase() == 'font-family' ? string.replace( /["']/g, '' ) : ''; + } if ( typeof source == 'string' ) source = CKEDITOR.tools.parseCssText( source ); @@ -1813,9 +1811,7 @@ CKEDITOR.STYLE_OBJECT = 3; return false; } - var filter = name.toLowerCase() == 'font-family' ? stripQuotes : pass; - - if ( !( filter( target[ name ] ) == filter( source[ name ] ) || + if ( !( filter( target[ name ], name ) == filter( source[ name ], name ) || source[ name ] == 'inherit' || target[ name ] == 'inherit' ) ) { return false; From 5bdd1669fb52e0539e4f3e14f4ba4bf6759bfc53 Mon Sep 17 00:00:00 2001 From: Marek Lewandowski Date: Tue, 12 Jul 2016 11:22:06 +0200 Subject: [PATCH 14/14] Changelog entry. --- CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGES.md b/CHANGES.md index baff9eeb1df..cc47c07ae7b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,6 +5,7 @@ CKEditor 4 Changelog Fixed Issues: +* [#10750](http://dev.ckeditor.com/ticket/10750): Fixed: The editor don't unquote the font-family style property. * [#14413](http://dev.ckeditor.com/ticket/14413): Fixed: Autogrow plugin with `autoGrow_onStartup` option set to `true` does not work properly for not visible editor. * [#14451](http://dev.ckeditor.com/ticket/14451): Fixed: Numeric element id not escaped properly. Thanks to Jakub Chalupa! * [#14701](http://dev.ckeditor.com/ticket/14701): Fixed: More precise labels for image and placeholder widgets.