/** * Copyright 2015 Google Inc. All rights reserved. * * 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. * */ (function() { var nativeAddAll = Cache.prototype.addAll; var userAgent = navigator.userAgent.match(/(Firefox|Chrome)\/(\d+\.)/); // Has nice behavior of `var` which everyone hates if (userAgent) { var agent = userAgent[1]; var version = parseInt(userAgent[2]); } if ( nativeAddAll && (!userAgent || (agent === 'Firefox' && version >= 46) || (agent === 'Chrome' && version >= 50) ) ) { return; } Cache.prototype.addAll = function addAll(requests) { var cache = this; // Since DOMExceptions are not constructable: function NetworkError(message) { this.name = 'NetworkError'; this.code = 19; this.message = message; } NetworkError.prototype = Object.create(Error.prototype); return Promise.resolve().then(function() { if (arguments.length < 1) throw new TypeError(); // Simulate sequence<(Request or USVString)> binding: var sequence = []; requests = requests.map(function(request) { if (request instanceof Request) { return request; } else { return String(request); // may throw TypeError } }); return Promise.all( requests.map(function(request) { if (typeof request === 'string') { request = new Request(request); } var scheme = new URL(request.url).protocol; if (scheme !== 'http:' && scheme !== 'https:') { throw new NetworkError("Invalid scheme"); } return fetch(request.clone()); }) ); }).then(function(responses) { // If some of the responses has not OK-eish status, // then whole operation should reject if (responses.some(function(response) { return !response.ok; })) { throw new NetworkError('Incorrect response status'); } // TODO: check that requests don't overwrite one another // (don't think this is possible to polyfill due to opaque responses) return Promise.all( responses.map(function(response, i) { return cache.put(requests[i], response); }) ); }).then(function() { return undefined; }); }; Cache.prototype.add = function add(request) { return this.addAll([request]); }; }());