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

module blink.mojom;

import "mojo/public/mojom/base/byte_size.mojom";
import "services/network/public/mojom/fetch_api.mojom";
import "services/network/public/mojom/ip_address.mojom";
import "services/network/public/mojom/ip_endpoint.mojom";
import "services/network/public/mojom/load_timing_info.mojom";
import "services/network/public/mojom/network_param.mojom";
import "services/network/public/mojom/request_priority.mojom";
import "url/mojom/origin.mojom";
import "url/mojom/url.mojom";

// DEPRECATED. Consider using network::mojom::RequestDestination instead.
// TODO(bokan): Consider renaming kMainFrame and kSubFrame to better reflect
// embedded frame trees like fenced frames (e.g. kMainFrame to
// kOutermostMainFrame and kSubFrame to kEmbeddedFrame?)
enum ResourceType {
  kMainFrame = 0,  // top level page
  kSubFrame = 1,  // frame or iframe (or fenced frame)
  kStylesheet = 2,  // a CSS stylesheet
  kScript = 3,  // an external script
  kImage = 4,  // an image (jpg/gif/png/etc)
  kFontResource = 5,  // a font
  kSubResource = 6,  // an "other" subresource.
  kObject = 7,  // an object (or embed) tag for a plugin.
  kMedia = 8,  // a media resource.
  kWorker = 9,  // the main resource of a dedicated worker.
  kSharedWorker = 10,  // the main resource of a shared worker.
  kPrefetch = 11,  // an explicitly requested prefetch
  kFavicon = 12,  // a favicon
  kXhr = 13,  // a XMLHttpRequest
  kPing = 14,  // a ping request for <a ping>/sendBeacon.
  kServiceWorker = 15,  // the main resource of a service worker.
  kCspReport = 16,  // a report of Content Security Policy violations.
  kPluginResource = 17,  // a resource that a plugin requested.
  // kNavigationPreload = 18,  // Deprecated.
  // a main-frame service worker navigation preload request.

  kNavigationPreloadMainFrame = 19,
  // a sub-frame service worker navigation preload request.
  kNavigationPreloadSubFrame = 20,
  kJson = 21,  // a JSON module (import ... with { type: "json" })
};

// Network related information reported for loads and redirects.
struct CommonNetworkInfo {
  // True if the request accessed the network in the process of retrieving data.
  bool network_accessed;

  // True if loading this resource always requires accessing the network, either
  // because it should always be revalidated or because it should not be cached.
  bool always_access_network;

  // The host IP and port of the response.
  network.mojom.IPEndPoint? remote_endpoint;
};

// Information for a redirect.
struct RedirectInfo {
  // The origin of the URL after the redirect.
  //
  // The full URL is not available, because in some cases the path and query
  // may be sanitized away - see https://crbug.com/40095391.
  url.mojom.Origin origin_of_new_url;

  // Various network related information.
  CommonNetworkInfo network_info;
};

// Information pertaining to resource loading.
// This will be passed to ResourceResponse callback methods.
struct ResourceLoadInfo {
  // An ID that uniquely identifies this request.
  int64 request_id;

  // The final URL of the response (final = after all redirects).
  // TODO(crbug.com/40095391): use SchemeHostPort if applicable.
  url.mojom.Url final_url;

  // The response referrer.
  url.mojom.Url referrer;

  // The original URL is the URL used to initialize the subresource request,
  // and it may differ from the |final_url| if the request was redirected.
  url.mojom.Url original_url;

  // The request method used to fetch this response.
  string method;

  // The request destination type.
  network.mojom.RequestDestination request_destination;

  // Loading priority of the corresponding request.
  network.mojom.RequestPriority request_priority;

  // The mime type.
  string mime_type;

  // True if the response was fetched from the network cache.
  bool was_cached;

  // Various network related information.
  CommonNetworkInfo network_info;

  // The network error code, net::OK if no error happened.
  int32 net_error;

  // The proxy chain used for this request.
  network.mojom.ProxyChain proxy_chain;

  // The timing info.
  network.mojom.LoadTimingInfo load_timing_info;

  // The size of the response body before removing any content encodings.
  // Does not include redirects or sub-requests issued at lower levels (range
  // requests or auth). Does include bytes from the cache.
  mojo_base.mojom.ByteSize raw_body_bytes;

  // The total amount of data received from network after SSL decoding and proxy
  // handling. Pertains only to the last request, i.e. reset on redirects, but
  // not reset when multiple roundtrips are used for range requests or auth.
  mojo_base.mojom.ByteSize total_received_bytes;

  // The list of redirects that led to this resource load. Empty if there were
  // no redirects.
  array<RedirectInfo> redirect_info_chain;

  // The HTTP Status Code
  int32 http_status_code;

  // True if HTTP authentication was used to fetch this response. This will not
  // be set for proxy auth.
  // This is part of an investigation so will be short lived. crbug.com/40269642
  bool did_use_server_http_auth;
};
