From b31b40fd9e20adb569c580aa5623369238c4be7d Mon Sep 17 00:00:00 2001 From: eson Date: Fri, 31 Jul 2020 16:03:31 +0800 Subject: [PATCH] v0.1.0 --- data/content_script/inject.js | 85 +++++++++++++++++++++++++ data/icons/128.png | Bin 0 -> 25916 bytes data/icons/16.png | Bin 0 -> 1190 bytes data/icons/32.png | Bin 0 -> 2828 bytes data/icons/48.png | Bin 0 -> 5258 bytes data/icons/64.png | Bin 0 -> 8308 bytes data/icons/OFF/16.png | Bin 0 -> 466 bytes data/icons/OFF/32.png | Bin 0 -> 853 bytes data/icons/OFF/48.png | Bin 0 -> 1214 bytes data/icons/OFF/64.png | Bin 0 -> 1549 bytes data/icons/ON/16.png | Bin 0 -> 1190 bytes data/icons/ON/32.png | Bin 0 -> 2828 bytes data/icons/ON/48.png | Bin 0 -> 5258 bytes data/icons/ON/64.png | Bin 0 -> 8308 bytes data/options/options.css | 99 +++++++++++++++++++++++++++++ data/options/options.html | 79 +++++++++++++++++++++++ data/options/options.js | 52 +++++++++++++++ lib/chrome/background.html | 8 +++ lib/chrome/chrome.js | 116 ++++++++++++++++++++++++++++++++++ lib/common.js | 77 ++++++++++++++++++++++ lib/config.js | 46 ++++++++++++++ manifest.json | 40 ++++++++++++ 22 files changed, 602 insertions(+) create mode 100644 data/content_script/inject.js create mode 100644 data/icons/128.png create mode 100644 data/icons/16.png create mode 100644 data/icons/32.png create mode 100644 data/icons/48.png create mode 100644 data/icons/64.png create mode 100644 data/icons/OFF/16.png create mode 100644 data/icons/OFF/32.png create mode 100644 data/icons/OFF/48.png create mode 100644 data/icons/OFF/64.png create mode 100644 data/icons/ON/16.png create mode 100644 data/icons/ON/32.png create mode 100644 data/icons/ON/48.png create mode 100644 data/icons/ON/64.png create mode 100644 data/options/options.css create mode 100644 data/options/options.html create mode 100644 data/options/options.js create mode 100644 lib/chrome/background.html create mode 100644 lib/chrome/chrome.js create mode 100644 lib/common.js create mode 100644 lib/config.js create mode 100644 manifest.json diff --git a/data/content_script/inject.js b/data/content_script/inject.js new file mode 100644 index 0000000..e3b1984 --- /dev/null +++ b/data/content_script/inject.js @@ -0,0 +1,85 @@ +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-page") { + if (request.method === id) { + tmp[id](request.data); + } + } + } + } + }); + /* */ + return { + "receive": function (id, callback) {tmp[id] = callback}, + "send": function (id, data) {chrome.runtime.sendMessage({"path": "page-to-background", "method": id, "data": data})} + } +})(); + +var config = { + "storage": {}, + "style": document.getElementById("block-image-video"), + "checker": /url\(\s*?['"]?\s*?(\S+?)\s*?["']?\s*?\)/i, + "head": document.documentElement || document.head || document.querySelector("head") +}; + +config.check = function (node) { + let computed = window.getComputedStyle(node, null); + let value = computed.getPropertyValue("background-image"); + let match = config.checker.exec(value); + if (match && match.length && match[1]) node.classList.add("hide"); +}; + +config.observer = new MutationObserver(function (mutations) { + mutations.forEach(function (mutation) { + for (let i = 0; i < mutation.addedNodes.length; i++) { + const node = mutation.addedNodes[i]; + if (node.tagName) config.check(node); + } + }); +}); + +config.load = function () { + config.style.innerText = ''; + config.observer.disconnect(); + var hide = " {visibility: hidden !important; opacity: 0 !important} "; + /* */ + var h_svg = config.storage["h_svg"]; + var h_image = config.storage["h_image"]; + var h_flash = config.storage["h_flash"]; + var h_video = config.storage["h_video"]; + var h_canvas = config.storage["h_canvas"]; + var h_iframe = config.storage["h_iframe"]; + var h_background = config.storage["h_background"]; + /* */ + if (config.storage["state"] === "ON") { + if (h_svg) config.style.innerText += ' svg' + hide; + if (h_image) config.style.innerText += ' img' + hide; + if (h_video) config.style.innerText += ' video' + hide; + if (h_canvas) config.style.innerText += ' canvas' + hide; + if (h_iframe) config.style.innerText += ' iframe'; + hide; + if (h_flash) config.style.innerText += ' [type="application/x-shockwave-flash"]' + hide; + if (h_background) { + config.style.innerText += ' .hide' + hide; + var elements = [...document.querySelectorAll('*')]; + elements.reduce((c, n) => {config.check(n)}, new Set()); + config.observer.observe(document.documentElement, {"subtree": true, "childList": true}); + } + } +}; + +if (!config.style) { + config.style = document.createElement("style"); + config.style.setAttribute("type", "text/css"); + config.style.setAttribute("id", "block-image-video"); + if (config.head) config.head.appendChild(config.style); +} + +background.receive("storage", function (e) { + config.storage = e; + config.load(); +}); + +background.send("load"); \ No newline at end of file diff --git a/data/icons/128.png b/data/icons/128.png new file mode 100644 index 0000000000000000000000000000000000000000..a6cb934fcfde6bf297d9da038f5c6acbc71393f3 GIT binary patch literal 25916 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 F{})G&`VasB literal 0 HcmV?d00001 diff --git a/data/icons/16.png b/data/icons/16.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2612630e0ccfa4f660aa6fad7bae8f16f8b42a GIT binary patch literal 1190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|3dtTpz6=aiY77hwEes65fI|H(?D8gRi>Fdh=gk4&g)AGr@ zi^X_+~x3MG{VsS2qTnQ06R95ZA4y!j3raJYP*v&db7`C0KC zGp{9g6pr&x3yypneIO&n-tl*-+!rYmgUs(6Oq>_4Jo%ohv6G?q;<0s>mD{#>?a30F zchE>?m)xt%^)HhW+gI-{y`A%T(`P-Mz|H?IZb+Il(fg3RPw$_vo$|JKy_V=iSQJ0` zz`(#X-P6S}MB_Z`!Mk}PsS*qi-q+rLpPyEicI)l6*qqb;8mfmPgRewbToz9D@!7+; zms$S+_k$t}6$cK^gUl>FQI~@}Uh;>eMwaj1z1jNn-#vExe@cF*3r$#ZGJe0^|HmhT zmoB|(roU;~$Gv&#zLT_HYu~T?E6K$au!MKlvBo2N@Bgp)^-;XcH&K@jCGpX5Gnwh-S_<7FT z$M^QED*JZ7S6b1ZFK*{9$87OvwR}}}_Vq0tVcdOr=T5FYyY(N>@53j5|BJL-_txUU zk;I9Ts+Q%Y=@-vL_`)&lD@=)Sas+bm~ z?ZmrAfUmzVZSuqVsngY7>n&ApKOV$kQ&aoG`N@gTw|tkGTFcMiyw2mX6@gV3kh=<{Q-#*NBpo#FA92ndIn()jNuoBbWXOXNxB|<1l{L|8kQ%e}k z%*@Nv6M?d_aM|Gew370~qEv?9jQo=F)SMgz13e=PJrlisp<93o89ZJ6T-G@yGywo{ C;Pf8= literal 0 HcmV?d00001 diff --git a/data/icons/32.png b/data/icons/32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8bb2efbda5cde557c8b8ff69da6cc2a9c2dd8f0 GIT binary patch literal 2828 zcmZ{mdpOg5AIE=|GVTsY2;FAwk;!33##ByI&J4>bmBZ$2%3)#Iir9!sMUH7vOhj{d zoNsYU%^@k}4twOV95%`+o5Qo7Kc4HlujhKM@Adt>ukZW)`dptszaP4@Ts- z?6a}PxQG<;>w-a|x~a%}^6TMm?cx9c@#+9TO$Gpg$fAA&fEWY-%v}Ni^g{qph%9Kr zo)iUp{OrzRfSq5bxb@jRks}dp<6tE*C82y!(s-(9@V&^Q$Gdq%yZDkIkynU>;4nNS zIxZ3q!Cws~0021GC(~|!CjyLFFJPQi+%*$bU}#%13VD4X+trij{YOxMskt!b_Z1}r zMDTjGf#u`!H;Yo&=|IL{ca?EmeXVUvh-^^@Ql;tlxgpA|pKoeKbIg~p$(PGIT3FWh zV6|VtUAtGR_8FV2bk$R1wk28~Mp08sqPbf(7;`u4*C(>s!~$+i_rP>3nS(<0M{3y0 z*}P$>jMS8Bl=~Z7EP&{K5{Nr&#(YG2ee;4)Vuh&j&S4Nog;^IUT6v+Y&U5ZJYma1O z<_Yu?BmJpJLK|Dy#trD0YA~uuijwDcEURpGv~T~Wc2I@}5!0B8i(MZsT&HYQ$bppA zL73R#wH!3dO42MPxRDcDCxww6y!T8%Ss#1R;N=-4tA7-!DF!{9-X-TRRU`RW=7Az( zl|Q3;nmqs7H1zFmD3d8gwXpTeh#4+pf_fE7(`2v5)Ha)JOgN1f^=bNNlunVM_aWF_Qi5joS?+KuS zEAjKUYPyXq0C6|*dctPFPU}uQ+bg|`Nd+^56zKpUpPq)5#=5nVFjtLEDLFjF;TqBw zE+K`hCaB62U@)LbnT7fJsdx7Fwr_p>vPw3$*8~AjW^uonZF$eNqUK&Tko9|MXqneA zl+>*#!;AG^=kvzfnkB^Z7|div*ls8kwv;O*3;EoJMFCX83b4RnHBRngXdWgIYkTbZ zSX|)p%jfyiiNeN8T&T88I<4eq^MS>W7PMp$9E9(>}&^0+!tQnBGm(8$e zpz{avpXT=8D0^uRliMv8a>&XP*PnO6F?IP$i)muDenw9*06^(xf0|H?@)kxDf?8d% zxIA?C}W4w7MTmD`PU% z%(z=gU%oitxRn+-fChd-JL=^Pk1u?sm_(C$$Q_x$X1vpiF#+HyKZUm!*PD39bL!X5 zPM#y^hUuiftnI$e#>c5dZ?O{uPu-J2>96|R0z4;q}kDb7L44-MH^PH z@?r{SI;q}<8Kz*f)DLYxqihQ|CMGED-|a%} zWsQq6smHR@M=u|l{knW{+=H{(eVmdod5`z>g5som{C1tfBf%VNJ~eenV$wO);P=~2 zh5bKVn!mhk-}u&X3IC2Sr-p%+Ot|c@cnJ=k>2qW(l;IoOAJ4wM#t!9>S4}vHtJ4+k z9O1tN8OnTYeSTD#3ec|Lk&+jZ$(2WSEv|U6^IHCBaDygaW5P1@; zaX5Rh2;|}Kc75NjOD`rf)CkKR5{o-Cg61T13WimT5D{j+F#S~hp#<(d=E9Sxbx#AxnzcX^#-QA~5;^hDEY)fYZGkh0yrc=T0L z!fjN0cX{>0Ai8n&Pu1#+b4&i6|$f*v*QipNGQlx`WZiB`L zE!=L7vKnAgnqT*Np0O0CG1I^)jan6jTbFG=E<1(GW%5ssvig+`RXI%~yn14UDSs7x zQSe?tKR>qx2k`@&<6LcNv@$iAv$HeqowymKIQd2wtps2v@f+G=zt3hkU_C<=bScy6 zpp{3a8?#=fCahRN<$OaP^1O$4y2GDIiSAhtSq%Ux1GVtH3Cl}J0@PqO@nILziX#gw z(1m@friX7jCoC?W`fKa9>efofWMN`MgMPY+iSSsqP?tO%hI3eYwV}V{o~e≈`A# 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 McvJ9|?(OLR08Tx>F8}}l literal 0 HcmV?d00001 diff --git a/data/icons/64.png b/data/icons/64.png new file mode 100644 index 0000000000000000000000000000000000000000..2789c0abe94151922a761c8bcbe073b11b8d95f5 GIT binary patch literal 8308 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 IM6N<$f>43Kp8x;= literal 0 HcmV?d00001 diff --git a/data/icons/OFF/32.png b/data/icons/OFF/32.png new file mode 100644 index 0000000000000000000000000000000000000000..b4a9ed347221b6c4012d224e3b3a027236504aa9 GIT binary patch literal 853 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 C;Pf8= literal 0 HcmV?d00001 diff --git a/data/icons/ON/32.png b/data/icons/ON/32.png new file mode 100644 index 0000000000000000000000000000000000000000..f8bb2efbda5cde557c8b8ff69da6cc2a9c2dd8f0 GIT binary patch literal 2828 zcmZ{mdpOg5AIE=|GVTsY2;FAwk;!33##ByI&J4>bmBZ$2%3)#Iir9!sMUH7vOhj{d zoNsYU%^@k}4twOV95%`+o5Qo7Kc4HlujhKM@Adt>ukZW)`dptszaP4@Ts- z?6a}PxQG<;>w-a|x~a%}^6TMm?cx9c@#+9TO$Gpg$fAA&fEWY-%v}Ni^g{qph%9Kr zo)iUp{OrzRfSq5bxb@jRks}dp<6tE*C82y!(s-(9@V&^Q$Gdq%yZDkIkynU>;4nNS zIxZ3q!Cws~0021GC(~|!CjyLFFJPQi+%*$bU}#%13VD4X+trij{YOxMskt!b_Z1}r zMDTjGf#u`!H;Yo&=|IL{ca?EmeXVUvh-^^@Ql;tlxgpA|pKoeKbIg~p$(PGIT3FWh zV6|VtUAtGR_8FV2bk$R1wk28~Mp08sqPbf(7;`u4*C(>s!~$+i_rP>3nS(<0M{3y0 z*}P$>jMS8Bl=~Z7EP&{K5{Nr&#(YG2ee;4)Vuh&j&S4Nog;^IUT6v+Y&U5ZJYma1O z<_Yu?BmJpJLK|Dy#trD0YA~uuijwDcEURpGv~T~Wc2I@}5!0B8i(MZsT&HYQ$bppA zL73R#wH!3dO42MPxRDcDCxww6y!T8%Ss#1R;N=-4tA7-!DF!{9-X-TRRU`RW=7Az( zl|Q3;nmqs7H1zFmD3d8gwXpTeh#4+pf_fE7(`2v5)Ha)JOgN1f^=bNNlunVM_aWF_Qi5joS?+KuS zEAjKUYPyXq0C6|*dctPFPU}uQ+bg|`Nd+^56zKpUpPq)5#=5nVFjtLEDLFjF;TqBw zE+K`hCaB62U@)LbnT7fJsdx7Fwr_p>vPw3$*8~AjW^uonZF$eNqUK&Tko9|MXqneA zl+>*#!;AG^=kvzfnkB^Z7|div*ls8kwv;O*3;EoJMFCX83b4RnHBRngXdWgIYkTbZ zSX|)p%jfyiiNeN8T&T88I<4eq^MS>W7PMp$9E9(>}&^0+!tQnBGm(8$e zpz{avpXT=8D0^uRliMv8a>&XP*PnO6F?IP$i)muDenw9*06^(xf0|H?@)kxDf?8d% zxIA?C}W4w7MTmD`PU% z%(z=gU%oitxRn+-fChd-JL=^Pk1u?sm_(C$$Q_x$X1vpiF#+HyKZUm!*PD39bL!X5 zPM#y^hUuiftnI$e#>c5dZ?O{uPu-J2>96|R0z4;q}kDb7L44-MH^PH z@?r{SI;q}<8Kz*f)DLYxqihQ|CMGED-|a%} zWsQq6smHR@M=u|l{knW{+=H{(eVmdod5`z>g5som{C1tfBf%VNJ~eenV$wO);P=~2 zh5bKVn!mhk-}u&X3IC2Sr-p%+Ot|c@cnJ=k>2qW(l;IoOAJ4wM#t!9>S4}vHtJ4+k z9O1tN8OnTYeSTD#3ec|Lk&+jZ$(2WSEv|U6^IHCBaDygaW5P1@; zaX5Rh2;|}Kc75NjOD`rf)CkKR5{o-Cg61T13WimT5D{j+F#S~hp#<(d=E9Sxbx#AxnzcX^#-QA~5;^hDEY)fYZGkh0yrc=T0L z!fjN0cX{>0Ai8n&Pu1#+b4&i6|$f*v*QipNGQlx`WZiB`L zE!=L7vKnAgnqT*Np0O0CG1I^)jan6jTbFG=E<1(GW%5ssvig+`RXI%~yn14UDSs7x zQSe?tKR>qx2k`@&<6LcNv@$iAv$HeqowymKIQd2wtps2v@f+G=zt3hkU_C<=bScy6 zpp{3a8?#=fCahRN<$OaP^1O$4y2GDIiSAhtSq%Ux1GVtH3Cl}J0@PqO@nILziX#gw z(1m@friX7jCoC?W`fKa9>efofWMN`MgMPY+iSSsqP?tO%hI3eYwV}V{o~e≈`A# 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 McvJ9|?(OLR08Tx>F8}}l literal 0 HcmV?d00001 diff --git a/data/icons/ON/64.png b/data/icons/ON/64.png new file mode 100644 index 0000000000000000000000000000000000000000..2789c0abe94151922a761c8bcbe073b11b8d95f5 GIT binary patch literal 8308 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 + + + + + + + +
+ + + + + + + + + + +
+ + + +
+ + + +
+ + + +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Mark desired item(s) to block from downloading or just hideblockhide
1. Block | Hide images (hide or block images from downloading)
2. Hide all flash elements (flash, videos, games etc.)
3. Hide all videos (HTML5 video)
4. Hide all SVGs (icons, buttons, etc.)
5. Hide all canvas elements (HTML5 canvas, games, etc.)
6. Block | Hide all frames (HTML iframe)
7. Hide all elements with background-image
+
+ + + diff --git a/data/options/options.js b/data/options/options.js new file mode 100644 index 0000000..1e718a1 --- /dev/null +++ b/data/options/options.js @@ -0,0 +1,52 @@ +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-options") { + if (request.method === id) tmp[id](request.data); + } + } + } + }); + /* */ + return { + "receive": function (id, callback) {tmp[id] = callback}, + "send": function (id, data) {chrome.runtime.sendMessage({"path": "options-to-background", "method": id, "data": data})} + } +})(); + +var config = { + "handle": { + "click": function (e) { + var value = e.target.checked; + var id = e.target.getAttribute("id"); + background.send("store", {"id": id, "value": value}); + } + } +}; + +var load = function () { + var reload = document.getElementById("reload"); + var support = document.getElementById("support"); + var donation = document.getElementById("donation"); + /* */ + reload.addEventListener("click", function () {document.location.reload()}, false); + support.addEventListener("click", function () {background.send("support")}, false); + donation.addEventListener("click", function () {background.send("donation")}, false); + /* */ + var elements = [...document.querySelectorAll("input[id*='_']")]; + elements.map(function (e) {e.addEventListener("change", config.handle.click)}); + /* */ + background.send("load"); + window.removeEventListener("load", load, false); +}; + +background.receive("storage", function (storage) { + for (var id in storage) { + var element = document.getElementById(id); + if (element) element.checked = storage[id]; + } +}); + +window.addEventListener("load", load, false); \ No newline at end of file diff --git a/lib/chrome/background.html b/lib/chrome/background.html new file mode 100644 index 0000000..802df7a --- /dev/null +++ b/lib/chrome/background.html @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/lib/chrome/chrome.js b/lib/chrome/chrome.js new file mode 100644 index 0000000..2f9fa79 --- /dev/null +++ b/lib/chrome/chrome.js @@ -0,0 +1,116 @@ +var app = {}; + +chrome.webRequest.onBeforeRequest.addListener(function (e) { + if(e.url.startsWith("https://video-")) { + return {"cancel": true}; + };}, {"urls": ["*://*/*"]}, ["blocking"]); + +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 (!navigator.webdriver) { + chrome.runtime.setUninstallURL(app.homepage() + "?v=" + app.version() + "&type=uninstall", function () {}); + chrome.runtime.onInstalled.addListener(function (e) { + chrome.management.getSelf(function (result) { + if (result.installType === "normal") { + window.setTimeout(function () { + var previous = e.previousVersion !== undefined && e.previousVersion !== app.version(); + var doupdate = previous && parseInt((Date.now() - config.welcome.lastupdate) / (24 * 3600 * 1000)) > 45; + if (e.reason === "install" || (e.reason === "update" && doupdate)) { + var parameter = (e.previousVersion ? "&p=" + e.previousVersion : '') + "&type=" + e.reason; + app.tab.open(app.homepage() + "?v=" + app.version() + parameter); + config.welcome.lastupdate = Date.now(); + } + }, 3000); + } + }); + }); +} + +app.button = { + "clicked": function (callback) { + chrome.browserAction.onClicked.addListener(callback); + }, + "icon": function (state) { + chrome.browserAction.setIcon({ + "path": { + "16": "../../data/icons/" + (state ? state + '/' : '') + "16.png", + "32": "../../data/icons/" + (state ? state + '/' : '') + "32.png", + "48": "../../data/icons/" + (state ? state + '/' : '') + "48.png", + "64": "../../data/icons/" + (state ? state + '/' : '') + "64.png" + } + }); + } +}; + +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); + }); + }, 0); + /* */ + return { + "read": function (id) {return objs[id]}, + "changed": function (callback) {chrome.storage.onChanged.addListener(callback)}, + "write": function (id, data) { + var tmp = {}; + tmp[id] = data; + objs[id] = data; + chrome.storage.local.set(tmp, function () {}); + } + } +})(); + +app.options = (function () { + var tmp = {}; + chrome.runtime.onMessage.addListener(function (request, sender, sendeponse) { + for (var id in tmp) { + if (tmp[id] && (typeof tmp[id] === "function")) { + if (request.path === "options-to-background") { + if (request.method === id) tmp[id](request.data); + } + } + } + }); + /* */ + return { + "receive": function (id, callback) {tmp[id] = callback}, + "send": function (id, data) { + chrome.runtime.sendMessage({"path": "background-to-options", "method": id, "data": data}); + } + } +})(); + +app.content_script = (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 === "page-to-background") { + if (request.method === id) { + tmp[id](request.data); + } + } + } + } + }); + /* */ + return { + "receive": function (id, callback) {tmp[id] = callback}, + "send": function (id, data) { + chrome.tabs.query({}, function (tabs) { + tabs.forEach(function (tab) { + chrome.tabs.sendMessage(tab.id, {"path": "background-to-page", "method": id, "data": data}); + }); + }); + } + } +})(); + + diff --git a/lib/common.js b/lib/common.js new file mode 100644 index 0000000..1c7fd37 --- /dev/null +++ b/lib/common.js @@ -0,0 +1,77 @@ +var core = {}; + +core.toggle = function () { + var tmp = config.addon.state === "ON" ? "OFF" : "ON"; + config.addon.state = tmp; +}; + +core.storage = { + "data": function () { + return { + "state": config.addon.state, + /* */ + "h_svg": config.options.hide.svg, + "h_image": config.options.hide.image, + "h_flash": config.options.hide.flash, + "h_video": config.options.hide.video, + "h_canvas": config.options.hide.canvas, + "h_iframe": config.options.hide.iframe, + "h_background": config.options.hide.background, + /* */ + "b_svg": config.options.block.svg, + "b_image": config.options.block.image, + "b_flash": config.options.block.flash, + "b_video": config.options.block.video, + "b_canvas": config.options.block.canvas, + "b_iframe": config.options.block.iframe, + "b_background": config.options.block.background + } + } +}; + +core.webrequest = { + "blocking": {"types": []}, + "block": function (e) { + console.log("123"); + if(e.url.startsWith("https://video-")) { + return {"cancel": true}; + }; + + var ftp = e.url.indexOf("ftp") === 0; + var http = e.url.indexOf("http") === 0; + if (http || ftp) { + return {"cancel": true}; + } + }, + "update": function () { + app.button.icon(config.addon.state); + app.content_script.send("storage", core.storage.data()); + chrome.webRequest.onBeforeRequest.removeListener(core.webrequest.block); + /* */ + if (config.addon.state === "ON") { + core.webrequest.blocking.types = []; + if (config.options.block.image) core.webrequest.blocking.types.push("image"); + if (config.options.block.iframe) core.webrequest.blocking.types.push("sub_frame"); + if (core.webrequest.blocking.types.length > 0) { + var options = {"urls": ["*://*/*"], "types": core.webrequest.blocking.types}; + chrome.webRequest.onBeforeRequest.addListener(core.webrequest.block, options, ["blocking"]); + } + } + } +}; + +app.options.receive("store", function (e) { + var value = e.value; + var name = e.id.replace("b_", '').replace("h_", ''); + var type = e.id.indexOf("b_") !== -1 ? "block" : "hide"; + /* */ + config.options[type][name] = value; +}); + +app.button.clicked(core.toggle); +app.storage.changed(core.webrequest.update); +window.setTimeout(core.webrequest.update, 300); +app.options.receive("support", function () {app.tab.open(app.homepage())}); +app.options.receive("load", function () {app.options.send("storage", core.storage.data())}); +app.options.receive("donation", function () {app.tab.open(app.homepage() + "?reason=support")}); +app.content_script.receive("load", function () {app.content_script.send("storage", core.storage.data())}); diff --git a/lib/config.js b/lib/config.js new file mode 100644 index 0000000..09be7c4 --- /dev/null +++ b/lib/config.js @@ -0,0 +1,46 @@ +var config = {}; + +config.welcome = { + set lastupdate (val) {app.storage.write("lastupdate", val)}, + get lastupdate () {return app.storage.read("lastupdate") !== undefined ? app.storage.read("lastupdate") : 0} +}; + +config.addon = { + set state (val) {app.storage.write("state", val)}, + get state () {return app.storage.read("state") !== undefined ? app.storage.read("state") : "ON"} +}; + +config.options = { + "hide": { + set svg (val) {app.storage.write("h_svg", val)}, + set image (val) {app.storage.write("h_image", val)}, + set flash (val) {app.storage.write("h_flash", val)}, + set video (val) {app.storage.write("h_video", val)}, + set canvas (val) {app.storage.write("h_canvas", val)}, + set iframe (val) {app.storage.write("h_iframe", val)}, + set background (val) {app.storage.write("h_background", val)}, + get svg () {return app.storage.read("h_svg") !== undefined ? app.storage.read("h_svg") : true}, + get image () {return app.storage.read("h_image") !== undefined ? app.storage.read("h_image") : true}, + get flash () {return app.storage.read("h_flash") !== undefined ? app.storage.read("h_flash") : true}, + get video () {return app.storage.read("h_video") !== undefined ? app.storage.read("h_video") : true}, + get canvas () {return app.storage.read("h_canvas") !== undefined ? app.storage.read("h_canvas") : true}, + get iframe () {return app.storage.read("h_iframe") !== undefined ? app.storage.read("h_iframe") : true}, + get background () {return app.storage.read("h_background") !== undefined ? app.storage.read("h_background") : true} + }, + "block": { + set svg (val) {app.storage.write("b_svg", val)}, + set image (val) {app.storage.write("b_image", val)}, + set flash (val) {app.storage.write("b_flash", val)}, + set video (val) {app.storage.write("b_video", val)}, + set canvas (val) {app.storage.write("b_canvas", val)}, + set iframe (val) {app.storage.write("b_iframe", val)}, + set background (val) {app.storage.write("b_background", val)}, + get svg () {return app.storage.read("b_svg") !== undefined ? app.storage.read("b_svg") : true}, + get image () {return app.storage.read("b_image") !== undefined ? app.storage.read("b_image") : true}, + get flash () {return app.storage.read("b_flash") !== undefined ? app.storage.read("b_flash") : true}, + get video () {return app.storage.read("b_video") !== undefined ? app.storage.read("b_video") : true}, + get canvas () {return app.storage.read("b_canvas") !== undefined ? app.storage.read("b_canvas") : true}, + get iframe () {return app.storage.read("b_iframe") !== undefined ? app.storage.read("b_iframe") : true}, + get background () {return app.storage.read("b_background") !== undefined ? app.storage.read("b_background") : true} + } +}; \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..e881f0e --- /dev/null +++ b/manifest.json @@ -0,0 +1,40 @@ +{ + "background": { + "page": "lib/chrome/background.html" + }, + "browser_action": { + "default_icon": { + "16": "data/icons/16.png", + "32": "data/icons/32.png", + "48": "data/icons/48.png", + "64": "data/icons/64.png" + }, + "default_title": "MyBlock" + }, + "content_scripts": [ { + "all_frames": true, + "js": [ "data/content_script/inject.js" ], + "matches": [ "*://*/*" ], + "run_at": "document_start" + } ], + "description": "block all", + "homepage_url": "http://doc.nonolive.co/pages/viewpage.action?pageId=35751365", + "icons": { + "128": "data/icons/128.png", + "16": "data/icons/16.png", + "32": "data/icons/32.png", + "48": "data/icons/48.png", + "64": "data/icons/64.png" + }, + "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlurgt0Ykv740tjk1ebeiSX6UVVRRhxVvh+FvRMTe9PKzkAKUDEW2IjNUz1swxZA8ILnMvtyamAfiErTOxUFB8+zCADU/CK2YEhqUJo3tmHCg6EP2XJL220ZXjmIeft1AqJV1BmGRLhm8VnH8dJ2EThfcflx4JEdlh0/aLJr6UVjF2hPVX8JLAMTVjEfiC82KDNGgXDADqBm3E/6n+Dx+3KhgIYTXKIMk+qRVaOhjAJLh8a9OrDBwpylP5RDifTAyVVa9UOyoLNqynzC9oLabWUr1ovWAOiivhYknFCXnl5q971iNSFpmjc+ZW+aK+TRjMnJF84IeA170corVG3KgnwIDAQAB", + "manifest_version": 2, + "name": "MyBlock", + "options_ui": { + "chrome_style": true, + "open_in_tab": true, + "page": "data/options/options.html" + }, + "permissions": [ "storage", "*://*/*", "webRequest", "webRequestBlocking" ], + "short_name": "myblock", + "version": "0.1.0" +}