My favorites | Sign in
Project Logo
             
Search
for
Updated Jun 27, 2009 by jeremy@chromium.org
Labels: about-best-practices, is-tip
ArticleGoogleChromeCompatFAQ  
Fixing Google Chrome Compatibility bugs in WebSites - an FAQ

Fixing Google Chrome Compatibility bugs in WebSites - an FAQ

This document provides a concise list of common compatibility issues with Google Chrome along with their solutions. It's aimed at Web developers trying to fix compatibility issues with Google Chrome or interested in a list of things to avoid when authoring Websites to use in Google Chrome.

The list is based on analysis of a large number of real-world sites with compatibility issues. It's important to note that in nearly all cases we've seen, the fixes required to get a Website working well in Google Chrome have been minimal. Developers are often surprised that problems that looked like they could take weeks of developer time were often solved in under an hour and matched closely with the list below.

Each item is described along with its solution, at the end we have a section that lists useful tools and points of reference that you may find useful in diagnosing problems.

Preamble - Google Chrome's rendering Engine:

Google Chrome uses WebKit (http://webkit.org/) to draw Web pages. WebKit is a mature (~9 years) open source layout engine used by Apple (Safari, iPhone), Google (Android, Google Chrome), Nokia and many other companies. Google Chrome aims to render sites exactly like Safari. This means that if your site works in Safari there is a large chance it will work in Google Chrome and vice versa.

Common Issues:

UserAgent Detection

The Symptom

Page not displayed correctly in Google Chrome, or you get a message noting that Google Chrome is not a "supported browser".

The problem

By far the most common problem we see is JavaScript (or server-side) code that tries to detect the browser by looking at the navigator.userAgent string. Often the checks used are buggy and do not identify Google Chrome correctly.

Recommendations:

  • On Windows, Google Chrome's useragent string looks something like the following:
  •      Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/2.0.167.0 Safari/525.13

In nearly all cases you don't want to check if you're running under Google Chrome, but if the browser is using the WebKit rendering engine (see above). If you must look at the navigator.userAgent string look for the substring 'AppleWebKit', nothing else is guaranteed to continue working in the future!!

var isWebKit =
  navigator.userAgent.indexOf("AppleWebKit") > -1;

isWebKit will be true if you're running in Google Chrome, Safari or any other browser using WebKit.

To check the version of WebKit, use:

var WebKitVersion =
  parseFloat(navigator.userAgent.split("AppleWebKit/")[1]) ||
  undefined;
if (WebKitVersion && WebKitVersion > 500 ) {
  // use spiffy WebKit feature here
}

You can find a list of Google Chrome Releases and their corresponding WebKit revisions here.

  • Avoid code like the following:
if (isChrome) {
    doSomethingChromeSpecific();
} else {
  // Didn't detect browser type, so assume IE.
  doSomethingIESpecific();
}

The problem is that the above snippet assumes that any browser not explicitly identified is IE. The problem is that it's far more likely for other browsers to act alike than it is for them to act like IE. Instead make IE the special case. This helps to make your site future proof:

if (isIE) {
    // Much Safer!
    doSomethingIESpecific();
} else {
  doSomethingChromeSpecific();
}

Paragraphs Overflowing/Text Cutoff

The Symptom:

A single line header wraps over multiple lines, messing up a site's layout. Text gets cut off or overlaps other elements.

The problem:

HTML & CSS can't do pixel perfect layout. So font and element sizes can change slightly between browser versions and OSs. If a site depends on a font being an exact size then text can get cut off or wrap on other browsers or OSs.

Recommendations:

Whever possible, make use of dynamically sized elements rather than specifying fixed pixel widths. This is often easier said than done, but it ensures that content will adapt well to all browsers. Test your site in multiple browsers and OSs, enlarge fixed pixel width elements to accommodate the maximum size you see. Use the white-space:nowrap css attribute to ensure that single line headings don't wrap over multiple lines.

Correct page encoding

The Symptom:

Your page looks garbled in Google Chrome. Garbage characters may be displayed, and RTL language pages (e.g. Hebrew or Arabic) may appear with their letters reversed.

The problem:

If character encoding is not specified precisely, different browsers can interpret the encoding in different ways or not at all. The impact on users is dire since it prevents them from viewing the site.

Recommendations:

  • Declare your page's content-type correctly, this can either be in an HTTP header or a Meta tag specified in your HTML.
  • The character set your page uses must be a legal value from the Official IANA List, please only use the encodings that have the text (preferred MIME name) listed next to them e.g. ISO-8859-1, Shift_JIS.
  • If you specify two different values for the character encoding in the HTTP Header and the Meta tag, Google Chrome will use the value in the HTTP Header. Conflicting declarations of character encoding in the HTTP Header and Meta tag is asking for trouble. More information on this subject can be found here.
  • We recommend using UTF-8 for all Web content. If you have to use legacy encoding for some reason, make sure to identify the encoding correctly as outlined above. For legacy situations involving Hebrew sites use Logical Hebrew encoding (ISO-8859-8-I). We strongly discourage the use of Visual Hebrew encoding (ISO-8859-8). It has no place on the Web anymore and is a remnant of old systems lacking logic for rendering RTL text. It causes many bugs and lots of confusion.

Correct Plugin Tags

The Symptom:

Plug-ins, such as Flash videos, Windows Media Player movies, or Java applets, do not appear in Google Chrome, but do appear in Internet Explorer.

The problem:

There are 2 types of plugins on Windows: ActiveX & NPAPI. IE uses ActiveX plugins, all other browsers (including Google Chrome) use NPAPI plugins. ActiveX is Windows-only, plugins on other platforms usually use NPAPI.

Recommendations:

  1. Do not use plug-ins for which only an Active-X version exists, they won't work in Google Chrome, Firefox, Safari, Opera or any browser not using the IE rendering engine.
  2. Be sure that parameters in your <object> and <embed> tags are the same. A common problem is changing the parameter in only one of the tags, for example:
<object ...>
    <param name="src" value="flash_ad.swf">
    <embed src="different_file.swf" ...></embed> 
</object>

This embeds a flash video. IE will use the parameters in the object tag and thus will load the file flash_ad.swf. All other browsers will use the embed tag and play different_file.swf. Another common error is to specify different values for the transparency attribute when embedding flash.

Inline elements can't enclose block elements

The Symptom:

Page styles and layout look do not appear the same across several browsers. Styles are mysteriously not applied to nested elements.

The problem:

HTML defines what are called "block elements" (such as <div>) which represent a "square" on a page and "inline elements" which flow with the page layout (such as <a> and <span>). It is illegal to enclose a block element in an inline element. Different browsers will try to "fix" the markup for you in different ways if you do try to do so. This can cause the page style to be displayed differently between browsers.

Recommendations:

  1. Make sure to properly close inline tags such as <a> and <span>. Forgetting to close a tag can often lead to this situation. There exist a variety of tools you can run, both online and locally to validate your markup and make sure all tags are properly closed.
  2. Here are some examples of bad markup and the correct way to achieve the same effect:

Incorrect Markup Correct Markup

<!-- Illegal for <a> to embed <div> -->
<a>
  <div>
     some text
  </div>
</a>

<div>
     <a>some text</a>
</div>

<!-- <span> is an inline element and <form> is a block element -->
<span style="visibility:hidden">
    <form>
        ...
    </form>
</span>

<div style="visibility:hidden">
    <form>
        ...
    </form>
</div>

Use of Browser-Specific CSS or JavaScript objects

The Symptom:

Some CSS styling does not work in Google Chrome, even though they seem fine in IE or Firefox.

The problem:

Each browser has its own private CSS selectors and JavaScript objects. Use of these types of markup is, by definition, not compatible with other browsers. These should only be used for non-critical tasks (e.g. adding text shadows). It is safest not to use them at all.

Recommendations:

Useful Tools

We've found the following tools extremely useful when diagnosing compatibility problems with Websites. Using them can greatly decrease the amount of effort and guesswork that goes into fixing compatibliity issues:

  1. Google Chrome has a variety of built-in tools to help developers track down compatibility and performance issues.
  2. Firebug - An excellent Firefox extension that can help examining markup, JavaScript and performance issues.
  3. Fiddler - A free Windows-only tool that allows you to examine and replay HTTP requests and responses.

Additional Resources

  1. Google Chrome Webmaster FAQ - Contains all the information in this document and loads more.
  2. quirksmode - Useful Information about which features are implemented in which browser.
  3. Reporting a bug in Google Chrome - guidelines and pointers on how to write an effective clear bug report.

Comment by helder.magalhaes, Jun 15, 2009

I guess one meant "Reporting" in "Reporing a bug in Google Chrome"... ;-)

Comment by batth21, Aug 07, 2009

hi there i have some chrome problem my chrome is not wroking properly

Comment by thomasrutter, Nov 09 (6 days ago)

Regarding the text:

"IE will use the parameters in the object tag and thus will load the file flash_ad.swf. All other browsers will use the embed tag and play different_file.swf."

As far as I was aware:

- <object> is a standards-compliant replacement for <embed> - Internet explorer needs its <object> tags to reference an ActiveX class (for streaming to work correctly). - Other browsers won't recognise that ActiveX class id and will ignore the <object> and proceed to any elements within it. - IE does not support alternative content in <object> elements correctly. - Therefore, including a plug-in that works in both IE and other browsers, while using the standards-compliant <object> rather than <embed>, is a difficult problem that has yet to be satisfactorily solved. It can be solved by using <embed> inside <object> as in the example given, or browser sniffing (either by writing out the code in JS or using IE conditional comments).


Sign in to add a comment
Hosted by Google Code