Ticket #4830: 4830_2.patch

File 4830_2.patch, 5.6 KB (added by Garry Yao, 9 years ago)
  • _source/plugins/selection/plugin.js

     
    730730                        if ( cache.selectedElement !== undefined )
    731731                                return cache.selectedElement;
    732732
    733                         var node;
     733                        var self = this;
    734734
    735                         if ( this.getType() == CKEDITOR.SELECTION_ELEMENT )
    736                         {
    737                                 var sel = this.getNative();
     735                        var node = CKEDITOR.tools.tryThese(
     736                                // Is it native IE control type selection?
     737                                function()
     738                                {
     739                                        return self.getNative().createRange().item( 0 );
     740                                },
     741                                // Figure it out by checking if there's a single enclosed
     742                                // node of the range.
     743                                function()
     744                                {
     745                                        var range  = self.getRanges()[ 0 ];
     746                                        range.shrink( CKEDITOR.SHRINK_ELEMENT );
    738747
    739                                 if ( CKEDITOR.env.ie )
    740                                 {
    741                                         try
    742                                         {
    743                                                 node = sel.createRange().item(0);
     748                                        var enclosed;
     749                                        if ( range.startContainer.equals( range.endContainer )
     750                                                && ( range.endOffset - range.startOffset ) == 1
     751                                                && styleObjectElements[ ( enclosed = range.startContainer.getChild( range.startOffset ) ).getName() ] )
     752                                        {
     753                                                return enclosed.$;
    744754                                        }
    745                                         catch(e) {}
    746                                 }
    747                                 else
    748                                 {
    749                                         var range = sel.getRangeAt( 0 );
    750                                         node = range.startContainer.childNodes[ range.startOffset ];
    751                                 }
    752                         }
    753 
     755                                        else
     756                                                throw '';
     757                                });
     758                       
    754759                        return cache.selectedElement = ( node ? new CKEDITOR.dom.element( node ) : null );
    755760                },
    756761
  • _source/core/dom/range.js

     
    12361236                },
    12371237
    12381238                /**
     1239                 *  Descrease the range to make sure that boundaries
     1240                 *  always anchor beside text nodes or innermost element.
     1241                 * @param {Number} mode  ( CKEDITOR.SHRINK_ELEMENT | CKEDITOR.SHRINK_TEXT ) The shrinking mode.
     1242                 */
     1243                shrink : function( mode )
     1244                {
     1245                        // Unable to shrink a collapsed range.
     1246                        if ( !this.collapsed )
     1247                        {
     1248                                mode = mode || CKEDITOR.SHRINK_TEXT;
     1249
     1250                                var walkerRange = this.clone();
     1251
     1252                                var startContainer = this.startContainer,
     1253                                        endContainer = this.endContainer,
     1254                                        startOffset = this.startOffset,
     1255                                        endOffset = this.endOffset,
     1256                                        collapsed = this.collapsed;
     1257
     1258                                // Whether the start/end boundary is moveable.
     1259                                var moveStart = 1,
     1260                                                moveEnd = 1;
     1261
     1262                                if ( startContainer && startContainer.type == CKEDITOR.NODE_TEXT )
     1263                                {
     1264                                        if ( !startOffset )
     1265                                                walkerRange.setStartBefore( startContainer );
     1266                                        else if ( startOffset >= startContainer.getLength( ) )
     1267                                                walkerRange.setStartAfter( startContainer );
     1268                                        else
     1269                                        {
     1270                                                // Enlarge the range properly to avoid walker making
     1271                                                // DOM changes caused by triming the text nodes later.
     1272                                                walkerRange.setStartBefore( startContainer );
     1273                                                moveStart = 0;
     1274                                        }
     1275                                }
     1276                               
     1277                                if ( endContainer && endContainer.type == CKEDITOR.NODE_TEXT )
     1278                                {
     1279                                        if ( !endOffset )
     1280                                                walkerRange.setEndBefore( endContainer );
     1281                                        else if ( endOffset >= endContainer.getLength( ) )
     1282                                                walkerRange.setEndAfter( endContainer );
     1283                                        else
     1284                                        {
     1285                                                walkerRange.setEndAfter( endContainer );
     1286                                                moveEnd = 0;
     1287                                        }
     1288                                }
     1289
     1290                                var walker = new CKEDITOR.dom.walker( walkerRange );
     1291
     1292                                walker.evaluator = function( node )
     1293                                {
     1294                                        return node.type == ( mode == CKEDITOR.SHRINK_ELEMENT ?
     1295                                                CKEDITOR.NODE_ELEMENT : CKEDITOR.NODE_TEXT );
     1296                                };
     1297
     1298                                var currentElement;
     1299                                walker.guard = function( node, movingOut )
     1300                                {
     1301                                        // Stop when we're shrink in element mode while encountering a text node.
     1302                                        if ( mode == CKEDITOR.SHRINK_ELEMENT && node.type == CKEDITOR.NODE_TEXT )
     1303                                                return false;
     1304
     1305                                        // Stop when we've already walked "through" an element.
     1306                                        if ( movingOut && node.equals( currentElement ) )
     1307                                                return false;
     1308
     1309                                        if ( !movingOut && node.type == CKEDITOR.NODE_ELEMENT )
     1310                                                currentElement = node;
     1311                                };
     1312
     1313                                if ( moveStart )
     1314                                {
     1315                                        var textStart = walker[ mode == CKEDITOR.SHRINK_ELEMENT ? 'lastForward' : 'next']();
     1316                                        textStart && this.setStartBefore( textStart );
     1317                                }
     1318
     1319                                if ( moveEnd )
     1320                                {
     1321                                        walker.reset();
     1322                                        var textEnd = walker[ mode == CKEDITOR.SHRINK_ELEMENT ? 'lastBackward' : 'previous']();
     1323                                        textEnd && this.setEndAfter( textEnd );
     1324                                }
     1325
     1326                                return !!( moveStart || moveEnd );
     1327                        }
     1328                },
     1329
     1330                /**
    12391331                 * Inserts a node at the start of the range. The range will be expanded
    12401332                 * the contain the node.
    12411333                 */
     
    17331825CKEDITOR.START = 1;
    17341826CKEDITOR.END = 2;
    17351827CKEDITOR.STARTEND = 3;
     1828
     1829CKEDITOR.SHRINK_ELEMENT = 1;
     1830CKEDITOR.SHRINK_TEXT = 2;
     1831
  • _source/core/dom/walker.js

     
    101101                                                node = null;
    102102                                }
    103103                                else
    104                                         node = ( guard ( node ) === false ) ?
     104                                        node = ( guard ( node, true ) === false ) ?
    105105                                                null : node.getPreviousSourceNode( true, type, guard );
    106106                        }
    107107                        else
     
    115115                                                node = null;
    116116                                }
    117117                                else
    118                                         node = ( guard ( range.startContainer ) === false ) ?
     118                                        node = ( guard ( range.startContainer, true ) === false ) ?
    119119                                                null : range.startContainer.getNextSourceNode( true, type, guard ) ;
    120120                        }
    121121                }
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy