jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/365644 )

Change subject: Move historical diff loading to DiffLoader util
......................................................................


Move historical diff loading to DiffLoader util

Change-Id: I318752ede2e5c90f9d0ecd26b39e997fff2d60bd
---
M extension.json
A modules/ve-mw/init/ve.init.mw.DiffLoader.js
M modules/ve-mw/init/ve.init.mw.DiffPage.init.js
3 files changed, 105 insertions(+), 36 deletions(-)

Approvals:
  Bartosz Dziewoński: Looks good to me, approved
  jenkins-bot: Verified
  Jforrester: Looks good to me, but someone else must approve



diff --git a/extension.json b/extension.json
index 40426ac..623375b 100644
--- a/extension.json
+++ b/extension.json
@@ -1870,11 +1870,20 @@
                                
"modules/ve-mw/init/styles/ve.init.mw.DiffPage.less"
                        ]
                },
+               "ext.visualEditor.diffLoader": {
+                       "scripts": [
+                               "modules/ve-mw/init/ve.init.mw.DiffLoader.js"
+                       ],
+                       "dependencies": [
+                               "ext.visualEditor.targetLoader"
+                       ]
+               },
                "ext.visualEditor.diffPage.init": {
                        "scripts": [
                                "modules/ve-mw/init/ve.init.mw.DiffPage.init.js"
                        ],
                        "dependencies": [
+                               "ext.visualEditor.diffLoader",
                                "oojs-ui",
                                "oojs-ui.styles.icons-alerts",
                                "oojs-ui.styles.icons-editing-advanced",
diff --git a/modules/ve-mw/init/ve.init.mw.DiffLoader.js 
b/modules/ve-mw/init/ve.init.mw.DiffLoader.js
new file mode 100644
index 0000000..00aa243
--- /dev/null
+++ b/modules/ve-mw/init/ve.init.mw.DiffLoader.js
@@ -0,0 +1,92 @@
+/*!
+ * VisualEditor MediaWiki DiffLoader.
+ *
+ * @copyright 2011-2017 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+/**
+ * Diff loader.
+ *
+ * @class mw.libs.ve.diffLoader
+ * @singleton
+ */
+( function () {
+       var revCache = {};
+
+       mw.libs.ve = mw.libs.ve || {};
+
+       mw.libs.ve.diffLoader = {
+
+               /**
+                * Get a ve.dm.Document model from a Parsoid response
+                *
+                * @param {Object} response Parsoid response from the 
VisualEditor API
+                * @return {ve.dm.Document|null} Document, or null if an 
invalid response
+                */
+               getModelFromResponse: function ( response ) {
+                       var doc,
+                               targetClass = ve.init.mw.DesktopArticleTarget,
+                               data = response ? ( response.visualeditor || 
response.visualeditoredit ) : null;
+                       if ( data && typeof data.content === 'string' ) {
+                               doc = targetClass.static.parseDocument( 
data.content, 'visual' );
+                               return targetClass.static.createModelFromDom( 
doc, 'visual' );
+                       }
+                       return null;
+               },
+
+               /**
+                * Fetch a specific revision from Parsoid as a DM document, and 
cache in memory
+                *
+                * @param {number} revId Revision ID
+                * @param {string} [pageName] Page name, defaults to 
wgRelevantPageName
+                * @param {jQuery.Promise} [parseDocumentModulePromise] Promise 
which resolves when Target#parseDocument is available
+                * @return {jQuery.Promise} Promise which resolves with a 
document model
+                */
+               fetchRevision: function ( revId, pageName, 
parseDocumentModulePromise ) {
+                       parseDocumentModulePromise = parseDocumentModulePromise 
|| $.Deferred().resolve().promise();
+                       pageName = pageName || mw.config.get( 
'wgRelevantPageName' );
+
+                       revCache[ pageName ] = revCache[ pageName ] || {};
+                       revCache[ pageName ][ revId ] =
+                               revCache[ pageName ][ revId ] ||
+                               mw.libs.ve.targetLoader.requestParsoidData( 
pageName, revId, 'diff' ).then( function ( response ) {
+                                       return parseDocumentModulePromise.then( 
function () {
+                                               return 
mw.libs.ve.diffLoader.getModelFromResponse( response );
+                                       } );
+                               } );
+
+                       return revCache[ pageName ][ revId ];
+               },
+
+               /**
+                * Get a visual diff generator promise
+                *
+                * @param {number|jQuery.Promise} oldIdOrPromise Old revision 
ID, or document model promise
+                * @param {number|jQuery.Promise} newIdOrPromise New revision 
ID, or document model promise
+                * @param {jQuery.Promise} [parseDocumentModulePromise] Promise 
which resolves when Target#parseDocument is available
+                * @param {string} [oldPageName] Old revision's page name, 
defaults to wgRelevantPageName
+                * @param {string} [newPageName] New revision's page name, 
defaults to oldPageName
+                * @return {jQuery.Promise} Promise which resolves with a 
ve.dm.VisualDiff generator function
+                */
+               getVisualDiffGeneratorPromise: function ( oldIdOrPromise, 
newIdOrPromise, parseDocumentModulePromise, oldPageName, newPageName ) {
+                       var oldRevPromise, newRevPromise;
+
+                       parseDocumentModulePromise = parseDocumentModulePromise 
|| $.Deferred().resolve().promise();
+                       oldPageName = oldPageName || mw.config.get( 
'wgRelevantPageName' );
+
+                       oldRevPromise = typeof oldIdOrPromise === 'number' ? 
this.fetchRevision( oldIdOrPromise, oldPageName, parseDocumentModulePromise ) : 
oldIdOrPromise;
+                       newRevPromise = typeof newIdOrPromise === 'number' ? 
this.fetchRevision( newIdOrPromise, newPageName, parseDocumentModulePromise ) : 
newIdOrPromise;
+
+                       return $.when( oldRevPromise, newRevPromise, 
parseDocumentModulePromise ).then( function ( oldDoc, newDoc ) {
+                               // TODO: Differ expects newDoc to be derived 
from oldDoc and contain all its store data.
+                               // We may want to remove that assumption from 
the differ?
+                               newDoc.getStore().merge( oldDoc.getStore() );
+                               return function () {
+                                       return new ve.dm.VisualDiff( oldDoc, 
newDoc );
+                               };
+                       } );
+               }
+
+       };
+}() );
diff --git a/modules/ve-mw/init/ve.init.mw.DiffPage.init.js 
b/modules/ve-mw/init/ve.init.mw.DiffPage.init.js
index 18c7f07..a4ed1da 100644
--- a/modules/ve-mw/init/ve.init.mw.DiffPage.init.js
+++ b/modules/ve-mw/init/ve.init.mw.DiffPage.init.js
@@ -8,34 +8,13 @@
 ( function () {
        var $visualDiff,
                reviewModeButtonSelect,
-               revCache = {},
                uri = new mw.Uri(),
                mode = uri.query.diffmode || 'source',
                conf = mw.config.get( 'wgVisualEditorConfig' ),
                pluginModules = conf.pluginModules.filter( mw.loader.getState );
 
-       function getModelFromResponse( response ) {
-               var doc,
-                       targetClass = ve.init.mw.DesktopArticleTarget,
-                       data = response ? ( response.visualeditor || 
response.visualeditoredit ) : null;
-               if ( data && typeof data.content === 'string' ) {
-                       doc = targetClass.static.parseDocument( data.content, 
'visual' );
-                       return targetClass.static.createModelFromDom( doc, 
'visual' );
-               }
-               return null;
-       }
-
-       function fetchRevision( pageName, revId ) {
-               revCache[ pageName ] = revCache[ pageName ] || {};
-               if ( !revCache[ pageName ][ revId ] ) {
-                       revCache[ pageName ][ revId ] = 
mw.libs.ve.targetLoader.requestParsoidData( pageName, revId, 'diff' );
-               }
-               return revCache[ pageName ][ revId ];
-       }
-
        function onReviewModeButtonSelectSelect( item ) {
-               var oldRevPromise, newRevPromise, modulePromise, progress,
-                       oldPageName, newPageName,
+               var modulePromise, progress, oldPageName, newPageName,
                        $revSlider = $( '.mw-revslider-container' ),
                        $wikitextDiff = $( 'table.diff[data-mw="interface"]' ),
                        oldId = mw.config.get( 'wgDiffOldId' ),
@@ -52,22 +31,11 @@
 
                if ( mode === 'visual' ) {
                        progress = new OO.ui.ProgressBarWidget( { classes: [ 
've-init-mw-diffPage-loading' ] } );
-                       $wikitextDiff.addClass( 'oo-ui-element-hidden' );
-                       $wikitextDiff.before( progress.$element );
-                       oldRevPromise = fetchRevision( oldPageName, oldId );
-                       newRevPromise = fetchRevision( newPageName, newId );
+                       $wikitextDiff.addClass( 'oo-ui-element-hidden' 
).before( progress.$element );
                        // TODO: Load a smaller subset of VE for computing the 
visual diff
                        modulePromise = mw.loader.using( [ 
'ext.visualEditor.desktopArticleTarget' ].concat( pluginModules ) );
-                       $.when( oldRevPromise, newRevPromise, modulePromise 
).then( function ( oldResponse, newResponse ) {
-                               var visualDiff, diffElement,
-                                       oldDoc = getModelFromResponse( 
oldResponse ),
-                                       newDoc = getModelFromResponse( 
newResponse );
-
-                               // TODO: Differ expects newDoc to be derived 
from oldDoc and contain all its store data.
-                               // We may want to remove that assumption from 
the differ?
-                               newDoc.getStore().merge( oldDoc.getStore() );
-                               visualDiff = new ve.dm.VisualDiff( oldDoc, 
newDoc );
-                               diffElement = new ve.ui.DiffElement( 
visualDiff, { classes: [ 've-init-mw-diffPage-diff' ] } );
+                       mw.libs.ve.diffLoader.getVisualDiffGeneratorPromise( 
oldId, newId, modulePromise, oldPageName, newPageName ).then( function ( 
visualDiffGenerator ) {
+                               var diffElement = new ve.ui.DiffElement( 
visualDiffGenerator(), { classes: [ 've-init-mw-diffPage-diff' ] } );
 
                                progress.$element.remove();
                                $wikitextDiff.before( diffElement.$element );

-- 
To view, visit https://gerrit.wikimedia.org/r/365644
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I318752ede2e5c90f9d0ecd26b39e997fff2d60bd
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: Bartosz Dziewoński <[email protected]>
Gerrit-Reviewer: DLynch <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: Tchanders <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to