// Parts copyright Modernizr: // * @author Faruk Ates // * @author Paul Irish // * @copyright (c) 2009-2011 Faruk Ates. // * @contributor Ben Alman // many thanks to modernizer for working a lot of this out // should probably just use it instead... // this does two things: // 1. Check that the current browser supports the core HTML5 feature set, // 2. Regularise access to the various APIs, removing vendor prefixes and providing the spec defined methods // 3. Add some useful CSS-visible attributes to the HTML element (function() { 'use strict'; var _window = window, _document = document; var testFlexBoxCompatibility = false; var i, ii; var prefixes = ' -webkit- -moz- -o- -ms- -khtml- '.split(' '); try { ///////////////////////////// Flexible Box model var set_prefixed_property_css = function(element, property, value, extra) { element.style.cssText = prefixes.join(property + ':' + value + ';') + (extra || ''); }; var set_prefixed_value_css = function(element, property, value, extra) { property += ':'; element.style.cssText = (property + prefixes.join(value + ';' + property)).slice(0, -property.length) + (extra || ''); }; if (testFlexBoxCompatibility) { var docElement = _document.documentElement, c = _document.createElement('div'), elem = _document.createElement('div'), w; set_prefixed_value_css(c, 'display', 'box', 'width:42px;padding:0;'); set_prefixed_property_css(elem, 'box-flex', '1', 'width:10px;'); c.appendChild(elem); docElement.appendChild(c); w = elem.offsetWidth; c.removeChild(elem); docElement.removeChild(c); if (w !== 42) { // console.error(w) throw (w) + ' Flexible Box Model not supported'; } } ///////////////////////////// XHR Uploads var xhr = new XMLHttpRequest(); if (!xhr.upload) { throw 'XMLHttpRequestUpload not supported'; } ///////////////////////////// FormData try { var f = new FormData(); } catch (e) { throw 'FormData not supported'; } ///////////////////////////// File API / File objects if (!_window.File) { throw 'File API not supported'; } ///////////////////////////// File API / objectURLs // provide consistent API for creating blob/object URLs var createObjectURL = 'createObjectURL', revokeObjectURL = 'revokeObjectURL'; if (!_window.URL) { if (_window.webkitURL) { _window.URL = _window.webkitURL; } else { _window.URL = {}; if (_window.createBlobURL) { _window.URL[createObjectURL] = function(file) { return _window.createBlobURL(file); }; } else if (_window[createObjectURL]) { _window.URL[createObjectURL] = function(file) { return _window[createObjectURL](file); }; } else { //// Dont fail this because it's not absolutely essential //// & fails iOS devices (though that might be a good thing in some ways, it //// would seriously limit users ability to make quick changes on the go, for instance) _window.URL[createObjectURL] = function(file) { return ''; }; // throw "File API not supported"; } if (_window.revokeBlobURL) { _window.URL[revokeObjectURL] = function(file) { return _window.revokeBlobURL(file); }; } else if (_window[revokeObjectURL]) { _window.URL[revokeObjectURL] = function(file) { return _window[revokeObjectURL](file); }; } else { //// Dont fail this because it's not absolutely essential //// & fails iOS devices (though that might be a good thing in some ways, it //// would seriously limit users ability to make quick changes on the go, for instance) _window.URL[revokeObjectURL] = function(file) { return ''; }; // throw "File API not supported"; } } } ///////////////////////////// File API / slices // normalise access to the File#slice method var proto = _window.File.prototype; if (!proto.slice) { var methods = ['webkitSlice', 'mozSlice']; for (i = 0, ii = methods.length; i < ii; i++) { var method = methods[i]; if (proto[method]) { proto.slice = proto[method]; } } if (!proto.slice) { // not supporting slice just means we can't use the sharded uploader } } ///////////////////////////// localStorage try { i = localStorage.getItem; } catch(e) { throw 'Local Storage not supported'; } var b = _document.documentElement; b.setAttribute('data-useragent', navigator.userAgent); b.setAttribute('data-platform', navigator.platform); } catch (e) { _window.location.href = '/@spontaneous/unsupported?msg=' + _window.encodeURIComponent(e) + '&useragent=' + _window.encodeURIComponent(_window.navigator.userAgent); } }());