- From: Boris Zbarsky <bzbarsky@MIT.EDU>
- Date: Thu, 09 May 2013 11:27:22 -0400
- To: Andreas Rossberg <rossberg@google.com>
- CC: Allen Wirfs-Brock <allen@wirfs-brock.com>, "public-script-coord@w3.org" <public-script-coord@w3.org>
On 5/9/13 11:11 AM, Andreas Rossberg wrote:
> I think existing JS legacy notwithstanding it is generally bad
> practice for an API to make an observable distinction between passing
> undefined and not passing anything, especially in the light of ES6's
> treatment of defaults. So I don't think a higher-level declarative
> mechanism like WebIDL should ever want to support that.
That was sort of my feeling too; just trying to figure out what the
right spec language here is.
Here's an interesting concrete example:
CanvasRenderingContext2D.drawImage, which is specified like so at the
moment:
void drawImage(CanvasImageSource image, unrestricted double dx,
unrestricted double dy);
void drawImage(CanvasImageSource image, unrestricted double dx,
unrestricted double dy, unrestricted double dw,
unrestricted double dh);
void drawImage(CanvasImageSource image, unrestricted double sx,
unrestricted double sy, unrestricted double sw,
unrestricted double sh, unrestricted double dx,
unrestricted double dy, unrestricted double dw,
unrestricted double dh);
In JS-speak, the behavior it's generally aiming for would probably be
expressed like this today:
function drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
if (arguments.length != 3 && arguments.length != 5 &&
arguments.length != 9) {
throw new TypeError();
}
if (arguments.length != 9) {
dx = sx; sx = 0;
dy = sy; sy = 0;
}
if (arguments.length == 5) {
dw = sw; sw = undefined;
dh = sh; sh = undefined;
}
// Proceed with the algorithm, treating undefined sw/sh/dw/dh as
// meaning intrinsic sizes for the image, but being careful to
// check arguments.length some more to see whether the undefined
// means that or NaN, or something.
}
So this is a quite crappy API from the point of view of undefined == not
passed because the version that passes the optional source rect puts it
_before_ the destination rect. And it's not quite clear what this:
drawImage(image, 0, 0, undefined);
should do. In today's world it throws. Should WebIDL preserve the
ability to do that in that situation?
-Boris
Received on Thursday, 9 May 2013 15:27:56 UTC