Ticket #3475: 3475_5.patch

File 3475_5.patch, 9.4 KB (added by Garry Yao, 11 years ago)
  • _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;
    1007 
    1008                 // Apply the style to the ranges.
    1009                 for ( var i = 0 ; i < ranges.length ; i++ )
    1010                         func.call( this, ranges[ i ] );
    1011 
    1012                 // Select the ranges again.
    1013                 selection.selectRanges( ranges );
     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;
     998                var iterator = selection.getIterator();
     999                while ( range = iterator.getNextRange() )
     1000                        func.call( this, range );
     1001                selection.selectBookmarks( bookmarks );
    10141002        }
    10151003})();
    10161004
  • _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                        },
  • _source/tests/plugins/domiterator/domiterator.html

     
    8787                else
    8888                        range = containerIdOrRange;
    8989
    90                 var iter = range.createIterator();
     90                var iter = range.getIterator();
    9191                CKEDITOR.tools.extend( iter, iteratorOption, true );
    9292                var blockList = [], block;
    9393                while (( block = iter.getNextParagraph() ) )
  • _source/plugins/selection/plugin.js

     
    334334                a:1, input:1, form:1, select:1, textarea:1, button:1, fieldset:1, th:1, thead:1, tfoot:1
    335335        };
    336336
     337        function iterator( selection )
     338        {
     339                this.ranges = selection.getRanges();
     340                this.rangeCount = this.ranges.length;
     341        }
     342        iterator.prototype = {
     343                getNextRange : function()
     344                {
     345                        if ( !this.rangeCount )
     346                                return null;
     347                        else if ( typeof this.current != 'number' )
     348                                this.current = 0;
     349                        else if ( this.current < this.rangeCount - 1 )
     350                                this.current++;
     351                        else
     352                                return null;
     353
     354                        var currentRange = this.ranges[ this.current ];
     355
     356                        // Multiple ranges might be mangled by previous.
     357                        if ( this.rangeCount > 1 )
     358                        {
     359                                if ( !this.bookmarks )
     360                                        this.bookmarks = [];
     361
     362                                // Bookmarking all followings ranges on the first iteration.
     363                                if ( this.current == 0 ) {
     364                                        var following = this.ranges.slice( this.current + 1 );
     365                                        for ( var i = 0; i < following.length; i++ )
     366                                        {
     367                                                this.bookmarks.push( following[ i ].createBookmark() );
     368                                        }
     369                                }
     370                                // Update the current returning range.
     371                                else
     372                                        currentRange.moveToBookmark( this.bookmarks.shift() );
     373                        }
     374                        return currentRange;
     375                }
     376        };
     377
    337378        CKEDITOR.dom.selection.prototype =
    338379        {
    339380                /**
     
    887928                            // Updating the offset values for rest of ranges which have been mangled(#3256).
    888929                            for ( var j = i + 1 ; j < length ; j++ )
    889930                            {
    890                                 var dirtyRange = ranges[ j ],
    891                                        rangeStart = dirtyRange.startContainer,
    892                                        rangeEnd = dirtyRange.endContainer;
     931                                    var dirtyRange = ranges[ j ],
     932                                                    rangeStart = dirtyRange.startContainer,
     933                                                    rangeEnd = dirtyRange.endContainer;
     934                                    if ( rangeStart.equals( bookmarkStart.getPrevious() ) )
     935                                    {
     936                                            dirtyRange.startContainer = bookmarkEnd.getNext();
     937                                            dirtyRange.startOffset = dirtyRange.startOffset
     938                                                            - rangeStart.getLength() - bookmarkEnd.getPrevious().getLength();
     939                                    }
     940                                    else if ( rangeStart.equals( bookmarkEnd.getPrevious() ) )
     941                                    {
     942                                            dirtyRange.startContainer = bookmarkEnd.getNext();
     943                                            dirtyRange.startOffset = dirtyRange.startOffset - rangeStart.getLength();
     944                                    }
    893945
    894                                rangeStart.equals( bookmarkStart.getParent() ) && dirtyRange.startOffset++;
     946                                    if ( rangeEnd.equals( bookmarkStart.getPrevious() ) )
     947                                    {
     948                                            dirtyRange.endContainer = bookmarkEnd.getNext();
     949                                            dirtyRange.endOffset = dirtyRange.startOffset
     950                                                            - rangeEnd.getLength() - bookmarkEnd.getPrevious().getLength();
     951                                    }
     952                                    else if ( rangeEnd.equals( bookmarkEnd.getPrevious() ) )
     953                                    {
     954                                            dirtyRange.endOffset = dirtyRange.startOffset - rangeEnd.getLength();
     955                                            dirtyRange.endContainer = bookmarkEnd.getNext();
     956                                    }
     957
     958                                   rangeStart.equals( bookmarkStart.getParent() ) && dirtyRange.startOffset++;
    895959                               rangeStart.equals( bookmarkEnd.getParent() ) && dirtyRange.startOffset++;
    896960                               rangeEnd.equals( bookmarkStart.getParent() ) && dirtyRange.endOffset++;
    897961                               rangeEnd.equals( bookmarkEnd.getParent() ) && dirtyRange.endOffset++;
     
    923987                        }
    924988                        this.selectRanges( ranges );
    925989                        return this;
     990                },
     991
     992                getIterator : function()
     993                {
     994                        return new iterator( this );
    926995                }
    927996        };
     997
    928998})();
    929999
    9301000CKEDITOR.dom.range.prototype.select =
  • _source/tests/plugins/selection/selection.html

     
    3636                        assert.areSame( 0, $range.compareEndPoints( 'EndToEnd', $range2 ), 'EndToEnd' );
    3737                },
    3838
     39                // Testing create bookmarks when two neighbour ranges share the same text node.
     40                test_createBookmarks_3475 :function()
     41                {
     42                        var sel = doc.getSelection();
     43                        var range1 = new CKEDITOR.dom.range();
     44                        range1.setStart( doc.getById( '_P1' ).getFirst(), 8 );
     45                        range1.setEnd( doc.getById( '_B1' ).getFirst(), 2 );
     46                       
     47                        var range2 = new CKEDITOR.dom.range();
     48                        range2.setStart( doc.getById( '_B1' ).getFirst(), 7 );
     49                        range2.setEnd( doc.getById( '_P1' ).getChildren().getItem( 2 ), 5 );
     50
     51                        // <p id="_P1">This is [some <strong id="_B1">sa]mple [text</strong>. You] are using</p>
     52                        sel.selectRanges( [ range1, range2 ] );
     53                        var bookmarks = sel.createBookmarks();
     54                        var range3 = new CKEDITOR.dom.range();
     55                        range3.moveToBookmark( bookmarks[ 0 ] );
     56
     57                        var range4 = new CKEDITOR.dom.range();
     58                        range4.moveToBookmark( bookmarks[ 1 ] );
     59                        assert.areEqual( doc.getById( '_P1' ).$, range3.startContainer.$ );
     60                        assert.areEqual( 1, range3.startOffset );
     61                        assert.areEqual( doc.getById( '_B1' ).$, range3.endContainer.$ );
     62                        assert.areEqual( 1, range3.endOffset );
     63
     64                        assert.areEqual( doc.getById( '_B1' ).$, range4.startContainer.$ );
     65                        assert.areEqual( 2, range4.startOffset );
     66                        assert.areEqual( doc.getById( '_P1' ).$, range4.endContainer.$ );
     67                        assert.areEqual( 4, range4.endOffset );
     68                },
     69               
    3970                name : document.title
    4071        };
    4172})());
     
    4374        </script>
    4475</head>
    4576<body>
    46         <p>
    47                 This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">CKEditor</a>.</p>
     77<p>
     78        This is some <strong>sample text</strong>. You are using <a href="http://www.fckeditor.net/">CKEditor</a>.</p>
     79        <p id="_P1">This is some <strong id="_B1">sample text</strong>. You are using</p>
    4880</body>
    4981</html>
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy