chromium/components/services/storage/privileged/mojom/indexed_db_client_state_checker.mojom

// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

module storage.mojom;

enum DisallowInactiveClientReason {
  // Used when a new connection is being opened with a higher version
  // number which triggers a version change event being sent to existing
  // connections.
  kVersionChangeEvent = 0,
  // Used when a transaction first attempts to acquire locks (disallowing
  // whatever client may hold that lock from becoming inactive).
  kTransactionIsAcquiringLocks = 1,
  // Used when a transaction starts while its client is already inactive.
  // This potentially kicks the client out of BFCache since the transaction
  // won't be able to proceed.
  kTransactionIsStartingWhileBlockingOthers = 2,
  // Similar to above, but used when a transaction is ongoing and its client
  // becomes inactive.
  kTransactionIsOngoingAndBlockingOthers = 3,
};

// IndexedDB clients live in the renderer and talk directly to the storage
// service, but some clients may be inactive (e.g. in a BFCached document).
// In order to correctly handle IndexedDB interactions with the inactive
// documents, there is also a corresponding storage service -> browser
// process interface for each IndexedDB client.
interface IndexedDBClientStateChecker {
  // Check if the client is currently in inactive states that shouldn't
  // receive certain callbacks/events (e.g. those that might block the
  // IndexedDB flow such as `VersionChange`) from the IndexedDB service.
  // For the client without an associated RenderFrameHost, this should report
  // the value indicating that the client is active. A reason needs to be
  // provided to this call, which will be passed to the actual method that
  // processes the disallow action.
  // For the client with an associated RenderFrameHost, this call may also have
  // side effects:
  // 1. If the client is active, it may be disallowed from entering some
  // inactive states (e.g. BFCache);
  // 2. If the client is in some inactive state (e.g. BFCache), it will be
  // disallowed from being activated again in the future.
  // See `RenderFrameHost::IsInactiveAndDisallowActivation()`.
  // `keep_active` is used to keep an active client away from entering
  // the inactive state if while it's valid and connected.
  // This has no effect if the client is no longer active by the time the IPC
  // message is handled.
  DisallowInactiveClient(
      DisallowInactiveClientReason reason,
      pending_receiver<IndexedDBClientKeepActive>? keep_active)
      => (bool was_active);

  // Binds another mojo connection to `this`.
  MakeClone(pending_receiver<IndexedDBClientStateChecker> receiver);

  // Summary of allowed state transitions under different scenarios.
  // There are three possible states for the IndexedDB client: active,
  // inactive and destroyed.

  // In the default case, the following transactions are allowed:
  // - active -> inactive
  // - active -> destroyed
  // - inactive -> active
  // - inactive -> destroyed

  // After `DisallowInactiveClient` has been called, the following transitions
  // are allowed:
  // - active -> destroyed
  // - inactive -> destroyed
  // Additionally, if `keep_active` is not set or goes out of scope, the
  // following transition will be allowed as well:
  // - active -> inactive
};

// Preventing an instance of this interface from entering some inactive state
// like BFCache. Closing the other end (i.e. the remote) ends the scope
// associated with the instance.
interface IndexedDBClientKeepActive {};