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 <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits