jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/405943 )
Change subject: Sync tempWikitextEditor just before building target, not on
every change
......................................................................
Sync tempWikitextEditor just before building target, not on every change
Also ensure tempWikitextEditor is always torn down, even if
target setup fails.
Change-Id: Idc30a9dc00491b8c85353d73cb9ff70afea1d51c
---
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.TempWikitextEditorWidget.js
4 files changed, 47 insertions(+), 26 deletions(-)
Approvals:
DLynch: Looks good to me, approved
jenkins-bot: Verified
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 d9f9d40..7ca66e2 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
@@ -21,7 +21,7 @@
var conf, tabMessages, uri, pageExists, viewUri, veEditUri,
veEditSourceUri, isViewPage, isEditPage,
pageCanLoadEditor, init, targetPromise, enable, tempdisable,
autodisable,
tabPreference, enabledForUser, initialWikitext, oldId,
- isLoading, tempWikitextEditor, $toolbarPlaceholder,
+ isLoading, tempWikitextEditor, tempWikitextEditorData,
$toolbarPlaceholder,
editModes = {
edit: 'visual'
},
@@ -101,24 +101,20 @@
init.$loading.detach();
}
if ( tempWikitextEditor ) {
- // eslint-disable-next-line no-use-before-define
- ve.init.target.toolbarSetupDeferred.then(
teardownTempWikitextEditor );
+ if ( ve.init && ve.init.target ) {
+ // eslint-disable-next-line no-use-before-define
+ ve.init.target.toolbarSetupDeferred.then(
teardownTempWikitextEditor );
+ } else {
+ // Target didn't get created. Teardown editor
anyway.
+ // eslint-disable-next-line no-use-before-define
+ teardownTempWikitextEditor();
+ }
}
}
function setupTempWikitextEditor( data ) {
- tempWikitextEditor = new mw.libs.ve.MWTempWikitextEditorWidget(
{
- value: data.content,
- onChange: function () {
- // Write changes back to response data object,
- // which will be used to construct the surface.
- data.content = tempWikitextEditor.getValue();
- // TODO: Consider writing changes using a
- // transaction so they can be undone.
- // For now, just mark surface as pre-modified
- data.fromEditedState = true;
- }
- } );
+ tempWikitextEditor = new mw.libs.ve.MWTempWikitextEditorWidget(
{ value: data.content } );
+ tempWikitextEditorData = data;
// Create an equal-height placeholder for the toolbar to avoid
vertical jump
// when the real toolbar is ready.
@@ -143,18 +139,30 @@
ve.track( 'mwedit.ready', { mode: 'source' } );
}
+ function syncTempWikitextEditor() {
+ var newContent = tempWikitextEditor.getValue();
+
+ if ( newContent !== tempWikitextEditorData.content ) {
+ // Write changes back to response data object,
+ // which will be used to construct the surface.
+ tempWikitextEditorData.content = newContent;
+ // TODO: Consider writing changes using a
+ // transaction so they can be undone.
+ // For now, just mark surface as pre-modified
+ tempWikitextEditorData.fromEditedState = true;
+ }
+
+ // Store the last-seen selection and pass to the target
+ tempWikitextEditorData.initialSourceRange =
tempWikitextEditor.getRange();
+
+ tempWikitextEditor.$element.prop( 'readonly', true );
+ }
+
function teardownTempWikitextEditor() {
- var range,
- nativeRange = tempWikitextEditor.getRange(),
- surfaceModel = ve.init.target.getSurface().getModel();
-
- // Transfer the last-seen selection to the VE surface
- range = surfaceModel.getRangeFromSourceOffsets(
nativeRange.from, nativeRange.to );
- surfaceModel.setLinearSelection( range );
-
// Destroy widget and placeholder
tempWikitextEditor.$element.remove();
tempWikitextEditor = null;
+ tempWikitextEditorData = null;
$toolbarPlaceholder.remove();
$toolbarPlaceholder = null;
@@ -348,7 +356,8 @@
} );
} )
.done( function ( response ) {
- if ( mode === 'source' ) {
+ // Check target promise hasn't already
failed (isLoading=false)
+ if ( mode === 'source' && isLoading ) {
setupTempWikitextEditor(
response.visualeditor );
}
} )
@@ -372,6 +381,9 @@
init.$loading.detach();
// If target was already loaded, ensure the
mode is correct
target.setDefaultMode( mode );
+ if ( tempWikitextEditor ) {
+ syncTempWikitextEditor();
+ }
activatePromise = target.activate( dataPromise
);
$( '#content' ).prepend( init.$loading );
return activatePromise;
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 2b16d96..d7072ba 100644
--- a/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js
+++ b/modules/ve-mw/init/targets/ve.init.mw.DesktopArticleTarget.js
@@ -462,6 +462,7 @@
* Edit mode has finished activating
*/
ve.init.mw.DesktopArticleTarget.prototype.afterActivate = function () {
+ var surfaceModel, range;
$( 'html' ).removeClass( 've-activating' ).addClass( 've-active' );
if ( !this.editingTabDialog ) {
if ( this.sectionTitle ) {
@@ -473,6 +474,12 @@
// Support: Firefox
this.getSurface().getView().focus();
}
+ // Transfer and initial source range to the surface (e.g. from
tempWikitextEditor)
+ if ( this.initialSourceRange && this.getSurface().getMode() ===
'source' ) {
+ surfaceModel = ve.init.target.getSurface().getModel();
+ range = surfaceModel.getRangeFromSourceOffsets(
this.initialSourceRange.from, this.initialSourceRange.to );
+ surfaceModel.setLinearSelection( range );
+ }
}
};
diff --git a/modules/ve-mw/init/ve.init.mw.ArticleTarget.js
b/modules/ve-mw/init/ve.init.mw.ArticleTarget.js
index efcde21..79be226 100644
--- a/modules/ve-mw/init/ve.init.mw.ArticleTarget.js
+++ b/modules/ve-mw/init/ve.init.mw.ArticleTarget.js
@@ -312,6 +312,8 @@
mw.messages.set( data.checkboxesMessages );
this.$templatesUsed = $( data.templates );
+ this.initialSourceRange = data.initialSourceRange;
+
aboutDoc = this.doc.documentElement.getAttribute( 'about' );
if ( aboutDoc ) {
docRevIdMatches = aboutDoc.match( /revision\/([0-9]*)$/
);
@@ -1201,6 +1203,7 @@
this.baseTimeStamp = null;
this.startTimeStamp = null;
this.checkboxes = null;
+ this.initialSourceRange = null;
this.doc = null;
this.originalDmDocPromise = null;
this.originalHtml = null;
diff --git a/modules/ve-mw/init/ve.init.mw.TempWikitextEditorWidget.js
b/modules/ve-mw/init/ve.init.mw.TempWikitextEditorWidget.js
index 5bc228c..baf53dd 100644
--- a/modules/ve-mw/init/ve.init.mw.TempWikitextEditorWidget.js
+++ b/modules/ve-mw/init/ve.init.mw.TempWikitextEditorWidget.js
@@ -32,8 +32,7 @@
lang: lang,
dir: dir
} )
- .val( config.value )
- .on( 'input', config.onChange );
+ .val( config.value );
};
/**
--
To view, visit https://gerrit.wikimedia.org/r/405943
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: Idc30a9dc00491b8c85353d73cb9ff70afea1d51c
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>
Gerrit-Reviewer: DLynch <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits