Closed Bug 222346 Opened 21 years ago Closed 21 years ago

Switching character coding changes background color at Yahoo Mail

Categories

(Core :: Internationalization, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: david.haas, Assigned: smontagu)

References

()

Details

(Keywords: testcase)

Attachments

(2 files, 5 obsolete files)

1) Login to a Yahoo Mail account.
2) Click on "Mail Options" -> "Colors" -> Lime Green theme.
3) Click on "Mail" -> pick a folder with an e-mail message in it.
4) Open up message.
5) In the menu, select View -> Character Coding -> More -> East Asian ->
Japanese EUC (Doesn't actually matter what you choose, as long as it's not the
current encoding). 

What you'd expect:
Characters now displayed with new encoding, otherwise no change

What actually happens:
Characters now displayed with new encoding, background color switches from lime
green to blue.

Happens with Mozila 1.5rc2, ~1 month old Firebird, recent Camino (all OS X). 
Not sure if it affects other platforms.
Does the lime green stylesheet come with a charset param in the http header?  Or
a @charset style rule?

I bet the problem is that the stylesheet can only be parsed in whatever the
default encoding of the page is and does not provide us with that information...
So the webpage source looks like this to begin:

**********************
<!--web40411-->
<html> 
<head> 
<title>Yahoo! Mail - foo@yahoo.com</title>
<script>
<!-- 
if (typeof top.frames["wmailmain"] != "undefined") {
    window.open("http://mail.yahoo.com", "_top");
}
var ypim_color = "lime";
// -->
</script>
<script src="http://us.js1.yimg.com/us.yimg.com/lib/pim/c3/ylib_dom.js"></script>
<script language=JavaScript
src="http://us.js1.yimg.com/us.yimg.com/lib/pim/j3/pim.js"></script>
<script language=JavaScript
src="http://us.js1.yimg.com/us.yimg.com/lib/pim/css2/pim_css.js"></script>

**************
The ypim_color variable is important.

ylib_dom.js appears to work with the DOM (oddly enough).
pim.js looks to be dropdown menu/button code.
pim_css.js I think is the relevant script.  It uses ypim_color to pick a CSS.
If ypim_color = null, it sets it to blue.  

Assuming the JS gets fed ypim_color lime, the following stylesheet gets called:
http://us.js1.yimg.com/us.yimg.com/lib/pim/css2/pim_style_lime.css

I didn't notice a @charset style rule.  Here's what the server sent back to me:
haasd@rmm014 /haasd % curl --head
http://us.js1.yimg.com/us.yimg.com/lib/pim/css2/pim_style_lime.css
HTTP/1.0 200 OK
Content-Type: text/css
Content-Length: 3803
Last-Modified: Tue, 25 Jun 2002 23:35:23 GMT
Date: Thu, 16 Oct 2003 16:40:23 GMT
Connection: keep-alive


Yeah, if the sheet specifies no other encoding in any way and there is no
charset attribute on the <link> that loads it, then we assume that it needs to
be parsed in the same encoding as the document.  But that sheet looks like plain
ascii, so it should parse in all 1-byte encodings, really...

Is there any way to reproduce this without a yahoo mail account?  Does saving
the page as "web page, complete", then opening it from the hard drive and
switching encodings cause the same problem?
No, saving as Web Page complete, opening the disk file, then changing the
charset does not cause the color change.
Could you possibly zip up (or tar up) the saved files for "web page, complete"
and attach them to this bug?
Attached file "Web Page, Complete" (obsolete) —
tar'd, zipped folder.  Inside is web page & web page complete folder (if that
makes sense).
Yeah, loading this from local disk does not cause a color change (even after I
removed the <link>s that mozilla inserted in the source)... This is not a
painting bug; not sure what's going on here.
Assignee: roc → general
Component: Layout: View Rendering → Browser-General
Keywords: qawanted
QA Contact: ian → general
Mozilla/5.0 (Windows; U; Win98; en-US; rv:1.6a) Gecko/20031028

I've been trying to get a test case working for this; hasn't worked out so far
but here are some observations:

I have a yahoo account so I tried reproducing and was able to do so reliably. 
It may be worthwhile to note that I also tried earlier today at work, where I
use Mozilla 1.3.1 on Windows 2000, and could not reproduce it.

When I reproduce the bug, I've noticed that it doesn't really appear to just
have switched themes.  All the fonts appear in Times New Roman, and the
formatting is missing (similar to if you had a broken stylesheet link).

