Comparison of JavaScript engines
The following tables compare standards support for some notable JavaScript/ECMAScript engines used in web browsers.
Explanation of tables
    
See List of ECMAScript engines for a full list.
Values
    
These indicate the level of support for the given item in each engine. By default, the most recent version of the engine is implied. However, a specific version number can be listed; when this indicates full support, it's the initial version of the engine fully supporting the item.
| Value | Meaning | 
|---|---|
| Yes | Fully supported | 
| No | Has never been supported | 
| Partial | Only some values are supported | 
| Incorrect | Not implemented correctly in all cases | 
| Experimental | May be incomplete or buggy | 
| Nightly build | Currently in development; full support is expected | 
| Depends | Only supported for the specified conditions | 
| Dropped | No longer supported | 
ECMAScript version support
    
| Browser layout engine | Trident | Gecko | WebKit | Presto | Blink | 
|---|---|---|---|---|---|
| Corresponding JavaScript engine | JScript / Chakra | SpiderMonkey | JavaScriptCore | Linear B / Futhark / Carakan | V8 | 
| ECMAScript Edition 3 | Yes | 0.6 | Yes | 1.0 | Yes | 
| ECMAScript Edition 5 | 5.0 | 2.0 | Partial | Yes | Yes | 
| ECMAScript Edition 6 | |||||
| JavaScript 1.5 extensions | No | 0.6 | Yes | 1.0 | Yes | 
| JavaScript 1.6 extensions (excluding E4X)  | 
No | 1.8 | Partial | Partial | Partial | 
| JavaScript 1.7 extensions | No | 1.8.1 | No | Partial | No | 
| JavaScript 1.8 extensions | No | 1.9 | Partial | No | Partial | 
| JavaScript 1.8.1 extensions | No | 1.9.1 | No | No | No | 
| JScript .NET extensions | No | No | No | No | No | 
| ActionScript extensions | No | No | No | No | No | 
| E4X | No | Dropped[1] | No | No | No | 
Standard library
    
    Global object
    
| Global object | Trident | Gecko | WebKit | Presto | Blink | 
|---|---|---|---|---|---|
| Value properties | |||||
NaN | 
4.0 | 0.6 | Yes | Yes | Yes | 
Infinity | 
4.0 | 0.6 | Yes | Yes | Yes | 
undefined | 
5.5 | 0.6 | Yes | Yes | Yes | 
| Function properties | |||||
eval(x) | 
3.0 | 0.6 | Yes | Yes | Yes | 
parseInt(string [, radix]) | 
3.0 | 0.6 | Yes | Yes | Yes | 
parseFloat(string) | 
3.0 | 0.6 | Yes | Yes | Yes | 
isNaN(number) | 
4.0 | 0.6 | Yes | Yes | Yes | 
isFinite(number) | 
4.0 | 0.6 | Yes | Yes | Yes | 
| URI handling functions | |||||
decodeURI(encodedURI) | 
5.5 | 0.6 | Yes | Yes | Yes | 
decodeURIComponent(encodedURIComponent) | 
5.5 | 0.6 | Yes | Yes | Yes | 
encodeURI(uri) | 
5.5 | 0.6 | Yes | Yes | Yes | 
encodeURIComponent(uriComponent) | 
5.5 | 0.6 | Yes | Yes | Yes | 
| Constructor properties | |||||
Object | 
4.0 | Yes | Yes | Yes | Yes | 
Function | 
4.0 | Yes | Yes | Yes | Yes | 
Array | 
4.0 | Yes | Yes | Yes | Yes | 
String | 
3.0 | Yes | Yes | Yes | Yes | 
Boolean | 
3.0 | Yes | Yes | Yes | Yes | 
Number | 
3.0 | Yes | Yes | Yes | Yes | 
Date | 
3.0 | Yes | Yes | Yes | Yes | 
RegExp | 
4.0 | Yes | Yes | Yes | Yes | 
Error | 
5.0 | Yes | Yes | Yes | Yes | 
EvalError | 
5.0 | Yes | Yes | Yes | Yes | 
RangeError | 
5.0 | Yes | Yes | Yes | Yes | 
ReferenceError | 
5.0 | Yes | Yes | Yes | Yes | 
SyntaxError | 
5.0 | Yes | Yes | Yes | Yes | 
TypeError | 
5.0 | Yes | Yes | Yes | Yes | 
URIError | 
5.0 | Yes | Yes | Yes | Yes | 
| Other properties | |||||
Math | 
3.0 | Yes | Yes | Yes | Yes | 
| Additional properties | |||||
escape(string) | 
3.0 | Yes | Yes | Yes | Yes | 
unescape(string) | 
3.0 | Yes | Yes | Yes | Yes | 
Object object
    
