WordPress.org

Make WordPress Core

Ticket #31661: 31661.patch

File 31661.patch, 3.7 KB (added by afercia, 6 years ago)
  • src/wp-includes/js/quicktags.js

     
    150150                        zeroise( now.getUTCSeconds() ) +
    151151                        '+00:00';
    152152        })(),
    153         qt;
     153        qt,
     154        keyboardSelectionIE = false;
    154155
    155156        qt = QTags = function(settings) {
    156157                if ( typeof(settings) === 'string' ) {
     
    220221                        tb.attachEvent('onclick', onclick);
    221222                }
    222223
     224                if ( canvas.addEventListener ) {
     225                        canvas.addEventListener( 'keydown', qt.OnTab, false );
     226                } else if ( canvas.attachEvent ) {
     227                        canvas.attachEvent( 'onkeydown', qt.OnTab );
     228                }
     229
    223230                t.getButton = function(id) {
    224231                        return t.theButtons[id];
    225232                };
     
    243250        };
    244251
    245252        qt._buttonsInit = function() {
    246                 var t = this, canvas, name, settings, theButtons, html, inst, ed, id, i, use,
     253                var t = this, canvas, name, settings, theButtons, html, inst, ed, id, i, use, closeAllButton,
    247254                        defaults = ',strong,em,link,block,del,ins,img,ul,ol,li,code,more,close,';
    248255
    249256                for ( inst in t.instances ) {
     
    299306                        }
    300307
    301308                        ed.toolbar.innerHTML = html;
     309
     310                        // Disable the Close All button on init.
     311                        closeAllButton = document.getElementById( ed.name + '_' + theButtons.close.id );
     312                        if ( closeAllButton ) {
     313                                closeAllButton.setAttribute( 'disabled', 'disabled' );
     314                        }
     315
    302316                        ed.theButtons = theButtons;
    303317
    304318                        if ( typeof jQuery !== 'undefined' ) {
     
    439453        };
    440454        qt.TagButton.prototype = new qt.Button();
    441455        qt.TagButton.prototype.openTag = function(e, ed) {
    442                 var t = this;
     456                var t = this,
     457                        closeAllButton = document.getElementById( ed.name + '_' + ed.theButtons.close.id );
    443458
     459                // Enable the Close All button now that we have open tags.
     460                if ( closeAllButton ) {
     461                        closeAllButton.removeAttribute( 'disabled' );
     462                }
     463
    444464                if ( ! ed.openTags ) {
    445465                        ed.openTags = [];
    446466                }
     467
    447468                if ( t.tagEnd ) {
    448469                        ed.openTags.push(t.id);
    449470                        e.value = '/' + e.value;
     
    450471                }
    451472        };
    452473        qt.TagButton.prototype.closeTag = function(e, ed) {
    453                 var t = this, i = t.isOpen(ed);
     474                var t = this, i = t.isOpen(ed),
     475                        closeAllButton = document.getElementById( ed.name + '_' + ed.theButtons.close.id );
    454476
    455477                if ( i !== false ) {
    456478                        ed.openTags.splice(i, 1);
    457479                }
    458480
     481                // Disable the Close All button when there are no more open tags.
     482                if ( 0 === i && closeAllButton ) {
     483                        closeAllButton.setAttribute( 'disabled', 'disabled' );
     484                }
     485                // Handle focus when the Close All button gets disabled.
     486                ed.canvas.focus();
     487
    459488                e.value = t.display;
    460489        };
    461490        // whether a tag is open or not. Returns false if not open, or current open depth of the tag
     
    476505
    477506                if ( document.selection ) { // IE
    478507                        canvas.focus();
    479                         sel = document.selection.createRange();
     508                        // Check if we already have an IE keyboard selection first.
     509                        sel = keyboardSelectionIE || document.selection.createRange();
    480510                        if ( sel.text.length > 0 ) {
    481511                                if ( !t.tagEnd ) {
    482512                                        sel.text = sel.text + t.tagStart;
     
    494524                                        t.closeTag(element, ed);
    495525                                }
    496526                        }
     527                        // Reset IE keyboard selection
     528                        keyboardSelectionIE = false;
    497529                        canvas.focus();
    498530                } else if ( canvas.selectionStart || canvas.selectionStart === 0 ) { // FF, WebKit, Opera
    499531                        startPos = canvas.selectionStart;
     
    544576                }
    545577        };
    546578
     579        // IE keyboard selection: get and store the selection when reverse tabbing.
     580        qt.OnTab = function( event ) {
     581                var key;
     582
     583                if ( document.selection && 'keydown' === event.type ) {
     584                        key = event.keyCode || event.charCode;
     585                        if ( event.shiftKey && 9 === key ) {
     586                                keyboardSelectionIE = document.selection.createRange();
     587                        }
     588                }
     589        };
     590
    547591        // removed
    548592        qt.SpellButton = function() {};
    549593