blob: 00dddbfd4d73f63fd7f9a7da3c9388c4a55cb33a [file] [log] [blame]
// Copyright 2012 The Closure Library Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS-IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
goog.provide('goog.dom.vendorTest');
goog.setTestOnly('goog.dom.vendorTest');
goog.require('goog.array');
goog.require('goog.dom.vendor');
goog.require('goog.labs.userAgent.util');
goog.require('goog.testing.MockUserAgent');
goog.require('goog.testing.PropertyReplacer');
goog.require('goog.testing.jsunit');
goog.require('goog.userAgent');
goog.require('goog.userAgentTestUtil');
var documentMode;
var mockUserAgent;
var propertyReplacer = new goog.testing.PropertyReplacer();
function setUp() {
mockUserAgent = new goog.testing.MockUserAgent();
mockUserAgent.install();
}
function tearDown() {
goog.dispose(mockUserAgent);
documentMode = undefined;
propertyReplacer.reset();
}
goog.userAgent.getDocumentMode_ = function() {
return documentMode;
};
var UserAgents = {
GECKO: 'GECKO',
IE: 'IE',
OPERA: 'OPERA',
WEBKIT: 'WEBKIT'
};
/**
* Return whether a given user agent has been detected.
* @param {number} agent Value in UserAgents.
* @return {boolean} Whether the user agent has been detected.
*/
function getUserAgentDetected_(agent) {
switch (agent) {
case UserAgents.GECKO:
return goog.userAgent.GECKO;
case UserAgents.IE:
return goog.userAgent.IE;
case UserAgents.OPERA:
return goog.userAgent.OPERA;
case UserAgents.WEBKIT:
return goog.userAgent.WEBKIT;
}
return null;
}
/**
* Test browser detection for a user agent configuration.
* @param {Array<number>} expectedAgents Array of expected userAgents.
* @param {string} uaString User agent string.
* @param {string=} opt_product Navigator product string.
* @param {string=} opt_vendor Navigator vendor string.
*/
function assertUserAgent(expectedAgents, uaString, opt_product, opt_vendor) {
var mockNavigator = {
'userAgent': uaString,
'product': opt_product,
'vendor': opt_vendor
};
mockUserAgent.setNavigator(mockNavigator);
mockUserAgent.setUserAgentString(uaString);
// Force reread of navigator.userAgent;
goog.labs.userAgent.util.setUserAgent(null);
goog.userAgentTestUtil.reinitializeUserAgent();
for (var ua in UserAgents) {
var isExpected = goog.array.contains(expectedAgents, UserAgents[ua]);
assertEquals(isExpected, getUserAgentDetected_(UserAgents[ua]));
}
}
/**
* Tests for the vendor prefix for Webkit.
*/
function testVendorPrefixWebkit() {
assertUserAgent([UserAgents.WEBKIT], 'WebKit');
assertEquals('-webkit', goog.dom.vendor.getVendorPrefix());
}
/**
* Tests for the vendor prefix for Mozilla/Gecko.
*/
function testVendorPrefixGecko() {
assertUserAgent([UserAgents.GECKO], 'Gecko', 'Gecko');
assertEquals('-moz', goog.dom.vendor.getVendorPrefix());
}
/**
* Tests for the vendor prefix for Opera.
*/
function testVendorPrefixOpera() {
assertUserAgent([UserAgents.OPERA], 'Opera');
assertEquals('-o', goog.dom.vendor.getVendorPrefix());
}
/**
* Tests for the vendor prefix for IE.
*/
function testVendorPrefixIE() {
assertUserAgent([UserAgents.IE], 'MSIE');
assertEquals('-ms', goog.dom.vendor.getVendorPrefix());
}
/**
* Tests for the vendor Js prefix for Webkit.
*/
function testVendorJsPrefixWebkit() {
assertUserAgent([UserAgents.WEBKIT], 'WebKit');
assertEquals('Webkit', goog.dom.vendor.getVendorJsPrefix());
}
/**
* Tests for the vendor Js prefix for Mozilla/Gecko.
*/
function testVendorJsPrefixGecko() {
assertUserAgent([UserAgents.GECKO], 'Gecko', 'Gecko');
assertEquals('Moz', goog.dom.vendor.getVendorJsPrefix());
}
/**
* Tests for the vendor Js prefix for Opera.
*/
function testVendorJsPrefixOpera() {
assertUserAgent([UserAgents.OPERA], 'Opera');
assertEquals('O', goog.dom.vendor.getVendorJsPrefix());
}
/**
* Tests for the vendor Js prefix for IE.
*/
function testVendorJsPrefixIE() {
assertUserAgent([UserAgents.IE], 'MSIE');
assertEquals('ms', goog.dom.vendor.getVendorJsPrefix());
}
/**
* Tests for the vendor Js prefix if no UA detected.
*/
function testVendorJsPrefixNone() {
assertUserAgent([], '');
assertNull(goog.dom.vendor.getVendorJsPrefix());
}
/**
* Tests for the prefixed property name on Webkit.
*/
function testPrefixedPropertyNameWebkit() {
assertUserAgent([UserAgents.WEBKIT], 'WebKit');
assertEquals('webkitFoobar',
goog.dom.vendor.getPrefixedPropertyName('foobar'));
}
/**
* Tests for the prefixed property name on Webkit in an object.
*/
function testPrefixedPropertyNameWebkitAndObject() {
var mockDocument = {
// setting a value of 0 on purpose, to ensure we only look for property
// names, not their values.
'webkitFoobar': 0
};
assertUserAgent([UserAgents.WEBKIT], 'WebKit');
assertEquals('webkitFoobar',
goog.dom.vendor.getPrefixedPropertyName('foobar', mockDocument));
}
/**
* Tests for the prefixed property name.
*/
function testPrefixedPropertyName() {
assertUserAgent([], '');
assertNull(goog.dom.vendor.getPrefixedPropertyName('foobar'));
}
/**
* Tests for the prefixed property name in an object.
*/
function testPrefixedPropertyNameAndObject() {
var mockDocument = {
'foobar': 0
};
assertUserAgent([], '');
assertEquals('foobar',
goog.dom.vendor.getPrefixedPropertyName('foobar', mockDocument));
}
/**
* Tests for the prefixed property name when it doesn't exist.
*/
function testPrefixedPropertyNameAndObjectIsEmpty() {
var mockDocument = {};
assertUserAgent([], '');
assertNull(goog.dom.vendor.getPrefixedPropertyName('foobar', mockDocument));
}
/**
* Test for prefixed event type.
*/
function testPrefixedEventType() {
assertUserAgent([], '');
assertEquals('foobar', goog.dom.vendor.getPrefixedEventType('foobar'));
}
/**
* Test for browser-specific prefixed event type.
*/
function testPrefixedEventTypeForBrowser() {
assertUserAgent([UserAgents.WEBKIT], 'WebKit');
assertEquals('webkitfoobar', goog.dom.vendor.getPrefixedEventType('foobar'));
}
function assertIe(uaString, expectedVersion) {
assertUserAgent([UserAgents.IE], uaString);
assertEquals('User agent ' + uaString + ' should have had version ' +
expectedVersion + ' but had ' + goog.userAgent.VERSION,
expectedVersion,
goog.userAgent.VERSION);
}
function assertGecko(uaString, expectedVersion) {
assertUserAgent([UserAgents.GECKO], uaString, 'Gecko');
assertEquals('User agent ' + uaString + ' should have had version ' +
expectedVersion + ' but had ' + goog.userAgent.VERSION,
expectedVersion,
goog.userAgent.VERSION);
}