Ticket #6706: 6706.patch

File 6706.patch, 3.8 KB (added by Garry Yao, 8 years ago)
  • _source/plugins/selection/plugin.js

     
    8484                if ( start.type == CKEDITOR.NODE_TEXT )
    8585                        return false;
    8686
     87                // Empty inline at the start of block. (#6706)
     88                if ( CKEDITOR.env.ie )
     89                        return !CKEDITOR.tools.trim( start.getHtml() ) && isInlineCt( start ) && range.checkStartOfBlock();
    8790                // 1. Empty inline element. <span>^</span>
    8891                // 2. Adjoin to inline element. <p><strong>text</strong>^</p>
    89                 return !CKEDITOR.tools.trim( start.getHtml() ) ? isInlineCt( start ) : isInlineCt( start.getChild( offset - 1 ) ) || isInlineCt( start.getChild( offset ) );
     92                else if ( CKEDITOR.env.webkit )
     93                        return !CKEDITOR.tools.trim( start.getHtml() ) ? isInlineCt( start ) : isInlineCt( start.getChild( offset - 1 ) ) || isInlineCt( start.getChild( offset ) );
     94
    9095        }
    9196
    9297        var selectAllCmd =
     
    162167                }
    163168        }
    164169
     170        function introduceFillingChar( range )
     171        {
     172                // Append a zero-width space so WebKit will not try to
     173                // move the selection by itself (#1272).
     174                var fillingChar = createFillingChar( range.document );
     175                range.insertNode( fillingChar );
     176
     177                var next = fillingChar.getNext();
     178
     179                // If the filling char is followed by a <br>, whithout
     180                // having something before it, it'll not blink.
     181                // Let's remove it in this case.
     182                if ( next && !fillingChar.getPrevious() && next.type == CKEDITOR.NODE_ELEMENT && next.getName() == 'br' )
     183                {
     184                        removeFillingChar( range.document );
     185                        range.moveToPosition( next, CKEDITOR.POSITION_BEFORE_START );
     186                }
     187                else
     188                        range.moveToPosition( fillingChar, CKEDITOR.POSITION_AFTER_END );
     189        }
     190
    165191        CKEDITOR.plugins.add( 'selection',
    166192        {
    167193                init : function( editor )
    168194                {
    169                         // On WebKit only, we need a special "filling" char on some situations
    170                         // (#1272). Here we set the events that should invalidate that char.
    171                         if ( CKEDITOR.env.webkit )
     195                        // We need a special "filling char" in some situations to make the cursor blink on collapsed selection (#1272) (#6706).
     196                        // Here we set the events that invalidate that char.
     197                        if ( CKEDITOR.env.webkit || CKEDITOR.env.ie )
    172198                        {
    173199                                editor.on( 'selectionChange', function() { checkFillingChar( editor.document ); } );
    174200                                editor.on( 'beforeSetMode', function() { removeFillingChar( editor.document ); } );
     
    12701296                                        ranges[ 0 ].setEnd( last.endContainer, last.endOffset );
    12711297                                        ranges.length = 1;
    12721298                                }
     1299                                var range = ranges[ 0 ];
    12731300
    1274                                 if ( ranges[ 0 ] )
    1275                                         ranges[ 0 ].select();
     1301                                if ( range )
     1302                                {
     1303                                        removeFillingChar( this.document );
     1304                                        if ( range.collapsed && rangeRequiresFix( range ) )
     1305                                                introduceFillingChar( range );
    12761306
     1307                                        range.select();
     1308                                }
     1309
    12771310                                this.reset();
    12781311                        }
    12791312                        else
     
    13431376                                                        && CKEDITOR.env.webkit
    13441377                                                        && rangeRequiresFix( range ) )
    13451378                                        {
    1346                                                 // Append a zero-width space so WebKit will not try to
    1347                                                 // move the selection by itself (#1272).
    1348                                                 var fillingChar = createFillingChar( this.document );
    1349                                                 range.insertNode( fillingChar ) ;
    1350 
    1351                                                 var next = fillingChar.getNext();
    1352 
    1353                                                 // If the filling char is followed by a <br>, whithout
    1354                                                 // having something before it, it'll not blink.
    1355                                                 // Let's remove it in this case.
    1356                                                 if ( next && !fillingChar.getPrevious() && next.type == CKEDITOR.NODE_ELEMENT && next.getName() == 'br' )
    1357                                                 {
    1358                                                         removeFillingChar( this.document );
    1359                                                         range.moveToPosition( next, CKEDITOR.POSITION_BEFORE_START );
    1360                                                 }
    1361                                                 else
    1362                                                         range.moveToPosition( fillingChar, CKEDITOR.POSITION_AFTER_END );
    1363                                         }
     1379                                                introduceFillingChar( range );
     1380                                        }
    13641381
    13651382                                        nativeRange.setStart( range.startContainer.$, range.startOffset );
    13661383
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy