// Copyright 2017 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.

module blink.mojom;

import "mojo/public/mojom/base/file_path.mojom";
import "mojo/public/mojom/base/time.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
import "services/network/public/mojom/chunked_data_pipe_getter.mojom";
import "services/network/public/mojom/fetch_api.mojom";
import "services/network/public/mojom/url_loader.mojom";
import "third_party/blink/public/mojom/blob/serialized_blob.mojom";
import "third_party/blink/public/mojom/loader/request_context_frame_type.mojom";
import "third_party/blink/public/mojom/loader/referrer.mojom";
import "url/mojom/url.mojom";


// Type of the context associated with a request.
// https://fetch.spec.whatwg.org/#concept-request-destination.
// TODO(https://crbug.com/889751): Fetch now defines this concept as a request's
// "destination", represented as the enum
// network::mojom::RequestDestination. We should use that enum rather
// than this one.
enum RequestContextType {
  UNSPECIFIED,
  AUDIO,
  BEACON,
  CSP_REPORT,
  DOWNLOAD,
  EMBED,
  EVENT_SOURCE,
  FAVICON,
  FETCH,
  FONT,
  FORM,
  FRAME,
  HYPERLINK,
  IFRAME,
  IMAGE,
  IMAGE_SET,
  IMPORT,
  INTERNAL,
  LOCATION,
  MANIFEST,
  OBJECT,
  PING,
  PLUGIN,
  PREFETCH,
  SCRIPT,
  SERVICE_WORKER,
  SHARED_WORKER,
  SUBRESOURCE,
  SUBRESOURCE_WEBBUNDLE,
  STYLE,
  TRACK,
  VIDEO,
  WORKER,
  XML_HTTP_REQUEST,
  XSLT,
};

// https://fetch.spec.whatwg.org/#concept-request-cache-mode
enum FetchCacheMode {
  // "default": Fetch will inspect the HTTP cache on the way to the network. If
  // there is a fresh response it will be used. If there is a stale response a
  // conditional request will be created, and a normal request otherwise. It
  // then updates the HTTP cache with the response.
  kDefault,

  // "no-store": Fetch behaves as if there is no HTTP cache at all.
  kNoStore,

  // "reload": Fetch behaves as if there is no HTTP cache on the way to the
  // network. Ergo, it creates a normal request and updates the HTTP cache with
  // the response.
  kBypassCache,

  // "no-cache": Fetch creates a conditional request if there is a response in
  // the HTTP cache and a normal request otherwise. It then updates the HTTP
  // cache with the response.
  kValidateCache,

  // "force-cache": Fetch uses any response in the HTTP cache matching the
  // request, not paying attention to staleness. If there was no response, it
  // creates a normal request and updates the HTTP cache with the response.
  kForceCache,

  // "only-if-cached": Fetch uses any response in the HTTP cache matching the
  // request, not paying attention to staleness. If there was no response, it
  // returns a network error.
  kOnlyIfCached,

  // Unspecified ones
  // Similar to ONLY_IF_CACHED, but checks freshness strictly.
  kUnspecifiedOnlyIfCachedStrict,
  // Used by devtools to trigger a request which ends up in CACHE_MISS.
  kUnspecifiedForceCacheMiss,
};

// Corresponds to Fetch request's "importance mode"
// Currently discussed at: https://github.com/WICG/priority-hints
// TODO(domfarolino): add a spec link to this once specified.
enum FetchImportanceMode {
  kImportanceLow,
  kImportanceAuto,
  kImportanceHigh
};

// Request headers for FetchAPIRequest. This is typemapped to a container with a
// case insensitive compare or hash function.
struct FetchAPIRequestHeaders {
  map<string, string> headers;
};

// Struct representing a Body for a Request:
// https://fetch.spec.whatwg.org/#body
// This has the same members definition with network.mojom.URLRequestBody, which
// aims to pass around body for network.mojom.URLRequest. Both of them are
// typemapped to scoped_refptr<network::ResourceRequestBody> for the default
// variant, the only difference is for the Blink variant that
// network.mojom.URLRequestBody still is typemapped to
// scoped_refptr<network::ResourceRequestBody> but this is typemapped to
// scoped_refptr<blink::EncodedFormData>.
struct FetchAPIRequestBody {
  // The body contents. DataElementChunkedDataPipe can be used in `elements`
  // only if `elements` consists of one element.
  array<network.mojom.DataElement> elements;

  // Identifies a particular upload instance, which is used by the cache to
  // formulate a cache key.
  uint64 identifier;

  // Indicates whether the post data contains sensitive information like
  // passwords.
  bool contains_sensitive_info;
};

// Struct representing a Request:
// https://fetch.spec.whatwg.org/#request-class
// Compared to network.mojom.URLRequest which is kind of internal data in the
// loading stack, FetchAPIRequest acts as a direct representation of the JS
// Request object in all API implementations like Background Fetch, Cache
// Storage and Service Worker, with no need to care how the loading logic
// happens.
// Note: When updating this struct, also update
// content/common/fetch/fetch_request_type_converters.cc.
struct FetchAPIRequest {
  network.mojom.RequestMode mode = network.mojom.RequestMode.kNoCors;
  bool is_main_resource_load = false;
  network.mojom.RequestDestination destination = network.mojom.RequestDestination.kEmpty;
  RequestContextFrameType frame_type = RequestContextFrameType.kNone;
  url.mojom.Url url;
  string method;
  FetchAPIRequestHeaders headers;

  // Note: |blob| and |body| are mutually exclusive.
  // |blob| is used in implementing Background Fetch APIs.
  // |body| is used to represent the FetchEvent#request#body dispatched to
  // service workers.
  // TODO(crbug.com/911930): Remove |blob| and use |body| instead everywhere.
  SerializedBlob? blob;
  FetchAPIRequestBody? body;

  Referrer? referrer;
  network.mojom.CredentialsMode credentials_mode =
    network.mojom.CredentialsMode.kOmit;
  FetchCacheMode cache_mode = FetchCacheMode.kDefault;
  network.mojom.RedirectMode redirect_mode =
    network.mojom.RedirectMode.kFollow;
  string? integrity;
  network.mojom.RequestPriority priority = network.mojom.RequestPriority.kIdle;

  // Id of the original requestor window.
  // See network::ResourceRequest::fetch_window_id.
  mojo_base.mojom.UnguessableToken? fetch_window_id;

  bool keepalive = false;
  bool is_reload = false;
  bool is_history_navigation = false;

  // A V8 stack id string describing where the request was initiated.
  // DevTools can use this to display the initiator call stack when debugging
  // a process that later intercepts the request, e.g., in a service worker
  // fetch event handler.
  string? devtools_stack_id;
};
