Browse Source

initial work for jquery/codemirror; remove stock whitelist

Andrew Dolgov 11 months ago
parent
commit
faa67e3e26
11 changed files with 19793 additions and 7685 deletions
  1. 1 0
      .gitignore
  2. 0 8
      background.js
  3. 2 40
      common.js
  4. 63 0
      lib/codemirror/addon/display/placeholder.js
  5. 346 0
      lib/codemirror/lib/codemirror.css
  6. 9725 0
      lib/codemirror/lib/codemirror.js
  7. 9597 0
      lib/jquery.js
  8. 0 7590
      lib/prototype.js
  9. 6 7
      manifest.json
  10. 22 19
      options.html
  11. 31 21
      options.js

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/.tags*

+ 0 - 8
background.js

@@ -107,8 +107,6 @@ chrome.webRequest.onAuthRequired.addListener(
 	{urls: ["<all_urls>"]},
 	['blocking'] );
 
-update_whitelist();
-
 chrome.browserAction.onClicked.addListener(function(tab) {
 	ping();
 });
@@ -125,12 +123,6 @@ setTimeout(function() {
 	ping();
 }, 1000);
 
-setInterval(function() {
-	update_whitelist();
-}, 3600 * 1000 );
-
 setInterval(function() {
 	ping();
 }, 60 * 1000);
-
-

+ 2 - 40
common.js

@@ -3,22 +3,12 @@
 function generate_pac() {
 	try {
 		var settings = JSON.parse(localStorage.settings);
-		var custom_urls = settings.whitelist.split("\n");
+		var urls = settings.whitelist.split("\n");
 		var proxy_url = settings.url;
 
 		var pac_script = "function FindProxyForURL(url, host) {\n" +
 			" if (isPlainHostName(host)) { return 'DIRECT'; }\n";
 
-		var default_whitelist = [];
-
-		try {
-			var default_whitelist = JSON.parse(localStorage.defaultWhitelist);
-		} catch (e) {
-			console.warn(e);
-		}
-
-		var urls = default_whitelist.concat(custom_urls);
-
 		for (var i = 0; i < urls.length; i++) {
 			var u = urls[i].replace("'", "\\'");
 
@@ -78,37 +68,9 @@ function set_proxy() {
 
 			var settings = JSON.parse(localStorage.settings);
 			var proxy_url = settings.url;
-			var custom_urls = settings.whitelist.split("\n");
-
-			var default_whitelist = [];
-
-			try {
-				var default_whitelist = JSON.parse(localStorage.defaultWhitelist);
-			} catch (e) {
-				console.warn(e);
-			}
-
-			var urls = default_whitelist.concat(custom_urls);
+			var urls = settings.whitelist.split("\n");
 
 			browser.runtime.sendMessage({urls: urls, proxy: proxy_url}, {toProxyScript: true});
 		});
 	}
 }
-
-function update_whitelist() {
-
-	console.log("update_whitelist");
-
-	fetch("https://fakecake.org/tinyproxy_whitelist.txt").then(function(resp) {
-		if (resp.ok) {
-			resp.text().then(function(data) {
-				var urls = data.split("\n");
-
-				console.log("update_whitelist: got " + urls.length + " urls");
-
-				localStorage.defaultWhitelist = JSON.stringify(urls);
-				set_proxy();
-			});
-		}
-	});
-}

+ 63 - 0
lib/codemirror/addon/display/placeholder.js

