1*635a8641SAndroid Build Coastguard Worker# Mojo JavaScript Bindings API 2*635a8641SAndroid Build Coastguard WorkerThis document is a subset of the [Mojo documentation](/mojo/README.md). 3*635a8641SAndroid Build Coastguard Worker 4*635a8641SAndroid Build Coastguard Worker[TOC] 5*635a8641SAndroid Build Coastguard Worker 6*635a8641SAndroid Build Coastguard Worker## Getting Started 7*635a8641SAndroid Build Coastguard WorkerThe bindings API is defined in the `mojo` namespace and implemented in 8*635a8641SAndroid Build Coastguard Worker`mojo_bindings.js`, which could be generated by the GN target 9*635a8641SAndroid Build Coastguard Worker`//mojo/public/js:bindings`. 10*635a8641SAndroid Build Coastguard Worker 11*635a8641SAndroid Build Coastguard WorkerWhen a Mojom IDL file is processed by the bindings generator, JavaScript code is 12*635a8641SAndroid Build Coastguard Workeremitted in a `.js` file with the name based on the input `.mojom` file. Suppose 13*635a8641SAndroid Build Coastguard Workerwe create the following Mojom file at 14*635a8641SAndroid Build Coastguard Worker`//services/echo/public/interfaces/echo.mojom`: 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker``` 17*635a8641SAndroid Build Coastguard Workermodule test.echo.mojom; 18*635a8641SAndroid Build Coastguard Worker 19*635a8641SAndroid Build Coastguard Workerinterface Echo { 20*635a8641SAndroid Build Coastguard Worker EchoInteger(int32 value) => (int32 result); 21*635a8641SAndroid Build Coastguard Worker}; 22*635a8641SAndroid Build Coastguard Worker``` 23*635a8641SAndroid Build Coastguard Worker 24*635a8641SAndroid Build Coastguard WorkerAnd a GN target to generate the bindings in 25*635a8641SAndroid Build Coastguard Worker`//services/echo/public/interfaces/BUILD.gn`: 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Worker``` 28*635a8641SAndroid Build Coastguard Workerimport("//mojo/public/tools/bindings/mojom.gni") 29*635a8641SAndroid Build Coastguard Worker 30*635a8641SAndroid Build Coastguard Workermojom("interfaces") { 31*635a8641SAndroid Build Coastguard Worker sources = [ 32*635a8641SAndroid Build Coastguard Worker "echo.mojom", 33*635a8641SAndroid Build Coastguard Worker ] 34*635a8641SAndroid Build Coastguard Worker} 35*635a8641SAndroid Build Coastguard Worker``` 36*635a8641SAndroid Build Coastguard Worker 37*635a8641SAndroid Build Coastguard WorkerBindings are generated by building one of these implicitly generated targets 38*635a8641SAndroid Build Coastguard Worker(where "foo" is the target name): 39*635a8641SAndroid Build Coastguard Worker* `foo_js` JavaScript bindings; used as compile-time dependency. 40*635a8641SAndroid Build Coastguard Worker* `foo_js_data_deps` JavaScript bindings; used as run-time dependency. 41*635a8641SAndroid Build Coastguard Worker 42*635a8641SAndroid Build Coastguard WorkerIf we then build this target: 43*635a8641SAndroid Build Coastguard Worker``` 44*635a8641SAndroid Build Coastguard Workerninja -C out/r services/echo/public/interfaces:interfaces_js 45*635a8641SAndroid Build Coastguard Worker``` 46*635a8641SAndroid Build Coastguard Worker 47*635a8641SAndroid Build Coastguard WorkerThis will produce several generated source files. The one relevant to JavaScript 48*635a8641SAndroid Build Coastguard Workerbindings is: 49*635a8641SAndroid Build Coastguard Worker``` 50*635a8641SAndroid Build Coastguard Workerout/gen/services/echo/public/interfaces/echo.mojom.js 51*635a8641SAndroid Build Coastguard Worker``` 52*635a8641SAndroid Build Coastguard Worker 53*635a8641SAndroid Build Coastguard WorkerIn order to use the definitions in `echo.mojom`, you will need to include two 54*635a8641SAndroid Build Coastguard Workerfiles in your html page using `<script>` tags: 55*635a8641SAndroid Build Coastguard Worker* `mojo_bindings.js` 56*635a8641SAndroid Build Coastguard Worker __Note: This file must be included before any `.mojom.js` files.__ 57*635a8641SAndroid Build Coastguard Worker* `echo.mojom.js` 58*635a8641SAndroid Build Coastguard Worker 59*635a8641SAndroid Build Coastguard Worker``` html 60*635a8641SAndroid Build Coastguard Worker<!DOCTYPE html> 61*635a8641SAndroid Build Coastguard Worker<script src="URL/to/mojo_bindings.js"></script> 62*635a8641SAndroid Build Coastguard Worker<script src="URL/to/echo.mojom.js"></script> 63*635a8641SAndroid Build Coastguard Worker<script> 64*635a8641SAndroid Build Coastguard Worker 65*635a8641SAndroid Build Coastguard Workervar echoPtr = new test.echo.mojom.EchoPtr(); 66*635a8641SAndroid Build Coastguard Workervar echoRequest = mojo.makeRequest(echoPtr); 67*635a8641SAndroid Build Coastguard Worker// ... 68*635a8641SAndroid Build Coastguard Worker 69*635a8641SAndroid Build Coastguard Worker</script> 70*635a8641SAndroid Build Coastguard Worker``` 71*635a8641SAndroid Build Coastguard Worker 72*635a8641SAndroid Build Coastguard Worker## Interfaces 73*635a8641SAndroid Build Coastguard WorkerSimilar to the C++ bindings API, we have: 74*635a8641SAndroid Build Coastguard Worker* `mojo.InterfacePtrInfo` and `mojo.InterfaceRequest` encapsulate two ends of a 75*635a8641SAndroid Build Coastguard Worker message pipe. They represent the client end and service end of an interface 76*635a8641SAndroid Build Coastguard Worker connection, respectively. 77*635a8641SAndroid Build Coastguard Worker* For each Mojom interface `Foo`, there is a generated `FooPtr` class. It owns 78*635a8641SAndroid Build Coastguard Worker an `InterfacePtrInfo`; provides methods to send interface calls using the 79*635a8641SAndroid Build Coastguard Worker message pipe handle from the `InterfacePtrInfo`. 80*635a8641SAndroid Build Coastguard Worker* `mojo.Binding` owns an `InterfaceRequest`. It listens on the message pipe 81*635a8641SAndroid Build Coastguard Worker handle and dispatches incoming messages to a user-defined interface 82*635a8641SAndroid Build Coastguard Worker implementation. 83*635a8641SAndroid Build Coastguard Worker 84*635a8641SAndroid Build Coastguard WorkerLet's consider the `echo.mojom` example above. The following shows how to create 85*635a8641SAndroid Build Coastguard Workeran `Echo` interface connection and use it to make a call. 86*635a8641SAndroid Build Coastguard Worker 87*635a8641SAndroid Build Coastguard Worker``` html 88*635a8641SAndroid Build Coastguard Worker<!DOCTYPE html> 89*635a8641SAndroid Build Coastguard Worker<script src="URL/to/mojo_bindings.js"></script> 90*635a8641SAndroid Build Coastguard Worker<script src="URL/to/echo.mojom.js"></script> 91*635a8641SAndroid Build Coastguard Worker<script> 92*635a8641SAndroid Build Coastguard Worker 93*635a8641SAndroid Build Coastguard Workerfunction EchoImpl() {} 94*635a8641SAndroid Build Coastguard WorkerEchoImpl.prototype.echoInteger = function(value) { 95*635a8641SAndroid Build Coastguard Worker return Promise.resolve({result: value}); 96*635a8641SAndroid Build Coastguard Worker}; 97*635a8641SAndroid Build Coastguard Worker 98*635a8641SAndroid Build Coastguard Workervar echoServicePtr = new test.echo.mojom.EchoPtr(); 99*635a8641SAndroid Build Coastguard Workervar echoServiceRequest = mojo.makeRequest(echoServicePtr); 100*635a8641SAndroid Build Coastguard Workervar echoServiceBinding = new mojo.Binding(test.echo.mojom.Echo, 101*635a8641SAndroid Build Coastguard Worker new EchoImpl(), 102*635a8641SAndroid Build Coastguard Worker echoServiceRequest); 103*635a8641SAndroid Build Coastguard WorkerechoServicePtr.echoInteger({value: 123}).then(function(response) { 104*635a8641SAndroid Build Coastguard Worker console.log('The result is ' + response.value); 105*635a8641SAndroid Build Coastguard Worker}); 106*635a8641SAndroid Build Coastguard Worker 107*635a8641SAndroid Build Coastguard Worker</script> 108*635a8641SAndroid Build Coastguard Worker``` 109*635a8641SAndroid Build Coastguard Worker 110*635a8641SAndroid Build Coastguard Worker### Interface Pointers and Requests 111*635a8641SAndroid Build Coastguard WorkerIn the example above, `test.echo.mojom.EchoPtr` is an interface pointer class. 112*635a8641SAndroid Build Coastguard Worker`EchoPtr` represents the client end of an interface connection. For method 113*635a8641SAndroid Build Coastguard Worker`EchoInteger` in the `Echo` Mojom interface, there is a corresponding 114*635a8641SAndroid Build Coastguard Worker`echoInteger` method defined in `EchoPtr`. (Please note that the format of the 115*635a8641SAndroid Build Coastguard Workergenerated method name is `camelCaseWithLowerInitial`.) 116*635a8641SAndroid Build Coastguard Worker 117*635a8641SAndroid Build Coastguard WorkerThere are some control methods shared by all interface pointer classes. For 118*635a8641SAndroid Build Coastguard Workerexample, binding/extracting `InterfacePtrInfo`, setting connection error 119*635a8641SAndroid Build Coastguard Workerhandler, querying version information, etc. In order to avoid name collision, 120*635a8641SAndroid Build Coastguard Workerthey are defined in `mojo.InterfacePtrController` and exposed as the `ptr` field 121*635a8641SAndroid Build Coastguard Workerof every interface pointer class. 122*635a8641SAndroid Build Coastguard Worker 123*635a8641SAndroid Build Coastguard WorkerIn the example above, `echoServiceRequest` is an `InterfaceRequest` instance. It 124*635a8641SAndroid Build Coastguard Workerrepresents the service end of an interface connection. 125*635a8641SAndroid Build Coastguard Worker 126*635a8641SAndroid Build Coastguard Worker`mojo.makeRequest` creates a message pipe; populates the output argument (which 127*635a8641SAndroid Build Coastguard Workercould be an `InterfacePtrInfo` or an interface pointer) with one end of the 128*635a8641SAndroid Build Coastguard Workerpipe; returns the other end wrapped in an `InterfaceRequest` instance. 129*635a8641SAndroid Build Coastguard Worker 130*635a8641SAndroid Build Coastguard Worker### Binding an InterfaceRequest 131*635a8641SAndroid Build Coastguard WorkerA `mojo.Binding` bridges an implementation of an interface and a message pipe 132*635a8641SAndroid Build Coastguard Workerendpoint, dispatching incoming messages to the implementation. 133*635a8641SAndroid Build Coastguard Worker 134*635a8641SAndroid Build Coastguard WorkerIn the example above, `echoServiceBinding` listens for incoming `EchoInteger` 135*635a8641SAndroid Build Coastguard Workermethod calls on the messsage pipe, and dispatches those calls to the `EchoImpl` 136*635a8641SAndroid Build Coastguard Workerinstance. 137*635a8641SAndroid Build Coastguard Worker 138*635a8641SAndroid Build Coastguard Worker### Receiving Responses 139*635a8641SAndroid Build Coastguard WorkerSome Mojom interface methods expect a response, such as `EchoInteger`. The 140*635a8641SAndroid Build Coastguard Workercorresponding JavaScript method returns a Promise. This Promise is resolved when 141*635a8641SAndroid Build Coastguard Workerthe service side sends back a response. It is rejected if the interface is 142*635a8641SAndroid Build Coastguard Workerdisconnected. 143*635a8641SAndroid Build Coastguard Worker 144*635a8641SAndroid Build Coastguard Worker### Connection Errors 145*635a8641SAndroid Build Coastguard WorkerIf a pipe is disconnected, both endpoints will be able to observe the connection 146*635a8641SAndroid Build Coastguard Workererror (unless the disconnection is caused by closing/destroying an endpoint, in 147*635a8641SAndroid Build Coastguard Workerwhich case that endpoint won't get such a notification). If there are remaining 148*635a8641SAndroid Build Coastguard Workerincoming messages for an endpoint on disconnection, the connection error won't 149*635a8641SAndroid Build Coastguard Workerbe triggered until the messages are drained. 150*635a8641SAndroid Build Coastguard Worker 151*635a8641SAndroid Build Coastguard WorkerPipe disconnecition may be caused by: 152*635a8641SAndroid Build Coastguard Worker* Mojo system-level causes: process terminated, resource exhausted, etc. 153*635a8641SAndroid Build Coastguard Worker* The bindings close the pipe due to a validation error when processing a 154*635a8641SAndroid Build Coastguard Worker received message. 155*635a8641SAndroid Build Coastguard Worker* The peer endpoint is closed. For example, the remote side is a bound interface 156*635a8641SAndroid Build Coastguard Worker pointer and it is destroyed. 157*635a8641SAndroid Build Coastguard Worker 158*635a8641SAndroid Build Coastguard WorkerRegardless of the underlying cause, when a connection error is encountered on 159*635a8641SAndroid Build Coastguard Workera binding endpoint, that endpoint's **connection error handler** (if set) is 160*635a8641SAndroid Build Coastguard Workerinvoked. This handler may only be invoked *once* as long as the endpoint is 161*635a8641SAndroid Build Coastguard Workerbound to the same pipe. Typically clients and implementations use this handler 162*635a8641SAndroid Build Coastguard Workerto do some kind of cleanup or recovery. 163*635a8641SAndroid Build Coastguard Worker 164*635a8641SAndroid Build Coastguard Worker``` js 165*635a8641SAndroid Build Coastguard Worker// Assume echoServicePtr is already bound. 166*635a8641SAndroid Build Coastguard WorkerechoServicePtr.ptr.setConnectionErrorHandler(function() { 167*635a8641SAndroid Build Coastguard Worker DoImportantCleanUp(); 168*635a8641SAndroid Build Coastguard Worker}); 169*635a8641SAndroid Build Coastguard Worker 170*635a8641SAndroid Build Coastguard Worker// Assume echoServiceBinding is already bound: 171*635a8641SAndroid Build Coastguard WorkerechoServiceBinding.setConnectionErrorHandler(function() { 172*635a8641SAndroid Build Coastguard Worker DoImportantCleanUpToo(); 173*635a8641SAndroid Build Coastguard Worker}); 174*635a8641SAndroid Build Coastguard Worker``` 175*635a8641SAndroid Build Coastguard Worker 176*635a8641SAndroid Build Coastguard Worker**Note:** Closing one end of a pipe will eventually trigger a connection error 177*635a8641SAndroid Build Coastguard Workeron the other end. However it's ordered with respect to any other event (*e.g.* 178*635a8641SAndroid Build Coastguard Workerwriting a message) on the pipe. Therefore, it is safe to make an `echoInteger` 179*635a8641SAndroid Build Coastguard Workercall on `echoServicePtr` and reset it immediately (which results in 180*635a8641SAndroid Build Coastguard Workerdisconnection), `echoServiceBinding` will receive the `echoInteger` call before 181*635a8641SAndroid Build Coastguard Workerit observes the connection error. 182*635a8641SAndroid Build Coastguard Worker 183*635a8641SAndroid Build Coastguard Worker## Associated Interfaces 184*635a8641SAndroid Build Coastguard WorkerAn associated interface connection doesn't have its own underlying message pipe. 185*635a8641SAndroid Build Coastguard WorkerIt is associated with an existing message pipe (i.e., interface connection). 186*635a8641SAndroid Build Coastguard Worker 187*635a8641SAndroid Build Coastguard WorkerSimilar to the non-associated interface case, we have: 188*635a8641SAndroid Build Coastguard Worker* `mojo.AssociatedInterfacePtrInfo` and `mojo.AssociatedInterfaceRequest` 189*635a8641SAndroid Build Coastguard Worker encapsulate a *route ID*, representing a logical connection over a message 190*635a8641SAndroid Build Coastguard Worker pipe. 191*635a8641SAndroid Build Coastguard Worker* For each Mojom interface `Foo`, there is a generated `FooAssociatedPtr` class. 192*635a8641SAndroid Build Coastguard Worker It owns an `AssociatedInterfacePtrInfo`. It is the client side of an 193*635a8641SAndroid Build Coastguard Worker interface. 194*635a8641SAndroid Build Coastguard Worker* `mojo.AssociatedBinding` owns an `AssociatedInterfaceRequest`. It listens on 195*635a8641SAndroid Build Coastguard Worker the connection and dispatches incoming messages to a user-defined interface 196*635a8641SAndroid Build Coastguard Worker implementation. 197*635a8641SAndroid Build Coastguard Worker 198*635a8641SAndroid Build Coastguard WorkerSee [this document](https://www.chromium.org/developers/design-documents/mojo/associated-interfaces) 199*635a8641SAndroid Build Coastguard Workerfor more details. 200*635a8641SAndroid Build Coastguard Worker 201*635a8641SAndroid Build Coastguard Worker## Automatic and Manual Dependency Loading 202*635a8641SAndroid Build Coastguard WorkerBy default, generated `.mojom.js` files automatically load Mojom dependencies. 203*635a8641SAndroid Build Coastguard WorkerFor example, if `foo.mojom` imports `bar.mojom`, loading `foo.mojom.js` will 204*635a8641SAndroid Build Coastguard Workerinsert a `<script>` tag to load `bar.mojom.js`, if it hasn't been loaded. 205*635a8641SAndroid Build Coastguard Worker 206*635a8641SAndroid Build Coastguard WorkerThe URL of `bar.mojom.js` is determined by: 207*635a8641SAndroid Build Coastguard Worker* the path of `bar.mojom` relative to the position of `foo.mojom` at build time; 208*635a8641SAndroid Build Coastguard Worker* the URL of `foo.mojom.js`. 209*635a8641SAndroid Build Coastguard Worker 210*635a8641SAndroid Build Coastguard WorkerFor exmple, if at build time the two Mojom files are located at: 211*635a8641SAndroid Build Coastguard Worker``` 212*635a8641SAndroid Build Coastguard Workera/b/c/foo.mojom 213*635a8641SAndroid Build Coastguard Workera/b/d/bar.mojom 214*635a8641SAndroid Build Coastguard Worker``` 215*635a8641SAndroid Build Coastguard Worker 216*635a8641SAndroid Build Coastguard WorkerThe URL of `foo.mojom.js` is: 217*635a8641SAndroid Build Coastguard Worker``` 218*635a8641SAndroid Build Coastguard Workerhttp://example.org/scripts/b/c/foo.mojom.js 219*635a8641SAndroid Build Coastguard Worker``` 220*635a8641SAndroid Build Coastguard Worker 221*635a8641SAndroid Build Coastguard WorkerThen the URL of `bar.mojom.js` is supposed to be: 222*635a8641SAndroid Build Coastguard Worker``` 223*635a8641SAndroid Build Coastguard Workerhttp://example.org/scripts/b/d/bar.mojom.js 224*635a8641SAndroid Build Coastguard Worker``` 225*635a8641SAndroid Build Coastguard Worker 226*635a8641SAndroid Build Coastguard WorkerIf you would like `bar.mojom.js` to live at a different location, you need to 227*635a8641SAndroid Build Coastguard Workerset `mojo.config.autoLoadMojomDeps` to `false` before loading `foo.mojom.js`, 228*635a8641SAndroid Build Coastguard Workerand manually load `bar.mojom.js` yourself. Similarly, you need to turn off this 229*635a8641SAndroid Build Coastguard Workeroption if you merge `bar.mojom.js` and `foo.mojom.js` into a single file. 230*635a8641SAndroid Build Coastguard Worker 231*635a8641SAndroid Build Coastguard Worker``` html 232*635a8641SAndroid Build Coastguard Worker<!-- Automatic dependency loading --> 233*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/mojo_bindings.js"></script> 234*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/c/foo.mojom.js"></script> 235*635a8641SAndroid Build Coastguard Worker 236*635a8641SAndroid Build Coastguard Worker 237*635a8641SAndroid Build Coastguard Worker<!-- Manual dependency loading --> 238*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/mojo_bindings.js"></script> 239*635a8641SAndroid Build Coastguard Worker<script> 240*635a8641SAndroid Build Coastguard Worker mojo.config.autoLoadMojomDeps = false; 241*635a8641SAndroid Build Coastguard Worker</script> 242*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/d/bar.mojom.js"></script> 243*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/c/foo.mojom.js"></script> 244*635a8641SAndroid Build Coastguard Worker``` 245*635a8641SAndroid Build Coastguard Worker 246*635a8641SAndroid Build Coastguard Worker### Performance Tip: Avoid Loading the Same .mojom.js File Multiple Times 247*635a8641SAndroid Build Coastguard WorkerIf `mojo.config.autoLoadMojomDeps` is set to `true` (which is the default 248*635a8641SAndroid Build Coastguard Workervalue), you might accidentally load the same `.mojom.js` file multiple times if 249*635a8641SAndroid Build Coastguard Workeryou are not careful. Although it doesn't cause fatal errors, it hurts 250*635a8641SAndroid Build Coastguard Workerperformance and therefore should be avoided. 251*635a8641SAndroid Build Coastguard Worker 252*635a8641SAndroid Build Coastguard Worker``` html 253*635a8641SAndroid Build Coastguard Worker<!-- Assume that mojo.config.autoLoadMojomDeps is set to true: --> 254*635a8641SAndroid Build Coastguard Worker 255*635a8641SAndroid Build Coastguard Worker<!-- No duplicate loading; recommended. --> 256*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/c/foo.mojom.js"></script> 257*635a8641SAndroid Build Coastguard Worker 258*635a8641SAndroid Build Coastguard Worker<!-- No duplicate loading, although unnecessary. --> 259*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/d/bar.mojom.js"></script> 260*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/c/foo.mojom.js"></script> 261*635a8641SAndroid Build Coastguard Worker 262*635a8641SAndroid Build Coastguard Worker<!-- Load bar.mojom.js twice; should be avoided. --> 263*635a8641SAndroid Build Coastguard Worker<!-- when foo.mojom.js is loaded, it sees that bar.mojom.js is not yet loaded, 264*635a8641SAndroid Build Coastguard Worker so it inserts another <script> tag for bar.mojom.js. --> 265*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/c/foo.mojom.js"></script> 266*635a8641SAndroid Build Coastguard Worker<script src="http://example.org/scripts/b/d/bar.mojom.js"></script> 267*635a8641SAndroid Build Coastguard Worker``` 268*635a8641SAndroid Build Coastguard Worker 269*635a8641SAndroid Build Coastguard WorkerIf a `.mojom.js` file is loaded for a second time, a warnings will be showed 270*635a8641SAndroid Build Coastguard Workerusing `console.warn()` to bring it to developers' attention. 271*635a8641SAndroid Build Coastguard Worker 272*635a8641SAndroid Build Coastguard Worker## Name Formatting 273*635a8641SAndroid Build Coastguard WorkerAs a general rule, Mojom definitions follow the C++ formatting style. To make 274*635a8641SAndroid Build Coastguard Workerthe generated JavaScript bindings conforms to our JavaScript style guide, the 275*635a8641SAndroid Build Coastguard Workercode generator does the following conversions: 276*635a8641SAndroid Build Coastguard Worker 277*635a8641SAndroid Build Coastguard Worker| In Mojom | In generated .mojom.js | 278*635a8641SAndroid Build Coastguard Worker|----------------------|------------------------| 279*635a8641SAndroid Build Coastguard Worker| MethodLikeThis | methodLikeThis 280*635a8641SAndroid Build Coastguard Worker| parameter_like_this | parameterLikeThis 281*635a8641SAndroid Build Coastguard Worker| field_like_this | fieldLikeThis 282*635a8641SAndroid Build Coastguard Worker| name_space.like_this | nameSpace.likeThis 283