// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Put Mojo definitions into their own namespace to avoid collisions with C++
// definitions.
// TODO(amistry): Resolve the conflict between these two sets of definitions.
module net.interfaces;

import "host_resolver_service.mojom";

// Mirror of net::ProxyServer::Scheme.
enum ProxyScheme {
  INVALID,
  DIRECT,
  HTTP,
  SOCKS4,
  SOCKS5,
  HTTPS,
  QUIC,
};

// Mirror of net::ProxyServer.
struct ProxyServer {
  ProxyScheme scheme;

  // |host| and |port| are only valid if |scheme| is not INVALID or DIRECT.
  string? host;
  uint16 port;
};

interface ProxyResolver {
  // Use a ProxyResolverRequestClient instead of returning a result so we can
  // receive load state updates and cancel in-flight requests by destroying the
  // client.
  // TODO(amistry): Add BoundNetLog.
  GetProxyForUrl(string url, ProxyResolverRequestClient client);
};

interface ProxyResolverRequestClient {
  ReportResult(int32 error, array<ProxyServer>? proxy_servers);
  LoadStateChanged(int32 load_state);
};

interface ProxyResolverErrorObserver {
  OnPacScriptError(int32 line_number, string error);
};

interface ProxyResolverFactory {
  // TODO(amistry): Add NetLog.
  CreateResolver(string pac_script,
                 ProxyResolver& resolver,
                 HostResolver host_resolver,
                 ProxyResolverErrorObserver? error_observer,
                 ProxyResolverFactoryRequestClient client);
};

interface ProxyResolverFactoryRequestClient {
  ReportResult(int32 error);
};
