Ticket #3475: 3475_7.patch

File 3475_7.patch, 35.8 KB (added by garry.yao, 6 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 – 2015 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy