- From: Cameron McCormack <cam@mcc.id.au>
- Date: Thu, 2 Jun 2011 14:23:53 +1200
- To: Boris Zbarsky <bzbarsky@MIT.EDU>
- Cc: public-web-perf@w3.org
Boris Zbarsky: > Consider the case of a DOM with both ES and non-ES bindings, where he > non-ES code wants to pass a FrameRequestCallback object to the ES code > and have that ES code register the callback. Or heck, ES code wants to > pass a FrameRequestCallback to some other method implemented in a non-ES > language which will then pass it back into ES which ends up registering it. > > Is such a setup possible in the FunctionOnly case? If not, do we really > want to preclude it? I think it is possible. Let’s say we have: interface WindowTiming { long requestAnimationFrame(in FrameRequestCallback callback); FrameRequestCallback getLastRegisteredCallback(); }; Window implements WindowTiming; [Callback=FunctionOnly,NoInterfaceObject] interface FrameRequestCallback { void sample(in DOMTimeStamp time); }; And let’s say we have both JS and Java bindings in our implementation. We’d have these Java interfaces: interface Window { ... } interface WindowTiming { int requestAnimationFrame(FrameRequestCallback callback); FrameRequestCallback getLastRegisteredCallback(); } interface FrameRequestCallback { void sample(long time); } Code that registered a callback from Java would look like: Window window = ...; WindowTiming timing = (WindowTiming) window; timing.requestAnimationFrame(new FrameRequestCallback() { void sample(long time) { // do some animation } }); If in JS you then did: var callback = window.getLastRegisteredCallback(); then callback could be a unique Function object that is the “JS wrapper” for the Java FrameRequestCallback. Its [[Call]] would call the sample method of the wrapped Java object. I don’t know if Web IDL needs to talk about how in particular objects from one language are reflected in another. > What are the benefits of using FunctionOnly? Simplicity, I guess. Why allow ({ sample: function() { ... }) when in JS the idiom is to use a bare Function object? Now, the reason the ({ sample: ... }) style is allowed for interfaces with a single operation in Web IDL is because I wanted it to be consistent with how you would handle implementing interfaces with multiple operations in JS. Such cases come up in Web APIs so far, though. I added the [Callback=FunctionOnly] annotation because other spec authors wanted to restrict the JS binding in this way, and weren’t convinced that allowing both the object and Function way was useful. -- Cameron McCormack ≝ http://mcc.id.au/
Received on Thursday, 2 June 2011 02:24:22 UTC