Firefox 57+ / block Javascript per site

Sziasztok,

FF 57 bétán vagyok és itt már nem működik "Yes Script" és "No Script" kiegészítő. Ugye "Yes Script" azt csinálja, hogy minden oldalon engedi alapból a JS-t és megjelölhetek oldalt ahol ki akarom kapcsolni. Ez az egész oldalon kikapcsolja. Kényelmesebb mint "No Script" ha nem kell ez utóbbinak a rengeteg beállítási lehetősége.

57-es verziótól változtattak Mozilláék:

https://blog.mozilla.org/addons/2016/11/23/add-ons-in-2017/

By the end of 2017, and with the release of Firefox 57, we’ll move to WebExtensions exclusively, and will stop loading any other extension types on desktop.

Beszéltem "Yes Script" fejlesztőjével, de nem tervezi konvertálni a kiegészítőjét WebExtension-re.

Csupán arra lenne szükségem, hogy oldalanként tudjam szabályozni JS blokkolását ( "blokkolnám.." ;) ).

prefs.js vagy más állításával meg tudom ezt tenni kiegészítő nélkül? Még azon is gondolkodok ha minden kötél szakad, hogy lefejlesztenék egy kiegészítőt ha egyszerű a böngésző API. De elég lenne az előbbi is ha tud működni.

Kösz.

Hozzászólások

"5.1.x is the first restartless NoScript desktop version, and most likely the last hybrid (embedded WebExtension) before the pure WebExtension release."

https://noscript.net/

"Before Firefox 57 is released in the stable channel, a pure WebExtension NoScript will be available an you'll be automatically migrated to it."

https://noscript.net/getit

https://forums.informaction.com/viewtopic.php?f=7&t=23173

----
"Kb. egy hónapja elkezdtem írni egy Coelho-emulátort, ami kattintásra generál random Coelho-kompatibilis tartalmat."

Ezért nem fogom feltenni az 57-et. Tavaszig lesz ESR aztán majd meglátjuk. Addig remélem egy fork beindul.

--
GPLv3-as hozzászólás.

"Unlike Firefox, Pale Moon will continue to offer full support for XUL and XPCOM binary-component extensions and there is no plan to discard the current extension system in lieu of Chrome-like alternatives (WebExtensions).
Mozilla has already marked XUL extensions and bootstrapped extensions as "legacy" and will be phasing out support for all but WebExtensions, which will affect many Firefox extensions. We have no plans to do this and many "legacy" Firefox extensions will continue to be possible on Pale Moon when targeting it."

https://www.palemoon.org/roadmap.shtml

----
"Kb. egy hónapja elkezdtem írni egy Coelho-emulátort, ami kattintásra generál random Coelho-kompatibilis tartalmat."

Egyébként nem fejlesztett közületek valaki kiegészítőt? Kíváncsi lennék mennyire bonyolult és időigényes csinálni egy fekete listát JS blokkoláshoz FF által használt API-val. A NoScript is megcsinálja valahogy.

Sajnos üzleti érdekek működnek itt is. Mindig is vágytam egy olyan beépített funkcióra a böngészőben, hogy egy oldalon tiltom a JS-t. Csak hát ugye a reklámok bevétele miatti összefonódó piaci érdekek miatt ezt nem fogják megtenni.

Ezt nézem:
https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Examples

Inkább ezen indultam el:
https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Your_first_We…

Módosítottam egy példát. Könnyen tudom tesztelni is. Arra gondoltam hogy a document.body.innerHTML-ből kikapom az összes script-et. Bár lehet hogy ezt az általad megadott listener-rel kéne tenni hogy még betöltődés előtt fusson le.

Szerinted mi lenne a legegyszerűbb a fekete lista megadására? Lehet olyat hogy egy helyi text fájlt kelljen szerkeszteni? Nekem ennyi elég lenne. Mennyire macerás UI-t csinálni? Nincs sok idő erőforrásom a dologra.

