Robmoen has uploaded a new change for review. https://gerrit.wikimedia.org/r/93914
Change subject: Create base mobile init modules and set targets ...................................................................... Create base mobile init modules and set targets Target mobile for ve dependencies Create mobile view init modules Change-Id: I786b63ab57518fc6af7761501259ed66592f70e3 --- M VisualEditor.hooks.php M VisualEditor.php M VisualEditorDataModule.php A modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.init.js A modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.js M modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js M modules/ve-mw/init/ve.init.mw.Target.js 7 files changed, 270 insertions(+), 5 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor refs/changes/14/93914/1 diff --git a/VisualEditor.hooks.php b/VisualEditor.hooks.php index 53c7908..b6b3ce2 100644 --- a/VisualEditor.hooks.php +++ b/VisualEditor.hooks.php @@ -382,6 +382,7 @@ ), 'localBasePath' => dirname( __FILE__ ) . '/modules', 'remoteExtPath' => 'VisualEditor/modules', + 'targets' => array( 'desktop', 'mobile' ), ); return true; diff --git a/VisualEditor.php b/VisualEditor.php index ce60279..27129c2 100644 --- a/VisualEditor.php +++ b/VisualEditor.php @@ -79,18 +79,21 @@ 'rangy/rangy-position-1.3.js', 'rangy/rangy-export.js', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'jquery.visibleText' => $wgVisualEditorResourceTemplate + array( 'scripts' => array( 'jquery/jquery.visibleText.js', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'oojs' => $wgVisualEditorResourceTemplate + array( 'scripts' => array( 'oojs/oo.js', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'unicodejs.wordbreak' => $wgVisualEditorResourceTemplate + array( @@ -102,6 +105,7 @@ 'unicodejs/unicodejs.wordbreakproperties.js', 'unicodejs/unicodejs.wordbreak.js', ), + 'targets' => array( 'desktop', 'mobile' ), ), // Alias for backwards compat, safe to remove after @@ -115,12 +119,14 @@ 'styles' => array( 've-mw/init/styles/ve.init.mw.ViewPageTarget.Icons-raster.css', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.viewPageTarget.icons-vector' => $wgVisualEditorResourceTemplate + array( 'styles' => array( 've-mw/init/styles/ve.init.mw.ViewPageTarget.Icons-vector.css', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.viewPageTarget.init' => $wgVisualEditorResourceTemplate + array( @@ -143,6 +149,18 @@ 'visualeditor-ca-editsource-section', ), 'position' => 'top', + ), + + 'ext.visualEditor.mobileViewTarget.init' => $wgVisualEditorResourceTemplate + array( + 'scripts' => 've-mw/init/targets/ve.init.mw.MobileViewTarget.init.js', + 'styles' => 've-mw/init/styles/ve.init.mw.ViewPageTarget.init.css', + 'dependencies' => array( + 'mediawiki.Uri', + 'mediawiki.util', + 'user.options', + ), + 'position' => 'top', + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.viewPageTarget.noscript' => $wgVisualEditorResourceTemplate + array( @@ -205,6 +223,43 @@ 'visualeditor-savedialog-identify-user', ), ), + 'ext.visualEditor.mobileViewTarget' => $wgVisualEditorResourceTemplate + array( + 'scripts' => array( + 've-mw/init/targets/ve.init.mw.MobileViewTarget.js', + ), + 'styles' => array( + 've-mw/init/styles/ve.init.mw.ViewPageTarget.css', + ), + 'dependencies' => array( + 'ext.visualEditor.base', + 'ext.visualEditor.mediawiki', + 'jquery.visibleText', + 'mediawiki.api', + 'mediawiki.notify', + 'mediawiki.Title', + 'mediawiki.Uri', + 'mediawiki.user', + 'user.options', + 'user.tokens', + ), + 'messages' => array( + // MW core messages + 'creating', + 'editing', + 'spamprotectionmatch', + 'spamprotectiontext', + + // Messages needed by VE in init phase only (rest go below) + 'visualeditor-loadwarning', + 'visualeditor-loadwarning-token', + 'visualeditor-notification-created', + 'visualeditor-notification-restored', + 'visualeditor-notification-saved', + 'visualeditor-savedialog-identify-anon', + 'visualeditor-savedialog-identify-user', + ), + 'targets' => array( 'desktop', 'mobile' ), + ), 'ext.visualEditor.base' => $wgVisualEditorResourceTemplate + array( 'scripts' => array( @@ -226,6 +281,7 @@ 'unicodejs.wordbreak', 'mediawiki.util', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.mediawiki' => $wgVisualEditorResourceTemplate + array( @@ -241,6 +297,7 @@ 'mediawiki.Uri', 'ext.visualEditor.base', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.standalone' => $wgVisualEditorResourceTemplate + array( @@ -256,8 +313,10 @@ ), 'ext.visualEditor.data' => $wgVisualEditorResourceTemplate + array( - 'class' => 'VisualEditorDataModule' + 'class' => 'VisualEditorDataModule', + 'targets' => array( 'desktop', 'mobile' ), ), + 'ext.visualEditor.core' => $wgVisualEditorResourceTemplate + array( 'scripts' => array( @@ -704,6 +763,7 @@ 'fancycaptcha-edit', 'colon-separator', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.experimental' => $wgVisualEditorResourceTemplate + array( @@ -730,7 +790,7 @@ 'dependencies' => array( 'ext.visualEditor.core', 'jquery.uls', - 'ext.visualEditor.syntaxHighlight', + 'ext.visualEditor.syntaxHighlight' ), 'messages' => array( // VE messages needed by code that is only in experimental mode @@ -755,12 +815,14 @@ 've/ui/styles/ve.ui.Icons-raster.css', 've-mw/ui/styles/ve.ui.Icons-raster.css', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.icons-vector' => $wgVisualEditorResourceTemplate + array( 'styles' => array( 've/ui/styles/ve.ui.Icons-vector.css', 've-mw/ui/styles/ve.ui.Icons-vector.css', ), + 'targets' => array( 'desktop', 'mobile' ), ), 'ext.visualEditor.syntaxHighlight' => $wgVisualEditorResourceTemplate + array( 'scripts' => array( @@ -783,6 +845,7 @@ 'styles' => array( 'syntaxhighlight/styles/ve.ui.MWSyntaxHighlight.css', ), + 'targets' => array( 'desktop', 'mobile' ), ), ); diff --git a/VisualEditorDataModule.php b/VisualEditorDataModule.php index 66f4727..f64ea58 100644 --- a/VisualEditorDataModule.php +++ b/VisualEditorDataModule.php @@ -15,6 +15,7 @@ protected $origin = self::ORIGIN_USER_SITEWIDE; protected $gitInfo; protected $gitHeadHash; + protected $targets = array( 'desktop', 'mobile' ); /* Methods */ diff --git a/modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.init.js b/modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.init.js new file mode 100644 index 0000000..5795b83 --- /dev/null +++ b/modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.init.js @@ -0,0 +1,51 @@ +/*! + * VisualEditor MediaWiki MobileViewTarget init. + * + * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/*global mw */ + +/** + * Platform preparation for the MediaWiki MobileView page. This loads (when user needs it) the + * actual MediaWiki integration and VisualEditor library. + * + * @class ve.init.mw.MobileViewTarget.init + * @singleton + */ +( function ( M ) { + var init, getTargetDeferred; + /** + * Use deferreds to avoid loading and instantiating Target multiple times. + * @returns {jQuery.Promise} + */ + function getTarget() { + var loadTargetDeferred; + if ( !getTargetDeferred ) { + getTargetDeferred = $.Deferred(); + loadTargetDeferred = $.Deferred() + .done( function () { + var target = new ve.init.mw.MobileViewTarget(); + ve.init.mw.targets.push( target ); + getTargetDeferred.resolve( target ); + } ) + .fail( getTargetDeferred.reject ); + mw.loader.using( + 'ext.visualEditor.mobileViewTarget', + loadTargetDeferred.resolve, + loadTargetDeferred.reject + ); + } + return getTargetDeferred.promise(); + } + // FIXME: Attach static setup method to mw.mobileFrontend + // Determine if ve instance should be created by a special overlay inside of mobilefrontend + M.setupVisualEditor = function ( sectionId, callback ) { + getTarget().done( function ( target ) { + // FIXME: Do we need to track these events? + target.setSection( sectionId ); + target.activate( callback ); + } ); + }; +}( mw.mobileFrontend ) ); diff --git a/modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.js b/modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.js new file mode 100644 index 0000000..ddd434b --- /dev/null +++ b/modules/ve-mw/init/targets/ve.init.mw.MobileViewTarget.js @@ -0,0 +1,149 @@ +/*! + * VisualEditor MediaWiki Initialization MobileViewTarget class. + * + * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt + * @license The MIT License (MIT); see LICENSE.txt + */ + +/*global mw, confirm, alert */ + +/** + * Initialization MediaWiki mobile view page target. + * + * @class + * @extends ve.init.mw.Target + * + * @constructor + */ +ve.init.mw.MobileViewTarget = function VeInitMwMobileViewTarget() { + var currentUri = new mw.Uri(); + + // Parent constructor + ve.init.mw.Target.call( + this, $( '.mw-mf-overlay' ), + mw.config.get( 'wgRelevantPageName' ), + currentUri.query.oldid + ); + + // Properties + this.section = currentUri.query.vesection || null; + this.activating = false; + this.postActivation = null; + + // Events + this.connect( this, { 'load': 'onLoad' } ); +}; + +/* Inheritance */ + +ve.inheritClass( ve.init.mw.MobileViewTarget, ve.init.mw.Target ); + +/* Static Properties */ + +ve.init.mw.MobileViewTarget.static.toolbarGroups = [ + { 'include': [ 'undo', 'redo' ] }, + { 'include': [ 'bold', 'italic', 'link', 'clear' ] }, + { 'include': [ 'number', 'bullet', 'outdent', 'indent' ] }, + { 'include': '*', 'exclude': [ { 'group': 'format' }, 'reference', 'referenceList', 'mediaEdit', 'mediaInsert', 'transclusion' ] } +]; + +ve.init.mw.MobileViewTarget.static.surfaceCommands = [ + 'undo', 'redo', 'bold', 'italic', 'link', 'clear' +]; + +/* Methods */ + +/** + * Switch to edit mode. + * + * @method + */ +ve.init.mw.MobileViewTarget.prototype.activate = function ( callback ) { + this.activating = true; + this.postActivation = callback; + this.load(); +}; + +/** + * Handle successful DOM load event. + * + * @method + * @param {HTMLDocument} doc Parsed DOM from server + */ +ve.init.mw.MobileViewTarget.prototype.onLoad = function ( doc ) { + if ( this.activating ) { + ve.track( 'Edit', { action: 'page-edit-impression' } ); + this.edited = false; + this.doc = doc; + this.setUpSurface( doc, ve.bind( function () { + this.activating = false; + this.postActivation(); + // FIXME: target.$.append( target.surface.$ ); + // FIXME: Append surface to MobileFrontEnd overlay. + $( '.mw-mf-overlay' ) + .append( this.surface.$ ); + // After surface is setup + this.setUpToolbar(); + // Init rangy + window.rangy.init(); + + + }, this ) ); + } +}; + +ve.init.mw.MobileViewTarget.prototype.setUpSurface = function ( doc, callback ) { + var target = this; + setTimeout( function() { + // Build linmod + var store = new ve.dm.IndexValueStore(), + internalList = new ve.dm.InternalList(), + data = ve.dm.converter.getDataFromDom( doc, store, internalList ); + setTimeout( function () { + var dmDoc = new ve.dm.Document( data, undefined, internalList ); + target.surface = new ve.ui.Surface( dmDoc, target.surfaceOptions ); + target.surface.$.addClass( 've-init-mw-viewPageTarget-surface' ); + setTimeout( function () { + // Initialize surface + target.surface.getContext().hide(); + target.$document = target.surface.$.find( '.ve-ce-documentNode' ); + // Now that the surface is attached to the document and ready, + // we may init the surface + target.surface.initialize(); + setTimeout( callback ); + } ); + } ); + } ); + +}; + +/** + * Show the toolbar. + * + * @method + */ +ve.init.mw.MobileViewTarget.prototype.setUpToolbar = function () { + this.toolbar = new ve.ui.TargetToolbar( this, this.surface, { 'shadow': true, 'actions': true } ); + this.toolbar.setup( this.constructor.static.toolbarGroups ); + this.surface.addCommands( this.constructor.static.surfaceCommands ); + this.toolbar.$ + .addClass( 've-init-mw-viewPageTarget-toolbar' ) + .insertBefore( this.surface.$ ); + this.toolbar.$bar.show( 'fast', ve.bind( function () { + // Check the surface wasn't torn down while the toolbar was animating + if ( this.surface ) { + this.toolbar.initialize(); + this.surface.getContext().update(); + } + }, this ) ); +}; + +/** + * Store the section for which the edit link has been triggered. + * + * @method + * @param {integer} section Section number + */ +ve.init.mw.MobileViewTarget.prototype.setSection = function ( section ) { + this.section = section; +}; \ No newline at end of file diff --git a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js index 13c1602..ce7f976 100644 --- a/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js +++ b/modules/ve-mw/init/targets/ve.init.mw.ViewPageTarget.js @@ -170,7 +170,7 @@ this.saveScrollPosition(); - this.load(); + this.load( [ 'site', 'user' ] ); } }; diff --git a/modules/ve-mw/init/ve.init.mw.Target.js b/modules/ve-mw/init/ve.init.mw.Target.js index fc45845..65f9900 100644 --- a/modules/ve-mw/init/ve.init.mw.Target.js +++ b/modules/ve-mw/init/ve.init.mw.Target.js @@ -490,7 +490,7 @@ * @method * @returns {boolean} Loading has been started */ -ve.init.mw.Target.prototype.load = function () { +ve.init.mw.Target.prototype.load = function ( additionalModules ) { var data, start; // Prevent duplicate requests if ( this.loading ) { @@ -499,7 +499,7 @@ // Start loading the module immediately mw.loader.using( // Wait for site and user JS before running plugins - this.modules.concat( [ 'site', 'user' ] ), + this.modules.concat( additionalModules || [] ), ve.bind( ve.init.mw.Target.onModulesReady, this ) ); -- To view, visit https://gerrit.wikimedia.org/r/93914 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I786b63ab57518fc6af7761501259ed66592f70e3 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/VisualEditor Gerrit-Branch: master Gerrit-Owner: Robmoen <rm...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits