X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=resources%2Flib%2Fooui%2Foojs-ui-windows.js;h=d6f99898bd22fdb076ec0bb32fb4065cdb0b636b;hp=0e588bdb07e822eb6a44c59a01ded3080f71e6ff;hb=6cfb2e3d7a2b96d5041312fcec88248bb46573d7;hpb=574bed63bf33d4c46334f504b070aceb2fbe33db diff --git a/resources/lib/ooui/oojs-ui-windows.js b/resources/lib/ooui/oojs-ui-windows.js index 0e588bdb07..d6f99898bd 100644 --- a/resources/lib/ooui/oojs-ui-windows.js +++ b/resources/lib/ooui/oojs-ui-windows.js @@ -1,12 +1,12 @@ /*! - * OOUI v0.33.2 + * OOUI v0.33.4 * https://www.mediawiki.org/wiki/OOUI * * Copyright 2011–2019 OOUI Team and other contributors. * Released under the MIT license * http://oojs.mit-license.org * - * Date: 2019-07-10T12:25:07Z + * Date: 2019-07-23T03:23:32Z */ ( function ( OO ) { @@ -1415,6 +1415,7 @@ OO.ui.WindowManager.prototype.openWindow = function ( win, data, lifecycle, comp compatOpening.notify( { state: 'ready' } ); lifecycle.deferreds.opened.resolve( data ); compatOpening.resolve( manager.compatOpened.promise(), data ); + manager.togglePreventIosScrolling( true ); }, function () { lifecycle.deferreds.opened.reject(); compatOpening.reject(); @@ -1505,6 +1506,7 @@ OO.ui.WindowManager.prototype.closeWindow = function ( win, data ) { compatOpened = manager.compatOpened; manager.compatOpened = null; compatOpened.resolve( compatClosing.promise(), data ); + manager.togglePreventIosScrolling( false ); setTimeout( function () { win.hold( data ).then( function () { compatClosing.notify( { state: 'hold' } ); @@ -1678,6 +1680,47 @@ OO.ui.WindowManager.prototype.updateWindowSize = function ( win ) { return this; }; +/** + * Prevent scrolling of the document on iOS devices that don't respect `body { overflow: hidden; }`. + * + * This function is called when the window is opened (ready), and so the background is covered up, + * and the user won't see that we're doing weird things to the scroll position. + * + * @private + * @param {boolean} on + * @chainable + * @return {OO.ui.WindowManager} The manager, for chaining + */ +OO.ui.WindowManager.prototype.togglePreventIosScrolling = function ( on ) { + var + isIos = /ipad|iphone|ipod/i.test( navigator.userAgent ), + $body = $( this.getElementDocument().body ), + scrollableRoot = OO.ui.Element.static.getRootScrollableElement( $body[ 0 ] ), + stackDepth = $body.data( 'windowManagerGlobalEvents' ) || 0; + + // Only if this is the first/last WindowManager (see #toggleGlobalEvents) + if ( !isIos || stackDepth !== 1 ) { + return this; + } + + if ( on ) { + // We can't apply this workaround for non-fullscreen dialogs, because the user would see the + // scroll position change. If they have content that needs scrolling, you're out of luck… + // Always remember the scroll position in case dialog is closed with different size. + this.iosOrigScrollPosition = scrollableRoot.scrollTop; + if ( this.getCurrentWindow().getSize() === 'full' ) { + $body.add( $body.parent() ).addClass( 'oo-ui-windowManager-ios-modal-ready' ); + } + } else { + // Always restore ability to scroll in case dialog was opened with different size. + $body.add( $body.parent() ).removeClass( 'oo-ui-windowManager-ios-modal-ready' ); + if ( this.getCurrentWindow().getSize() === 'full' ) { + scrollableRoot.scrollTop = this.iosOrigScrollPosition; + } + } + return this; +}; + /** * Bind or unbind global events for scrolling. * @@ -3338,7 +3381,6 @@ OO.ui.ProcessDialog.prototype.getActionWidgetConfig = function ( config ) { ( Array.isArray( config.flags ) && config.flags.indexOf( flag ) !== -1 ); } - // Default to unframed. config = $.extend( { framed: true }, config ); if ( checkFlag( 'close' ) ) { // Change close buttons to icon only. @@ -3346,7 +3388,7 @@ OO.ui.ProcessDialog.prototype.getActionWidgetConfig = function ( config ) { icon: 'close', invisibleLabel: true } ); - } else if ( OO.ui.isMobile() && checkFlag( 'back' ) ) { + } else if ( checkFlag( 'back' ) ) { // Change back buttons to icon only. $.extend( config, { icon: 'previous',