summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/common/worklet-reftest.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/common/worklet-reftest.js')
-rw-r--r--testing/web-platform/tests/common/worklet-reftest.js50
1 files changed, 50 insertions, 0 deletions
diff --git a/testing/web-platform/tests/common/worklet-reftest.js b/testing/web-platform/tests/common/worklet-reftest.js
new file mode 100644
index 0000000000..e05d4ee801
--- /dev/null
+++ b/testing/web-platform/tests/common/worklet-reftest.js
@@ -0,0 +1,50 @@
+/**
+ * Imports code into a worklet. E.g.
+ *
+ * importWorklet(CSS.paintWorklet, {url: 'script.js'});
+ * importWorklet(CSS.paintWorklet, '(javascript string)');
+ *
+ * @param {Worklet} worklet
+ * @param {(Object|string)} code
+ */
+function importWorklet(worklet, code) {
+ let url;
+ if (typeof code === 'object') {
+ url = code.url;
+ } else {
+ const blob = new Blob([code], {type: 'text/javascript'});
+ url = URL.createObjectURL(blob);
+ }
+
+ return worklet.addModule(url);
+}
+
+/** @private */
+async function animationFrames(frames) {
+ for (let i = 0; i < frames; i++)
+ await new Promise(requestAnimationFrame);
+}
+
+/** @private */
+async function workletPainted() {
+ await animationFrames(2);
+}
+
+/**
+ * To make sure that we take the snapshot at the right time, we do double
+ * requestAnimationFrame. In the second frame, we take a screenshot, that makes
+ * sure that we already have a full frame.
+ *
+ * @param {Worklet} worklet
+ * @param {(Object|string)} code
+ */
+async function importWorkletAndTerminateTestAfterAsyncPaint(worklet, code) {
+ if (typeof worklet === 'undefined') {
+ takeScreenshot();
+ return;
+ }
+
+ await importWorklet(worklet, code);
+ await workletPainted();
+ takeScreenshot();
+}