chromium/third_party/blink/public/mojom/locks/lock_manager.mojom

// Copyright 2017 The Chromium Authors
// 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();
};

// 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://w3c.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);
};