diff --git a/src/core/base-runner.js b/src/core/base-runner.js
index 0ab1de3a1f..81d2a5c8a0 100644
--- a/src/core/base-runner.js
+++ b/src/core/base-runner.js
@@ -2,8 +2,8 @@
// The module in charge of running the whole processing pipeline.
import { pub } from "core/pubsubhub";
import "core/default-root-attr";
-import "core/pre-process";
-import "core/post-process"
+import { done as preProcessDone } from "core/pre-process";
+import { done as postProcessDone } from "core/post-process";
import "core/respec-ready";
import "core/override-configuration";
import "core/include-config";
@@ -21,16 +21,19 @@ function toRunnable(plug) {
}
export async function runAll(plugs) {
- pub("start-all", window.respecConfig);
+ pub("start-all", respecConfig);
+ await preProcessDone;
const runnables = plugs
.filter(plug => plug && typeof plug.run === "function" && plug !== this)
.map(toRunnable);
for (const task of runnables) {
try {
- await task(window.respecConfig);
+ await task(respecConfig);
} catch (err) {
console.error(err);
}
}
- pub("end-all", window.respecConfig);
+ pub("plugins-done", respecConfig);
+ await postProcessDone;
+ pub("end-all", respecConfig);
};
diff --git a/src/core/post-process.js b/src/core/post-process.js
index 4f382131bf..63df34ca65 100644
--- a/src/core/post-process.js
+++ b/src/core/post-process.js
@@ -10,11 +10,21 @@
*/
import { sub } from "core/pubsubhub";
-sub("end-all", config => {
+let doneResolver;
+export const done = new Promise(resolve => doneResolver = resolve);
+
+sub("plugins-done", async config => {
+ const result = [];
if (Array.isArray(config.postProcess)) {
- config.postProcess.forEach(f => f(config));
+ const values = await Promise.all(
+ config.postProcess
+ .filter(f => typeof f === "function")
+ .map(f => Promise.resolve(f(config, document)))
+ );
+ result.push(...values);
}
if (typeof config.afterEnd === "function") {
- config.afterEnd();
+ result.push(await Promise.resolve(config.afterEnd(config, document)));
}
+ doneResolver(result);
}, { once: true });
diff --git a/src/core/pre-process.js b/src/core/pre-process.js
index 1cdef3429f..b9c9962f6b 100644
--- a/src/core/pre-process.js
+++ b/src/core/pre-process.js
@@ -9,8 +9,18 @@
*/
import { sub } from "core/pubsubhub";
-sub("start-all", config => {
+let doneResolver;
+export const done = new Promise(resolve => doneResolver = resolve);
+
+sub("start-all", async config => {
+ const result = [];
if (Array.isArray(config.preProcess)) {
- config.preProcess.forEach(f => f(config));
+ const values = await Promise.all(
+ config.preProcess
+ .filter(f => typeof f === "function")
+ .map(f => Promise.resolve(f(config, document)))
+ );
+ result.push(...values);
}
+ doneResolver(result);
}, { once: true });
diff --git a/tests/spec/SpecHelper.js b/tests/spec/SpecHelper.js
index bea917baad..4037fe1916 100644
--- a/tests/spec/SpecHelper.js
+++ b/tests/spec/SpecHelper.js
@@ -51,7 +51,10 @@ function decorateDocument(doc, opts) {
var path = opts.jsPath || "../js/";
var loader = this.ownerDocument.createElement("script");
var config = this.ownerDocument.createElement("script");
- var configText = "var respecConfig = " + JSON.stringify(opts.config || {}) + ";";
+ var configText = "";
+ if (opts.config) {
+ configText = "var respecConfig = " + JSON.stringify(opts.config || {}) + ";";
+ }
config.classList.add("remove");
config.innerText = configText;
var loadAttr = {
diff --git a/tests/spec/core/pre-process-spec.html b/tests/spec/core/pre-process-spec.html
new file mode 100644
index 0000000000..26582932bf
--- /dev/null
+++ b/tests/spec/core/pre-process-spec.html
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+ FAIL
+ FAIL
+ FAIL
+ FAIL
+ FAIL
+
diff --git a/tests/spec/core/pre-process-spec.js b/tests/spec/core/pre-process-spec.js
new file mode 100644
index 0000000000..a70d0e71d0
--- /dev/null
+++ b/tests/spec/core/pre-process-spec.js
@@ -0,0 +1,29 @@
+"use strict";
+describe("Core - preProcess, postProcess, afterEnd", () => {
+ afterAll(done => {
+ flushIframes();
+ done();
+ });
+ let doc;
+
+ beforeAll(done => {
+ const ops = makeStandardOps();
+ ops.config = null; // use src doc's config
+ const cb = iframe => {
+ doc = iframe;
+ done();
+ };
+ makeRSDoc(ops, cb, "spec/core/pre-process-spec.html");
+ });
+
+ it("runs the preProcess and postProces arrays", () => {
+ expect(doc.querySelector("#pre-sync").innerHTML).toEqual("pass");
+ expect(doc.querySelector("#pre-async").innerHTML).toEqual("pass");
+ expect(doc.querySelector("#post-sync").innerHTML).toEqual("pass");
+ expect(doc.querySelector("#post-async").innerHTML).toEqual("pass");
+ });
+
+ it("runs afterEnd method", () => {
+ expect(doc.querySelector("#afterend").innerHTML).toEqual("pass");
+ });
+});
diff --git a/tests/testFiles.json b/tests/testFiles.json
index 4e4dcdcfac..b164cafcde 100644
--- a/tests/testFiles.json
+++ b/tests/testFiles.json
@@ -19,6 +19,7 @@
"spec/core/jquery-enhanced-spec.js",
"spec/core/markdown-spec.js",
"spec/core/override-configuration-spec.js",
+ "spec/core/pre-process-spec.js",
"spec/core/ready-promise-spec.js",
"spec/core/remove-respec-spec.js",
"spec/core/requirements-spec.js",