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

Reply via email to