Răsfoiți Sursa

fixed ignored errors related to message passing between content scripts and background scripts

Gildas 7 ani în urmă
părinte
comite
703ec7b599

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

@@ -39,7 +39,7 @@ singlefile.core = (() => {
 		"/extension/core/content/content.js"
 	];
 
-	browser.runtime.onMessage.addListener((request, sender) => {
+	browser.runtime.onMessage.addListener(async (request, sender) => {
 		if (request.getConfig) {
 			return singlefile.config.get();
 		}
@@ -56,6 +56,7 @@ singlefile.core = (() => {
 		}
 		if (request.processContent) {
 			processBackgroundTab(sender.tab.id, request);
+			return {};
 		}
 	});
 

+ 8 - 12
extension/core/content/content.js

@@ -28,12 +28,16 @@ this.singlefile.top = this.singlefile.top || (() => {
 	browser.runtime.onMessage.addListener(async message => {
 		if (message.processStart) {
 			savePage(message);
+			return {};
 		}
 	});
+
 	addEventListener("message", event => {
 		if (typeof event.data == "string" && event.data.startsWith("__SingleFile__::")) {
 			const message = JSON.parse(event.data.substring("__SingleFile__".length + 2));
-			savePage(message);
+			if (message.processStart) {
+				savePage(message);
+			}
 		}
 	});
 	return true;
@@ -127,22 +131,14 @@ this.singlefile.top = this.singlefile.top || (() => {
 			options.framesData = await FrameTree.getFramesData(options);
 		}
 		options.jsEnabled = true;
-		options.onprogress = async event => {
+		options.onprogress = event => {
 			if (event.type == event.RESOURCES_INITIALIZED || event.type == event.RESOURCE_LOADED) {
-				try {
-					await browser.runtime.sendMessage({ processProgress: true, index: event.details.index, maxIndex: event.details.max, options: { autoSave: options.autoSave } });
-				} catch (error) {
-					/* ignored */
-				}
+				browser.runtime.sendMessage({ processProgress: true, index: event.details.index, maxIndex: event.details.max, options: { autoSave: options.autoSave } });
 				if (options.shadowEnabled && !options.autoSave) {
 					singlefile.ui.onprogress(event);
 				}
 			} else if (event.type == event.PAGE_ENDED) {
-				try {
-					await browser.runtime.sendMessage({ processEnd: true, options: { autoSave: options.autoSave } });
-				} catch (error) {
-					/* ignored */
-				}
+				browser.runtime.sendMessage({ processEnd: true, options: { autoSave: options.autoSave } });
 			}
 		};
 		return options;

+ 7 - 2
extension/ui/bg/ui.js

@@ -72,18 +72,23 @@ singlefile.ui = (() => {
 		await onTabActivated(tab);
 	});
 	browser.tabs.onRemoved.addListener(tabId => onTabRemoved(tabId));
-	browser.runtime.onMessage.addListener((request, sender) => {
-		if (request.processProgress && request.maxIndex) {
+	browser.runtime.onMessage.addListener(async (request, sender) => {
+		if (request.processProgress) {
+			if (request.maxIndex) {
 			onTabProgress(sender.tab.id, request.index, request.maxIndex, request.options);
+		}
+			return {};
 		}
 		if (request.processEnd) {
 			onTabEnd(sender.tab.id, request.options);
+			return {};
 		}
 		if (request.processError) {
 			if (request.error) {
 				console.error("Initialization error", request.error); // eslint-disable-line no-console
 			}
 			onTabError(sender.tab.id, request.options);
+			return {};
 		}
 		if (request.isAutoSaveUnloadEnabled) {
 			return isAutoSaveUnloadEnabled(sender.tab.id);

+ 7 - 6
lib/browser-polyfill/custom-browser-polyfill.js

@@ -153,13 +153,13 @@
 						if (response && typeof response.then == "function") {
 							response
 								.then(response => {
-									sendResponse(response);
-									if (chrome.runtime.lastError) {
-										/* ignored */
+									if (response !== undefined) {
+										try {
+											sendResponse(response);
+										} catch (error) {
+											/* ignored */
+										}
 									}
-								})
-								.catch(() => {
-									/* ignored */
 								});
 							return true;
 						}
@@ -256,6 +256,7 @@
 				sendMessage: (tabId, message, options = {}) => new Promise((resolve, reject) =>
 					chrome.tabs.sendMessage(tabId, message, options, response => {
 						if (chrome.runtime.lastError) {
+							console.log("send NOK", message, chrome.runtime.lastError);
 							reject(chrome.runtime.lastError);
 						} else {
 							resolve(response);

+ 2 - 2
lib/fetch/bg/fetch.js

@@ -26,8 +26,8 @@
 
 	let requestId = 1;
 
-	browser.runtime.onMessage.addListener(request => {
-		if (request.method) {
+	browser.runtime.onMessage.addListener(async request => {
+		if (request.method && request.method.startsWith("fetch")) {
 			return new Promise(resolve => {
 				onRequest(request)
 					.then(resolve)

+ 17 - 8
lib/single-file/frame-tree/bg/frame-tree.js

@@ -22,25 +22,34 @@
 
 this.FrameTree = (() => {
 
-	browser.runtime.onMessage.addListener((message, sender) => {
+	const tabsData = {};
+
+	browser.runtime.onMessage.addListener(async (message, sender) => {
+		if (message.method == "FrameTree.initResponse") {
+			if (tabsData[sender.tab.id]) {
+				tabsData[sender.tab.id].forEach(resolve => resolve());
+				tabsData[sender.tab.id] = null;
+			}
+			return {};
+		}
 		if (message.method == "FrameTree.getDataRequest") {
 			browser.tabs.sendMessage(sender.tab.id, { method: "FrameTree.getDataRequest", windowId: message.windowId, tabId: sender.tab.id, options: message.options });
+			return {};
 		}
 		if (message.method == "FrameTree.getDataResponse") {
 			browser.tabs.sendMessage(message.tabId, { method: "FrameTree.getDataResponse", windowId: message.windowId, content: message.content, baseURI: message.baseURI, emptyStyleRulesText: message.emptyStyleRulesText });
+			return {};
 		}
 	});
 
 	return {
 		async initialize(tabId, options) {
 			return new Promise(resolve => {
-				const onMessage = message => {
-					if (message.method == "FrameTree.initResponse") {
-						browser.runtime.onMessage.removeListener(onMessage);
-						resolve();
-					}
-				};
-				browser.runtime.onMessage.addListener(onMessage);
+				if (tabsData[tabId]) {
+					tabsData[tabId].push(resolve);
+				} else {
+					tabsData[tabId] = [resolve];
+				}
 				browser.tabs.sendMessage(tabId, { method: "FrameTree.initRequest", windowId: "0", index: 0, options });
 			});
 		}

+ 12 - 7
lib/single-file/frame-tree/content/frame-tree.js

@@ -57,20 +57,23 @@ this.FrameTree = this.FrameTree || (() => {
 		}
 	};
 
-	let framesData, dataRequestCallbacks;
+	let framesData, dataRequestCallbacks, initResponseSent;
 
 	if (window == top) {
 		browser.runtime.onMessage.addListener(async message => {
 			if (message.method == "FrameTree.initRequest" && document.documentElement instanceof HTMLHtmlElement) {
 				dataRequestCallbacks = new Map();
 				framesData = [];
+				initResponseSent = false;
 				initRequest(message);
+				return {};
 			}
 			if (message.method == "FrameTree.getDataResponse") {
 				getDataResponse(message);
 			}
 		});
 	}
+
 	browser.runtime.onMessage.addListener(async message => {
 		if (message.method == "FrameTree.getDataRequest" && FrameTree.windowId == message.windowId) {
 			const docData = docHelper.preProcessDoc(document, window, message.options);
@@ -83,10 +86,12 @@ this.FrameTree = this.FrameTree || (() => {
 				canvasData: docData.canvasData,
 				baseURI: document.baseURI,
 				title: document.title
-			}).catch(() => {/* ignored */ });
+			});
 			docHelper.postProcessDoc(document, message.options);
+			return {};
 		}
 	});
+
 	addEventListener("message", event => {
 		if (typeof event.data == "string" && event.data.startsWith(MESSAGE_PREFIX + "::")) {
 			const message = JSON.parse(event.data.substring(MESSAGE_PREFIX.length + 2));
@@ -112,7 +117,7 @@ this.FrameTree = this.FrameTree || (() => {
 						method: "FrameTree.getDataRequest",
 						windowId: frameData.windowId,
 						options: { removeHiddenElements: options.removeHiddenElements, compressHTML: options.compressHTML }
-					}).catch(() => { /* ignored */ });
+					});
 				}
 				frameData.getDataResponseTimeout = timeout.set(() => top.postMessage(MESSAGE_PREFIX + "::" + JSON.stringify({ method: "getDataResponse", windowId: frameData.windowId }), "*"), TIMEOUT_DATA_RESPONSE_MESSAGE);
 			});
@@ -137,13 +142,13 @@ this.FrameTree = this.FrameTree || (() => {
 				message.framesData = message.framesData instanceof Array ? message.framesData : JSON.parse(message.framesData);
 				framesData = framesData.concat(message.framesData);
 				const frameData = framesData.find(frameData => frameData.windowId == message.windowId);
-				const pendingCount = framesData.filter(frameData => !frameData.processed).length;
 				if (message.windowId != "0") {
 					frameData.processed = true;
 				}
-				if (!pendingCount || pendingCount == 1) {
-					browser.runtime.sendMessage({ method: "FrameTree.initResponse" })
-						.catch(() => { /* ignored */ });
+				const pendingCount = framesData.filter(frameData => !frameData.processed).length;
+				if (!pendingCount && !initResponseSent) {
+					initResponseSent = true;
+					browser.runtime.sendMessage({ method: "FrameTree.initResponse" });
 				}
 			}
 		} else {