Changeset 6646


Ignore:
Timestamp:
04/06/2011 03:27:14 PM (4 years ago)
Author:
Saare
Message:

#7494: Regression of [6629]: Parser may go in infinite loop when it fixes malformed list structures.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CKEditor/trunk/_source/core/htmlparser/fragment.js

    r6629 r6646  
    185185                } 
    186186 
    187                 parser.onTagOpen = function( tagName, attributes, selfClosing ) 
     187                parser.onTagOpen = function( tagName, attributes, selfClosing, optionalClose ) 
    188188                { 
    189189                        var element = new CKEDITOR.htmlParser.element( tagName, attributes ); 
     
    194194                                element.isEmpty = true; 
    195195 
     196                        element.isOptionalClose = optionalClose; 
     197 
    196198                        // This is a tag to be removed if empty, so do not add it immediately. 
    197199                        if ( CKEDITOR.dtd.$removeEmpty[ tagName ] ) 
     
    225227                                if ( !element.isUnknown && !currentNode.isUnknown && !currentDtd[ tagName ] ) 
    226228                                { 
     229                                        // Current node doesn't have a close tag, time for a close 
     230                                        // as this element isn't fit in. (#7497) 
     231                                        if ( currentNode.isOptionalClose ) 
     232                                                parser.onTagClose( currentName ); 
    227233                                        // Fixing malformed nested lists by moving it into a previous list item. (#3828) 
    228                                         if ( tagName in listBlocks 
     234                                        else if ( tagName in listBlocks 
    229235                                                && currentName in listBlocks ) 
    230236                                        { 
     
    236242                                                        addElement( ( lastChild = new CKEDITOR.htmlParser.element( 'li' ) ), currentNode ); 
    237243 
     244                                                !element.returnPoint && ( element.returnPoint = currentNode ); 
    238245                                                currentNode = lastChild; 
    239246                                        } 
    240247                                        // Establish new list root for orphan list items. 
    241248                                        else if ( tagName in CKEDITOR.dtd.$listItem && currentName != tagName ) 
    242                                                 parser.onTagOpen( tagName == 'li' ? 'ul' : 'dl', {} ); 
     249                                                parser.onTagOpen( tagName == 'li' ? 'ul' : 'dl', {}, 0, 1 ); 
    243250                                        // We're inside a structural block like table and list, AND the incoming element 
    244251                                        // is not of the same type (e.g. <td>td1<td>td2</td>), we simply add this new one before it, 
     
    370377                                 && CKEDITOR.tools.trim( text ) ) 
    371378                        { 
    372                                 this.onTagOpen( fixForBody, {} ); 
     379                                this.onTagOpen( fixForBody, {}, 0, 1 ); 
    373380                        } 
    374381 
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy