- From: Marcos Caceres <w3c@marcosc.com>
- Date: Thu, 4 Jul 2013 10:46:32 +0100
- To: Tobie Langel <tobie@w3.org>
- Cc: François REMY <francois.remy.dev@outlook.com>, Brian Kardell <bkardell@gmail.com>, public-nextweb@w3.org
On Thursday, July 4, 2013 at 10:31 AM, Tobie Langel wrote: > On Thursday, July 4, 2013 at 2:58 AM, Marcos Caceres wrote: > > > > On Wednesday, July 3, 2013 at 10:21 PM, Tobie Langel wrote: > > > On Wednesday, July 3, 2013 at 9:46 PM, François REMY wrote: > > > > > Ok, I can see where there could be potential clashes for > > > > > unmaintained code. But I think this would be rare. > > > > > > > > > > > > > > > > It's not rare at all. Most websites are unmaintained, and they hold the web > > > > platform back. Ask any implementor for stories where unmaintained websites > > > > slowed down the unprefixing or the introduction of new APIs because of > > > > conflicts, you'll see for yourself. > > > > > > > > > > > > We had serious issues back in the days with PrototypeJS for document.getElementsByClassName, Function.prototype.bind, Array.prototype.reduce, Array.prototype.indexOf, Array.prototype.toJSON, String.prototype.toJSON, document.querySelectorAll, etc. > > > > > > This is absolutely going to happen. > > > > Was the problem that you were not able to tell if all those method's .toString() function returned "function valueOf() { [native code] }"? Or that those had been hijacked even though the browser did support the real deal? > > For the context, a lot of the above-mentioned methods originated in (or were popularized by) PrototypeJS and were then standardized and implemented natively. So this seems very close to the desirable outcome of prollyfills (seriously prollyfills!? <-- not getting tired of that one any time soon). > > In some cases, we had guards setup (e.g. if (!document.getElementsByClassName) …) in others we did not. Either cases came with their load of grief. A couple of examples: > > 1) document.getElementsByClassName: > > I don't remember the details of who came up with this one exactly, but Prototype included a version of it early on. The prollyfilled version (heh!) returned an instance of the Array object. The native one a LiveList. > > Because there was a guard setup to default to the native object, and because devs were relying on the set of array enum provided by Prototype, a lot of the code in applications went something like this: > > document.getElementsByClassName('foo').each(function(element) { … }); > > Of course, that started breaking as browsers started shipping a native implementation. > > 2) Array.prototype.indexOf: > > Our implementation relied on the == operator. TC-39's (which came years later) on ===. > > Again grief and hard to debug issues whichever way we'd handle the situation. Behind a guard: code that had been working start to fail as browsers implement the TC-39 version. Without a guard, code that works when Prototype isn't around suddenly starts to fail when you add the library or vise versa. > > 3) Array.prototype.toJSON and String.prototype.toJSON: > > See previous posts on the topic[1]. > > 4) document.querySelectorAll: > > The main issue here was that the native method had a bunch of bugs on different browsers which required a lot of special casing. Would have been prevented had implementors run our test suites before shipping their implementations. > > To summarize, specs are going to seriously change between what is prollyfilled ([insert snarky comment here]) and what gets shipped, and that's going to cause plenty of grief down the road. To mitigate this solid test suites using testharness.js would help along with a system to easily identify native code from prolyfills. > > Best, > Thanks for the examples, that's really helpful! Ok, yes, I see what you mean now.
Received on Thursday, 4 July 2013 09:47:03 UTC