macOS Catalinaにアップグレードすると、Google Chromeのフォントの表示が変わる、ということがあった。CSSでフォントファミリーとして「Hiragino Kaku Gothic ProN」を指定していても、この指定が効かずにフォールバックされてしまうというものである。macOS Catalinaから、「Hiragino Kaku Gothic ProN(ヒラギノ角ゴ ProN)」ファミリーが削除され、「Hiragino Sans(ヒラギノ角ゴシック)」だけになったのが原因とされている。
同僚のid:polamjagが教えてくれたのだが、Chromiumのbug trackerにissueが登録されている。
内容を読むと、単に「Hiragino Kaku Gothic ProN」ファミリーが削除されたというだけでなく、NSFontManager
APIの呼び出し方によっても結果が異なるようだ。
NSFontManager.availableFontFamilies
の結果が「Hiragino Kaku Gothic ProN」を含まなくなり、NSFontManager.availableMembers(ofFontFamily:)
を呼べば「Hiragino Kaku Gothic ProN」が見つかる。
import Cocoa let hiraginoKakuGothicProN = "Hiragino Kaku Gothic ProN" let fontManager = NSFontManager.shared print(fontManager.availableFontFamilies.filter { $0 == hiraginoKakuGothicProN }) // [] if let hiragino = fontManager.availableMembers(ofFontFamily: hiraginoKakuGothicProN) { print(hiragino) // [[HiraKakuProN-W3, W3, 4, 0], [HiraKakuProN-W6, W6, 8, 2]] }
NSFontManager.availableMembers(ofFontFamily:)
でフォントが見つかるのは、Appleが互換性を保とうとしたからだろう。
Chromeはフォントファミリーをcase insensitiveで見つけるため、敢えてNSFontManager.availableFontFamilies
の方を使っていたということだったが、修正コミットとなるTest for font family on mac using NSFontManager::availableFontsForFamilyの該当部分をみると、NSFontManager.availableMembers(ofFontFamily:)
を呼び出すようになった。説明によれば、NSFontManager
APIは、case insensitiveにフォントを見つけてくれるようだ。