Bladeren bron

added "loadDeferredImagesBlockCookies" (hidden) setting (see #232)

Former-commit-id: a0610a285244e31376459778a35501e5cfcb7fb5
Gildas 6 jaren geleden
bovenliggende
commit
f874b2c06e

+ 1 - 0
extension/core/bg/config.js

@@ -41,6 +41,7 @@ singlefile.extension.core.bg.config = (() => {
 		compressCSS: true,
 		loadDeferredImages: true,
 		loadDeferredImagesMaxIdleTime: 1500,
+		loadDeferredImagesBlockCookies: true,
 		filenameTemplate: "{page-title} ({date-iso} {time-locale}).html",
 		infobarTemplate: "",
 		confirmInfobarContent: false,

+ 30 - 21
lib/hooks/content/content-hooks-frames-web.js

@@ -27,6 +27,8 @@
 
 	const LOAD_DEFERRED_IMAGES_START_EVENT = "single-file-load-deferred-images-start";
 	const LOAD_DEFERRED_IMAGES_END_EVENT = "single-file-load-deferred-images-end";
+	const BLOCK_COOKIES_START_EVENT = "single-file-block-cookies-start";
+	const BLOCK_COOKIES_END_EVENT = "single-file-block-cookies-end";
 	const LOAD_IMAGE_EVENT = "single-file-load-image";
 	const IMAGE_LOADED_EVENT = "single-file-image-loaded";
 	const NEW_FONT_FACE_EVENT = "single-file-new-font-face";
@@ -55,11 +57,6 @@
 		document.documentElement.__defineGetter__("clientWidth", () => scrollWidth);
 		screen.__defineGetter__("height", () => scrollHeight);
 		screen.__defineGetter__("width", () => scrollWidth);
-		try {
-			document.__defineGetter__("cookie", () => { throw new Error("document.cookie temporary blocked by SingleFile"); });
-		} catch (error) {
-			// ignored
-		}
 		if (!window._singleFile_getBoundingClientRect) {
 			window._singleFile_getBoundingClientRect = Element.prototype.getBoundingClientRect;
 			Element.prototype.getBoundingClientRect = function () {
@@ -77,14 +74,6 @@
 			window.__defineGetter__("innerHeight", () => scrollHeight);
 			window.__defineGetter__("innerWidth", () => scrollWidth);
 		}
-		if (!window._singleFile_localStorage) {
-			window._singleFile_localStorage = window.localStorage;
-			window.__defineGetter__("localStorage", () => { throw new Error("localStorage temporary blocked by SingleFile"); });
-		}
-		if (!window._singleFile_indexedDB) {
-			window._singleFile_indexedDB = window.indexedDB;
-			window.__defineGetter__("indexedDB", () => { throw new Error("indexedDB temporary blocked by SingleFile"); });
-		}
 		if (!window._singleFileImage) {
 			const Image = window.Image;
 			window._singleFileImage = window.Image;
@@ -133,12 +122,12 @@
 		dispatchEvent(new UIEvent("scroll"));
 	});
 
+
 	addEventListener(LOAD_DEFERRED_IMAGES_END_EVENT, () => {
 		delete document.documentElement.clientHeight;
 		delete document.documentElement.clientWidth;
 		delete screen.height;
 		delete screen.width;
-		delete document.cookie;
 		if (window._singleFile_getBoundingClientRect) {
 			Element.prototype.getBoundingClientRect = window._singleFile_getBoundingClientRect;
 			window.innerHeight = window._singleFile_innerHeight;
@@ -147,6 +136,33 @@
 			delete window._singleFile_innerHeight;
 			delete window._singleFile_innerWidth;
 		}
+		if (window._singleFileImage) {
+			delete window.Image;
+			window.Image = window._singleFileImage;
+			delete window._singleFileImage;
+		}
+		dispatchEvent(new UIEvent("resize"));
+		dispatchEvent(new UIEvent("scroll"));
+	});
+
+	addEventListener(BLOCK_COOKIES_START_EVENT, () => {
+		try {
+			document.__defineGetter__("cookie", () => { throw new Error("document.cookie temporary blocked by SingleFile"); });
+		} catch (error) {
+			// ignored
+		}
+		if (!window._singleFile_localStorage) {
+			window._singleFile_localStorage = window.localStorage;
+			window.__defineGetter__("localStorage", () => { throw new Error("localStorage temporary blocked by SingleFile"); });
+		}
+		if (!window._singleFile_indexedDB) {
+			window._singleFile_indexedDB = window.indexedDB;
+			window.__defineGetter__("indexedDB", () => { throw new Error("indexedDB temporary blocked by SingleFile"); });
+		}
+	});
+
+	addEventListener(BLOCK_COOKIES_END_EVENT, () => {
+		delete document.cookie;
 		if (window._singleFile_localStorage) {
 			delete window.localStorage;
 			window.localStorage = window._singleFile_localStorage;
@@ -157,13 +173,6 @@
 			window.indexedDB = window._singleFile_indexedDB;
 			delete window._singleFile_indexedDB;
 		}
-		if (window._singleFileImage) {
-			delete window.Image;
-			window.Image = window._singleFileImage;
-			delete window._singleFileImage;
-		}
-		dispatchEvent(new UIEvent("resize"));
-		dispatchEvent(new UIEvent("scroll"));
 	});
 
 	addEventListener(LOAD_DEFERRED_IMAGES_START_EVENT, () => {

+ 16 - 2
lib/hooks/content/content-hooks-frames.js

@@ -27,6 +27,8 @@ this.singlefile.lib.hooks.content.frames = this.singlefile.lib.hooks.content.fra
 
 	const LOAD_DEFERRED_IMAGES_START_EVENT = "single-file-load-deferred-images-start";
 	const LOAD_DEFERRED_IMAGES_END_EVENT = "single-file-load-deferred-images-end";
+	const BLOCK_COOKIES_START_EVENT = "single-file-block-cookies-start";
+	const BLOCK_COOKIES_END_EVENT = "single-file-block-cookies-end";
 	const LOAD_IMAGE_EVENT = "single-file-load-image";
 	const IMAGE_LOADED_EVENT = "single-file-image-loaded";
 	const NEW_FONT_FACE_EVENT = "single-file-new-font-face";
@@ -47,8 +49,20 @@ this.singlefile.lib.hooks.content.frames = this.singlefile.lib.hooks.content.fra
 
 	return {
 		getFontsData: () => fontFaces,
-		loadDeferredImagesStart: () => dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_START_EVENT)),
-		loadDeferredImagesEnd: () => dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_END_EVENT)),
+		loadDeferredImagesStart: options => {
+			options.loadDeferredImagesBlockCookies = false;
+			if (options.loadDeferredImagesBlockCookies) {
+				dispatchEvent(new CustomEvent(BLOCK_COOKIES_START_EVENT));
+			}
+			dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_START_EVENT));
+		},
+		loadDeferredImagesEnd: options => {
+			options.loadDeferredImagesBlockCookies = false;
+			if (options.loadDeferredImagesBlockCookies) {
+				dispatchEvent(new CustomEvent(BLOCK_COOKIES_END_EVENT));
+			}
+			dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_END_EVENT));
+		},
 		LOAD_IMAGE_EVENT,
 		IMAGE_LOADED_EVENT
 	};

