From 5f5d36de23aa35baad50a12d714b5ca4dbd63824 Mon Sep 17 00:00:00 2001 From: kkapsner Date: Mon, 27 Nov 2017 12:28:01 +0100 Subject: [PATCH] Added dynamic settings content script Not yet fully usable due to missing detection in frame.js --- lib/main.js | 42 ++++++++++++++++++++++++++++++++++++++++++ lib/settings.js | 20 +++++++++++++------- 2 files changed, 55 insertions(+), 7 deletions(-) diff --git a/lib/main.js b/lib/main.js index 2c3b804..2c03b29 100644 --- a/lib/main.js +++ b/lib/main.js @@ -84,6 +84,48 @@ }); } }); + + if (browser.contentScripts){ + let unregister = function(){}; + let lastRegistering; + const register = function register(){ + logging.message("Register content script for the settings."); + logging.verbose("Unregister old content script, if present."); + unregister(); + var data = {}; + settings.forEach(function(def){ + data[def.name] = def.get(); + }); + lastRegistering = data; + browser.contentScripts.register({ + matches: [""], + matchAboutBlank: true, + allFrames: true, + runAt: "document_start", + js: [{ + code: `(function(){ + const settings = require("./settings"); + console.log(settings.init(${JSON.stringify(data)})); + }())` + // code: "(function(){const settings = require(\"./settings\");console.log(settings);}());" + }] + }).then(function(api){ + logging.verbose("Content script registered."); + if (data !== lastRegistering){ + logging.verbose("Multiple content scripts registered at once. Remove unnecessary one."); + api.unregister(); + } + else { + unregister = api.unregister; + } + }); + }; + register(); + settings.on("any", register); + } + else { + logging.error("Old Firefox does not support browser.contentScript.register()"); + } }); browser.runtime.onInstalled.addListener(function(){ diff --git a/lib/settings.js b/lib/settings.js index 22f39a0..fc48bdd 100644 --- a/lib/settings.js +++ b/lib/settings.js @@ -176,7 +176,13 @@ }; logging.verbose("loading settings"); - scope.loaded = browser.storage.local.get().then(function(storage){ + let initialized = false; + const initEvents = []; + scope.init = function(storage){ + if (initialized){ + return false; + } + initialized = true; logging.message("settings loaded"); if (!storage.storageVersion){ logging.message("No storage version found. Initializing storage."); @@ -209,14 +215,14 @@ changeValue(name, value); }); changeValue("isStillDefault", false); - - eventHandler.any.forEach(function(callback){ - callback(); - }); - }); + + initEvents.forEach(function(callback){callback();}); + return true; + }; + scope.loaded = browser.storage.local.get().then(scope.init); scope.onloaded = function(callback){ if (scope.isStillDefault){ - scope.loaded.then(function(){callback();}); + initEvents.push(callback); } else { callback();