| exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream) |
| |
| exports.writableStream = isFunction(global.WritableStream) |
| |
| exports.abortController = isFunction(global.AbortController) |
| |
| exports.blobConstructor = false |
| try { |
| new Blob([new ArrayBuffer(1)]) |
| exports.blobConstructor = true |
| } catch (e) {} |
| |
| // The xhr request to example.com may violate some restrictive CSP configurations, |
| // so if we're running in a browser that supports `fetch`, avoid calling getXHR() |
| // and assume support for certain features below. |
| var xhr |
| function getXHR () { |
| // Cache the xhr value |
| if (xhr !== undefined) return xhr |
| |
| if (global.XMLHttpRequest) { |
| xhr = new global.XMLHttpRequest() |
| // If XDomainRequest is available (ie only, where xhr might not work |
| // cross domain), use the page location. Otherwise use example.com |
| // Note: this doesn't actually make an http request. |
| try { |
| xhr.open('GET', global.XDomainRequest ? '/' : 'https://example.com') |
| } catch(e) { |
| xhr = null |
| } |
| } else { |
| // Service workers don't have XHR |
| xhr = null |
| } |
| return xhr |
| } |
| |
| function checkTypeSupport (type) { |
| var xhr = getXHR() |
| if (!xhr) return false |
| try { |
| xhr.responseType = type |
| return xhr.responseType === type |
| } catch (e) {} |
| return false |
| } |
| |
| // For some strange reason, Safari 7.0 reports typeof global.ArrayBuffer === 'object'. |
| // Safari 7.1 appears to have fixed this bug. |
| var haveArrayBuffer = typeof global.ArrayBuffer !== 'undefined' |
| var haveSlice = haveArrayBuffer && isFunction(global.ArrayBuffer.prototype.slice) |
| |
| // If fetch is supported, then arraybuffer will be supported too. Skip calling |
| // checkTypeSupport(), since that calls getXHR(). |
| exports.arraybuffer = exports.fetch || (haveArrayBuffer && checkTypeSupport('arraybuffer')) |
| |
| // These next two tests unavoidably show warnings in Chrome. Since fetch will always |
| // be used if it's available, just return false for these to avoid the warnings. |
| exports.msstream = !exports.fetch && haveSlice && checkTypeSupport('ms-stream') |
| exports.mozchunkedarraybuffer = !exports.fetch && haveArrayBuffer && |
| checkTypeSupport('moz-chunked-arraybuffer') |
| |
| // If fetch is supported, then overrideMimeType will be supported too. Skip calling |
| // getXHR(). |
| exports.overrideMimeType = exports.fetch || (getXHR() ? isFunction(getXHR().overrideMimeType) : false) |
| |
| exports.vbArray = isFunction(global.VBArray) |
| |
| function isFunction (value) { |
| return typeof value === 'function' |
| } |
| |
| xhr = null // Help gc |