Changeset 770


Ignore:
Timestamp:
09/04/07 08:53:43 (7 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