Cu.import("resource://gre/modules/Promise.jsm"); const SINGLE_TRY_TIMEOUT = 100; const NUMBER_OF_TRIES = 30; function waitForConditionPromise(condition, timeoutMsg, tryCount=NUMBER_OF_TRIES) { let defer = Promise.defer(); let tries = 0; function checkCondition() { if (tries >= tryCount) { defer.reject(timeoutMsg); } var conditionPassed; try { conditionPassed = condition(); } catch (e) { return defer.reject(e); } if (conditionPassed) { return defer.resolve(); } tries++; setTimeout(checkCondition, SINGLE_TRY_TIMEOUT); } setTimeout(checkCondition, SINGLE_TRY_TIMEOUT); return defer.promise; } function waitForCondition(condition, nextTest, errorMsg) { waitForConditionPromise(condition, errorMsg).then(nextTest, (reason) => { ok(false, reason + (reason.stack ? "\n" + e.stack : "")); }); }