| Object object | Trident | Gecko | WebKit | Presto | Blink | 
|---|---|---|---|---|---|
| Called as function | |||||
Object([value]) | 
Yes | Yes | Yes | Yes | Yes | 
| Called as constructor | |||||
new Object([value]) | 
4.0 | Yes | Yes | Yes | Yes | 
| Properties | |||||
prototype | 
4.0 | Yes | Yes | Yes | Yes | 
| Properties of prototype | |||||
constructor | 
4.0 | Yes | Yes | Yes | Yes | 
toString() | 
4.0 | Yes | Yes | Yes | Yes | 
toLocaleString() | 
4.0 | Yes | Yes | Yes | Yes | 
valueOf() | 
4.0 | Yes | Yes | Yes | Yes | 
hasOwnProperty(V) | 
5.5 | Yes | 3 | Yes | Yes | 
isPrototypeOf(V) | 
5.5 | Yes | 3 | Yes | Yes | 
propertyIsEnumerable(V) | 
5.5 | Yes | 3 | Yes | Yes | 
Function object
    
| Function object | Trident | Gecko | WebKit | Presto | Blink | 
|---|---|---|---|---|---|
| Called as function | |||||
| {{code|Function([[p1 [, p2 [, ...]],] body])}} | ? | Yes | Yes | ? | Yes | 
| Called as constructor | |||||
| {{code|new Function([[p1 [, p2 [, ...]],] body])}} | 4.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties | |||||
length | 
? | 1.0 | Yes | Yes | Yes | 
prototype | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties of prototype | |||||
length | 
? | 1.0 | Yes | ? | Yes | 
constructor | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
toString() | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
apply(thisArg, argArray) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
call(thisArg [, arg1 [, arg2 [, ...]]]) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties of instances | |||||
length | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
prototype | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
Array object
    
| Array object | Trident | Gecko | WebKit | Presto | Blink | 
|---|---|---|---|---|---|
| Called as function | |||||
Array([item1 [, item2 [, ...]]]) | 
Yes | Yes | Yes | Yes | Yes | 
| Called as constructor | |||||
new Array([item1, item2 [, ...]]) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
new Array(len) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties | |||||
prototype | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties of prototype | |||||
constructor | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
toString() | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
toLocaleString() | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
concat([item1 [, item2 [,...]]]) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
join(separator) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
pop() | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
push([item1 [, item2 [,...]]]) | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
reverse() | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
shift() | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
slice(start, end) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
sort(comparefn) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
splice(start, deleteCount [, item1 [, item2 [, ...]]]) | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
unshift([item1 [, item2 [, ...]]]) | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
indexOf(searchElement[, fromIndex]) | 
9.0[2] | 1.8 | 522 | 2.1 | Yes | 
lastIndexOf(searchElement[, fromIndex]) | 
1.8 | 522 | 2.1 | Yes | |
filter(callback[, thisObject]) | 
1.8 | 522 | 2.1 | Yes | |
forEach(callback[, thisObject]) | 
1.8 | 522 | 2.1 | Yes | |
every(callback[, thisObject]) | 
1.8 | 522 | 2.1 | Yes | |
map(callback[, thisObject]) | 
1.8 | 522 | 2.1 | Yes | |
some(callback[, thisObject]) | 
1.8 | 522 | 2.1 | Yes | |
reduce(callback[, initialValue]) | 
1.9 | 528 | 2.5.22 | Yes | |
reduceRight(callback[, initialValue]) | 
1.9 | 528 | 2.5.22 | Yes | |
| Properties of instances | |||||
length | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
String object
    
| String object | Trident | Gecko | WebKit | Presto | Blink | 
|---|---|---|---|---|---|
| Called as function | |||||
String([value]) | 
Yes | Yes | Yes | Yes | Yes | 
| Called as constructor | |||||
new String([value]) | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties | |||||
prototype | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
fromCharCode([char0 [, char1 [, ...]]]) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties of prototype | |||||
constructor | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
toString() | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
valueOf() | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
charAt(pos) | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
charCodeAt(pos) | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
concat([string1 [, string2 [, ...]]]) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
indexOf(searchString, position) | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
lastIndexOf(searchString, position) | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
localeCompare(that) | 
5.5 | 1.0 | Yes | 1.0 | Yes | 
match(regexp) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
replace(searchValue, replaceValue) | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
search(regexp) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
slice(start, end) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
split(separator, limit) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
substring(start, end) | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
toLowerCase() | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
toLocaleLowerCase(comparefn) | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
toUpperCase() | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
toLocaleUpperCase() | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
| Additional properties of prototype | |||||
substr(start, length) | 
4.0 | 1.0 | Yes | 1.0 | Yes | 
| Properties of instances | |||||
length | 
3.0 | 1.0 | Yes | 1.0 | Yes | 
Boolean object
    
