| exports.fetch = isFunction(global.fetch) && isFunction(global.ReadableStream) | |
| exports.writableStream = isFunction(global.WritableStream) | |
| exports.abortController = isFunction(global.AbortController) | |
| // 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 | |
| } | |
| // If fetch is supported, then arraybuffer will be supported too. Skip calling | |
| // checkTypeSupport(), since that calls getXHR(). | |
| exports.arraybuffer = exports.fetch || 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 && checkTypeSupport('ms-stream') | |
| exports.mozchunkedarraybuffer = !exports.fetch && 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) | |
| function isFunction (value) { | |
| return typeof value === 'function' | |
| } | |
| xhr = null // Help gc |