Az egész body innerHTML-jét módosítani nem szerencsés legalább két szempontból:

  • újra kell renderelni mindent, ami elég drága
  • semmi nem garantálja, hogy a script nem fog töltődni és futni, mert ha jól gondolom, akkor a content scriptek DOMContentLoad után futnak, ami sokszor már rég késő. Tehát, amikor te updateled az innerHTML-t, egy-két script már letöltődött és lefutott.

UI-hoz HTML/CSS/JavaScript kell. https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Implement_a_s…
Az relatív, hogy mennyire macerás, mert gyorsan össze lehet kókányolni bármit is, meg kiváló terep arra is, hogy a végtelenül elbonyolítsd az egész fejlesztést és új pepita mintás halálcsillagot készíts dupla szuperlézerrel. :)
--
HUP Firefox extension | Hupper hibajelentés

Ez nem vészes, valszeg lefejlesztem. Egy YesScript klónt akarok saját kóddal és ezért meg tudok bízni benne. Mert ha jól gondolom, egy kiegészítő nem tartalmazza a forrás kódot (.jar fájl?).

Mondjuk ez a fejlesztés arra is jó ha egyéb más speciális igényem felmerül, gyorsan meg tudjam oldani.

Nem megy azzal sem. Ez a példa kód sem megy (az első legegyszerűbb):

https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/webReques…

Ha a .js fájl elejére beteszek egy ilyet, akkor az működik a match-elt weboldalon, tehát a kód lefut:

document.body.style.border = "20px solid orange";

Csak az onBeforeRequest nem megy.

Az első nem blokkol, csak logol. This code logs the URL for every resource requested...
A request cancelhez a callbacknek egy objectet kell visszaadnia, aminek van egy cancel property-je true értékkel.

chrome.webRequest.onBeforeRequest.addListener(function (details) {
    const shouldBlock = isBlockingEnabledAndShouldIBlockThis(details);
    return {
        cancel: shouldBlock
    };
}, {urls: [pattern]}, ["blocking"]);

--
HUP Firefox extension | Hupper hibajelentés

:) tudnál adni pár soros példa kódot esetleg?

Szerk.: egyébként ezzel próbálkozok:

manifest.json


{
	"description": "some test",
	"manifest_version": 2,
	"name": "testttt",
	"version": "1.0",
	"icons": {
		"48": "icon.svg"
	},

	"applications": {
		"gecko": {
			"id": "testttt@mozilla.org",
			"strict_min_version": "45.0"
		}
	},

	"permissions": [
		"webRequest", "webRequestBlocking"
	],

	"background": {
	  "scripts": ["background.js"]
	 },

	"content_scripts": [
		{
			"matches": ["*://mydomain.com/*"],
			"js": ["test.js"]
		}
	]
}

test.js (ez működik):


document.body.style.border = "20px solid orange";

background.js (ez nem működik, se a log nem látszik, se az alert popup nem jön):


browser.webRequest.onBeforeRequest.addListener(
	function(requestDetails){
		console.log("Loading: " + requestDetails.url);
		alert("test");
	},
	{urls: ["https://mydomain.com/*"]},
	["requestBody", "blocking"]
);

Ez utóbbihoz itt egy pastebin a könnyebb olvashatóságért:
http://paste.ubuntu.com/25653766/

https://gist.github.com/Ajnasz/fb7777184200504d4e47ad892583984a

To use the webRequest API for a given host, you must have the "webRequest" API permission. You must also have the host permission for both the host that initiated the request, and the target of the request. For example, if "foo.com" loads a resource from "bar.com", you must have permission for both those hosts. Note that this is stricter than Chrome, which only requires the host permission for the request's target.

Mivel gondolom minden weboldalon szeretnéd használni, ezért az <all_urls> kell a permissionök közé. https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Match_patterns
--
HUP Firefox extension | Hupper hibajelentés

