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

"use strict";

// Enable web manifest processing.
Services.prefs.setBoolPref("dom.manifest.enabled", true);

add_task(async function() {
  info("Testing fetching a valid manifest");
  const response = await fetchManifest("application-manifest-basic.html");

  ok(
    response.manifest && response.manifest.name == "FooApp",
    "Returns an object populated with the manifest data"
  );
});

add_task(async function() {
  info("Testing fetching an existing manifest with invalid values");
  const response = await fetchManifest("application-manifest-warnings.html");

  ok(
    response.manifest && response.manifest.moz_validation,
    "Returns an object populated with the manifest data"
  );

  const warnings = response.manifest.moz_validation;
  ok(
    warnings.length === 1 &&
      warnings[0].warn &&
      warnings[0].warn.includes("name member to be a string"),
    "The returned object contains the expected warning info"
  );
});

add_task(async function() {
  info("Testing fetching a manifest in a page that does not have one");
  const response = await fetchManifest("application-manifest-no-manifest.html");

  is(response.manifest, null, "Returns an object with a `null` manifest");
  ok(!response.errorMessage, "Does not return an error message");
});

add_task(async function() {
  info("Testing an error happening fetching a manifest");
  // the page that we are testing contains an invalid URL for the manifest
  const response = await fetchManifest(
    "application-manifest-404-manifest.html"
  );

  is(response.manifest, null, "Returns an object with a `null` manifest");
  ok(
    response.errorMessage &&
      response.errorMessage.toLowerCase().includes("404 - not found"),
    "Returns the expected error message"
  );
});

add_task(async function() {
  info("Testing a validation error when fetching a manifest with invalid JSON");
  const response = await fetchManifest(
    "application-manifest-invalid-json.html"
  );
  ok(
    response.manifest && response.manifest.moz_validation,
    "Returns an object with validation data"
  );
  const validation = response.manifest.moz_validation;
  ok(
    validation.find(x => x.error && x.type === "json"),
    "Has the expected error in the validation field"
  );
});

async function fetchManifest(filename) {
  const url = MAIN_DOMAIN + filename;
  const target = await addTabTarget(url);

  info("Initializing manifest front for tab");
  const manifestFront = await target.getFront("manifest");

  info("Fetching manifest");
  const response = await manifestFront.fetchCanonicalManifest();

  return response;
}
