/*\r
-Copyright (c) 2003-2011, CKSource - Frederico Knabben. All rights reserved.\r
+Copyright (c) 2003-2012, CKSource - Frederico Knabben. All rights reserved.\r
For licensing, see LICENSE.html or http://ckeditor.com/license\r
*/\r
\r
};\r
}\r
\r
+\r
+ var isBogus = CKEDITOR.dom.walker.bogus();\r
// Evaluator for CKEDITOR.dom.element::checkBoundaryOfElement, reject any\r
// text node and non-empty elements unless it's being bookmark text.\r
- function elementBoundaryEval( node )\r
+ function elementBoundaryEval( checkStart )\r
{\r
- // Reject any text node unless it's being bookmark\r
- // OR it's spaces. (#3883)\r
- return node.type != CKEDITOR.NODE_TEXT\r
- && node.getName() in CKEDITOR.dtd.$removeEmpty\r
- || !CKEDITOR.tools.trim( node.getText() )\r
- || !!node.getParent().data( 'cke-bookmark' );\r
+ return function( node )\r
+ {\r
+ // Tolerant bogus br when checking at the end of block.\r
+ // Reject any text node unless it's being bookmark\r
+ // OR it's spaces.\r
+ // Reject any element unless it's being invisible empty. (#3883)\r
+ return !checkStart && isBogus( node ) ||\r
+ ( node.type == CKEDITOR.NODE_TEXT ?\r
+ !CKEDITOR.tools.trim( node.getText() ) || !!node.getParent().data( 'cke-bookmark' )\r
+ : node.getName() in CKEDITOR.dtd.$removeEmpty );\r
+ };\r
}\r
\r
var whitespaceEval = new CKEDITOR.dom.walker.whitespaces(),\r
// whitespaces at the end.\r
isWhiteSpace = false;\r
\r
- if ( sibling.type == CKEDITOR.NODE_TEXT )\r
+ if ( sibling.type == CKEDITOR.NODE_COMMENT )\r
+ {\r
+ sibling = sibling.getPrevious();\r
+ continue;\r
+ }\r
+ else if ( sibling.type == CKEDITOR.NODE_TEXT )\r
{\r
siblingText = sibling.getText();\r
\r
sibling = null;\r
else\r
{\r
- var allChildren = sibling.$.all || sibling.$.getElementsByTagName( '*' );\r
+ var allChildren = sibling.$.getElementsByTagName( '*' );\r
for ( var i = 0, child ; child = allChildren[ i++ ] ; )\r
{\r
if ( !CKEDITOR.dtd.$removeEmpty[ child.nodeName.toLowerCase() ] )\r
\r
isWhiteSpace = /^[\s\ufeff]/.test( siblingText );\r
}\r
- else\r
+ else if ( sibling.type == CKEDITOR.NODE_ELEMENT )\r
{\r
// If this is a visible element.\r
// We need to check for the bookmark attribute because IE insists on\r
sibling = null;\r
else\r
{\r
- allChildren = sibling.$.all || sibling.$.getElementsByTagName( '*' );\r
+ allChildren = sibling.$.getElementsByTagName( '*' );\r
for ( i = 0 ; child = allChildren[ i++ ] ; )\r
{\r
if ( !CKEDITOR.dtd.$removeEmpty[ child.nodeName.toLowerCase() ] )\r
sibling = null;\r
}\r
}\r
+ else\r
+ isWhiteSpace = 1;\r
\r
if ( isWhiteSpace )\r
{\r
// Create the walker, which will check if we have anything useful\r
// in the range.\r
var walker = new CKEDITOR.dom.walker( walkerRange );\r
- walker.evaluator = elementBoundaryEval;\r
+ walker.evaluator = elementBoundaryEval( checkStart );\r
\r
return walker[ checkStart ? 'checkBackward' : 'checkForward' ]();\r
},\r