// 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 content.mojom;

import "content/common/service_worker/controller_service_worker.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "third_party/blink/public/mojom/messaging/transferable_message.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_error_type.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom";
import "third_party/blink/public/platform/web_feature.mojom";
import "url/mojom/url.mojom";

// Used for EnsureControllerServiceWorker() to indicate why a controllee needs
// a controller ServiceWorker.
enum ControllerServiceWorkerPurpose {
  FETCH_SUB_RESOURCE
};

// ServiceWorkerContainerHost is an interface implemented by the browser
// process. The renderer process uses this interface to request the browser
// process to do operations involving service worker registrations.
//
// This interface is associated with its counterpart ServiceWorkerContainer.
// The message pipe it's used on depends on the container type.
// - For service workers:
//       Associated with EmbeddedWorkerInstanceClient, which is on a dedicated
//       message pipe.
// - For shared workers (S13nSW):
//       Associated with SharedWorkerFactory, which is on a dedicated message
//       pipe.
// - For shared workers (non-S13nSW):
//       Associated with ServiceWorkerDispatcherHost, which is on the
//       channel-associated interface to the renderer process.
// - For documents:
//       Associated with ServiceWorkerDispatcherHost, which is on the
//       channel-associated interface to the renderer process.
interface ServiceWorkerContainerHost {
  // Corresponds to navigator.serviceWorker.register().
  // Registers a service worker from |script_url| with |options|.
  // On success, |error| is kNone with |registration| set.
  // Otherwise, |error| and |error_msg| describe the failure.
  Register(url.mojom.Url script_url,
           blink.mojom.ServiceWorkerRegistrationOptions options)
    => (blink.mojom.ServiceWorkerErrorType error,
        string? error_msg,
        blink.mojom.ServiceWorkerRegistrationObjectInfo? registration);

  // Corresponds to navigator.serviceWorker.getRegistration().
  // Gets the service worker registration for the |client_url|.
  // On success, |error| is kNone with |registration| set.
  // In case there is no registration at |client_url|, or the registration is
  // uninstalling, |error| is still kNone but with null |registration|.
  // Otherwise, |error| and |error_msg| describe the failure.
  GetRegistration(url.mojom.Url client_url)
    => (blink.mojom.ServiceWorkerErrorType error,
        string? error_msg,
        blink.mojom.ServiceWorkerRegistrationObjectInfo? registration);

  // Corresponds to navigator.serviceWorker.getRegistrations().
  // Gets all service worker registrations which have the same origin with
  // the ServiceWorkerContainer that this interface hosts.
  // On success, |error| is kNone with |infos| set. Otherwise, |error| and
  // |error_msg| describe the failure.
  GetRegistrations()
    => (blink.mojom.ServiceWorkerErrorType error,
        string? error_msg,
        array<blink.mojom.ServiceWorkerRegistrationObjectInfo>? infos);

  // Corresponds to navigator.serviceWorker.ready.
  // Returns the service worker registration for the ServiceWorkerContainer that
  // this interface hosts, once such a registration exists and has an active
  // service worker.
  GetRegistrationForReady()
    => (blink.mojom.ServiceWorkerRegistrationObjectInfo? registration);

  // S13nServiceWorker:
  // Returns a Mojo end point to the controller ServiceWorker. This may start a
  // service worker instance in a renderer process if the corresponding
  // instance is not alive.
  // This method must be called only by the controllees.
  // If the browser fails to start the service worker it is propagated as a
  // connection error of the returned pipe. The detailed error reasons are not
  // reported to the controllees, but the browser process is responsible for
  // properly handling the failure and recording the reasons.
  // |purpose| is used for UMA.
  EnsureControllerServiceWorker(ControllerServiceWorker& controller,
                                ControllerServiceWorkerPurpose purpose);

  // S13nServiceWorker:
  // Makes a new endpoint to this ServiceWorkerContainerHost.
  CloneContainerHost(ServiceWorkerContainerHost& container_host);

  // Does nothing but calls the callback. Useful for pumping the message pipe
  // for this interface and associated interfaces: when the callback is called,
  // you know all incoming messages up to the Ping() call have been received.
  Ping() => ();

  // S13nServiceWorker:
  // Gives a hint to the browser process to update the service worker after a
  // controlled page load. This message is meant to be sent at a time when page
  // load is no longer busy, so update doesn't adversely affect performance.
  // The browser process can possibly coalesce hints for the same service
  // worker into a single update.
  HintToUpdateServiceWorker();
};

// ServiceWorkerContainer is an interface implemented by the renderer process.
// The browser process uses this interface to send messages to documents or the
// service worker.
//
// Roughly corresponds to the web-exposed ServiceWorkerContainer interface,
// i.e., navigator.serviceWorker. Actually, the plan is for this interface to be
// used for anything that could access a ServiceWorkerRegistration or
// ServiceWorker object. For example, ServiceWorkerGlobalScope needs to be
// connected to this, since it has self.registration, even though we don’t
// implement navigator.serviceWorker for Worker yet. But eventually anything
// that can touch these objects should be a ServiceWorkerContainer, so it’s OK
// to use this name.
//
// This interface is associated with its counterpart,
// ServiceWorkerContainerHost, as they are sent on the same master interface
// together. See ServiceWorkerContainerHost for documentation about the message
// pipe they live on.
interface ServiceWorkerContainer {
  // Corresponds to setting ServiceWorkerContainer#controller.
  // If |controller_info| is invalid (its |object_info| is null), then
  // ServiceWorkerContainer#controller is cleared.
  // If |controller_info| is valid, |used_features| is the set of
  // features the controller has used, for UseCounter purposes.
  // If |should_notify_controllerchange| is true, dispatch a 'controllerchange'
  // event.
  SetController(ControllerServiceWorkerInfo controller_info,
                array<blink.mojom.WebFeature> used_features,
                bool should_notify_controllerchange);

  // Corresponds to Client#postMessage().
  // Sends |message| from the service worker |source| to this service worker
  // client.
  PostMessageToClient(blink.mojom.ServiceWorkerObjectInfo source,
                      blink.mojom.TransferableMessage message);

  // Notifies this service worker client that its controller used a |feature|,
  // for UseCounter purposes.
  CountFeature(blink.mojom.WebFeature feature);
};
