// 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 "services/network/public/mojom/cross_origin_embedder_policy.mojom";
import "services/network/public/mojom/fetch_api.mojom";
import "third_party/blink/public/mojom/blob/blob_url_store.mojom";
import "third_party/blink/public/mojom/browser_interface_broker.mojom";
import "third_party/blink/public/mojom/loader/fetch_client_settings_object.mojom";
import "third_party/blink/public/mojom/worker/subresource_loader_updater.mojom";
import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom";
import "third_party/blink/public/mojom/worker/dedicated_worker_host.mojom";
import "third_party/blink/public/mojom/worker/worker_main_script_load_params.mojom";
import "third_party/blink/public/mojom/service_worker/controller_service_worker.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_container.mojom";
import "third_party/blink/public/mojom/tokens/tokens.mojom";
import "url/mojom/url.mojom";

// The name of the InterfaceProviderSpec in service manifests used by the
// frame tree to expose dedicated-worker-specific interfaces between renderer
// and browser.
const string kNavigation_DedicatedWorkerSpec = "navigation:dedicated_worker";

// PlzDedicatedWorker:
// An interface implemented by clients (e.g., the renderer where "new Worker()"
// was invoked) to observe events on the DedicatedWorkerHostFactory.
interface DedicatedWorkerHostFactoryClient {
  // Called when the worker host is created.
  OnWorkerHostCreated(
      // Used for accessing services from the worker.
      pending_remote<blink.mojom.BrowserInterfaceBroker>
          browser_interface_broker,
      // Used for updating its state from the worker.
      pending_remote<DedicatedWorkerHost> host);

  // Called when the worker host started loading the main worker script. This
  // is called after OnWorkerHostCreated(). This is never called when
  // OnScriptLoadStartFailed() is called.
  OnScriptLoadStarted(
      // The info about the service worker container host in the browser process
      // that provides support for this worker to be a service worker client.
      //
      // This is null if the dedicated worker cannot be a service
      // worker client, because for example, the worker's URL is
      // not http(s) or another service worker supported scheme.
      ServiceWorkerContainerInfoForClient? service_worker_container_info,

      // Used for passing the main script pre-requested by the browser process
      // and its redirect information.
      WorkerMainScriptLoadParams main_script_load_params,

      // Used for loading subresources. This also supports non-network URLs like
      // chrome-extension:// URLs.
      URLLoaderFactoryBundle subresource_loader_factories,

      // Used for updating subresource loaders after NetworkService crash.
      pending_receiver<SubresourceLoaderUpdater> subresource_loader_updater,

      // Used to make fetches from the worker go through the controller service
      // worker. This is null when there're no controller service worker.
      ControllerServiceWorkerInfo? controller_info);

  // Called when the worker host fails to start loading the main worker script.
  // This is called after OnWorkerHostCreated(). This is never called when
  // OnScriptLoadStarted() is called.
  OnScriptLoadStartFailed();
};

// An interface used to instantiate a dedicated worker host. The implementation
// of this interface lives in the browser process.
interface DedicatedWorkerHostFactory {
  // Non-PlzDedicatedWorker:
  // The factory client should call this instead of
  // CreateWorkerHostAndStartScriptLoad() when PlzDedicatedWorker is disabled.
  //
  // Creates a new DedicatedWorkerHost, and requests |browser_interface_broker|
  // to provide the worker access to mojo interfaces.
  CreateWorkerHost(
      blink.mojom.DedicatedWorkerToken token,
      pending_receiver<blink.mojom.BrowserInterfaceBroker>
          browser_interface_broker,
      pending_receiver<DedicatedWorkerHost> host) =>
    (network.mojom.CrossOriginEmbedderPolicy parent_coep);

  // PlzDedicatedWorker:
  // The factory client should call this instead of CreateWorkerHost() when
  // PlzDedicatedWorker is enabled.
  //
  // Creates a new DedicatedWorkerHost, and requests to start top-level worker
  // script loading for |script_url| using |credentials_mode| and
  // |outside_fetch_client_settings_object|.
  // |blob_url_token| should be non-null when |script_url| is a blob URL.
  // |client| is used for notifying the renderer process of results of worker
  // host creation and script loading.
  CreateWorkerHostAndStartScriptLoad(
      blink.mojom.DedicatedWorkerToken token,
      url.mojom.Url script_url,
      network.mojom.CredentialsMode credentials_mode,
      blink.mojom.FetchClientSettingsObject
          outside_fetch_client_settings_object,
      pending_remote<blink.mojom.BlobURLToken>? blob_url_token,
      pending_remote<DedicatedWorkerHostFactoryClient> client);
};
