- From: Jan-Ivar Bruaroey <jib@mozilla.com>
- Date: Fri, 06 Dec 2013 02:59:08 -0500
- To: cowwoc <cowwoc@bbs.darktech.org>, public-media-capture@w3.org
- Message-ID: <52A183CC.7060501@mozilla.com>
On 12/6/13 1:05 AM, cowwoc wrote: > On 05/12/2013 11:30 PM, Jan-Ivar Bruaroey wrote: >> Please understand that Webidl dictionaries ignore unknown keys. >> >> From http://heycam.github.io/webidl/#idl-dictionaries : >>> "A dictionary value of type D can have key–value pairs corresponding >>> to the dictionary members defined on D and on any of D’s inherited >>> dictionaries." >> >> This is on purpose for future-proofing, and all other web APIs (that >> use dictionaries at least) are on-board with this. AFAIK it is only >> our freaky mandatory constraints that fly in the face of this. > > I don't think you understood my point. There are two ways to support > "future proofing": One is to ignore unknown keys, and the other is to > support a mechanism for looking up supported keys. If you've got one, > you don't need the other. Anyone who wants to "future proof" the > dictionary just needs to use the function that returns all known > constraints as a filter (meaning, remove any key in the dictionary > that is not returned by the function). That's it, that's all. As such, > There is no reason to ignore unknown keys. I'm glad we agree on having a mechanism for looking up supported keys, and given such a mechanism, you're right, we could go either way. However, picking your way: * does not fix the footgun, * is a missed opportunity to fix our bastardized webidl, * is more work (filtering), * is redundant (two ways to detect browser support, directly vs. indirectly with gUM), and * is more complicated (bailing early is simple, filtering is not. Dictionaries are well-defined, vs. ...) The only reason I can see to pick it would be to keep what I call the footgun, the default behavior where webdevs who don't think about the complicated unknown case, make apps that (perhaps inadvertently) block everyone indiscriminately, including both legitimate and illegitimate users, until a browser is upgraded with a new constraint. Since the webdev can flip the default and the user cannot, I think we should default to the way that doesn't block the user. I already have evidence that webdevs aren't thinking ahead when they use mandatory. >> Our spec is not implementable as it stands, because it speaks about >> mandatory constraints being dictionaries. >> Our spec sorely needs review by the webidl experts group. > > I get your point about Dictionary as defined by WebIDL but I think > you're splitting hairs. If the only reason you want to ignore unknown > constraints is for the sake of meeting the WebIDL specification then > rename the type from Dictionary to something else that allows you to > throw an error on unknown constraints. I don't mean to pick on you, as you are hardly alone in this, but this is the cavalier attitude towards browser implementation and webidl that concerns me in this group, and it is evident in the spec as well. We seem to have no webidl experts, yet this doesn't seem to bother anyone, or prevent people from making stuff up. This is why I think we need to have our spec reviewed by a webidl experts group. I'm no expert, but I can tell you from having implemented JavaScript browser-objects so far, that it is not a picnic without a webidl compiler that generates secure bindings. The reason is that with JS being such a dynamic language, there is no guarantee what a content JS object contains or what it will do (what code will run) once invoked. As a result, even for non-malicious content JS, there can be dire side-effects and even security issues depending on exactly how or even how many times a browser interacts with a content JS object in an API call. This is why every webidl type I've seen implemented has a well-defined processing model, e.g. an agreed-upon pattern of access that is universal in the browser. Take the processing-model for dictionaries, for instance. Whenever a dictionary is passed in through a webidl API, the original JS object never even enters the secure area. Instead, a dedicated internal dictionary of the same type is initialized from default webidl values, and then for each known key in that dictionary, it queries the blackbox content JS object for that property once. This is repeated for each key. The normalized copy is then passed to the c++ or browser-js. This provides important code-invariants to our browser-code and minimizes chances of bugs and exploits. Conversely, when a plain JS object is passed in, or a dictionary contains a plain JS object as a member somewhere, even in a deeply nested dictionary, then different binding code is generated for the entire API that introduces tracking and rooting of that argument (or top argument if it is nested) for garbage and cycle collection purposes. The c++ or JSImpl code is then left to normalize and query the object itself, and basically try to mimick the same processing model correctly, using low-level JSApi calls. The chance of parsing and pilot errors and bugs go up dramatically. Use of these APIs require special reviews from DOM people, and they generally tell you not to do this. > Consider the alternative: > > { audio: true, video: { mandatory: { maxW1dth: 320, maxHeight: 240 }}} > > Do you know how much of my life has been wasted dealing with these > kinds of stupid typos? What about: { audio: true, video: { optional: { maxW1dth: 320, maxHeight: 240 }}} ? or: { audio: true, video: { mandtory: { maxW1dth: 320, maxHeight: 240 }}} ? This is JavaScript, right? We're making one API, not fixing JavaScript. This is out of scope. We should be creative in other areas IMHO. > Gili .: Jan-Ivar :.
Received on Friday, 6 December 2013 07:59:37 UTC