Tom Van Cutsem wrote:
2013/1/23 Brendan Eich <bren...@mozilla.com <mailto:bren...@mozilla.com>>

    Brandon Benvie wrote:

        It is my opinion that the primary use case for private symbols
        is for properties that proxies expressly shouldn't be given a
        chance, in any manner, to corrupt or modify. They are likely
        used for sensitive internal state that will only be accessed
        by methods or friend classes created in service of the target.

        A membrane becomes less valuable if breaking the target is an
        easily accomplished accidental side effect. This is already
        visible in practice today when you attempt to use WeakMaps to
        create private state for objects and they are proxied, since
        the private state will be keyed on `this` in the constructor
        which won't match `this` in methods invoked on the proxy.


    ding ding ding ding ding ding....


Let's try to separate the issues here:

Thanks, did not mean to ring Pavlov's bell there ;-).

1) proxies and private symbols: Brandon strengthens the case that proxies should be oblivious to private symbols. 2) any sort of private state (regardless of whether it's stored using private symbols or weakmaps) is always keyed off of the identity of the target. 3) because of JS's "invoke = get + apply" semantics, by default a proxy always leaves the |this| value pointing at the proxy.

The combination of 2) and 3) is problematic (as in: not transparent).

This is an aspect of JS's dynamic-by-default |this| binding, it seems to me.

Looking only at 3), sometimes this is what you want, and sometimes it isn't.

Very true. For HTML5, given function f written in JS, loaded in window referenced from another frame by w, referencing a WindowProxy, w.f() binds |this| in f to the WindowProxy. We do not want to expose the Window on the scope chain directly -- it is too easy to leak that capability and bypass the same-origin security membraning done by the WindowProxy.

For a built-in function written in C++, implementations I know of all auto-unwrap to get the Window. One might then want to self-host such legacy C++ built-ins, and want auto-unwrapping. The burden of not leaking the capability still exists, but the self-hosted built-in is part of the TCB, same as the C++ counterpart.

So the issue is situational, depending on trusted computing base membership among other things.

In the case of membranes I agree the more natural thing to do is to rebind |this| to the real target, not a membraned proxy for it. I think membranes can do that already without added cost: the "get" trap already needs to return a wrapper for the actual function object anyway. That wrapper, when called, can call the real function with the real target as the |this| value.

Looking back at the code for an identity-preserving membrane <http://wiki.ecmascript.org/doku.php?id=harmony:proxies#an_identity-preserving_membrane> I think this membrane actually properly unwraps the |this| value before forwarding. I haven't yet tried expressing this code using Direct proxies, but off the top of my head I don't see how the change from proxies to direct proxies would impact this particular aspect of membranes.

So 3) may be an issue in general, but membranes should be able to avoid it.

Exactly.

/be
_______________________________________________
es-discuss mailing list
es-discuss@mozilla.org
https://mail.mozilla.org/listinfo/es-discuss

Reply via email to