%PDF- %PDF-
Direktori : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/resources/mobile.init/ |
Current File : /www/varak.net/wiki.varak.net/extensions/MobileFrontend/resources/mobile.init/init.js |
/* global jQuery */ // FIXME: make this an object with a constructor to facilitate testing // (see https://bugzilla.wikimedia.org/show_bug.cgi?id=44264) /** * mobileFrontend namespace * @class mw.mobileFrontend * @singleton */ ( function ( M, $, storage ) { var currentPage, skin, PageGateway = M.require( 'mobile.startup/PageGateway' ), BetaOptinPanel = M.require( 'mobile.init/BetaOptinPanel' ), gateway = new PageGateway( new mw.Api() ), util = mw.util, mfUtil = M.require( 'mobile.startup/util' ), $window = mfUtil.getWindow(), $html = mfUtil.getDocument(), user = mw.user, context = M.require( 'mobile.startup/context' ), Page = M.require( 'mobile.startup/Page' ), experiments = mw.experiments, activeExperiments = mw.config.get( 'wgMFExperiments' ) || {}, Skin = M.require( 'mobile.startup/Skin' ), ReferencesMobileViewGateway = M.require( 'mobile.references.gateway/ReferencesMobileViewGateway' ), skinData = { el: 'body', page: getCurrentPage(), referencesGateway: ReferencesMobileViewGateway.getSingleton() }; skin = new Skin( skinData ); M.define( 'mobile.init/skin', skin ); // resource-modules-disable-line /** * Given 2 functions, it returns a function that will run both with it's * context and parameters and return the results combined * @private * @param {Function} fn1 * @param {Function} fn2 * @return {Function} which returns the results of [fn1, fn2] */ function apply2( fn1, fn2 ) { return function () { return [ fn1.apply( this, arguments ), fn2.apply( this, arguments ) ]; }; } /** * The `window`'s resize event debounced at 100 ms. * The `resize:throttled` event is the `window`'s * resize event throttled to 200 ms. * @event resize */ /** * The `window`'s scroll event debounced at 100 ms. * The `scroll:throttled` event is the `window`'s * scroll event throttled to 200 ms. * @event scroll */ $window .on( 'resize', apply2( $.debounce( 100, $.proxy( M, 'emit', 'resize' ) ), $.throttle( 200, $.proxy( M, 'emit', 'resize:throttled' ) ) ) ) .on( 'scroll', apply2( $.debounce( 100, $.proxy( M, 'emit', 'scroll' ) ), $.throttle( 200, $.proxy( M, 'emit', 'scroll:throttled' ) ) ) ); /** * Get current page view object * FIXME: Move to M.define( 'page' ) * @return {Page} */ function getCurrentPage() { if ( currentPage ) { return currentPage; } else { return loadCurrentPage(); } } /** * Constructs an incomplete Page object representing the currently loaded page. * * @private * @return {Page} */ function loadCurrentPage() { var permissions = mw.config.get( 'wgRestrictionEdit', [] ), $content = $( '#content #bodyContent' ); if ( permissions.length === 0 ) { permissions.push( '*' ); } currentPage = new Page( { el: $content, title: mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ), protection: { edit: permissions }, revId: mw.config.get( 'wgRevisionId' ), isMainPage: mw.config.get( 'wgIsMainPage' ), isWatched: $( '#ca-watch' ).hasClass( 'watched' ), sections: gateway.getSectionsFromHTML( $content ), isMissing: mw.config.get( 'wgArticleId' ) === 0, id: mw.config.get( 'wgArticleId' ), namespaceNumber: mw.config.get( 'wgNamespaceNumber' ) } ); return currentPage; } /** * Displays a prompt to ask the user to join the mobile beta mode. * * @private * @param {Object} experiment sampling data * @param {Page} page */ function displayBetaOptIn( experiment, page ) { var betaOptinPanel, inStable, inSample, token = storage.get( 'mobile-betaoptin-token' ); // local storage is supported in this case, when ~ means it was dismissed if ( token !== false && token !== '~' && !page.isMainPage() && !page.inNamespace( 'special' ) ) { if ( !token ) { token = user.generateRandomSessionId(); storage.set( 'mobile-betaoptin-token', token ); } inStable = context.getMode() === 'stable'; inSample = experiments.getBucket( experiment, token ) === 'A'; if ( inStable && ( inSample || util.getParamValue( 'debug' ) ) ) { betaOptinPanel = new BetaOptinPanel( { postUrl: util.getUrl( 'Special:MobileOptions', { returnto: page.title } ) } ); betaOptinPanel .on( 'hide', function () { storage.set( 'mobile-betaoptin-token', '~' ); } ).appendTo( page.getLeadSectionElement() ); } // let the interested parties e.g. QuickSurveys know whether the panel is shown mw.track( 'mobile.betaoptin', { isPanelShown: betaOptinPanel !== undefined } ); } } /** * Updates the font size based on the current value in storage */ function updateFontSize() { // FIXME: Ideally 'regular' would come from a shared constant // (currently not possible without using webpack) var userFontSize = storage.get( 'userFontSize', 'regular' ); $html.addClass( 'mf-font-size-' + userFontSize ); } // Font must be updated on back button press as users may click // back after changing font. $window.on( 'pageshow', function () { updateFontSize(); } ); updateFontSize(); if ( activeExperiments.betaoptin ) { displayBetaOptIn( activeExperiments.betaoptin, getCurrentPage() ); } // Recruit volunteers through the console // (note console.log may not be a function so check via apply) /* eslint-disable no-console */ if ( window.console && window.console.log && window.console.log.apply && mw.config.get( 'wgMFEnableJSConsoleRecruitment' ) ) { console.log( mw.msg( 'mobile-frontend-console-recruit' ) ); } mfUtil.extend( M, { getCurrentPage: getCurrentPage } ); /* eslint-enable no-console */ }( mw.mobileFrontend, jQuery, mw.storage ) );