- From: Tab Atkins Jr. <jackalmage@gmail.com>
- Date: Wed, 8 Apr 2015 17:52:59 -0700
- To: John Daggett <jdaggett@mozilla.com>
- Cc: www-style <www-style@w3.org>
On Wed, Mar 25, 2015 at 11:42 PM, John Daggett <jdaggett@mozilla.com> wrote: > 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'm okay with this. Fixed. ~TJ
Received on Thursday, 9 April 2015 00:53:46 UTC