@@ -0,0 +1,63 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/LICENSE
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  CodeMirror.defineOption("placeholder", "", function(cm, val, old) {
+    var prev = old && old != CodeMirror.Init;
+    if (val && !prev) {
+      cm.on("blur", onBlur);
+      cm.on("change", onChange);
+      cm.on("swapDoc", onChange);
+      onChange(cm);
+    } else if (!val && prev) {
+      cm.off("blur", onBlur);
+      cm.off("change", onChange);
+      cm.off("swapDoc", onChange);
+      clearPlaceholder(cm);
+      var wrapper = cm.getWrapperElement();
+      wrapper.className = wrapper.className.replace(" CodeMirror-empty", "");
+    }
+
+    if (val && !cm.hasFocus()) onBlur(cm);
+  });
+
+  function clearPlaceholder(cm) {
+    if (cm.state.placeholder) {
+      cm.state.placeholder.parentNode.removeChild(cm.state.placeholder);
+      cm.state.placeholder = null;
+    }
+  }
+  function setPlaceholder(cm) {
+    clearPlaceholder(cm);
+    var elt = cm.state.placeholder = document.createElement("pre");
+    elt.style.cssText = "height: 0; overflow: visible";
+    elt.style.direction = cm.getOption("direction");
+    elt.className = "CodeMirror-placeholder";
+    var placeHolder = cm.getOption("placeholder")
+    if (typeof placeHolder == "string") placeHolder = document.createTextNode(placeHolder)
+    elt.appendChild(placeHolder)
+    cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild);
+  }
+
+  function onBlur(cm) {
+    if (isEmpty(cm)) setPlaceholder(cm);
+  }
+  function onChange(cm) {
+    var wrapper = cm.getWrapperElement(), empty = isEmpty(cm);
+    wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : "");
+
+    if (empty) setPlaceholder(cm);
+    else clearPlaceholder(cm);
+  }
+
+  function isEmpty(cm) {
+    return (cm.lineCount() === 1) && (cm.getLine(0) === "");
+  }
+});

+ 346 - 0
lib/codemirror/lib/codemirror.css

