1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
|
/**
* @fileoverview Helper class for soft navigation tests.
*
* This class provides helper functions for soft navigation tests. It can be
* used to wait for performance entries and create promises with timeout
* messages.
*/
class SoftNavigationTestHelper {
/**
* Constructs a new instance of the helper class.
* @param {!Test} test The test object. See
* https://web-platform-tests.org/writing-tests/testharness-api.html#test-objects
*/
constructor(test) {
this.test_ = test;
}
/**
* Wraps a promise with a timeout message, so that it rejects with this
* message if it does not resolve within the given timeout.
* @param {!Promise} promise The promise to wait for.
* @param {string} message The message to use if the promise times out.
* @param {number=} timeout The timeout in milliseconds. Defaults to 1000.
* @return {!Promise} The promise with a timeout message.
*/
async withTimeoutMessage(promise, message, timeout = 1000) {
return Promise.race([
promise,
new Promise((resolve, reject) => {
this.test_.step_timeout(() => {
reject(new Error(message));
}, timeout);
}),
]);
}
/**
* Creates a new promise with a timeout message, so that it rejects with this
* message if it does not resolve within the given timeout, and otherwise
* resolves.
* @param {!Function} executor The executor function to create the promise;
* see
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/Promise#executor
* @param {string} message The message to use if the promise times out.
* @param {number=} timeout The timeout in milliseconds. Defaults to 1000.
* @return {!Promise} The promise with a timeout message.
*/
async newPromiseWithTimeoutMessage(executor, message, timeout = 1000) {
return this.withTimeoutMessage(new Promise(executor), message, timeout);
}
/**
* Waits for a number of buffered performance entries of a given type,
* optionally including soft navigation observations, with a timeout message.
* @param {string} type The type of the entries to wait for.
* @param {number} minNumEntries The minimum number of entries to wait for.
* @param {number=} timeout The timeout in milliseconds. Defaults to 1000.
* @return {!Promise} The promise, which either resolves with the entries or
* rejects with a timeout message.
*/
async getBufferedPerformanceEntriesWithTimeout(
type, minNumEntries, timeout = 1000) {
let observer;
return this
.newPromiseWithTimeoutMessage(
(resolve) => {
const entries = [];
observer = new PerformanceObserver((list) => {
entries.push(...list.getEntries());
if (entries.length >= minNumEntries) {
resolve(entries);
}
})
observer.observe({
type: type,
buffered: true,
});
},
`${minNumEntries} entries of type ${type} never arrived`,
timeout)
.finally(() => {
observer.disconnect();
});
}
/**
* Waits for a number of performance entries of a given type,
* optionally including soft navigation observations.
* @param {string} type The type of the entries to wait for.
* @param {number} minNumEntries The minimum number of entries to wait for.
* @return {!Promise} The promise, which resolves with the entries.
*/
static getPerformanceEntries(
type, minNumEntries) {
return new Promise((resolve) => {
const entries = [];
const observer = new PerformanceObserver((list) => {
entries.push(...list.getEntries());
if (entries.length >= minNumEntries) {
resolve(entries);
observer.disconnect();
}
})
observer.observe({
type: type,
});
});
}
}
|