jenkins-bot has submitted this change and it was merged. Change subject: Update VE core submodule to master (ae30d71) ......................................................................
Update VE core submodule to master (ae30d71) New changes: f58ddea DiffElement: Use document slices with full internal lists 83800c0 DebugBar: Remove hard-coded i18n b4f89e1 Update OOjs UI to v0.18.1 40c7bf6 Factor out active node functionality from SectionNode for captions 2d967be Move 'mode' property to surface, rename target property to 'defaultMode' 5d8c214 wrapAllNodes in sourcefragment dd3d9e5 Refactor ve.dm.Transaction 9d61aca Use canonical ve.dm.TransactionBuilder.static.newFrom* methods df4f72a Make table caption node an active node b79f72d Core source mode 7533ac4 Localisation updates from https://translatewiki.net. ae30d71 SourceSurfaceFragment: Check range is not collapsed Local changes: Get edit mode from surface where possible Depends-On: Iec758c1892d518ad4bc2c0d1aaf6ca00fa354323 Change-Id: Ifaf6a26078b2731b374aaad2cb40c08928de9c84 --- M .jsduck/categories.json M .jsduck/eg-iframe.html M extension.json M lib/ve M modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.init.js M modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js M modules/ve-mw/init/ve.init.mw.ArticleTarget.js M modules/ve-mw/init/ve.init.mw.Target.js M modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js M modules/ve-mw/ui/tools/ve.ui.MWMetaDialogTool.js 10 files changed, 63 insertions(+), 42 deletions(-) Approvals: Jforrester: Looks good to me, approved jenkins-bot: Verified diff --git a/.jsduck/categories.json b/.jsduck/categories.json index 3f7204d..ab7c5e4 100644 --- a/.jsduck/categories.json +++ b/.jsduck/categories.json @@ -114,6 +114,7 @@ "ve.dm.*SurfaceFragment", "ve.dm.*Selection", "ve.dm.Transaction", + "ve.dm.TransactionBuilder", "ve.dm.Change", "ve.dm.TransactionProcessor", "ve.dm.TransactionProcessor.*", diff --git a/.jsduck/eg-iframe.html b/.jsduck/eg-iframe.html index 495c611..1ec68dd 100644 --- a/.jsduck/eg-iframe.html +++ b/.jsduck/eg-iframe.html @@ -13,6 +13,7 @@ <!-- visualEditor.core.build --> <link rel=stylesheet href="lib/ve/src/ce/styles/nodes/ve.ce.FocusableNode.css" class="stylesheet-ve"> + <link rel=stylesheet href="lib/ve/src/ce/styles/nodes/ve.ce.ActiveNode.css" class="stylesheet-ve"> <link rel=stylesheet href="lib/ve/src/ce/styles/nodes/ve.ce.AlienNode.css" class="stylesheet-ve"> <link rel=stylesheet href="lib/ve/src/ce/styles/nodes/ve.ce.BranchNode.css" class="stylesheet-ve"> <link rel=stylesheet href="lib/ve/src/ce/styles/nodes/ve.ce.ContentBranchNode.css" class="stylesheet-ve"> @@ -196,6 +197,7 @@ <script src="lib/ve/src/dm/ve.dm.TableMatrix.js"></script> <script src="lib/ve/src/dm/ve.dm.TransactionProcessor.js"></script> <script src="lib/ve/src/dm/ve.dm.Transaction.js"></script> + <script src="lib/ve/src/dm/ve.dm.TransactionBuilder.js"></script> <script src="lib/ve/src/dm/ve.dm.Selection.js"></script> <script src="lib/ve/src/dm/ve.dm.Surface.js"></script> <script src="lib/ve/src/dm/ve.dm.SurfaceFragment.js"></script> @@ -306,6 +308,7 @@ <script src="lib/ve/src/ce/keydownhandlers/ve.ce.TableEnterKeyDownHandler.js"></script> <script src="lib/ve/src/ce/keydownhandlers/ve.ce.LinearTabKeyDownHandler.js"></script> <script src="lib/ve/src/ce/nodes/ve.ce.GeneratedContentNode.js"></script> + <script src="lib/ve/src/ce/nodes/ve.ce.ActiveNode.js"></script> <script src="lib/ve/src/ce/nodes/ve.ce.AlienNode.js"></script> <script src="lib/ve/src/ce/nodes/ve.ce.ArticleNode.js"></script> <script src="lib/ve/src/ce/nodes/ve.ce.BlockquoteNode.js"></script> diff --git a/extension.json b/extension.json index 987cf43..2350b93 100644 --- a/extension.json +++ b/extension.json @@ -590,6 +590,7 @@ "lib/ve/src/dm/ve.dm.TableMatrix.js", "lib/ve/src/dm/ve.dm.TransactionProcessor.js", "lib/ve/src/dm/ve.dm.Transaction.js", + "lib/ve/src/dm/ve.dm.TransactionBuilder.js", "lib/ve/src/dm/ve.dm.Selection.js", "lib/ve/src/dm/ve.dm.Surface.js", "lib/ve/src/dm/ve.dm.SurfaceFragment.js", @@ -699,6 +700,7 @@ "lib/ve/src/ce/keydownhandlers/ve.ce.TableEnterKeyDownHandler.js", "lib/ve/src/ce/keydownhandlers/ve.ce.LinearTabKeyDownHandler.js", "lib/ve/src/ce/nodes/ve.ce.GeneratedContentNode.js", + "lib/ve/src/ce/nodes/ve.ce.ActiveNode.js", "lib/ve/src/ce/nodes/ve.ce.AlienNode.js", "lib/ve/src/ce/nodes/ve.ce.ArticleNode.js", "lib/ve/src/ce/nodes/ve.ce.BlockquoteNode.js", @@ -855,6 +857,7 @@ ], "styles": [ "lib/ve/src/ce/styles/nodes/ve.ce.FocusableNode.css", + "lib/ve/src/ce/styles/nodes/ve.ce.ActiveNode.css", "lib/ve/src/ce/styles/nodes/ve.ce.AlienNode.css", "lib/ve/src/ce/styles/nodes/ve.ce.BranchNode.css", "lib/ve/src/ce/styles/nodes/ve.ce.ContentBranchNode.css", @@ -950,6 +953,13 @@ "visualeditor-content-select-all", "visualeditor-contextitemwidget-label-remove", "visualeditor-contextitemwidget-label-secondary", + "visualeditor-debugbar-close", + "visualeditor-debugbar-inputdebug", + "visualeditor-debugbar-logrange", + "visualeditor-debugbar-showmodel", + "visualeditor-debugbar-startfilibuster", + "visualeditor-debugbar-stopfilibuster", + "visualeditor-debugbar-updatemodel", "visualeditor-dialog-action-apply", "visualeditor-dialog-action-cancel", "visualeditor-dialog-action-done", diff --git a/lib/ve b/lib/ve index 9625e8f..ae30d71 160000 --- a/lib/ve +++ b/lib/ve @@ -1 +1 @@ -Subproject commit 9625e8fdc3726e187e7ed9b9927a1e478de31902 +Subproject commit ae30d7101756379805ab99d24bbc1a62b660c69e diff --git a/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.init.js b/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.init.js index 64a1ccf..7ba7b2a 100644 --- a/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.init.js +++ b/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.init.js @@ -275,7 +275,7 @@ // and altered, re-attach immediately after init.$loading.detach(); // If target was already loaded, ensure the mode is correct - target.setMode( mode ); + target.setDefaultMode( mode ); activatePromise = target.activate( dataPromise ); $( '#content' ).prepend( init.$loading ); return activatePromise; @@ -577,7 +577,7 @@ } if ( active ) { targetPromise.done( function ( target ) { - if ( mode === 'visual' && target.mode === 'source' ) { + if ( mode === 'visual' && target.getDefaultMode() === 'source' ) { target.switchToVisualEditor(); } } ); diff --git a/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js b/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js index 29c9e80..8a4420a 100644 --- a/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js +++ b/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js @@ -270,7 +270,7 @@ } ); } - if ( this.mode === 'source' ) { + if ( surface.getMode() === 'source' ) { // HACK: Replace source button with VE button. This should be via the registry, // or we should have a toggle tool. actionGroups = ve.copy( this.constructor.static.actionGroups ); @@ -1022,7 +1022,7 @@ return; } - if ( target.getSurface() && !target.deactivating && target.mode !== 'source' ) { + if ( target.getSurface() && !target.deactivating && target.getDefaultMode() !== 'source' ) { target.editSource(); if ( target.getSurface().getModel().hasBeenModified() || target.fromEditedState ) { @@ -1159,7 +1159,7 @@ */ ve.init.mw.DesktopArticleTarget.prototype.updateHistoryState = function () { var uri, - veaction = this.mode === 'visual' ? 'edit' : 'editsource'; + veaction = this.getDefaultMode() === 'visual' ? 'edit' : 'editsource'; // Push veaction=edit(source) url in history (if not already. If we got here by a veaction=edit(source) // permalink then it will be there already and the constructor called #activate) @@ -1263,10 +1263,10 @@ veaction = this.currentUri.query.veaction; if ( ve.init.target.isModeAvailable( 'source' ) && this.active ) { - if ( veaction === 'editsource' && this.mode === 'visual' ) { + if ( veaction === 'editsource' && this.getDefaultMode() === 'visual' ) { this.actFromPopState = true; this.switchToWikitextEditor(); - } else if ( veaction === 'edit' && this.mode === 'source' ) { + } else if ( veaction === 'edit' && this.getDefaultMode() === 'source' ) { this.actFromPopState = true; this.switchToVisualEditor(); } @@ -1528,7 +1528,7 @@ return response; } ); } - this.setMode( 'source' ); + this.setDefaultMode( 'source' ); this.reloadSurface( dataPromise ); } else { oldid = this.currentUri.query.oldid || $( 'input[name=parentRevId]' ).val(); @@ -1586,7 +1586,7 @@ .then( function ( data ) { if ( data && data.action === 'discard' ) { target.section = null; - target.setMode( 'visual' ); + target.setDefaultMode( 'visual' ); target.reloadSurface(); } windowManager.destroy(); @@ -1600,7 +1600,7 @@ this.getDocToSave() ); - this.setMode( 'visual' ); + this.setDefaultMode( 'visual' ); this.reloadSurface( dataPromise ); } }; @@ -1615,7 +1615,7 @@ // Create progress - will be discarded when surface is destroyed. this.getSurface().createProgress( $.Deferred().promise(), - ve.msg( this.mode === 'source' ? 'visualeditor-mweditmodesource-progress' : 'visualeditor-mweditmodeve-progress' ), + ve.msg( this.getSurface().getMode() === 'source' ? 'visualeditor-mweditmodesource-progress' : 'visualeditor-mweditmodeve-progress' ), true /* non-cancellable */ ); this.activating = true; diff --git a/modules/ve-mw/init/ve.init.mw.ArticleTarget.js b/modules/ve-mw/init/ve.init.mw.ArticleTarget.js index ebae4e7..bffbe4f 100644 --- a/modules/ve-mw/init/ve.init.mw.ArticleTarget.js +++ b/modules/ve-mw/init/ve.init.mw.ArticleTarget.js @@ -194,16 +194,16 @@ /** * @inheritdoc */ -ve.init.mw.ArticleTarget.prototype.setMode = function () { - var oldMode = this.mode; +ve.init.mw.ArticleTarget.prototype.setDefaultMode = function () { + var oldDefaultMode = this.defaultMode; // Parent method - ve.init.mw.ArticleTarget.super.prototype.setMode.apply( this, arguments ); + ve.init.mw.ArticleTarget.super.prototype.setDefaultMode.apply( this, arguments ); - if ( this.mode !== oldMode ) { + if ( this.defaultMode !== oldDefaultMode ) { this.updateTabs( true ); if ( mw.libs.ve.setEditorPreference ) { // only set up by DAT.init - mw.libs.ve.setEditorPreference( this.mode === 'visual' ? 'visualeditor' : 'wikitext' ); + mw.libs.ve.setEditorPreference( this.defaultMode === 'visual' ? 'visualeditor' : 'wikitext' ); } } }; @@ -223,8 +223,8 @@ if ( editing ) { if ( $( '#ca-ve-edit' ).length ) { - selectVe = this.mode === 'visual'; - selectEdit = this.mode === 'source'; + selectVe = this.getDefaultMode() === 'visual'; + selectEdit = this.getDefaultMode() === 'source'; } else { // Single edit tab selectEdit = true; @@ -259,7 +259,7 @@ this.etag = data.etag; this.fromEditedState = data.fromEditedState; this.switched = data.switched || 'wteswitched' in new mw.Uri( location.href ).query; - this.doc = this.parseDocument( this.originalHtml ); + this.doc = this.parseDocument( this.originalHtml, this.getDefaultMode() ); this.remoteNotices = ve.getObjectValues( data.notices ); this.protectedClasses = data.protectedClasses; @@ -1087,7 +1087,7 @@ mw.libs.ve.activationStart = null; this.loading = dataPromise || mw.libs.ve.targetLoader.requestPageData( - this.mode, + this.getDefaultMode(), this.pageName, this.section, this.requestedRevId, @@ -1151,14 +1151,17 @@ /** * Create a document to save * + * TODO: Move this code to the surface? + * * @return {Object} Document to save */ ve.init.mw.ArticleTarget.prototype.createDocToSave = function () { - var i, l, text, data; + var i, l, text, data, + surface = this.getSurface(); - if ( this.mode === 'source' ) { + if ( surface.getMode() === 'source' ) { text = ''; - data = this.getSurface().getModel().getDocument().data.data; + data = surface.getModel().getDocument().data.data; for ( i = 0, l = data.length; i < l; i++ ) { if ( data[ i ].type === '/paragraph' && data[ i + 1 ].type === 'paragraph' ) { text += '\n'; @@ -1169,7 +1172,7 @@ return text; } - return this.getSurface().getDom(); + return surface.getDom(); }; /** @@ -1199,7 +1202,7 @@ start = ve.now(), target = this; - if ( this.mode === 'source' ) { + if ( this.getSurface().getMode() === 'source' ) { return; } @@ -1303,7 +1306,7 @@ var data, postData, preparedCacheKey, target = this; - if ( this.mode === 'source' ) { + if ( this.getSurface().getMode() === 'source' ) { data = { wikitext: doc, format: 'json' @@ -1831,10 +1834,11 @@ * @method */ ve.init.mw.ArticleTarget.prototype.restoreEditSection = function () { - var surfaceView, $documentNode, $section, headingNode; + var surface = this.getSurface(), + surfaceView, $documentNode, $section, headingNode; - if ( this.mode === 'visual' && this.section !== null && this.section > 0 ) { - surfaceView = this.getSurface().getView(); + if ( surface.getMode() === 'visual' && this.section !== null && this.section > 0 ) { + surfaceView = surface.getView(); $documentNode = surfaceView.getDocument().getDocumentNode().$element; $section = $documentNode.find( 'h1, h2, h3, h4, h5, h6' ).eq( this.section - 1 ); headingNode = $section.data( 'view' ); @@ -1946,7 +1950,7 @@ this.welcomeDialog, { switchable: this.constructor.static.trackingName !== 'mobile', - editor: this.mode + editor: this.getDefaultMode() } ) .then( function ( opened ) { diff --git a/modules/ve-mw/init/ve.init.mw.Target.js b/modules/ve-mw/init/ve.init.mw.Target.js index 149e54f..499dde8 100644 --- a/modules/ve-mw/init/ve.init.mw.Target.js +++ b/modules/ve-mw/init/ve.init.mw.Target.js @@ -157,11 +157,13 @@ * Parse document string into an HTML document * * @param {string} documentString Document + * @param {string} mode Editing mode * @return {HTMLDocument} HTML document */ -ve.init.mw.Target.prototype.parseDocument = function ( documentString ) { +ve.init.mw.Target.prototype.parseDocument = function ( documentString, mode ) { var doc; - if ( this.mode === 'source' ) { + if ( mode === 'source' ) { + // Parse as plain text in source mode doc = ve.createDocumentFromHtml( '' ); documentString.split( '\n' ).forEach( function ( line ) { @@ -256,7 +258,7 @@ * @inheritdoc */ ve.init.mw.Target.prototype.createTargetWidget = function ( config ) { - if ( this.mode === 'source' ) { + if ( this.getSurface().getMode() === 'source' ) { // Reset to visual mode for target widgets return new ve.ui.MWTargetWidget( ve.extendObject( { commandRegistry: ve.ui.commandRegistry, @@ -274,17 +276,17 @@ ve.init.mw.Target.prototype.createSurface = function ( dmDoc, config ) { var importRules, surface, surfaceView, $documentNode; - if ( this.mode === 'source' && !( config && config.inTargetWidget ) ) { + if ( config && config.mode === 'source' ) { importRules = ve.copy( this.constructor.static.importRules ); importRules.all = importRules.all || {}; // Preserve empty linebreaks on paste in source editor importRules.all.keepEmptyContentBranches = true; - config = this.getSurfaceConfig( { + config = this.getSurfaceConfig( ve.extendObject( {}, config, { commandRegistry: ve.ui.wikitextCommandRegistry, sequenceRegistry: ve.ui.wikitextSequenceRegistry, dataTransferHandlerFactory: ve.ui.wikitextDataTransferHandlerFactory, importRules: importRules - } ); + } ) ); return new ve.ui.MWDesktopWikitextSurface( dmDoc, config ); } @@ -308,13 +310,14 @@ * Create a document model from an HTML document. * * @param {HTMLDocument} doc HTML document + * @param {string} mode Editing mode * @return {ve.dm.Document} Document model */ -ve.init.mw.Target.prototype.createModelFromDom = function ( doc ) { +ve.init.mw.Target.prototype.createModelFromDom = function ( doc, mode ) { var i, l, children, data, conf = mw.config.get( 'wgVisualEditor' ); - if ( this.mode === 'source' ) { + if ( mode === 'source' ) { children = doc.body.children; data = []; @@ -348,7 +351,7 @@ var dmDoc; target.track( 'trace.convertModelFromDom.enter' ); - dmDoc = target.createModelFromDom( doc ); + dmDoc = target.createModelFromDom( doc, target.getDefaultMode() ); target.track( 'trace.convertModelFromDom.exit' ); // Build DM tree now (otherwise it gets lazily built when building the CE tree) diff --git a/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js b/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js index 4147338..676dfa4 100644 --- a/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js +++ b/modules/ve-mw/ui/dialogs/ve.ui.MWSaveDialog.js @@ -261,7 +261,7 @@ // Only show preview in source mode this.actions.forEach( { actions: 'preview' }, function ( action ) { - action.toggle( ve.init.target.mode === 'source' ); + action.toggle( ve.init.target.getSurface().mode === 'source' ); } ); mw.hook( 've.saveDialog.stateChanged' ).fire(); diff --git a/modules/ve-mw/ui/tools/ve.ui.MWMetaDialogTool.js b/modules/ve-mw/ui/tools/ve.ui.MWMetaDialogTool.js index 1597ec7..f1cf7e3 100644 --- a/modules/ve-mw/ui/tools/ve.ui.MWMetaDialogTool.js +++ b/modules/ve-mw/ui/tools/ve.ui.MWMetaDialogTool.js @@ -22,7 +22,7 @@ ve.ui.MWVeOnlyDialogTool.super.prototype.onUpdateState.apply( this, arguments ); // Meta tools are not supported in source mode (yet?) - this.setDisabled( ve.init.target.mode === 'source' ); + this.setDisabled( !this.toolbar.getSurface() || this.toolbar.getSurface().getMode() === 'source' ); }; /** -- To view, visit https://gerrit.wikimedia.org/r/324423 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: Ifaf6a26078b2731b374aaad2cb40c08928de9c84 Gerrit-PatchSet: 4 Gerrit-Project: mediawiki/extensions/VisualEditor Gerrit-Branch: master Gerrit-Owner: Esanders <esand...@wikimedia.org> Gerrit-Reviewer: Jforrester <jforres...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits