On this page I compare 19 WebKits in order to prove that there is no “WebKit on Mobile” and to figure out which one is the best. My hope is that eventually I’m going to gain some insight in the “family tree” of all WebKits.
This page only contains tests of CSS and JavaScript items that work in some WebKits but not in all. Adding more items, all of which are either supported by all or by none of the WebKits, makes no sense — it’s in the items in the table below that the differences between the 19 tested WebKits lie.
I will probably add some HTML5 items to this list later on, provided they’re supported by at least one WebKit (probably Safari or Chrome).
These tests focus solely on compatibility. I say nothing about performance or user interface, and especially on mobile these factors may, in the short run, be more important than compatibility.
And remember:
There is no “WebKit on mobile!”
So far I’ve tested 10 different mobile WebKits, and they are all slightly different. You can find the details below.
The comparisons are sorted according to support, with the best-supported items coming first.
Palm Pre tests courtesy of Ben Combee. I will repeat the tests once I own a Palm Pre.
| Test | Saf 3.0 Win | Saf 3.1 Win | Saf 4.0 Win | Chrome 1 | Chrome 2 | Chrome 3 | Konq 3.5.7 | Konq newer | S60v3 | S60v5 | iPhone 2.2 | iPhone 3.1 | Android 1.0 | Android 1.5 / 1.6 | Bolt 1.5 | Iris 1.1.9 | Ozone 0.9 | Palm Pre 1.2.1 | JIL Emulator 1.5 | Samsung H1/M1 WM | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Static | Yes | Static | Yes | Yes | To be tested | Static | Static | Yes | Static | Yes | Yes | Static | Yes | Yes | ||||||||||
|
|
||||||||||||||||||||||||
|
Acid2 Test
Score in the Acid2 test
|
Yes | Incom |
Yes | Yes | To be tested | Minimal | To be tested | Almost | Incor |
Incom |
Almost | Incom |
Incor |
Incor |
Incor |
|||||||||
If any solid red background appears the browser is Incorrect or worse. (Bolt 1.5) |
||||||||||||||||||||||||
|
Acid3 Test
Score in the Acid3 test
|
39 | 75 | 100 | 79 | 100 | Crash | To be tested | Fail | 47 | 74 | 100 | 72 | 92 | 76 | 100 | 93 | 1 | 93 | 89 | |||||
|
Android 1.6 scores 93 points instead of 92.
|
||||||||||||||||||||||||
| Unfortunately you can’t do this test yourself | No | Yes | No | No | To be tested | Cache | Yes | No | Untest |
Cache | Yes | No | Cache | |||||||||||
|
|
||||||||||||||||||||||||
| Yes | Yes | No | To be tested | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |||||||||||||
x.attributes['align'] |
||||||||||||||||||||||||
| Yes | -webkit- | -webkit- | Yes | To be tested | No | -webkit- | -webkit- | -webkit- | -webkit- | -webkit- | -webkit- | -webkit- | ||||||||||||
|
Android has serious problems with widths of elements. However, within the
constraints of that bug |
||||||||||||||||||||||||
| No | Yes | No | Yes | No | To be tested | No | No | No | Yes | Yes | No | No | Yes | Probably | ||||||||||
x.compareDocumentPosition(y) Compares the document (DOM) position of element |
||||||||||||||||||||||||
| Yes | Yes | Yes | To be tested | Incor |
Yes | Yes | Yes | Yes | Yes | Yes | Probably | |||||||||||||
x.contains(y) true. |
||||||||||||||||||||||||
| Yes | Yes | No | To be tested | No | Yes | Yes | Yes | Yes | Yes | Yes | Yes | |||||||||||||
document.styleSheets[1].cssRules[1].cssText Returns the entire text of the rule (for instance |
||||||||||||||||||||||||
| Incor |
Incor |
No | To be tested | Yes | Incor |
Yes | Untest |
Incor |
Untest |
Incor |
Yes | Incor |
Incor |
|||||||||||
document.elementFromPoint(100,100) Which coordinates does pageX/Y |
||||||||||||||||||||||||
| Yes | Yes | Yes | To be tested | No | Almost | Yes | not :checked | Incom |
Yes | Yes | not :checked | Yes | ||||||||||||
|
||||||||||||||||||||||||
| Static | Yes | Yes | Yes | To be tested | Static | Static | Yes | Yes | Yes | Static | Yes | Yes | ||||||||||||
|
|
||||||||||||||||||||||||
| Yes | Yes | Yes | To be tested | Yes | Buggy | No | No | Yes | Yes | No | Yes | |||||||||||||
|
Safari iPhone 2.2 doesn’t put the focus on the field. Once you’ve clicked on the field (and it has gotten the correct :focus styles) you have to click it again, or your typed text won’t appear. This is caused by the width change. |
||||||||||||||||||||||||
| No | No | No | To be tested | No | No | Yes | No | No | No | No | No | |||||||||||||
| No | Yes | Yes | No | To be tested | No | Yes | Yes | Yes | Yes | Yes | Yes | |||||||||||||
document.getElementsByClassName('test')
document.getElementsByClassName('test test2')
The first expression returns a nodeList with all elements that have a |
||||||||||||||||||||||||
| No | Yes | Yes | Yes | To be tested | Buggy | No | Static | Yes | Yes | Static | Yes | Yes | ||||||||||||
|
|
||||||||||||||||||||||||
| No | Yes | No | No | To be tested | No | No | Yes | No | No | Yes | No | No | n/a | |||||||||||
| Static | Yes | Static | Yes | No | To be tested | No | Static | To be tested | Yes | Static | Yes | Yes | Yes | Yes | Yes | |||||||||
|
Width according to document.body width and height; this may diverge from the viewport or the canvas or whatever. |
||||||||||||||||||||||||
| Static | Yes | Static | Yes | No | To be tested | No | Static | To be tested | Incor |
Static | Yes | Yes | Incor |
Yes | Yes | |||||||||
|
|
||||||||||||||||||||||||
| No | Yes | No | Yes | No | To be tested | No | To be tested | No | No | No | No | No | To be tested | |||||||||||
|
|
||||||||||||||||||||||||
| Yes | Yes | No | To be tested | No | To be tested | Incor |
Yes | 1/1 | Yes | Incor |
Yes | To be tested | ||||||||||||
|
|
||||||||||||||||||||||||
| No | Incor |
Yes | Incor |
Yes | Yes | To be tested | No | Yes | Incor |
Incor |
Yes | Incor |
Incor |
|||||||||||
|
|
||||||||||||||||||||||||
| No | Yes | Yes | Yes | To be tested | No | Yes | Yes | Yes | Yes | Yes | Yes | |||||||||||||
|
|
||||||||||||||||||||||||
| No | Yes | Yes | Yes | To be tested | Static | No | Yes | Static | Yes | Yes | Yes | Yes | Yes | |||||||||||
|
|
||||||||||||||||||||||||
| Yes | Yes | No | To be tested | No | Yes | No | Yes | No | Buggy | Yes | Yes | Yes | Yes | |||||||||||
|
Iris makes the opaque box grey. |
||||||||||||||||||||||||
| Yes | Yes | Yes | To be tested | Incor |
Yes | Yes | Incor |
Yes | Almost | Incor |
Incor |
Yes | ||||||||||||
|
||||||||||||||||||||||||
| Yes | Yes | Yes | To be tested | Yes | Incor |
Incom |
Incor |
Incor |
Incom |
Yes | Incor |
Incor |
Yes | |||||||||||
position: fixed as position: absolute. |
||||||||||||||||||||||||
| No | Yes | Yes | No | To be tested | No | Yes | Yes | Yes | Yes | Yes | Yes | |||||||||||||
document.querySelectorAll('.testClass')
document.querySelectorAll('.testClass + p')
Returns a nodeList with all elements that have a Essentially, this method allows you to use CSS syntax to retrieve elements. |
||||||||||||||||||||||||
| Incor |
Yes | Yes | Yes | To be tested | Incor |
Yes | Yes | Yes | Yes | Yes | Yes | |||||||||||||
x.rows A nodeList with all rows of table <tfoot>
is the second row. |
||||||||||||||||||||||||
| Yes | No | Yes | Yes | To be tested | No | Yes | No | Yes | No | Incom |
No | Buggy | Yes | Incom |
||||||||||
|
||||||||||||||||||||||||
| No | Yes | No | Yes | No | To be tested | No | No | Yes | No | Yes | Yes | No | Yes | Yes | ||||||||||
|
This read-only property is useful if you want to get the entire text at a certain point and don’t want to be bothered by borders between text nodes. |
||||||||||||||||||||||||
|
Release year
(non-scoring)
|
2007 | 2008 | 2009 | 2008 | 2009 | 2009 | 2007 | ??? | 2005 | 2008 | 2008 | 2009 | 2008 | 2009 | 2009 | 2008 | 2009 | 2009 | 2009 | 2009 | ||||
|
Based on data provided by Alex Russell. |
||||||||||||||||||||||||
|
WebKit version
(non-scoring)
|
522 | 525 | 531 | 525 | 530 | 532 | ??? | ??? | 413 | 413 | ??? | 528 | ??? | 528 | 530 | 525 | 525 | 525 | 528 | ??? | ||||
|
This is mainly meant to prove that the WebKit version number is worthless when it comes to detecting browser capabilities. |
||||||||||||||||||||||||
OK, so which WebKit is best? The table below gives the cumulative scores of all tested WebKits.
You can mine the data by selecting browsers. If you select one browsers you’ll see which other browsers are closest to it. If you select two browsers you’ll get a list of the exact differences between the two.
| Browser | Better | Worse | Total |
|---|
I’ve devised a scoring system that I will certainly tweak in the future, so scores of individual WebKits may change without notice. (In fact, I’m not even 100% sure that I should use a scoring system, but such hard facts look nice.)
The scoring works as follows, with unmentioned verdicts scoring 0 points:
Most tests are weighted as 1, but a few are weighted as 2 or 3. I focus mainly on the mobile web; that’s why media queries are weighted so much. These weightings are indicated in the table.