function blockNeedsExtension( block )\r
{\r
var lastChild = lastNoneSpaceChild( block );\r
- return !lastChild || lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br';\r
+\r
+ return !lastChild\r
+ || lastChild.type == CKEDITOR.NODE_ELEMENT && lastChild.name == 'br'\r
+ // Some of the controls in form needs extension too,\r
+ // to move cursor at the end of the form. (#4791)\r
+ || block.name == 'form' && lastChild.name == 'input';\r
}\r
\r
function extendBlockForDisplay( block )\r
delete blockLikeTags.pre;\r
var defaultDataFilterRules =\r
{\r
+ elements : {},\r
attributeNames :\r
[\r
// Event attributes (onXYZ) must not be directly set. They can become\r
}\r
},\r
\r
+ html : function( element )\r
+ {\r
+ delete element.attributes.contenteditable;\r
+ delete element.attributes[ 'class' ];\r
+ },\r
+\r
body : function( element )\r
{\r
delete element.attributes.spellcheck;\r
\r
title : function( element )\r
{\r
- element.children[ 0 ].value = element.attributes[ '_cke_title' ];\r
+ var titleText = element.children[ 0 ];\r
+ titleText && ( titleText.value = element.attributes[ '_cke_title' ] || '' );\r
}\r
},\r
\r
};\r
}\r
\r
+ function protectReadOnly( element )\r
+ {\r
+ element.attributes.contenteditable = "false";\r
+ }\r
+ function unprotectReadyOnly( element )\r
+ {\r
+ delete element.attributes.contenteditable;\r
+ }\r
+ // Disable form elements editing mode provided by some browers. (#5746)\r
+ for ( i in { input : 1, textarea : 1 } )\r
+ {\r
+ defaultDataFilterRules.elements[ i ] = protectReadOnly;\r
+ defaultHtmlFilterRules.elements[ i ] = unprotectReadyOnly;\r
+ }\r
+\r
var protectAttributeRegex = /<(?:a|area|img|input)[\s\S]*?\s((?:href|src|name)\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|(?:[^ "'>]+)))/gi;\r
\r
var protectElementsRegex = /(?:<style(?=[ >])[^>]*>[\s\S]*<\/style>)|(?:<(:?link|meta|base)[^>]*>)/gi,\r