Quellcode durchsuchen

rollback to window#fetch ...

Gildas vor 7 Jahren
Ursprung
Commit
818ef0c7dc
1 geänderte Dateien mit 28 neuen und 45 gelöschten Zeilen
  1. 28 45
      lib/fetch/content/fetch.js

+ 28 - 45
lib/fetch/content/fetch.js

@@ -18,58 +18,41 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global browser, XMLHttpRequest */
+/* global browser, fetch */
 
 this.superFetch = this.superFetch || (() => {
 
 	const superFetch = {
 		fetch: async url => {
-			const xhrPromise = new Promise((resolve, reject) => {
-				const xhrRequest = new XMLHttpRequest();
-				let receivedResponse, receivedError, resolveResponse = response => receivedResponse = response, rejectResponse = error => receivedError = error;
-				xhrRequest.withCredentials = true;
-				xhrRequest.responseType = "arraybuffer";
-				xhrRequest.onerror = event => reject(new Error(event.details));
-				xhrRequest.onreadystatechange = () => {
-					if (xhrRequest.readyState == XMLHttpRequest.HEADERS_RECEIVED) {
-						const headers = new Map();
-						headers.set("content-type", xhrRequest.getResponseHeader("Content-Type"));
-						resolve({
-							headers, status: xhrRequest.status, arrayBuffer: () => new Promise((resolve, reject) => {
-								if (receivedError) {
-									reject(receivedError);
-								} else if (receivedResponse) {
-									resolve(receivedResponse);
-								} else {
-									[resolveResponse, rejectResponse] = [resolve, reject];
-								}
-							})
-						});
-					}
-					if (xhrRequest.readyState == XMLHttpRequest.DONE) {
-						resolveResponse(xhrRequest.response);
-					}
-				};
-				xhrRequest.onerror = error => {
-					reject(error);
-					if (rejectResponse) {
-						rejectResponse(error);
+			try {
+				let response = await fetch(url, { cache: "force-cache" });
+				if (response.status >= 400) {
+					response = await fetch(url, { credentials: "same-origin", cache: "force-cache" });
+				}
+				if (response.status >= 400) {
+					response = await fetch(url, { credentials: "include", cache: "force-cache" });
+				}
+				if (response.status >= 400) {
+					response = await fetch(url, { mode: "cors", credentials: "omit", cache: "force-cache" });
+				}
+				if (response.status >= 400) {
+					response = await fetch(url, { mode: "cors", credentials: "same-origin", cache: "force-cache" });
+				}
+				if (response.status >= 400) {
+					response = await fetch(url, { mode: "cors", credentials: "include", cache: "force-cache" });
+				}
+				return response;
+			}
+			catch (error) {
+				const responseFetch = await sendMessage({ method: "fetch", url });
+				return {
+					headers: { get: headerName => responseFetch.headers[headerName] },
+					arrayBuffer: async () => {
+						const response = await sendMessage({ method: "fetch.array", requestId: responseFetch.responseId });
+						return new Uint8Array(response.array).buffer;
 					}
 				};
-				xhrRequest.open("GET", url, true);
-				xhrRequest.send();
-			});
-			return xhrPromise
-				.catch(async () => {
-					const responseFetch = await sendMessage({ method: "fetch", url });
-					return {
-						headers: { get: headerName => responseFetch.headers[headerName] },
-						arrayBuffer: async () => {
-							const response = await sendMessage({ method: "fetch.array", requestId: responseFetch.responseId });
-							return new Uint8Array(response.array).buffer;
-						}
-					};
-				});
+			}
 		}
 	};
 	return superFetch;