+ 6 - 6
lib/lazy/content/content-lazy-loader.js

@@ -70,7 +70,7 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 			idleTimeoutId = await setAsyncTimeout(() => {
 				if (!loadingImages) {
 					clearAsyncTimeout(timeoutId);
-					lazyLoadEnd(idleTimeoutId, observer, cleanupAndResolve);
+					lazyLoadEnd(idleTimeoutId, observer, options, cleanupAndResolve);
 				}
 			}, options.loadDeferredImagesMaxIdleTime * 1.2);
 			maxTimeoutId = await deferForceLazyLoadEnd(timeoutId, idleTimeoutId, maxTimeoutId, observer, options, cleanupAndResolve);
@@ -78,7 +78,7 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 			addEventListener(frames.LOAD_IMAGE_EVENT, onImageLoadEvent);
 			addEventListener(frames.IMAGE_LOADED_EVENT, onImageLoadedEvent);
 			if (frames) {
-				frames.loadDeferredImagesStart();
+				frames.loadDeferredImagesStart(options);
 			}
 
 			async function onImageLoadEvent(event) {
@@ -108,21 +108,21 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 
 	async function deferLazyLoadEnd(timeoutId, idleTimeoutId, observer, options, resolve) {
 		await clearAsyncTimeout(timeoutId);
-		return setAsyncTimeout(async () => await lazyLoadEnd(idleTimeoutId, observer, resolve), options.loadDeferredImagesMaxIdleTime);
+		return setAsyncTimeout(async () => await lazyLoadEnd(idleTimeoutId, observer, options, resolve), options.loadDeferredImagesMaxIdleTime);
 	}
 
 	async function deferForceLazyLoadEnd(timeoutId, idleTimeoutId, maxTimeoutId, observer, options, resolve) {
 		clearAsyncTimeout(maxTimeoutId);
 		return setAsyncTimeout(() => {
 			clearAsyncTimeout(timeoutId);
-			lazyLoadEnd(idleTimeoutId, observer, resolve);
+			lazyLoadEnd(idleTimeoutId, observer, options, resolve);
 		}, options.loadDeferredImagesMaxIdleTime * 10);
 	}
 
-	function lazyLoadEnd(idleTimeoutId, observer, resolve) {
+	function lazyLoadEnd(idleTimeoutId, observer, options, resolve) {
 		clearAsyncTimeout(idleTimeoutId);
 		if (singlefile.lib.hooks.content.frames) {
-			singlefile.lib.hooks.content.frames.loadDeferredImagesEnd();
+			singlefile.lib.hooks.content.frames.loadDeferredImagesEnd(options);
 		}
 		setAsyncTimeout(resolve, 100);
 		observer.disconnect();