/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";

var {
  SpreadArgs,
} = ExtensionCommon;

var {
  ExtensionError,
} = ExtensionUtils;

this.devtools_network = class extends ExtensionAPI {
  getAPI(context) {
    return {
      devtools: {
        network: {
          onNavigated: new EventManager(context, "devtools.onNavigated", fire => {
            let listener = data => {
              fire.async(data.url);
            };

            let targetPromise = getDevToolsTargetForContext(context);
            targetPromise.then(target => {
              target.on("navigate", listener);
            });
            return () => {
              targetPromise.then(target => {
                target.off("navigate", listener);
              });
            };
          }).api(),

          getHAR: function() {
            return context.devToolsToolbox.getHARFromNetMonitor();
          },

          onRequestFinished: new EventManager(context, "devtools.network.onRequestFinished", fire => {
            const listener = (data) => {
              fire.async(data);
            };

            const toolbox = context.devToolsToolbox;
            toolbox.addRequestFinishedListener(listener);

            return () => {
              toolbox.removeRequestFinishedListener(listener);
            };
          }).api(),

          // The following method is used internally to allow the request API
          // piece that is running in the child process to ask the parent process
          // to fetch response content from the back-end.
          Request: {
            async getContent(requestId) {
              return context.devToolsToolbox.fetchResponseContent(requestId)
                .then(({content}) => new SpreadArgs([content.text, content.mimeType]))
                .catch(err => {
                  const debugName = context.extension.policy.debugName;
                  const errorMsg = "Unexpected error while fetching response content";
                  Cu.reportError(`${debugName}: ${errorMsg} for ${requestId}: ${err}`);
                  throw new ExtensionError(errorMsg);
                });
            },
          },
        },
      },
    };
  }
};
