[webkit-dev] Invocation with undefined this on JS binding object

Geoffrey Garen ggaren at apple.com
Wed Jul 1 11:07:19 PDT 2015


Hi Xabier.

Our bindings assume, by default, that the ‘this’ parameter passed to any DOM interface is an object of the interface’s type. This is how most DOM bindings work.

Our bindings also assume that a requested property can be read from the ‘this’ object, which represents the DOM interface.

If you’re going to pass undefined into the size function, you’ve violated both assumptions. (It would be meaningless to remove the type check — the call to size later would just crash anyway.)

The easiest way to make this work is to make the function custom. What exactly did you do when you tried that, and why exactly didn’t it work?

Side note: Shouldn’t this function bear the name “strategySize” rather than “size”?

Geoff

> On Jul 1, 2015, at 10:59 AM, Xabier Rodríguez Calvar <calvaris at igalia.com> wrote:
> 
> 	Hello,
> 
> I need some help with some JS bindings code. I am implementing
> CountQueuingStrategy [1], which is an object containing two properties,
> one of them a function. That strategy is passed to another
> ReadableStream object [2] and as you can see at step 8, the size method
> is extracted from the strategy and kept inside the stream for later
> use. That use happens at [3], step 5.b.i, when the spec says that we
> have to pass undefined as this (and we do).
> 
> [1] https://streams.spec.whatwg.org/#cqs-class
> [2] https://streams.spec.whatwg.org/#rs-constructor
> [3] https://streams.spec.whatwg.org/#enqueue-in-readable-stream
> 
> The problem comes when invoking that method at the generated bindings:
> 
> EncodedJSValue JSC_HOST_CALL
> jsCountQueuingStrategyPrototypeFunctionSize(ExecState* exec)
> {
>    JSValue thisValue = exec->thisValue();
>    JSCountQueuingStrategy* castedThis =
> jsDynamicCast<JSCountQueuingStrategy*>(thisValue);
>    if (UNLIKELY(!castedThis))
>        return throwThisTypeError(*exec, "CountQueuingStrategy",
> "size");
>    ASSERT_GC_OBJECT_INHERITS(castedThis,
> JSCountQueuingStrategy::info());
>    return JSValue::encode(castedThis->size(exec));
> }
> 
> The problem is that it checks that "this" casts to the class and of
> course it fails because the spec says it has to be undefined. I haven't
> found any way to overcome this, even making the method custom.
> 
> Any ideas here?
> 
> Thanks in advance and best regards.
> _______________________________________________
> webkit-dev mailing list
> webkit-dev at lists.webkit.org
> https://lists.webkit.org/mailman/listinfo/webkit-dev



More information about the webkit-dev mailing list