<br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Nov 20, 2012 at 3:08 PM, Tab Atkins Jr. <span dir="ltr"><<a href="mailto:jackalmage@gmail.com" target="_blank">jackalmage@gmail.com</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div>On Tue, Nov 20, 2012 at 3:28 AM, Alex Russell <<a href="mailto:alex@dojotoolkit.org" target="_blank">alex@dojotoolkit.org</a>> wrote:<br>



> Actually, looking at this IDL more closely, I see unneeded invariants<br>
> causing most of the problem. If URLQuery subclasses Map (assuming we make<br>
> this possible, which we should),<br>
<br>
</div>Already possible.  AWB posted code to WHATWG showing how.  The Map<br>
constructor is set up to respond correctly to "Map.call(this);",<br>
blessing the object with the appropriate Map data structure.<br>
<div><br>
> it only needs to promise to hand back<br>
> strings, not take them. The behavior can simply be defined as toString()-ing<br>
> the contents when calling "getAll()". There's no reason to re-defined<br>
> anything about Map here or prevent the normal Map methods from taking<br>
> any/any as key/value pairs. That URLQuery might, in normal usage, behave<br>
> this way is a decision for users of the API.<br>
<br>
</div>Nope, that's not good enough.  For example, you have to do input<br>
cleanup (replacing lone surrogates with U+FFFD, escaping &, etc.)<br>
which affects whether two keys are "the same".  This affects set()'s<br>
replacing behavior, and add()'s coalescing behavior.  Heck, even<br>
without extra cleanup, just the fact that it requires string keys<br>
means you need to eagerly preserve the invariant - foo.set([1,2],<br>
'bar') and foo.set('1,2', 'bar') should both set the same key.  So,<br>
the stringifying must be eager.  Additionally, you *must* override the<br>
plain method anyway, since (if the URLQuery is attached to a URL), it<br>
synchronously adjusts the underlying URL as well.<br>
<br>
However, if you do a normal subclass, then people can do silly things<br>
like "Map.prototype.set(query, key, val);", which would skip<br>
URLQuery's own set() method, avoiding the invariant preservation and<br>
the URL manipulation.<br>
<br>
We could avoid these problems by only "subclassing" in the sense that<br>
URLQuery.prototype = new Map();  (or Object.create(Map.prototype)),<br>
but not invoking the Map constructor and actually storing data in a<br>
closure-hidden internal Map, so instanceof would work but using Map's<br>
own methods wouldn't.<br></blockquote><div><br></div><div><br></div><div>class URLQuery extends Map {<br></div><div><div>  constructor(url) {</div><div>    // parse the url into a "map", for now</div>
<div>    // just pretend this is the result of parsing</div><div>    // the url:</div><div>    let parsed = [ ["a", "alpha"], ["b", "beta"] ];</div><div>    super(parsed);</div><div>


  }</div><div>  getAll() {</div><div>    // ... implementation details...</div><div>  }</div><div>} </div><div><br></div><div>let query = new URLQuery("<a href="http://example.com" target="_blank">http://example.com</a>");</div>


</div><div><br></div><div>(I don't actually know if that's the correct way to use URLQuery, I was just making something up for the sake of illustration)</div><div><br></div><div>Rick</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">


<br>
Or, we could ignore the whole thing, and just make sure that we<br>
ducktype as a Map.  Anne is fine with either, as long as a resolution<br>
is forthcoming in a reasonable amount of time (more or less, only<br>
dependent on things that are already Harmony, such that we can just<br>
apply them to the spec now, even if the actual impl will be magic<br>
before the feature is implemented properly).<br>
<span><font color="#888888"><br>
~TJ<br>
</font></span><div><div>_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org" target="_blank">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</div></div></blockquote></div><br></div>