| | 405 | == `[CustomBinding]` == #CustomBinding |
| | 406 | |
| | 407 | Summary: They allow you to write bindings code even more manually than `[Custom]`. |
| | 408 | |
| | 409 | Usage: `[CustomBinding]` can be specified only on methods: |
| | 410 | {{{ |
| | 411 | [CustomBinding] void myMethod(); |
| | 412 | }}} |
| | 413 | |
| | 414 | We should minimize the number of custom bindings as much as possible, since they are likely to be buggy. |
| | 415 | Before using `[CustomBinding]`, you should doubly consider if you really need custom bindings. |
| | 416 | You are recommended to modify code generators to avoid using `[CustomBinding]`. |
| | 417 | |
| | 418 | Before explaining the details, let us clarify the relationship of these IDL attributes. |
| | 419 | |
| | 420 | * `[CustomBinding]` on a method indicates that you can write JavaScriptCore custom bindings for the method at a higher level than `[Custom]`. |
| | 421 | |
| | 422 | You can write custom bindings with JavaScriptCore for a method as follows: |
| | 423 | |
| | 424 | {{{ |
| | 425 | interface XXX { |
| | 426 | [CustomBinding] void myMethod(int a, int b); |
| | 427 | }; |
| | 428 | }}} |
| | 429 | You can write custom bindings in WebCore/bindings/js/JSXXXCustom.cpp: |
| | 430 | {{{ |
| | 431 | EncodedJSValue JSC_HOST_CALL jsXXXPrototypeFunctionMyMethod(ExecState*) |
| | 432 | { |
| | 433 | // Read parameters manually if any. |
| | 434 | // Get the called object from the ExecState if needed and wanted. |
| | 435 | // Call the object and implementation if needed and wanted. |
| | 436 | // Return a value. |
| | 437 | return JSValue::encode(...); |
| | 438 | } |
| | 439 | }}} |
| | 440 | Refer to WebCore/bindings/js/JSXXXCustom.cpp for more details. |
| | 441 | |
| | 442 | The main difference between `[Custom]` and `[CustomBinding]` is that `[Custom]` generates a `jsXXXPrototypeFunctionMyMethod` where it performs the parameters management, casting to the object and calls the `JSXXX::myMethod` with the parameters and the instance. With `[CustomBinding]`, the implementation of `jsXXXPrototypeFunctionMyMethod` is not done automatically and it is up to the developer to do all the parameter, casting and call operations. |
| | 443 | |
| | 444 | Note: ObjC, GObject and CPP bindings do not support `[CustomBinding]` bindings. |
| | 445 | |