Skip to content

Commit c48f82c

Browse files
authored
Merge pull request #1044 from mathjax/issue3167a
Fix menu to not rerender if no typesetting has occurred. (mathjax/MathJax#3167)
2 parents 3894352 + 3867c1c commit c48f82c

File tree

2 files changed

+25
-9
lines changed

2 files changed

+25
-9
lines changed

ts/components/startup.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ export interface MathJaxObject extends MJObject {
9696
elements: any[];
9797
document: MATHDOCUMENT;
9898
promise: Promise<void>;
99+
rerenderPromise: Promise<void>;
99100
/* tslint:disable:jsdoc-require */
100101
registerConstructor(name: string, constructor: any): void;
101102
useHandler(name: string, force?: boolean): void;
@@ -184,7 +185,7 @@ export namespace Startup {
184185

185186
/**
186187
* The promise for the startup process (the initial typesetting).
187-
* It is resolves or rejected in the ready() function.
188+
* It is resolved or rejected in the ready() function.
188189
*/
189190
export let promise = new Promise<void>((resolve, reject) => {
190191
promiseResolve = resolve;
@@ -206,6 +207,13 @@ export namespace Startup {
206207
}
207208
});
208209

210+
/**
211+
* Non-null when MathJax.typeset() or MathJax.typesetPromise() have been performed
212+
* (so the menu code can tell whether a rerender is needed when components are loaded)
213+
* and then is equal to a promise after which rerendering can occur.
214+
*/
215+
export let rerenderPromise: Promise<void> = null;
216+
209217
/**
210218
* @param {MmlNode} node The root of the tree to convert to serialized MathML
211219
* @return {string} The serialized MathML from the tree
@@ -374,9 +382,12 @@ export namespace Startup {
374382
document.options.elements = elements;
375383
document.reset();
376384
document.render();
385+
if (!rerenderPromise) {
386+
rerenderPromise = promise;
387+
}
377388
};
378389
MathJax.typesetPromise = (elements: any[] = null) => {
379-
promise = promise.then(() => typesetPromise(elements));
390+
rerenderPromise = promise = promise.then(() => typesetPromise(elements));
380391
return promise;
381392
};
382393
MathJax.typesetClear = (elements: any[] = null) => {

ts/ui/menu/Menu.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1175,18 +1175,23 @@ export class Menu {
11751175

11761176
/**
11771177
* Rerender the output if we aren't in the middle of loading a new component
1178-
* (in which case, we will rerender in the callback performed after it is loaded)
1178+
* (in which case, we will rerender in the callback performed after it is loaded)
11791179
*
11801180
* @param {number=} start The state at which to start rerendering
11811181
*/
11821182
protected rerender(start: number = STATE.TYPESET) {
11831183
this.rerenderStart = Math.min(start, this.rerenderStart);
1184-
if (!Menu.loading) {
1185-
if (this.rerenderStart <= STATE.COMPILED) {
1186-
this.document.reset({inputJax: []});
1187-
}
1188-
this.document.rerender(this.rerenderStart);
1189-
this.rerenderStart = STATE.LAST;
1184+
const startup = MathJax.startup;
1185+
if (!Menu.loading && startup.rerenderPromise) {
1186+
startup.rerenderPromise = startup.promise = startup.rerenderPromise.then(
1187+
() => mathjax.handleRetriesFor(() => {
1188+
if (this.rerenderStart <= STATE.COMPILED) {
1189+
this.document.reset({inputJax: []});
1190+
}
1191+
this.document.rerender(this.rerenderStart);
1192+
this.rerenderStart = STATE.LAST;
1193+
})
1194+
);
11901195
}
11911196
}
11921197

0 commit comments

Comments
 (0)