|
|
@@ -36,9 +36,6 @@
|
|
|
|
|
|
this.SingleFileBrowser = this.SingleFileBrowser || (() => {
|
|
|
|
|
|
- const ONE_MB = 1024 * 1024;
|
|
|
- const DEBUG = false;
|
|
|
- const PREFIX_CONTENT_TYPE_TEXT = "text/";
|
|
|
const FONT_FACE_TEST_MAX_DELAY = 1000;
|
|
|
|
|
|
const modules = {
|
|
|
@@ -55,7 +52,12 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
|
|
|
imagesAltMinifier: this.imagesAltMinifier.getInstance(this.srcsetParser)
|
|
|
};
|
|
|
const domUtil = {
|
|
|
- getContent, parseDocContent, parseSVGContent, isValidFontUrl, getContentSize, digestText
|
|
|
+ getResourceContent,
|
|
|
+ parseDocContent,
|
|
|
+ parseSVGContent,
|
|
|
+ isValidFontUrl,
|
|
|
+ getContentSize,
|
|
|
+ digestText
|
|
|
};
|
|
|
let fetchResource;
|
|
|
return {
|
|
|
@@ -65,93 +67,37 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
- async function getContent(resourceURL, options) {
|
|
|
- let resourceContent, startTime;
|
|
|
- if (DEBUG) {
|
|
|
- startTime = Date.now();
|
|
|
- log(" // STARTED download url =", resourceURL, "asDataURI =", options.asDataURI);
|
|
|
- }
|
|
|
+ async function getResourceContent(resourceURL) {
|
|
|
if (!fetchResource) {
|
|
|
fetchResource = typeof superFetch == "undefined" ? fetch : superFetch.fetch;
|
|
|
}
|
|
|
- try {
|
|
|
- resourceContent = await fetchResource(resourceURL);
|
|
|
- if (resourceContent.url) {
|
|
|
- resourceURL = resourceContent.url;
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- return { data: options.asDataURI ? "data:base64," : "", resourceURL };
|
|
|
- }
|
|
|
- let contentType = resourceContent.headers && resourceContent.headers.get("content-type");
|
|
|
- let charset;
|
|
|
- if (contentType) {
|
|
|
- const matchContentType = contentType.toLowerCase().split(";");
|
|
|
- contentType = matchContentType[0].trim();
|
|
|
- if (!contentType.includes("/")) {
|
|
|
- contentType = null;
|
|
|
- }
|
|
|
- const charsetValue = matchContentType[1] && matchContentType[1].trim();
|
|
|
- if (charsetValue) {
|
|
|
- const matchCharset = charsetValue.match(/^charset=(.*)/);
|
|
|
- if (matchCharset && matchCharset[1]) {
|
|
|
- charset = docHelper.removeQuotes(matchCharset[1].trim());
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (!charset && options.charset) {
|
|
|
- charset = options.charset;
|
|
|
- }
|
|
|
- if (options.asDataURI) {
|
|
|
- try {
|
|
|
- if (DEBUG) {
|
|
|
- log(" // ENDED download url =", resourceURL, "delay =", Date.now() - startTime);
|
|
|
- }
|
|
|
- const buffer = await resourceContent.arrayBuffer();
|
|
|
- if (options.maxResourceSizeEnabled && buffer.byteLength > options.maxResourceSize * ONE_MB) {
|
|
|
- return { data: "data:base64,", resourceURL };
|
|
|
- } else {
|
|
|
- const reader = new FileReader();
|
|
|
- reader.readAsDataURL(new Blob([buffer], { type: contentType }));
|
|
|
- const dataURI = await new Promise((resolve, reject) => {
|
|
|
- reader.addEventListener("load", () => resolve(reader.result), false);
|
|
|
- reader.addEventListener("error", reject, false);
|
|
|
- });
|
|
|
- return { data: dataURI, resourceURL };
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- return { data: "data:base64,", resourceURL };
|
|
|
+ const resourceContent = await fetchResource(resourceURL);
|
|
|
+ const buffer = await resourceContent.arrayBuffer();
|
|
|
+ return {
|
|
|
+ getUrl() {
|
|
|
+ return resourceContent.url || resourceURL;
|
|
|
+ },
|
|
|
+ getContentType() {
|
|
|
+ return resourceContent.headers && resourceContent.headers.get("content-type");
|
|
|
+ },
|
|
|
+ getStatusCode() {
|
|
|
+ return resourceContent.status;
|
|
|
+ },
|
|
|
+ getSize() {
|
|
|
+ return buffer.byteLength;
|
|
|
+ },
|
|
|
+ getText(charset) {
|
|
|
+ return new TextDecoder(charset).decode(buffer);
|
|
|
+ },
|
|
|
+ async getDataUri(contentType) {
|
|
|
+ const reader = new FileReader();
|
|
|
+ reader.readAsDataURL(new Blob([buffer], { type: contentType || this.getContentType() }));
|
|
|
+ return await new Promise((resolve, reject) => {
|
|
|
+ reader.addEventListener("load", () => resolve(reader.result), false);
|
|
|
+ reader.addEventListener("error", reject, false);
|
|
|
+ });
|
|
|
}
|
|
|
- } else {
|
|
|
- if (resourceContent.status >= 400 || (options.validateTextContentType && contentType && !contentType.startsWith(PREFIX_CONTENT_TYPE_TEXT))) {
|
|
|
- return { data: "", resourceURL };
|
|
|
- }
|
|
|
- if (!charset) {
|
|
|
- charset = "utf-8";
|
|
|
- }
|
|
|
- let buffer;
|
|
|
- try {
|
|
|
- buffer = await resourceContent.arrayBuffer();
|
|
|
- } catch (error) {
|
|
|
- return { data: "", resourceURL, charset };
|
|
|
- }
|
|
|
- if (DEBUG) {
|
|
|
- log(" // ENDED download url =", resourceURL, "delay =", Date.now() - startTime);
|
|
|
- }
|
|
|
- if (options.maxResourceSizeEnabled && buffer.byteLength > options.maxResourceSize * ONE_MB) {
|
|
|
- return { data: "", resourceURL, charset };
|
|
|
- } else {
|
|
|
- try {
|
|
|
- return { data: new TextDecoder(charset).decode(buffer), resourceURL, charset };
|
|
|
- } catch (error) {
|
|
|
- try {
|
|
|
- charset = "utf-8";
|
|
|
- return { data: new TextDecoder(charset).decode(buffer), resourceURL, charset };
|
|
|
- } catch (error) {
|
|
|
- return { data: "", resourceURL, charset };
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ };
|
|
|
}
|
|
|
|
|
|
// https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
|
|
|
@@ -205,8 +151,4 @@ this.SingleFileBrowser = this.SingleFileBrowser || (() => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- function log(...args) {
|
|
|
- console.log("S-File <browser>", ...args); // eslint-disable-line no-console
|
|
|
- }
|
|
|
-
|
|
|
})();
|