@@ -4169,10 +4169,6 @@ void CanvasRenderingContext2D::SetFont(const nsACString& aFont,
41694169 ErrorResult& aError) {
41704170 mFeatureUsage |= CanvasFeatureUsage::SetFont;
41714171
4172- if (ResolveFontLang ()) {
4173- CurrentState ().fontGroup = nullptr ;
4174- }
4175-
41764172 SetFontInternal (aFont, aError);
41774173 if (aError.Failed ()) {
41784174 return ;
@@ -4209,8 +4205,7 @@ bool CanvasRenderingContext2D::SetFontInternal(const nsACString& aFont,
42094205 }
42104206
42114207 nsPresContext* c = presShell->GetPresContext ();
4212- FontStyleCacheKey key{aFont, CurrentState ().resolvedFontLang ,
4213- c->RestyleManager ()->GetRestyleGeneration ()};
4208+ FontStyleCacheKey key{aFont, c->RestyleManager ()->GetRestyleGeneration ()};
42144209 auto entry = mFontStyleCache .Lookup (key);
42154210 if (!entry) {
42164211 FontStyleData newData;
@@ -4324,8 +4319,8 @@ bool CanvasRenderingContext2D::SetFontInternal(const nsACString& aFont,
43244319 c->Document ()->FlushUserFontSet ();
43254320
43264321 nsFontMetrics::Params params;
4327- params.language = CurrentState (). resolvedFontLang ;
4328- params.explicitLanguage = CurrentState (). explicitLang ;
4322+ params.language = fontStyle-> mLanguage ;
4323+ params.explicitLanguage = fontStyle-> mExplicitLanguage ;
43294324 params.userFontSet = c->GetUserFontSet ();
43304325 params.textPerf = c->GetTextPerfMetrics ();
43314326#ifdef XP_WIN
@@ -4515,16 +4510,33 @@ bool CanvasRenderingContext2D::SetFontInternalDisconnected(
45154510 break ;
45164511 }
45174512
4513+ // If we have a canvas element, get its lang (if known).
4514+ RefPtr<nsAtom> language;
4515+ bool explicitLanguage = false ;
4516+ if (mCanvasElement ) {
4517+ language = mCanvasElement ->FragmentOrElement ::GetLang ();
4518+ if (language) {
4519+ explicitLanguage = true ;
4520+ } else {
4521+ language = mCanvasElement ->OwnerDoc ()->GetLanguageForStyle ();
4522+ }
4523+ } else {
4524+ // Pass the OS default language, to behave similarly to HTML or canvas-
4525+ // element content with no language tag.
4526+ language = nsLanguageAtomService::GetService ()->GetLocaleLanguage ();
4527+ }
4528+
45184529 // TODO: Cache fontGroups in the Worker (use an nsFontCache?)
4519- gfxFontGroup* fontGroup = new gfxFontGroup (
4520- mOffscreenCanvas , // aFontVisibilityProvider
4521- list, // aFontFamilyList
4522- &fontStyle, // aStyle
4523- CurrentState ().resolvedFontLang , CurrentState ().explicitLang ,
4524- nullptr , // aTextPerf
4525- fontFaceSetImpl, // aUserFontSet
4526- 1.0 , // aDevToCssSize
4527- StyleFontVariantEmoji::Normal);
4530+ gfxFontGroup* fontGroup =
4531+ new gfxFontGroup (mOffscreenCanvas , // aFontVisibilityProvider
4532+ list, // aFontFamilyList
4533+ &fontStyle, // aStyle
4534+ language, // aLanguage
4535+ explicitLanguage, // aExplicitLanguage
4536+ nullptr , // aTextPerf
4537+ fontFaceSetImpl, // aUserFontSet
4538+ 1.0 , // aDevToCssSize
4539+ StyleFontVariantEmoji::Normal);
45284540 auto & state = CurrentState ();
45294541 state.fontGroup = fontGroup;
45304542 SerializeFontForCanvas (list, fontStyle, state.font );
@@ -5341,65 +5353,6 @@ UniquePtr<TextMetrics> CanvasRenderingContext2D::DrawOrMeasureText(
53415353 return nullptr ;
53425354}
53435355
5344- // Resolve CurrentState().lang to .resolvedFontLang, returning true if the
5345- // resolved value changed.
5346- bool CanvasRenderingContext2D::ResolveFontLang () {
5347- bool explicitLang = false ;
5348- RefPtr resolvedLang = [&]() {
5349- nsAtom* lang = CurrentState ().lang ;
5350- if (!lang->IsEmpty () && lang != nsGkAtoms::inherit) {
5351- explicitLang = true ;
5352- return do_AddRef (lang);
5353- }
5354-
5355- if (mCanvasElement ) {
5356- // If we have a canvas element, get its lang (if known).
5357- if (nsAtom* lang = mCanvasElement ->FragmentOrElement ::GetLang ()) {
5358- explicitLang = true ;
5359- return do_AddRef (lang);
5360- }
5361- return do_AddRef (mCanvasElement ->OwnerDoc ()->GetLanguageForStyle ());
5362- }
5363-
5364- if (RefPtr presShell = GetPresShell ()) {
5365- // Try to inherit 'lang' from the presShell's document, if any.
5366- return do_AddRef (presShell->GetDocument ()->GetLanguageForStyle ());
5367- }
5368-
5369- if (mOffscreenCanvas ) {
5370- // If the offscreen canvas has a value transferred from a canvas element,
5371- // we use that.
5372- if (nsAtom* lang = mOffscreenCanvas ->GetLang ()) {
5373- explicitLang = true ;
5374- return do_AddRef (lang);
5375- }
5376- if (auto * window = mOffscreenCanvas ->GetOwnerWindow ()) {
5377- if (auto * doc = window->GetExtantDoc ()) {
5378- // Why doesn't doc->GetLanguageForStyle() work here? Get 'lang'
5379- // from the root element by hand.
5380- if (auto * root = doc->GetRootElement ()) {
5381- nsAutoString lang;
5382- root->GetLang (lang);
5383- if (!lang.IsEmpty ()) {
5384- return NS_Atomize(lang);
5385- }
5386- }
5387- }
5388- }
5389- }
5390- // Fall back to the OS default language, to behave similarly to HTML or
5391- // canvas-element content with no language tag.
5392- return do_AddRef (nsLanguageAtomService::GetService ()->GetLocaleLanguage ());
5393- }();
5394-
5395- CurrentState ().explicitLang = explicitLang;
5396- if (resolvedLang == CurrentState ().resolvedFontLang ) {
5397- return false ;
5398- }
5399- CurrentState ().resolvedFontLang = resolvedLang;
5400- return true ;
5401- }
5402-
54035356gfxFontGroup* CanvasRenderingContext2D::GetCurrentFontStyle () {
54045357 // Use lazy (re)initialization for the fontGroup since it's rather expensive.
54055358
@@ -5417,9 +5370,6 @@ gfxFontGroup* CanvasRenderingContext2D::GetCurrentFontStyle() {
54175370 // If we have a cached fontGroup, check that it is valid for the current
54185371 // prescontext or canvas; if not, we need to discard and re-create it.
54195372 RefPtr<gfxFontGroup>& fontGroup = CurrentState ().fontGroup ;
5420- if (ResolveFontLang ()) {
5421- fontGroup = nullptr ;
5422- }
54235373 if (fontGroup) {
54245374 if (fontGroup->GetFontVisibilityProvider () != visProvider) {
54255375 fontGroup = nullptr ;
0 commit comments