Az all_urls-en már túl vagyok, úgy sem jó, viszont most csak 1 adott domain-el akarom tesztelni. Addig akarok eljutni, hogy a lehető legegyszerűbb módon működön az a pár sor. De nem megy. Nincs se log, se alert. Tudsz nekem olyan kombinációt mutatni, ami konkrétan működik nálad?

És egyébként hálásan köszönöm a segítséget.

Ami a gistben van, az konkrétan nálam működik. Logol is és blokkol is, akár itt a hupon is próbálhatod, a youtube embeded blokkolja. A content scriptet kivettem, mert nem kell hozzá.
Utána én ezt használva teszteltem: https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Getting_start…

npm install --global web-ext
web-ext run

--
HUP Firefox extension | Hupper hibajelentés

Egyelőre nem találok infót az API leírásban sem a példa kódok között arról, hogy tudnám a body-t manipulálni mielőtt betöltődik. Gondolom te is ezt teszed hupper kieg-ben.

Egy hint-et tudnál adni hogy milyen API-t vagy funkciót kell használni ehhez? Ugyanis megnéztem a "requestBody" object által visszaadott adatot, de ott nem a body-t adja vissza. Nem világos Mozilla gondolatmenete erről, nem látom még át az API-t ilyen szinten. Viszont te is ezt csinálod nem? Vagy te a content_script-ben végzed el a módosítást utólag és nem a background.js-ben?

Milyen objektumon keresztül férek hozzá a body-hoz?

off: azt meg lehet valahogy oldani leendő FF57 alatt, hogy a stop/reload gomb a rendes helyén legyen, ne az address bar végén legyenek, hanem azon kívül? Classic Theme Restorer megcsinálja, de az nyilván nem fog működni FF57-tel.

Off: Szinte biztos, hogy valahol a világon már van egy Legifjabb Vér István, aki azon a technológián dolgozik, aminek a kedvéért öt év múlva a WebExtension-t fogják megszüntetni. (Persze addigra már a Firefox is egy systemd modul lesz.)

Jelen esetben az rémlik nekem hogy a Chrome-mal való közelebbi kompatibilitás is cél volt. Ahogy most nézegetem az API-t és netes infókat, hasonlónak is tűnik, ez viszont már sokat fog számítani addon fejlesztőknek, ha több platformra lehet kevesebb munkával fejleszteni és karbantartani kódot.

Végre sikerült megtalálnom a működő megoldást. Köszönet Ajnásznak a türelmes segítségért és útbaigazításért, illetve az alábbi fórum tagjainak (megoldás legalul):

https://discourse.mozilla.org/t/block-javascript-on-specific-sites/19808

Működő background.js kód itt:

http://paste.ubuntu.com/25662977/


// info: WebExtension to block scripts on specific sites
// https://discourse.mozilla.org/t/block-javascript-on-specific-sites/19808
// https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP
browser.webRequest.onHeadersReceived.addListener(
	function(details){
		//console.log(details);
		// include the original response header too merging the two arrays here
		var rh = details.responseHeaders.concat([{name: "Content-Security-Policy", value: "script-src 'none'"}]);
		return {responseHeaders: rh};
	},
	{urls: ["*://mydomain.com/*"]},
	["blocking", "responseHeaders"]
);

Mivel background script-ből nem tudtuk blokkolni a weboldal script-jeit, content script-ből pedig előbb futnak le mint a kiegészítőm script-je, ezért Baptiste javasolt egy elég furfangos trükköt: adjunk a weboldal által küldött fejléchez (response header) CSP-t amivel meg lehet tiltani hogy bármilyen script elinduljon. Bővebb infó erről itt:

https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP

Ügyes és működik és semmilyen script nem tud elindulni. Azért nem volt egyszerű. Mozilláék dokumentációja nem tér ki ilyen megoldásokra. Nem is céljuk. Egyszerűen nem akarják segíteni a script tiltást amit megértek. Viszont én akkor is meg akartam csinálni, mert sok esetben hasznos.