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

module content.mojom;

import "mojo/public/mojom/base/values.mojom";

// Descriptive errors raised by the gin java bridge.
enum GinJavaBridgeError {
  kGinJavaBridgeNoError,
  kGinJavaBridgeUnknownObjectId,
  kGinJavaBridgeObjectIsGone,
  kGinJavaBridgeMethodNotFound,
  kGinJavaBridgeAccessToObjectGetClassIsBlocked,
  kGinJavaBridgeJavaExceptionRaised,
  kGinJavaBridgeNonAssignableTypes,
  kGinJavaBridgeRenderFrameDeleted,
};

// Interface for adding objects to a frame in the renderer.
// TODO(crbug.com/40554401): This interface mirrors
// `blink.mojom.RemoteObjectGateway` and should be removed once
// crbug.com/794320 is complete.
interface GinJavaBridge {
  // Sent from browser to renderer to add a Java object with the given name.
  // Object IDs are generated on the browser side.
  AddNamedObject(string name, int32 object_id);

  // Sent from browser to renderer to remove a Java object with the given name.
  RemoveNamedObject(string name);

  // Sets the associated GinJavaBridgeHost object.
  SetHost(pending_remote<GinJavaBridgeHost> host);
};

// Implemented in the process hosting the remote object. Allows methods to be
// synchronously invoked on the object.
// TODO(crbug.com/40554401): This interface mirrors `blink.mojom.RemoteObject`
// but without the serialization changes. This should be merged with that
// definition once crbug.com/794320 is complete.
interface GinJavaBridgeRemoteObject {
  // Sent from renderer to browser to get information about methods of
  // the given object. The query will only succeed if inspection of injected
  // objects is enabled on the browser side.
  [Sync]
  GetMethods() => (array<string> method_names);

  // Sent from renderer to browser to find out, if an object has a method with
  // the given name.
  [Sync]
  HasMethod(string method_name) => (bool result);

  // Sent from renderer to browser to invoke a method. Method arguments
  // are chained into |arguments| list. base::Value::List is used for |result|
  // as a container to work around immutability of base::Value.
  // Empty result list indicates that an error has happened on the Java side
  // (either bridge-induced error or an unhandled Java exception) and an
  // exception must be thrown into JavaScript. |error_code| indicates the cause
  // of the error.
  // Some special value types that are not supported by base::Value are encoded
  // as BinaryValues via GinJavaBridgeValue.
  [Sync]
  InvokeMethod(string method_name, mojo_base.mojom.ListValue arguments) =>
    (GinJavaBridgeError error_code, mojo_base.mojom.ListValue result);
};

// Implemented in the process hosting the remote objects. Allows access to an
// object graph.
// TODO(crbug.com/40554401): This class mirrors `blink.mojom.RemoteObjectHost`
// and should be removed once crbug.com/794320 is complete.
interface GinJavaBridgeHost {
  // Binds |receiver| to an implementation of RemoteObject corresponding to
  // |object_id|.
  GetObject(int32 object_id,
            pending_receiver<GinJavaBridgeRemoteObject> receiver);

  // Sent from renderer to browser in two cases:
  //
  //  1. (Main usage) To inform that the JS wrapper of the object has
  //     been completely dereferenced and garbage-collected.
  //
  //  2. To notify the browser that wrapper creation has failed.  The browser
  //     side assumes optimistically that every time an object is returned from
  //     a method, the corresponding wrapper object will be successfully
  //     created on the renderer side. Sending of this message informs the
  //     browser whether this expectation has failed.
  ObjectWrapperDeleted(int32 object_id);
};
