1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
|
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
// Interface for making UniFFI scaffolding calls
//
// Gecko uses UniFFI to generate privileged JS bindings for Rust components.
// UniFFI defines a C-ABI FFI layer for calling into Rust, called the
// scaffolding. This interface is a bridge that allows the JS code to make
// scaffolding calls
//
// See https://mozilla.github.io/uniffi-rs/ for details.
// Define some ID types to identify various parts of the UDL interfaces. Using
// these IDs, allow this .webidl file to remain static, but support new
// interfaces. Using IDs is that the C++ and JS code need to agree on their
// meaning, which is handled by
// toolkit/components/uniffi-bindgen-gecko-js/src/ci_list.rs.
// Identifies a scaffolding function.
typedef unsigned long long UniFFIFunctionId;
// Identifies a pointer type
typedef unsigned long long UniFFIPointerId;
// Identifies a callback interface
typedef unsigned long UniFFICallbackInterfaceId;
// Identifies a method of a callback interface
typedef unsigned long UniFFICallbackMethodId;
// Handle for a callback interface instance
typedef unsigned long long UniFFICallbackObjectHandle;
// Opaque type used to represent a pointer from Rust
[ChromeOnly, Exposed=Window]
interface UniFFIPointer {};
// Types that can be passed or returned from scaffolding functions
//
// - double is used for all numeric types and types which the JS code coerces
// to an int including Boolean and CallbackInterface.
// - ArrayBuffer is used for RustBuffer
// - UniFFIPointer is used for Arc pointers
typedef (double or ArrayBuffer or UniFFIPointer) UniFFIScaffoldingType;
// The result of a call into UniFFI scaffolding call
enum UniFFIScaffoldingCallCode {
"success", // Successful return
"error", // Rust Err return
"internal-error", // Internal/unexpected error
};
dictionary UniFFIScaffoldingCallResult {
required UniFFIScaffoldingCallCode code;
// For success, this will be the return value for non-void returns
// For error, this will be an ArrayBuffer storing the serialized error value
UniFFIScaffoldingType data;
// For internal-error, this will be a utf-8 string describing the error
ByteString internalErrorMessage;
};
// JS handler for calling a CallbackInterface method.
// The arguments and return value are always packed into an ArrayBuffer
callback UniFFICallbackHandler = undefined (UniFFICallbackObjectHandle objectId, UniFFICallbackMethodId methodId, ArrayBuffer aArgs);
// Functions to facilitate UniFFI scaffolding calls
[ChromeOnly, Exposed=Window]
namespace UniFFIScaffolding {
// Call a scaffolding function on the worker thread.
//
// id is a unique identifier for the function, known to both the C++ and JS code
[Throws]
Promise<UniFFIScaffoldingCallResult> callAsync(UniFFIFunctionId id, UniFFIScaffoldingType... args);
// Call a scaffolding function on the main thread
//
// id is a unique identifier for the function, known to both the C++ and JS code
[Throws]
UniFFIScaffoldingCallResult callSync(UniFFIFunctionId id, UniFFIScaffoldingType... args);
// Read a UniFFIPointer from an ArrayBuffer
//
// id is a unique identifier for the pointer type, known to both the C++ and JS code
[Throws]
UniFFIPointer readPointer(UniFFIPointerId id, ArrayBuffer buff, long position);
// Write a UniFFIPointer to an ArrayBuffer
//
// id is a unique identifier for the pointer type, known to both the C++ and JS code
[Throws]
undefined writePointer(UniFFIPointerId id, UniFFIPointer ptr, ArrayBuffer buff, long position);
// Register the global calblack handler
//
// This will be used to invoke all calls for a CallbackInterface.
// interfaceId is a unique identifier for the callback interface, known to both the C++ and JS code
[Throws]
undefined registerCallbackHandler(UniFFICallbackInterfaceId interfaceId, UniFFICallbackHandler handler);
// Deregister the global calblack handler
//
// This is called at shutdown to clear out the reference to the JS function.
[Throws]
undefined deregisterCallbackHandler(UniFFICallbackInterfaceId interfaceId);
};
|