in src/common/runtime/standalone.ts [268:361]
function makeSubtreeHTML(n: TestSubtree, parentLevel: TestQueryLevel): VisualizedSubtree {
let subtreeResult: SubtreeResult = emptySubtreeResult();
// Becomes set once the DOM for this case exists.
let clearRenderedResult: (() => void) | undefined;
let updateRenderedResult: (() => void) | undefined;
const { runSubtree, generateSubtreeHTML } = makeSubtreeChildrenHTML(
n.children.values(),
n.query.level
);
const runMySubtree = async () => {
if (runDepth === 0) {
stopRequested = false;
progressElem.style.display = '';
// only prompt if this is the full CTS and we started from the root.
if (isFullCTS && n.query.filePathParts.length === 0) {
promptBeforeReload = true;
}
}
if (stopRequested) {
const result = emptySubtreeResult();
result.skip = 1;
result.total = 1;
return result;
}
++runDepth;
if (clearRenderedResult) clearRenderedResult();
subtreeResult = await runSubtree();
if (updateRenderedResult) updateRenderedResult();
--runDepth;
if (runDepth === 0) {
progressElem.style.display = 'none';
}
return subtreeResult;
};
const generateMyHTML = (div: HTMLElement) => {
const subtreeHTML = $('<div>').addClass('subtreechildren');
const generateSubtree = memoize(() => generateSubtreeHTML(subtreeHTML[0]));
// Hide subtree - it's not generated yet.
subtreeHTML.hide();
const [header, setChecked] = makeTreeNodeHeaderHTML(n, runMySubtree, parentLevel, checked => {
if (checked) {
// Make sure the subtree is generated and then show it.
generateSubtree();
subtreeHTML.show();
} else {
subtreeHTML.hide();
}
});
div.classList.add('subtree');
div.classList.add(['', 'multifile', 'multitest', 'multicase'][n.query.level]);
div.appendChild(header);
div.appendChild(subtreeHTML[0]);
clearRenderedResult = () => {
div.removeAttribute('data-status');
};
updateRenderedResult = () => {
let status = '';
if (subtreeResult.pass > 0) {
status += 'pass';
}
if (subtreeResult.fail > 0) {
status += 'fail';
}
if (subtreeResult.skip === subtreeResult.total && subtreeResult.total > 0) {
status += 'skip';
}
div.setAttribute('data-status', status);
if (autoCloseOnPass.checked && status === 'pass') {
div.firstElementChild!.removeAttribute('open');
}
};
updateRenderedResult();
return () => {
setChecked();
const setChildrenChecked = generateSubtree();
setChildrenChecked();
};
};
return { runSubtree: runMySubtree, generateSubtreeHTML: generateMyHTML };
}