#!mojo mojo:js_content_handler

define("main", [
  "mojo/public/interfaces/network/url_request.mojom",
  "mojo/public/js/core",
  "mojo/services/network/public/interfaces/network_service.mojom",
  "mojo/services/public/js/application",
  "services/js/test/network_test_service.mojom",
], function(urlRequestMojom,
            core,
            networkServiceMojom,
            application,
            networkTestServiceMojom) {

  const Application = application.Application;
  const NetworkService = networkServiceMojom.NetworkService;
  const URLRequest = urlRequestMojom.URLRequest;
  const NetworkTestService = networkTestServiceMojom.NetworkTestService;

  class NetworkTestServiceImpl {
    constructor(app) {
      this.app = app;
      var netService = app.shell.connectToService(
          "mojo:network_service", NetworkService);
      var urlLoader;
      netService.createURLLoader(function(x){urlLoader = x;});
      this.urlLoader = urlLoader;
    }

    getFileSize(url) {
      var impl = this;
      return new Promise(function(resolve) {
        var urlRequest = new URLRequest({
          url: url,
          method: "GET",
          auto_follow_redirects: true
        });
        impl.urlLoader.start(urlRequest).then(function(result) {
          core.drainData(result.response.body).then(
            function(result) {
              resolve({ok: true, size: result.buffer.byteLength});
            });
        }).catch(function() {
          resolve({ok: false});
        });
      });
    }

    quit() {
      this.app.quit();
    }
  }

  class NetworkTest extends Application {
    acceptConnection(url, serviceExchange) {
      serviceExchange.provideService(
          NetworkTestService,
          NetworkTestServiceImpl.bind(null, this));
    }
  }

  return NetworkTest;
});
