const scrollHtml =
  '<textarea id="textarea1" row=2>Firefox\n\nFirefox\n\n\n\n\n\n\n\n\n\n' +
  '</textarea><a href="about:blank">blank</a>';

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);

          ok(
            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.loadURI(browser, "about:blank");
    await BrowserTestUtils.browserLoaded(browser);

    ok(
      browser.currentURI.spec == "about:blank",
      "got load event for about:blank"
    );

    let awaitFindResult2 = new Promise(resolve => {
      let listener = {
        onFindResult(aData) {
          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;
  });
});
