const HOST = "https://example.com";
const URL = HOST + "/browser/toolkit/components/passwordmgr/test/browser/form_basic.html";
const TIMEOUT_PREF = "signon.masterPasswordReprompt.timeout_ms";

// Waits for the master password prompt and cancels it.
function waitForDialog() {
  let dialogShown = TestUtils.topicObserved("common-dialog-loaded");
  return dialogShown.then(function([subject]) {
    let dialog = subject.Dialog;
    is(dialog.args.title, "Password Required");
    dialog.ui.button1.click();
  });
}

// Test that autocomplete does not trigger a master password prompt
// for a certain time after it was cancelled.
add_task(function* test_mpAutocompleteTimeout() {
  let login = LoginTestUtils.testData.formLogin({
    hostname: "https://example.com",
    formSubmitURL: "https://example.com",
    username: "username",
    password: "password",
  });
  Services.logins.addLogin(login);
  LoginTestUtils.masterPassword.enable();

  registerCleanupFunction(function() {
    LoginTestUtils.masterPassword.disable();
    Services.logins.removeAllLogins();
  });

  // Set master password prompt timeout to 3s.
  // If this test goes intermittent, you likely have to increase this value.
  yield SpecialPowers.pushPrefEnv({set: [[TIMEOUT_PREF, 3000]]});

  // Wait for initial master password dialog after opening the tab.
  let dialogShown = waitForDialog();

  yield BrowserTestUtils.withNewTab(URL, function*(browser) {
    yield dialogShown;

    yield ContentTask.spawn(browser, null, function*() {
      // Focus the password field to trigger autocompletion.
      content.document.getElementById("form-basic-password").focus();
    });

    // Wait 4s, dialog should not have been shown
    // (otherwise the code below will not work).
    yield new Promise((c) => setTimeout(c, 4000));

    dialogShown = waitForDialog();
    yield ContentTask.spawn(browser, null, function*() {
      // Re-focus the password field to trigger autocompletion.
      content.document.getElementById("form-basic-username").focus();
      content.document.getElementById("form-basic-password").focus();
    });
    yield dialogShown;
  });
});
