Ticket #3475: 3475_7.patch

File 3475_7.patch, 35.8 KB (added by garry.yao, 5 years ago)
  • _source/core/dom/rangelist.js

     
     1/* 
     2Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved. 
     3For licensing, see LICENSE.html or http://ckeditor.com/license 
     4*/ 
     5( function() 
     6{ 
     7        /** 
     8         * Representation of multiple ranges within a selection. 
     9         * @param {CKEDITOR.dom.range | Array<{CKEDITOR.dom.range> | undefined } ranges 
     10         *  The ranges consist of this list, note that if an array of ranges is specified, 
     11         *  the range sequence should compliant with the selection order, this class is 
     12         *  will not help to sort them. 
     13         */ 
     14        CKEDITOR.dom.rangeList = function( ranges ) 
     15        { 
     16                if ( typeof ranges == 'undefined' ) 
     17                        ranges = []; 
     18                if( CKEDITOR.tools.isArray( ranges ) ) 
     19                        ranges = ranges; 
     20                else if ( ranges instanceof CKEDITOR.dom.range ) 
     21                        ranges = [ ranges ]; 
     22                else 
     23                        throw 'Unknown ranges type.'; 
     24 
     25                this._ = 
     26                { 
     27                        ranges : ranges, 
     28                        count : ranges.length 
     29                } 
     30 
     31        }; 
     32 
     33        // Update the specified range which has been mangled by previous insertion of 
     34        // range bookmark nodes.(#3256) 
     35        function updateDirtyRange( bookmark, dirtyRange , checkEnd ) 
     36        { 
     37                var serializable = bookmark.serializable, 
     38                        container = dirtyRange[ checkEnd ? 'endContainer' : 'startContainer' ], 
     39                        offset = checkEnd ? 'endOffset' : 'startOffset', 
     40                        bookmarkStart = serializable ? 
     41                                dirtyRange.document.getById( bookmark.startNode ) 
     42                                : bookmark.startNode, 
     43                        bookmarkEnd = serializable ? 
     44                          dirtyRange.document.getById( bookmark.endNode ) 
     45                          : bookmark.endNode; 
     46 
     47                if ( container.equals( bookmarkStart.getPrevious() ) ) 
     48                { 
     49                        dirtyRange.startOffset = dirtyRange.startOffset 
     50                                        - container.getLength() - bookmarkEnd.getPrevious().getLength(); 
     51                        container = bookmarkEnd.getNext(); 
     52                } 
     53                else if ( container.equals( bookmarkEnd.getPrevious() ) ) 
     54                { 
     55                        dirtyRange.startOffset = dirtyRange.startOffset - container.getLength(); 
     56                        container = bookmarkEnd.getNext(); 
     57                } 
     58 
     59                container.equals( bookmarkStart.getParent() ) && dirtyRange[ offset ]++; 
     60                container.equals( bookmarkEnd.getParent() ) && dirtyRange[ offset ]++; 
     61 
     62                // Update and return this range. 
     63                dirtyRange[ checkEnd ? 'endContainer' : 'startContainer' ] = container; 
     64                return dirtyRange; 
     65        } 
     66 
     67        CKEDITOR.dom.rangeList.prototype = { 
     68                /** 
     69                 * Appending the specified range object to end of current list. 
     70                 * @param { CKEDITOR.dom.range} range 
     71                 * @example 
     72                 * var rangeList = new CKEDITOR.dom.rangeList(); 
     73                 * var range = new CKEDITOR.dom.range(); 
     74                 * ... 
     75                 * rangeList.add( range ); 
     76                 * alert( rangeList.getItem( 0 ) ); 
     77                 */ 
     78                add : function( range ) 
     79                { 
     80                        this._.ranges.push( range ); 
     81                        this._.count++; 
     82                }, 
     83 
     84                getItem : function( index ) 
     85                { 
     86                        return this._.ranges[ index ] || null; 
     87                }, 
     88 
     89                count : function() 
     90                { 
     91                        return this._.count; 
     92                }, 
     93 
     94                /** 
     95                 * Create an instance of rangeList iterator, it should be only used while 
     96                 * the processing of each range is possibly polluting other this._.ranges, e.g. destroy 
     97                 * the following range's start container OR change others' offset value; 
     98                 * Otherwise, simply iterating with {@link CKEDITOR.dom.rangeList::getItem} 
     99                 * in a for loop. 
     100                 */ 
     101                createIterator : function() 
     102                { 
     103                        var ranges = this._.ranges; 
     104 
     105                        function iterator() 
     106                        { 
     107                                this._ = { 
     108//                              // The current range under iteration. 
     109//                              current : undefined, 
     110//                              // The created bookmarks for the dirty this._.ranges. 
     111//                              bookmarks : [] 
     112                                }; 
     113                        } 
     114 
     115                        iterator.prototype = { 
     116 
     117                                getNextRange : function() 
     118                                { 
     119                                        var current = this._.current; 
     120                                        if ( !this._.count || current === this._.count - 1 ) 
     121                                                return null; 
     122                                        else 
     123                                                current =  typeof current == 'undefined' ? 0 : current + 1; 
     124 
     125                                        var range = this._.ranges [ current ]; 
     126 
     127                                        // Multiple this._.ranges might be mangled by previous. 
     128                                        if ( this._.count > 1 ) 
     129                                        { 
     130                                                if ( !this._.bookmarks ) 
     131                                                        this._.bookmarks = []; 
     132 
     133                                                // Bookmarking all other this._.ranges on the first iteration. 
     134                                                if ( current == 0 ) 
     135                                                { 
     136                                                        for ( var i = 1; i < this._.count; i++ ) 
     137                                                        { 
     138                                                                this._.bookmarks.push( this._.ranges[ i ].createBookmark() ); 
     139                                                        } 
     140                                                } 
     141                                                // Update the _.current returning range. 
     142                                                else 
     143                                                { 
     144                                                        range.moveToBookmark( this._.bookmarks.shift() ); 
     145                                                } 
     146 
     147                                        } 
     148                                        this._.current = current; 
     149                                        return range; 
     150                                } 
     151                        }; 
     152 
     153                        return new iterator(); 
     154                }, 
     155 
     156 
     157                createBookmarks : function( serializable ) 
     158                { 
     159                        var retval = [], bookmark; 
     160                        for ( var i = 0; i < this._.count ; i++ ) 
     161                        { 
     162                                retval.push( bookmark = this._.ranges[ i ]. 
     163                                                createBookmark( serializable, true) ); 
     164                                // Updating the container & offset values for rest of this._.ranges 
     165                                // which have been mangled. 
     166                                for ( var j = i + 1; j < this._.count; j++ ) 
     167                                { 
     168                                        this._.ranges[ j ] = updateDirtyRange( bookmark, this._.ranges[ j ] ); 
     169                                        this._.ranges[ j ] = updateDirtyRange( bookmark, this._.ranges[ j ], true ); 
     170                                } 
     171                        } 
     172                        return retval; 
     173                }, 
     174 
     175                /** 
     176                 * Apply each of the supplied bookmarks to the corresponding range at the index. 
     177                 * @param bookmarks 
     178                 */ 
     179                moveToBookmarks :  function( bookmarks ) 
     180                { 
     181                        for ( var i = 0 ; i < this._.ranges.length ; i++ ) 
     182                                this._.ranges[ i ].moveToBookmark( bookmarks[ i ] ); 
     183                }, 
     184 
     185                createBookmarks2 : function( normalized ) 
     186                { 
     187                        var bookmarks = []; 
     188 
     189                        for ( var i = 0 ; i < this._.ranges.length ; i++ ) 
     190                                bookmarks.push( this._.ranges[ i ].createBookmark2( normalized ) ); 
     191 
     192                        return bookmarks; 
     193                } 
     194 
     195        }; 
     196 
     197 
     198} )(); 
  • _source/tests/core/dom/rangelist.html

     
     1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
     2<html xmlns="http://www.w3.org/1999/xhtml"> 
     3<head> 
     4        <title>CKEDITOR.dom.rangelist</title> 
     5        <link rel="stylesheet" type="text/css" href="../../test.css" /> 
     6        <script type="text/javascript" src="../../../../ckeditor_source.js"></script> <!-- %REMOVE_LINE% 
     7        <script type="text/javascript" src="../../../ckeditor.js"></script> 
     8        %REMOVE_LINE% --> 
     9        <script type="text/javascript" src="../../test.js"></script> 
     10        <script type="text/javascript"> 
     11//<![CDATA[ 
     12CKEDITOR.plugins.load( [ 'selection' ] ); 
     13//]]> 
     14        </script> 
     15        <script type="text/javascript"> 
     16//<![CDATA[ 
     17var tc; 
     18 
     19CKEDITOR.test.addTestCase( (function() 
     20{ 
     21        // Local references. 
     22        var assert = CKEDITOR.test.assert; 
     23        var doc = new CKEDITOR.dom.document( document ); 
     24 
     25        return tc = { 
     26 
     27                setUp : function() 
     28                { 
     29                        doc.getById( 'playground').setHtml( '<p id="_P1">This is some <strong id="_B1">sample text</strong>. You are using</p>' ); 
     30                        var sel = doc.getSelection(); 
     31                        var range1 = new CKEDITOR.dom.range(); 
     32                        range1.setStart( doc.getById( '_P1' ).getFirst(), 8 ); 
     33                        range1.setEnd( doc.getById( '_B1' ).getFirst(), 2 ); 
     34 
     35                        var range2 = new CKEDITOR.dom.range(); 
     36                        range2.setStart( doc.getById( '_B1' ).getFirst(), 7 ); 
     37                        range2.setEnd( doc.getById( '_P1' ).getChildren().getItem( 2 ), 5 ); 
     38 
     39                        // <p id="_P1">This is [some <strong id="_B1">sa]mple [text</strong>. You] are using</p> 
     40                        sel.selectRanges( new CKEDITOR.dom.rangeList( [ range1, range2 ] ) ); 
     41                }, 
     42                ///////////// 
     43 
     44                test_count_getItem : function() 
     45                { 
     46                        var rangeList = doc.getSelection().getRanges(); 
     47                        var count = rangeList.count(); 
     48                        assert.areSame( 2, count ); 
     49 
     50                        var range1 = rangeList.getItem( 0 ); 
     51                        var range2 = rangeList.getItem( 1 ); 
     52 
     53                        assert.areEqual( doc.getById( '_P1' ).getFirst().$, range1.startContainer.$ ); 
     54                        assert.areEqual( 8, range1.startOffset ); 
     55                        assert.areEqual( doc.getById( '_B1' ).getFirst().$, range1.endContainer.$ ); 
     56                        assert.areEqual( 2, range1.endOffset ); 
     57 
     58                        assert.areEqual( doc.getById( '_B1' ).getFirst().$, range2.startContainer.$ ); 
     59                        assert.areEqual( 7, range2.startOffset ); 
     60                        assert.areEqual( doc.getById( '_P1' ).getChildren().getItem( 2 ).$, range2.endContainer.$ ); 
     61                        assert.areEqual( 5, range2.endOffset ); 
     62                }, 
     63 
     64                test_add : function() 
     65                { 
     66                        var rangeList = doc.getSelection().getRanges(); 
     67 
     68                        var range3 = new CKEDITOR.dom.range(); 
     69                        range3.setStart( doc.getById( '_P1' ).getChildren().getItem( 2 ), 8 ); 
     70                        range3.setEnd( doc.getById( '_P1' ).getChildren().getItem( 2 ), 14 ); 
     71 
     72                        rangeList.add( range3 ); 
     73 
     74                        doc.getSelection().selectRanges( rangeList ); 
     75                        var range3 = doc.getSelection().getRanges().getItem( 2 ); 
     76                        assert.areEqual( doc.getById( '_P1' ).getChildren().getItem( 2 ).$, range3.startContainer.$ ); 
     77                        assert.areEqual( 8, range3.startOffset ); 
     78                        assert.areEqual( doc.getById( '_P1' ).getChildren().getItem( 2 ).$, range3.endContainer.$ ); 
     79                        assert.areEqual( 14, range3.endOffset ); 
     80                }, 
     81 
     82                test_createBookmarks : function() 
     83                { 
     84 
     85                        var bookmarks = doc.getSelection().getRanges().createBookmarks(); 
     86                        var range1 = new CKEDITOR.dom.range(); 
     87                        range1.moveToBookmark( bookmarks[ 0 ] ); 
     88                        var range2 = new CKEDITOR.dom.range(); 
     89                        range2.moveToBookmark( bookmarks[ 1 ] ); 
     90 
     91                        assert.areEqual( doc.getById( '_P1' ).$, range1.startContainer.$ ); 
     92                        assert.areEqual( 1, range1.startOffset ); 
     93                        assert.areEqual( doc.getById( '_B1' ).$, range1.endContainer.$ ); 
     94                        assert.areEqual( 1, range1.endOffset ); 
     95 
     96                        assert.areEqual( doc.getById( '_B1' ).$, range2.startContainer.$ ); 
     97                        assert.areEqual( 2, range2.startOffset ); 
     98                        assert.areEqual( doc.getById( '_P1' ).$, range2.endContainer.$ ); 
     99                        assert.areEqual( 4, range2.endOffset ); 
     100                }, 
     101 
     102                test_iterator : function() 
     103                { 
     104                        var sel = doc.getSelection(), 
     105                                rangeList = sel.getRanges(), 
     106                                iterator = rangeList.createIterator(), 
     107                                range; 
     108 
     109                        // Create bookmarks before iteration for easy comparison. 
     110                        rangeList.moveToBookmarks( rangeList.createBookmarks() ); 
     111                        var rangesBefore = [], rangesAfter = []; 
     112                        for ( var i = 0 ; i < rangeList.count() ; i++ ) 
     113                        { 
     114                                rangesBefore.push( rangeList.getItem( i ).clone() ); 
     115                        } 
     116 
     117                        while( range = iterator.getNextRange() ) 
     118                        { 
     119                                var nextRange = rangeList.getItem( iterator._.current + 1 ); 
     120                                // Destroy the next range. 
     121                                nextRange && nextRange.enlarge( CKEDITOR.ENLARGE_BLOCK_CONTENTS ); 
     122                                rangesAfter.push( range ); 
     123                        } 
     124 
     125                        for( i = 0 ; i < rangesAfter.length ; i++  ) 
     126                        { 
     127                                var rangeBefore = rangesBefore[ i ], 
     128                                        rangeAfter = rangesAfter[ i ]; 
     129                                assert.areSame( rangeBefore.startContainer.$, rangeAfter.startContainer.$ ); 
     130                                assert.areSame( rangeBefore.startOffset, rangeAfter.startOffset ); 
     131                                assert.areSame( rangeBefore.endContainer.$, rangeAfter.endContainer.$ ); 
     132                                assert.areSame( rangeBefore.endOffset, rangeAfter.endOffset ); 
     133                        } 
     134                }, 
     135 
     136                name : document.title 
     137        }; 
     138})() ); 
     139 
     140//window.onload = tests.test_iterator; 
     141 
     142        //]]> 
     143        </script> 
     144</head> 
     145<body> 
     146<p id="playground"></p> 
     147</body> 
     148</html> 
  • _source/tests/testall.html

     
    2323        'core/dom/element', 
    2424        'core/dom/node', 
    2525        'core/dom/range', 
     26        'core/dom/rangelist', 
    2627        'core/dom/text', 
    2728        'core/dom/window', 
    2829        'core/htmlparser/fragment', 
  • _source/plugins/pagebreak/plugin.js

     
    8282 
    8383                var ranges = editor.getSelection().getRanges(); 
    8484 
    85                 for ( var range, i = 0 ; i < ranges.length ; i++ ) 
     85                for ( var range, i = 0 ; i < ranges.count() ; i++ ) 
    8686                { 
    87                         range = ranges[ i ]; 
     87                        range = ranges.getItem( i ); 
    8888 
    8989                        if ( i > 0 ) 
    9090                                breakObject = breakObject.clone( true ); 
  • _source/plugins/link/dialogs/link.js

     
    10011001                                element = null, 
    10021002                                me = this; 
    10031003                        // Fill in all the relevant fields if there's already one link selected. 
    1004                         if ( ranges.length == 1 ) 
     1004                        if ( ranges.count() ) 
    10051005                        { 
    10061006 
    1007                                 var rangeRoot = ranges[0].getCommonAncestor( true ); 
     1007                                var rangeRoot = ranges.getItem( 0 ).getCommonAncestor( true ); 
    10081008                                element = rangeRoot.getAscendant( 'a', true ); 
    10091009                                if ( element && element.getAttribute( 'href' ) ) 
    10101010                                { 
     
    11281128                        { 
    11291129                                // Create element if current selection is collapsed. 
    11301130                                var selection = editor.getSelection(), 
    1131                                         ranges = selection.getRanges(); 
    1132                                 if ( ranges.length == 1 && ranges[0].collapsed ) 
     1131                                        ranges = selection.getRanges(), 
     1132                                        range; 
     1133                                if ( ranges.count() && 
     1134                                    ( range = ranges.getItem( 0 ) ) && range.collapsed ) 
    11331135                                { 
    11341136                                        var text = new CKEDITOR.dom.text( attributes._cke_saved_href, editor.document ); 
    1135                                         ranges[0].insertNode( text ); 
    1136                                         ranges[0].selectNodeContents( text ); 
     1137                                        range.insertNode( text ); 
     1138                                        range.selectNodeContents( text ); 
    11371139                                        selection.selectRanges( ranges ); 
    11381140                                } 
    11391141 
  • _source/plugins/link/dialogs/anchor.js

     
    66CKEDITOR.dialog.add( 'anchor', function( editor ) 
    77{ 
    88        // Function called in onShow to load selected element. 
    9         var loadElements = function( editor, selection, ranges, element ) 
     9        var loadElements = function( element ) 
    1010        { 
    1111                this.editMode = true; 
    1212                this.editObj = element; 
     
    6363 
    6464                        var editor = this.getParentEditor(), 
    6565                                selection = editor.getSelection(), 
    66                                 ranges = selection.getRanges(); 
     66                                ranges = selection.getRanges(), 
     67                                range; 
    6768 
    68                         if ( ranges.length == 1 ) 
     69                        if ( ranges.count() ) 
    6970                        { 
    70                                 ranges[0].enlarge( CKEDITOR.ENLARGE_ELEMENT ); 
    71                                 var rangeRoot = ranges[0].getCommonAncestor( true ); 
     71                                ( range = ranges.getItem( 0 ) ).enlarge( CKEDITOR.ENLARGE_ELEMENT ); 
     72                                var rangeRoot = range.getCommonAncestor( true ); 
    7273                                var element = rangeRoot.getAscendant( 'img', true ); 
    7374                                if ( element && element.getAttribute( '_cke_real_element_type' ) && element.getAttribute( '_cke_real_element_type' ) == 'anchor' ) 
    7475                                { 
    7576                                        this.fakeObj = element; 
    7677                                        element = editor.restoreRealElement( this.fakeObj ); 
    77                                         loadElements.apply( this, [ editor, selection, ranges, element ] ); 
     78                                        loadElements.call( this, element ); 
    7879                                        selection.selectElement( this.fakeObj ); 
    7980                                } 
    8081                        } 
  • _source/tests/plugins/list/list.html

     
    113113 
    114114                                                        setRange( range, [ 1, 0, 0, 0, 0 ], true ); 
    115115                                                        var sel = editor.getSelection(); 
    116                                                         sel.selectRanges( [ range ] ); 
     116                                                        sel.selectRanges( new CKEDITOR.dom.rangeList( range ) ); 
    117117 
    118118                                                        // Waiting for 'comand state' effected. 
    119119                                                        this.wait( function(){ 
     
    255255 
    256256                                                        setRange( range, [ 1, 0, 0, 0, 0 ], true ); 
    257257                                                        var sel = editor.getSelection(); 
    258                                                         sel.selectRanges( [ range ] ); 
     258                                                        sel.selectRanges( new CKEDITOR.dom.rangeList( range ) ); 
    259259 
    260260                                                        // Waiting for 'comand state' effected. 
    261261                                                        this.wait( function(){ 
  • _source/plugins/wysiwygarea/plugin.js

     
    7070 
    7171                        var range, clone, lastElement, bookmark; 
    7272 
    73                         for ( var i = ranges.length - 1 ; i >= 0 ; i-- ) 
     73                        for ( var i = ranges.count() - 1 ; i >= 0 ; i-- ) 
    7474                        { 
    75                                 range = ranges[ i ]; 
    76  
     75                                range = ranges.getItem( i ); 
    7776                                // Remove the original contents. 
    7877                                range.deleteContents(); 
    7978 
     
    103102                        if ( next && next.type == CKEDITOR.NODE_ELEMENT ) 
    104103                                range.moveToElementEditStart( next ); 
    105104 
    106                         selection.selectRanges( [ range ] ); 
     105                        selection.selectRanges( new CKEDITOR.dom.rangeList( range ) ); 
    107106 
    108107                        if ( selIsLocked ) 
    109108                                this.getSelection().lock(); 
     
    128127                        path = evt.data.path, 
    129128                        blockLimit = path.blockLimit, 
    130129                        selection = evt.data.selection, 
    131                         range = selection.getRanges()[0], 
     130                        range = selection.getRanges().getItem( 0 ), 
    132131                        body = editor.document.getBody(), 
    133132                        enterMode = editor.config.enterMode; 
    134133 
  • _source/plugins/removeformat/plugin.js

     
    3434 
    3535                                var ranges = editor.getSelection().getRanges(); 
    3636 
    37                                 for ( var i = 0, range ; range = ranges[ i ] ; i++ ) 
     37                                for ( var range, i = 0 ; i < ranges.count() ; i++ ) 
    3838                                { 
    3939                                        if ( range.collapsed ) 
    4040                                                continue; 
  • _source/plugins/find/dialogs/find.js

     
    242242                                        this.removeHighlight(); 
    243243 
    244244                                // Apply the highlight. 
    245                                 var range = this.toDomRange(); 
     245                                var range = this.toDomRange(), 
     246                                        bookmark = range.createBookmark(); 
    246247                                highlightStyle.applyToRange( range ); 
     248                                range.moveToBookmark( bookmark ); 
    247249                                this._.highlightRange = range; 
    248250 
    249251                                // Scroll the editor to the highlighted area. 
     
    264266                                if ( !this._.highlightRange ) 
    265267                                        return; 
    266268 
     269                                var bookmark = this._.highlightRange.createBookmark(); 
    267270                                highlightStyle.removeFromRange( this._.highlightRange ); 
     271                                this._.highlightRange.moveToBookmark( bookmark ); 
    268272                                this.updateFromDomRange( this._.highlightRange ); 
    269273                                this._.highlightRange = null; 
    270274                        }, 
     
    547551                { 
    548552                        var searchRange, 
    549553                                sel = editor.getSelection(), 
     554                                ranges, 
    550555                                body = editor.document.getBody(); 
    551                         if ( sel && !isDefault ) 
     556                        if ( !isDefault && sel 
     557                                 && ( ranges = sel.getRanges() ) && ranges.count() ) 
    552558                        { 
    553                                 searchRange = sel.getRanges()[ 0 ].clone(); 
     559                                searchRange = ranges.getItem( 0 ).clone(); 
    554560                                searchRange.collapse( true ); 
    555561                        } 
    556562                        else 
  • _source/plugins/table/dialogs/table.js

     
    4141                                                if ( selectedTable.getName() != 'table' ) 
    4242                                                        selectedTable = null; 
    4343                                        } 
    44                                         else if ( ranges.length > 0 ) 
     44                                        else if ( ranges.count() ) 
    4545                                        { 
    46                                                 var rangeRoot = ranges[0].getCommonAncestor( true ); 
     46                                                var rangeRoot = ranges.getItem( 0 ).getCommonAncestor( true ); 
    4747                                                selectedTable = rangeRoot.getAscendant( 'table', true ); 
    4848                                        } 
    4949 
  • ckeditor.pack

     
    123123                                        '_source/core/dom/domwalker.js', 
    124124                                        '_source/core/dom/walker.js', 
    125125                                        '_source/core/dom/range.js', 
     126                                        '_source/core/dom/rangelist.js', 
    126127                                        '_source/core/_bootstrap.js', 
    127128//                                      '_source/lang/en.js', 
    128129                                        '_source/plugins/about/plugin.js', 
  • _source/plugins/list/plugin.js

     
    361361                                ranges = selection && selection.getRanges(); 
    362362 
    363363                        // There should be at least one selected range. 
    364                         if ( !ranges || ranges.length < 1 ) 
     364                        if ( !ranges.count() ) 
    365365                                return; 
    366366 
    367367                        // Midas lists rule #1 says we can create a list even in an empty document. 
     
    376376                                        var paragraph = doc.createElement( editor.config.enterMode == CKEDITOR.ENTER_P ? 'p' : 
    377377                                                        ( editor.config.enterMode == CKEDITOR.ENTER_DIV ? 'div' : 'br' ) ); 
    378378                                        paragraph.appendTo( body ); 
    379                                         ranges = [ new CKEDITOR.dom.range( doc ) ]; 
     379                                        ranges = new CKEDITOR.dom.rangeList( new CKEDITOR.dom.range( doc ) ); 
    380380                                        // IE exception on inserting anything when anchor inside <br>. 
    381381                                        if ( paragraph.is( 'br' ) ) 
    382382                                        { 
    383                                                 ranges[ 0 ].setStartBefore( paragraph ); 
    384                                                 ranges[ 0 ].setEndAfter( paragraph ); 
     383                                                ranges.getItem( 0 ).setStartBefore( paragraph ); 
     384                                                ranges.getItem( 0 ).setEndAfter( paragraph ); 
    385385                                        } 
    386386                                        else 
    387                                                 ranges[ 0 ].selectNodeContents( paragraph ); 
     387                                                ranges.getItem( 0 ).selectNodeContents( paragraph ); 
    388388                                        selection.selectRanges( ranges ); 
    389389                                } 
    390390                        } 
     
    396396                        var listGroups = [], 
    397397                                database = {}; 
    398398 
    399                         while ( ranges.length > 0 ) 
     399                        for ( var range, i = 0 ; i < ranges.count() ; i++ ) 
    400400                        { 
    401                                 var range = ranges.shift(), 
    402                                         boundaryNodes = range.getBoundaryNodes(), 
     401                                range = ranges.getItem( i ); 
     402                                var     boundaryNodes = range.getBoundaryNodes(), 
    403403                                        startNode = boundaryNodes.startNode, 
    404404                                        endNode = boundaryNodes.endNode; 
    405405                                if ( startNode.type == CKEDITOR.NODE_ELEMENT && startNode.getName() == 'td' ) 
  • _source/plugins/link/plugin.js

     
    166166                        rangeRoot, 
    167167                        element; 
    168168 
    169                 for ( var i = 0 ; i < ranges.length ; i++ ) 
     169                for ( var range, i = 0 ; i < ranges.count() ; i++ ) 
    170170                { 
    171                         rangeRoot = ranges[i].getCommonAncestor( true ); 
     171                        range = ranges.getItem( i ); 
     172                        rangeRoot = range.getCommonAncestor( true ); 
    172173                        element = rangeRoot.getAscendant( 'a', true ); 
    173174                        if ( !element ) 
    174175                                continue; 
    175                         ranges[i].selectNodeContents( element ); 
     176                        range.selectNodeContents( element ); 
    176177                } 
    177178 
    178179                selection.selectRanges( ranges ); 
  • _source/plugins/styles/plugin.js

     
    299299                // Get the DTD definition for the element. Defaults to "span". 
    300300                var dtd = CKEDITOR.dtd[ elementName ] || ( isUnknownElement = true, CKEDITOR.dtd.span ); 
    301301 
    302                 // Bookmark the range so we can re-select it after processing. 
    303                 var bookmark = range.createBookmark(); 
    304  
    305302                // Expand the range. 
    306303                range.enlarge( CKEDITOR.ENLARGE_ELEMENT ); 
    307304                range.trim(); 
     
    497494                        } 
    498495                } 
    499496 
    500 //              this._FixBookmarkStart( startNode ); 
    501  
    502                 range.moveToBookmark( bookmark ); 
    503497        } 
    504498 
    505499        function removeInlineStyle( range ) 
     
    623617 
    624618        function applyBlockStyle( range ) 
    625619        { 
    626                 // Bookmark the range so we can re-select it after processing. 
    627                 var bookmark = range.createBookmark(); 
    628  
    629620                var iterator = range.createIterator(); 
    630621                iterator.enforceRealBlocks = true; 
    631622 
     
    668659//                              this._CheckAndSplitPre( newBlock ) ;    // Split <br><br> in successive <pre>s. 
    669660                } 
    670661 
    671                 range.moveToBookmark( bookmark ); 
    672662        } 
    673663 
    674664        // Removes a style from an element itself, don't care about its subtree. 
     
    1000990 
    1001991        function applyStyle( document, remove ) 
    1002992        { 
    1003                 // Get all ranges from the selection. 
    1004                 var selection = document.getSelection(); 
    1005                 var ranges = selection.getRanges(); 
    1006                 var func = remove ? this.removeFromRange : this.applyToRange; 
     993                var selection = document.getSelection(), 
     994                        // Bookmark the range so we can re-select it after processing. 
     995                        bookmarks = selection.createBookmarks(), 
     996                        func = remove ? this.removeFromRange : this.applyToRange, 
     997                        range; 
    1007998 
    1008                 // Apply the style to the ranges. 
    1009                 for ( var i = 0 ; i < ranges.length ; i++ ) 
    1010                         func.call( this, ranges[ i ] ); 
     999                var iterator = selection.getRanges().createIterator(); 
     1000                while ( range = iterator.getNextRange() ) 
     1001                        func.call( this, range ); 
    10111002 
    1012                 // Select the ranges again. 
    1013                 selection.selectRanges( ranges ); 
     1003                selection.selectBookmarks( bookmarks ); 
    10141004        } 
    10151005})(); 
    10161006 
  • _source/plugins/enterkey/plugin.js

     
    312312                var ranges = editor.getSelection().getRanges(); 
    313313 
    314314                // Delete the contents of all ranges except the first one. 
    315                 for ( var i = ranges.length - 1 ; i > 0 ; i-- ) 
     315                for ( var i = ranges.count() - 1 ; i > 0 ; i-- ) 
    316316                { 
    317                         ranges[ i ].deleteContents(); 
     317                        ranges.getItem( i ).deleteContents(); 
    318318                } 
    319319 
    320320                // Return the first range. 
    321                 return ranges[ 0 ]; 
     321                return ranges.getItem( 0 ); 
    322322        } 
    323323})(); 
  • _source/plugins/justify/plugin.js

     
    7777                        var cssClassName = this.cssClassName, 
    7878                                iterator, 
    7979                                block; 
    80                         for ( var i = ranges.length - 1 ; i >= 0 ; i-- )  
     80                        for ( var i = ranges.count() - 1 ; i >= 0 ; i-- ) 
    8181                        { 
    82                                 iterator = ranges[ i ].createIterator(); 
     82                                iterator = ranges.getItem( i ).createIterator(); 
    8383                                while ( ( block = iterator.getNextParagraph() ) ) 
    8484                                { 
    8585                                        block.removeAttribute( 'align' ); 
  • _source/plugins/tabletools/plugin.js

     
    4141                        } 
    4242                } 
    4343 
    44                 for ( var i = 0 ; i < ranges.length ; i++ ) 
     44                for ( var i = 0 ; i < ranges.count() ; i++ ) 
    4545                { 
    46                         var range = ranges[ i ]; 
     46                        var range = ranges.getItem( i ); 
    4747 
    4848                        if ( range.collapsed ) 
    4949                        { 
     
    438438 
    439439                                                // Maintain the selection point at where the table was deleted. 
    440440                                                selection.selectElement( table ); 
    441                                                 var range = selection.getRanges()[0]; 
    442                                                 range.collapse(); 
    443                                                 selection.selectRanges( [ range ] ); 
     441                                                var ranges = selection.getRanges(); 
     442                                                ranges.getItem( 0 ).collapse(); 
     443                                                selection.selectRanges( ranges ); 
    444444 
    445445                                                // If the table's parent has only one child, remove it as well. 
    446446                                                if ( table.getParent().getChildCount() == 1 ) 
  • _source/plugins/selection/plugin.js

     
    537537                                                        boundaryInfo = getBoundaryInformation( nativeRange ); 
    538538                                                        range.setEnd( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset ); 
    539539 
    540                                                         return ( cache.ranges = [ range ] ); 
     540                                                        return ( cache.ranges = new CKEDITOR.dom.rangeList( range ) ); 
    541541                                                } 
    542542                                                else if ( type == CKEDITOR.SELECTION_ELEMENT ) 
    543543                                                { 
    544                                                         var retval = this._.cache.ranges = []; 
     544                                                        var retval = this._.cache.ranges = new CKEDITOR.dom.rangeList(); 
    545545 
    546546                                                        for ( var i = 0 ; i < nativeRange.length ; i++ ) 
    547547                                                        { 
     
    556556 
    557557                                                                range.setStart( new CKEDITOR.dom.node( parentElement ), j ); 
    558558                                                                range.setEnd( new CKEDITOR.dom.node( parentElement ), j + 1 ); 
    559                                                                 retval.push( range ); 
     559                                                                retval.add( range ); 
    560560                                                        } 
    561561 
    562562                                                        return retval; 
    563563                                                } 
    564564 
    565                                                 return ( cache.ranges = [] ); 
     565                                                return ( cache.ranges = new CKEDITOR.dom.rangeList() ); 
    566566                                        }; 
    567567                                })() 
    568568                        : 
     
    576576                                        // tranform the native ranges in CKEDITOR.dom.range 
    577577                                        // instances. 
    578578 
    579                                         var ranges = []; 
     579                                        var ranges = new CKEDITOR.dom.rangeList(); 
    580580                                        var sel = this.getNative(); 
    581581 
    582                                         if ( !sel ) 
    583                                                 return []; 
    584  
    585                                         for ( var i = 0 ; i < sel.rangeCount ; i++ ) 
    586                                         { 
    587                                                 var nativeRange = sel.getRangeAt( i ); 
    588                                                 var range = new CKEDITOR.dom.range( this.document ); 
     582                                        if( sel ) 
     583                                                for ( var i = 0 ; i < sel.rangeCount ; i++ ) 
     584                                                { 
     585                                                        var nativeRange = sel.getRangeAt( i ); 
     586                                                        var range = new CKEDITOR.dom.range( this.document ); 
    589587 
    590                                                 range.setStart( new CKEDITOR.dom.node( nativeRange.startContainer ), nativeRange.startOffset ); 
    591                                                 range.setEnd( new CKEDITOR.dom.node( nativeRange.endContainer ), nativeRange.endOffset ); 
    592                                                 ranges.push( range ); 
    593                                         } 
     588                                                        range.setStart( new CKEDITOR.dom.node( nativeRange.startContainer ), nativeRange.startOffset ); 
     589                                                        range.setEnd( new CKEDITOR.dom.node( nativeRange.endContainer ), nativeRange.endOffset ); 
     590                                                        ranges.add( range ); 
     591                                                } 
    594592 
    595593                                        return ( cache.ranges = ranges ); 
    596594                                }, 
     
    619617 
    620618                                case CKEDITOR.SELECTION_TEXT : 
    621619 
    622                                         var range = this.getRanges()[0]; 
     620                                        var range = this.getRanges().getItem( 0 ); 
    623621 
    624622                                        if ( range ) 
    625623                                        { 
     
    783781 
    784782                                this._.cache.selectedElement = element; 
    785783                                this._.cache.startElement = element; 
    786                                 this._.cache.ranges = [ range ]; 
     784                                this._.cache.ranges = new CKEDITOR.dom.rangeList( range ); 
    787785                                this._.cache.type = CKEDITOR.SELECTION_ELEMENT; 
    788786 
    789787                                return; 
     
    825823                        } 
    826824                }, 
    827825 
    828                 selectRanges : function( ranges ) 
     826                selectRanges : function( rangeList ) 
    829827                { 
    830828                        if ( this.isLocked ) 
    831829                        { 
    832830                                this._.cache.selectedElement = null; 
    833                                 this._.cache.startElement = ranges[ 0 ].getTouchedStartNode(); 
    834                                 this._.cache.ranges = ranges; 
     831                                this._.cache.startElement = rangeList.getItem( 0 ).getTouchedStartNode(); 
     832                                this._.cache.ranges = rangeList; 
    835833                                this._.cache.type = CKEDITOR.SELECTION_TEXT; 
    836834 
    837835                                return; 
     
    841839                        { 
    842840                                // IE doesn't accept multiple ranges selection, so we just 
    843841                                // select the first one. 
    844                                 if ( ranges[ 0 ] ) 
    845                                         ranges[ 0 ].select(); 
     842                                if ( rangeList.count() ) 
     843                                        rangeList.getItem( 0 ).select(); 
    846844 
    847845                                this.reset(); 
    848846                        } 
     
    851849                                var sel = this.getNative(); 
    852850                                sel.removeAllRanges(); 
    853851 
    854                                 for ( var i = 0 ; i < ranges.length ; i++ ) 
     852                                for ( var i = 0 ; i < rangeList.count() ; i++ ) 
    855853                                { 
    856                                         var range = ranges[ i ]; 
     854                                        var range = rangeList.getItem( i ); 
    857855                                        var nativeRange = this.document.$.createRange(); 
    858856                                        nativeRange.setStart( range.startContainer.$, range.startOffset ); 
    859857                                        nativeRange.setEnd( range.endContainer.$, range.endOffset ); 
     
    868866 
    869867                createBookmarks : function( serializable ) 
    870868                { 
    871                         var retval = [], 
    872                                 ranges = this.getRanges(), 
    873                                 length = ranges.length, 
    874                                 bookmark; 
    875                         for ( var i = 0; i < length ; i++ ) 
    876                         { 
    877                             retval.push( bookmark = ranges[ i ].createBookmark( serializable, true ) ); 
    878  
    879                                 var serializable = bookmark.serializable, 
    880                                         bookmarkStart = serializable ? 
    881                                                 this.document.getById( bookmark.startNode ) 
    882                                                 : bookmark.startNode, 
    883                                         bookmarkEnd = serializable ? 
    884                                           this.document.getById( bookmark.endNode ) 
    885                                           : bookmark.endNode; 
    886  
    887                             // Updating the offset values for rest of ranges which have been mangled(#3256). 
    888                             for ( var j = i + 1 ; j < length ; j++ ) 
    889                             { 
    890                                 var dirtyRange = ranges[ j ], 
    891                                        rangeStart = dirtyRange.startContainer, 
    892                                        rangeEnd = dirtyRange.endContainer; 
    893  
    894                                rangeStart.equals( bookmarkStart.getParent() ) && dirtyRange.startOffset++; 
    895                                rangeStart.equals( bookmarkEnd.getParent() ) && dirtyRange.startOffset++; 
    896                                rangeEnd.equals( bookmarkStart.getParent() ) && dirtyRange.endOffset++; 
    897                                rangeEnd.equals( bookmarkEnd.getParent() ) && dirtyRange.endOffset++; 
    898                             } 
    899                         } 
    900  
    901                         return retval; 
     869                        return this.getRanges().createBookmarks( serializable ); 
    902870                }, 
    903871 
    904872                createBookmarks2 : function( normalized ) 
    905873                { 
    906                         var bookmarks = [], 
    907                                 ranges = this.getRanges(); 
    908  
    909                         for ( var i = 0 ; i < ranges.length ; i++ ) 
    910                                 bookmarks.push( ranges[i].createBookmark2( normalized ) ); 
    911  
    912                         return bookmarks; 
     874                        return this.getRanges().createBookmarks2( normalized ); 
    913875                }, 
    914876 
    915877                selectBookmarks : function( bookmarks ) 
    916878                { 
    917                         var ranges = []; 
     879                        var ranges = new CKEDITOR.dom.rangeList(); 
    918880                        for ( var i = 0 ; i < bookmarks.length ; i++ ) 
    919881                        { 
    920882                                var range = new CKEDITOR.dom.range( this.document ); 
    921883                                range.moveToBookmark( bookmarks[i] ); 
    922                                 ranges.push( range ); 
     884                                ranges.add( range ); 
    923885                        } 
    924886                        this.selectRanges( ranges ); 
    925887                        return this; 
    926888                } 
     889 
    927890        }; 
     891 
    928892})(); 
    929893 
    930894CKEDITOR.dom.range.prototype.select = 
  • _source/plugins/blockquote/plugin.js

     
    4747                { 
    4848                        var state = editor.getCommand( 'blockquote' ).state, 
    4949                                selection = editor.getSelection(), 
    50                                 range = selection && selection.getRanges()[0]; 
     50                                ranges = selection && selection.getRanges(), 
     51                                range = ranges.count() && ranges.getItem( 0 ); 
    5152 
    5253                        if ( !range ) 
    5354                                return; 
  • _source/plugins/indent/plugin.js

     
    219219                exec : function( editor ) 
    220220                { 
    221221                        var selection = editor.getSelection(), 
    222                                 range = selection && selection.getRanges()[0]; 
     222                                range = selection && selection.getRanges().getItem( 0 ); 
    223223 
    224224                        if ( !selection || !range ) 
    225225                                return; 
  • _source/core/loader.js

     
    2324                // Table of script names and their dependencies. 
    2425                var scripts = 
    2526                { 
    26                         'core/_bootstrap'               : [ 'core/config', 'core/ckeditor', 'core/plugins', 'core/scriptloader', 'core/tools', /* The following are entries that we want to force loading at the end to avoid dependence recursion */ 'core/dom/elementpath', 'core/dom/text', 'core/dom/range' ], 
     27                        'core/_bootstrap'               : [ 'core/config', 'core/ckeditor', 'core/plugins', 'core/scriptloader', 'core/tools', /* The following are entries that we want to force loading at the end to avoid dependence recursion */ 'core/dom/elementpath', 'core/dom/text', 'core/dom/range', 'core/dom/rangelist' ], 
    2728                        'core/ajax'                             : [ 'core/xml' ], 
    2829                        'core/ckeditor'                 : [ 'core/ckeditor_basic', 'core/dom', 'core/dtd', 'core/dom/document', 'core/dom/element', 'core/editor', 'core/event', 'core/htmlparser', 'core/htmlparser/element', 'core/htmlparser/fragment', 'core/htmlparser/filter', 'core/htmlparser/basicwriter', 'core/tools' ], 
    2930                        'core/ckeditor_base'    : [], 
     
    4142                        'core/dom/domobject'    : [ 'core/dom/event' ], 
    4243                        'core/dom/domwalker'    : [ 'core/dom/node', 'core/dom/element', 'core/dom/document' ], 
    4344                        'core/dom/range'                : [ 'core/dom/document', 'core/dom/documentfragment', 'core/dom/element', 'core/dom/domwalker', 'core/dom/walker' ], 
     45                        'core/dom/rangelist'    : [ 'core/dom/range' ], 
    4446                        'core/dom/text'                 : [ 'core/dom/node', 'core/dom/domobject' ], 
    4547                        'core/dom/walker'               : [ 'core/dom/node' ], 
    4648                        'core/dom/window'               : [ 'core/dom/domobject' ], 
© 2003 – 2012 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy