Skip to content

Commit 30885d5

Browse files
author
agoloman
committed
Revert "Bug 1943070 - Support the 'lang' attribute in CanvasTextDrawingStyles. r=gfx-reviewers,webidl,lsalzman,smaug" for causing wpt failures @idlharness.any.worker.html.
This reverts commit 938bd0b.
1 parent 1fc8dd4 commit 30885d5

28 files changed

Lines changed: 141 additions & 121 deletions

dom/canvas/CanvasRenderingContext2D.cpp

Lines changed: 29 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
54035356
gfxFontGroup* 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;

dom/canvas/CanvasRenderingContext2D.h

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,6 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
350350
CurrentState().textRendering = aTextRendering;
351351
}
352352

353-
void GetLang(nsAString& aLang) { CurrentState().lang->ToString(aLang); }
354-
void SetLang(const nsAString& aLang) {
355-
if (!CurrentState().lang->Equals(aLang)) {
356-
CurrentState().lang = NS_Atomize(aLang);
357-
CurrentState().fontGroup = nullptr;
358-
}
359-
}
360-
361353
void GetLetterSpacing(nsACString& aLetterSpacing);
362354
void SetLetterSpacing(const nsACString& aLetterSpacing);
363355
void GetWordSpacing(nsACString& aWordSpacing);
@@ -1025,10 +1017,6 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
10251017

10261018
// text
10271019

1028-
// Resolve the `lang` property if it is `inherit` or empty, returning true
1029-
// if the resolved value has changed.
1030-
bool ResolveFontLang();
1031-
10321020
public:
10331021
gfxFontGroup* GetCurrentFontStyle();
10341022

@@ -1114,8 +1102,6 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
11141102
gfx::Float wordSpacing = 0.0f;
11151103
nsCString letterSpacingStr;
11161104
nsCString wordSpacingStr;
1117-
RefPtr<nsAtom> lang = nsGkAtoms::inherit;
1118-
RefPtr<nsAtom> resolvedFontLang;
11191105

11201106
nscolor shadowColor = 0;
11211107

@@ -1155,9 +1141,6 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
11551141
// tainted state of the canvas itself, we update our filters accordingly.
11561142
bool filterSourceGraphicTainted = false;
11571143
bool imageSmoothingEnabled = true;
1158-
1159-
// Whether resolvedFontLang was an explicitly-specified lang or inferred.
1160-
bool explicitLang = false;
11611144
};
11621145

11631146
AutoTArray<ContextState, 3> mStyleStack;
@@ -1176,11 +1159,9 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
11761159

11771160
struct FontStyleCacheKey {
11781161
FontStyleCacheKey() = default;
1179-
FontStyleCacheKey(const nsACString& aFont, nsAtom* aLang,
1180-
uint64_t aGeneration)
1181-
: mFont(aFont), mLang(aLang), mGeneration(aGeneration) {}
1162+
FontStyleCacheKey(const nsACString& aFont, uint64_t aGeneration)
1163+
: mFont(aFont), mGeneration(aGeneration) {}
11821164
nsCString mFont;
1183-
RefPtr<nsAtom> mLang;
11841165
uint64_t mGeneration = 0;
11851166
};
11861167

@@ -1195,13 +1176,12 @@ class CanvasRenderingContext2D : public nsICanvasRenderingContextInternal,
11951176
public:
11961177
static HashNumber Hash(const FontStyleCacheKey& aKey) {
11971178
HashNumber hash = HashString(aKey.mFont);
1198-
hash = AddToHash(hash, aKey.mLang->hash());
11991179
return AddToHash(hash, aKey.mGeneration);
12001180
}
12011181
static bool Match(const FontStyleCacheKey& aKey,
12021182
const FontStyleData& aVal) {
12031183
return aVal.mKey.mGeneration == aKey.mGeneration &&
1204-
aVal.mKey.mLang == aKey.mLang && aVal.mKey.mFont == aKey.mFont;
1184+
aVal.mKey.mFont == aKey.mFont;
12051185
}
12061186
};
12071187

dom/canvas/OffscreenCanvas.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,10 @@ namespace mozilla::dom {
3535
static mozilla::LazyLogModule gFingerprinterDetection("FingerprinterDetection");
3636

3737
OffscreenCanvasCloneData::OffscreenCanvasCloneData(
38-
OffscreenCanvasDisplayHelper* aDisplay, nsAtom* aLang, uint32_t aWidth,
39-
uint32_t aHeight, layers::LayersBackend aCompositorBackend, bool aNeutered,
40-
bool aIsWriteOnly, nsIPrincipal* aExpandedReader)
38+
OffscreenCanvasDisplayHelper* aDisplay, uint32_t aWidth, uint32_t aHeight,
39+
layers::LayersBackend aCompositorBackend, bool aNeutered, bool aIsWriteOnly,
40+
nsIPrincipal* aExpandedReader)
4141
: mDisplay(aDisplay),
42-
mLang(aLang),
4342
mWidth(aWidth),
4443
mHeight(aHeight),
4544
mCompositorBackendType(aCompositorBackend),
@@ -62,13 +61,12 @@ OffscreenCanvas::OffscreenCanvas(nsIGlobalObject* aGlobal, uint32_t aWidth,
6261
OffscreenCanvas::OffscreenCanvas(
6362
nsIGlobalObject* aGlobal, uint32_t aWidth, uint32_t aHeight,
6463
layers::LayersBackend aCompositorBackend,
65-
already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay, nsAtom* aLang)
64+
already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay)
6665
: DOMEventTargetHelper(aGlobal),
6766
mWidth(aWidth),
6867
mHeight(aHeight),
6968
mCompositorBackendType(aCompositorBackend),
7069
mDisplay(aDisplay),
71-
mLang(aLang),
7270
mFontVisibility(ComputeFontVisibility()) {}
7371

