W3C home > Mailing lists > Public > public-webapps@w3.org > April to June 2011

Re: [indexeddb] IDBDatabase.setVersion non-nullable parameter has a default for null

From: Cameron McCormack <cam@mcc.id.au>
Date: Mon, 13 Jun 2011 15:35:34 +1200
To: Mark Pilgrim <pilgrim@google.com>, Jonas Sicking <jonas@sicking.cc>
Cc: Eliot Graff <Eliot.Graff@microsoft.com>, "public-webapps@w3.org" <public-webapps@w3.org>, Israel Hilerio <israelh@microsoft.com>, Jeremy Orlow <jorlow@chromium.org>, Adam Barth <w3c@adambarth.com>
Message-ID: <20110613033534.GC28137@wok.mcc.id.au>
Mark Pilgrim:
> That is highly unintuitive. What's the point of listing the argument as "not
> optional" if it is, in fact, completely optional?

It’s not optional in that if there were another method of the same name
which doesn’t have that argument, you can distinguish between the two
calls.  For example if you had:

  void f();
  void f(in DOMString s);

then in JS if you called obj.f() it would behave as described for the
first method, and if you called obj.f(undefined) or obj.f("whatever") it
would behave as described for the second method.

If you had

  void f(in optional DOMString);

then prose describing the behaviour of f could distinguish between
obj.f() and obj.f("undefined").

And if you had

  void f();
  void f(in optional DOMString);

then it’d be ambiguous which one you’re calling with obj.f().

It’s also not optional in language bindings where function calls and
declarations are stricter than in JS.

But you are right that it’s confusing if you just have a single method

  void f(in DOMString s);

since clearly you can call obj.f() in JS and it won’t throw a TypeError.

> (For that matter, why list it as non-nullable if null is treated like
> the empty string and the empty string is an acceptable value?)

The “non-nullableness” is really a property of the type, not the
argument, and it means whether null is one of the valid values of the
type or not.  So at the IDL level, the value can’t be null.  If in JS
you pass in null, the default coercion behaviour is to turn that into
"".  For arguments of type DOMString, you can pass in pretty much any
kind of value in JS and it’ll get stringified in some way.

Jonas Sicking:
> Huh?? At least in the Gecko DOM implementation we always throw an
> exception if too few parameters are defined. Only if parameters
> are explicitly marked as [optional] are you allowed to not include
> them. I was under the impression that this was the case in most DOM
> implementations, with notable exception of webkit.

WebKit and Chrome, I think, which have independent JS binding code.

Adam Barth:
> > WebKit is looser in this regard.  We probably should change the
> > default for new IDL, but it's a delicate task and I've been busy.  :(

What about for old IDL?  Do you feel that you can make this change
without breaking sites?  One of the “advantages” of specifying the
looser approach is that it’s further down the “race to the bottom” hill,
so if we are going to tend towards it eventually we may as well jump
there now.  We saw that happen with addEventListener.

Jonas Sicking:
> This is why it surprises me of WebIDL specifies WebKit behavior as the
> compliant behavior as Cameron seems to indicate.

In the spec right now it’s listed as an open issue, and it was the
WebKit behaviour that I was going to specify to resolve the issue this
week.  (So it’s not what the spec currently says.)  This is what I
mentioned in
although I didn’t get any pushback then.  I am happy to keep discussing
it but I would like to settle on a solution soon.

So I guess you are arguing for “throw if too few arguments are passed,
ignore any extra arguments”.  When we have overloads like

  void f(in long x);
  void f(in long x, in long y, in long z);

we’d need to decide whether f(1, 2) throws or is considered a call to
the first f with an extra, ignored argument.  The former seems more
consistent to me.

Cameron McCormack ≝ http://mcc.id.au/
Received on Monday, 13 June 2011 03:36:18 UTC

This archive was generated by hypermail 2.4.0 : Friday, 17 January 2020 18:13:20 UTC