From: Andrew Wilson [mailto:atwil...@google.com]
Sent: Friday, June 03, 2011 2:15 PM
On Fri, Jun 3, 2011 at 1:02 PM, Jonas Sicking 
<jo...@sicking.cc<mailto:jo...@sicking.cc>> wrote:
On Fri, Jun 3, 2011 at 11:37 AM, Kenneth Russell 
<k...@google.com<mailto:k...@google.com>> wrote:
> On Fri, Jun 3, 2011 at 9:46 AM, Glenn Maynard 
> <gl...@zewt.org<mailto:gl...@zewt.org>> wrote:
>> On Fri, Jun 3, 2011 at 11:12 AM, Dmitry Lomov 
>> <dslo...@google.com<mailto:dslo...@google.com>> wrote:
>>> a) Recursive transfer lists. Allow arbitrary objects, not only ArrayBuffers,
>>> to appear in transfer lists.  ArrayBuffers that are under objects in
>>> transfer lists are transferred, others are cloned.
>>
>> This again causes the same forwards-compatibility problem.  If you do this:
>>
>> frame = { video: canvasPixelArrayInstance, histogram: arrayBuffer } }
>> postMessage({ frame: frame }, { transfer: frame });
>>
>> and you expect only histogram to be transferred (since that's all that
>> supports it when you write this code), your code breaks when
>> CanvasPixelArray later supports it.
>>
>>> b) Transfer lists + separate transferMessage method. We still equip
>>> postMessage with transfer lists, these transfer lists list ArrayBuffers, and
>>> we provide a separate method transferMessage with recursive transfer
>>> semantics.
>>> What do people think?
>>
>> Same problem.
>>
>> If you want a quicker way to transfer all messages of given types, see
>> my previous mail: { transfer: ArrayBuffer }.
>
> Agreed on these points. Using an object graph for the transfer list
> (which is what the recursive transfer list idea boils down to) also
> sounds overly complicated.
>
> May I suggest to reconsider adding another optional array argument to
> postMessage for the transfer list, rather than using an object with
> special properties?
>
> Points in favor of adding another optional array argument:
>
> 1. Less typing, and less possibility that a typo will cause incorrect 
> behavior:
>  worker.postMessage(objectGraph, null, [ arrayBuffer1ToTransfer,
> arrayBuffer2ToTransfer ]);
>    vs.
>  worker.postMessage(objectGraph, { transfer: [
> arrayBuffer1ToTransfer, arrayBuffer2ToTransfer] });
>
> 2. Possibility of using Web IDL to specify the type of the optional
> array argument (i.e., "Transferable[]?"). Would be harder to do using
> an object -- requiring either specifying another interface type with
> the "ports" and "transfer" attributes, or using "any" plus
> ECMAScript-specific text.
>
> Points in favor of using an object:
>
> 1. Could potentially overload the meaning of the optional ports array
> argument, avoiding adding another argument to postMessage.
>
> 2. More extensible in the future.
>
> Thoughts?
My first thought is that so far no implementer has stepped up and said
that changing the meaning of the 'ports' argument would not be
acceptable. Would be great if someone who is reading this thread and
who works at Google/Apple/Opera could check with the relevant people
to see if such a change would be possible.

It's certainly possible - there's nothing intrinsically difficult with making 
this change from an implementor's point of view (I've had my fingers in both 
the WebKit and Chromium MessagePort implementations so I'm relatively confident 
that this would not be prohibitively hard).

Is it desirable? My knee-jerk reaction is that we should stick with changes 
that are compatible with the existing API (like Ian's original suggestion, or 
adding a separate optional array of transferable objects) - I have no data on 
the number of sites that are using the current API but I don't think we should 
be changing existing APIs with multiple implementations without significant 
motivation. The stated motivations for breaking this API don't seem compelling 
to me given the existence of backwards-compatible alternatives.

+1 Having worked on compatibility for a while now, it's going to break someone 
if you change the existing signature in a non-backwards compatible way.
I for one, would prefer the option that adds a 3rd parameter with the list of 
transferrable object references in the main graph of parameter 1. This seems 
like the least ugly way of adding this capability.

Reply via email to