mirror of
https://github.com/discourse/discourse.git
synced 2024-11-21 16:38:15 -06:00
DEV: Allow afterFramePaint to be used in tests (#27231)
We need to register a waiter so that `settled()` will wait for `runAfterFramePaint()` callbacks to be run before proceeding.
Re-lands 63b7b598cb
, but wrapped with `isTesting()` to avoid production errors.
This commit is contained in:
parent
9b11e9a8d1
commit
4dbd072eae
@ -1,8 +1,18 @@
|
|||||||
|
import DEBUG from "@glimmer/env";
|
||||||
|
import { registerWaiter } from "@ember/test";
|
||||||
|
import { isTesting } from "discourse-common/config/environment";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs `callback` shortly after the next browser Frame is produced.
|
* Runs `callback` shortly after the next browser Frame is produced.
|
||||||
* ref: https://webperf.tips/tip/measuring-paint-time
|
* ref: https://webperf.tips/tip/measuring-paint-time
|
||||||
*/
|
*/
|
||||||
export default function runAfterFramePaint(callback) {
|
export default function runAfterFramePaint(callback) {
|
||||||
|
let done = false;
|
||||||
|
|
||||||
|
if (DEBUG && isTesting()) {
|
||||||
|
registerWaiter(() => done);
|
||||||
|
}
|
||||||
|
|
||||||
// Queue a "before Render Steps" callback via requestAnimationFrame.
|
// Queue a "before Render Steps" callback via requestAnimationFrame.
|
||||||
requestAnimationFrame(() => {
|
requestAnimationFrame(() => {
|
||||||
// MessageChannel is one of the highest priority task queues
|
// MessageChannel is one of the highest priority task queues
|
||||||
@ -10,7 +20,10 @@ export default function runAfterFramePaint(callback) {
|
|||||||
const messageChannel = new MessageChannel();
|
const messageChannel = new MessageChannel();
|
||||||
|
|
||||||
// Setup the callback to run in a Task
|
// Setup the callback to run in a Task
|
||||||
messageChannel.port1.onmessage = callback;
|
messageChannel.port1.onmessage = () => {
|
||||||
|
done = true;
|
||||||
|
callback();
|
||||||
|
};
|
||||||
|
|
||||||
// Queue the Task on the Task Queue
|
// Queue the Task on the Task Queue
|
||||||
messageChannel.port2.postMessage(undefined);
|
messageChannel.port2.postMessage(undefined);
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
import { settled } from "@ember/test-helpers";
|
||||||
|
import { setupTest } from "ember-qunit";
|
||||||
|
import { module, test } from "qunit";
|
||||||
|
import runAfterFramePaint from "discourse/lib/after-frame-paint";
|
||||||
|
|
||||||
|
module("Unit | Lib | afterFramePaint", function (hooks) {
|
||||||
|
setupTest(hooks);
|
||||||
|
|
||||||
|
test("should run callback correctly", async function (assert) {
|
||||||
|
let callbackDone = false;
|
||||||
|
runAfterFramePaint(() => (callbackDone = true));
|
||||||
|
assert.false(callbackDone, "callback was not run immediately");
|
||||||
|
await settled();
|
||||||
|
assert.true(callbackDone, "callback was run before settled resolved");
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue
Block a user