const scrollHtml = 'blank'; add_task(async function () { let url = "data:text/html;base64," + btoa(scrollHtml); await BrowserTestUtils.withNewTab( { gBrowser, url }, async function (browser) { let awaitFindResult = new Promise(resolve => { let listener = { onFindResult(aData) { info("got find result"); browser.finder.removeResultListener(listener); Assert.equal( aData.result, Ci.nsITypeAheadFind.FIND_FOUND, "should find string" ); resolve(); }, onCurrentSelection() {}, onMatchesCountResult() {}, }; info( "about to add results listener, open find bar, and send 'F' string" ); browser.finder.addResultListener(listener); }); await gFindBarPromise; gFindBar.onFindCommand(); EventUtils.sendString("F"); info("added result listener and sent string 'F'"); await awaitFindResult; // scroll textarea to bottom await SpecialPowers.spawn(browser, [], () => { let textarea = content.document.getElementById("textarea1"); textarea.scrollTop = textarea.scrollHeight; }); BrowserTestUtils.startLoadingURIString(browser, "about:blank"); await BrowserTestUtils.browserLoaded(browser); Assert.equal( browser.currentURI.spec, "about:blank", "got load event for about:blank" ); let awaitFindResult2 = new Promise(resolve => { let listener = { onFindResult() { info("got find result #2"); browser.finder.removeResultListener(listener); resolve(); }, onCurrentSelection() {}, onMatchesCountResult() {}, }; browser.finder.addResultListener(listener); info("added result listener"); }); // find again needs delay for crash test setTimeout(function () { // ignore exception if occured try { info("about to send find again command"); gFindBar.onFindAgainCommand(false); info("sent find again command"); } catch (e) { info("got exception from onFindAgainCommand: " + e); } }, 0); await awaitFindResult2; } ); });