On May 30, 2019, at 11:01 PM, Ryosuke Niwa <rniwa@webkit.org> wrote:I’m gonna give you a game changing function:function listenForEventOnce(target, name, timeout) {return new Promise((resolve, reject) => {const timer = timeout ? setTimeout(reject, timeout) : null;target.addEventListener(name, () => {if (timer)clearTimeout(timer);resolve();}, {once: true});});}You can then write a test like this:await listenForEventOnce(document.body, 'load');// do stuff after load event.await listenForEventOnce(document.querySelector('input'), 'focus');await listenForEventOnce(visualViewport, 'scroll', 5000);// After the input element is focused, then the visual viewport scrolled or 5 seconds has passed.
function waitFor(element, type) {return new Promise(resolve => {element.addEventListener(type, event => {consoleWrite(`EVENT(${event.type})`);resolve(event);}, { once: true });});}
function sleepFor(duration) {return new Promise(resolve => {setTimeout(resolve, duration);});}
function shouldReject(promise) {return new Promise((resolve, reject) => {promise.then(result => {logResult(Failed, 'Promise resolved incorrectly');reject(result);}).catch((error) => {logResult(Success, 'Promise rejected correctly');resolve(error);});});}
await Promise.race(waitFor(document.body, ‘load’), shouldReject(sleepFor(5000)));
await shouldResolve(Promise.race(waitFor(document.body, ‘load’), rejectIn(5000)));
_______________________________________________- R. Niwa
webkit-dev mailing list
webkit-dev@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-dev