jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/369949 )

Change subject: ce.MWReferencesListNode: wait for content before destroying 
temporary view node
......................................................................


ce.MWReferencesListNode: wait for content before destroying temporary view node

Probably as fallout from the jQuery 3 update and associated promise-async
changes, `viewNode.destroy()` in the reflist preview caused problems when
adding a new reference with the generated content nodes which were actually
having to make an API call for their contents. New functions for waiting for
content generation to finish were added to core, and will defer the
destruction of the placeholder view until after it's done rendering.

Bug: T168932
Change-Id: I700bff9979a3356626aa311bfdf030da686f5878
Depends-On: Ic12973c0b46af50e0f1933137282a142f32e7de2
---
M modules/ve-cite/ve.ce.MWReferencesListNode.js
1 file changed, 32 insertions(+), 20 deletions(-)

Approvals:
  Bartosz Dziewoński: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/modules/ve-cite/ve.ce.MWReferencesListNode.js 
b/modules/ve-cite/ve.ce.MWReferencesListNode.js
index 9dd59d9..bf35eee 100644
--- a/modules/ve-cite/ve.ce.MWReferencesListNode.js
+++ b/modules/ve-cite/ve.ce.MWReferencesListNode.js
@@ -150,6 +150,28 @@
                listGroup = this.model.getAttribute( 'listGroup' ),
                nodes = internalList.getNodeGroup( listGroup );
 
+       function updateGeneratedContent( viewNode, $li ) {
+               // HACK: PHP parser doesn't wrap single lines in a paragraph
+               if (
+                       viewNode.$element.children().length === 1 &&
+                       viewNode.$element.children( 'p' ).length === 1
+               ) {
+                       // unwrap inner
+                       viewNode.$element.children().replaceWith(
+                               viewNode.$element.children().contents()
+                       );
+               }
+               $li.append(
+                       $( '<span>' )
+                               .addClass( 'reference-text' )
+                               .append( viewNode.$element )
+               );
+
+               // Since this is running after content generation has finished, 
it's
+               // safe to destroy the view.
+               viewNode.destroy();
+       }
+
        this.$reflist.detach().empty();
        this.$refmsg.detach();
 
@@ -220,26 +242,16 @@
                        modelNode = internalList.getItemNode( 
firstNode.getAttribute( 'listIndex' ) );
                        if ( modelNode && modelNode.length ) {
                                viewNode = new ve.ce.InternalItemNode( 
modelNode );
-                               // HACK: PHP parser doesn't wrap single lines 
in a paragraph
-                               if (
-                                       viewNode.$element.children().length === 
1 &&
-                                       viewNode.$element.children( 'p' 
).length === 1
-                               ) {
-                                       // unwrap inner
-                                       
viewNode.$element.children().replaceWith(
-                                               
viewNode.$element.children().contents()
-                                       );
-                               }
-                               $li.append(
-                                       $( '<span>' )
-                                               .addClass( 'reference-text' )
-                                               .append( viewNode.$element )
-                               );
-                               // HACK: See bug 62682 - We happen to know that 
destroy doesn't abort async
-                               // rendering for generated content nodes, but 
we really can't guarantee that in the
-                               // future - if you are here, debugging, because 
something isn't rendering properly,
-                               // it's likely that something has changed and 
these assumptions are no longer valid
-                               viewNode.destroy();
+
+                               
ve.ce.GeneratedContentNode.static.awaitGeneratedContent( viewNode )
+                                       .then( updateGeneratedContent.bind( 
this, viewNode, $li ) );
+
+                               // Because this update runs a number of times 
when using the
+                               // basic dialog, disconnect the model here 
rather than waiting
+                               // for when it's destroyed after the generated 
content is
+                               // finished. Failing to do this causes teardown 
errors with
+                               // basic citations.
+                               modelNode.disconnect( viewNode );
                        } else {
                                $li.append(
                                        $( '<span>' )

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

Gerrit-MessageType: merged
Gerrit-Change-Id: I700bff9979a3356626aa311bfdf030da686f5878
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/extensions/Cite
Gerrit-Branch: master
Gerrit-Owner: DLynch <[email protected]>
Gerrit-Reviewer: Bartosz Dziewoński <[email protected]>
Gerrit-Reviewer: Esanders <[email protected]>
Gerrit-Reviewer: Jackmcbarn <[email protected]>
Gerrit-Reviewer: Jforrester <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

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

Reply via email to