blob: 034d3c1e9fe308eadddb9573c6d872686e1bedb0 [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;
// An opaque handle passed from the browser process to a child process to
// reflect a held lock. The lock is released when the handle is dropped.
interface LockHandle {};
// An explicit lock request is used so that requests from terminated
// contexts (e.g. closed or navigated tabs) can be observed and removed
// from the lock manager's queue.
interface LockRequest {
// Request was granted. Associated to maintain ordering within
// a LockManager, to match task queue behavior required by spec.
Granted(pending_associated_remote<LockHandle> lock_handle);
// Request failed; e.g. request was only "if available" and it was not.
Failed();
// TODO(jsbell): Abort() is not yet used.
Abort(string reason);
};
// Corresponds to the |mode| enum option in the Web Locks API.
enum LockMode {
SHARED,
EXCLUSIVE
};
struct LockInfo {
string name;
LockMode mode;
// TODO(jsbell): Unify with Service Worker client ID e.g. ensure same
// struct type is used.
string client_id;
};
// Implementation of the proposed "Web Locks API". This provides a "lock"
// primitive for coordination of resource usage across window and worker
// contexts in a web application. A resource is identified by an abstract
// name string selected by the web app. A lock can be requested over the
// resource. The request will be granted asynchronously depending on
// availablility and options. Once granted, the lock will be held until
// explicitly released or the holding context is terminated.
//
// Proposal: https://wicg.github.io/web-locks
interface LockManager {
// PREEMPT corresponds to the |steal| option in the API; if used then
// all previous locks with the same name are released.
// NO_WAIT corresponds to |ifAvailable| option in the API; if used then
// the request fails if it cannot be granted immediately.
enum WaitMode {
WAIT,
NO_WAIT,
PREEMPT
};
// Request a lock. One of |request|'s methods will be called
// when the lock is granted or if the request fails. If |request|'s
// channel is closed (e.g. due to terminated process) the request
// is removed from the manager's queues, which can unblock later
// requests. Associated to maintain to match task queue behavior
// defined by spec.
RequestLock(string name,
LockMode mode,
WaitMode wait,
pending_associated_remote<LockRequest> request);
// Produces a snapshot of the lock manager's state. Web applications
// can use this for diagnostic purposes.
QueryState() => (array<LockInfo> requested, array<LockInfo> held);
};