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

Reply via email to