W3C home > Mailing lists > Public > public-web-perf@w3.org > June 2011

Re: ISSUE-7: FrameRequestCallback interface should be designated as Callback=FunctionOnly [Request Animation Frame]

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
Message-ID: <20110602022353.GA22694@wok.mcc.id.au>
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 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Thursday, 2 June 2011 02:24:23 GMT