diff -r be944660c56a -r 3d72ae0968f4 wp/wp-includes/js/dist/vendor/wp-polyfill-fetch.js --- a/wp/wp-includes/js/dist/vendor/wp-polyfill-fetch.js Wed Sep 21 18:19:35 2022 +0200 +++ b/wp/wp-includes/js/dist/vendor/wp-polyfill-fetch.js Tue Sep 27 16:37:53 2022 +0200 @@ -4,12 +4,17 @@ (factory((global.WHATWGFetch = {}))); }(this, (function (exports) { 'use strict'; + var global = + (typeof globalThis !== 'undefined' && globalThis) || + (typeof self !== 'undefined' && self) || + (typeof global !== 'undefined' && global); + var support = { - searchParams: 'URLSearchParams' in self, - iterable: 'Symbol' in self && 'iterator' in Symbol, + searchParams: 'URLSearchParams' in global, + iterable: 'Symbol' in global && 'iterator' in Symbol, blob: - 'FileReader' in self && - 'Blob' in self && + 'FileReader' in global && + 'Blob' in global && (function() { try { new Blob(); @@ -18,8 +23,8 @@ return false } })(), - formData: 'FormData' in self, - arrayBuffer: 'ArrayBuffer' in self + formData: 'FormData' in global, + arrayBuffer: 'ArrayBuffer' in global }; function isDataView(obj) { @@ -50,8 +55,8 @@ if (typeof name !== 'string') { name = String(name); } - if (/[^a-z0-9\-#$%&'*+.^_`|~]/i.test(name)) { - throw new TypeError('Invalid character in header field name') + if (/[^a-z0-9\-#$%&'*+.^_`|~!]/i.test(name) || name === '') { + throw new TypeError('Invalid character in header field name: "' + name + '"') } return name.toLowerCase() } @@ -215,6 +220,17 @@ this.bodyUsed = false; this._initBody = function(body) { + /* + fetch-mock wraps the Response object in an ES6 Proxy to + provide useful test harness features such as flush. However, on + ES5 browsers without fetch or Proxy support pollyfills must be used; + the proxy-pollyfill is unable to proxy an attribute unless it exists + on the object before the Proxy is created. This change ensures + Response.bodyUsed exists on the instance, while maintaining the + semantic of setting Request.bodyUsed in the constructor before + _initBody is called. + */ + this.bodyUsed = this.bodyUsed; this._bodyInit = body; if (!body) { this._bodyText = ''; @@ -267,7 +283,20 @@ this.arrayBuffer = function() { if (this._bodyArrayBuffer) { - return consumed(this) || Promise.resolve(this._bodyArrayBuffer) + var isConsumed = consumed(this); + if (isConsumed) { + return isConsumed + } + if (ArrayBuffer.isView(this._bodyArrayBuffer)) { + return Promise.resolve( + this._bodyArrayBuffer.buffer.slice( + this._bodyArrayBuffer.byteOffset, + this._bodyArrayBuffer.byteOffset + this._bodyArrayBuffer.byteLength + ) + ) + } else { + return Promise.resolve(this._bodyArrayBuffer) + } } else { return this.blob().then(readBlobAsArrayBuffer) } @@ -313,6 +342,10 @@ } function Request(input, options) { + if (!(this instanceof Request)) { + throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.') + } + options = options || {}; var body = options.body; @@ -349,6 +382,21 @@ throw new TypeError('Body not allowed for GET or HEAD requests') } this._initBody(body); + + if (this.method === 'GET' || this.method === 'HEAD') { + if (options.cache === 'no-store' || options.cache === 'no-cache') { + // Search for a '_' parameter in the query string + var reParamSearch = /([?&])_=[^&]*/; + if (reParamSearch.test(this.url)) { + // If it already exists then set the value with the current time + this.url = this.url.replace(reParamSearch, '$1_=' + new Date().getTime()); + } else { + // Otherwise add a new '_' parameter to the end with the current time + var reQueryString = /\?/; + this.url += (reQueryString.test(this.url) ? '&' : '?') + '_=' + new Date().getTime(); + } + } + } } Request.prototype.clone = function() { @@ -376,20 +424,31 @@ // Replace instances of \r\n and \n followed by at least one space or horizontal tab with a space // https://tools.ietf.org/html/rfc7230#section-3.2 var preProcessedHeaders = rawHeaders.replace(/\r?\n[\t ]+/g, ' '); - preProcessedHeaders.split(/\r?\n/).forEach(function(line) { - var parts = line.split(':'); - var key = parts.shift().trim(); - if (key) { - var value = parts.join(':').trim(); - headers.append(key, value); - } - }); + // Avoiding split via regex to work around a common IE11 bug with the core-js 3.6.0 regex polyfill + // https://github.com/github/fetch/issues/748 + // https://github.com/zloirock/core-js/issues/751 + preProcessedHeaders + .split('\r') + .map(function(header) { + return header.indexOf('\n') === 0 ? header.substr(1, header.length) : header + }) + .forEach(function(line) { + var parts = line.split(':'); + var key = parts.shift().trim(); + if (key) { + var value = parts.join(':').trim(); + headers.append(key, value); + } + }); return headers } Body.call(Request.prototype); function Response(bodyInit, options) { + if (!(this instanceof Response)) { + throw new TypeError('Please use the "new" operator, this DOM object constructor cannot be called as a function.') + } if (!options) { options = {}; } @@ -397,7 +456,7 @@ this.type = 'default'; this.status = options.status === undefined ? 200 : options.status; this.ok = this.status >= 200 && this.status < 300; - this.statusText = 'statusText' in options ? options.statusText : 'OK'; + this.statusText = options.statusText === undefined ? '' : '' + options.statusText; this.headers = new Headers(options.headers); this.url = options.url || ''; this._initBody(bodyInit); @@ -430,7 +489,7 @@ return new Response(null, {status: status, headers: {location: url}}) }; - exports.DOMException = self.DOMException; + exports.DOMException = global.DOMException; try { new exports.DOMException(); } catch (err) { @@ -466,22 +525,38 @@ }; options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); var body = 'response' in xhr ? xhr.response : xhr.responseText; - resolve(new Response(body, options)); + setTimeout(function() { + resolve(new Response(body, options)); + }, 0); }; xhr.onerror = function() { - reject(new TypeError('Network request failed')); + setTimeout(function() { + reject(new TypeError('Network request failed')); + }, 0); }; xhr.ontimeout = function() { - reject(new TypeError('Network request failed')); + setTimeout(function() { + reject(new TypeError('Network request failed')); + }, 0); }; xhr.onabort = function() { - reject(new exports.DOMException('Aborted', 'AbortError')); + setTimeout(function() { + reject(new exports.DOMException('Aborted', 'AbortError')); + }, 0); }; - xhr.open(request.method, request.url, true); + function fixUrl(url) { + try { + return url === '' && global.location.href ? global.location.href : url + } catch (e) { + return url + } + } + + xhr.open(request.method, fixUrl(request.url), true); if (request.credentials === 'include') { xhr.withCredentials = true; @@ -489,13 +564,27 @@ xhr.withCredentials = false; } - if ('responseType' in xhr && support.blob) { - xhr.responseType = 'blob'; + if ('responseType' in xhr) { + if (support.blob) { + xhr.responseType = 'blob'; + } else if ( + support.arrayBuffer && + request.headers.get('Content-Type') && + request.headers.get('Content-Type').indexOf('application/octet-stream') !== -1 + ) { + xhr.responseType = 'arraybuffer'; + } } - request.headers.forEach(function(value, name) { - xhr.setRequestHeader(name, value); - }); + if (init && typeof init.headers === 'object' && !(init.headers instanceof Headers)) { + Object.getOwnPropertyNames(init.headers).forEach(function(name) { + xhr.setRequestHeader(name, normalizeValue(init.headers[name])); + }); + } else { + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value); + }); + } if (request.signal) { request.signal.addEventListener('abort', abortXhr); @@ -514,11 +603,11 @@ fetch.polyfill = true; - if (!self.fetch) { - self.fetch = fetch; - self.Headers = Headers; - self.Request = Request; - self.Response = Response; + if (!global.fetch) { + global.fetch = fetch; + global.Headers = Headers; + global.Request = Request; + global.Response = Response; } exports.Headers = Headers;