Using Jesse Ruderman's bookmarklet for viewing style sheets
(http://www.squarefree.com/bookmarklets/webdevel.html) I tried looking at the
style information for the page both when the bug appears, and when it renders
normally.  On the normal page, all the inline css as well as the
"pim_style_lime" and "pim_style_ie_lime" stylesheets are captured.  However, on
the page the bug appears on, only the hardcoded inline css is captured, and
neither lime stylesheet appears.  No blue stylesheet appears either!

As noted earlier, the link tags for the "pim_style" stylesheets and some of the
inline css are generated by pim_css.js.  It is this generated css info that is
missing from the buggy page.  Is it possible that the script is not even being run? 

As a side note, whenever I change the character coding on this page (either the
real yahoo site or a saved copy) I get the following errors in the Javascript
console:

Error: ylib_keyevt is not defined

Error: oBw is not defined

These appear regardless of whether the bug is reproduced.

Please let me know if more info is necessary...I'd be happy to put up
screenshots of the bug if anyone would find it helpful.   
This test case should reproduce the bug.  After unzipping:

1. Navigate to the ShowLetter.htm file.
2. Verify that green theme appears.
3. Switch character coding to Japanese (EUC-JP)
4. Verify that green theme is no longer applied.

This test case could be reduced further.

Another observation regarding pim_css.js:  When I used Jesse Ruderman's
bookmarklet for viewing scripts
(http://www.squarefree.com/bookmarklets/webdevel.html) on the buggy page in the
Japanese (EUC-JP) coding, the backslashes used in pim_css.js to escape double
quotes in strings appeared as a weird character I didn't recognize.  In
US-ASCII coding the backslashes appeared correctly.
Original report on a newsgroup & my own investigation indicates this bug is not
present in Moz 1.4 or 1.4.1 but is present in 1.5 alpha.  That should narrow it
down.

I tried to find some possibilities:

bug 206780 was playing with font settings & a patch was checked in 7/19. 
apparently there was at least 1 problem with this original patch.  perhaps this
is a second.  If I could find an older build, I'd check it out.

bug 211440: mentioned "font" and "color", so why not.



Attachment #134592 - Attachment mime type: application/octet-stream → application/zip
Attached file JS for testcase (obsolete) —
Attachment #134592 - Attachment is obsolete: true
Attached file Testcase (obsolete) —
Attachment #133454 - Attachment is obsolete: true
Attachment #134592 - Attachment is obsolete: false
Comment on attachment 134718 [details]
JS for testcase

This needs more work...
Attachment #134718 - Attachment is obsolete: true
Attachment #134719 - Attachment is obsolete: true
Actually, if you load the testcase in attachment 134719 [details], you get an alert.  Now
if you select "EUC-JP" from the charset section of the view menu, you do NOT get
an alert.  In fact, the GetUnicodeDecoderRaw() call (with "euc-jp" as
characterSet.get()) on line 839 of nsScriptLoader.cpp fails, and we don't load
the script at all.

The problem, of course, is that the charset on the document is "euc_jp", not
"EUC_JP" (which is what it should be).  I bet the UI is passing in strings in
the wrong case, but I can't figure out where that menu is actually constructed.

In any case, I am seeing this bug on Linux, both with my testcase and with
David's (and thanks a ton for creating a testcase that could be used to
reproduce this, David!)
Assignee: general → smontagu
Component: Browser-General → Internationalization
Keywords: qawantedtestcase
OS: MacOS X → All
QA Contact: general → amyy
Hardware: Macintosh → All
It's strange. With 1.5, I can't reproduce the bug. I did get 'alert' (in JS)
even with charset set to EUC-JP (in View | Character Coding). David's test case
didn't change color at all when I changed Character Coding. It always remains
'green'(lime) (never blue). 

jshin, could you test with current trunk instead of 1.5?  There have been some
changes to nsScriptLoader since 1.5, and it could well be that one of them is
responsible...
I was able to reproduce the bug. It's not due to any recent check-in. It's been
present since May/June. 

The UI hands over non-canonical names ONLY when 'charset' is selected from
View|Character Coding | More. Once it's  added to the main list (via View |
Character Coding | Customize), the UI gives us the canonical name, which is why
I couldn't reproduce it at first.

 http://lxr.mozilla.org/seamonkey/source/xpfe/browser/resources/locale/en-US/navigator.properties#25

