C. Scott Ananian has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/403695 )
Change subject: WTS: Use `yield` instead of directly returning Promises
......................................................................
WTS: Use `yield` instead of directly returning Promises
Direct return of Promises from async functions, although convenient,
can obscure the callstack if an exception is thrown (since the caller
is no longer on the callstack when the returned Promise is resolved),
and may confuse readers which have to keep track of whether the return
value is of Promise type or not in order to figure out control flow
in the case of an exception.
Prefer to explicitly `yield` rather than directly returning a Promise,
at least in the WTS code.
Change-Id: I88d5b628d3e0ac0a208f6d8188ba23b78c8ce03a
---
M lib/html2wt/DOMHandlers.js
1 file changed, 28 insertions(+), 28 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid
refs/changes/95/403695/1
diff --git a/lib/html2wt/DOMHandlers.js b/lib/html2wt/DOMHandlers.js
index 46c7824..6e3ed47 100644
--- a/lib/html2wt/DOMHandlers.js
+++ b/lib/html2wt/DOMHandlers.js
@@ -734,7 +734,7 @@
);
}
- return state.serializeChildren(node);
+ yield state.serializeChildren(node);
}),
sepnls: {
before: function(node, otherNode) {
@@ -780,7 +780,7 @@
);
var thHandler = state.serializer.wteHandlers.thHandler
.bind(state.serializer.wteHandlers, node);
- return state.serializeChildren(node, thHandler);
+ yield state.serializeChildren(node, thHandler);
}),
sepnls: {
before: function(node, otherNode, state) {
@@ -830,7 +830,7 @@
WTSUtils.emitStartTag(tableTag, node, state);
var tdHandler = state.serializer.wteHandlers.tdHandler
.bind(state.serializer.wteHandlers, node,
inWideTD);
- return state.serializeChildren(node, tdHandler);
+ yield state.serializeChildren(node, tdHandler);
}),
sepnls: {
before: function(node, otherNode, state) {
@@ -856,7 +856,7 @@
wrapperUnmodified
);
WTSUtils.emitStartTag(tableTag, node, state);
- return state.serializeChildren(node);
+ yield state.serializeChildren(node);
}),
sepnls: {
before: function(node, otherNode) {
@@ -878,9 +878,9 @@
// escapeWikitext nowiking will deal with leading space for
content
// inside the p-tag, but forceSOL suppresses whitespace before
the p-tag.
forceSOL: true,
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
// XXX: Handle single-line mode by switching to HTML
handler!
- return state.serializeChildren(node);
+ yield state.serializeChildren(node);
}),
sepnls: {
before: function(node, otherNode, state) {
@@ -1021,8 +1021,8 @@
},
// HTML pre
pre_html: {
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
- return _htmlElementHandler(node, state);
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
+ yield _htmlElementHandler(node, state);
}),
sepnls: {
before: id({}),
@@ -1076,7 +1076,7 @@
}
state.emitChunk(out, node);
} else {
- return _htmlElementHandler(node, state);
+ yield _htmlElementHandler(node, state);
}
} else if (type) {
switch (type) {
@@ -1103,10 +1103,10 @@
// just ignore it
break;
default:
- return
_htmlElementHandler(node, state);
+ yield _htmlElementHandler(node,
state);
}
} else {
- return _htmlElementHandler(node, state);
+ yield _htmlElementHandler(node, state);
}
}),
sepnls: {
@@ -1151,12 +1151,12 @@
if (isRecognizedSpanWrapper(type)) {
if (type === 'mw:Nowiki') {
var nativeExt =
env.conf.wiki.extensionTags.get('nowiki');
- return
nativeExt.serialHandler.handle(node, state, wrapperUnmodified);
+ yield
nativeExt.serialHandler.handle(node, state, wrapperUnmodified);
} else if
(/(?:^|\s)mw:(?:Image|Video|Audio)(\/(Frame|Frameless|Thumb))?/.test(type)) {
// TODO: Remove when 1.5.0 content is
deprecated,
// since we no longer emit media in
spans. See the test,
// "Serialize simple image with span
wrapper"
- return
state.serializer.figureHandler(node);
+ yield
state.serializer.figureHandler(node);
} else if (/(?:^|\s)mw\:Entity/.test(type) &&
DU.hasNChildren(node, 1)) {
// handle a new mw:Entity (not handled
by selser) by
// serializing its children
@@ -1167,7 +1167,7 @@
Util.entityEncodeAll(node.firstChild.nodeValue),
node.firstChild);
} else {
- return
state.serializeChildren(node);
+ yield
state.serializeChildren(node);
}
} else if
(/(^|\s)mw:Placeholder(\/\w*)?/.test(type)) {
if (dp.src !== undefined) {
@@ -1183,7 +1183,7 @@
'
'.repeat(node.firstChild.nodeValue.length),
node.firstChild);
} else {
- return
_htmlElementHandler(node, state);
+ yield _htmlElementHandler(node,
state);
}
} else if (type === 'mw:FallbackId') {
/* ignore contents, this is just a
legacy compat ID */
@@ -1209,8 +1209,8 @@
}),
},
figure: {
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
- return state.serializer.figureHandler(node);
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
+ yield state.serializer.figureHandler(node);
}),
sepnls: {
// TODO: Avoid code duplication
@@ -1242,17 +1242,17 @@
}),
},
img: {
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
if (node.getAttribute('rel') === 'mw:externalImage') {
state.serializer.emitWikitext(node.getAttribute('src') || '', node);
} else {
- return state.serializer.figureHandler(node);
+ yield state.serializer.figureHandler(node);
}
}),
},
video: {
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
- return state.serializer.figureHandler(node);
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
+ yield state.serializer.figureHandler(node);
}),
},
hr: {
@@ -1316,14 +1316,14 @@
},
},
a: {
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
- return state.serializer.linkHandler(node);
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
+ yield state.serializer.linkHandler(node);
}),
// TODO: Implement link tail escaping with nowiki in DOM
handler!
},
link: {
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
- return state.serializer.linkHandler(node);
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
+ yield state.serializer.linkHandler(node);
}),
sepnls: {
before: function(node, otherNode) {
@@ -1358,13 +1358,13 @@
},
},
div: {
- handle: Promise.async(function *(node, state,
wrapperUnmodified) { // eslint-disable-line require-yield
+ handle: Promise.async(function *(node, state,
wrapperUnmodified) {
if (/\bmw-references-wrap\b/.test(node.classList)) {
// Just serialize the children
- return state.serializeChildren(node);
+ yield state.serializeChildren(node);
} else {
// Fall back to plain HTML serialization
- return _htmlElementHandler(node, state);
+ yield _htmlElementHandler(node, state);
}
}),
},
--
To view, visit https://gerrit.wikimedia.org/r/403695
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I88d5b628d3e0ac0a208f6d8188ba23b78c8ce03a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: C. Scott Ananian <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits