diff options
Diffstat (limited to 'data/extensions/tortm-browser-button@jeremybenthum')
35 files changed, 900 insertions, 0 deletions
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/META-INF/manifest.mf b/data/extensions/tortm-browser-button@jeremybenthum/META-INF/manifest.mf new file mode 100644 index 0000000..5df17b9 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/META-INF/manifest.mf @@ -0,0 +1,194 @@ +Manifest-Version: 1.0 + +Name: manifest.json +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: uReYkZ3RZlpu46VZXRQBsw== +SHA1-Digest: xAnsWnlavSZ7fD8uJ7inUlFlFFc= +SHA256-Digest: KwOHx+dWiCWtC0poc6kRhCmCGn+bTjvNR5+CWnLruxI= + +Name: data/icons/CHECK/128.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: D8kU9KUq3CN1gQx7L9hZ4g== +SHA1-Digest: eiVPuPV7i7bgETL3yTtKkEzeK6Y= +SHA256-Digest: U3qPy9zZLCYsM2wtbCeBoWJcNoq7OQ5wlZDAqnxn1YA= + +Name: data/icons/CHECK/16.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: AJd8XKJ+9T1YNVFRfXo5pw== +SHA1-Digest: c0foAU6nLARQk28kmzrPMrnRj6g= +SHA256-Digest: /A3c5KhLKF88znB9pdeAxVMkf7Pbyg3hVW+fJLRcKDo= + +Name: data/icons/CHECK/32.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: q6RE+4s8QTEMOI0TuY12xg== +SHA1-Digest: i8lN7tNFErTXTfunq7PW44BTquo= +SHA256-Digest: GGM8LU4ruq2R3hrUNNmlLUJpVLGQqyeQfp58dJ72QpM= + +Name: data/icons/CHECK/48.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: APSu1C+NeIITygLOWux/9w== +SHA1-Digest: 1vc3cx3fKQ8rgKQmxvlsvzBS4XA= +SHA256-Digest: kIuIYbD0yDUSHI45KOkD6IpZbeRqXC8q+n7GmE3J9Ow= + +Name: data/icons/CHECK/64.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: j3Ho+C7ovmU7NlHIwIR6Pw== +SHA1-Digest: mc3p1OtoaNDHFjJmNDnAesR8Hic= +SHA256-Digest: 6LPVe2TwO2eRLHYVcbNn8DSQ6x9vW0aR+8vLl3lrffE= + +Name: data/icons/OFF/128.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: j+Y005j3tN5iM44UcJ8fmw== +SHA1-Digest: tNFsWto8ApnDOY+p06fIbbrj4Hw= +SHA256-Digest: IoNgJobZpdSYJOe6XQtTjLW8rbmMezRGmKD60p83vcY= + +Name: data/icons/OFF/16.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: eryxy3UUULrB4y4JJ9nUwA== +SHA1-Digest: UzqJc9Uv4Bwam4XBZbWfFaonirk= +SHA256-Digest: Iz44OGDIdzbf9CmT6ngtGy8XXhRsCQm3XGIYvvgegWE= + +Name: data/icons/OFF/32.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: A5j2OAyMMK24U0b4r+GAVw== +SHA1-Digest: VZQLxvwdPOpE5IkpEKPGxmQXWEA= +SHA256-Digest: GnlEjsl+UbGm+2zRiCa/Fv7zrtoZioB0jzXTXVajXm4= + +Name: data/icons/OFF/48.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: QBVyQhsCRvDa8edfaJIfZQ== +SHA1-Digest: AzRw/2QELufK3CfmXm9dHkptUHk= +SHA256-Digest: 0z0/aS5NvuOpUj1Cq4FpsaWehmHrIknA0g8qnNp9jZs= + +Name: data/icons/OFF/64.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: RrEJy3Bsl/kYVmJvfI2LvQ== +SHA1-Digest: 518H08RDqJilEjSDC9G7ZySVniw= +SHA256-Digest: utwSx3OVDKMnrqIZcS8DKTTX3QQfd8SkbBqnXrcJQ7I= + +Name: data/icons/ON/128.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: phIt0Dm+yzHkQHZL20d5fg== +SHA1-Digest: 4ElX+BAvT+Lce/ZrY3zC6w6SyTU= +SHA256-Digest: zcB/5fE0pk3kPtcNNfRrlbGTqZJjRZvRArfv03p02wY= + +Name: data/icons/ON/16.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: CWeEo1+lzW/HdoLpKvFnYQ== +SHA1-Digest: KO2laaSmv3zL8QCBYMT4TAKwgj4= +SHA256-Digest: X7/nlX+nDG+p4bGhzKf6O9aF/kFBnqbGFTe5hMwCnSU= + +Name: data/icons/ON/32.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: Jl5sX0IZPXhP8lj+McDsOg== +SHA1-Digest: ymopnBs0qZmNEoTtRyl4jxtLTH0= +SHA256-Digest: f1lrKMhtUQQ7Uja4WMxyPg/FHIXu0naK3hYcTt18FXQ= + +Name: data/icons/ON/48.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: Cx6Yot+xkNF0fkMASS+dQg== +SHA1-Digest: e1UYIbBTPey5FZURov0/oB/cs2k= +SHA256-Digest: ggrXfyUGukWPsFSJEBn7h+vRPlP3eMniyjhZ26okhDY= + +Name: data/icons/ON/64.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: L3KTtG64W7JZysEZ7g0Npw== +SHA1-Digest: kqNCkEjLGFgDY+f94cPEMFCGa2A= +SHA256-Digest: K6XG2P6GVU7IgNbfjYtTt7ApngElAw9CteMbTFUSxXM= + +Name: data/popup/check.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: 9jmSrZT2ZeaKm/OnSsnYYg== +SHA1-Digest: xO6PMc5SfU0X/p4lwo6lGC2JnsI= +SHA256-Digest: ZBbbaLdEDTbvabulVrxyupcMqqm1H7RSMmhKfgnvtnU= + +Name: data/popup/install.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: Q4MStqgKY+yl17VWJKtqlQ== +SHA1-Digest: /cVbJCxpPKjkAjgYk3A3753DqWM= +SHA256-Digest: TIMIjE5DFcYqmmwW8G3LtV++0HVy1Rw3U2lJ5sAGv2s= + +Name: data/popup/popup.css +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: Gg6o2AmWdfMEy7+zT+zGKg== +SHA1-Digest: 4L+t0TbiQE14bZbD7OLXwPbgIak= +SHA256-Digest: hDLiRwY7O0+C+uRxnG24DE9x5pMNgt+6BGhquh1aQCQ= + +Name: data/popup/popup.html +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: prOMrcJET4XbPKdyLgunuA== +SHA1-Digest: lwWyD0khCDN+0uPC/t3Wjx4PTAs= +SHA256-Digest: PcCJxWEvgxxxhUPKBkDUUNLjVDx1J8FYSTKQdQdeRUw= + +Name: data/popup/popup.js +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: GPF0/5RYnraUPkZr4f7MTQ== +SHA1-Digest: BfKEOFJBeRYP/g/1T7pNu3CATIs= +SHA256-Digest: F4Pw+gk1quVnejpVb4IIQCaDaYzBY8kQIfSTdaAlqPQ= + +Name: data/popup/start.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: MoUdJGsLAgs1uNCqXrngDA== +SHA1-Digest: NZirTlj3XdT1mPhYH4d+HHHvzdY= +SHA256-Digest: h21vM/LhMi9PstqPuSk2tNzaxOEChra563g8HUhdpMw= + +Name: data/popup/stop.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: j+Y005j3tN5iM44UcJ8fmw== +SHA1-Digest: tNFsWto8ApnDOY+p06fIbbrj4Hw= +SHA256-Digest: IoNgJobZpdSYJOe6XQtTjLW8rbmMezRGmKD60p83vcY= + +Name: data/popup/support.png +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: 3QSR6Tt/apbToFZNpn7+wA== +SHA1-Digest: duMJd5BRwn/cB6HijYtIOtmCWjE= +SHA256-Digest: /7jC53oICGsmkNQuofi5NdGcwPanQmyiNVxIHIdhR/U= + +Name: data/popup/explore/explore.css +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: +1juR96F5tSsiHonApi9qg== +SHA1-Digest: gSUrxuQOgDkxFV/A/17Gsz4QhdY= +SHA256-Digest: HWCkA7Z9mvYy+mza3c1NMuedxOFaetZ/x9TryNMFKvA= + +Name: data/popup/explore/explore.js +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: UM08EGo5d6qYJJilMPG0Hw== +SHA1-Digest: oFExHCb6yRFKvCXRX1fvsyz9Uw4= +SHA256-Digest: 3v629PgnzXge2u2pz1WXqe/yu0lGE/YNvYhgqcXCj48= + +Name: data/popup/explore/explore.json +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: xWxAwbuPF13Yc42DZrBrMA== +SHA1-Digest: Jnwz4yqNUGP+khQVJj9XViL+cDs= +SHA256-Digest: WQtHUPEZfCsjsbq/LEWUCC7q4HPmArwvwmNvm13PMUk= + +Name: lib/common.js +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: AEKeDFgioFyjruXMpggvvQ== +SHA1-Digest: kCI7ZqVVFMRZaXm5Zi3v/QPEPhU= +SHA256-Digest: V7XcIEregLRnpvncMGdIUE8lB6a1AQpF9v6z1KQhmdg= + +Name: lib/config.js +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: kivr3IZ2Cft3kyxlJxiwXw== +SHA1-Digest: ivREi81aPkzKc6aUz9T3I4EQVQc= +SHA256-Digest: XjtfWsa0tq+vc0ayKK6rB2teKq9v/zrf00HdsAwHhq4= + +Name: lib/proxy.js +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: e82v+unfZSakdwqOvAhHlQ== +SHA1-Digest: 4v2X/afLFhFDKBvLDi4KeEV9KEc= +SHA256-Digest: HLm4Vo/1mT6z7gdzr5UQRLQSPEOvf3asqKP8R0aIFsY= + +Name: lib/chrome/background.html +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: Lp4NcR//zN+TrduYIpwMAw== +SHA1-Digest: csd3attFBm8wL87EeHNeOEMzN3s= +SHA256-Digest: v1+fkVNX+9Ad6z1v5DwZtr1sb1FiIgpop3GsZYRU9Zw= + +Name: lib/chrome/chrome.js +Digest-Algorithms: MD5 SHA1 SHA256 +MD5-Digest: QbgDg1ioqN1x612Mr1tZSA== +SHA1-Digest: 7NSS4mcsknFNqeECe5mUNPG/j2o= +SHA256-Digest: V5XNINaIRHJuimd8gjlmA2IEJUc8QNg6FhjEDfQJyxo= + diff --git a/data/extensions/tortm-browser-button@jeremybenthum/META-INF/mozilla.rsa b/data/extensions/tortm-browser-button@jeremybenthum/META-INF/mozilla.rsa Binary files differnew file mode 100644 index 0000000..f65dae1 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/META-INF/mozilla.rsa diff --git a/data/extensions/tortm-browser-button@jeremybenthum/META-INF/mozilla.sf b/data/extensions/tortm-browser-button@jeremybenthum/META-INF/mozilla.sf new file mode 100644 index 0000000..934e43c --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/META-INF/mozilla.sf @@ -0,0 +1,5 @@ +Signature-Version: 1.0 +MD5-Digest-Manifest: rfitDzxxCuMOMJhvV+KxzQ== +SHA1-Digest-Manifest: /jdv6zPpOEgJB/iE47abdCi5zPs= +SHA256-Digest-Manifest: xVLa3BpwnJ33no21YvY3mHgS87fB9d9Iz1GxrgjfKIA= + diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/128.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/128.png Binary files differnew file mode 100644 index 0000000..a18c694 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/128.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/16.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/16.png Binary files differnew file mode 100644 index 0000000..24b17e8 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/16.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/32.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/32.png Binary files differnew file mode 100644 index 0000000..fd33eb0 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/32.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/48.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/48.png Binary files differnew file mode 100644 index 0000000..42a6f48 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/48.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/64.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/64.png Binary files differnew file mode 100644 index 0000000..bfaf9c6 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/CHECK/64.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/128.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/128.png Binary files differnew file mode 100644 index 0000000..ccbde0a --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/128.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/16.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/16.png Binary files differnew file mode 100644 index 0000000..92ebe53 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/16.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/32.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/32.png Binary files differnew file mode 100644 index 0000000..f38af57 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/32.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/48.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/48.png Binary files differnew file mode 100644 index 0000000..7bd8d0c --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/48.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/64.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/64.png Binary files differnew file mode 100644 index 0000000..8cdf213 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/OFF/64.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/128.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/128.png Binary files differnew file mode 100644 index 0000000..4ca1d90 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/128.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/16.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/16.png Binary files differnew file mode 100644 index 0000000..d202ec1 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/16.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/32.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/32.png Binary files differnew file mode 100644 index 0000000..2c7641e --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/32.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/48.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/48.png Binary files differnew file mode 100644 index 0000000..6eac6c8 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/48.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/64.png b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/64.png Binary files differnew file mode 100644 index 0000000..f8ebea5 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/icons/ON/64.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/check.png b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/check.png Binary files differnew file mode 100644 index 0000000..be86078 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/check.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.css b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.css new file mode 100644 index 0000000..42a12ad --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.css @@ -0,0 +1,119 @@ +#explore {
+ padding: 0;
+ color: #555;
+ min-height: 17px;
+ position: relative;
+ box-sizing: border-box;
+ background: transparent;
+}
+
+#explore span {
+ user-select: none;
+ vertical-align: middle;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+}
+
+#explore[data-loaded=true] {
+ border: 0;
+ padding: 3px;
+ font-size: 12px;
+ background: #FFF;
+ margin: 3px 0 0 0;
+ font-family: arial, sans-serif;
+}
+
+#explore .container {
+ border: 0;
+ width: 100%;
+ margin: auto;
+ margin-top: 10px;
+ border-spacing: 0;
+ table-layout: fixed;
+}
+
+#explore .container tr td {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ padding: 0 1px;
+}
+
+#explore .explore {
+ right: 0;
+ margin: 0;
+ padding: 0 7px;
+ font-size: 14px;
+ cursor: pointer;
+ z-index: 1000000;
+ line-height: 17px;
+ position: absolute;
+ color: rgba(0,0,0,0.6);
+}
+
+#explore .close {
+ top: 3px;
+ right: 3px;
+ cursor: pointer;
+ font-size: 11px;
+ padding: 1px 8px;
+ position: absolute;
+ background-color: transparent;
+}
+
+#explore a {
+ border: 0;
+ margin: 0;
+ color: #333;
+ padding: 3px;
+ display: flex;
+ text-align: center;
+ align-items: center;
+ text-decoration: none;
+ justify-content: center;
+}
+
+#explore .icon {
+ margin: 0;
+ padding: 0;
+ width: 24px;
+ color: #FFF;
+ height: 24px;
+ font-size: 11px;
+ min-width: 24px;
+ line-height: 24px;
+ text-align: center;
+ font-weight: normal;
+ display: inline-block;
+ font-family: arial, sans-serif;
+}
+
+#explore .spacer {
+ border-left: solid 1px rgba(0,0,0,0.2) !important;
+}
+
+#explore .name {
+ padding: 0;
+ overflow: hidden;
+ margin: 0 0 0 5px;
+ font-weight: normal;
+ white-space: nowrap;
+ display: inline-block;
+ text-overflow: ellipsis;
+ font-family: arial, sans-serif;
+}
+
+#explore a, #explore .close, #explore .explore {
+ transition: 300ms ease all;
+ -moz-transition: 300ms ease all;
+ -webkit-transition: 300ms ease all;
+}
+
+#explore .close:hover {
+ color: #FFF;
+ background-color: #C75050;
+}
+
+#explore a:hover, #explore .explore:hover {
+ background-color: rgba(0,0,0,0.03);
+}
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.js b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.js new file mode 100644 index 0000000..339ba0d --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.js @@ -0,0 +1,115 @@ +{ + const INC = 50; + const SORT = localStorage.getItem('explore-sort') ? Number(localStorage.getItem('explore-sort')) : 1; + const COUNT = localStorage.getItem('explore-count') ? Number(localStorage.getItem('explore-count')) : (INC - 5); + + var randcolor = function () { + var color = [ + "#D92121", "#E77200", "#5E8C31", "#00755E", "#C7A00F", + "#0066FF", "#3F26BF", "#733380", "#BB3385", "#E30B5C", + "#CA3435", "#87421F", "#299617", "#E936A7", "#DB91EF", + "#214FC6", "#B56917", "#BB3385", "#652DC1", "#02A4D3" + ]; + /* */ + return color[Math.floor(Math.random() * color.length)]; + }; + + const cload = () => fetch("explore/explore.json").then(r => r.json()).then(build); + + const shuffle = function (a) { + for (let i = a.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [a[i], a[j]] = [a[j], a[i]]; + } + /* */ + return a; + }; + + const explore = () => { + const root = document.getElementById('explore'); + const span = document.createElement('span'); + span.textContent = '◱'; + span.title = 'Explore more'; + span.classList.add('explore'); + root.appendChild(span); + span.onclick = () => { + root.textContent = ''; + localStorage.setItem('explore-count', INC); + cload(); + }; + }; + + const build = json => { + if (json.length === 0) return; + /* */ + if (SORT % 4 === 0) { + json = shuffle(json); + localStorage.setItem('explore-sort', 1); + localStorage.setItem('explore-json', JSON.stringify(json)); + } else { + localStorage.setItem('explore-sort', SORT + 1); + json = localStorage.getItem('explore-json') ? JSON.parse(localStorage.getItem('explore-json')) : json; + } + /* */ + const root = document.getElementById('explore'); + root.textContent = 'Explore more'; + root.dataset.loaded = true; + /* */ + const table = document.createElement('table'); + const span = document.createElement('span'); + const tr = document.createElement('tr'); + /* */ + table.setAttribute("class", "container"); + span.classList.add('close'); + span.textContent = '✕'; + /* */ + span.onclick = () => { + root.textContent = ''; + root.dataset.loaded = false; + localStorage.setItem("explore-count", 0); + explore(); + }; + /* */ + root.appendChild(span); + table.appendChild(tr); + root.appendChild(table); + /* */ + const n = Math.floor(parseInt(window.getComputedStyle(document.body).width) / 151) || 3; + json.slice(0, (n > 5 ? 5 : n)).forEach(({id, title}, index) => { + if (id && title) { + const a = document.createElement('a'); + const td = document.createElement('td'); + const short = chrome.runtime.getManifest().short_name; + const homepage = chrome.runtime.getManifest().homepage_url; + const url = homepage.split('/').slice(0, -1).join('/') + '/'; + a.href = url + id + ".html?context=explore&from=" + short; + a.target = '_blank'; + /* */ + const icon = document.createElement('span'); + icon.textContent = title.replace(' -', '').split(' ').map(e => e[0]).slice(0, 2).join('').toUpperCase(); + icon.style.backgroundColor = randcolor(); + icon.setAttribute("class", "icon"); + a.appendChild(icon); + /* */ + const name = document.createElement('span'); + name.setAttribute("class", "name"); + name.textContent = title; + a.appendChild(name); + /* */ + if (index) td.setAttribute("class", "spacer"); + td.appendChild(a); + tr.appendChild(td); + } + }); + }; + + if (COUNT >= INC) { + if (COUNT < INC + 4) cload(); else explore(); + /* */ + if (COUNT > INC + 5) localStorage.setItem('explore-count', INC); + else localStorage.setItem('explore-count', COUNT + 1); + } else { + explore(); + localStorage.setItem('explore-count', COUNT + 1); + } +} diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.json b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.json new file mode 100644 index 0000000..1d65463 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/explore/explore.json @@ -0,0 +1,8 @@ +[ + {"id": "smart-https", "title": "Smart HTTPS"}, + {"id": "cache-cleaner", "title": "Cache Cleaner"}, + {"id": "webrtc-control", "title": "WebRTC Control"}, + {"id": "policy-control-wext", "title": "Policy Control"}, + {"id": "privacy-guard", "title": "Privacy Guard & Manager"}, + {"id": "block-miners", "title": "NoMiner - Block Coin Miners"} +] diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/install.png b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/install.png Binary files differnew file mode 100644 index 0000000..7fb7136 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/install.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.css b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.css new file mode 100644 index 0000000..4a94994 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.css @@ -0,0 +1,90 @@ +body {
+ border: 0;
+ margin: 0;
+ padding: 0;
+ width: 455px;
+ overflow: hidden;
+}
+
+table tr td {
+ padding: 0;
+ text-align: center;
+ transition: 300ms ease all;
+ font-family: arial, sans-serif;
+ -moz-transition: 300ms ease all;
+ -webkit-transition: 300ms ease all;
+}
+
+p {
+ padding: 10px;
+ margin: 3px 0;
+ color: #7c4698;
+ text-align: center;
+ border-bottom: solid 1px rgba(0,0,0,0.1);
+}
+
+.content {
+ width: 100%;
+ height: 100%;
+}
+
+.controls, .footer {
+ width: 100%;
+ font-size: 12px;
+ border-spacing: 0;
+}
+
+.controls {
+ height: 100%;
+ table-layout: fixed;
+}
+
+.footer {
+ height: 36px;
+ border-top: solid 1px rgba(0,0,0,0.1);
+ border-bottom: solid 1px rgba(0,0,0,0.1);
+}
+
+#check {background: url(check.png) no-repeat center center}
+#support {background: url(support.png) no-repeat center center}
+#install {background: url(install.png) no-repeat center center}
+
+#check, #support, #install {
+ background-size: 22px;
+ cursor: pointer;
+ width: 48px;
+}
+
+#status {
+ height: 36px;
+ color: #58316b;
+ font-weight: bold;
+ user-select: none;
+ text-align: center;
+}
+
+#ON, #OFF {
+ height: 90px;
+ cursor: pointer;
+ border-bottom: solid 1px transparent;
+}
+
+#ON {background: url(start.png) no-repeat center center}
+#OFF {background: url(stop.png) no-repeat center center}
+#ON[type="active"], #OFF[type="active"] {border-bottom: solid 1px #7c4698}
+#ON, #OFF {background-size: 64px}
+
+#whitelist {
+ border: 0;
+ height: 60px;
+ margin: 0 auto;
+ width: calc(100% - 10px);
+}
+
+#ON:hover,
+#OFF:hover,
+#check:hover,
+#install:hover,
+#support:hover {
+ background-color: rgba(0,0,0,0.05) !important;
+}
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.html b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.html new file mode 100644 index 0000000..f70b656 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.html @@ -0,0 +1,35 @@ +<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="UTF-8">
+ <link rel="stylesheet" type="text/css" href="popup.css"/>
+ <link rel="stylesheet" type="text/css" href="explore/explore.css"/>
+ </head>
+ <body>
+ <div class="content">
+ <table class="controls">
+ <tr>
+ <td title="Connect to TOR proxy" id="ON"></td>
+ <td title="Disconnect from TOR proxy" id="OFF"></td>
+ </tr>
+ <tr><td colspan=2><p class="description">Do not use TOR for the following addresses (comma separated)</p></td></tr>
+ <tr><td colspan=2><textarea id="whitelist" placeholder="i.e. <local>, foobar.com, *foobar.com, *.foobar.com, *foobar.com:99, https://x.*.y.com:99"></textarea></td></tr>
+ <tr>
+ <td colspan=2>
+ <table class="footer">
+ <tr>
+ <td id="status">Tor Browser Button</td>
+ <td id="install" title="Open github repo to get TOR patch files"></td>
+ <td id="check" title="Check tor connection via: check.torproject.org"></td>
+ <td id="support" title="Open support page"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="explore"></div>
+ <script async src="explore/explore.js"></script>
+ <script src="popup.js"></script>
+ </body>
+</html>
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.js b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.js new file mode 100644 index 0000000..54aadfa --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/popup.js @@ -0,0 +1,46 @@ +var background = (function () {
+ var _tmp = {};
+ chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
+ for (var id in _tmp) {
+ if (_tmp[id] && (typeof _tmp[id] === "function")) {
+ if (request.path == 'background-to-popup') {
+ if (request.method === id) _tmp[id](request.data);
+ }
+ }
+ }
+ });
+ /* */
+ return {
+ "receive": function (id, callback) {_tmp[id] = callback},
+ "send": function (id, data) {chrome.runtime.sendMessage({"path": 'popup-to-background', "method": id, "data": data})}
+ }
+})();
+
+var load = function () {
+ var whitelist = document.getElementById("whitelist");
+ document.addEventListener("click", function (e) {
+ var id = e.target ? e.target.getAttribute("id") : null;
+ if (id && id !== "whitelist") background.send("popup-data", {"name": id});
+ });
+ /* */
+ whitelist.addEventListener("change", function (e) {
+ var value = e.target ? e.target.value : '';
+ background.send("popup-data", {"name": "bypassList", "whitelist": value});
+ });
+ /* */
+ background.send("load");
+ window.removeEventListener("load", load, false);
+};
+
+window.addEventListener("load", load, false);
+
+background.receive("tor-data", function (e) {
+ document.getElementById("status").textContent = e.log;
+ document.getElementById("whitelist").value = e.whitelist;
+ if (e.id === "CHECK") e.id = "ON";
+ if (e.id === "ON" || e.id === "OFF") {
+ document.getElementById("ON").removeAttribute("type");
+ document.getElementById("OFF").removeAttribute("type");
+ document.getElementById(e.id).setAttribute("type", "active");
+ }
+});
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/start.png b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/start.png Binary files differnew file mode 100644 index 0000000..3a7e0cb --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/start.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/stop.png b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/stop.png Binary files differnew file mode 100644 index 0000000..ccbde0a --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/stop.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/data/popup/support.png b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/support.png Binary files differnew file mode 100644 index 0000000..fb00268 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/data/popup/support.png diff --git a/data/extensions/tortm-browser-button@jeremybenthum/lib/chrome/background.html b/data/extensions/tortm-browser-button@jeremybenthum/lib/chrome/background.html new file mode 100644 index 0000000..12a37a9 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/lib/chrome/background.html @@ -0,0 +1,9 @@ +<!DOCTYPE html>
+<html>
+ <head><meta charset="utf-8"></head>
+ <body>
+ <script src="../proxy.js"></script>
+ <script src="../config.js"></script>
+ <script src="chrome.js"></script>
+ </body>
+</html>
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/lib/chrome/chrome.js b/data/extensions/tortm-browser-button@jeremybenthum/lib/chrome/chrome.js new file mode 100644 index 0000000..14491f7 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/lib/chrome/chrome.js @@ -0,0 +1,49 @@ +var app = {};
+
+app.button = {set icon (o) {chrome.browserAction.setIcon(o)}};
+app.version = function () {return chrome.runtime.getManifest().version};
+app.homepage = function () {return chrome.runtime.getManifest().homepage_url};
+app.tab = {"open": function (url) {chrome.tabs.create({"url": url, "active": true})}};
+if (chrome.runtime.setUninstallURL) chrome.runtime.setUninstallURL(app.homepage() + "?v=" + app.version() + "&type=uninstall", function () {});
+
+app.storage = (function () {
+ var objs = {};
+ window.setTimeout(function () {
+ chrome.storage.local.get(null, function (o) {
+ objs = o;
+ var script = document.createElement("script");
+ script.src = "../common.js";
+ document.body.appendChild(script);
+ });
+ }, 300);
+ /* */
+ return {
+ "read": function (id) {return objs[id]},
+ "write": function (id, data) {
+ var tmp = {};
+ objs[id] = data;
+ tmp[id] = data;
+ chrome.storage.local.set(tmp, function () {});
+ }
+ }
+})();
+
+app.popup = (function () {
+ var _tmp = {};
+ chrome.runtime.onMessage.addListener(function (request, sender, sendResponse) {
+ for (var id in _tmp) {
+ if (_tmp[id] && (typeof _tmp[id] === "function")) {
+ if (request.path === 'popup-to-background') {
+ if (request.method === id) _tmp[id](request.data);
+ }
+ }
+ }
+ });
+ /* */
+ return {
+ "receive": function (id, callback) {_tmp[id] = callback},
+ "send": function (id, data, tabId) {
+ chrome.runtime.sendMessage({"path": 'background-to-popup', "method": id, "data": data});
+ }
+ }
+})();
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/lib/common.js b/data/extensions/tortm-browser-button@jeremybenthum/lib/common.js new file mode 100644 index 0000000..d631376 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/lib/common.js @@ -0,0 +1,96 @@ +window.setTimeout(function () {
+ var version = config.welcome.version;
+ if (!version) {
+ app.tab.open(app.homepage() + "?v=" + app.version() + "&type=install");
+ config.welcome.version = app.version();
+ }
+}, 3000);
+
+var popupsend = function () {
+ tor.icon(tor.id);
+ app.popup.send("tor-data", {
+ "id": tor.id,
+ "log": tor.log,
+ "whitelist": config.addon.whitelist
+ });
+};
+
+var setproxy = function (callback) {
+ if (tor.id === "OFF") chrome.proxy.settings.set({"scope": "regular", "value": {"mode": "system"}}, callback);
+ else chrome.proxy.settings.set({
+ "scope": "regular",
+ "value": {
+ "mode": "fixed_servers",
+ "rules": {
+ "bypassList": tor.bypassList,
+ "singleProxy": {"scheme": "socks5", "host": "127.0.0.1", "port": 9050}
+ }
+ }
+ }, callback);
+};
+
+var tor = {
+ "id": "OFF",
+ "bypassList": [],
+ "log": "Tor Browser Button",
+ "update": function () {
+ if (config.addon.state === "ON") {
+ tor.once(function () {
+ var url = config.addon.check + "?t=" + new Date().getTime() + "&r=" + Math.round(Math.random() * 10000);
+ config.request(url, function (e) {
+ if (e === "ok") config.addon.state === "ON" ? tor.start() : tor.stop();
+ else {
+ tor.stop();
+ config.notifications.create("TOR is NOT running. Please connect your computer to TOR network and try again.");
+ }
+ });
+ });
+ } else tor.stop();
+ },
+ "stop": function () {
+ tor.id = "OFF";
+ tor.log = "TOR proxy is disabled";
+ setproxy(popupsend);
+ },
+ "start": function () {
+ tor.id = "ON";
+ tor.log = "Connected to 127.0.0.1:9050";
+ config.notifications.create("TOR is running. Connected to 127.0.0.1:9050");
+ tor.bypassList = config.addon.whitelist ? config.addon.whitelist.split(',') : [];
+ setproxy(popupsend);
+ },
+ "once": function (callback) {
+ tor.id = "CHECK";
+ tor.log = "Checking tor proxy connection...";
+ tor.bypassList = config.addon.whitelist ? config.addon.whitelist.split(',') : [];
+ setproxy(function () {window.setTimeout(function () {callback(true)}, 300)});
+ popupsend();
+ },
+ "icon": function (state) {
+ app.button.icon = {
+ "path": {
+ "16": '../../data/icons/' + state + '/16.png',
+ "32": '../../data/icons/' + state + '/32.png',
+ "48": '../../data/icons/' + state + '/48.png',
+ "64": '../../data/icons/' + state + '/64.png'
+ }
+ };
+ }
+};
+
+app.popup.receive("popup-data", function (e) {
+ if (e.name === "support") app.tab.open(app.homepage());
+ if (e.name === "check") app.tab.open(config.addon.check);
+ if (e.name === "install") app.tab.open(config.addon.github);
+ if (e.name === "bypassList") {
+ config.addon.whitelist = e.whitelist;
+ tor.update();
+ }
+ if (e.name === "ON" || e.name === "OFF") {
+ config.addon.state = e.name;
+ tor.update();
+ }
+});
+
+window.setTimeout(tor.update, 0);
+app.popup.receive("load", popupsend);
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/lib/config.js b/data/extensions/tortm-browser-button@jeremybenthum/lib/config.js new file mode 100644 index 0000000..37aeaf5 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/lib/config.js @@ -0,0 +1,45 @@ +var config = {};
+
+config.welcome = {
+ get version () {return app.storage.read("version")},
+ set version (val) {app.storage.write("version", val)}
+};
+
+config.addon = {
+ "check": "https://check.torproject.org/",
+ set state (val) {app.storage.write("state", val)},
+ set whitelist (val) {app.storage.write("whitelist", val)},
+ get whitelist () {return app.storage.read("whitelist") || ''},
+ "github": "https://github.com/jeremy-jr-benthum/tor-button/releases",
+ get state () {return app.storage.read("state") !== undefined ? app.storage.read("state") : "OFF"}
+};
+
+config.request = function (url, callback) {
+ var xhr = new XMLHttpRequest(); + try {
+ xhr.onload = function () {xhr.status >= 200 && xhr.status < 304 ? callback("ok") : callback("error")};
+ xhr.open("HEAD", url, true);
+ xhr.onerror = function () {callback("error")};
+ xhr.ontimeout = function () {callback("error")};
+ xhr.send('');
+ } catch (e) {callback("error")}
+};
+
+config.notifications = (function () {
+ chrome.notifications.onClosed.addListener(function () {config.notifications.id = ''});
+ chrome.notifications.onClicked.addListener(function (id) {if (id === config.notifications.id) app.tab.open(app.homepage() + "#faq")});
+ /* */
+ return {
+ "id": '',
+ "create": function (message) {
+ var iconUrl = /Firefox/.test(navigator.userAgent) ? "data/icons/ON/64.png" : chrome.runtime.getURL("data/icons/ON/64.png");
+ var o = {"message": message, "type": "basic", "title": "Tor Browser Button", "iconUrl": iconUrl};
+ if (config.notifications.id) {
+ if (chrome.notifications.update) {
+ return chrome.notifications.update(config.notifications.id, o, function () {});
+ }
+ }
+ return chrome.notifications.create(o, function (id) {config.notifications.id = id});
+ }
+ }
+})();
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/lib/proxy.js b/data/extensions/tortm-browser-button@jeremybenthum/lib/proxy.js new file mode 100644 index 0000000..a8e3748 --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/lib/proxy.js @@ -0,0 +1,56 @@ +if (/Firefox/.test(navigator.userAgent)) {
+ chrome.proxy = {"settings": {}};
+ chrome.proxy.convert = {
+ "to": ({value}) => {
+ const mode = value.mode;
+ const settings = {
+ "autoLogin": value.noPrompt,
+ "proxyDNS": value.remoteDNS,
+ "autoConfigUrl": mode === 'pac_script' ? value.pacScript.url : '',
+ "socksVersion": mode === 'fixed_servers' && value.rules.singleProxy.scheme === 'socks5' ? 5 : 4,
+ "passthrough": mode === 'fixed_servers' && value.rules.bypassList && value.rules.bypassList.length ? value.rules.bypassList.join(', ') : '',
+ "proxyType": {'direct': 'none', 'system': 'system', 'auto_detect': 'autoDetect', 'fixed_servers': 'manual', 'pac_script': 'autoConfig'}[mode]
+ };
+ /* */
+ if (mode === 'fixed_servers') {
+ const rules = value.rules;
+ const url = ({host, port, scheme}) => {return host && port ? (scheme === "https" ? "https://" : '') + (host.trim().replace(/.*:\/\//, '') + ':' + port) : ''};
+ if (rules.singleProxy.scheme.startsWith('socks')) {
+ settings.http = settings.ssl = settings.ftp = '';
+ settings.socks = url(rules.singleProxy);
+ } else settings.ssl = settings.ftp = settings.http = url(rules.singleProxy);
+ }
+ /* */
+ return {"value": settings};
+ },
+ "from": ({value}) => {
+ const config = {"value": {"remoteDNS": value.proxyDNS, "noPrompt": value.autoLogin}};
+ config.value.mode = {'none': 'direct', 'system': 'system', 'autoDetect': 'auto_detect', 'manual': 'fixed_servers', 'autoConfig': 'pac_script'}[value.proxyType];
+ if (value.proxyType === 'autoConfig' || value.proxyType === 'manual') config.value.rules = {};
+ /* */
+ if (value.proxyType === 'autoConfig') config.value.pacScript = {"url": value.autoConfigUrl};
+ else if (value.proxyType === 'manual') {
+ config.value.rules.bypassList = value.passthrough ? value.passthrough.split(', ') : [];
+ const type = url => {return value.socks ? 'socks' + value.socksVersion : (url.startsWith('https://') ? 'https' : 'http')};
+ const parse = url => {
+ const scheme = type(url);
+ const [host, port] = url.split('://')[0].split(':');
+ return {scheme, host, "port": Number(port)};
+ };
+ /* */
+ config.value.rules.singleProxy = parse(value.http || value.socks);
+ }
+ /* */
+ return config;
+ }
+ };
+ /* */
+ chrome.proxy.settings.clear = (o, callback) => browser.proxy.settings.clear(o).then(callback);
+ chrome.proxy.settings.get = (o, callback) => browser.proxy.settings.get(o).then(e => callback(chrome.proxy.convert.from(e)));
+ chrome.proxy.settings.set = async(o, callback = function () {}) => {
+ const settings = chrome.proxy.convert.to(o);
+ await browser.proxy.settings.clear({});
+ browser.proxy.settings.set(settings);
+ callback();
+ };
+}
diff --git a/data/extensions/tortm-browser-button@jeremybenthum/manifest.json b/data/extensions/tortm-browser-button@jeremybenthum/manifest.json new file mode 100644 index 0000000..2fc6b6d --- /dev/null +++ b/data/extensions/tortm-browser-button@jeremybenthum/manifest.json @@ -0,0 +1,33 @@ +{
+ "version": "0.1.5",
+ "manifest_version": 2,
+ "short_name": "tor-button",
+ "name": "Tor™ Browser Button",
+ "background": {"page": "lib/chrome/background.html"},
+ "homepage_url": "http://mybrowseraddon.com/tor-button.html",
+ "description": "Easily browse the internet using TOR proxy with just one click!",
+ "permissions": ["tabs", "proxy", "storage", "http://*/*", "https://*/*", "notifications"],
+ "applications": {
+ "gecko": {
+ "id": "tortm-browser-button@jeremybenthum",
+ "strict_min_version": "60.0"
+ }
+ },
+ "browser_action": {
+ "default_title": "Tor™ Browser Button",
+ "default_popup": "data/popup/popup.html",
+ "default_icon": {
+ "16": "data/icons/ON/16.png",
+ "32": "data/icons/ON/32.png",
+ "48": "data/icons/ON/48.png",
+ "64": "data/icons/ON/64.png"
+ }
+ },
+ "icons": {
+ "16": "data/icons/ON/16.png",
+ "32": "data/icons/ON/32.png",
+ "48": "data/icons/ON/48.png",
+ "64": "data/icons/ON/64.png",
+ "128": "data/icons/ON/128.png"
+ }
+}
|