add_task(async function() {
  let testcases = [
    ["example", "http://www.example.net/", { shiftKey: true }],
    // Check that a direct load is not overwritten by a previous canonization.
    ["http://example.com/test/", "http://example.com/test/", {}],
    ["ex-ample", "http://www.ex-ample.net/", { shiftKey: true }],
    ["  example ", "http://www.example.net/", { shiftKey: true }],
    [" example/foo ", "http://www.example.net/foo", { shiftKey: true }],
    [" example/foo bar ", "http://www.example.net/foo%20bar", { shiftKey: true }],
    ["example.net", "http://example.net/", { shiftKey: true }],
    ["http://example", "http://example/", { shiftKey: true }],
    ["example:8080", "http://example:8080/", { shiftKey: true }],
    ["ex-ample.foo", "http://ex-ample.foo/", { shiftKey: true }],
    ["example.foo/bar ", "http://example.foo/bar", { shiftKey: true }],
    ["1.1.1.1", "http://1.1.1.1/", { shiftKey: true }],
    ["ftp://example", "ftp://example/", { shiftKey: true }],
    ["ftp.example.bar", "http://ftp.example.bar/", { shiftKey: true }],
    ["ex ample", Services.search.defaultEngine.getSubmission("ex ample", null, "keyword").uri.spec, { shiftKey: true }],
  ];

  // Disable autoFill for this test, since it could mess up the results.
  let autoFill = Preferences.get("browser.urlbar.autoFill");
  Preferences.set("browser.urlbar.autoFill", false);
  registerCleanupFunction(() => {
    Preferences.set("browser.urlbar.autoFill", autoFill);
  });

  for (let [inputValue, expectedURL, options] of testcases) {
    let promiseLoad = waitForDocLoadAndStopIt(expectedURL);
    gURLBar.focus();
    if (Object.keys(options).length > 0) {
      gURLBar.selectionStart = gURLBar.selectionEnd =
        gURLBar.inputField.value.length;
      gURLBar.inputField.value = inputValue.slice(0, -1);
      EventUtils.sendString(inputValue.slice(-1));
    } else {
      gURLBar.textValue = inputValue;
    }
    EventUtils.synthesizeKey("KEY_Enter", options);
    await promiseLoad;
  }
});
