Thanks Fil. It looks like the textMetrics I use with an offscreen Canvas does not provide the correct text height in Firefox. Will investigate further to see if there is a less browser-dependent way of doing this.
Solved: r.textMetrics uses Canvas.measureText() to find rendered font sizes. It appears measureText() does not report fontBoundingBoxAscent/Descent in Firefox. Changing it to actualBoundingBoxAscent/Descent seems to solve the problem.