Преглед на файлове

better handling of async scripts

Former-commit-id: 28807f422327b091f067b46c6042cb4a8277ef5d
Gildas преди 6 години
родител
ревизия
e67298f765
променени са 2 файла, в които са добавени 16 реда и са изтрити 3 реда
  1. 4 0
      lib/single-file/single-file-core.js
  2. 12 3
      lib/single-file/single-file-helper.js

+ 4 - 0
lib/single-file/single-file-core.js

@@ -1158,9 +1158,13 @@ this.singlefile.lib.core = this.singlefile.lib.core || (() => {
 					content.data = Util.getUpdatedResourceContent(resourceURL, content, this.options);
 					if (element.tagName == "SCRIPT") {
 						element.setAttribute("src", content.data);
+						if (element.getAttribute("async") == "" || element.getAttribute("async") == "async" || element.getAttribute(util.ASYNC_SCRIPT_ATTRIBUTE_NAME) == "") {
+							element.setAttribute("async", "");
+						}
 					} else {
 						const scriptElement = this.doc.createElement("script");
 						scriptElement.setAttribute("src", content.data);
+						scriptElement.setAttribute("async", "");
 						element.parentElement.replaceChild(scriptElement, element);
 					}
 				}

+ 12 - 3
lib/single-file/single-file-helper.js

@@ -43,6 +43,7 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
 	const STYLESHEET_ATTRIBUTE_NAME = "data-single-file-stylesheet";
 	const DISABLED_NOSCRIPT_ATTRIBUTE_NAME = "data-single-file-disabled-noscript";
 	const SELECTED_CONTENT_ATTRIBUTE_NAME = "data-single-file-selected-content";
+	const ASYNC_SCRIPT_ATTRIBUTE_NAME = "data-single-file-async-script";
 	const IGNORED_REMOVED_TAG_NAMES = ["NOSCRIPT", "DISABLED-NOSCRIPT", "META", "LINK", "STYLE", "TITLE", "TEMPLATE", "SOURCE", "OBJECT", "SCRIPT", "HEAD"];
 	const REGEXP_SIMPLE_QUOTES_STRING = /^'(.*?)'$/;
 	const REGEXP_DOUBLE_QUOTES_STRING = /^"(.*?)"$/;
@@ -79,7 +80,8 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
 		HTML_IMPORT_ATTRIBUTE_NAME,
 		LAZY_SRC_ATTRIBUTE_NAME,
 		STYLESHEET_ATTRIBUTE_NAME,
-		SELECTED_CONTENT_ATTRIBUTE_NAME
+		SELECTED_CONTENT_ATTRIBUTE_NAME,
+		ASYNC_SCRIPT_ATTRIBUTE_NAME
 	};
 
 	function initDoc(doc) {
@@ -90,7 +92,6 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
 	}
 
 	function preProcessDoc(doc, win, options) {
-		doc.querySelectorAll("script").forEach(element => element.textContent = element.textContent.replace(/<\/script>/gi, "<\\/script>"));
 		doc.querySelectorAll("noscript").forEach(element => {
 			element.setAttribute(DISABLED_NOSCRIPT_ATTRIBUTE_NAME, element.textContent);
 			element.textContent = "";
@@ -266,6 +267,13 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
 				}
 			});
 		}
+		if (element.tagName == "SCRIPT") {
+			if (element.async && element.getAttribute("async") != "" && element.getAttribute("async") != "async") {
+				element.setAttribute(ASYNC_SCRIPT_ATTRIBUTE_NAME, "");
+				data.markedElements.push(element);
+			}
+			element.textContent = element.textContent.replace(/<\/script>/gi, "<\\/script>");
+		}
 	}
 
 	function getUsedFont(computedStyle, options, usedFonts) {
@@ -320,7 +328,7 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
 			doc.head.querySelectorAll("*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)").forEach(element => element.removeAttribute("hidden"));
 		}
 		if (!markedElements) {
-			const singleFileAttributes = [REMOVED_CONTENT_ATTRIBUTE_NAME, HIDDEN_CONTENT_ATTRIBUTE_NAME, PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME, IMAGE_ATTRIBUTE_NAME, POSTER_ATTRIBUTE_NAME, CANVAS_ATTRIBUTE_NAME, INPUT_VALUE_ATTRIBUTE_NAME, SHADOW_ROOT_ATTRIBUTE_NAME, HTML_IMPORT_ATTRIBUTE_NAME, STYLESHEET_ATTRIBUTE_NAME];
+			const singleFileAttributes = [REMOVED_CONTENT_ATTRIBUTE_NAME, HIDDEN_CONTENT_ATTRIBUTE_NAME, PRESERVED_SPACE_ELEMENT_ATTRIBUTE_NAME, IMAGE_ATTRIBUTE_NAME, POSTER_ATTRIBUTE_NAME, CANVAS_ATTRIBUTE_NAME, INPUT_VALUE_ATTRIBUTE_NAME, SHADOW_ROOT_ATTRIBUTE_NAME, HTML_IMPORT_ATTRIBUTE_NAME, STYLESHEET_ATTRIBUTE_NAME, ASYNC_SCRIPT_ATTRIBUTE_NAME];
 			markedElements = doc.querySelectorAll(singleFileAttributes.map(name => "[" + name + "]").join(","));
 		}
 		markedElements.forEach(element => {
@@ -334,6 +342,7 @@ this.singlefile.lib.helper = this.singlefile.lib.helper || (() => {
 			element.removeAttribute(SHADOW_ROOT_ATTRIBUTE_NAME);
 			element.removeAttribute(HTML_IMPORT_ATTRIBUTE_NAME);
 			element.removeAttribute(STYLESHEET_ATTRIBUTE_NAME);
+			element.removeAttribute(ASYNC_SCRIPT_ATTRIBUTE_NAME);
 		});
 	}