Changeset 770


Ignore:
Timestamp:
09/04/2007 08:53:43 AM (8 years ago)
Author:
martinkou
Message:

Reduced memory leak while switching between Source mode and WYSIWYG mode.

Location:
FCKeditor/trunk/editor/_source
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • FCKeditor/trunk/editor/_source/classes/fckeditingarea.js

    r694 r770  
    4747        // Remove all child nodes from the target.
    4848        while( eTargetElement.childNodes.length > 0 )
     49        {
     50                if ( eTargetElement.childNodes[0].contentWindow )
     51                        eTargetElement.childNodes[0].contentWindow.document.body.innerHTML = "" ;
    4952                eTargetElement.removeChild( eTargetElement.childNodes[0] ) ;
     53        }
    5054
    5155        if ( this.Mode == FCK_EDITMODE_WYSIWYG )
  • FCKeditor/trunk/editor/_source/commandclasses/fcklistcommands.js

    r632 r770  
    3636        Execute : function()
    3737        {
     38                /*
    3839                if ( FCKBrowserInfo.IsIE && this.GetState() == FCK_TRISTATE_OFF )
    3940                {
    4041                        // IE does not split selected <br> tags when it is making lists. (See #428)
    4142                        // So, pre-split the blocks for IE.
     43                        var range = new FCKDomRange( FCK.EditorWindow ) ;
     44                        range.MoveToSelection() ;
     45                        var terminals = this._GetIETerminalNodes( range ) ;
     46                        var selectionStartNode = terminals.start ;
     47                        var selectionEndNode = terminals.end ;
     48
     49                        var brNodes = [] ;
     50                        var curNode = selectionStartNode ;
     51                        while ( curNode && curNode != selectionEndNode )
     52                        {
     53                                if ( curNode.nodeType == 1 && curNode.tagName.toLowerCase() == 'br' )
     54                                        brNodes.push( curNode ) ;
     55                                curNode = FCKTools.GetNextNode( curNode ) ;
     56                        }
     57
     58                        for ( var i = brNodes.length - 1 ; i >= 0 ; i-- )
     59                        {
     60                                range.SetStart( brNodes[i], 3 ) ;
     61                                range.SetEnd( brNodes[i], 3 ) ;
     62                                brNodes[i].parentNode.removeChild( brNodes[i] ) ;
     63                                range.SplitBlock() ;
     64                        }
     65
     66                        range.SetStart( selectionStartNode, 1 ) ;
     67                        range.SetEnd( selectionEndNode, 4 ) ;
     68                        range.Select() ;
     69                }
     70                */
     71                FCK.ExecuteNamedCommand( this.Name ) ;
     72                /*
     73                if ( FCKBrowserInfo.IsIE && this.GetState() == FCK_TRISTATE_OFF && FCKConfig.EnterMode.IEquals( 'br' ) )
     74                {
    4275                        var range = new FCKDomRange( FCK.EditorWindow ) ;
    4376                        range.MoveToSelection() ;
     
    6497                                }
    6598                        }
     99                        var startParents = FCKDomTools.GetParents( startNode ) ;
     100                        var endParents = FCKDomTools.GetParents( endNode ) ;
     101                        var commonLength = 0 ;
     102                        while ( startParents[commonLength] == endParents[commonLength] )
     103                                commonLength++ ;
     104                        if ( startParents.length <= commonLength || endParents.length <= commonLength )
     105                                return ;
     106                        startNode = startParents[commonLength] ;
     107                        endNode = endParents[commonLength] ;
     108                        if ( startNode.parentNode != endNode.parentNode )
     109                                return ;
     110                        var removedNode = null ;
     111                        var curNode = startNode ;
     112                        while ( curNode && ( removedNode != endNode ) )
     113                        {
     114                                if ( curNode != endNode )
     115                                        curNode.appendChild( curNode.ownerDocument.createElement( 'br' ) ) ;
     116                                var temp = curNode.nextSibling ;
     117                                removedNode = curNode.removeNode( false ) ;
     118                                curNode = temp ;
     119                        }
     120                }
     121                */
     122        },
    66123
    67                         var brNodes = [] ;
    68                         var curNode = startNode ;
    69                         while ( curNode && curNode != endNode )
     124        _GetIETerminalNodes : function( range )
     125        {
     126                var startNode = range._Range.startContainer ;
     127                var endNode = range._Range.endContainer ;
     128                if ( startNode.nodeType == 1 )
     129                {
     130                        if ( startNode.firstChild )
    70131                        {
    71                                 if ( curNode.nodeType == 1 && curNode.tagName.toLowerCase() == 'br' )
    72                                         brNodes.push( curNode ) ;
    73                                 curNode = FCKTools.GetNextNode( curNode ) ;
     132                                if ( startNode.childNodes.length <= range._Range.startOffset )
     133                                        startNode = startNode.lastChild ;
     134                                else
     135                                        startNode = startNode.childNodes[ range._Range.startOffset ] ;
    74136                        }
    75 
    76                         for ( var i = brNodes.length - 1 ; i >= 0 ; i-- )
     137                }
     138                if ( endNode.nodeType == 1 )
     139                {
     140                        if ( endNode.firstChild )
    77141                        {
    78                                 range.SetStart( brNodes[i], 3 ) ;
    79                                 range.SetEnd( brNodes[i], 3 ) ;
    80                                 brNodes[i].parentNode.removeChild( brNodes[i] ) ;
    81                                 range.SplitBlock() ;
     142                                if ( endNode.childNodes.length <= range._Range.endOffset )
     143                                        endNode = endNode.lastChild ;
     144                                else
     145                                        endNode = endNode.childNodes[ range._Range.endOffset ] ;
    82146                        }
    83 
    84                         range.SetStart( startNode, 1 ) ;
    85                         range.SetEnd( endNode, 4 ) ;
    86                         range.Select() ;
    87147                }
    88                 FCK.ExecuteNamedCommand( this.Name ) ;
     148                return { start : startNode, end : endNode } ;
    89149        }
    90150};
  • FCKeditor/trunk/editor/_source/internals/fckdomtools.js

    r732 r770  
    270270                while ( node )
    271271                {
    272                         parents.splice( 0, 0, node ) ;
     272                        parents.unshift( node ) ;
    273273                        node = node.parentNode ;
    274274                }
  • FCKeditor/trunk/editor/_source/internals/fcktools.js

    r703 r770  
    477477}
    478478
     479// Perform a one-step DFS walk backwards.
     480FCKTools.GetPrevNode = function( node, limitNode )
     481{
     482        if ( node.previousSibling )
     483        {
     484                var cursor = node.previousSibling ;
     485                while ( cursor.lastChild )
     486                        cursor = cursor.lastChild ;
     487                return cursor ;
     488        }
     489        else
     490        {
     491                if ( node.parentNode == limitNode )
     492                        return null ;
     493                return node.parentNode ;
     494        }
     495}
     496
    479497// Perform a one-step DFS walk.
    480498FCKTools.GetNextNode = function( node, limitNode )
Note: See TracChangeset for help on using the changeset viewer.
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy