Esanders has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/86167


Change subject: Fix timing of rerender event in GC nodes
......................................................................

Fix timing of rerender event in GC nodes

Move the triggering of the rerender event into an overridable method
'afterRender'. Some nodes don't have the correct dimensions
immediately after rendering their DOM elements as they may need
to wait for images to load, or for a script to run (e.g. MathJax)

Change-Id: If204f665dcb2fd69d00a183279056d11188ddd74
---
M modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
M modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
M modules/ve/ce/nodes/ve.ce.GeneratedContentNode.js
3 files changed, 28 insertions(+), 5 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/67/86167/1

diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
index adb5b38..ffd39a8 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWExtensionNode.js
@@ -90,7 +90,12 @@
 ve.ce.MWExtensionNode.prototype.onParseSuccess = function ( deferred, response 
) {
        var data = response.visualeditor, contentNodes = $( data.content 
).get();
        deferred.resolve( contentNodes );
+};
+
+/** */
+ve.ce.MWExtensionNode.prototype.afterRender = function () {
        // Rerender after images load
+       // TODO: ignore shields, and count multiple images
        this.$.find( 'img' ).on( 'load', ve.bind( function () {
                this.emit( 'rerender' );
        }, this ) );
diff --git a/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js 
b/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
index a3cfd94..7f9d492 100644
--- a/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
+++ b/modules/ve-mw/ce/nodes/ve.ce.MWMathNode.js
@@ -41,12 +41,19 @@
        // HACK: unwrap paragraph from PHP parser
        contentNodes = Array.prototype.slice.apply( contentNodes[0].childNodes 
);
        deferred.resolve( contentNodes );
-       if ( $( contentNodes ).is( 'span.tex' ) ) {
+};
+
+/** */
+ve.ce.MWExtensionNode.prototype.afterRender = function ( domElements ) {
+       if ( $( domElements ).is( 'span.tex' ) ) {
                // MathJax
-               MathJax.Hub.Queue( [ 'Typeset', MathJax.Hub ] );
+               MathJax.Hub.Queue(
+                       [ 'Typeset', MathJax.Hub ],
+                       [ this, this.emit, 'rerender' ]
+               );
        } else {
                // Rerender after image load
-               this.$.find( 'img' ).on( 'load', ve.bind( function () {
+               this.$.find( 'img.tex' ).on( 'load', ve.bind( function () {
                        this.emit( 'rerender' );
                }, this ) );
        }
diff --git a/modules/ve/ce/nodes/ve.ce.GeneratedContentNode.js 
b/modules/ve/ce/nodes/ve.ce.GeneratedContentNode.js
index 1600db6..5d997d6 100644
--- a/modules/ve/ce/nodes/ve.ce.GeneratedContentNode.js
+++ b/modules/ve/ce/nodes/ve.ce.GeneratedContentNode.js
@@ -90,7 +90,6 @@
  * @param {HTMLElement[]} domElements Array of DOM elements
  * @emits setup
  * @emits teardown
- * @emits rerender
  */
 ve.ce.GeneratedContentNode.prototype.render = function ( domElements ) {
        var $rendering, doc = this.getElementDocument();
@@ -104,11 +103,23 @@
        this.$.empty().append( $rendering );
        if ( this.live ) {
                this.emit( 'setup' );
-               this.emit( 'rerender' );
+               this.afterRender( domElements );
        }
 };
 
 /**
+ * Trigger rerender events after rendering the contents of the node.
+ *
+ * Nodes may override this method if the rerender event needs to be deferred 
(e.g. until images have loaded)
+ *
+ * @param {HTMLElement[]} domElements Array of DOM elements
+ * @emits rerender
+ */
+ve.ce.GeneratedContentNode.prototype.afterRender = function () {
+       this.emit( 'rerender' );
+};
+
+/**
  * Update the contents of this node based on the model and config data. If 
this combination of
  * model and config data has been rendered before, the cached rendering in the 
store will be used.
  *

-- 
To view, visit https://gerrit.wikimedia.org/r/86167
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: If204f665dcb2fd69d00a183279056d11188ddd74
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Esanders <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to