| Boolean object | Trident | Gecko | WebKit | Presto | Blink | 
|---|---|---|---|---|---|
| Called as function | |||||
Boolean([value]) | 
Yes | Yes | Yes | Yes | Yes | 
| Called as constructor | |||||
new Boolean([value]) | 
3.0 | Yes | Yes | Yes | Yes | 
| Properties | |||||
prototype | 
4.0 | Yes | Yes | Yes | Yes | 
| Properties of prototype | |||||
constructor | 
4.0 | Yes | Yes | Yes | Yes | 
toString() | 
4.0 | Yes | Yes | Yes | Yes | 
valueOf() | 
4.0 | Yes | Yes | Yes | Yes | 
Number object
    
| Number object | Trident | Gecko | WebKit | Presto | 
|---|---|---|---|---|
| Called as function | ||||
Number([value]) | 
? | Yes | Yes | ? | 
| Called as constructor | ||||
new Number([value]) | 
3.0 | 1.0 | Yes | 1.0 | 
| Properties | ||||
prototype | 
4.0 | 1.0 | Yes | 1.0 | 
MAX_VALUE | 
4.0 | 1.0 | Yes | 1.0 | 
MIN_VALUE | 
4.0 | 1.0 | Yes | 1.0 | 
NaN | 
4.0 | 1.0 | Yes | 1.0 | 
NEGATIVE_INFINITY | 
4.0 | 1.0 | Yes | 1.0 | 
POSITIVE_INFINITY | 
4.0 | 1.0 | Yes | 1.0 | 
| Properties of prototype | ||||
constructor | 
4.0 | 1.0 | Yes | 1.0 | 
toString([radix]) | 
4.0 | 1.0 | Yes | 1.0 | 
toLocaleString() | 
5.5 | 1.0 | Yes | 1.0 | 
valueOf() | 
4.0 | 1.0 | Yes | 1.0 | 
toFixed(fractionDigits) | 
5.5 | 1.0 | Yes | 1.0 | 
toExponential(fractionDigits) | 
5.5 | 1.0 | Yes | 1.0 | 
toPrecision(precision) | 
5.5 | 1.0 | Yes | 1.0 | 
Math object
    
| Math object | Trident | Gecko | WebKit | Presto | 
|---|---|---|---|---|
| Value properties | ||||
E | 
3.0 | 1.0 | Yes | 1.0 | 
LN10 | 
3.0 | 1.0 | Yes | 1.0 | 
LN2 | 
3.0 | 1.0 | Yes | 1.0 | 
LOG2E | 
3.0 | 1.0 | Yes | 1.0 | 
LOG10E | 
3.0 | 1.0 | Yes | 1.0 | 
PI | 
Yes | Yes | Yes | Yes | 
SQRT1_2 | 
3.0 | 1.0 | Yes | 1.0 | 
SQRT2 | 
Yes | Yes | Yes | Yes | 
| Function properties | ||||
abs(x) | 
3.0 | 1.0 | Yes | 1.0 | 
acos(x) | 
3.0 | 1.0 | Yes | 1.0 | 
asin(x) | 
3.0 | 1.0 | Yes | 1.0 | 
atan(x) | 
3.0 | 1.0 | Yes | 1.0 | 
atan2(y, x) | 
3.0 | 1.0 | Yes | 1.0 | 
ceil(x) | 
3.0 | 1.0 | Yes | 1.0 | 
cos(x) | 
3.0 | 1.0 | Yes | 1.0 | 
exp(x) | 
3.0 | 1.0 | Yes | 1.0 | 
floor(x) | 
3.0 | 1.0 | Yes | 1.0 | 
log(x) | 
3.0 | 1.0 | Yes | 1.0 | 
max([value1 [, value2 [, ...]]]) | 
3.0 | 1.0 | Yes | 1.0 | 
min([value1 [, value2 [, ...]]]) | 
3.0 | 1.0 | Yes | 1.0 | 
pow(x, y) | 
3.0 | 1.0 | Yes | 1.0 | 
random() | 
3.0 | 1.0 | Yes | 1.0 | 
round(x) | 
3.0 | 1.0 | Yes | 1.0 | 
sin(x) | 
3.0 | 1.0 | Yes | 1.0 | 
sqrt(x) | 
3.0 | 1.0 | Yes | 1.0 | 
tan(x) | 
3.0 | 1.0 | Yes | 1.0 | 
Date object
    
