فهرست منبع

block page refresh while loading deferred contents

Gildas 7 سال پیش
والد
کامیت
242584b24c

+ 2 - 1
cli/back-ends/puppeteer.js

@@ -21,7 +21,7 @@
  *   Source.
  */
 
-/* global require, exports, SingleFileBrowser, frameTree, lazyLoader, document, window */
+/* global require, exports, SingleFileBrowser, frameTree, lazyLoader, docHelper, document, window */
 
 const fs = require("fs");
 
@@ -91,6 +91,7 @@ exports.getPageData = async options => {
 			waitUntil: options.browserWaitUntil || "networkidle0"
 		});
 		return await page.evaluate(async options => {
+			docHelper.initDoc(document);
 			options.insertSingleFileComment = true;
 			const preInitializationPromises = [];
 			if (!options.saveRawPage) {

+ 2 - 0
cli/back-ends/webdriver-chromium.js

@@ -157,6 +157,8 @@ function getPageDataScript() {
 		.catch(error => callback({ error: error.toString() }));
 
 	async function getPageData() {
+		docHelper.initDoc(document);
+		options.insertSingleFileComment = true;
 		options.insertSingleFileComment = true;
 		const preInitializationPromises = [];
 		if (!options.saveRawPage) {

+ 2 - 0
cli/back-ends/webdriver-gecko.js

@@ -164,6 +164,8 @@ function getPageDataScript() {
 		.catch(error => callback({ error: error.toString() }));
 
 	async function getPageData() {
+		docHelper.initDoc(document);
+		options.insertSingleFileComment = true;
 		options.insertSingleFileComment = true;
 		const preInitializationPromises = [];
 		if (!options.saveRawPage) {

+ 2 - 1
extension/core/content/content.js

@@ -18,7 +18,7 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global browser, SingleFileBrowser, singlefile, frameTree, document, Blob, MouseEvent, addEventListener, window, lazyLoader, URL, setTimeout */
+/* global browser, SingleFileBrowser, singlefile, frameTree, document, Blob, MouseEvent, addEventListener, window, lazyLoader, URL, setTimeout, docHelper */
 
 this.singlefile.top = this.singlefile.top || (() => {
 
@@ -68,6 +68,7 @@ this.singlefile.top = this.singlefile.top || (() => {
 	}
 
 	async function processPage(options) {
+		docHelper.initDoc(document);
 		singlefile.ui.onStartPage();
 		const processor = new SingleFile(options);
 		const preInitializationPromises = [];

+ 1 - 1
lib/single-file/single-file-core.js

@@ -631,7 +631,7 @@ this.SingleFileCore = this.SingleFileCore || (() => {
 
 		removeDiscardedResources() {
 			this.doc.querySelectorAll("singlefile-infobar, singlefile-mask, singlefile-logs-window").forEach(element => element.remove());
-			const objectElements = this.doc.querySelectorAll("applet, meta[http-equiv=refresh], object[data]:not([type=\"image/svg+xml\"]):not([type=\"image/svg-xml\"]):not([type=\"text/html\"]), embed[src]:not([src*=\".svg\"]):not([src*=\".pdf\"])");
+			const objectElements = this.doc.querySelectorAll("applet, meta[http-equiv=refresh], meta[disabled-http-equiv], object[data]:not([type=\"image/svg+xml\"]):not([type=\"image/svg-xml\"]):not([type=\"text/html\"]), embed[src]:not([src*=\".svg\"]):not([src*=\".pdf\"])");
 			this.stats.set("discarded", "objects", objectElements.length);
 			this.stats.set("processed", "objects", objectElements.length);
 			objectElements.forEach(element => element.remove());

+ 13 - 0
lib/single-file/util/doc-helper.js

@@ -38,6 +38,7 @@ this.docHelper = this.docHelper || (() => {
 	};
 
 	return {
+		initDoc,
 		preProcessDoc,
 		postProcessDoc,
 		serialize,
@@ -50,6 +51,13 @@ this.docHelper = this.docHelper || (() => {
 		SHADOW_ROOT_ATTRIBUTE_NAME
 	};
 
+	function initDoc(doc) {
+		doc.querySelectorAll("meta[http-equiv=refresh]").forEach(element => {
+			element.removeAttribute("http-equiv");
+			element.setAttribute("disabled-http-equiv", "refresh");
+		});
+	}
+
 	function preProcessDoc(doc, win, options) {
 		doc.querySelectorAll("script").forEach(element => element.textContent = element.textContent.replace(/<\/script>/gi, "<\\/script>"));
 		doc.querySelectorAll("noscript").forEach(element => {
@@ -58,6 +66,7 @@ this.docHelper = this.docHelper || (() => {
 			disabledNoscriptElement.hidden = true;
 			element.parentElement.replaceChild(disabledNoscriptElement, element);
 		});
+		initDoc(doc);
 		if (doc.head) {
 			doc.head.querySelectorAll("*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)").forEach(element => element.hidden = true);
 		}
@@ -211,6 +220,10 @@ this.docHelper = this.docHelper || (() => {
 			Array.from(element.childNodes).forEach(node => noscriptElement.appendChild(node));
 			element.parentElement.replaceChild(noscriptElement, element);
 		});
+		doc.querySelectorAll("meta[disabled-http-equiv]").forEach(element => {
+			element.setAttribute("http-equiv", element.getAttribute("disabled-http-equiv"));
+			element.removeAttribute("disabled-http-equiv");
+		});
 		if (doc.head) {
 			doc.head.querySelectorAll("*:not(base):not(link):not(meta):not(noscript):not(script):not(style):not(template):not(title)").forEach(element => element.removeAttribute("hidden"));
 		}

+ 2 - 0
maff2html/back-ends/webdriver-gecko.js

@@ -144,6 +144,8 @@ function getPageDataScript() {
 		.catch(error => callback({ error: error.toString() }));
 
 	async function getPageData() {
+		docHelper.initDoc(document);
+		options.insertSingleFileComment = true;
 		options.insertSingleFileComment = true;
 		const preInitializationPromises = [];
 		if (!options.saveRawPage) {