Bug 548751 - make canvas respect the style's language when resolving fonts. r=dbaron

This commit is contained in:
Jonathan Kew 2010-02-26 08:58:48 -08:00
parent a77a681fe4
commit d274131f59
4 changed files with 112 additions and 2 deletions

View File

@ -1932,8 +1932,6 @@ nsCanvasRenderingContext2D::SetFont(const nsAString& font)
return NS_ERROR_FAILURE;
nsIDocument* document = presShell->GetDocument();
nsIAtom *language = presShell->GetPresContext()->GetLanguageFromCharset();
nsCOMArray<nsIStyleRule> rules;
nsCOMPtr<nsICSSStyleRule> rule;
@ -1985,6 +1983,11 @@ nsCanvasRenderingContext2D::SetFont(const nsAString& font)
NS_ASSERTION(fontStyle, "Could not obtain font style");
nsIAtom* language = sc->GetStyleVisibility()->mLanguage;
if (!language) {
language = presShell->GetPresContext()->GetLanguageFromCharset();
}
// use CSS pixels instead of dev pixels to avoid being affected by page zoom
const PRUint32 aupcp = nsPresContext::AppUnitsPerCSSPixel();
// un-zoom the font size to avoid being affected by text-only zoom

View File

@ -37,3 +37,4 @@
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == text-bidi-ltr-test.html text-bidi-ltr-ref.html
fails-if(MOZ_WIDGET_TOOLKIT=="cocoa") == text-bidi-rtl-test.html text-bidi-rtl-ref.html
!= text-font-lang.html text-font-lang-notref.html

View File

@ -0,0 +1,50 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Test for language-sensitive font prefs on canvas</title>
<script type="text/javascript">
function test(canvasID) {
var canvas = document.getElementById(canvasID);
var ctx = canvas.getContext('2d');
var str = 'Hello world! \u4F60\u597D\u5417\uFF1F';
ctx.font = '2em sans-serif';
ctx.fillStyle = 'black';
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
ctx.fillText(str, 10, 10);
};
</script>
</head>
<body>
<div lang="en" style="margin:20px; height:100px;">
<canvas id="c1" width="400" height="50"></canvas>
<script type="text/javascript">
test("c1");
</script>
</div>
<div lang="en" style="margin:20px; height:100px;">
<canvas id="c2" width="400" height="50"></canvas>
<script type="text/javascript">
test("c2");
</script>
</div>
<div lang="en" style="margin:20px; height:100px;">
<canvas id="c3" width="400" height="50"></canvas>
<script type="text/javascript">
test("c3");
</script>
</div>
<div lang="en" style="margin:20px; height:100px;">
<canvas id="c4" width="400" height="50"></canvas>
<script type="text/javascript">
test("c4");
</script>
</div>
</body>
</html>

View File

@ -0,0 +1,56 @@
<!DOCTYPE HTML>
<html>
<head>
<title>Test for language-sensitive font prefs on canvas</title>
<script type="text/javascript">
function test(canvasID) {
var canvas = document.getElementById(canvasID);
var ctx = canvas.getContext('2d');
var str = 'Hello world! \u4F60\u597D\u5417\uFF1F';
ctx.font = '2em sans-serif';
ctx.fillStyle = 'black';
ctx.textAlign = 'left';
ctx.textBaseline = 'top';
ctx.fillText(str, 10, 10);
};
</script>
</head>
<body>
<!--
In the reference, all divs are tagged with lang="en".
The expectation is that at least some of them will resolve
"sans-serif" to different fonts according to language.
-->
<div lang="ar" style="margin:20px; height:100px;">
<canvas id="c1" width="400" height="50"></canvas>
<script type="text/javascript">
test("c1");
</script>
</div>
<div lang="ja" style="margin:20px; height:100px;">
<canvas id="c2" width="400" height="50"></canvas>
<script type="text/javascript">
test("c2");
</script>
</div>
<div lang="zh-TW" style="margin:20px; height:100px;">
<canvas id="c3" width="400" height="50"></canvas>
<script type="text/javascript">
test("c3");
</script>
</div>
<div lang="en" style="margin:20px; height:100px;">
<canvas id="c4" width="400" height="50"></canvas>
<script type="text/javascript">
test("c4");
</script>
</div>
</body>
</html>