- From: John Daggett <jdaggett@mozilla.com>
- Date: Thu, 26 Mar 2015 15:42:20 +0900
- To: www-style <www-style@w3.org>
- Message-ID: <CALYZoVPO1YRbpqyqEyf5SxTtguxRXr86gAjLwQA=HS0OZE_jZg@mail.gmail.com>
We've been working on writing testcases for the Gecko implementation of
the CSS Font Loading spec and I think we should simplify the handling of
parse errors in the FontFace constructor.
The current spec definition of the FontFace constructor takes three
parameters, the family name, the source, and an optional dictionary of
descriptors:
var f = new FontFace("test", "url(test.woff)", { weight: "bold" });
// errors
var f1 = new FontFace("x,y", "url(x)"); // invalid family name
var f2 = new FontFace("test", "x"); // invalid src argument
The error handling of these two constructor calls is different. For
invalid family names and descriptors, the parse is rejected but a
FontFace object is returned with invalid values set to the empty string
and status set to "error".
But for invalid src values, there's a more complicated sequence of steps
that occur, such that the status of the returned FontFace starts as
"unloaded" and then to switches to "error". The spec states:
If it fails to parse correctly, queue a task to set font face’s
status attribute to "error" and reject font face’s
[[FontStatusPromise]] with a DOMException named "SyntaxError"
exception, and abort these steps.
I think it's much simpler to handle the src argument, when it's a
DOMSstring, just as the family and descriptors arguments are handled --
parse the string and immediately set the status to "error" if a parse
error occurs. This is better for authors and eliminates an extra, odd
set of state changes for implementations.
Suggested spec change --
Old wording ======================
1. Let font face be a fresh FontFace object. Set font face’s status
attribute to "unloaded", Set its internal [[FontStatusPromise]]
slot to a fresh pending Promise object.
Parse the family argument, and the members of the descriptors
argument, according to the grammars of the corresponding descriptors
of the CSS @font-face rule. If any of them fail to parse correctly,
reject font face’s [[FontStatusPromise]] with a DOMException named
"SyntaxError", set font face’s corresponding attributes to the empty
string, and set font face’s status attribute to "error". Otherwise,
set font face’s corresponding attributes to the serialization of the
parsed values.
Return font face. If font face’s status is "error", terminate this
algorithm; otherwise, complete the rest of these steps asynchronously.
2. If the source argument was a DOMString, parse it according to the
grammar of the src descriptor of the CSS @font-face rule. If it fails
to parse correctly, queue a task to set font face’s status attribute
to "error" and reject font face’s [[FontStatusPromise]] with a
DOMException named "SyntaxError" exception, and abort these steps;
otherwise, set font face’s internal [[Urls]] slot to the string.
If the source argument was a BinaryData, set font face’s internal
[[Data]] slot to the passed argument.
New wording ======================
1. Let font face be a fresh FontFace object. Set font face’s status
attribute to "unloaded", Set its internal [[FontStatusPromise]]
slot to a fresh pending Promise object.
Parse the family argument, and the members of the descriptors
argument, according to the grammars of the corresponding descriptors
of the CSS @font-face rule. If any of them fail to parse correctly,
reject font face’s [[FontStatusPromise]] with a DOMException named
"SyntaxError", set font face’s corresponding attributes to the empty
string, and set font face’s status attribute to "error". Otherwise,
set font face’s corresponding attributes to the serialization of the
parsed values.
If the source argument was a DOMString, parse it according to the
grammar of the src descriptor of the CSS @font-face rule. If it fails
to parse correctly, set font face’s status attribute to "error" and
reject font face’s [[FontStatusPromise]] with a DOMException named
"SyntaxError" exception; otherwise, set font face’s internal [[Urls]]
slot to the string.
Return font face. If font face’s status is "error", terminate this
algorithm; otherwise, complete the rest of these steps asynchronously.
2. If the source argument was a BinaryData, set font face’s internal
[[Data]] slot to the passed argument.
I should note here that the Chrome implementation already follows the
*new* wording. :)
Regards,
John Daggett
Received on Thursday, 26 March 2015 06:42:48 UTC