Ticket #3001: 3001_3.patch

File 3001_3.patch, 46.8 KB (added by Frederico Caldeira Knabben, 11 years ago)
  • _source/core/command.js

     
    1010                if ( this.state == CKEDITOR.TRISTATE_DISABLED )
    1111                        return false;
    1212
     13                // The editor will always have the focus when executing a command.
     14                editor.focus();
     15
    1316                return ( commandDefinition.exec.call( this, editor, data ) !== false );
    1417        };
    1518
  • _source/core/dom/document.js

     
    7373                        return new CKEDITOR.dom.text( text, this );
    7474                },
    7575
     76                focus : function()
     77                {
     78                        this.getWindow().focus();
     79                },
     80
    7681                /**
    7782                 * Gets and element based on its id.
    7883                 * @param {String} elementId The element id.
  • _source/plugins/clipboard/dialogs/paste.js

     
    9090                        var re = new RegExp( window.location + "#", 'g' );
    9191                        html = html.replace( re, '#');
    9292
    93                         this.restoreSelection();
    94                         this.clearSavedSelection();
    95 
    9693                        this.getParentEditor().insertHtml( html );
    9794                },
    9895
  • _source/plugins/colorbutton/plugin.js

     
    1212                var config = editor.config,
    1313                        lang = editor.lang.colorButton;
    1414
    15                 var saveRanges;
     15                var clickFn;
    1616
    1717                addButton( 'TextColor', 'fore', lang.textColorTitle );
    1818                addButton( 'BGColor', 'back', lang.bgColorTitle );
     
    4343                                                keys[ 37 ]      = 'prev';                                       // ARROW-LEFT
    4444                                                keys[ CKEDITOR.SHIFT + 9 ]      = 'prev';       // SHIFT + TAB
    4545                                                keys[ 32 ]      = 'click';                                      // SPACE
    46                                         },
    47 
    48                                         onOpen : function()
    49                                         {
    50                                                 if ( CKEDITOR.env.ie )
    51                                                 {
    52                                                         editor.focus();
    53                                                         saveRanges = editor.getSelection().getRanges();
    54                                                 }
    55                                         },
    56 
    57                                         onClose : function()
    58                                         {
    59                                                 saveRanges = null;
    6046                                        }
    6147                                });
    6248                }
     
    7864
    7965                                        editor.focus();
    8066
    81                                         if ( saveRanges )
    82                                         {
    83                                                 editor.getSelection().selectRanges( saveRanges );
    84                                                 saveRanges = false;
    85                                         }
    86 
    8767                                        panel.hide();
    8868
    8969                                        var style = new CKEDITOR.style( config['colorButton_' + type + 'Style'], { color : color || '#000' } );
  • _source/plugins/contextmenu/plugin.js

     
    5151                        }
    5252                        else
    5353                        {
     54                                var unlockFn = function()
     55                                        {
     56                                                editor.getSelection().unlock();
     57                                        };
     58
    5459                                menu = this._.menu = new CKEDITOR.menu( editor );
    5560                                menu.onClick = CKEDITOR.tools.bind( function( item )
    5661                                {
     62                                        menu.onHide = null;
     63
     64                                        noUnlock = true;
    5765                                        menu.hide();
    58                                         editor.focus();
    5966
     67                                        if ( CKEDITOR.env.ie )
     68                                                menu.onEscape();
     69
    6070                                        if ( item.onClick )
    6171                                                item.onClick();
    6272                                        else if ( item.command )
    63                                         {
    64                                                 if ( CKEDITOR.env.ie )
    65                                                         this.restoreSelection();
    66 
    6773                                                editor.execCommand( item.command );
    68                                         }
     74
     75                                        noUnlock = false;
    6976                                }, this );
    7077
    7178                                menu.onEscape = function()
    7279                                {
    7380                                        editor.focus();
     81
     82                                        if ( CKEDITOR.env.ie )
     83                                                editor.getSelection().unlock( true );
    7484                                };
    7585                        }
    7686
     
    8090                        var selection = this.editor.getSelection(),
    8191                                element = selection && selection.getStartElement();
    8292
     93                        // Lock the selection in IE, so it can be restored when closing the
     94                        // menu.
     95                        if ( CKEDITOR.env.ie )
     96                        {
     97                                selection.lock();
     98                                menu.onHide = unlockFn;
     99                        }
     100
    83101                        // Call all listeners, filling the list of items to be displayed.
    84102                        for ( var i = 0 ; i < listeners.length ; i++ )
    85103                        {
     
    100118                                }
    101119                        }
    102120
    103                         if ( CKEDITOR.env.ie )
    104                                 this.saveSelection();
    105 
    106121                        menu.show( offsetParent, editor.lang.dir == 'rtl' ? 2 : 1, offsetX, offsetY );
    107122                }
    108123        },
     
    140155                {
    141156                        this.editor.focus();
    142157                        this._.onMenu( CKEDITOR.document.getDocumentElement(), 0, 0 );
    143                 },
    144 
    145                 /**
    146                  * Saves the current selection position in the editor.
    147                  */
    148                 saveSelection : function()
    149                 {
    150                         if ( this.editor.mode == 'wysiwyg' )
    151                         {
    152                                 this.editor.focus();
    153 
    154                                 var selection = new CKEDITOR.dom.selection( this.editor.document );
    155                                 this._.selectedRanges = selection.getRanges();
    156                         }
    157                         else
    158                                 delete this._.selectedRanges;
    159                 },
    160 
    161                 /**
    162                  * Restores the editor's selection from the previously saved position in this
    163                  * dialog.
    164                  */
    165                 restoreSelection : function()
    166                 {
    167                         if ( this.editor.mode == 'wysiwyg' && this._.selectedRanges )
    168                         {
    169                                 this.editor.focus();
    170                                 ( new CKEDITOR.dom.selection( this.editor.document ) ).selectRanges( this._.selectedRanges );
    171                         }
    172158                }
    173159        }
    174160});
  • _source/plugins/dialog/plugin.js

     
    527527                 */
    528528                show : function()
    529529                {
     530                        if ( CKEDITOR.env.ie )
     531                                this._.editor.getSelection().lock();
     532
    530533                        // Insert the dialog's element to the root document.
    531534                        var element = this._.element;
    532535                        var definition = this.definition;
     
    579582                                                this.getButton( 'cancel' ) && this.getButton( 'cancel' ).click();
    580583                                        } );
    581584
    582                         // Save editor selection and grab the focus.
    583                         if ( !this._.parentDialog )
    584                                 this.saveSelection();
    585 
    586585                        // Reset the hasFocus state.
    587586                        this._.hasFocus = false;
    588587
     
    678677                                CKEDITOR.document.removeListener( 'keydown', accessKeyDownHandler );
    679678                                CKEDITOR.document.removeListener( 'keyup', accessKeyUpHandler );
    680679
    681                                 // Restore focus and (if not already restored) selection in the editing area.
    682                                 this.restoreSelection();
    683                                 this._.editor.focus();
     680                                var editor = this._.editor;
     681                                editor.focus();
     682
     683                                if ( CKEDITOR.env.ie )
     684                                        editor.getSelection().unlock( true );
    684685                        }
    685686                        else
    686687                                CKEDITOR.dialog._.currentZIndex -= 10;
     
    927928                },
    928929
    929930                /**
    930                  * Saves the current selection position in the editor.
    931                  * This function is automatically called when a non-nested dialog is opened,
    932                  * but it may also be called by event handlers in dialog definition.
    933                  * @example
     931                 * Gets the element that was selected when opening the dialog, if any.
     932                 * @returns {CKEDITOR.dom.element} The element that was selected, or null.
    934933                 */
    935                 saveSelection : function()
    936                 {
    937                         if ( this._.editor.mode )
    938                         {
    939                                 this._.editor.focus();
    940 
    941                                 var selection = new CKEDITOR.dom.selection( this._.editor.document );
    942                                 this._.selectedRanges = selection.getRanges();
    943                                 this._.selectedElement = selection.getSelectedElement();
    944                         }
    945                 },
    946 
    947                 /**
    948                  * Clears the saved selection in the dialog object.
    949                  * This function should be called if the dialog's code has already changed the
    950                  * current selection position because the dialog closed. (e.g. at onOk())
    951                  * @example
    952                  */
    953                 clearSavedSelection : function()
    954                 {
    955                         delete this._.selectedRanges;
    956                         delete this._.selectedElement;
    957                 },
    958 
    959                 /**
    960                  * Gets the saved control selection. Control selections should be retrieved
    961                  * with this function instead of from restoreSelection() because
    962                  * restoreSelection() does not properly restore control selections.
    963                  * @returns {CKEDITOR.dom.element} The element that was selected.
    964                  * @example
    965                  */
    966934                getSelectedElement : function()
    967935                {
    968                         return this._.selectedElement;
    969                 },
    970 
    971                 /**
    972                  * Restores the editor's selection from the previously saved position in this
    973                  * dialog.
    974                  * This function is automatically called when a non-nested dialog is closed,
    975                  * but it may also be called by event handlers in dialog definition.
    976                  * @example
    977                  */
    978                 restoreSelection : function()
    979                 {
    980                         if ( this._.editor.mode && this._.selectedRanges )
    981                                 ( new CKEDITOR.dom.selection( this._.editor.document ) ).selectRanges( this._.selectedRanges );
     936                        return this.getParentEditor().getSelection().getSelectedElement();
    982937                }
    983938        };
    984939
  • _source/plugins/find/dialogs/find.js

     
    535535                 */
    536536                function getStartCursor()
    537537                {
    538                         if ( CKEDITOR.env.ie )
    539                                 this.restoreSelection();
    540 
    541538                        var sel = editor.getSelection();
    542539                        if ( sel )
    543540                        {
     
    798795                                if ( finder.range && finder.range.isMatched() )
    799796                                {
    800797                                        finder.range.removeHighlight();
     798                                        editor.focus();
    801799                                        editor.getSelection().selectRanges(
    802800                                                [ finder.range.toDomRange() ] );
    803801                                }
  • _source/plugins/flash/dialogs/flash.js

     
    279279                                if ( this.fakeImage )
    280280                                        newFakeImage.replace( this.fakeImage );
    281281                                else
    282                                 {
    283                                         this.restoreSelection();
    284282                                        editor.insertElement( newFakeImage );
    285                                 }
    286283                        },
    287284                       
    288285                        onHide : function()
  • _source/plugins/font/plugin.js

     
    88        function addCombo( editor, comboName, styleType, lang, entries, defaultLabel, styleDefinition )
    99        {
    1010                var config = editor.config;
    11                 var saveRanges;
    1211
    1312                // Gets the list of fonts from the settings.
    1413                var names = entries.split( ';' ),
     
    5655                                {
    5756                                        editor.focus();
    5857
    59                                         if ( saveRanges )
    60                                         {
    61                                                 editor.getSelection().selectRanges( saveRanges );
    62                                                 saveRanges = false;
    63                                         }
    64 
    6558                                        var style = styles[ value ];
    6659
    6760                                        if ( this.getValue() == value )
     
    10194                                                        this.setValue( '', defaultLabel );
    10295                                                },
    10396                                                this);
    104                                 },
    105 
    106                                 onOpen : function()
    107                                 {
    108                                         if ( CKEDITOR.env.ie )
    109                                         {
    110                                                 editor.focus();
    111                                                 saveRanges = editor.getSelection().getRanges();
    112                                         }
    113                                 },
    114 
    115                                 onClose : function()
    116                                 {
    117                                         saveRanges = null;
    11897                                }
    11998                        });
    12099        }
  • _source/plugins/format/plugin.js

     
    1212                var config = editor.config,
    1313                        lang = editor.lang.format;
    1414
    15                 var saveRanges;
    16 
    1715                // Gets the list of tags from the settings.
    1816                var tags = config.format_tags.split( ';' );
    1917
     
    5351                                onClick : function( value )
    5452                                {
    5553                                        editor.focus();
    56 
    57                                         if ( saveRanges )
    58                                         {
    59                                                 editor.getSelection().selectRanges( saveRanges );
    60                                                 saveRanges = false;
    61                                         }
    62 
    6354                                        styles[ value ].apply( editor.document );
    6455                                },
    6556
     
    8576                                                        this.setValue( '' );
    8677                                                },
    8778                                                this);
    88                                 },
    89 
    90                                 onOpen : function()
    91                                 {
    92                                         if ( CKEDITOR.env.ie )
    93                                         {
    94                                                 editor.focus();
    95                                                 saveRanges = editor.getSelection().getRanges();
    96                                         }
    97                                 },
    98 
    99                                 onClose : function()
    100                                 {
    101                                         saveRanges = null;
    10279                                }
    10380                        });
    10481        }
  • _source/plugins/forms/dialogs/button.js

     
    1010                minHeight : 140,
    1111                onShow : function()
    1212                {
    13                         // IE BUG: Selection must be in the editor for getSelectedElement()
    14                         // to work.
    15                         this.restoreSelection();
    16 
    1713                        var element = this.getParentEditor().getSelection().getSelectedElement();
    1814                        if ( element && element.getName() == "input" )
    1915                        {
     
    3935                        this.commitContent( element );
    4036
    4137                        if ( isInsertMode )
    42                         {
    43                                 this.restoreSelection();
    44                                 this.clearSavedSelection();
    4538                                editor.insertElement( element );
    46                         }
    4739                },
    4840                contents : [
    4941                        {
  • _source/plugins/forms/dialogs/checkbox.js

     
    1010                minHeight : 140,
    1111                onShow : function()
    1212                {
    13                         // IE BUG: Selection must be in the editor for getSelectedElement()
    14                         // to work.
    15                         this.restoreSelection();
    16 
    1713                        var element = this.getParentEditor().getSelection().getSelectedElement();
    1814
    1915                        if ( element && element.getAttribute( 'type' ) == "checkbox" )
     
    3834                        this.commitContent( element );
    3935
    4036                        if ( isInsertMode )
    41                         {
    42                                 this.restoreSelection();
    43                                 this.clearSavedSelection();
    4437                                editor.insertElement( element );
    45                         }
    4638                },
    4739                contents : [
    4840                        {
     
    6052                                                setup : function( element )
    6153                                                {
    6254                                                        this.setValue( element.getAttribute( 'name' ) );
    63                                                         this.focus();
    6455                                                },
    6556                                                commit : function( element )
    6657                                                {
  • _source/plugins/forms/dialogs/form.js

     
    1010                minHeight : 190,
    1111                onShow : function()
    1212                {
    13                         // IE BUG: Selection must be in the editor for getSelectedElement()
    14                         // to work.
    15                         this.restoreSelection();
    16 
    1713                        var element = this.getParentEditor().getSelection().getSelectedElement();
    1814                        if ( element && element.getName() == "form" )
    1915                        {
     
    3632                        this.commitContent( element );
    3733
    3834                        if ( isInsertMode )
    39                         {
    40                                 this.restoreSelection();
    41                                 this.clearSavedSelection();
    4235                                editor.insertElement( element );
    43                         }
    4436                },
    4537                contents : [
    4638                        {
  • _source/plugins/forms/dialogs/hiddenfield.js

     
    1010                minHeight : 110,
    1111                onShow : function()
    1212                {
    13                         // IE BUG: Selection must be in the editor for getSelectedElement()
    14                         // to work.
    15                         this.restoreSelection();
    16 
    1713                        var element = this.getParentEditor().getSelection().getSelectedElement();
    1814                        if ( element && element.getName() == "input" && element.getAttribute( 'type' ) == "checkbox" )
    1915                        {
     
    3632                        this.commitContent( element );
    3733
    3834                        if ( isInsertMode )
    39                         {
    40                                 this.restoreSelection();
    41                                 this.clearSavedSelection();
    4235                                editor.insertElement( element );
    43                         }
    4436                },
    4537                contents : [
    4638                        {
  • _source/plugins/forms/dialogs/radio.js

     
    1010                minHeight : 130,
    1111                onShow : function()
    1212                {
    13                         // IE BUG: Selection must be in the editor for getSelectedElement()
    14                         // to work.
    15                         this.restoreSelection();
    16 
    1713                        var element = this.getParentEditor().getSelection().getSelectedElement();
    1814                        if ( element && element.getName() == "input" && element.getAttribute( 'type' ) == "radio" )
    1915                        {
     
    3632                        this.commitContent( element );
    3733
    3834                        if ( isInsertMode )
    39                         {
    40                                 this.restoreSelection();
    41                                 this.clearSavedSelection();
    4235                                editor.insertElement( element );
    43                         }
    4436                },
    4537                contents : [
    4638                        {
  • _source/plugins/forms/dialogs/select.js

     
    135135                minHeight : 270,
    136136                onShow : function()
    137137                {
    138                         // IE BUG: Selection must be in the editor for getSelectedElement()
    139                         // to work.
    140                         this.restoreSelection();
    141 
    142138                        this.setupContent( 'clear' );
    143139                        var element = this.getParentEditor().getSelection().getSelectedElement();
    144140                        if ( element && element.getName() == "select" )
     
    163159                        this.commitContent( element );
    164160
    165161                        if ( isInsertMode )
    166                         {
    167                                 this.restoreSelection();
    168                                 this.clearSavedSelection();
    169162                                editor.insertElement( element );
    170                         }
    171163                },
    172164                contents : [
    173165                        {
  • _source/plugins/forms/dialogs/textarea.js

     
    1010                minHeight : 140,
    1111                onShow : function()
    1212                {
    13                         // IE BUG: Selection must be in the editor for getSelectedElement()
    14                         // to work.
    15                         this.restoreSelection();
    16 
    1713                        var element = this.getParentEditor().getSelection().getSelectedElement();
    1814                        if ( element && element.getName() == "textarea" )
    1915                        {
     
    3531                        this.commitContent( element );
    3632
    3733                        if ( isInsertMode )
    38                         {
    39                                 this.restoreSelection();
    40                                 this.clearSavedSelection();
    4134                                editor.insertElement( element );
    42                         }
    4335                },
    4436                contents : [
    4537                        {
  • _source/plugins/forms/dialogs/textfield.js

     
    1010                minHeight : 140,
    1111                onShow : function()
    1212                {
    13                         // IE BUG: Selection must be in the editor for getSelectedElement()
    14                         // to work.
    15                         this.restoreSelection();
    16 
    1713                        var element = this.getParentEditor().getSelection().getSelectedElement();
    1814                        if ( element && element.getName() == "input" && ( element.getAttribute( 'type' ) == "text" || !element.getAttribute( 'type' ) ) )
    1915                        {
     
    3632                        this.commitContent( element );
    3733
    3834                        if ( isInsertMode )
    39                         {
    40                                 this.restoreSelection();
    41                                 this.clearSavedSelection();
    4235                                editor.insertElement( element );
    43                         }
    4436                },
    4537                contents : [
    4638                        {
  • _source/plugins/image/dialogs/image.js

     
    208208                                // Preview
    209209                                this.preview = CKEDITOR.document.getById( 'previewImage' );
    210210
    211                                 // IE BUG: Selection must be in the editor for getSelectedElement()
    212                                 // to work.
    213                                 this.restoreSelection();
    214 
    215211                                var editor = this.getParentEditor(),
    216212                                        element = this.getParentEditor().getSelection().getSelectedElement();
    217213
     
    308304                                this.commitContent( IMAGE, this.imageElement );
    309305                                this.commitContent( LINK, this.linkElement );
    310306
    311                                 this.restoreSelection();
    312                                 this.clearSavedSelection();
    313 
    314307                                // Insert a new Image.
    315308                                if ( !this.imageEditMode )
    316309                                {
    317                                         // It doesn't work with IE.
    318                                         this.restoreSelection();
    319                                         this.clearSavedSelection();
    320 
    321310                                        if ( this.addLink )
    322311                                        {
    323312                                                //Insert a new Link.
  • _source/plugins/link/dialogs/anchor.js

     
    88        // Function called in onShow to load selected element.
    99        var loadElements = function( editor, selection, ranges, element )
    1010        {
    11                 this.saveSelection();
    1211                this.editMode = true;
    1312                this.editObj = element;
    1413
     
    4544                        var fakeElement = editor.createFakeElement( element, 'cke_anchor', 'anchor' );
    4645                        if ( !this.editMode )
    4746                        {
    48                                 // It doesn't work with IE.
    49                                 this.restoreSelection();
    50                                 this.clearSavedSelection();
    51 
    5247                                editor.insertElement( fakeElement );
    5348                        }
    5449                        else
     50                        {
    5551                                fakeElement.replace( this.fakeObj );
     52
     53                                editor.getSelection().selectElement( fakeElement );
     54                        }
     55                       
    5656                        return true;
    5757                },
    5858                onShow : function()
     
    6161                        this.fakeObj = false;
    6262                        this.editMode = false;
    6363
    64                         // IE BUG: Selection must be in the editor for getSelection() to work.
    65                         this.restoreSelection();
    66 
    6764                        var editor = this.getParentEditor(),
    6865                                selection = editor.getSelection(),
    6966                                ranges = selection.getRanges();
     
    7976                                        element = editor.restoreRealElement( this.fakeObj );
    8077                                        loadElements.apply( this, [ editor, selection, ranges, element ] );
    8178                                        selection.selectElement( this.fakeObj );
    82                                         this.saveSelection();
    8379                                }
    8480                        }
    8581                        this.getContentElement( 'info', 'txtName' ).focus();
  • _source/plugins/link/dialogs/link.js

     
    990990                onShow : function()
    991991                {
    992992                        this.fakeObj = false;
    993                         // IE BUG: Selection must be in the editor for getSelection() to work.
    994                         this.restoreSelection();
     993
    995994                        var editor = this.getParentEditor(),
    996995                                selection = editor.getSelection(),
    997996                                ranges = selection.getRanges(),
     
    10081007                                if ( element && element.getAttribute( 'href' ) )
    10091008                                {
    10101009                                        selection.selectElement( element );
    1011                                         this.saveSelection();
    10121010                                }
    10131011                                else
    10141012                                {
     
    10181016                                                this.fakeObj = element;
    10191017                                                element = editor.restoreRealElement( this.fakeObj );
    10201018                                                selection.selectElement( this.fakeObj );
    1021                                                 this.saveSelection();
    10221019                                        }
    10231020                                }
    10241021                        }
     
    11271124
    11281125                        if ( !this._.selectedElement )
    11291126                        {
    1130                                 // IE BUG: Selection must be in the editor for getSelection() to work.
    1131                                 this.restoreSelection();
    1132                                 this.clearSavedSelection();
    1133 
    11341127                                // Create element if current selection is collapsed.
    11351128                                var selection = editor.getSelection(),
    11361129                                        ranges = selection.getRanges();
     
    11731166                                        var newElement = new CKEDITOR.dom.element( '<a name="' + CKEDITOR.tools.htmlEncode( attributes.name ) + '">',
    11741167                                                        editor.document );
    11751168
    1176                                         this.restoreSelection();
    11771169                                        selection = editor.getSelection();
    11781170
    11791171                                        element.moveChildren( newElement );
     
    11811173                                        newElement.replace( element );
    11821174                                        element = newElement;
    11831175
    1184                                         this.clearSavedSelection();
    11851176                                        selection.selectElement( element );
    11861177                                }
    11871178
  • _source/plugins/menu/plugin.js

     
    127127
    128128                                        panel.onEscape = CKEDITOR.tools.bind( function()
    129129                                        {
     130                                                this.onEscape && this.onEscape();
    130131                                                this.hide();
    131                                                 this.onEscape && this.onEscape();
    132132                                        },
    133133                                        this );
    134134
     135                                        panel.onHide = CKEDITOR.tools.bind( function()
     136                                        {
     137                                                this.onHide && this.onHide();
     138                                        },
     139                                        this );
     140
    135141                                        // Create an autosize block inside the panel.
    136142                                        var block = panel.addBlock( this.id );
    137143                                        block.autoSize = true;
  • _source/plugins/pastefromword/dialogs/pastefromword.js

     
    183183                                                this.getValueOf( 'general', 'ignoreFontFace' ),
    184184                                                this.getValueOf( 'general', 'removeStyle' ) );
    185185
    186                         this.restoreSelection();
    187186                        editor.insertHtml( html );
    188187                },
    189188                contents :
  • _source/plugins/pastetext/dialogs/pastetext.js

     
    2626                                        // Get the textarea value.
    2727                                        var text = CKEDITOR.document.getById( textareaId ).getValue();
    2828
    29                                         // Restore the editing area selection.
    30                                         this.restoreSelection();
    31                                         this.clearSavedSelection();
    32 
    3329                                        // Inserts the text.
    3430                                        this.getParentEditor().insertText( text );
    3531                                },
  • _source/plugins/pastetext/plugin.js

     
    1 /*
     1/*
    22Copyright (c) 2003-2009, CKSource - Frederico Knabben. All rights reserved.
    33For licensing, see LICENSE.html or http://ckeditor.com/license
    44*/
     
    2222                                return;
    2323                        }
    2424
    25                         // Check if the selection is inside the editing area for IE. (#3216)
    26                         if ( !editor.getSelection() )
    27                                 editor.focus();
    28 
    2925                        editor.insertText( window.clipboardData.getData( 'Text' ) );
    3026                }
    3127        };
  • _source/plugins/selection/plugin.js

     
    1010        // The selection change check basically saves the element parent tree of
    1111        // the current node and check it on successive requests. If there is any
    1212        // change on the tree, then the selectionChange event gets fired.
    13         var checkSelectionChange = function()
     13        function checkSelectionChange()
    1414        {
    15                 // In IE, the "selectionchange" event may still get thrown when
    16                 // releasing the WYSIWYG mode, so we need to check it first.
    17                 var sel = this.getSelection();
    18                 if ( !sel )
    19                         return;
     15                try
     16                {
     17                        // In IE, the "selectionchange" event may still get thrown when
     18                        // releasing the WYSIWYG mode, so we need to check it first.
     19                        var sel = this.getSelection();
     20                        if ( !sel )
     21                                return;
    2022
    21                 var firstElement = sel.getStartElement();
    22                 var currentPath = new CKEDITOR.dom.elementPath( firstElement );
     23                        var firstElement = sel.getStartElement();
     24                        var currentPath = new CKEDITOR.dom.elementPath( firstElement );
    2325
    24                 if ( !currentPath.compare( this._.selectionPreviousPath ) )
    25                 {
    26                         this._.selectionPreviousPath = currentPath;
    27                         this.fire( 'selectionChange', { selection : sel, path : currentPath, element : firstElement } );
     26                        if ( !currentPath.compare( this._.selectionPreviousPath ) )
     27                        {
     28                                this._.selectionPreviousPath = currentPath;
     29                                this.fire( 'selectionChange', { selection : sel, path : currentPath, element : firstElement } );
     30                        }
    2831                }
     32                catch (e)
     33                {}
    2934        };
    3035
    31         var checkSelectionChangeTimer;
    32         var checkSelectionChangeTimeoutPending;
    33         var checkSelectionChangeTimeout = function()
     36        var checkSelectionChangeTimer,
     37                checkSelectionChangeTimeoutPending;
     38
     39        function checkSelectionChangeTimeout()
    3440        {
    3541                // Firing the "OnSelectionChange" event on every key press started to
    3642                // be too slow. This function guarantees that there will be at least
     
    4450                checkSelectionChangeTimeoutExec.call( this );
    4551
    4652                checkSelectionChangeTimer = CKEDITOR.tools.setTimeout( checkSelectionChangeTimeoutExec, 200, this );
    47         };
     53        }
    4854
    49         var checkSelectionChangeTimeoutExec = function()
     55        function checkSelectionChangeTimeoutExec()
    5056        {
    5157                checkSelectionChangeTimer = null;
    5258
     
    6066
    6167                        checkSelectionChangeTimeoutPending = false;
    6268                }
    63         };
     69        }
    6470
    6571        // #### checkSelectionChange : END
    6672
     
    8591                {
    8692                        editor.on( 'contentDom', function()
    8793                                {
     94                                        var doc = editor.document;
     95
    8896                                        if ( CKEDITOR.env.ie )
    8997                                        {
     98                                                // Other browsers don't loose the selection if the
     99                                                // editor document loose the focus. In IE, we don't
     100                                                // have support for it, so we reproduce it here, other
     101                                                // than firing the selection change event.
     102
     103                                                var savedRange,
     104                                                        saveEnabled;
     105
     106                                                // "onfocusin" is fired before "onfocus". It makes it
     107                                                // possible to restore the selection before click
     108                                                // events get executed.
     109                                                doc.on( 'focusin', function()
     110                                                        {
     111                                                                // If we have saved a range, restore it at this
     112                                                                // point.
     113                                                                if ( savedRange )
     114                                                                {
     115                                                                        // Well not break because of this.
     116                                                                        try
     117                                                                        {
     118                                                                                savedRange.select();
     119                                                                        }
     120                                                                        catch (e)
     121                                                                        {}
     122
     123                                                                        savedRange = null;
     124                                                                }
     125                                                        });
     126
     127                                                editor.window.on( 'focus', function()
     128                                                        {
     129                                                                // Enable selections to be saved.
     130                                                                saveEnabled = true;
     131
     132                                                                saveSelection();
     133                                                        });
     134
     135                                                editor.window.on( 'blur', function()
     136                                                        {
     137                                                                // Disable selections from being saved.
     138                                                                saveEnabled = false;
     139
     140                                                                // IE may leave the selection still inside the
     141                                                                // document. Let's force it to be removed.
     142                                                                // TODO: The following has effect for
     143                                                                // collapsed selections.
     144                                                                editor.document.$.execCommand( 'Unselect' );
     145                                                        });
     146
     147                                                // IE fires the "selectionchange" event when clicking
     148                                                // inside a selection. We don't want to capture that.
     149                                                doc.on( 'mousedown', disableSave );
     150                                                doc.on( 'mouseup',
     151                                                        function()
     152                                                        {
     153                                                                saveEnabled = true;
     154                                                                setTimeout( function()
     155                                                                        {
     156                                                                                saveSelection( true );
     157                                                                        },
     158                                                                        0 );
     159                                                        });
     160
     161                                                doc.on( 'keydown', disableSave );
     162                                                doc.on( 'keyup',
     163                                                        function()
     164                                                        {
     165                                                                saveEnabled = true;
     166                                                                saveSelection();
     167                                                        });
     168
     169
    90170                                                // IE is the only to provide the "selectionchange"
    91171                                                // event.
    92                                                 editor.document.on( 'selectionchange', checkSelectionChangeTimeout, editor );
     172                                                doc.on( 'selectionchange', saveSelection );
     173
     174                                                function disableSave()
     175                                                {
     176                                                        saveEnabled = false;
     177                                                }
     178
     179                                                function saveSelection( testIt )
     180                                                {
     181                                                        if ( saveEnabled )
     182                                                        {
     183                                                                var doc = editor.document,
     184                                                                        sel = doc && doc.$.selection;
     185
     186                                                                // There is a very specific case, when clicking
     187                                                                // inside a text selection. In that case, the
     188                                                                // selection collapses at the clicking point,
     189                                                                // but the selection object remains in an
     190                                                                // unknown state, making createRange return a
     191                                                                // range at the very start of the document. In
     192                                                                // such situation we have to test the range, to
     193                                                                // be sure it's valid.
     194                                                                if ( testIt && sel && sel.type == 'None' )
     195                                                                {
     196                                                                        // The "InsertImage" command can be used to
     197                                                                        // test whether the selection is good or not.
     198                                                                        // If not, it's enough to give some time to
     199                                                                        // IE to put things in order for us.
     200                                                                        if ( !doc.$.queryCommandEnabled( 'InsertImage' ) )
     201                                                                        {
     202                                                                                CKEDITOR.tools.setTimeout( saveSelection, 50, this, true );
     203                                                                                return;
     204                                                                        }
     205                                                                }
     206
     207                                                                savedRange = sel && sel.createRange();
     208
     209                                                                checkSelectionChangeTimeout.call( editor );
     210                                                        }
     211                                                }
    93212                                        }
    94213                                        else
    95214                                        {
     
    97216                                                // check based on other events, like clicks or keys
    98217                                                // press.
    99218
    100                                                 editor.document.on( 'mouseup', checkSelectionChangeTimeout, editor );
    101                                                 editor.document.on( 'keyup', checkSelectionChangeTimeout, editor );
     219                                                doc.on( 'mouseup', checkSelectionChangeTimeout, editor );
     220                                                doc.on( 'keyup', checkSelectionChangeTimeout, editor );
    102221                                        }
    103222                                });
    104223
     
    123242         */
    124243        CKEDITOR.editor.prototype.getSelection = function()
    125244        {
    126                 var retval = this.document ? this.document.getSelection() : null;
    127 
    128                 /**
    129                  * IE BUG: The selection's document may be a different document than the
    130                  * editor document. Return null if that's the case.
    131                  */
    132                 if ( retval && CKEDITOR.env.ie )
    133                 {
    134                         var range = retval.getNative().createRange();
    135                         if ( !range )
    136                                 return null;
    137                         else if ( range.item )
    138                                 return range.item(0).ownerDocument == this.document.$ ? retval : null;
    139                         else
    140                                 return range.parentElement().ownerDocument == this.document.$ ? retval : null;
    141                 }
    142 
    143                 return retval;
     245                return this.document && this.document.getSelection();
    144246        };
    145247
    146248        CKEDITOR.editor.prototype.forceNextSelectionCheck = function()
     
    194296         */
    195297        CKEDITOR.dom.selection = function( document )
    196298        {
     299                var lockedSelection = document.getCustomData( 'cke_locked_selection' );
     300
     301                if ( lockedSelection )
     302                        return lockedSelection;
     303
    197304                this.document = document;
     305                this.isLocked = false;
    198306                this._ =
    199307                {
    200308                        cache : {}
    201309                };
     310
     311                /**
     312                 * IE BUG: The selection's document may be a different document than the
     313                 * editor document. Return null if that's the case.
     314                 */
     315                if ( CKEDITOR.env.ie )
     316                {
     317                        var range = this.getNative().createRange();
     318                        if ( !range
     319                                || ( range.item && range.item(0).ownerDocument != this.document.$ )
     320                                || ( range.parentElement && range.parentElement().ownerDocument != this.document.$ ) )
     321                        {
     322                                return null;
     323                        }
     324                }
     325               
     326                return this;
    202327        };
    203328
    204329        var styleObjectElements =
     
    250375                        CKEDITOR.env.ie ?
    251376                                function()
    252377                                {
    253                                         if ( this._.cache.type )
    254                                                 return this._.cache.type;
     378                                        var cache = this._.cache;
     379                                        if ( cache.type )
     380                                                return cache.type;
    255381
    256382                                        var type = CKEDITOR.SELECTION_NONE;
    257383
     
    275401                                        }
    276402                                        catch(e) {}
    277403
    278                                         return ( this._.cache.type = type );
     404                                        return ( cache.type = type );
    279405                                }
    280406                        :
    281407                                function()
    282408                                {
    283                                         if ( this._.cache.type )
    284                                                 return this._.cache.type;
     409                                        var cache = this._.cache;
     410                                        if ( cache.type )
     411                                                return cache.type;
    285412
    286413                                        var type = CKEDITOR.SELECTION_TEXT;
    287414
     
    306433                                                }
    307434                                        }
    308435
    309                                         return ( this._.cache.type = type );
     436                                        return ( cache.type = type );
    310437                                },
    311438
    312439                getRanges :
     
    382509
    383510                                        return function()
    384511                                        {
    385                                                 if ( this._.cache.ranges )
    386                                                         return this._.cache.ranges;
     512                                                var cache = this._.cache;
     513                                                if ( cache.ranges )
     514                                                        return cache.ranges;
    387515
    388516                                                // IE doesn't have range support (in the W3C way), so we
    389517                                                // need to do some magic to transform selections into
     
    404532                                                        boundaryInfo = getBoundaryInformation( nativeRange );
    405533                                                        range.setEnd( new CKEDITOR.dom.node( boundaryInfo.container ), boundaryInfo.offset );
    406534
    407                                                         return ( this._.cache.ranges = [ range ] );
     535                                                        return ( cache.ranges = [ range ] );
    408536                                                }
    409537                                                else if ( type == CKEDITOR.SELECTION_ELEMENT )
    410538                                                {
     
    429557                                                        return retval;
    430558                                                }
    431559
    432                                                 return ( this._.cache.ranges = [] );
     560                                                return ( cache.ranges = [] );
    433561                                        };
    434562                                })()
    435563                        :
    436564                                function()
    437565                                {
    438                                         if ( this._.cache.ranges )
    439                                                 return this._.cache.ranges;
     566                                        var cache = this._.cache;
     567                                        if ( cache.ranges )
     568                                                return cache.ranges;
    440569
    441570                                        // On browsers implementing the W3C range, we simply
    442571                                        // tranform the native ranges in CKEDITOR.dom.range
     
    455584                                                ranges.push( range );
    456585                                        }
    457586
    458                                         return ( this._.cache.ranges = ranges );
     587                                        return ( cache.ranges = ranges );
    459588                                },
    460589
    461590                /**
     
    468597                 */
    469598                getStartElement : function()
    470599                {
     600                        var cache = this._.cache;
     601                        if ( cache.startElement !== undefined )
     602                                return cache.startElement;
     603
    471604                        var node,
    472605                                sel = this.getNative();
    473606
     
    523656                                        }
    524657                        }
    525658
    526                         return ( node ? new CKEDITOR.dom.element( node ) : null );
     659                        return cache.startElement = ( node ? new CKEDITOR.dom.element( node ) : null );
    527660                },
    528661
    529662                /**
     
    537670                 */
    538671                getSelectedElement : function()
    539672                {
     673                        var cache = this._.cache;
     674                        if ( cache.selectedElement !== undefined )
     675                                return cache.selectedElement;
     676
    540677                        var node;
    541678
    542679                        if ( this.getType() == CKEDITOR.SELECTION_ELEMENT )
     
    558695                                }
    559696                        }
    560697
    561                         return ( node ? new CKEDITOR.dom.element( node ) : null );
     698                        return cache.selectedElement = ( node ? new CKEDITOR.dom.element( node ) : null );
    562699                },
     700               
     701                lock : function()
     702                {
     703                        // Call all cacheable function.
     704                        this.getRanges();
     705                        this.getStartElement();
     706                        this.getSelectedElement();
    563707
     708                        // The native selection is not available when locked.
     709                        this._.cache.nativeSel = {};
     710
     711                        this.isLocked = true;
     712
     713                        // Save this selection inside the DOM document.
     714                        this.document.setCustomData( 'cke_locked_selection', this );
     715                },
     716               
     717                unlock : function( restore )
     718                {
     719                        var doc = this.document,
     720                                lockedSelection = doc.getCustomData( 'cke_locked_selection' );
     721
     722                        if ( lockedSelection )
     723                        {
     724                                doc.setCustomData( 'cke_locked_selection', null );
     725
     726                                if ( restore )
     727                                {
     728                                        var selectedElement = lockedSelection.getSelectedElement(),
     729                                                ranges = !selectedElement && lockedSelection.getRanges();
     730
     731                                        this.isLocked = false;
     732                                        this.reset();
     733
     734                                        doc.getBody().focus();
     735                                       
     736                                        if ( selectedElement )
     737                                                this.selectElement( selectedElement );
     738                                        else
     739                                                this.selectRanges( ranges );
     740                                }
     741                        }
     742
     743                        if  ( !lockedSelection || !restore )
     744                        {
     745                                this.isLocked = false;
     746                                this.reset();
     747                        }
     748                },
     749
    564750                reset : function()
    565751                {
    566752                        this._.cache = {};
    567753                },
    568754
    569                 selectElement :
    570                         CKEDITOR.env.ie ?
    571                                 function( element )
    572                                 {
    573                                         this.getNative().empty();
     755                selectElement : function( element )
     756                {
     757                        if ( this.isLocked )
     758                        {
     759                                var range = new CKEDITOR.dom.range();
     760                                range.setStartBefore( element );
     761                                range.setEndAfter( element );
     762                       
     763                                this._.cache.selectedElement = element;
     764                                this._.cache.startElement = element;
     765                                this._.cache.ranges = [ range ];
     766                                this._.cache.type = CKEDITOR.SELECTION_TEXT;
     767                               
     768                                return;
     769                        }
    574770
    575                                         var range;
    576                                         try
    577                                         {
    578                                                 // Try to select the node as a control.
    579                                                 range = this.document.$.body.createControlRange();
    580                                                 range.addElement( element.$ );
    581                                         }
    582                                         catch(e)
    583                                         {
    584                                                 // If failed, select it as a text range.
    585                                                 range = this.document.$.body.createTextRange();
    586                                                 range.moveToElementText( element.$ );
    587                                         }
     771                        if ( CKEDITOR.env.ie )
     772                        {
     773                                this.getNative().empty();
    588774
    589                                         range.select();
     775                                var range;
     776                                try
     777                                {
     778                                        // Try to select the node as a control.
     779                                        range = this.document.$.body.createControlRange();
     780                                        range.addElement( element.$ );
    590781                                }
    591                         :
    592                                 function( element )
     782                                catch(e)
    593783                                {
    594                                         // Create the range for the element.
    595                                         var range = this.document.$.createRange();
    596                                         range.selectNode( element.$ );
     784                                        // If failed, select it as a text range.
     785                                        range = this.document.$.body.createTextRange();
     786                                        range.moveToElementText( element.$ );
     787                                }
    597788
    598                                         // Select the range.
    599                                         var sel = this.getNative();
    600                                         sel.removeAllRanges();
    601                                         sel.addRange( range );
    602                                 },
     789                                range.select();
    603790
    604                 selectRanges :
    605                         CKEDITOR.env.ie ?
    606                                 function( ranges )
     791                                this.reset();
     792                        }
     793                        else
     794                        {
     795                                // Create the range for the element.
     796                                var range = this.document.$.createRange();
     797                                range.selectNode( element.$ );
     798
     799                                // Select the range.
     800                                var sel = this.getNative();
     801                                sel.removeAllRanges();
     802                                sel.addRange( range );
     803
     804                                this.reset();
     805                        }
     806                },
     807
     808                selectRanges : function( ranges )
     809                {
     810                        if ( this.isLocked )
     811                        {
     812                                this._.cache.selectedElement = null;
     813                                this._.cache.startElement = ranges[ 0 ].getTouchedStartNode();
     814                                this._.cache.ranges = ranges;
     815                                this._.cache.type = CKEDITOR.SELECTION_TEXT;
     816                               
     817                                return;
     818                        }
     819
     820                        if ( CKEDITOR.env.ie )
     821                        {
     822                                // IE doesn't accept multiple ranges selection, so we just
     823                                // select the first one.
     824                                if ( ranges[ 0 ] )
     825                                        ranges[ 0 ].select();
     826
     827                                this.reset();
     828                        }
     829                        else
     830                        {
     831                                var sel = this.getNative();
     832                                sel.removeAllRanges();
     833
     834                                for ( var i = 0 ; i < ranges.length ; i++ )
    607835                                {
    608                                         // IE doesn't accept multiple ranges selection, so we just
    609                                         // select the first one.
    610                                         if ( ranges[ 0 ] )
    611                                                 ranges[ 0 ].select();
     836                                        var range = ranges[ i ];
     837                                        var nativeRange = this.document.$.createRange();
     838                                        nativeRange.setStart( range.startContainer.$, range.startOffset );
     839                                        nativeRange.setEnd( range.endContainer.$, range.endOffset );
     840
     841                                        // Select the range.
     842                                        sel.addRange( nativeRange );
    612843                                }
    613                         :
    614                                 function( ranges )
    615                                 {
    616                                         var sel = this.getNative();
    617                                         sel.removeAllRanges();
    618844
    619                                         for ( var i = 0 ; i < ranges.length ; i++ )
    620                                         {
    621                                                 var range = ranges[ i ];
    622                                                 var nativeRange = this.document.$.createRange();
    623                                                 nativeRange.setStart( range.startContainer.$, range.startOffset );
    624                                                 nativeRange.setEnd( range.endContainer.$, range.endOffset );
     845                                this.reset();
     846                        }
     847                },
    625848
    626                                                 // Select the range.
    627                                                 sel.addRange( nativeRange );
    628                                         }
    629                                 },
    630 
    631849                createBookmarks : function( serializable )
    632850                {
    633851                        var retval = [],
  • _source/plugins/smiley/dialogs/smiley.js

     
    5454                        else if ( targetName != 'img' )
    5555                                return;
    5656
    57                         this.getDialog().restoreSelection();
    58 
    5957                        var src = target.getAttribute( 'src' ),
    6058                                title = target.getAttribute( 'title' );
    6159
  • _source/plugins/specialchar/dialogs/specialchar.js

     
    128128                                                                        {
    129129                                                                                var dialog = this.getDialog();
    130130                                                                                target.removeClass( "LightBackground" );
    131                                                                                 dialog.restoreSelection();
    132131                                                                                dialog.getParentEditor().insertHtml( value );
    133132                                                                                dialog.hide();
    134133                                                                        }
  • _source/plugins/stylescombo/plugin.js

     
    1414                        var config = editor.config,
    1515                                lang = editor.lang.stylesCombo,
    1616                                pluginPath = this.path,
    17                                 styles,
    18                                 saveRanges;
     17                                styles;
    1918
    2019                        editor.ui.addRichCombo( 'Styles',
    2120                                {
     
    9796                                                var style = styles[ value ],
    9897                                                        selection = editor.getSelection();
    9998
    100                                                 if ( saveRanges )
    101                                                 {
    102                                                         selection.selectRanges( saveRanges );
    103                                                         saveRanges = false;
    104                                                 }
    105 
    10699                                                if ( style.type == CKEDITOR.STYLE_OBJECT )
    107100                                                {
    108101                                                        var element = selection.getSelectedElement();
     
    159152
    160153                                                var selection = editor.getSelection();
    161154
    162                                                 if ( CKEDITOR.env.ie && selection )
    163                                                         saveRanges = selection.getRanges();
    164 
    165155                                                var elementPath,
    166156                                                        element = selection.getSelectedElement(),
    167157                                                        elementName = element && element.getName(),
     
    218208
    219209                                                if ( !counter[ CKEDITOR.STYLE_OBJECT ] )
    220210                                                        this.hideGroup( lang[ 'panelTitle' + String( CKEDITOR.STYLE_OBJECT ) ] );
    221                                         },
    222 
    223                                         onClose : function()
    224                                         {
    225                                                 saveRanges = null;
    226211                                        }
    227212                                });
    228213                }
  • _source/plugins/table/dialogs/table.js

     
    8989                        onShow : function()
    9090                        {
    9191                                // Detect if there's a selected table.
    92                                 this.restoreSelection();
    9392                                var selection = editor.getSelection(),
    9493                                        ranges = selection.getRanges(),
    9594                                        selectedTable = null;
     
    9998                                        widthInput = this.getContentElement( 'info', 'txtWidth' );
    10099                                if ( command == 'tableProperties' )
    101100                                {
    102                                         if ( ( selectedTable = this.getSelectedElement() ) )
     101                                        if ( ( selectedTable = editor.getSelection().getSelectedElement() ) )
    103102                                        {
    104103                                                if ( selectedTable.getName() != 'table' )
    105104                                                        selectedTable = null;
     
    246245
    247246                                // Insert the table element if we're creating one.
    248247                                if ( !this._.selectedElement )
    249                                 {
    250                                         this.restoreSelection();
    251248                                        editor.insertElement( table );
    252                                         this.clearSavedSelection();
    253                                 }
    254249
    255250                                return true;
    256251                        },
  • _source/plugins/templates/dialogs/templates.js

     
    8585                }
    8686                else
    8787                {
    88                         if( CKEDITOR.env.ie )
    89                                 dialog.restoreSelection();
    90 
    9188                        editor.insertHtml( html );
    9289                }
    9390
    94                 dialog.clearSavedSelection();
    9591                dialog.hide();
    9692        }
    9793
  • _source/plugins/wsc/dialogs/wsc.js

     
    9797                        },
    9898                        onFinish : function( dT )
    9999                        {
    100                                 dialog.restoreSelection();
    101                                 dialog.clearSavedSelection();
    102100                                dialog.getParentEditor().setData( dT.value );
    103101                                dialog.hide();
    104102                        },
  • _source/plugins/wysiwygarea/plugin.js

     
    1414        {
    1515                if ( this.mode == 'wysiwyg' )
    1616                {
    17                         var $doc = this.document.$,
     17                        this.focus();
     18                               
     19                        var selection = this.getSelection(),
    1820                                data = evt.data;
    1921
    2022                        if ( this.dataProcessor )
    2123                                data = this.dataProcessor.toHtml( data );
    2224
    2325                        if ( CKEDITOR.env.ie )
    24                                 $doc.selection.createRange().pasteHTML( data );
     26                        {
     27                                var selIsLocked = selection.isLocked;
     28                               
     29                                if ( selIsLocked )
     30                                        selection.unlock();
     31                               
     32                                var $sel = selection.getNative();
     33                                if ( $sel.type == 'Control' )
     34                                        $sel.clear();
     35                                $sel.createRange().pasteHTML( data );
     36                               
     37                                if ( selIsLocked )
     38                                        this.getSelection().lock();
     39                        }
    2540                        else
    2641                                $doc.execCommand( 'inserthtml', false, data );
    2742                }
     
    3146        {
    3247                if ( this.mode == 'wysiwyg' )
    3348                {
     49                        this.focus();
     50
    3451                        var element = evt.data,
    3552                                elementName = element.getName(),
    3653                                isBlock = CKEDITOR.dtd.$block[ elementName ];
     
    3855                        var selection = this.getSelection(),
    3956                                ranges = selection.getRanges();
    4057
     58                        var selIsLocked = selection.isLocked;
     59
     60                        if ( selIsLocked )
     61                                selection.unlock();
     62
    4163                        var range, clone, lastElement, bookmark;
    4264
    4365                        for ( var i = ranges.length - 1 ; i >= 0 ; i-- )
     
    87109                                range.moveToElementEditStart( next );
    88110
    89111                        selection.selectRanges( [ range ] );
     112
     113                        if ( selIsLocked )
     114                                this.getSelection().lock();
    90115                }
    91116        }
    92117
© 2003 – 2019 CKSource – Frederico Knabben. All rights reserved. | Terms of use | Privacy policy