An easy fix is to turn all non-canonical names to canonical ones in the above
properties file. Alternatives include fixing nsCharsetMenu.cpp (or related
files) and making sure that mCharacterSet member of nsDocument always store
canonical names only. Or, we may just use GetUnicodeDecoder instead of
GetUnicodeDecoderRaw in nsScriptLoader.cpp.
That last fix may be best (and get rid of all that charset alias crud that
happens in there...)  But there are other places that assume that
nsIDocument::GetDocumentCharacterSet is canonical, and the API claims that it
always will be.  I don't know whether SetDocumentCharacterSet should handle
canonicalization; we should decide on that, document nsIDocument accordingly,
and then fix either nsDocument or the callers as needed.
Attached patch a patch (obsolete) — Splinter Review
As bz suggested, I got rid of alias resolution and replace GetUnicodeDecoderRaw
with GetUnicodeDecoder in nsScriptLoader.cpp
Note that the charset selector still needs fixing per comment 18...
Oh, and can't you eliminate the charset temporary?
Sure, I can get rid of temp's. 

re the second half of comment #18

I'm not sure whether I should fix SetDocumentCharacterSet, either. It appears
that it's kinda waste to do that because most of time it's handed a
canonicalized charset (I believe). 

I'm wondering why non-canonical names are passed thru ONLY for View |
Char.Coding | More (as I wrote in comment #17). nsCharsetMenu.cpp doesn't seem
to do anything special...
nsAString has to be used for |GetCharset| of nsIDOMElement(?) so that I can't
help using one temp.  Perhaps, we have to fix nsIDomElement(?):GetCharset and
its callers in a separate bug. 
  
This, alone, will fix this bug. 

bz, do you want to deal with nsIDocument issue here as well? I guess we'd
better file a new bug for that. I also filed bug 224748 for non-canonical names
in our resource files.
Attachment #134772 - Attachment is obsolete: true
I think we should just document the nsIDocument getter and setter to only take
canonical names (and maybe add asserts to that effect in debug builds).
My prefs.js has the following:

user_pref("intl.charset.default", "EUC-KR");
user_pref("intl.charset.detector", "");
user_pref("intl.charsetmenu.browser.cache", "iso-8859-2, euc-jp, windows-1252, i
so-2022-cn");
user_pref("intl.charsetmenu.browser.static", "ISO-8859-1, EUC-KR, ISO-8859-15, U
TF-8, gb18030, GB2312, HZ-GB-2312, ISO-8859-16, x-mac-cyrillic");
user_pref("intl.charsetmenu.mailview.cache", "GB2312, ISO-8859-2, ISO-2022-JP, w
indows-1252, x-windows-949");

Some charset names are canonical while others are not[1]. It turned out that
it's not 'More' vs 'Static' but when they're added to the static list. By
'when', I mean whether they're added to my static list before May/June (when
GetUnicodeDecoderRaw was introduce) or after. Creating a new profile validated
my theory. So, we need to fix bug 224748 (nsCharsetMenu.cpp as well) not for
this bug but for our 'sanity' :-)


[1] Not all canonical names are in caps. However, 'euc-jp' and 'iso-8859-2'
should be 'EUC-JP' and 'ISO-8859-2'.
I added assert and documented the requirement for canonical names. I didn't add
assert to GetDocumentCharacterSet.
Attachment #134815 - Attachment is obsolete: true
Comment on attachment 134843 [details] [diff] [review]
a new patch (with assertion in Set..Char..Set in debug build)

asking for r/sr
Attachment #134843 - Flags: superreview?(bz-vacation)
Attachment #134843 - Flags: review?(smontagu)
Comment on attachment 134843 [details] [diff] [review]
a new patch (with assertion in Set..Char..Set in debug build)

Looks great.
Attachment #134843 - Flags: superreview?(bz-vacation) → superreview+
Comment on attachment 134843 [details] [diff] [review]
a new patch (with assertion in Set..Char..Set in debug build)

>+#ifdef DEBUG
>+    nsCOMPtr<nsICharsetAlias> calias(do_GetService(kCharsetAliasCID));
>+    if (calias) {
>+      nsCAutoString canonicalName;
>+      calias->GetPreferred(aCharSetID, canonicalName);
>+      NS_ASSERTION(canonicalName.Equals(aCharSetID),
>+                   "canonical name should be passed");
>+    }
>+#endif

Nit: can you make that message clearer? e.g. "charset name must be canonical".
r=smontagu
Attachment #134843 - Flags: review?(smontagu) → review+
Thanks for r/sr. Fix checked into the trunk with the assertion change.
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: