From 244b3b498c692c3f68e386488ee72a0e80cd75cc Mon Sep 17 00:00:00 2001 From: intergrav Date: Fri, 10 Jul 2026 22:10:56 -0400 Subject: [PATCH] improvements --- LICENSE | 21 +++++++++ README.md | 17 +++++++ background.js | 37 ++++++++++++--- build.sh | 37 +++++++++++++++ dist/chromium/background.js | 55 +++++++++++++++++++++++ dist/chromium/icon-128.png | Bin 0 -> 1384 bytes dist/chromium/icon-inverted-128.png | Bin 0 -> 1385 bytes dist/chromium/manifest.json | 14 ++++++ dist/chromium/offscreen.html | 4 ++ dist/chromium/offscreen.js | 17 +++++++ dist/firefox/background.js | 55 +++++++++++++++++++++++ dist/firefox/icon-128.png | Bin 0 -> 1384 bytes dist/firefox/icon-inverted-128.png | Bin 0 -> 1385 bytes dist/firefox/manifest.json | 27 +++++++++++ dist/packages/detrack-chromium-1.0.0.zip | Bin 0 -> 5011 bytes dist/packages/detrack-firefox-1.0.0.zip | Bin 0 -> 4491 bytes icon-128.png | Bin 2781 -> 1384 bytes icon-16.png | Bin 384 -> 0 bytes icon-inverted-128.png | Bin 0 -> 1385 bytes icon.svg | 12 +---- manifest.firefox.json | 27 +++++++++++ manifest.json | 8 +--- offscreen.js | 5 +++ store-icon.png | Bin 0 -> 15846 bytes 24 files changed, 312 insertions(+), 24 deletions(-) create mode 100644 LICENSE create mode 100644 README.md create mode 100755 build.sh create mode 100644 dist/chromium/background.js create mode 100644 dist/chromium/icon-128.png create mode 100644 dist/chromium/icon-inverted-128.png create mode 100644 dist/chromium/manifest.json create mode 100644 dist/chromium/offscreen.html create mode 100644 dist/chromium/offscreen.js create mode 100644 dist/firefox/background.js create mode 100644 dist/firefox/icon-128.png create mode 100644 dist/firefox/icon-inverted-128.png create mode 100644 dist/firefox/manifest.json create mode 100644 dist/packages/detrack-chromium-1.0.0.zip create mode 100644 dist/packages/detrack-firefox-1.0.0.zip delete mode 100644 icon-16.png create mode 100644 icon-inverted-128.png create mode 100644 manifest.firefox.json create mode 100644 store-icon.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a4e01f3 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright © 2026 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the “Software”), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..f708514 --- /dev/null +++ b/README.md @@ -0,0 +1,17 @@ +# Detrack + +Extremely simple Chromium/Firefox extension that adds a button to copy the current URL without tracking parameters. + +Has some built in exclusions such as YouTube's `v`. + +## Build + +```sh +./build.sh chromium +./build.sh firefox +./build.sh package +``` + +Load `dist/chromium` in Chromium browsers or `dist/firefox` in Firefox. + +`./build.sh package` creates ZIP files in `dist/packages`. diff --git a/background.js b/background.js index 71629da..636ed8b 100644 --- a/background.js +++ b/background.js @@ -6,6 +6,28 @@ const templates = { "wikipedia.org": ["title", "oldid", "diff"], }; +async function setupOffscreen() { + if (!chrome.offscreen) return; + await chrome.offscreen + .createDocument({ + url: "offscreen.html", + reasons: ["CLIPBOARD", "MATCH_MEDIA"], + justification: + "Copy the current URL and select a toolbar icon for the system theme.", + }) + .catch(() => {}); +} + +chrome.runtime.onInstalled.addListener(setupOffscreen); +chrome.runtime.onStartup.addListener(setupOffscreen); +chrome.runtime.onMessage.addListener(({ type, dark }) => { + if (type === "theme") { + chrome.action.setIcon({ + path: dark ? "icon-inverted-128.png" : "icon-128.png", + }); + } +}); + chrome.action.onClicked.addListener(async (tab) => { if (!tab.url || !/^https?:/.test(tab.url)) return; @@ -21,12 +43,13 @@ chrome.action.onClicked.addListener(async (tab) => { if (template.includes(name)) url.searchParams.append(name, value); } - await chrome.offscreen - .createDocument({ - url: "offscreen.html", - reasons: ["CLIPBOARD"], - justification: "Copy detracked URL when button is clicked", - }) - .catch(() => {}); + if (navigator.clipboard) { + try { + await navigator.clipboard.writeText(url.href); + return; + } catch {} + } + + await setupOffscreen(); await chrome.runtime.sendMessage({ type: "copy", text: url.href }); }); diff --git a/build.sh b/build.sh new file mode 100755 index 0000000..c44ee2b --- /dev/null +++ b/build.sh @@ -0,0 +1,37 @@ +#!/bin/sh +set -eu + +case "${1:-all}" in + chromium) + rm -rf dist/chromium + mkdir -p dist/chromium + cp background.js icon-128.png icon-inverted-128.png manifest.json offscreen.html offscreen.js dist/chromium/ + ;; + firefox) + rm -rf dist/firefox + mkdir -p dist/firefox + cp background.js icon-128.png icon-inverted-128.png dist/firefox/ + cp manifest.firefox.json dist/firefox/manifest.json + ;; + all) + "$0" chromium + "$0" firefox + ;; + package) + "$0" all + rm -rf dist/packages + mkdir -p dist/packages + ( + cd dist/chromium + zip -qr "../packages/detrack-chromium-$(node -p 'require("../../manifest.json").version').zip" . + ) + ( + cd dist/firefox + zip -qr "../packages/detrack-firefox-$(node -p 'require("../../manifest.firefox.json").version').zip" . + ) + ;; + *) + echo "usage: $0 [chromium|firefox|package]" >&2 + exit 1 + ;; +esac diff --git a/dist/chromium/background.js b/dist/chromium/background.js new file mode 100644 index 0000000..636ed8b --- /dev/null +++ b/dist/chromium/background.js @@ -0,0 +1,55 @@ +const templates = { + "youtube.com": ["v", "t", "start", "list", "index"], + "google.com": ["q"], + "bing.com": ["q"], + "duckduckgo.com": ["q"], + "wikipedia.org": ["title", "oldid", "diff"], +}; + +async function setupOffscreen() { + if (!chrome.offscreen) return; + await chrome.offscreen + .createDocument({ + url: "offscreen.html", + reasons: ["CLIPBOARD", "MATCH_MEDIA"], + justification: + "Copy the current URL and select a toolbar icon for the system theme.", + }) + .catch(() => {}); +} + +chrome.runtime.onInstalled.addListener(setupOffscreen); +chrome.runtime.onStartup.addListener(setupOffscreen); +chrome.runtime.onMessage.addListener(({ type, dark }) => { + if (type === "theme") { + chrome.action.setIcon({ + path: dark ? "icon-inverted-128.png" : "icon-128.png", + }); + } +}); + +chrome.action.onClicked.addListener(async (tab) => { + if (!tab.url || !/^https?:/.test(tab.url)) return; + + const url = new URL(tab.url); + const template = + Object.entries(templates).find( + ([domain]) => + url.hostname === domain || url.hostname.endsWith(`.${domain}`), + )?.[1] || []; + const parameters = [...url.searchParams]; + url.search = ""; + for (const [name, value] of parameters) { + if (template.includes(name)) url.searchParams.append(name, value); + } + + if (navigator.clipboard) { + try { + await navigator.clipboard.writeText(url.href); + return; + } catch {} + } + + await setupOffscreen(); + await chrome.runtime.sendMessage({ type: "copy", text: url.href }); +}); diff --git a/dist/chromium/icon-128.png b/dist/chromium/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..7f49eb08389a85ab7fe7fec1f9bd3cf2394438cb GIT binary patch literal 1384 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 + + + diff --git a/dist/chromium/offscreen.js b/dist/chromium/offscreen.js new file mode 100644 index 0000000..a915870 --- /dev/null +++ b/dist/chromium/offscreen.js @@ -0,0 +1,17 @@ +chrome.runtime.sendMessage({ + type: "theme", + dark: matchMedia("(prefers-color-scheme: dark)").matches, +}); + +chrome.runtime.onMessage.addListener( + ({ type, text }, _sender, sendResponse) => { + if (type !== "copy") return; + const textarea = document.createElement("textarea"); + textarea.value = text; + document.body.append(textarea); + textarea.select(); + document.execCommand("copy"); + textarea.remove(); + sendResponse(); + }, +); diff --git a/dist/firefox/background.js b/dist/firefox/background.js new file mode 100644 index 0000000..636ed8b --- /dev/null +++ b/dist/firefox/background.js @@ -0,0 +1,55 @@ +const templates = { + "youtube.com": ["v", "t", "start", "list", "index"], + "google.com": ["q"], + "bing.com": ["q"], + "duckduckgo.com": ["q"], + "wikipedia.org": ["title", "oldid", "diff"], +}; + +async function setupOffscreen() { + if (!chrome.offscreen) return; + await chrome.offscreen + .createDocument({ + url: "offscreen.html", + reasons: ["CLIPBOARD", "MATCH_MEDIA"], + justification: + "Copy the current URL and select a toolbar icon for the system theme.", + }) + .catch(() => {}); +} + +chrome.runtime.onInstalled.addListener(setupOffscreen); +chrome.runtime.onStartup.addListener(setupOffscreen); +chrome.runtime.onMessage.addListener(({ type, dark }) => { + if (type === "theme") { + chrome.action.setIcon({ + path: dark ? "icon-inverted-128.png" : "icon-128.png", + }); + } +}); + +chrome.action.onClicked.addListener(async (tab) => { + if (!tab.url || !/^https?:/.test(tab.url)) return; + + const url = new URL(tab.url); + const template = + Object.entries(templates).find( + ([domain]) => + url.hostname === domain || url.hostname.endsWith(`.${domain}`), + )?.[1] || []; + const parameters = [...url.searchParams]; + url.search = ""; + for (const [name, value] of parameters) { + if (template.includes(name)) url.searchParams.append(name, value); + } + + if (navigator.clipboard) { + try { + await navigator.clipboard.writeText(url.href); + return; + } catch {} + } + + await setupOffscreen(); + await chrome.runtime.sendMessage({ type: "copy", text: url.href }); +}); diff --git a/dist/firefox/icon-128.png b/dist/firefox/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..7f49eb08389a85ab7fe7fec1f9bd3cf2394438cb GIT binary patch literal 1384 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