@@ -0,0 +1,346 @@
+/* BASICS */
+
+.CodeMirror {
+  /* Set height, width, borders, and global font properties here */
+  font-family: monospace;
+  height: 300px;
+  color: black;
+  direction: ltr;
+}
+
+/* PADDING */
+
+.CodeMirror-lines {
+  padding: 4px 0; /* Vertical padding around content */
+}
+.CodeMirror pre {
+  padding: 0 4px; /* Horizontal padding of content */
+}
+
+.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  background-color: white; /* The little square between H and V scrollbars */
+}
+
+/* GUTTER */
+
+.CodeMirror-gutters {
+  border-right: 1px solid #ddd;
+  background-color: #f7f7f7;
+  white-space: nowrap;
+}
+.CodeMirror-linenumbers {}
+.CodeMirror-linenumber {
+  padding: 0 3px 0 5px;
+  min-width: 20px;
+  text-align: right;
+  color: #999;
+  white-space: nowrap;
+}
+
+.CodeMirror-guttermarker { color: black; }
+.CodeMirror-guttermarker-subtle { color: #999; }
+
+/* CURSOR */
+
+.CodeMirror-cursor {
+  border-left: 1px solid black;
+  border-right: none;
+  width: 0;
+}
+/* Shown when moving in bi-directional text */
+.CodeMirror div.CodeMirror-secondarycursor {
+  border-left: 1px solid silver;
+}
+.cm-fat-cursor .CodeMirror-cursor {
+  width: auto;
+  border: 0 !important;
+  background: #7e7;
+}
+.cm-fat-cursor div.CodeMirror-cursors {
+  z-index: 1;
+}
+.cm-fat-cursor-mark {
+  background-color: rgba(20, 255, 20, 0.5);
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+}
+.cm-animate-fat-cursor {
+  width: auto;
+  border: 0;
+  -webkit-animation: blink 1.06s steps(1) infinite;
+  -moz-animation: blink 1.06s steps(1) infinite;
+  animation: blink 1.06s steps(1) infinite;
+  background-color: #7e7;
+}
[email protected] blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
[email protected] blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
[email protected] blink {
+  0% {}
+  50% { background-color: transparent; }
+  100% {}
+}
+
+/* Can style cursor different in overwrite (non-insert) mode */
+.CodeMirror-overwrite .CodeMirror-cursor {}
+
+.cm-tab { display: inline-block; text-decoration: inherit; }
+
+.CodeMirror-rulers {
+  position: absolute;
+  left: 0; right: 0; top: -50px; bottom: -20px;
+  overflow: hidden;
+}
+.CodeMirror-ruler {
+  border-left: 1px solid #ccc;
+  top: 0; bottom: 0;
+  position: absolute;
+}
+
+/* DEFAULT THEME */
+
+.cm-s-default .cm-header {color: blue;}
+.cm-s-default .cm-quote {color: #090;}
+.cm-negative {color: #d44;}
+.cm-positive {color: #292;}
+.cm-header, .cm-strong {font-weight: bold;}
+.cm-em {font-style: italic;}
+.cm-link {text-decoration: underline;}
+.cm-strikethrough {text-decoration: line-through;}
+
+.cm-s-default .cm-keyword {color: #708;}
+.cm-s-default .cm-atom {color: #219;}
+.cm-s-default .cm-number {color: #164;}
+.cm-s-default .cm-def {color: #00f;}
+.cm-s-default .cm-variable,
+.cm-s-default .cm-punctuation,
+.cm-s-default .cm-property,
+.cm-s-default .cm-operator {}
+.cm-s-default .cm-variable-2 {color: #05a;}
+.cm-s-default .cm-variable-3, .cm-s-default .cm-type {color: #085;}
+.cm-s-default .cm-comment {color: #a50;}
+.cm-s-default .cm-string {color: #a11;}
+.cm-s-default .cm-string-2 {color: #f50;}
+.cm-s-default .cm-meta {color: #555;}
+.cm-s-default .cm-qualifier {color: #555;}
+.cm-s-default .cm-builtin {color: #30a;}
+.cm-s-default .cm-bracket {color: #997;}
+.cm-s-default .cm-tag {color: #170;}
+.cm-s-default .cm-attribute {color: #00c;}
+.cm-s-default .cm-hr {color: #999;}
+.cm-s-default .cm-link {color: #00c;}
+
+.cm-s-default .cm-error {color: #f00;}
+.cm-invalidchar {color: #f00;}
+
+.CodeMirror-composing { border-bottom: 2px solid; }
+
+/* Default styles for common addons */
+
+div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;}
+div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;}
+.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); }
+.CodeMirror-activeline-background {background: #e8f2ff;}
+
+/* STOP */
+
+/* The rest of this file contains styles related to the mechanics of
+   the editor. You probably shouldn't touch them. */
+
+.CodeMirror {
+  position: relative;
+  overflow: hidden;
+  background: white;
+}
+
+.CodeMirror-scroll {
+  overflow: scroll !important; /* Things will break if this is overridden */
+  /* 30px is the magic margin used to hide the element's real scrollbars */
+  /* See overflow: hidden in .CodeMirror */
+  margin-bottom: -30px; margin-right: -30px;
+  padding-bottom: 30px;
+  height: 100%;
+  outline: none; /* Prevent dragging from highlighting the element */
+  position: relative;
+}
+.CodeMirror-sizer {
+  position: relative;
+  border-right: 30px solid transparent;
+}
+
+/* The fake, visible scrollbars. Used to force redraw during scrolling
+   before actual scrolling happens, thus preventing shaking and
+   flickering artifacts. */
+.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler {
+  position: absolute;
+  z-index: 6;
+  display: none;
+}
+.CodeMirror-vscrollbar {
+  right: 0; top: 0;
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+.CodeMirror-hscrollbar {
+  bottom: 0; left: 0;
+  overflow-y: hidden;
+  overflow-x: scroll;
+}
+.CodeMirror-scrollbar-filler {
+  right: 0; bottom: 0;
+}
+.CodeMirror-gutter-filler {
+  left: 0; bottom: 0;
+}
+
+.CodeMirror-gutters {
+  position: absolute; left: 0; top: 0;
+  min-height: 100%;
+  z-index: 3;
+}
+.CodeMirror-gutter {
+  white-space: normal;
+  height: 100%;
+  display: inline-block;
+  vertical-align: top;
+  margin-bottom: -30px;
+}
+.CodeMirror-gutter-wrapper {
+  position: absolute;
+  z-index: 4;
+  background: none !important;
+  border: none !important;
+}
+.CodeMirror-gutter-background {
+  position: absolute;
+  top: 0; bottom: 0;
+  z-index: 4;
+}
+.CodeMirror-gutter-elt {
+  position: absolute;
+  cursor: default;
+  z-index: 4;
+}
+.CodeMirror-gutter-wrapper ::selection { background-color: transparent }
+.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent }
+
+.CodeMirror-lines {
+  cursor: text;
+  min-height: 1px; /* prevents collapsing before first draw */
+}
+.CodeMirror pre {
+  /* Reset some styles that the rest of the page might have set */
+  -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0;
+  border-width: 0;
+  background: transparent;
+  font-family: inherit;
+  font-size: inherit;
+  margin: 0;
+  white-space: pre;
+  word-wrap: normal;
+  line-height: inherit;
+  color: inherit;
+  z-index: 2;
+  position: relative;
+  overflow: visible;
+  -webkit-tap-highlight-color: transparent;
+  -webkit-font-variant-ligatures: contextual;
+  font-variant-ligatures: contextual;
+}
+.CodeMirror-wrap pre {
+  word-wrap: break-word;
+  white-space: pre-wrap;
+  word-break: normal;
+}
+
+.CodeMirror-linebackground {
+  position: absolute;
+  left: 0; right: 0; top: 0; bottom: 0;
+  z-index: 0;
+}
+
+.CodeMirror-linewidget {
+  position: relative;
+  z-index: 2;
+  padding: 0.1px; /* Force widget margins to stay inside of the container */
+}
+
+.CodeMirror-widget {}
+
+.CodeMirror-rtl pre { direction: rtl; }
+
+.CodeMirror-code {
+  outline: none;
+}
+
+/* Force content-box sizing for the elements where we expect it */
+.CodeMirror-scroll,
+.CodeMirror-sizer,
+.CodeMirror-gutter,
+.CodeMirror-gutters,
+.CodeMirror-linenumber {
+  -moz-box-sizing: content-box;
+  box-sizing: content-box;
+}
+
+.CodeMirror-measure {
+  position: absolute;
+  width: 100%;
+  height: 0;
+  overflow: hidden;
+  visibility: hidden;
+}
+
+.CodeMirror-cursor {
+  position: absolute;
+  pointer-events: none;
+}
+.CodeMirror-measure pre { position: static; }
+
+div.CodeMirror-cursors {
+  visibility: hidden;
+  position: relative;
+  z-index: 3;
+}
+div.CodeMirror-dragcursors {
+  visibility: visible;
+}
+
+.CodeMirror-focused div.CodeMirror-cursors {
+  visibility: visible;
+}
+
+.CodeMirror-selected { background: #d9d9d9; }
+.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
+.CodeMirror-crosshair { cursor: crosshair; }
+.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; }
+.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; }
+
+.cm-searching {
+  background-color: #ffa;
+  background-color: rgba(255, 255, 0, .4);
+}
+
+/* Used to force a border model for a node */
+.cm-force-border { padding-right: .1px; }
+
[email protected] print {
+  /* Hide the cursor when printing */
+  .CodeMirror div.CodeMirror-cursors {
+    visibility: hidden;
+  }
+}
+
+/* See issue #2901 */
+.cm-tab-wrap-hack:after { content: ''; }
+
+/* Help users use markselection to safely style text background */
+span.CodeMirror-selectedtext { background: none; }

File diff suppressed because it is too large
+ 9725 - 0
lib/codemirror/lib/codemirror.js


File diff suppressed because it is too large
+ 9597 - 0
lib/jquery.js


File diff suppressed because it is too large
+ 0 - 7590
lib/prototype.js


+ 6 - 7
manifest.json

@@ -3,23 +3,22 @@
 		"gecko": { "id": "[email protected]", "update_url": "https://fakecake.org/xpi/updates.php" }
 	},
   "name": "Selective HTTPS proxy",
-  "version": "0.5",
+  "version": "0.6",
   "manifest_version": 2,
   "description": "Routes specified domains via HTTPS proxy",
-  "permissions": [ "proxy", "unlimitedStorage", 
-	  	"https://fakecake.org/", "<all_urls>",
-		"storage", "webRequest", "webRequestBlocking" ],
+  "permissions": [ "proxy", "unlimitedStorage",
+	  	"<all_urls>", "storage", "webRequest", "webRequestBlocking" ],
   "background": {
         "scripts": [ "common.js", "background.js" ]
     },
-  "options_ui": { 
-		"chrome_style": true,
+  "options_ui": {
+		"open_in_tab": false,
 		"page": "options.html"
 	},
     "browser_action": {
 	  "default_icon": "img/icon16.png"
   },
-  "icons": { 
+  "icons": {
 	  "16": "img/icon16.png",
 	  "128": "img/icon128.png"
   }

+ 22 - 19
options.html

@@ -1,41 +1,44 @@
 <html>
+<head>
+	<script type="text/javascript" src="lib/jquery.js"></script>
+	<script type="text/javascript" src="options.js"></script>
+	<script type="text/javascript" src="common.js"></script>
+	<link href="lib/codemirror/lib/codemirror.css" rel="stylesheet" media="screen">
+	<script src="lib/codemirror/lib/codemirror.js"></script>
+	<script src="lib/codemirror/addon/display/placeholder.js"></script>
+</head>
 <body>
 
-<script type="text/javascript" src="lib/prototype.js"></script>
-<script type="text/javascript" src="options.js"></script>
-<script type="text/javascript" src="common.js"></script>
-
 <style type="text/css">
-body { margin : 1em; }
-#message { color : red; }
-fieldset { border-width : 0px; }
-fieldset label { width : 250px; font-weight : bold; display : inline-block; }
+	body { margin : 16px; }
+	#message { color : red; }
+	fieldset { border-width : 0px; }
+	fieldset label { width : 250px; font-weight : bold; display : inline-block; }
+	.CodeMirror {
+	   width : 600px;
+	   height : 300px;
+	   font-size : 13px;
+	   border : 1px solid #ccc;
+	}
 </style>
 
-<h1>Options</h1>
-
 <form method="post" id="options_form">
 <fieldset>
 	<label>Proxy URL:</label>
-	<input name="url" required="required" placeholder="example.org:1080"></input>
+	<input id="url" name="url" required="required" placeholder="example.org:1080"></input>
 </fieldset>
 
 <fieldset>
 	<label>Login:</label>
-	<input name="login" required="required"></input>
+	<input id="login" name="login" required="required"></input>
 </fieldset>
 
 <fieldset>
 	<label>Password:</label>
-	<input name="password" type="password" required="required"></input>
+	<input id="password" name="password" type="password" required="required"></input>
 </fieldset>
 
-<p><textarea cols="60" rows="10" name="whitelist"></textarea></p>
-
-<ul>
-	<li>example.com - exact match</li>
-	<li>.example.com - include subdomains</li>
-</ul>
+<p><textarea id="whitelist" cols="60" rows="10" name="whitelist"></textarea></p>
 
 <p><button type="submit">Save</button> <span id="message"></span></p>
 

+ 31 - 21
options.js

@@ -1,41 +1,51 @@
-function save() {
-	var form = $("options_form");
-	var settings = form.serialize(true);
+$(document).on("ready", function() {
+	var editor;
 
-	localStorage.settings = JSON.stringify(settings);
+	$("#options_form").on("submit", function() {
 
-	chrome.storage.sync.set({'settings' : settings}, function() {
-		console.log("settings saved");
-	});
+		var settings_arr = $("#options_form").serializeArray();
+		var settings = {};
+
+		$.each(settings_arr, (i,a) => {
+			settings[a.name] = a.value;
+		});
 
-	$("message").innerHTML = "Data saved.";
+		settings['whitelist'] = editor.getValue();
 
-	set_proxy();
+		console.log("settings", settings);
 
-	return false;
-}
+		localStorage.settings = JSON.stringify(settings);
 
-window.onload = function() {
+		chrome.storage.sync.set({'settings' : settings}, function() {
+			console.log("settings saved");
+		});
 
-	var form = $("options_form");
+		$("#message").html("Data saved.");
 
-	console.log("init options form: " + form);
+		set_proxy();
 
-	form.onsubmit = function() { return save(); }
+		return false;
+	});
 
 	var settings;
 
 	try {
 		settings = JSON.parse(localStorage.settings);
 
-
-		form.url.value = settings.url;
-		form.login.value = settings.login;
-		form.password.value = settings.password;
-		form.whitelist.value = settings.whitelist;
+		$("#url").val(settings.url);
+		$("#login").val(settings.login);
+		$("#password").val(settings.password);
+		$("#whitelist").val(settings.whitelist);
 
 	} catch (e) {
 		console.warn(e);
 	}
 
-};
+	$("#whitelist").attr("placeholder", "example.com - exact match\n.example.com - include subdomains");
+
+	editor = CodeMirror.fromTextArea($("#whitelist")[0],
+      {
+         lineNumbers: 1,
+      });
+
+});