7472
OffscreenCanvas::~OffscreenCanvas() {
@@ -380,7 +378,7 @@ UniquePtr<OffscreenCanvasCloneData> OffscreenCanvas::ToCloneData(
380378
}
381379

382380
auto cloneData = MakeUnique<OffscreenCanvasCloneData>(
383-
mDisplay, mLang, mWidth, mHeight, mCompositorBackendType, mNeutered,
381+
mDisplay, mWidth, mHeight, mCompositorBackendType, mNeutered,
384382
mIsWriteOnly, mExpandedReader);
385383
SetNeutered();
386384
return cloneData;
@@ -628,7 +626,7 @@ already_AddRefed<OffscreenCanvas> OffscreenCanvas::CreateFromCloneData(
628626
MOZ_ASSERT(aData);
629627
RefPtr<OffscreenCanvas> wc = new OffscreenCanvas(
630628
aGlobal, aData->mWidth, aData->mHeight, aData->mCompositorBackendType,
631-
aData->mDisplay.forget(), aData->mLang);
629+
aData->mDisplay.forget());
632630
if (aData->mNeutered) {
633631
wc->SetNeutered();
634632
}

dom/canvas/OffscreenCanvas.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,13 @@ using OwningOffscreenRenderingContext = class
4545
// store necessary data in it then pass it to worker thread.
4646
struct OffscreenCanvasCloneData final {
4747
OffscreenCanvasCloneData(OffscreenCanvasDisplayHelper* aDisplay,
48-
nsAtom* aLang, uint32_t aWidth, uint32_t aHeight,
48+
uint32_t aWidth, uint32_t aHeight,
4949
layers::LayersBackend aCompositorBackend,
5050
bool aNeutered, bool aIsWriteOnly,
5151
nsIPrincipal* aExpandedReader);
5252
~OffscreenCanvasCloneData();
5353

5454
RefPtr<OffscreenCanvasDisplayHelper> mDisplay;
55-
RefPtr<nsAtom> mLang;
5655
uint32_t mWidth;
5756
uint32_t mHeight;
5857
layers::LayersBackend mCompositorBackendType;
@@ -78,8 +77,7 @@ class OffscreenCanvas final : public DOMEventTargetHelper,
7877

7978
OffscreenCanvas(nsIGlobalObject* aGlobal, uint32_t aWidth, uint32_t aHeight,
8079
layers::LayersBackend aCompositorBackend,
81-
already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay,
82-
nsAtom* aLang);
80+
already_AddRefed<OffscreenCanvasDisplayHelper> aDisplay);
8381

8482
void Destroy();
8583

@@ -172,8 +170,6 @@ class OffscreenCanvas final : public DOMEventTargetHelper,
172170

173171
bool IsTransferredFromElement() const { return !!mDisplay; }
174172

175-
nsAtom* GetLang() const { return mLang; }
176-
177173
private:
178174
~OffscreenCanvas();
179175

@@ -198,7 +194,6 @@ class OffscreenCanvas final : public DOMEventTargetHelper,
198194
layers::LayersBackend::LAYERS_NONE;
199195

200196
RefPtr<OffscreenCanvasDisplayHelper> mDisplay;
201-
RefPtr<nsAtom> mLang;
202197
RefPtr<CancelableRunnable> mPendingCommit;
203198
RefPtr<nsIPrincipal> mExpandedReader;
204199
Maybe<OffscreenCanvasDisplayData> mPendingUpdate;

dom/html/HTMLCanvasElement.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1125,8 +1125,7 @@ OffscreenCanvas* HTMLCanvasElement::TransferControlToOffscreen(
11251125
mOffscreenDisplay =
11261126
MakeRefPtr<OffscreenCanvasDisplayHelper>(this, sz.width, sz.height);
11271127
mOffscreenCanvas = new OffscreenCanvas(win->AsGlobal(), sz.width, sz.height,
1128-
backend, do_AddRef(mOffscreenDisplay),
1129-
FragmentOrElement::GetLang());
1128+
backend, do_AddRef(mOffscreenDisplay));
11301129
if (mWriteOnly) {
11311130
mOffscreenCanvas->SetWriteOnly(mExpandedReader);
11321131
}

dom/webidl/CanvasRenderingContext2D.webidl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,6 @@ interface mixin CanvasPathDrawingStyles {
321321

322322
interface mixin CanvasTextDrawingStyles {
323323
// text
324-
attribute DOMString lang; // default: "inherit"
325324
[SetterThrows]
326325
attribute UTF8String font; // (default 10px sans-serif)
327326
attribute CanvasTextAlign textAlign; // (default: "start")
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[canvas.2d.lang.dynamic.html]
2+
expected:
3+
if (os == "android") and swgl: [PASS, FAIL]
4+
if not fission and swgl and (os == "linux"): [FAIL, PASS]
5+
if not fission and not swgl and not debug: [FAIL, PASS]
6+
if fission and (os == "linux") and debug and not swgl: [FAIL, PASS]
7+
if (os == "linux") and debug and fission and swgl: [FAIL, PASS]
8+
if (os == "linux") and debug and not fission and not swgl: [FAIL, PASS]
9+
FAIL
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[canvas.2d.lang.empty.canvas.html]
2+
expected:
3+
if (os == "android") and not debug: [PASS, FAIL]
4+
if (os == "linux") and not fission and not swgl: [PASS, FAIL]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[canvas.2d.lang.html]
2+
expected:
3+
if (os == "android") and not debug: [FAIL, PASS]
4+
FAIL
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[canvas.2d.lang.inherit.disconnected.canvas.html]
2+
expected: FAIL

0 commit comments

Comments
 (0)