QGVeUnJ+ zj7d}fiR==vY1^xGU*Yt(nw+WsJKkyv`L-QfWpmp|@$CJ%NldqyUi@NCd&IAJ?OB1| z^K0_OmhGF(6rTuIuuNMtlOe9jx8d+O)J%mTOrV z>aUgG&x$zZ^XyYDpL)aE*1R*`DJ+w&tj~{ASsEWdL*jn-tJnK~ewA;~==i5>AiChc zKuF~m`DX3@f6Wt~UaS|{X7h{R`FhV!i$5%yv+8`hTs|CsXbmmdAXLgDcI$^#tF9#V z|3+;XFfz$8Bbo-Nqc9R6r3{P=3=B&eK}_^98CJ-cOeyMkOn^74nW&>G$Y!=MFrbgI z;4>0Yt)TWiAx456xTJA2GXn#-lELhU;xif%0;r86h|!P`$mV2VKx--yXC!J%0@=uk xTntD9U7&UaJ`)lCN3B*NCPMswjT`EJcqNO=L{>JC4mJihhM$ZK3@w5n9suYIyN&<= literal 0 HcmV?d00001 diff --git a/dist/packages/detrack-firefox-1.0.0.zip b/dist/packages/detrack-firefox-1.0.0.zip new file mode 100644 index 0000000000000000000000000000000000000000..01192f153f9e6bebb1444eeb65d70e45f510d21f GIT binary patch literal 4491 zcmWIWW@Zs#U|`^2;NAEt=GcM%hh8u-Fl=XKVBlqtVMt0$&Q34NFU?EQ%PI~H;bdT* zwKOmbgi9;985mi2--H?mSy(upLg$;PrFu;uplf{)1lHVX}5*fwry=y>vn8e zopNB=NvoHeSza7(E_l22%0AnzC$9t>ysUAD^UY-Pvj!+V-`?K)emKQ~D2ZJ?=D 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 mk44ofy`glX=O&z~GV^ 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 F2>@weNk#ww diff --git a/icon-16.png b/icon-16.png deleted file mode 100644 index b7ef0a2781d0b39b5eae0e80a94298d51bc63960..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 384 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s77>k44ofy`glX=O&z~GV^ z;hE;^%b>-;z`()4*q+J20#d@jz#zo{0?Z2-8JNK$j0_A5nBcMk3z!jXkV2Et!cPng z46i(0978Mww@$Lna&i=L`@1$LrqgxXgj2j7DeTv#iQPJ)m6iCEZ_@;aRTGYF?Pyx@ z{6Nf<<-+nV_7-=n^WT*}KledvD*H;W`Pb^JGVdJ_?^(#aQ0}BundYv2nrGc_IE(OJ z-X8ymU1Du#?WN6XOJ?1_wA`S6Q{Dk?lY?r0C922!&bfYWvi09~l4p-!nB`}g_Q@&g z8y+v+d2Sc~yf-Yf_WFI}mAUWRZL(T5XCZImw+XX9CDt97>=Y|BTQ2C#EYlwb!IPWf zBKJ3c^tU`{ekEw?5f;rTHM= Nd%F6$taD0e0swvVi-7-m~0t_B_*~x0~n5>mDUK8Z;y?=YnMbE zvhI24ROdd?rP-)1PyF(Z*>_jyRyy_k^$2jAVI=g%-RD#9a*j={<~t_c57g+&IP_KJ zWXPn~nMyy8+*~sGk)hw>?k7FB?wny;mBnlx9Q~{j^+Mo-x0!C*fw!>;t^GO33oHIj}m89l(!^mNiDmiW}nVNTI{D;#|Jr&H`m=jA5*LN-pb3HSCb>NH=aSZ}yIFq~(_=}aB9Iqta^4^I_* zp8u>UNvJ6*=3LsLJ33WAVwe0><(a}`FhQs(cR^>y!U-WMKQCu!N-k2p%vrYg#lwvq zpO%N^?!7oks7a->Q_OF(()~S(Icg{B7Pab`J(*o-=_s_QT}b#7gWTYl+_=7W+m_XKV4q&eCh5IOw)AE&YZmk;vVpB7F^I$W#0dCCjLb86h5 z7;j1bGvA!MsPp*R6YbBgZe^HdIO+ILXVd5U;(@nVzPL`{HxEfv-|=Mobo=gIT)Z3!_e*TDx8HR-@%QJi`5iarudnw$^RK3L_M&Oe zwx8A9Z+MxbZ13Nny)))I*9q_As5eL|-`B5R9Q8Yxvv~90pU0mX-e0`!?a!|flhyV+ zU;DXX{oS8-dP+W-8UMsvq|>VR^-t3IJli1jzv#>tpZ`zUUej;3?fLH=VfOL=O)Z(L zG@ksf5Zvrl^<={Ql!hn5xgSJ6)#@C3Q#SkaW1rBI-vc{u&d)jf-Oxw#{&BxERySww zUmvxvpLfRJyVw5Qs>u3jXLCkwli~g2XS;sd#U0Jz-oM#!Kc}?F=h{0?6GVQW-Y#+G z&Wq2yI~+~#AK%YuJl&AzIdj>~iSo*x6MmYU|8({A)Fr9T`}+TK1UdS*`cJ+3(@u!R z(sh$t@Tq#)pRQ99zj3loV%FPWZ~w>ljvY~H<@@>#XWZ4| zdT}^vRnpq|^1Am9zKLJdv`$AQnERzx;Nin-_Gv7%3qEl~PM!0VtglTEvU?CHQVvU>{$7(wL9h| zn0p+{IA_vycEXF5HWHH4Znio2KNEfyxl!C)_?hspC3{a;wsIYstMhFUpIqWL;~u}p zkJTSJU!GY!?MBaEk979+MQnRDe_h-=uf9-w>5}bz_mZsJCeF;AVl;W@8pYt(FZ91D zp9}ef@f&tES#mu77Ge>nd?gG;Jd&w(xT{|SWre%XI;>-@jX6TaTG=Zc2mGwCnibX_IRk-f4E%ccp(f0eoz%Zv@G}5SBnP>3=9mOu6{1-oD!M - - - - - - - - - - + \ No newline at end of file diff --git a/manifest.firefox.json b/manifest.firefox.json new file mode 100644 index 0000000..d90d7f5 --- /dev/null +++ b/manifest.firefox.json @@ -0,0 +1,27 @@ +{ + "manifest_version": 3, + "name": "Detrack", + "version": "1.0.0", + "description": "Copy the current URL without tracking parameters.", + "permissions": ["activeTab", "clipboardWrite"], + "background": { "scripts": ["background.js"] }, + "browser_specific_settings": { + "gecko": { + "id": "detrack@devins.page", + "data_collection_permissions": { "required": ["none"] } + } + }, + "action": { + "default_icon": "icon-128.png", + "theme_icons": [ + { + "light": "icon-inverted-128.png", + "dark": "icon-128.png", + "size": 128 + } + ] + }, + "icons": { + "128": "icon-128.png" + } +} diff --git a/manifest.json b/manifest.json index 251b625..b1a3005 100644 --- a/manifest.json +++ b/manifest.json @@ -2,17 +2,13 @@ "manifest_version": 3, "name": "Detrack", "version": "1.0.0", + "description": "Copy the current URL without tracking parameters.", "permissions": ["activeTab", "offscreen", "clipboardWrite"], "background": { "service_worker": "background.js" }, "action": { - "default_title": "Copy detracked URL", - "default_icon": { - "16": "icon-16.png", - "128": "icon-128.png" - } + "default_icon": "icon-128.png" }, "icons": { - "16": "icon-16.png", "128": "icon-128.png" } } diff --git a/offscreen.js b/offscreen.js index 9c5de50..a915870 100644 --- a/offscreen.js +++ b/offscreen.js @@ -1,3 +1,8 @@ +chrome.runtime.sendMessage({ + type: "theme", + dark: matchMedia("(prefers-color-scheme: dark)").matches, +}); + chrome.runtime.onMessage.addListener( ({ type, text }, _sender, sendResponse) => { if (type !== "copy") return; diff --git a/store-icon.png b/store-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..b7ad3ca82b13de98a5ec5ede40e440bf8a71d0b5 GIT binary patch literal 15846 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