My rough understanding of the situation (thanks @marius.vlad0 for the detailed investigation!) is this:
We send a keyboard.enter event to an unmapped surface.
This somehow leads Firefox to commit that surface without a buffer but with a frame callback.
Since that surface is not visible, the compositor doesn't ever send back a wl_callback.done().
The first issue is that kiosk-shell send a keyboard.enter to an unmapped surface. This certainly isn't useful in general, although I don't think it's a protocol correctness violation. In any case, !564 fixes this.
This stray enter event uncovers the second issue, which is that Firefox sends a frame callback when committing without a buffer and effectively blocks on that callback signalling. If the stray enter, which seems to trigger this, is in fact not a protocol correctness violation, then Firefox's behavior is also independently problematic and should also be fixed.
So we should fix that behaviour indeed.