blob: 3b8c257b18c1cdd6185b351a5a3c21e0e27a012c [file] [log] [blame] [edit]
// Licensed to the Software Freedom Conservancy (SFC) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The SFC licenses this file
// to you 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 IE version 8 or earlier.
* @private {boolean}
* @const
*/
bot.html5.IS_IE8_OR_EARLIER_ = goog.userAgent.IE &&
!bot.userAgent.isEngineVersion(9);
/**
* True if the current browser is Safari version 4 or earlier.
* @private {boolean}
* @const
*/
bot.html5.IS_SAFARI4_OR_EARLIER_ = goog.userAgent.product.SAFARI &&
!bot.userAgent.isProductVersion(5);
/**
* True if the browser is Android version 2.2 (Froyo) or earlier.
* @private {boolean}
* @const
*/
bot.html5.IS_ANDROID_FROYO_OR_EARLIER_ = goog.userAgent.product.ANDROID &&
!bot.userAgent.isProductVersion(2.3);
/**
* True if the current browser is Safari 5 on Windows.
* @private {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_OR_EARLIER_) {
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_OR_EARLIER_) {
return false;
}
// Android Froyo does not support database, though the APIs exist.
if (bot.html5.IS_ANDROID_FROYO_OR_EARLIER_) {
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_OR_EARLIER_) {
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_OR_EARLIER_) {
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');
}
};