| Date object | Trident | Gecko | WebKit | Presto | 
|---|---|---|---|---|
| Called as function | ||||
Date ([year [, month [, date [, hours [, minutes [, seconds [, ms ]]]]]]]) | 
? | ? | ? | ? | 
| Called as constructor | ||||
new Date (year, month [, date [, hours [, minutes [, seconds [, ms ]]]]]) | 
4.0 | 1.0 | Yes | 1.0 | 
new Date (value) | 
4.0 | 1.0 | Yes | 1.0 | 
new Date () | 
4.0 | 1.0 | Yes | 1.0 | 
| Properties | ||||
prototype | 
4.0 | 1.0 | Yes | 1.0 | 
parse(string) | 
3.0 | 1.0 | Yes | 1.0 | 
UTC (year, month [, date [, hours [, minutes [, seconds [, ms ]]]]]) | 
3.0 | 1.0 | Yes | 1.0 | 
| Properties of prototype | ||||
constructor | 
4.0 | 1.0 | Yes | 1.0 | 
toString() | 
4.0 | 1.0 | Yes | 1.0 | 
toDateString() | 
4.0 | 1.0 | Yes | 1.0 | 
toTimeString() | 
4.0 | 1.0 | Yes | 1.0 | 
toLocaleString() | 
4.0 | 1.0 | Yes | 1.0 | 
toLocaleDateString() | 
4.0 | 1.0 | Yes | 1.0 | 
toLocaleTimeString() | 
4.0 | 1.0 | Yes | 1.0 | 
valueOf() | 
4.0 | 1.0 | Yes | 1.0 | 
getTime() | 
3.0 | 1.0 | Yes | 1.0 | 
getFullYear() | 
4.0 | 1.0 | Yes | 1.0 | 
getMonth() | 
3.0 | 1.0 | Yes | 1.0 | 
getUTCMonth() | 
4.0 | 1.0 | Yes | 1.0 | 
getDate() | 
3.0 | 1.0 | Yes | 1.0 | 
getUTCDate() | 
4.0 | 1.0 | Yes | 1.0 | 
getDay() | 
3.0 | 1.0 | Yes | 1.0 | 
getUTCDay() | 
4.0 | 1.0 | Yes | 1.0 | 
getHours() | 
3.0 | 1.0 | Yes | 1.0 | 
getUTCHours() | 
4.0 | 1.0 | Yes | 1.0 | 
getMinutes() | 
3.0 | 1.0 | Yes | 1.0 | 
getUTCMinutes() | 
4.0 | 1.0 | Yes | 1.0 | 
getSeconds() | 
3.0 | 1.0 | Yes | 1.0 | 
getUTCSeconds() | 
4.0 | 1.0 | Yes | 1.0 | 
getMilliseconds() | 
4.0 | 1.0 | Yes | 1.0 | 
getUTCMilliseconds() | 
4.0 | 1.0 | Yes | 1.0 | 
getTimezoneOffset() | 
4.0 | 1.0 | Yes | 1.0 | 
setTime(time) | 
3.0 | 1.0 | Yes | 1.0 | 
setMilliseconds(ms) | 
4.0 | 1.0 | Yes | 1.0 | 
setUTCMilliseconds(ms) | 
4.0 | 1.0 | Yes | 1.0 | 
setSeconds(sec [, ms]) | 
3.0 | 1.0 | Yes | 1.0 | 
setUTCSeconds(sec [, ms]) | 
4.0 | 1.0 | Yes | 1.0 | 
setMinutes(min [, sec [, ms]]) | 
3.0 | 1.0 | Yes | 1.0 | 
setUTCMinutes(min [, sec [, ms]]) | 
4.0 | 1.0 | Yes | 1.0 | 
setHours(hour [, min [, sec [, ms]]]) | 
4.0 | 1.0 | Yes | 1.0 | 
setUTCHours(hour [, min [, sec [, ms]]]) | 
4.0 | 1.0 | Yes | 1.0 | 
setDate(date) | 
4.0 | 1.0 | Yes | 1.0 | 
setUTCDate(date) | 
4.0 | 1.0 | Yes | 1.0 | 
setMonth(month [, date]) | 
3.0 | 1.0 | Yes | 1.0 | 
setUTCMonth(month [, date]) | 
4.0 | 1.0 | Yes | 1.0 | 
setFullYear(year [, month [, date]]) | 
4.0 | 1.0 | Yes | 1.0 | 
setUTCFullYear(year [, month [, date]]) | 
4.0 | 1.0 | Yes | 1.0 | 
toUTCString() | 
4.0 | 1.0 | Yes | 1.0 | 
| Additional properties of prototype | ||||
getYear() | 
3.0 | 1.0 | Yes | 1.0 | 
setYear(year) | 
3.0 | 1.0 | Yes | 1.0 | 
toGMTString() | 
4.0 | 1.0 | Yes | 1.0 | 
RegExp object
    
