/* Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

ignoreAllUncaughtExceptions();

add_task(async function () {
  info("Check POST search engine support");
  await SpecialPowers.pushPrefEnv({
    set: [
      [
        "browser.newtabpage.activity-stream.improvesearch.handoffToAwesomebar",
        false,
      ],
    ],
  });

  let currEngine = await Services.search.getDefault();

  await BrowserTestUtils.withNewTab(
    { gBrowser, url: "about:home" },
    async browser => {
      let observerPromise = new Promise(resolve => {
        let searchObserver = async function search_observer(
          subject,
          topic,
          data
        ) {
          let engine = subject.QueryInterface(Ci.nsISearchEngine);
          info("Observer: " + data + " for " + engine.name);

          if (data != "engine-added") {
            return;
          }

          if (engine.name != "POST Search") {
            return;
          }

          Services.obs.removeObserver(
            searchObserver,
            "browser-search-engine-modified"
          );

          resolve(engine);
        };

        Services.obs.addObserver(
          searchObserver,
          "browser-search-engine-modified"
        );
      });

      let engine;
      await promiseContentSearchChange(browser, async () => {
        Services.search.addOpenSearchEngine(
          // eslint-disable-next-line @microsoft/sdl/no-insecure-url
          "http://test:80/browser/browser/base/content/test/about/POSTSearchEngine.xml",
          null
        );

        engine = await observerPromise;
        Services.search.setDefault(
          engine,
          Ci.nsISearchService.CHANGE_REASON_UNKNOWN
        );
        return engine.name;
      });

      // Ready to execute the tests!
      let needle = "Search for something awesome.";

      let promise = BrowserTestUtils.browserLoaded(browser);
      await SpecialPowers.spawn(browser, [{ needle }], async function (args) {
        let doc = content.document;
        let el = doc.querySelector(["#searchText", "#newtab-search-text"]);
        el.value = args.needle;
        doc.getElementById("searchSubmit").click();
      });

      await promise;

      // When the search results load, check them for correctness.
      await SpecialPowers.spawn(browser, [{ needle }], async function (args) {
        let loadedText = content.document.body.textContent;
        ok(loadedText, "search page loaded");
        is(
          loadedText,
          "searchterms=" + escape(args.needle.replace(/\s/g, "+")),
          "Search text should arrive correctly"
        );
      });

      await Services.search.setDefault(
        currEngine,
        Ci.nsISearchService.CHANGE_REASON_UNKNOWN
      );
      try {
        await Services.search.removeEngine(engine);
      } catch (ex) {}
    }
  );
  await SpecialPowers.popPrefEnv();
});
