- From: Stefan Håkansson LK <stefan.lk.hakansson@ericsson.com>
- Date: Fri, 25 Oct 2013 10:43:51 +0000
- To: Harald Alvestrand <harald@alvestrand.no>, "public-media-capture@w3.org" <public-media-capture@w3.org>
On 25/10/13 06:12, Harald Alvestrand wrote: > On 10/24/2013 08:56 PM, Martin Thomson wrote: >> This might be overly constraining. It's not necessary for the >> platform-constructed objects to have a constructor. But it would be >> nice if applications could do the following: >> >> var mediaStream = new MediaStream(...) >> plaformMediaStream instanceof MediaStream // === true >> >> have you considered the possibility of having addTrack/removeTrack >> throw on platform-constructed streams, i.e.: >> >> // [NoInterfaceObject] >> function PlatformMediaStream() { >> MediaStream.apply(this, [].concat.apply(arguments)); >> } >> PlatformMediaStream.prototype = new MediaStream(); >> function notAllowed() { >> throw new Error('operation not permitted'); >> // or use DOMError as appropriate, I'm no longer able to follow that thread >> } >> PlatformMediaStream.prototype.addStream = notAllowed; >> PlatformMediaStream.prototype.removeStream = notAllowed; > > Hmm. Are you suggesting that the UA do tis, or that an adapter could do > this? > I think that if we followed Stefan's proposal, a JS user could do: > > var nonPlatformMediaStream = new MediaStream(aPlatformMediaStream) > > and get the same result as with the current spec (where adding and > removing streams is allowed). > > So the question on the table is: > > Is there value in having the UA police whether or not one can add tracks > to an UA-constructed MediaStream? I think that is the core question to answer. It makes things a little bit cleaner IMHO, but the question is whether or not that motivates this change. > > (since it's clear that JS can make whatever streams it needs after that > point) > > >> >> On 24 October 2013 04:19, Stefan Håkansson LK >> <stefan.lk.hakansson@ericsson.com> wrote: >>> Hi, this relates to bug 22270, >>> https://www.w3.org/Bugs/Public/show_bug.cgi?id=22270, that proposes to >>> allow adding/removing tracks from a (by the app) constructed MediaStream >>> only. Platform generated MediaStreams (those coming from getUserMedia, >>> and on the remote side of a PeerConnection) should not have those methods. >>> >>> We could spec that by having completely independent IDLs for >>> "Constructed" and "Platform" MediaStream's, but since there is such a >>> large overlap between them it seems more efficient to use a base >>> description that they both extend. >>> >>> I've sketched on two alternatives. The second one (Alternative B)is >>> inspired by Web Worker's (and its AbstractWorker) with an >>> AbstractMediaStream which is "implemented" by Platform/Constructed >>> MediaStreams. The first one (alternative A) uses inheritance instead of >>> "implements". >>> >>> I'm far from a WEBIdl expert, but to me Alternative A seems better in >>> that we can specify consumers be able to consume the "BaseMediaStream" >>> only, and would not have to worry about updating them if we would ever >>> add another type of MediaStream (that inherits from BaseMS). If we go >>> with alternative B we would have to spec that every consumer can handle >>> two types of MediaStream's for now (PlatfromMediaStream and >>> ConstructedMediaStream), and would have to update them if we add another >>> type in the future. >>> >>> Are there any comments or opinions? (And yes, the names are horrible.) >>> >>> Stefan >>> >>> >>> >>> >>> Alternative A >>> ============= >>> interface BaseMediaStream : EventTarget { >>> readonly attribute DOMString id; >>> sequence<MediaStreamTrack> getAudioTracks (); >>> sequence<MediaStreamTrack> getVideoTracks (); >>> MediaStreamTrack? getTrackById (DOMString trackId); >>> readonly attribute boolean active; >>> attribute EventHandler oninactive; >>> }; >>> >>> >>> interface PlatformMediaStream : BaseMediaStream { >>> attribute EventHandler onaddtrack; >>> attribute EventHandler onremovetrack; >>> }; >>> >>> >>> >>> [Constructor, >>> Constructor (BaseMediaStream stream), >>> Constructor (MediaStreamTrackSequence tracks)] >>> interface ConstructedMediaStream : BaseMediaStream { >>> void addTrack (MediaStreamTrack track); >>> void removeTrack (MediaStreamTrack >>> track); >>> }; >>> >>> >>> Alternative B >>> ============= >>> [NoInterfaceObject] >>> interface AbstractMediaStream { >>> readonly attribute DOMString id; >>> sequence<MediaStreamTrack> getAudioTracks (); >>> sequence<MediaStreamTrack> getVideoTracks (); >>> MediaStreamTrack? getTrackById (DOMString trackId); >>> readonly attribute boolean active; >>> attribute EventHandler oninactive; >>> }; >>> >>> >>> interface PlatformMediaStream : EventTarget { >>> attribute EventHandler onaddtrack; >>> attribute EventHandler onremovetrack; >>> }; >>> PlatformMediaStream implements AbstractMediaStream; >>> >>> >>> [Constructor, >>> Constructor (ConstructedMediaStream stream), >>> Constructor (PlatformMediaStream stream), >>> Constructor (MediaStreamTrackSequence tracks)] >>> interface ConstructedMediaStream : EventTarget { >>> void addTrack (MediaStreamTrack track); >>> void removeTrack (MediaStreamTrack track); >>> }; >>> ConstructedMediaStream implements AbstractMediaStream; >>> > > >
Received on Friday, 25 October 2013 10:44:17 UTC