blob: 2a00474bdf9f0a349380952c6b801a3e9d0de6e8 [file] [log] [blame]
// 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/time.mojom";
import "mojo/public/mojom/base/unguessable_token.mojom";
import "services/network/public/mojom/cross_origin_embedder_policy.mojom";
import "services/network/public/mojom/url_loader.mojom";
import "third_party/blink/public/mojom/service_worker/controller_service_worker_mode.mojom";
import "third_party/blink/public/mojom/service_worker/dispatch_fetch_event_params.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_fetch_response_callback.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_object.mojom";
import "third_party/blink/public/mojom/web_feature/web_feature.mojom";
// Represents a service worker that is a 'controller'.
// (https://w3c.github.io/ServiceWorker/#navigator-service-worker-controller)
// One of its Mojo end points (i.e. the caller end) is passed to the
// controllee in the renderer process, and used from there. Its other Mojo
// end point (i.e. the destination of the events) is implemented by
// ControllerServiceWorkerImpl in the renderer process where the controller
// service worker runs.
//
// The controllees use this interface to directly talk to the controller. This
// implements a small subset of the ServiceWorker interface, namely dispatch
// methods for Fetch and PostMessage, because ordering must be preserved
// between them: controller.postMessage(...), controller.fetch(‘...’); from
// the page must result in a message event then fetch event dispatched to the
// service worker. They are believed to be the only events whose ordering
// guarantee is observable from the page context.
interface ControllerServiceWorker {
// Dispatches Fetch event for sub-resources. (Fetch for main resource is
// handled by the ServiceWorker interface, as the fetch is initiated
// in the browser-process during the navigation)
// The callback is called once the event finishes, which means the event
// handler ran and all outstanding respondWith() and waitUntil() promises have
// settled. |response_callback| is called once the promise to respondWith()
// settles, or when the event handler ran without calling respondWith().
DispatchFetchEventForSubresource(
blink.mojom.DispatchFetchEventParams params,
pending_remote<blink.mojom.ServiceWorkerFetchResponseCallback> response_callback)
=> (blink.mojom.ServiceWorkerEventStatus status);
// TODO(kinuko): Add DispatchExtendableMessageEvent() as well.
// Connects a new pipe to this controller instance.
// |cross_origin_embedder_policy| is the policy for the client which uses the
// counterpart of |receiver|.
// |coep_reporter| is the endpoint to report the error raised by the CORP
// validation based on |cross_origin_embedder_policy|. This can be null when
// it's not supported yet.
Clone(pending_receiver<ControllerServiceWorker> receiver,
network.mojom.CrossOriginEmbedderPolicy cross_origin_embedder_policy,
pending_remote<network.mojom.CrossOriginEmbedderPolicyReporter>?
coep_reporter);
};
// A convenient struct that packs necessary information for a service worker
// client to talk to and set up its controller. Used to propagate controller
// information from the browser process to the renderer process on navigation
// commit, and also as a parameter of ServiceWorkerContainer.SetController().
struct ControllerServiceWorkerInfo {
// Describes whether there is a controller and it has a fetch event handler.
blink.mojom.ControllerServiceWorkerMode mode =
blink.mojom.ControllerServiceWorkerMode.kNoController;
// Non-null iff there is a controller and it has a fetch event handler.
pending_remote<ControllerServiceWorker>? remote_controller;
// The client being controlled, used for FetchEvent#clientId. The ID is
// issued by the browser process for this receiving client, and would
// never change thoughout the lifetime of the client.
// TODO(bashi): Consider having a separate struct for passing this kind of
// information, as this isn't really a part of controller info.
string client_id;
// This also identifies the client. Used to set |fetch_window_id| on
// network::ResourceRequests originating from the client's context. Null if
// this client is not a window.
mojo_base.mojom.UnguessableToken? fetch_request_window_id;
// Represents ServiceWorkerContainer#controller.
// Null if there is no controller.
blink.mojom.ServiceWorkerObjectInfo? object_info;
// The set of features the controller has used, for UseCounter purposes.
array<WebFeature> used_features;
};
// A renderer-side interface for talking across threads. The main thread
// uses this interface to update a ControllerServiceWorkerConnector on a
// different thread with a new controller service worker.
// TODO(kinuko): Stop using mojo interface for this, we can just make
// it work via posting tasks.
interface ControllerServiceWorkerConnector {
// Resets the controller connection with the given |controller|, this
// can be called when a new controller is given, e.g. due to claim().
// |controller| can be null if it gets no controller.
UpdateController(pending_remote<ControllerServiceWorker>? controller);
};