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