blob: 86b9df75ffd0656b322397def7312276bdac4263 [file] [log] [blame] [edit]
// Copyright 2011 WebDriver committers
// Copyright 2011 Google Inc.
//
// 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.
/**
* @fileoverview Helper function to determine which HTML5 features are
* supported by browsers..
*/
goog.provide('bot.html5');
goog.require('bot');
goog.require('bot.Error');
goog.require('bot.ErrorCode');
goog.require('bot.userAgent');
goog.require('goog.userAgent');
goog.require('goog.userAgent.product');
/**
* Identifier for supported HTML5 API in Webdriver.
*
* @enum {string}
*/
bot.html5.API = {
APPCACHE: 'appcache',
BROWSER_CONNECTION: 'browser_connection',
DATABASE: 'database',
GEOLOCATION: 'location',
LOCAL_STORAGE: 'local_storage',
SESSION_STORAGE: 'session_storage',
VIDEO: 'video',
AUDIO: 'audio',
CANVAS: 'canvas'
};
/**
* True if the current browser is IE8.
*
* @private
* @type {boolean}
* @const
*/
bot.html5.IS_IE8_ = goog.userAgent.IE &&
bot.userAgent.isEngineVersion(8) && !bot.userAgent.isEngineVersion(9);
/**
* True if the current browser is Safari 4.
*
* @private
* @type {boolean}
* @const
*/
bot.html5.IS_SAFARI4_ = goog.userAgent.product.SAFARI &&
bot.userAgent.isProductVersion(4) && !bot.userAgent.isProductVersion(5);
/**
* True if the browser is Android 2.2 (Froyo).
*
* @private
* @type {boolean}
* @const
*/
bot.html5.IS_ANDROID_FROYO_ = goog.userAgent.product.ANDROID &&
bot.userAgent.isProductVersion(2.2) && !bot.userAgent.isProductVersion(2.3);
/**
* True if the current browser is Safari 5 on Windows.
*
* @private
* @type {boolean}
* @const
*/
bot.html5.IS_SAFARI_WINDOWS_ = goog.userAgent.WINDOWS &&
goog.userAgent.product.SAFARI &&
(bot.userAgent.isProductVersion(4)) &&
!bot.userAgent.isProductVersion(6);
/**
* Checks if the browser supports an HTML5 feature.
*
* @param {bot.html5.API} api HTML5 API identifier.
* @param {!Window=} opt_window The window to be accessed;
* defaults to the main window.
* @return {boolean} Whether the browser supports the feature.
*/
bot.html5.isSupported = function(api, opt_window) {
var win = opt_window || bot.getWindow();
switch (api) {
case bot.html5.API.APPCACHE:
// IE8 does not support application cache, though the APIs exist.
if (bot.html5.IS_IE8_) {
return false;
}
return goog.isDefAndNotNull(win.applicationCache);
case bot.html5.API.BROWSER_CONNECTION:
return goog.isDefAndNotNull(win.navigator) &&
goog.isDefAndNotNull(win.navigator.onLine);
case bot.html5.API.DATABASE:
// Safari4 database API does not allow writes.
if (bot.html5.IS_SAFARI4_) {
return false;
}
// Android Froyo does not support database, though the APIs exist.
if (bot.html5.IS_ANDROID_FROYO_) {
return false;
}
return goog.isDefAndNotNull(win.openDatabase);
case bot.html5.API.GEOLOCATION:
// Safari 4,5 on Windows do not support geolocation, see:
// https://discussions.apple.com/thread/3547900
if (bot.html5.IS_SAFARI_WINDOWS_) {
return false;
}
return goog.isDefAndNotNull(win.navigator) &&
goog.isDefAndNotNull(win.navigator.geolocation);
case bot.html5.API.LOCAL_STORAGE:
// IE8 does not support local storage, though the APIs exist.
if (bot.html5.IS_IE8_) {
return false;
}
return goog.isDefAndNotNull(win.localStorage);
case bot.html5.API.SESSION_STORAGE:
// IE8 does not support session storage, though the APIs exist.
if (bot.html5.IS_IE8_) {
return false;
}
return goog.isDefAndNotNull(win.sessionStorage) &&
// To avoid browsers that only support this API partically
// like some versions of FF.
goog.isDefAndNotNull(win.sessionStorage.clear);
default:
throw new bot.Error(bot.ErrorCode.UNKNOWN_ERROR,
'Unsupported API identifier provided as parameter');
}
};