blob: 652473e21beb204db299db9175bb347c5bce7a0f [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/read_only_buffer.mojom";
import "mojo/public/mojom/base/string16.mojom";
import "mojo/public/mojom/base/time.mojom";
import "mojo/public/mojom/base/values.mojom";
import "services/network/public/mojom/cookie_manager.mojom";
import "services/network/public/mojom/url_loader_factory.mojom";
import "third_party/blink/public/mojom/background_fetch/background_fetch.mojom";
import "third_party/blink/public/mojom/devtools/console_message.mojom";
import "third_party/blink/public/mojom/fetch/fetch_api_response.mojom";
import "third_party/blink/public/mojom/frame/reporting_observer.mojom";
import "third_party/blink/public/mojom/loader/url_loader_factory_bundle.mojom";
import "third_party/blink/public/mojom/messaging/transferable_message.mojom";
import "third_party/blink/public/mojom/notifications/notification.mojom";
import "third_party/blink/public/mojom/payments/payment_app.mojom";
import "third_party/blink/public/mojom/push_messaging/push_messaging.mojom";
import "third_party/blink/public/mojom/service_worker/dispatch_fetch_event_params.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_client.mojom";
import "third_party/blink/public/mojom/service_worker/service_worker_error_type.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/service_worker/service_worker_registration.mojom";
import "url/mojom/origin.mojom";
import "url/mojom/url.mojom";
// Host for a running service worker execution context. Implemented in the
// browser process. The service worker running in the renderer process uses this
// interface to ask the browser process to do operations needed for
// ServiceWorkerGlobalScope functionalities.
interface ServiceWorkerHost {
// Sets V8 code cache |data| for the given service worker script |url|, which
// may be the main script or an imported script.
SetCachedMetadata(url.mojom.Url url, mojo_base.mojom.ReadOnlyBuffer data);
// Clears V8 code cache for |url| set by the above |SetCachedMetadata| before.
ClearCachedMetadata(url.mojom.Url url);
// Corresponds to Clients#matchAll(options). Gets information of all service
// worker clients matching |options|.
GetClients(ServiceWorkerClientQueryOptions options)
=> (array<ServiceWorkerClientInfo> clients);
// Corresponds to Clients#get(id). Gets information of the service worker
// client with |client_uuid|. |client| is null if it was not found or is not
// same-origin with this service worker.
GetClient(string client_uuid) => (ServiceWorkerClientInfo? client);
// Corresponds to Clients#openWindow(url). Requests the browser to open a tab
// with |url|.
// If the tab was successfully opened, |success| is true. |client| contains
// information about the newly opened window, but may be null if that
// information could not be obtained (this can happen for a cross-origin
// window, or if the browser process could not get the information in time
// before the window was closed).
// If |success| is false, |error_msg| describes the failure.
OpenNewTab(url.mojom.Url url)
=> (bool success, ServiceWorkerClientInfo? client, string? error_msg);
// Corresponds to PaymentRequestEvent#openWindow(url).
// Spec: https://w3c.github.io/payment-handler/#openwindow-method
// Requests the browser to open a payment handler window with |url|.
// If the window was successfully opened, |success| is true. |client| contains
// information about the newly opened window, but may be null if that
// information could not be obtained (this can happen for a cross-origin
// window, or if the browser process could not get the information in time
// before the window was closed).
// If |success| is false, |error_msg| describes the failure.
OpenPaymentHandlerWindow(url.mojom.Url url)
=> (bool success, ServiceWorkerClientInfo? client, string? error_msg);
// Corresponds to Client#postMessage(). Requests the browser to post |message|
// to the client with |client_uuid|.
PostMessageToClient(string client_uuid, TransferableMessage message);
// Corresponds to WindowClient#focus(). Requests the browser to focus the
// client with |client_uuid|.
// On success, |client| contains service worker client information of the
// focused window.
// Otherwise, |client| is null.
FocusClient(string client_uuid) => (ServiceWorkerClientInfo? client);
// Corresponds to WindowClient#navigate(). Requests the browser to navigate
// the client with |client_uuid| to |url|.
// If the navigation was successful, |success| is true. |client| contains
// information about the navigated window, but may be null if that
// information could not be obtained (this can happen for a cross-origin
// window, or if the browser process could not get the information in time
// before the window was closed).
// If |success| is false, |error_msg| describes the failure.
NavigateClient(string client_uuid, url.mojom.Url url)
=> (bool success, ServiceWorkerClientInfo? client, string? error_msg);
// Corresponds to ServiceWorkerGlobalScope#skipWaiting(). Allows this service
// worker to progress from the registration's waiting position to active even
// while service worker clients are using the registration.
// The callback is called with |success| true when the skipWaiting() promise
// should be resolved. If |success| is false, the operation failed fatally,
// but per spec the skipWaiting() promise should be left unresolved as it can
// never reject.
SkipWaiting() => (bool success);
// Corresponds to Clients#claim(). Allows an active service worker to set
// itself as the controller for all clients within its scope.
// On success, |error| is kNone without |error_msg| set.
// Otherwise, |error| and |error_msg| describe the failure.
ClaimClients() => (ServiceWorkerErrorType error, string? error_msg);
};
struct ExtendableMessageEvent {
TransferableMessage message;
url.mojom.Origin source_origin;
// Exactly one of |source_info_for_client| and
// |source_info_for_service_worker| should be non-null.
ServiceWorkerClientInfo? source_info_for_client;
ServiceWorkerObjectInfo? source_info_for_service_worker;
};
// Indicates whether a service worker has a fetch event handler. The presence
// of the fetch event handler is determined when the service worker finishes
// installing.
// TODO(crbug.com/945505): Convert enum constants to kUnknown style.
enum FetchHandlerExistence {
// The service worker has not yet finished installing.
UNKNOWN,
// The service worker finished installing and added a fetch event handler.
EXISTS,
// The service worker finished installing without a fetch event handler.
DOES_NOT_EXIST,
};
// The number of seconds for which a 'push' and the 'pushsubsciptionchange'
// event should be allowed to run. This is not in the spec but for a
// Chrome-specific timeout. Each event dispatched to service workers has a 5
// minute timeout in the Chrome implementation, but this makes the timeout for
// push events shorter.
const int32 kPushEventTimeoutSeconds = 90;
// The default number of seconds for idle timeouts. A service worker requests
// termination when no event is running on the thread with a delay. This is the
// default value for the delay, and the delay can be updated by SetIdleDelay()
// in blink.mojom.ServiceWorker interface.
const int32 kServiceWorkerDefaultIdleDelayInSeconds = 30;
// An interface for talking to a running service worker thread. The browser
// process uses this interface to request the renderer to do things like
// dispatch events to the service worker. This interface is bound on the
// service worker thread and is implemented by ServiceWorkerGlobalScope.
//
// This is the master interface for the Mojo message pipe between the browser
// process and the service worker thread in the renderer process. Other service
// worker-related interfaces bound on the service worker thread are associated
// with this interface. These include:
// - ServiceWorkerHost for this service worker.
// - ServiceWorkerRegistrationObject(Host) for this service worker's
// self.registration property.
// - ServiceWorkerObjects(Host) for that registration's properties.
//
// A similar (but non-associated) interface is ControllerServiceWorker. That
// interface is used by service worker clients (inside renderer processes) to
// talk directly to their controller service worker, without going through the
// browser.
//
// USAGE TIP: Those DispatchEvent* messages expecting a
// (ServiceWorkerEventStatus, mojo_base.mojom.TimeTicks) callback
// are considered 'simple events'.
// ServiceWorkerVersion::CreateSimpleEventCallback can be used to create the
// callback for these.
interface ServiceWorker {
// The first message sent on this interface. It is used to associate service
// worker-related interfaces together on the service worker thread, as
// ServiceWorker is the first interface available on the
// service worker thread. It establishes the |service_worker_host| connection
// and passes information used to populate
// ServiceWorkerGlobalScope#registration object and
// ServiceWorkerGlobalScope#serviceWorker object. JavaScript execution of the
// service worker does not start until this message is received.
// |reporting_observer_receiver| will be set to the worker global scope so
// that reports queued to the remote of |reporting_observer_receiver| will
// be notified to ReportingObservers registered with the global scope.
InitializeGlobalScope(
pending_associated_remote<ServiceWorkerHost> service_worker_host,
ServiceWorkerRegistrationObjectInfo registration_info,
ServiceWorkerObjectInfo service_worker_info,
FetchHandlerExistence fetch_handler_existence,
pending_receiver<ReportingObserver>? reporting_observer_receiver);
// These methods dispatch InstallEvent and ActivateEvent to the
// ServiceWorkerGlobalScope.
// The |fetch_count| return value is the number of network fetches performed
// from the service worker context during the event handler. This is used
// for metrics.
DispatchInstallEvent()
=> (ServiceWorkerEventStatus status, uint32 fetch_count);
DispatchActivateEvent()
=> (ServiceWorkerEventStatus status);
// These methods dispatch to the ServiceWorkerGlobalScope the events listed on
// https://wicg.github.io/background-fetch/#service-worker-global-events.
// The callbacks are called once the event handler has run and waitUntil()
// promise has settled. |developer_id| and |unique_id| are documented in
// content::BackgroundFetchRegistrationId.
DispatchBackgroundFetchAbortEvent(
BackgroundFetchRegistration registration)
=> (ServiceWorkerEventStatus status);
DispatchBackgroundFetchClickEvent(
BackgroundFetchRegistration registration)
=> (ServiceWorkerEventStatus status);
DispatchBackgroundFetchFailEvent(
BackgroundFetchRegistration registration)
=> (ServiceWorkerEventStatus status);
DispatchBackgroundFetchSuccessEvent(
BackgroundFetchRegistration registration)
=> (ServiceWorkerEventStatus status);
// Dispatches the cookie change events in the Async Cookie API specification.
// https://github.com/WICG/cookie-store/
// The callback is called once the event handler has run and the waitUntil()
// promise has settled.
DispatchCookieChangeEvent(network.mojom.CookieChangeInfo change)
=> (ServiceWorkerEventStatus status);
// The Dispatch*FetchEvent() 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().
DispatchFetchEventForMainResource(
DispatchFetchEventParams params,
pending_remote<ServiceWorkerFetchResponseCallback> response_callback)
=> (ServiceWorkerEventStatus status);
DispatchNotificationClickEvent(
string notification_id,
NotificationData notification_data,
int32 action_index,
mojo_base.mojom.String16? reply)
=> (ServiceWorkerEventStatus status);
DispatchNotificationCloseEvent(
string notification_id,
NotificationData notification_data)
=> (ServiceWorkerEventStatus status);
// The payload of a push message can be valid with content, valid with empty
// content, or null.
DispatchPushEvent(string? payload)
=> (ServiceWorkerEventStatus status);
// Whenever a PushSubscription changes, a change event is generated with
// (optionally) the previous subscription and the new subscription.
// |old_subscription| can be null when there was a partial database corruption
// so that the full subscription information about the subscription that is
// going to become invalid cannot be found anymore.
// |new_subscription| is the subscription that is going to replace the
// |old_subscription| and is null when permission is revoked or the
// subscription is lost.
// Ref: https://w3c.github.io/push-api/#dfn-pushsubscriptionchange
DispatchPushSubscriptionChangeEvent(
PushSubscription? old_subscription,
PushSubscription? new_subscription)
=> (ServiceWorkerEventStatus status);
// Arguments are passed to the event handler as parameters of SyncEvent.
// Ref: https://wicg.github.io/BackgroundSync/spec/#sync-event
// |timeout| is the amount of time to allow this event to finish.
DispatchSyncEvent(string tag,
bool last_chance,
mojo_base.mojom.TimeDelta timeout)
=> (ServiceWorkerEventStatus status);
// |timeout| is the amount of time to allow this event to finish.
// TODO(crbug.com/925297): Link to spec.
DispatchPeriodicSyncEvent(string tag,
mojo_base.mojom.TimeDelta timeout)
=> (ServiceWorkerEventStatus status);
DispatchAbortPaymentEvent(
pending_remote<payments.mojom.PaymentHandlerResponseCallback>
result_of_abort_payment)
=> (ServiceWorkerEventStatus status);
DispatchCanMakePaymentEvent(
payments.mojom.CanMakePaymentEventData event_data,
pending_remote<payments.mojom.PaymentHandlerResponseCallback>
result_of_can_make_payment)
=> (ServiceWorkerEventStatus status);
DispatchPaymentRequestEvent(
payments.mojom.PaymentRequestEventData request_data,
pending_remote<payments.mojom.PaymentHandlerResponseCallback>
response_callback)
=> (ServiceWorkerEventStatus status);
DispatchExtendableMessageEvent(ExtendableMessageEvent event)
=> (ServiceWorkerEventStatus status);
// Ref: https://github.com/rknoll/content-index
DispatchContentDeleteEvent(string id) => (ServiceWorkerEventStatus status);
// Pings the service worker to check if it is responsive. If the callback is
// not called within a certain period of time, the browser will terminate the
// worker.
Ping() => ();
// Changes the delay until the idle timer requests termination after all
// events are handled.
SetIdleDelay(mojo_base.mojom.TimeDelta delay);
// Adds a message to DevTools console which is associated with this worker.
AddMessageToConsole(ConsoleMessageLevel level, string message);
// Executes the given `javascript` in the context of the running worker.
// `wants_result` indicates whether a result from the executing `javascript`
// should be returned via the provided callback.
// Currently, this only supports synchronous script execution, and the
// returned value is the result of the final execution in the provided
// javascript.
// If an exception is thrown, a stringified version is returned through the
// error parameter.
// TODO(devlin): Expand this to allow returning a promise for asynchronous
// execution.
ExecuteScriptForTest(
mojo_base.mojom.BigString16 javascript,
bool wants_result)
=> (mojo_base.mojom.Value result, string? error);
};