Kaynağa Gözat

removed background script of frame-tree

Gildas 7 yıl önce
ebeveyn
işleme
5593c15f57

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

@@ -18,7 +18,7 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global browser, SingleFile, singlefile, FrameTree, Blob */
+/* global browser, SingleFile, singlefile, Blob */
 
 singlefile.core = (() => {
 
@@ -121,9 +121,6 @@ singlefile.core = (() => {
 	}
 
 	async function processStart(tab, options) {
-		if (!options.removeFrames) {
-			await FrameTree.initialize(tab.id, options);
-		}
 		await executeScripts(tab.id, contentScriptFiles, { allFrames: false });
 		if (options.frameId) {
 			await browser.tabs.sendMessage(tab.id, { processStartFrame: true, options }, { frameId: options.frameId });

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

@@ -124,11 +124,11 @@ this.singlefile.top = this.singlefile.top || (() => {
 	}
 
 	async function getOptions(options) {
-		options.doc = document;
-		options.win = window;
 		if (!options.removeFrames) {
 			options.framesData = await FrameTree.getFramesData(options);
 		}
+		options.doc = document;
+		options.win = window;
 		options.jsEnabled = true;
 		options.onprogress = event => {
 			if (event.type == event.RESOURCES_INITIALIZED || event.type == event.RESOURCE_LOADED) {

+ 0 - 51
lib/single-file/frame-tree/bg/frame-tree.js

@@ -1,51 +0,0 @@
-/*
- * Copyright 2018 Gildas Lormeau
- * contact : gildas.lormeau <at> gmail.com
- * 
- * This file is part of SingleFile.
- *
- *   SingleFile is free software: you can redistribute it and/or modify
- *   it under the terms of the GNU Lesser General Public License as published by
- *   the Free Software Foundation, either version 3 of the License, or
- *   (at your option) any later version.
- *
- *   SingleFile is distributed in the hope that it will be useful,
- *   but WITHOUT ANY WARRANTY; without even the implied warranty of
- *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- *   GNU Lesser General Public License for more details.
- *
- *   You should have received a copy of the GNU Lesser General Public License
- *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-/* global browser */
-
-this.FrameTree = (() => {
-
-	const tabsData = {};
-	let sessionId = 0;
-
-	browser.runtime.onMessage.addListener((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 {
-		async initialize(tabId, options) {
-			return new Promise(resolve => {
-				if (tabsData[tabId]) {
-					tabsData[tabId].push(resolve);
-				} else {
-					tabsData[tabId] = [resolve];
-				}
-				options.sessionId = sessionId;
-				sessionId++;
-				browser.tabs.sendMessage(tabId, { method: "FrameTree.initRequest", windowId: "0", sessionId: options.sessionId, options });
-			});
-		}
-	};
-})();

+ 23 - 26
lib/single-file/frame-tree/content/frame-tree.js → lib/single-file/frame-tree/frame-tree.js

@@ -18,35 +18,34 @@
  *   along with SingleFile.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-/* global browser, window, top, document, HTMLHtmlElement, addEventListener, docHelper, timeout */
+/* global window, top, document, addEventListener, docHelper, timeout */
 
 this.FrameTree = this.FrameTree || (() => {
 
 	const MESSAGE_PREFIX = "__FrameTree__";
 	const TIMEOUT_INIT_REQUEST_MESSAGE = 500;
 
+	let sessionId = 0;
+
 	const FrameTree = {
 		getFramesData
 	};
 
 	let sessions = new Map();
-	if (window == top) {
-		browser.runtime.onMessage.addListener(onTopBackgroundMessage);
-	}
 	addEventListener("message", onFrameWindowMessage, false);
 	return FrameTree;
 
 	async function getFramesData(options) {
-		const sessionId = options.sessionId;
-		const sessionFramesData = sessions.get(sessionId);
-		sessions.delete(sessionId);
-		return sessionFramesData.frames.sort((frame1, frame2) => frame2.windowId.split(".").length - frame1.windowId.split(".").length);
-	}
-
-	function onTopBackgroundMessage(message) {
-		if (message.method == "FrameTree.initRequest" && document.documentElement instanceof HTMLHtmlElement) {
-			initRequest(message);
-		}
+		options.sessionId = sessionId;
+		sessionId++;
+		return new Promise(resolve => {
+			sessions.set(options.sessionId, {
+				frames: [],
+				dataRequestCallbacks: new Map(),
+				resolve
+			});
+			initRequest({ windowId: "0", sessionId: options.sessionId, options });
+		});
 	}
 
 	function onFrameWindowMessage(event) {
@@ -65,11 +64,11 @@ this.FrameTree = this.FrameTree || (() => {
 		const sessionId = message.sessionId;
 		FrameTree.windowId = windowId;
 		const frameElements = document.querySelectorAll("iframe, frame, object[type=\"text/html\"][data]");
-		sessions.set(message.sessionId, {
-			frames: [],
-			dataRequestCallbacks: new Map()
-		});
 		if (window != top) {
+			sessions.set(message.sessionId, {
+				frames: [],
+				dataRequestCallbacks: new Map()
+			});
 			const docData = docHelper.preProcessDoc(document, window, message.options);
 			const content = docHelper.serialize(document);
 			docHelper.postProcessDoc(document, window, message.options);
@@ -80,28 +79,25 @@ this.FrameTree = this.FrameTree || (() => {
 
 	function initResponse(message) {
 		if (window == top) {
-			if (message.framesData) {
-				const sessionFramesData = sessions.get(message.sessionId);
+			const sessionFramesData = sessions.get(message.sessionId);
+			if (sessionFramesData) {
 				message.framesData.forEach(messageFrameData => {
 					let frameData = sessionFramesData.frames.find(frameData => messageFrameData.windowId == frameData.windowId);
 					if (!frameData) {
 						frameData = { windowId: messageFrameData.windowId };
 						sessionFramesData.frames.push(frameData);
 					}
-
 					frameData.content = messageFrameData.content;
 					frameData.baseURI = messageFrameData.baseURI;
 					frameData.title = messageFrameData.title;
 					frameData.emptyStyleRulesText = messageFrameData.emptyStyleRulesText;
 					frameData.canvasData = messageFrameData.canvasData;
-
 					frameData.processed = messageFrameData.processed;
 				});
-
 				const pendingCount = sessionFramesData.frames.filter(frameData => !frameData.processed).length;
-				if (!pendingCount && !sessionFramesData.initResponseSent) {
-					sessionFramesData.initResponseSent = true;
-					browser.runtime.sendMessage({ method: "FrameTree.initResponse", sessionId: message.sessionId });
+				if (!pendingCount) {
+					sessions.delete(message.sessionId);
+					sessionFramesData.resolve(sessionFramesData.frames.sort((frame1, frame2) => frame2.windowId.split(".").length - frame1.windowId.split(".").length));
 				}
 			}
 		} else {
@@ -120,6 +116,7 @@ this.FrameTree = this.FrameTree || (() => {
 			framesData.push({ windowId: frameWinId });
 			try {
 				if (!frameElement.contentDocument) {
+					options.win = null;
 					frameElement.contentWindow.postMessage(MESSAGE_PREFIX + "::" + JSON.stringify({ method: "initRequest", windowId: frameWinId, sessionId, frameIndex, options }), "*");
 					timeout.set(() => top.postMessage(MESSAGE_PREFIX + "::" + JSON.stringify({ method: "initResponse", framesData: [], windowId: frameWinId, sessionId }), "*"), TIMEOUT_INIT_REQUEST_MESSAGE);
 				}

+ 0 - 0
lib/single-file/frame-tree/content/timeout.js → lib/single-file/frame-tree/timeout.js


+ 2 - 3
manifest.json

@@ -18,8 +18,8 @@
 				"lib/browser-polyfill/custom-browser-polyfill.js",
 				"extension/index.js",
 				"lib/single-file/doc-helper.js",
-				"lib/single-file/frame-tree/content/timeout.js",
-				"lib/single-file/frame-tree/content/frame-tree.js",
+				"lib/single-file/frame-tree/timeout.js",
+				"lib/single-file/frame-tree/frame-tree.js",
 				"extension/core/content/content-frame.js"
 			],
 			"all_frames": true,
@@ -41,7 +41,6 @@
 	"background": {
 		"scripts": [
 			"lib/browser-polyfill/custom-browser-polyfill.js",
-			"lib/single-file/frame-tree/bg/frame-tree.js",
 			"lib/fetch/bg/fetch.js",
 			"extension/index.js",
 			"extension/core/bg/config.js",