Ticket #8248: 8248.patch

File 8248.patch, 3.1 KB (added by Garry Yao, 8 years ago)
  • _source/plugins/list/plugin.js

    IDEA additional info:
    Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
    <+>UTF-8
     
    729729        for ( i in dtd.$listItem )
    730730                defaultListHtmlFilterRules.elements[ i ] = getExtendNestedListFilter( true );
    731731
     732        function isTextBlock( node )
     733        {
     734                return node.type == CKEDITOR.NODE_ELEMENT &&
     735                           ( node.getName() in CKEDITOR.dtd.$block ||
     736                                 node.getName() in CKEDITOR.dtd.$listItem ) &&
     737                           CKEDITOR.dtd[ node.getName() ][ '#' ];
     738        }
     739
    732740        CKEDITOR.plugins.add( 'list',
    733741        {
    734742                init : function( editor )
     
    752760                        // Register the state changing handlers.
    753761                        editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, numberedListCommand ) );
    754762                        editor.on( 'selectionChange', CKEDITOR.tools.bind( onSelectionChange, bulletedListCommand ) );
     763
     764                        // [IE8] Fix backspace right after the list. (#8248)
     765                        if ( CKEDITOR.env.ie8Compat )
     766                        {
     767                                editor.on( 'key', function( evt )
     768                                {
     769                                        if ( editor.mode == 'wysiwyg' && evt.data.keyCode == 8 )
     770                                        {
     771                                                var sel = editor.getSelection(),
     772                                                range = sel.getRanges()[ 0 ];
     773
     774                                                var walkerRange = new CKEDITOR.dom.range( editor.document );
     775                                                var body = editor.document.getBody();
     776                                                walkerRange.setStartAt( body,
     777                                                                                                CKEDITOR.POSITION_AFTER_START );
     778                                                walkerRange.setEnd( range.startContainer,
     779                                                                                        range.startOffset );
     780
     781                                                var walker = new CKEDITOR.dom.walker( walkerRange );
     782                                                walker.evaluator = nonEmpty;
     783
     784                                                var previous = walker.previous();
     785
     786                                                // Check if cursor collapsed right behind of a list.
     787                                                if ( range.collapsed &&
     788                                                         previous &&
     789                                                         previous.type == CKEDITOR.NODE_ELEMENT &&
     790                                                         previous.getName() in listNodeNames )
     791                                                {
     792                                                        walkerRange.selectNodeContents( previous );
     793                                                        walker.reset();
     794                                                        walker.evaluator = isTextBlock;
     795                                                        var previousBlock = walker.lastForward();
     796
     797                                                        // Place cursor at the end of previous block.
     798                                                        var cursor = new CKEDITOR.dom.range( editor.document );
     799                                                        cursor.moveToElementEditEnd( previousBlock );
     800
     801                                                        // Merge with previous block's content.
     802                                                        range.enlarge( CKEDITOR.ENLARGE_LIST_ITEM_CONTENTS );
     803                                                        var frag = range.extractContents();
     804
     805                                                        // Kill the tail br in extracted.
     806                                                        var last = frag.getLast();
     807                                                        if ( last.type == CKEDITOR.NODE_ELEMENT && last.is( 'br' ) )
     808                                                                last.remove();
     809
     810                                                        // Kill original bogus;
     811                                                        var bogus = previousBlock.getBogus();
     812                                                        bogus && bogus.remove();
     813
     814                                                        previousBlock.append( frag );
     815
     816                                                        // Remove the original path block if needed.
     817                                                        if ( range.checkStartOfBlock() &&
     818                                                                 range.checkEndOfBlock() )
     819                                                        {
     820                                                                var path = new CKEDITOR.dom.elementPath( range.startContainer );
     821                                                                path.block.remove();
     822                                                        }
     823
     824                                                        // Make fresh selection.
     825                                                        cursor.select();
     826                                                        evt.cancel();
     827                                                }
     828                                        }
     829                                } );
     830
     831                        }
    755832                },
    756833
    757834                afterInit : function ( editor )
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy