Re: [css-font-loading] tracking FontFace objects for loadingdone/loadingerror events

On Tue, Mar 17, 2015 at 11:49 PM, Cameron McCormack <cam@mcc.id.au> wrote:
> The spec uses [[LoadingFonts]], [[LoadedFonts]] and [[FailedFonts]]
> internal slots to track when loading, loadingdone and loadingerror
> events are fired and with what details.
>
> Q1
>
> The only time that a “loading” event is fired at a FontFaceSet is when
> one of the FontFaces in it has its status change to “loading”.  This
> means that an event won’t be fired if a FontFace that is already
> “loading” is added to the FontFaceSet.  For example:
>
>   assert(document.fonts.status == "loaded");
>   var f = new FontFace("test", "url(very-long-loading-font)");
>   f.load();
>   setTimeout(function() {
>     assert(f.status == "loading");
>     document.fonts.add(f);
>     assert(document.fonts.status == "loaded");  // ?
>   }, 1000);
>
> Is this intended, or should adding the FontFace cause
> document.fonts.status to become “loading” and f to be added to
> [[LoadingFonts]]?

Unintended.  Fixed now.

(There's a parallel issue with loaded or errored fonts; I think we
want to keep that as it is.  Firing an error event because you added
an already-errored font to the set seems like a bad idea.)

> Q2
>
> When a FontFace that is in a FontFaceSet has its status updated to
> “loaded”, it is added to the [[LoadedFonts]] slot.  Later, the contents
> of that [[LoadedFonts]] slot are used as a value on the “loadingdone”
> event.  The FontFaces in [[LoadedFonts]] are exposed on the
> “loadingdone” event even if they have been subsequently removed from the
> FontFaceSet.  For example:
>
>   assert(document.fonts.status == "loaded");
>   var f1 = new FontFace("test", "url(takes-5s-to-load)");
>   var f2 = new FontFace("test", "url(takes-10s-to-load)");
>   document.fonts.add(f1);
>   document.fonts.add(f2);
>   f1.load();
>   f2.load();
>   f1.loaded.then(function() {
>     assert(f1.status == "loaded");
>     assert(f2.status == "loading”);
>     assert(document.fonts.status == "loading");
>     document.fonts.remove(f1);
>     assert(document.fonts.status == "loading");
>     document.fonts.onloadingdone = function(e) {
>       assert(e.fontfaces[0] == f1);  // ?
>     };
>     document.fonts.clear();
>     assert(document.fonts.status == "loaded");
>   });
>
> Is that intended?  Or should the FontFaces exposed on the event object
> only be the ones that were in the FontFaceSet at the time its status
> became “loaded”?

Unintended.  Fixed.

> Q3
>
> What is meant to happen when you add an already-“loaded” FontFace to a
> “loaded” FontFaceSet?  My reading of the spec is that no events are
> fired.  Is this correct, and intended?

That's intended, though I could be convinced otherwise by a use-case.

~TJ

Received on Wednesday, 18 March 2015 23:10:48 UTC