Quellcode durchsuchen

fixed issue #254

Former-commit-id: 670c5a2a78e225b07cea8b97ca8a81b5934bb478
Gildas vor 6 Jahren
Ursprung
Commit
b40693b088

+ 4 - 2
extension/ui/content/content-ui-infobar.js

@@ -21,7 +21,7 @@
  *   Source.
  */
 
-/* global browser, document, Node, window, top, getComputedStyle, location, setTimeout */
+/* global document, Node, window, top, getComputedStyle, location, setTimeout */
 
 this.singlefile.extension.ui.content.infobar = this.singlefile.extension.ui.content.infobar || (() => {
 
@@ -30,6 +30,8 @@ this.singlefile.extension.ui.content.infobar = this.singlefile.extension.ui.cont
 	const IMAGE_ICON = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAABIUlEQVQ4y+2TsarCMBSGvxTBRdqiUZAWOrhJB9EXcPKFfCvfQYfulUKHDqXg4CYUJSioYO4mSDX3ttzt3n87fMlHTpIjlsulxpDZbEYYhgghSNOUOI5Ny2mZYBAELBYLer0eAJ7ncTweKYri4x7LJJRS0u12n7XrukgpjSc0CpVSXK/XZ32/31FKNW85z3PW6zXT6RSAJEnIsqy5UGvNZrNhu90CcDqd+C6tT6J+v//2Th+PB2VZ1hN2Oh3G4zGTyQTbtl/YbrdjtVpxu91+Ljyfz0RRhG3bzOfzF+Y4TvNXvlwuaK2pE4tfzr/wzwsty0IIURlL0998KxRCMBqN8H2/wlzXJQxD2u12vVkeDoeUZUkURRU+GAw4HA7s9/sK+wK6CWHasQ/S/wAAAABJRU5ErkJggg==";
 	const SINGLEFILE_COMMENT = "SingleFile";
 
+	const browser = this.browser;
+
 	if (window == top && location && location.href && location.href.startsWith("file:///")) {
 		if (document.readyState == "loading") {
 			document.addEventListener("DOMContentLoaded", displayIcon, false);
@@ -48,7 +50,7 @@ this.singlefile.extension.ui.content.infobar = this.singlefile.extension.ui.cont
 			const info = singleFileComment.textContent.split("\n");
 			const [, , url, saveDate, ...infoData] = info;
 			let options;
-			if (window.browser) {
+			if (browser && browser.runtime && browser.runtime.sendMessage) {
 				options = await browser.runtime.sendMessage({ method: "tabs.getOptions", url });
 			} else {
 				options = { displayInfobar: true };

+ 4 - 4
lib/fetch/content/content-fetch-resources.js

@@ -28,11 +28,11 @@ this.singlefile.lib.fetch.content.resources = this.singlefile.lib.fetch.content.
 	const FETCH_REQUEST_EVENT = "single-file-request-fetch";
 	const FETCH_RESPONSE_EVENT = "single-file-response-fetch";
 
+	const browser = this.browser;
 	const addEventListener = window.addEventListener;
 	const fetch = window.fetch;
 	const CustomEvent = window.CustomEvent;
 	const dispatchEvent = window.dispatchEvent;
-	const browser = window.browser;
 	const removeEventListener = window.removeEventListener;
 
 	return {
@@ -69,13 +69,13 @@ this.singlefile.lib.fetch.content.resources = this.singlefile.lib.fetch.content.
 
 	function hostFetch(url) {
 		return new Promise((resolve, reject) => {
-			dispatchEvent(new CustomEvent(FETCH_REQUEST_EVENT, { detail: url }));
-			addEventListener(FETCH_RESPONSE_EVENT, onResponseFetch, false);
+			dispatchEvent.call(window, new CustomEvent(FETCH_REQUEST_EVENT, { detail: url }));
+			addEventListener.call(window, FETCH_RESPONSE_EVENT, onResponseFetch, false);
 
 			function onResponseFetch(event) {
 				if (event.detail) {
 					if (event.detail.url == url) {
-						removeEventListener(FETCH_RESPONSE_EVENT, onResponseFetch, false);
+						removeEventListener.call(window, FETCH_RESPONSE_EVENT, onResponseFetch, false);
 						if (event.detail.response) {
 							resolve({
 								status: event.detail.status,

+ 4 - 4
lib/frame-tree/content/content-frame-tree.js

@@ -39,11 +39,11 @@ this.singlefile.lib.frameTree.content.frames = this.singlefile.lib.frameTree.con
 	const WINDOW_ID_SEPARATOR = ".";
 	const TOP_WINDOW = window == window.top;
 
+	const browser = this.browser;
 	const addEventListener = window.addEventListener;
 	const top = window.top;
 	const MessageChannel = window.MessageChannel;
-	const document = window.document;
-	const browser = window.browser;
+	const document = window.document;	
 	const setTimeout = window.setTimeout;
 
 	const sessions = new Map();
@@ -60,7 +60,7 @@ this.singlefile.lib.frameTree.content.frames = this.singlefile.lib.frameTree.con
 			});
 		}
 	}
-	addEventListener("message", event => {
+	addEventListener.call(window, "message", event => {
 		if (typeof event.data == "string" && event.data.startsWith(MESSAGE_PREFIX)) {
 			event.preventDefault();
 			event.stopPropagation();
@@ -182,7 +182,7 @@ this.singlefile.lib.frameTree.content.frames = this.singlefile.lib.frameTree.con
 			} catch (error) {
 				// ignored
 			}
-			setTimeout(() => sendInitResponse({ frames: [{ windowId, processed: true }], sessionId }), TIMEOUT_INIT_REQUEST_MESSAGE);
+			setTimeout.call(window, () => sendInitResponse({ frames: [{ windowId, processed: true }], sessionId }), TIMEOUT_INIT_REQUEST_MESSAGE);
 		});
 		sendInitResponse({ frames, sessionId, requestedFrameId: doc.documentElement.dataset.requestedFrameId && parentWindowId });
 		delete doc.documentElement.dataset.requestedFrameId;

+ 17 - 17
lib/hooks/content/content-hooks-frames-web.js

@@ -60,7 +60,7 @@
 	const observedElements = new Map();
 	let loadDeferredImages;
 
-	addEventListener(LOAD_DEFERRED_IMAGES_START_EVENT, () => {
+	addEventListener.call(window, LOAD_DEFERRED_IMAGES_START_EVENT, () => {
 		loadDeferredImages = true;
 		const scrollingElement = document.scrollingElement || document.documentElement;
 		const clientHeight = scrollingElement.clientHeight;
@@ -97,20 +97,20 @@
 					const result = new Image(...arguments);
 					result.__defineSetter__("src", function (value) {
 						image.src = value;
-						dispatchEvent(new CustomEvent(LOAD_IMAGE_EVENT, { detail: image.src }));
+						dispatchEvent.call(window, new CustomEvent(LOAD_IMAGE_EVENT, { detail: image.src }));
 					});
 					result.__defineGetter__("src", function () {
 						return image.src;
 					});
 					result.__defineSetter__("srcset", function (value) {
-						dispatchEvent(new CustomEvent(LOAD_IMAGE_EVENT));
+						dispatchEvent.call(window, new CustomEvent(LOAD_IMAGE_EVENT));
 						image.srcset = value;
 					});
 					result.__defineGetter__("srcset", function () {
 						return image.srcset;
 					});
 					image.onload = image.onloadend = image.onerror = event => {
-						dispatchEvent(new CustomEvent(IMAGE_LOADED_EVENT, { detail: image.src }));
+						dispatchEvent.call(window, new CustomEvent(IMAGE_LOADED_EVENT, { detail: image.src }));
 						result.dispatchEvent(new UIEvent(event.type, event));
 					};
 					if (image.decode) {
@@ -130,13 +130,13 @@
 			const transformOriginPriority = document.documentElement.style.getPropertyPriority("transform-origin");
 			document.documentElement.style.setProperty("transform-origin", (zoomFactorX < 1 ? "50%" : "0") + " " + (zoomFactorY < 1 ? "50%" : "0") + " 0", "important");
 			document.documentElement.style.setProperty("transform", "scale3d(" + zoomFactor + ", " + zoomFactor + ", 1)", "important");
-			dispatchEvent(new UIEvent("resize"));
-			dispatchEvent(new UIEvent("scroll"));
+			dispatchEvent.call(window, new UIEvent("resize"));
+			dispatchEvent.call(window, new UIEvent("scroll"));
 			document.documentElement.style.setProperty("transform", transform, transformPriority);
 			document.documentElement.style.setProperty("transform-origin", transformOrigin, transformOriginPriority);
 		}
-		dispatchEvent(new UIEvent("resize"));
-		dispatchEvent(new UIEvent("scroll"));
+		dispatchEvent.call(window, new UIEvent("resize"));
+		dispatchEvent.call(window, new UIEvent("scroll"));
 		const docBoundingRect = scrollingElement.getBoundingClientRect();
 		Array.from(observers, ([intersectionObserver, observer]) => {
 			const rootBoundingRect = observer.options && observer.options.root && observer.options.root.getBoundingClientRect();
@@ -161,7 +161,7 @@
 	});
 
 
-	addEventListener(LOAD_DEFERRED_IMAGES_END_EVENT, () => {
+	addEventListener.call(window, LOAD_DEFERRED_IMAGES_END_EVENT, () => {
 		const scrollingElement = document.scrollingElement || document.documentElement;
 		delete scrollingElement.clientHeight;
 		delete scrollingElement.clientWidth;
@@ -181,11 +181,11 @@
 			delete window._singleFileImage;
 		}
 		loadDeferredImages = false;
-		dispatchEvent(new UIEvent("resize"));
-		dispatchEvent(new UIEvent("scroll"));
+		dispatchEvent.call(window, new UIEvent("resize"));
+		dispatchEvent.call(window, new UIEvent("scroll"));
 	});
 
-	addEventListener(BLOCK_COOKIES_START_EVENT, () => {
+	addEventListener.call(window, BLOCK_COOKIES_START_EVENT, () => {
 		try {
 			document.__defineGetter__("cookie", () => { throw new Error("document.cookie temporary blocked by SingleFile"); });
 		} catch (error) {
@@ -193,11 +193,11 @@
 		}
 	});
 
-	addEventListener(BLOCK_COOKIES_END_EVENT, () => {
+	addEventListener.call(window, BLOCK_COOKIES_END_EVENT, () => {
 		delete document.cookie;
 	});
 
-	addEventListener(BLOCK_STORAGE_START_EVENT, () => {
+	addEventListener.call(window, BLOCK_STORAGE_START_EVENT, () => {
 		if (!window._singleFile_localStorage) {
 			window._singleFile_localStorage = window.localStorage;
 			window.__defineGetter__("localStorage", () => { throw new Error("localStorage temporary blocked by SingleFile"); });
@@ -208,7 +208,7 @@
 		}
 	});
 
-	addEventListener(BLOCK_STORAGE_END_EVENT, () => {
+	addEventListener.call(window, BLOCK_STORAGE_END_EVENT, () => {
 		if (window._singleFile_localStorage) {
 			delete window.localStorage;
 			window.localStorage = window._singleFile_localStorage;
@@ -289,10 +289,10 @@
 				reader.readAsDataURL(new Blob([detail.src]));
 				reader.addEventListener("load", () => {
 					detail.src = "url(" + reader.result + ")";
-					dispatchEvent(new CustomEvent(NEW_FONT_FACE_EVENT, { detail }));
+					dispatchEvent.call(window, new CustomEvent(NEW_FONT_FACE_EVENT, { detail }));
 				});
 			} else {
-				dispatchEvent(new CustomEvent(NEW_FONT_FACE_EVENT, { detail }));
+				dispatchEvent.call(window, new CustomEvent(NEW_FONT_FACE_EVENT, { detail }));
 			}
 			return new FontFace(...arguments);
 		};

+ 8 - 8
lib/hooks/content/content-hooks-frames.js

@@ -35,7 +35,7 @@ this.singlefile.lib.hooks.content.frames = this.singlefile.lib.hooks.content.fra
 	const IMAGE_LOADED_EVENT = "single-file-image-loaded";
 	const NEW_FONT_FACE_EVENT = "single-file-new-font-face";
 
-	const browser = window.browser;
+	const browser = this.browser;
 	const addEventListener = window.addEventListener;
 	const dispatchEvent = window.dispatchEvent;
 	const CustomEvent = window.CustomEvent;
@@ -54,28 +54,28 @@ this.singlefile.lib.hooks.content.frames = this.singlefile.lib.hooks.content.fra
 		}
 		(document.documentElement || document).appendChild(scriptElement);
 		scriptElement.remove();
-		addEventListener(NEW_FONT_FACE_EVENT, event => fontFaces.push(event.detail));
+		addEventListener.call(window, NEW_FONT_FACE_EVENT, event => fontFaces.push(event.detail));
 	}
 
 	return {
 		getFontsData: () => fontFaces,
 		loadDeferredImagesStart: options => {
 			if (options.loadDeferredImagesBlockCookies) {
-				dispatchEvent(new CustomEvent(BLOCK_COOKIES_START_EVENT));
+				dispatchEvent.call(window, new CustomEvent(BLOCK_COOKIES_START_EVENT));
 			}
 			if (options.loadDeferredImagesBlockStorage) {
-				dispatchEvent(new CustomEvent(BLOCK_STORAGE_START_EVENT));
+				dispatchEvent.call(window, new CustomEvent(BLOCK_STORAGE_START_EVENT));
 			}
-			dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_START_EVENT));
+			dispatchEvent.call(window, new CustomEvent(LOAD_DEFERRED_IMAGES_START_EVENT));
 		},
 		loadDeferredImagesEnd: options => {
 			if (options.loadDeferredImagesBlockCookies) {
-				dispatchEvent(new CustomEvent(BLOCK_COOKIES_END_EVENT));
+				dispatchEvent.call(window, new CustomEvent(BLOCK_COOKIES_END_EVENT));
 			}
 			if (options.loadDeferredImagesBlockStorage) {
-				dispatchEvent(new CustomEvent(BLOCK_STORAGE_END_EVENT));
+				dispatchEvent.call(window, new CustomEvent(BLOCK_STORAGE_END_EVENT));
 			}
-			dispatchEvent(new CustomEvent(LOAD_DEFERRED_IMAGES_END_EVENT));
+			dispatchEvent.call(window, new CustomEvent(LOAD_DEFERRED_IMAGES_END_EVENT));
 		},
 		LOAD_IMAGE_EVENT,
 		IMAGE_LOADED_EVENT

+ 3 - 3
lib/hooks/content/content-hooks-web.js

@@ -42,7 +42,7 @@
 			console.warn("SingleFile is hooking the history.pushState API to detect navigation."); // eslint-disable-line no-console		
 		}
 		try {
-			dispatchEvent(new CustomEvent("single-file-push-state", { detail: { state, title, url } }));
+			dispatchEvent.call(window, new CustomEvent("single-file-push-state", { detail: { state, title, url } }));
 		} catch (error) {
 			// ignored
 		}
@@ -50,7 +50,7 @@
 	};
 	history.pushState.toString = function () { return "function pushState() { [native code] }"; };
 
-	addEventListener(FETCH_REQUEST_EVENT, async event => {
+	addEventListener.call(window, FETCH_REQUEST_EVENT, async event => {
 		const url = event.detail;
 		let detail;
 		try {
@@ -59,7 +59,7 @@
 		} catch (error) {
 			detail = { url, error: error.toString() };
 		}
-		dispatchEvent(new CustomEvent(FETCH_RESPONSE_EVENT, { detail }));
+		dispatchEvent.call(window, new CustomEvent(FETCH_RESPONSE_EVENT, { detail }));
 	});
 
 })();

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

@@ -25,8 +25,8 @@
 
 this.singlefile.lib.hooks.content.main = this.singlefile.lib.hooks.content.main || (() => {
 
-	const document = window.document;
-	const browser = window.browser;
+	const browser = this.browser;
+	const document = window.document;	
 	const HTMLDocument = window.HTMLDocument;
 
 	if (document instanceof HTMLDocument) {

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

@@ -25,8 +25,11 @@
 
 this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loader || (() => {
 
+	const ATTRIBUTES_MUTATION_TYPE = "attributes";
+	const SINGLE_FILE_UI_ELEMENT_CLASS = "single-file-ui-element";
+
 	const singlefile = this.singlefile;
-	const browser = window.browser;
+	const browser = this.browser;
 	const document = window.document;
 	const MutationObserver = window.MutationObserver;
 	const setTimeout = window.setTimeout;
@@ -34,9 +37,6 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 	const addEventListener = window.addEventListener;
 	const removeEventListener = window.removeEventListener;
 
-	const ATTRIBUTES_MUTATION_TYPE = "attributes";
-	const SINGLE_FILE_UI_ELEMENT_CLASS = "single-file-ui-element";
-
 	return {
 		process: options => {
 			const maxScrollY = Math.max(document.documentElement.scrollHeight - (document.documentElement.clientHeight * 1.5), 0);
@@ -82,8 +82,8 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 			}, options.loadDeferredImagesMaxIdleTime * 1.2);
 			maxTimeoutId = await deferForceLazyLoadEnd(timeoutId, idleTimeoutId, maxTimeoutId, observer, options, cleanupAndResolve);
 			observer.observe(document, { subtree: true, childList: true, attributes: true });
-			addEventListener(frames.LOAD_IMAGE_EVENT, onImageLoadEvent);
-			addEventListener(frames.IMAGE_LOADED_EVENT, onImageLoadedEvent);
+			addEventListener.call(window, frames.LOAD_IMAGE_EVENT, onImageLoadEvent);
+			addEventListener.call(window, frames.IMAGE_LOADED_EVENT, onImageLoadedEvent);
 			if (frames) {
 				frames.loadDeferredImagesStart(options);
 			}
@@ -106,8 +106,8 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 
 			function cleanupAndResolve(value) {
 				observer.disconnect();
-				removeEventListener(frames.LOAD_IMAGE_EVENT, onImageLoadEvent);
-				removeEventListener(frames.IMAGE_LOADED_EVENT, onImageLoadedEvent);
+				removeEventListener.call(window, frames.LOAD_IMAGE_EVENT, onImageLoadEvent);
+				removeEventListener.call(window, frames.IMAGE_LOADED_EVENT, onImageLoadedEvent);
 				resolve(value);
 			}
 		});
@@ -148,7 +148,7 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 			browser.runtime.onMessage.addListener(timeoutCallback);
 			return timeoutId;
 		} else {
-			return setTimeout(callback, delay);
+			return setTimeout.call(window, callback, delay);
 		}
 	}
 
@@ -156,7 +156,7 @@ this.singlefile.lib.lazy.content.loader = this.singlefile.lib.lazy.content.loade
 		if (browser && browser.runtime && browser.runtime.sendMessage) {
 			await browser.runtime.sendMessage({ method: "lazyTimeout.clearTimeout", id: timeoutId });
 		} else {
-			return clearTimeout(timeoutId);
+			return clearTimeout.call(window, timeoutId);
 		}
 	}