From ecf30cd01b28337da46a4a8684c594c1c9c20e63 Mon Sep 17 00:00:00 2001
From: didierfred <didierfred@gmail.com>
Date: Tue, 6 Feb 2018 14:51:05 +0100
Subject: [PATCH] Implements new storage format

---
 background.js   | 69 ++++++++++++++++++++++++++++++-------------------
 popup/config.js | 56 ++++++++++++++++++++++++---------------
 2 files changed, 78 insertions(+), 47 deletions(-)

diff --git a/background.js b/background.js
index 208b9ec..020e11d 100644
--- a/background.js
+++ b/background.js
@@ -10,27 +10,46 @@
 
 "use strict";
 
-var targetPage = "https://httpbin.org/*";
-var modifyTable = [];
+//var targetPage = "https://httpbin.org/*";
+//var modifyTable = [];
+var config ;
 var started = "off";
 
-// If no table stored , use and store a default one
-if (!localStorage.getItem('modifyTable')) 
+// if configuration exist 
+if (localStorage.getItem('config'))  
 	{
-	modifyTable = [
-		["add","test_header_name","test_header_value","on"],
-		];
-	localStorage.setItem("modifyTable",JSON.stringify(modifyTable));
+	console.log("Load standard config");
+	config= JSON.parse(localStorage.getItem('config'));
 	}
 else 
 	{
-	modifyTable=JSON.parse(localStorage.getItem("modifyTable"));
+	// else check if old config exist
+	if (localStorage.getItem('targetPage')&& localStorage.getItem('modifyTable'))
+		{
+			console.log("Load old config");
+			var headers = [];
+			var modifyTable=JSON.parse(localStorage.getItem("modifyTable"));
+			for (var to_modify of modifyTable)
+				{
+					headers.push({action:to_modify[0],header_name:to_modify[1],header_value:to_modify[2],status:to_modify[3]});
+				}
+			config = {format_version:"1.0",target_page:localStorage.getItem('targetPage'),headers:headers};
+			// save old config in new format 
+			localStorage.setItem("config",JSON.stringify(config));
+		}
+	//else no config exists, create a default one
+	else 
+		{
+				console.log("Load default config");
+				var headers = [];
+				headers.push({action:"add",header_name:"test_header_name",header_value:"test_header_value",status:"on"});
+				config = {format_version:"1.0",target_page:"https://httpbin.org/*",headers:headers};
+				// save configuration 
+				localStorage.setItem("config",JSON.stringify(config));
+		}
 	}
-
-// If no target page stored , use a default one 
-if (!localStorage.getItem('targetPage')) localStorage.setItem('targetPage',targetPage);
-else targetPage = localStorage.getItem('targetPage');
-
+		
+		
 // If no started value stored , use a default one 
 if (!localStorage.getItem('started')) localStorage.setItem('started',started);
 else started = localStorage.getItem('started');
@@ -41,7 +60,6 @@ if (started=="on")
 		browser.browserAction.setIcon({ path: "icons/modify-green-32.png"});
 		}
 
-
 // listen for change in configuration or start/stop 
 browser.runtime.onMessage.addListener(notify);
 
