On Wed, Sep 8, 2010 at 9:45 AM, Oliver Hunt <[email protected]> wrote:
> The problem with throwing an exception is that it's fairly common for code to 
> end up accidentally producing a NaN or Infinite value, and throwing an 
> exception would prevent all subsequent drawing from occurring.

I believe that was the point: you throw an exception, the bug becomes
obvious, and you fix it.  Without the exception, you draw the wrong
thing, and it's much harder to find the problem.

> I suggested this behaviour a long time ago after running into yet another 
> piece of code that hit this case in webkit (back when the spec said to throw 
> an exception) yet firefox and opera did not throw.  In some cases firefox 
> does throw, and in others it doesn't (or maybe didn't? has ffx behaviour 
> changed?) and we came to the conclusion that as much as possible the canvas 
> should silently ignore NaN/Infinite values.
>
> --Oliver
>
> On Sep 7, 2010, at 10:36 PM, Jonas Sicking wrote:
>
>> This seems like a strange choice of behavior. Given that this is very
>> likely a bug in the program, wouldn't it make more sense to throw an
>> exception as to make it easier to debug? Similar to for example
>> Node.appendChild when called with a null argument.
>>
>> / Jonas
>>
>> On Tue, Sep 7, 2010 at 10:32 PM, Sam Weinig <[email protected]> wrote:
>>> In 4.8.11.1 the spec does state:
>>>
>>> "Except where otherwise specified, for the 2D context interface, any method 
>>> call with a numeric argument whose value is infinite or a NaN value must be 
>>> ignored."
>>>
>>> -Sam
>>>
>>> On Sep 7, 2010, at 9:41 PM, Boris Zbarsky wrote:
>>>
>>>> Consider this testcase:
>>>>
>>>> <!doctype html>
>>>> <html>
>>>>  <body>
>>>>    <canvas id="c" width="200" height="200"></canvas>
>>>>    <script>
>>>>    try {
>>>>      var c = document.getElementById("c"),
>>>>      t = c.getContext("2d");
>>>>      t.moveTo(100, 100);
>>>>      t.lineTo(NaN, NaN);
>>>>      t.lineTo(50, 25);
>>>>      t.stroke();
>>>>    } catch (e) {alert(e); }
>>>>    </script>
>>>>  </body>
>>>> </html>
>>>>
>>>> Behavior in the spec seems to be undefined (in particular, no mention is 
>>>> made as to what the canvas API functions are supposed to do if non-finite 
>>>> values are passed in).  Behavior in browsers is:
>>>>
>>>> Presto: Throws NOT_SUPPORTED_ERR on that lineTo(NaN, NaN) call.
>>>> Gecko: Throws DOM_SYNTAX_ERR on that lineTo(NaN, NaN) call.
>>>> Webkit: Silently ignores the lineTo(NaN, NaN) call, and then
>>>>        draws a line from (100,100) to (50, 25).
>>>>
>>>> Seems like the spec needs to define this.
>>>>
>>>> -Boris
>>>>
>>>> P.S.  This isn't a hypothetical issue; this came up in a page that was 
>>>> trying to graph things using canvas and ending up with divide-by-0 all 
>>>> over the place.  It "worked" in webkit (though not drawing the right 
>>>> thing, so much).  It failed to draw anything in Presto or Gecko.
>>>
>>>
>
>

Reply via email to