WordPress.org

Make WordPress Core

Ticket #32604: 32604.patch

File 32604.patch, 6.7 KB (added by iseulde, 5 years ago)
  • src/wp-includes/js/tinymce/plugins/wordpress/plugin.js

     
    447447                var Factory = tinymce.ui.Factory,
    448448                        settings = editor.settings,
    449449                        currentToolbar,
    450                         currentSelection;
     450                        currentSelection,
     451                        wpAdminbar = document.getElementById( 'wpadminbar' ),
     452                        wpStatusbar = document.getElementById( 'post-status-info' ),
     453                        mceIframe, mceToolbar, mceStatusbar;
     454
     455                editor.on( 'init', function() {
     456                        mceIframe = document.getElementById( editor.id + '_ifr' );
     457                        mceToolbar = tinymce.$( '.mce-toolbar-grp', editor.getContainer() )[0];
     458                        mceStatusbar = tinymce.$( '.mce-statusbar', editor.getContainer() )[0];
     459                } );
    451460
    452461                function create( buttons ) {
    453462                        var toolbar,
     
    578587                        }
    579588
    580589                        function reposition() {
    581                                 var top, left, minTop, className,
    582                                         windowPos, adminbar, mceToolbar, boundary,
    583                                         boundaryMiddle, boundaryVerticalMiddle, spaceTop,
    584                                         spaceBottom, windowWidth, toolbarWidth, toolbarHalf,
    585                                         iframe, iframePos, iframeWidth, iframeHeigth,
    586                                         toolbarNodeHeight, verticalSpaceNeeded,
    587                                         toolbarNode = this.getEl(),
     590                                var windowPos = window.pageYOffset || document.documentElement.scrollTop,
     591                                        windowWidth = window.innerWidth,
     592                                        windowHeight = window.innerHeight,
     593                                        iframePos = DOM.getPos( mceIframe ),
     594                                        iframeWidth = mceIframe.offsetWidth,
     595                                        toolbar = this.getEl(),
     596                                        toolbarWidth = toolbar.offsetWidth,
     597                                        toolbarHeight = toolbar.offsetHeight,
     598                                        selection = currentSelection.getBoundingClientRect(),
     599                                        selectionMiddle = ( selection.left + selection.right ) / 2,
    588600                                        buffer = 5,
    589601                                        margin = 8,
    590                                         adminbarHeight = 0;
    591 
    592                                 if ( ! currentSelection ) {
    593                                         return;
    594                                 }
     602                                        spaceNeeded = toolbarHeight + margin + buffer,
     603                                        wpAdminbarBottom = wpAdminbar ? wpAdminbar.getBoundingClientRect().bottom : 0,
     604                                        mceToolbarBottom = mceToolbar ? mceToolbar.getBoundingClientRect().bottom : 0,
     605                                        mceStatusbarTop = mceStatusbar ? mceStatusbar.getBoundingClientRect().top : 0,
     606                                        wpStatusbarTop = wpStatusbar ? wpStatusbar.getBoundingClientRect().top : 0,
     607                                        blockedTop = Math.max( 0, wpAdminbarBottom, mceToolbarBottom ),
     608                                        blockedBottom = Math.max( 0, windowHeight - mceStatusbarTop, windowHeight - wpStatusbarTop ),
     609                                        spaceTop = selection.top + iframePos.y - windowPos - blockedTop,
     610                                        spaceBottom = windowPos + windowHeight - iframePos.y - selection.bottom - blockedBottom,
     611                                        className = '',
     612                                        top, left;
    595613
    596                                 windowPos = window.pageYOffset || document.documentElement.scrollTop;
    597                                 adminbar = tinymce.$( '#wpadminbar' )[0];
    598                                 mceToolbar = tinymce.$( '.mce-toolbar-grp', editor.getContainer() )[0];
    599                                 boundary = currentSelection.getBoundingClientRect();
    600                                 boundaryMiddle = ( boundary.left + boundary.right ) / 2;
    601                                 boundaryVerticalMiddle = ( boundary.top + boundary.bottom ) / 2;
    602                                 spaceTop = boundary.top;
    603                                 spaceBottom = iframeHeigth - boundary.bottom;
    604                                 windowWidth = window.innerWidth;
    605                                 toolbarWidth = toolbarNode.offsetWidth;
    606                                 toolbarHalf = toolbarWidth / 2;
    607                                 iframe = document.getElementById( editor.id + '_ifr' );
    608                                 iframePos = DOM.getPos( iframe );
    609                                 iframeWidth = iframe.offsetWidth;
    610                                 iframeHeigth = iframe.offsetHeight;
    611                                 toolbarNodeHeight = toolbarNode.offsetHeight;
    612                                 verticalSpaceNeeded = toolbarNodeHeight + margin + buffer;
    613 
    614                                 if ( spaceTop >= verticalSpaceNeeded ) {
     614                                if ( spaceTop >= spaceNeeded ) {
    615615                                        className = ' mce-arrow-down';
    616                                         top = boundary.top + iframePos.y - toolbarNodeHeight - margin;
    617                                 } else if ( spaceBottom >= verticalSpaceNeeded ) {
     616                                        top = selection.top + iframePos.y - toolbarHeight - margin;
     617                                } else if ( spaceBottom >= spaceNeeded ) {
    618618                                        className = ' mce-arrow-up';
    619                                         top = boundary.bottom + iframePos.y;
    620                                 } else {
    621                                         top = buffer;
    622 
    623                                         if ( boundaryVerticalMiddle >= verticalSpaceNeeded ) {
    624                                                 className = ' mce-arrow-down';
    625                                         } else {
    626                                                 className = ' mce-arrow-up';
    627                                         }
    628                                 }
    629 
    630                                 // Make sure the image toolbar is below the main toolbar.
    631                                 if ( mceToolbar ) {
    632                                         minTop = DOM.getPos( mceToolbar ).y + mceToolbar.clientHeight;
     619                                        top = selection.bottom + iframePos.y;
    633620                                } else {
    634                                         minTop = iframePos.y;
     621                                        top = windowPos + blockedTop + buffer;
    635622                                }
    636623
    637                                 // Make sure the image toolbar is below the adminbar (if visible) or below the top of the window.
    638                                 if ( windowPos ) {
    639                                         if ( adminbar && adminbar.getBoundingClientRect().top === 0 ) {
    640                                                 adminbarHeight = adminbar.clientHeight;
    641                                         }
    642 
    643                                         if ( windowPos + adminbarHeight > minTop ) {
    644                                                 minTop = windowPos + adminbarHeight;
    645                                         }
    646                                 }
    647 
    648                                 if ( top && minTop && ( minTop + buffer > top ) ) {
    649                                         top = minTop + buffer;
    650                                         className = '';
    651                                 }
    652 
    653                                 left = boundaryMiddle - toolbarHalf;
    654                                 left += iframePos.x;
     624                                left = selectionMiddle - toolbarWidth / 2 + iframePos.x;
    655625
    656                                 if ( boundary.left < 0 || boundary.right > iframeWidth ) {
     626                                if ( selection.left < 0 || selection.right > iframeWidth ) {
    657627                                        left = iframePos.x + ( iframeWidth - toolbarWidth ) / 2;
    658628                                } else if ( toolbarWidth >= windowWidth ) {
    659629                                        className += ' mce-arrow-full';
    660630                                        left = 0;
    661                                 } else if ( ( left < 0 && boundary.left + toolbarWidth > windowWidth ) ||
    662                                         ( left + toolbarWidth > windowWidth && boundary.right - toolbarWidth < 0 ) ) {
    663 
     631                                } else if ( ( left < 0 && selection.left + toolbarWidth > windowWidth ) || ( left + toolbarWidth > windowWidth && selection.right - toolbarWidth < 0 ) ) {
    664632                                        left = ( windowWidth - toolbarWidth ) / 2;
    665633                                } else if ( left < iframePos.x ) {
    666634                                        className += ' mce-arrow-left';
    667                                         left = boundary.left + iframePos.x;
     635                                        left = selection.left + iframePos.x;
    668636                                } else if ( left + toolbarWidth > iframeWidth + iframePos.x ) {
    669637                                        className += ' mce-arrow-right';
    670                                         left = boundary.right - toolbarWidth + iframePos.x;
     638                                        left = selection.right - toolbarWidth + iframePos.x;
    671639                                }
    672640
    673                                 toolbarNode.className = toolbarNode.className.replace( / ?mce-arrow-[\w]+/g, '' );
    674                                 toolbarNode.className += className;
     641                                toolbar.className = toolbar.className.replace( / ?mce-arrow-[\w]+/g, '' );
     642                                toolbar.className += className;
    675643
    676                                 DOM.setStyles( toolbarNode, { 'left': left, 'top': top } );
     644                                DOM.setStyles( toolbar, {
     645                                        'left': left,
     646                                        'top': top
     647                                } );
    677648
    678649                                return this;
    679650                        }
     
    735706                        currentSelection = args.selection || args.element;
    736707
    737708                        currentToolbar && currentToolbar.hide();
    738                         args.toolbar && args.toolbar.show();
     709
     710                        if ( currentSelection ) {
     711                                args.toolbar && args.toolbar.show();
     712                        }
    739713                } );
    740714
    741715                editor.wp = editor.wp || {};