@@ -53,29 +71,29 @@ browser.runtime.onMessage.addListener(notify);
 function rewriteHeader(e) 
 {
 
-  for (var to_modify of modifyTable)
+  for (var to_modify of config.headers)
 	{
-		if (to_modify[3]=="on")
+		if (to_modify.status=="on")
 			{
-			if (to_modify[0]=="add")  
+			if (to_modify.action=="add")  
 				{
-					var new_header = {"name" :to_modify[1],"value":to_modify[2]};
+					var new_header = {"name" :to_modify.header_name,"value":to_modify.header_value};
 					e.requestHeaders.push(new_header);
 				}
-			else if (to_modify[0]=="modify")
+			else if (to_modify.action=="modify")
 				{
 				for (var header of e.requestHeaders) 
 					{
-					if (header.name.toLowerCase() == to_modify[1].toLowerCase()) header.value = to_modify[2];
+					if (header.name.toLowerCase() == to_modify.header_name.toLowerCase()) header.value = to_modify.header_value;
 					}
 				}
-			else if (to_modify[0]=="delete")
+			else if (to_modify.action=="delete")
 				{
 				var index = -1;
 			
 				for (var i=0; i < e.requestHeaders.length; i++)
 					{
-				 	if (e.requestHeaders[i].name.toLowerCase() == to_modify[1].toLowerCase())  index=i;
+				 	if (e.requestHeaders[i].name.toLowerCase() == to_modify.header_name.toLowerCase())  index=i;
 					}
 				if (index!=-1) 
 					{
@@ -101,8 +119,7 @@ function notify(message)
 	{
 	if (message=="reload") 
 		{
-		modifyTable=JSON.parse(localStorage.getItem("modifyTable"));
-		targetPage = localStorage.getItem('targetPage');
+		config=JSON.parse(localStorage.getItem("config"));
 		if (started=="on")
 			{		
 			browser.webRequest.onBeforeSendHeaders.removeListener(rewriteHeader);
@@ -132,7 +149,7 @@ function notify(message)
 function addListener()
 	{
 	browser.webRequest.onBeforeSendHeaders.addListener(rewriteHeader,
-                                          {urls: [targetPage]},
+                                          {urls: [config.target_page]},
                                           ["blocking", "requestHeaders"]);
 	}
 
diff --git a/popup/config.js b/popup/config.js
index 35f2a49..dbb68c3 100644
--- a/popup/config.js
+++ b/popup/config.js
@@ -13,14 +13,14 @@ var line_number = 1;
 var started = "off";
 
 window.onload = function() {
-	var configTable = JSON.parse(localStorage.getItem("modifyTable"));	
-	for (var to_add of configTable) appendLine(to_add[0],to_add[1],to_add[2],to_add[3]);
+	var config = JSON.parse(localStorage.getItem("config"));	
+	for (var to_add of config.headers) appendLine(to_add.action,to_add.header_name,to_add.header_value,to_add.status);
 	document.getElementById('save_button').addEventListener('click',function (e) {save_data();});
 	document.getElementById('export_button').addEventListener('click',function (e) {export_data();});
-	document.getElementById('import_button').addEventListener('change',function (e) {import_data(e);});
+	document.getElementById('import_button').addEventListener('click',function (e) {import_data(e);});
 	document.getElementById('add_button').addEventListener('click',function (e) {appendLine("add","-","-","off");});
 	document.getElementById('start_img').addEventListener('click',function (e) {start_modify();});
-	document.getElementById('targetPage').value=localStorage.getItem("targetPage");
+	document.getElementById('targetPage').value=config.target_page;
 	started = localStorage.getItem("started");
 	if (started=="on") document.getElementById("start_img").src = "img/stop.png";	
 } ;
@@ -47,7 +47,32 @@ document.getElementById('delete_button'+line_number).addEventListener('click',fu
 line_number++;
 }
 
+function create_configuration_data()
+{
+	var tr_elements = document.querySelectorAll("#config_tab tr");
+	var headers = [];
+	for (i=1;i<tr_elements.length;i++)  // ignore line 1 which is the table header
+		{
+	
+		var action = tr_elements[i].childNodes[0].childNodes[0].value;
+		var header_name = tr_elements[i].childNodes[1].childNodes[0].value;
+		var header_value = tr_elements[i].childNodes[2].childNodes[0].value;
+		var status = tr_elements[i].childNodes[3].childNodes[0].value;
+		headers.push({action:action,header_name:header_name,header_value:header_value,status:status});
+
+		}
+	var to_export = {format_version:"1.0",target_page:document.getElementById('targetPage').value,headers:headers};
+	console.log(JSON.stringify(to_export));
+	return JSON.stringify(to_export);
+}
 
+function save_data () 
+	{
+	localStorage.setItem("config",create_configuration_data());
+	browser.runtime.sendMessage("reload");
+	}
+
+/**
 function save_data () 
 	{
 	var tr_elements = document.querySelectorAll("#config_tab tr");
@@ -65,28 +90,18 @@ function save_data ()
 	localStorage.setItem("targetPage",document.getElementById('targetPage').value);
 	browser.runtime.sendMessage("reload");
 	}
+**/
+
+
 
 function export_data()
 	{
 	// Create file data
-	var tr_elements = document.querySelectorAll("#config_tab tr");
-	var headers = [];
-	for (i=1;i<tr_elements.length;i++)  // ignore line 1 which is the table header
-		{
-	
-		var action = tr_elements[i].childNodes[0].childNodes[0].value;
-		var header_name = tr_elements[i].childNodes[1].childNodes[0].value;
-		var header_value = tr_elements[i].childNodes[2].childNodes[0].value;
-		var status = tr_elements[i].childNodes[3].childNodes[0].value;
-		headers.push({action:action,header_name:header_name,header_value:header_value,status:status});
-
-		}
-	var to_export = {format_version:"1.0",target_page:document.getElementById('targetPage').value,headers:headers};
-	console.log(JSON.stringify(to_export));
+	var to_export= create_configuration_data();
 	
 	// Create file to save 
 	var a         = document.createElement('a');
-	a.href        = 'data:attachment/json,' +  encodeURIComponent(JSON.stringify(to_export));
+	a.href        = 'data:attachment/json,' +  encodeURIComponent(to_export);
 	a.target      = 'download';
 	a.download    = 'SimpleModifyHeader.conf';
 	
@@ -99,7 +114,6 @@ function export_data()
 	
 function import_data(evt)
 	{
-
 	// create an input field in the iframe
 	var input = document.createElement("input");
 	input.type="file";
@@ -120,7 +134,7 @@ function readSingleFile(e)
   	  var reader = new FileReader();
   	  reader.onload = function(e) 
 		{
-    		var contents = e.target.result;
+    	var contents = e.target.result;
 		var config="";	
 		try
 			{
-- 
GitLab