| RegExp object | Trident | Gecko | WebKit | Presto | 
|---|---|---|---|---|
| Called as function | ||||
RegExp (pattern, flags) | 
? | ? | ? | ? | 
| Called as constructor | ||||
new RegExp (pattern, flags) | 
4.0 | 1.0 | Yes | 1.0 | 
| Properties | ||||
prototype | 
4.0 | 1.0 | Yes | 1.0 | 
| Properties of prototype | ||||
constructor | 
4.0 | 1.0 | Yes | 1.0 | 
exec(string) | 
4.0 | 1.0 | Yes | 1.0 | 
test(string) | 
4.0 | 1.0 | Yes | 1.0 | 
toString() | 
4.0 | 1.0 | Yes | 1.0 | 
| Properties of instances | ||||
source | 
4.0 | 1.0 | Yes | 1.0 | 
global | 
4.0 | 1.0 | Yes | 1.0 | 
ignoreCase | 
5.5 | 1.0 | Yes | 1.0 | 
multiline | 
5.5 | 1.0 | Yes | 1.0 | 
lastIndex | 
4.0 | 1.0 | Yes | 1.0 | 
Error object
    
| Error object | Trident | Gecko | WebKit | Presto | 
|---|---|---|---|---|
| Called as function | ||||
Error (message) | 
? | ? | ? | ? | 
| Called as constructor | ||||
new Error (message) | 
5.0 | 1.0 | Yes | 1.0 | 
| Properties | ||||
prototype | 
5.0 | 1.0 | Yes | 1.0 | 
| Properties of prototype | ||||
constructor | 
5.0 | 1.0 | Yes | 1.0 | 
name | 
5.5 | 1.0 | Yes | 1.0 | 
message | 
5.5 | 1.0 | Yes | 1.0 | 
toString() | 
5.0 | 1.0 | Yes | 1.0 | 
NativeError objects
    
| NativeError object | Trident | Gecko | WebKit | Presto | 
|---|---|---|---|---|
| Called as function | ||||
EvalError (message) | 
? | 1.0 | Yes | ? | 
RangeError (message) | 
? | 1.0 | Yes | ? | 
ReferenceError (message) | 
? | 1.0 | Yes | ? | 
SyntaxError (message) | 
? | 1.0 | Yes | ? | 
TypeError (message) | 
? | 1.0 | Yes | ? | 
URIError (message) | 
? | 1.0 | Yes | ? | 
| Called as constructor | ||||
new EvalError (message) | 
? | 1.0 | Yes | ? | 
new RangeError (message) | 
? | 1.0 | Yes | ? | 
new ReferenceError (message) | 
? | 1.0 | Yes | ? | 
new SyntaxError (message) | 
? | 1.0 | Yes | ? | 
new TypeError (message) | 
? | 1.0 | Yes | ? | 
new URIError (message) | 
? | 1.0 | Yes | ? | 
| Properties | ||||
prototype | 
? | 1.0 | ? | ? | 
| Properties of prototype | ||||
constructor | 
? | 1.0 | ? | ? | 
name | 
? | 1.0 | Yes | ? | 
message | 
? | 1.0 | Yes | ? | 
gollark: How is it "cheeseable"?
gollark: Also, again, I'd quite like designs for LEA fuel.
gollark: So I guess a MSR checkbox and the ability to assign fuels to cells separately if that was ticked is enough.
gollark: But you'd also want support for multiple fuels.
gollark: Or just a MSR checkbox on the planner.
References
    
- E4X, Mozilla
 - ECMAScript 5 Arrays, Microsoft, archived from the original on 2010-06-27, retrieved 2010-06-24
 
Further reading
    
    
External links
    
- Webdevout – mostly covers Windows browsers. Extensive bug testing.
 
    This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.