"use strict";

const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;

Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");

XPCOMUtils.defineLazyModuleGetter(this, "Extension",
                                  "resource://gre/modules/Extension.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "ExtensionData",
                                  "resource://gre/modules/Extension.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "NetUtil",
                                  "resource://gre/modules/NetUtil.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Schemas",
                                  "resource://gre/modules/Schemas.jsm");
XPCOMUtils.defineLazyModuleGetter(this, "Services",
                                  "resource://gre/modules/Services.jsm");

Cu.import("resource://gre/modules/ExtensionManagement.jsm");

/* exported normalizeManifest */

let BASE_MANIFEST = {
  "applications": {"gecko": {"id": "test@web.ext"}},

  "manifest_version": 2,

  "name": "name",
  "version": "0",
};

ExtensionManagement.registerSchema("chrome://browser/content/schemas/commands.json");

function* normalizeManifest(manifest, baseManifest = BASE_MANIFEST) {
  const {Management} = Cu.import("resource://gre/modules/Extension.jsm", {});

  yield Management.lazyInit();

  let errors = [];
  let context = {
    url: null,

    logError: error => {
      errors.push(error);
    },

    preprocessors: {},
  };

  manifest = Object.assign({}, baseManifest, manifest);

  let normalized = Schemas.normalize(manifest, "manifest.WebExtensionManifest", context);
  normalized.errors = errors;

  return normalized;
}
