Jdlrobson has uploaded a new change for review. https://gerrit.wikimedia.org/r/275724
Change subject: Lazy load references via mobileview API ...................................................................... Lazy load references via mobileview API While we discuss the internals of a generic references API we should make use of the mobileview API we already have to source references. A useMobileView API config setting will redirect queries via the mobileview API. Bug: T129182 Change-Id: Iec812faf12182f80f5a2193c2bc4b9b95ea86bbe --- M extension.json M resources/mobile.references/references.js M resources/skins.minerva.scripts/preInit.js M tests/qunit/mobile.references/test_references.js 4 files changed, 84 insertions(+), 13 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend refs/changes/24/275724/1 diff --git a/extension.json b/extension.json index 7d611ae..de0eb1a 100644 --- a/extension.json +++ b/extension.json @@ -2000,7 +2000,8 @@ }, "MFLazyLoadReferences": { "base": false, - "beta": false + "beta": false, + "useMobileViewApi": true }, "MFNoMobileCategory": false, "MFNoMobilePages": [], diff --git a/resources/mobile.references/references.js b/resources/mobile.references/references.js index 3cdb910..fa0d48f 100644 --- a/resources/mobile.references/references.js +++ b/resources/mobile.references/references.js @@ -19,6 +19,7 @@ d.resolve( referencesData ); } else { api = new mw.Api(); + // FIXME: This code block should be revisited in April 2016 (see T125329) api.get( { action: 'query', prop: 'references', @@ -40,13 +41,62 @@ * Return the matched reference among the children of ol.references * @method * @ignore + * @param {Page} page to retrieve reference for + * @param {String} id CSS selector + * @returns {jQuery.Deferred} resolves with an Object representing reference + */ + function getReferenceFromHTML( page, id ) { + // Use find rather than string concatenation + var d = $.Deferred(), + api = new mw.Api(), + $refs = page.$( 'ol.references' ), + $el = $refs.find( id ); + + if ( $refs.length ) { + if ( $el.length ) { + d.resolve( { + text: $el.html() + } ); + } else { + d.reject(); + } + } else { + api.get( { + action: 'mobileview', + page: page.getTitle(), + sections: 'references', + prop: 'text', + revision: page.getRevisionId() + } ).done( function ( data ) { + var sections = data.mobileview.sections; + if ( sections ) { + // store on current page so we can access it in future. + $refs = $( '<div>' ).html( sections[0].text ).appendTo( page.$el ); + $el = $refs.find( id ); + if ( $el.length ) { + d.resolve( { + text: $el.html() + } ); + return; + } + } + d.reject(); + } ).fail( $.proxy( d, 'reject' ) ); + } + return d; + } + + /** + * Return the matched reference via API or DOM query + * @method + * @ignore * @param {String} id CSS selector * @param {Page} page to retrieve reference for * @returns {jQuery.Deferred} resolves with an Object representing reference */ function getReference( id, page ) { - var $el, - config = mw.config.get( 'wgMFLazyLoadReferences' ), + var config = mw.config.get( 'wgMFLazyLoadReferences' ), + useMobileViewApi = config.useMobileViewApi, EditorGateway = M.require( 'mobile.editor.api/EditorGateway' ), editorGateway = new EditorGateway( { api: new mw.Api(), @@ -58,7 +108,7 @@ meta = /[!"$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g; id = id.replace( meta, '\\$&' ); - if ( config.base || ( isBeta && config.beta ) ) { + if ( !useMobileViewApi && ( config.base || ( isBeta && config.beta ) ) ) { id = id.substr( 1, id.length ); // FIXME: Use a gateway for this (?) getReferenceData( page ).then( function ( references ) { @@ -84,15 +134,8 @@ } } ).fail( $.proxy( d, 'reject' ) ); } else { - // Use find rather than string concatenation - $el = page.$( 'ol.references' ).find( id ); - if ( $el.length ) { - d.resolve( { - text: $el.html() - } ); - } else { - d.reject(); - } + getReferenceFromHTML( page, id ).done( $.proxy( d, 'resolve' ) ) + .fail( $.proxy( d, 'reject' ) ); } return d; } diff --git a/resources/skins.minerva.scripts/preInit.js b/resources/skins.minerva.scripts/preInit.js index b34d7ad..01439ae 100644 --- a/resources/skins.minerva.scripts/preInit.js +++ b/resources/skins.minerva.scripts/preInit.js @@ -67,6 +67,7 @@ protection: { edit: permissions }, + revId: mw.config.get( 'wgRevisionId' ), isMainPage: mw.config.get( 'wgIsMainPage' ), isWatched: $( '#ca-watch' ).hasClass( 'watched' ), sections: gateway.getSectionsFromHTML( $content ), diff --git a/tests/qunit/mobile.references/test_references.js b/tests/qunit/mobile.references/test_references.js index 7a4d3c5..8cd0c3d 100644 --- a/tests/qunit/mobile.references/test_references.js +++ b/tests/qunit/mobile.references/test_references.js @@ -54,4 +54,30 @@ } ); } ); + QUnit.test( 'Lazy loaded (mobileview)', 1, function ( assert ) { + var page = new Page( { + el: $( '<div>' ), + title: 'Reftest2' + } ); + this.sandbox.stub( mw.Api.prototype, 'get' ).returns( + $.Deferred().resolve( { + mobileview: { + sections: [ + { + text: '<ol id="references"><li id="cite_note-1">real lazy</li></ul>', + } + ] + } + } ) + ); + this.sandbox.stub( mw.config, 'get' ).withArgs( 'wgMFLazyLoadReferences' ).returns( { + beta: true, + base: true, + useMobileViewApi: true + } ); + R.getReference( '#cite_note-1', page ).done( function ( ref ) { + assert.strictEqual( ref.text, 'real lazy' ); + } ); + } ); + } )( jQuery, mw.mobileFrontend ); -- To view, visit https://gerrit.wikimedia.org/r/275724 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Iec812faf12182f80f5a2193c2bc4b9b95ea86bbe Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/MobileFrontend Gerrit-Branch: master Gerrit-Owner: Jdlrobson <jrob...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits