Javascript (egy topic-ban)
Talán jobb lesz, ha nem nyitok új témát minden apró hülyeségnek.
Legalábbis én könnyebben visszatalálok egy topic-ba, mintha sok régi közt kellene turkálni (pl. CSS-nél jártam így nemrég - szerencsére azt pont megtaláltam)
■ Legalábbis én könnyebben visszatalálok egy topic-ba, mintha sok régi közt kellene turkálni (pl. CSS-nél jártam így nemrég - szerencsére azt pont megtaláltam)
Sok mező kitöltése JSON-ból
A kérdés elsősorban arra irányul, hogy normális-e minden mezőhöz külön konstanst gyártani, majd arra hivatkozva művelni valamit vagy ezt másképp szokás? A const ötlete onnan jött, hogy amit most csinálok, az félig-meddig SPA kategória, így mindig ottmarad valami szemét a container mezőiben, amit mielőtt elindítom a fetch-t, kitakarítok. Emiatt két helyen kell hivatkozni az id-kre, így egyszerűbb egy helyen hívni a document.getElementById-t, nem kell külön a takarításnál és külön a feltöltésnél. (elvben nincs jelentősége, csak ronda, ha egy pillanatra felbukkan valami oda nem illő infó)
Iterálás
Egy fokkal pedánsabban:
Köszi, ezt legalább most
Lassan már értek belőle annyit, hogy valami alapdolgot magamtól is össze tudok rakni.
Lassan... több, mint tíz évig tologattam magam előtt. :(
(utálok két nyelvet tanulni párhuzamosan - már megint összefolyt a js és a python -> pythonban kellett volna egy olyan, mint a js Object.elements, de arra az osztályra, amire használni akartam, pont nincs :) )
Hát, én is sokáig tologattam
:) Ha lenne mivel
Ha lenne mivel szórakoztatni magam, rég feladtam volna.
A vicc, hogy anno a pythonba úgy vágtam bele, hogy java programot akartam írni, de előbb tesztadatokat akartam generálni hozzá, ahhoz meg kellett volna valami szkriptnyelv, amivel egyszerűen lehet adatbázisba írni.
Utóbb rájöttem, hogy a javat az életbe nem tanulom meg a kilométeres nevekkel (akkor még a swing lett volna "a" GUI, ha jól emlékszem), a python meg sok esetben gyorsabb is volt, azóta próbálkoztam vele. De csak a tesztelgetésig jutottam. Most szedtem össze magam annyira, hogy ezt a primitív, semmire se jó izét készre(?) csináljam. Semmi authentikáció, semmi OOP, semmi adatbázis, de van user felület, van API (REST-nek nem nevezhető :) ), a JS is csinál "valamit" és ha nagyon kell, ezt már tudom úgy alakítani, hogy számomra akár hasznos is lehet.
Amennyiben ezekrt a dolgokat nem felejtem el pár órán, napon belül, akkor fél év múlva akár munkát is vállalhatnék. :D
Hát, sajnos találkoztam már
De nekem van önkritikám. Bár
Vért izzadva...
Ezt sikerült úgy fél év alatt (valójában pár nap, rengeteg szünettel :) ) összetákolni.
A "master" branch még kissé hiányos állapotú volt, mikor ma újra nekiestem, de nem volt kedvem még a git doksit is túrni, hogy hogyan lesz ebből úgy master, hogy megmaradjon a devel branch is.
Mint rájöttem, semmire sem volt jó azon kívül, hogy egy-két dolgot megtanultam. Python Flask-ben nagyjából megcsináltam azt, amit pl. nginx vagy apache magától is tud (autoindex, fancy index stb.), annyi plusz van benne, hogy a kirakott könyvtár lista elemein jobb klikkre feljönnek az op.rendszer stat() függvénye által visszaadott értékek, emberi formára konvertálva.
Ami fura, hogy a github AI szerint is problémás a paraméterként érkező path/fájlnév kezelés, mert illetéktelenül hozzá lehet férni fájlokhoz. Nem tudom, a flask pontosan mit csinál, de nekem linuxon nem sikerült kitörni a bedrótozott document_root-ból. (A /név/../../../../etc/passwd nem működik, a .. eltűnik a path-ból, mire a program megkapja. :)
Úgyhogy már neki tudok esni annak, amit eredetileg akartam: plugint írni firefox alá. :)
ui: vajon kiknek volt annyira érdekes ez a projekt, hogy 15 klón készült tegnap óta, ebből 7 egyedi? Mert egy vagy két klónt valami automata készít, azt tudom. De ennyit... ??
Update: van egy tippem... létezik egy régi, pyndex projekt. A pontos célját nem ismerem, de szerintem páran azt hitték, hogy ahhoz tartozik. :)
github klónok :D
Firefox addon - de androidon
Nincs valakinek ötlete?
Látok millió primitív kiegészítőt ha a mozilla oldalát böngészem, amik a leírásuk alapján nem igényelhetnek speciális jogosultságokat, funkciókat (pl. olyanok, amikkel gyakorlatilag csak átszínezik az oldalakat, betűtípust változtatnak stb.)
Ehhez képest androidra csak néhány kiegészítőt enged feltenni ezek közül. Feltételezem, hogy nem arról van szó, hogy szerkesztőségi emberek választják ki az erre érdemes addonokat, kell, hogy legyen valami szempont, ami alapján eldől, mi van megengedve. Na ezt eddig nem találtam meg. :(
Elvileg
Az oldal maga elavult, viszont azt írják, hogy bizony csak szerkesztőségi tagok engedélyeznek mobilra néhány fontosnak tartott kiegészítőt.
Pedig reméltem, hogy csak én
Köszi.
Manifest v3...
Ezért is használunk Firefoxot
Valóban :D Csak az a pletyka
Csak az a pletyka járja, hogy abból is kiveszik a v2-t.
Igen, de elvileg megtartják a
Azért én egy cseppet tartok
Az egész v3-ra átállás megint hozza majd a szokásos játékot: rengeteg kiegészítő ismét eltűnik hónapokra, évekre, végleg.
Anno a noscript egy nagyon jól sikerült biztonsági eszköz volt. Aztán megújították, azóta egyre butább, egyre rosszabb.
Most nézem, hogy androidra
Szóval nem ok nélkül aggaszt az androidos firefox...
Találtam egy másik oldalt a
Amolyan középkori kínzóeszköz fílingje van :D
Függvény paraméterrel mi történik?
firefox extension - manifest.json
A google szokás szerint nem segít, mert minden fasságot felhoz "találatként", de egyiknek sincs köze ahhoz, amit kértem, hogy mutasson egy működő példát rá :)
FF 112
background.type
.Köszi. Azt elkönyveltem
Átfutottam a táblázaton 48, 48, 48 ... OK, akkor ez nem gond. Az, hogy az utolsó sor kicsit más, már nem tűnt fel.
ui: nem hülyéskedek, tényleg ennyire rossz a szemem, nem puszta figyelmetlenség. Most is háromszor kellett végigmenni rajta, mire észrevettem, miről beszélsz.
És akkor ennyi...
contextMenu - csak a kiválasztott elemeknél
Background scriptben
- gyártok egy menü elemet (browser.menus.create), amely láthatatlan.
- berakok listenert az üzenetekre (browser.runtime.onMessage.addListener), ami az üzenetben kaphat többféle parancsot, köztük egy showmenu/hidemenu-t. Ha e kettőből valamelyik jön, akkor a browser.menus.update("id", {visible:true/false}) segítségével állítja be, hogy szükség van-e rá.
(eddig gondolom, nem nagyon van más módszer)
A content script meg úgy épül fel, hogy azokra az elemekre, amelyekkel dolgozni akarok, felhúzok egy eventlistenert valahogy így:
Csak feltételezem: minden contextmenu eseményt kezelni kell, hogy ne maradjon kirakva a menü akkor is, amikor nincs rá szükség.
manifest - action - (tárgytalan)
Szóval ha nem indítom újra a böngészőt, akkor hiába törlöm az extensiont és töltöm be újra, nem változik a korábbi helye az ikonnak. Ha teljesen bezárom a browsert, akkor már hajlandó átvándorolni oda, ahová akarom. (és igen, a menupanelt és a navbart félreértettem, a Firefox Multi-Account Containers nem tudom, mit művel, hogy be tudja illeszteni magát az URL mögé, de a jelek szerint nem a manifest-ben adja meg)
--------------------------------------------
(lehet, hogy félreértettem a "navbar" és a "menupanel" jelentését, de tökmindegy, mert bármelyiket használom a doksiban megadott lehetőségek közül, minden ugyanúgy viselkedik)
Ha manifest v3-t használok és megpróbálom rávenni a böngészőt, hogy az extensionöm ikonját ne a többi ikon közé tegye, hanem az URL végébe és beállítok egy ilyet:
"action": {
"browser_style": true,
"default_icon": {
"48": "icons/icon48.svg"
},
"default_title": "xxxx",
"default_area": "navbar"
}
akkor miért ragaszkodik hozzá, hogy a menupanel-nek megfelelő helyre tegye ki, feltéve, hogy az "extensions" alatt jobb klikk után rákattintok a Pin to toolbar-ra? (firefox-ból v111 van nálam, ezt meg 109 óta kell tudnia)
A chatgpt itt is írja a hülyeségeit töményen, de érdemben nem tudott hozzászólni. :)
ui: nincs igazán szükségem rá, csak ki akartam próbálni, hogy mit művel ez a paraméter és úgy tűnik, nagyon nem csinál semmit.
Lehet, hogy kivételesen nem bennem van a hiba: kipróbáltam egy idegen extensiont ami szintén használná ezt a paramétert, de ott sincs változás. Bármit írok a default_area után, ugyanúgy jelenik meg.
page_action
Köszi, közben rájöttem, hogy
Az viszont tény, hogy amíg nem indítom újra a browsert, addig tojik a default_area értékére.
Ez is ott van a
An extension can't change the location of the button after it has been installed, but the user may be able to move the button using the browser's built-in UI customization mechanism.
Igen, rájöttem én is, de
Az ilyenek mindig felhúznak. :(
Egyébként megoldás lenne, amit több helyen javasoltak: web-ext használata (az a browsert is újraindítja állítólag, ha az extension változott), de valamit még ott is tovább kéne bogarászni, mert az npm install web-ext nem volt elég. De ott még nem tartok, hogy ezt alaposabban megnézzem.
Költői kérdés - extension popup html/css debug hogyan?
Például a H1 taget nem igazítja középre, ha a browser_tyle: True-ra van állítva.
Na mindegy, ez csak olyan anyázás helyettesítő, majd előtúrom, hogy mit javasolnak rá. (valahol láttam pár napja, csak akkor még nem volt aktuális)
Van rá "gomb" :)
Mondom, hogy költői. :D Erre
Erre még emlékeztem (hogy van), meg arra is, hogy amit elsőre találtam, az nemlétező menüpontra hivatkozott. :)
Aztán valahol az mdn mélyén volt egy howto debug... kezdetű lista.
Ennyi maradt meg. A többit azalatt kerestem meg, amíg te gépeltél. :P
ui: sajnos ez van még mindig és permanensnek mondható: vagy átsiklok felette, lásd újraindítás elmaradásának következménye az ikonra, vagy csak háromszor kell feltúrnom a google-t mire megtalálom amit keresek. :) Az már rég nem megy, hogy leülök, megtanulom, használom. :(
web-ext - syntax error??
A web-ext nem volt idézőjelek közt, így hozott mindent, csak azt nem, ami tényleg erről szólt.
19.x nodejs kellene, az ubuntu 22.04 meg még 12.x.x-nél tart.
-------------------------------------------------
Na ezzel viszont tényleg nem tudok mit kezdeni.
Aztán...
web-ext --help
És jön egy szép hosszú hibaüzenet$ web-ext
file:///usr/local/lib/node_modules/web-ext/bin/web-ext.js:13
await webExt.main(absolutePackageDir);
^^^^^
SyntaxError: Unexpected reserved word
at Loader.moduleStrategy (internal/modules/esm/translators.js:133:18)
at async link (internal/modules/esm/module_job.js:42:21)
Most ezzel mi a ...-t csináljak?
Ubuntu 22.04 van rajta, de semmi bugot, specifikus problémát nem találtam a google-n.
Telepítési leírás innen: https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/
Az npm hozta magával a nodejs-t.
Extension - kommunikáció a felek közt - hogyan?
Hogy működik ez az egész belülről?
Vannak scriptek, némelyikhez html/css is, úgymint:
content, background, popup ami lehet action/page_action. (ez utóbbi kettő azt hiszem, egyre megy a jelenleg tárgyalandó nézetből.
A background fut a saját környezetében, kommunikálni a browser.tabs.sendMessage, browser.action.onMessage.addListener segítségével tud(?)
A content scriptek gyakorlatilag beépülnek az oldalba, amihez illeszkedik a matches-ben megadott minta. Ez a browser.runtime.sendMessage segítségével küld üzenetet a backgroundnak és a browser.runtime.onMessage.addListener fogadja az ide küldött üzenetet.
A popup egy speciális content script, ami a saját html oldalához tartozik. De... hogy tudnak neki üzenni akár a background, akár a content scriptek? És ő hogy tud üzenni ennek a kettőnek? Jó, a backgroundnak mehet a runtime.sendMessage. De a contenttel mit lehet kezdeni?
És hogy lehet a popup-nek üzenetet küldeni - ha egyáltalán lehet?
Mindez most jött elő abból kifolyólag, hogy ha a popup beállításokban módosítok valamit, azt szeretném, ha az érintett scriptek is megkapnák, amihez jelen elképzeléseim szerint az lenne optimális, ha egyszerűen küldenék feléjük egy üzenetet.
Mondjuk a popup felé talán nem szükséges üzenetet küldeni, mert amint a hozzá tartozó lap megjelenik, a többi nem működik, amint mellé kattintok, záródik, tehát annak minimális az esélye, hogy egy content v. background script módosít valamit, amiről itt is tudni kellene.
Közben nézelődök a neten, találtam olyat, hogy window.addListener('Storage') és ott le lehet kérni, mely kulcs módosult, aztán ha olyan, ami az adott scriptet érinti, akkor update-elem a módosított adatokkal az oldalt újra.
ui: ha valaki érti amit írok és valahol marhaságot írtam, akkor kérem, javítsatok ki! Elsődlegesen magamnak írom, ide csak azért, mert fennáll a veszélye, hogy hülyeségeket képzelek dolgokról. :)
runtime
Egyre cifrább :)Magyarán az
Magyarán az onMessage.addListener-re broadcast jelleggel mennek ki az üzenetek és meg kell jelölni, hogy a backgroundnak vagy a popupnak szól? Ez kicsit zavarosnak tűnt a doksikban és példaprogramokban.
De van más gond is: a nyomorult content script nem látja az extension storage-t, ergo azon keresztül üzenni sem tudok neki. :(
Update: vagy mégis. Úgy tűnik, az eredetileg felfedezett window.addEventListener("storage",...) valami másra való, mint a browser.storage.onChanged.addListener().
Utóbbira ugrik a content script is, előbbire a background sem.
Igen
async -> sync - ezzel megint nem tudok mit kezdeni.
callback vagy async/promise
Oka volt, hogy megjelöltem a
Állítólag a fizetős bem ennyire sötét, de arra nincs keret és ez önmagában elég riasztó. :)
Amit írtál, az köszi, de eddig is tiszta volt. Nekem ott az a bajom, hogy egy ponton úgy kellene működnie az egésznek, hogy azonnal rendelkezésre áll a visszakapott érték. Így meg a .then() majd valamikor visszatér, de addig a program fut tovább.
Kb. az egyetlen opció, hogy az async hívás (.get()) a kód utolsó sora, a folytatást meg a callback intézi.
De ez sem jó igazán, mert így meg a script végetér, függőben hagyott részekkel.
A konkrét esetben nem gond, de nem tudom, később ez hol okozhat gondokat. Még azon méláztam, hogy a callback esetleg lehet async és akkor abban mehet az await is.
(Ezt egyetlen nyelvben sem tudom megérteni, hogy miközben a valóságban mindig multithreadinget találtam a háttérben, miért kell az await-et az async függvények belsejére korlátozni - de ez csak egy költői sóhaj ;) )
De nincs azonnal :(
Pl. amikor azzal indítok,
Normálisan (pseudokód) ez valahogy így megnne:
read ini file
parse -> dictionary
...
if dictionary['a-param']{...}
if dictionary['b-param']{...}
stb.
Itt a read (storage.local.get) után nem eshetek neki a paramétereknek, valahogy be kell várnom, míg azok rendelkezésre állnak. Megoldható, csak gusztustalan számomra. (pythonban már neki sem esnék, ha meglátom, hogy async def ;) )
Én kezdetektől fogva örültem
Úgy értem, nem akarok olyat
Még mindig firefox extension - oldal méretének változtatása
Aztán megnézem és kiderül, hogy általában jónak látszik, de van pár kivétel.
Ott a getComputedStyle() -> végigmegyek egy kinyitott lap elemein, megnézem, hol van eltérés a default fontsize-tól. Hát elég sok helyen, viszont konkrétan az elemeken nincs ilyen beállítás, valamennyi .style.fontSize=="".
És itt el is akadtam. Nagyjából a Ctrl - +, Ctrl - - gombok működését kellene szimulálni valahogy, de eddig nem találtam használható megoldást rá.
Vizsgáló > számított css
CSS állításra ott van még a tabs.insertCSS(), tabs.removeCSS (vagy ugyanezek scripting alatt, ha manifest V3).
Amit megnéztem, arra azt
Csak megnyitottam egy lapot, ahol volt egy dőltbetűs idézet és akkor tűnt fel, hogy a dőltbetű nem növekszik. :)
Ezt követően másztam végig az egész dom fán és megállapítottam, hogy sehol egy egyedi beállítás, mégis teli van eltérő méretű (getComputedStyle) fontokkal, amiknél nem találtam programból az eltérő méret forrását. Akkor néztem rá erre és állapítottam meg, hogy ez simán a default beállítások következménye, nincs rajta sehol külső CSS-ből állított méret.
Az ötlet onnan jött, hogy többen említették, az oldal túl apróbetűs, nem igazán igazodik jól a nagyfelbontású, kijelzőkhöz, míg más oldalak megteszik. Emiatt a böngésző/desktop rendszer nagyító funkcióját nem használhatják, az oldalra kellene külön egy nagyító. :)
(félre ne érts, nem akarom, hogy más oldja meg helyettem, pusztán hangosan gondolkodom, hogy egyáltalán létezik-e erre épeszű megoldás vagy tényleg fel kell túrni minden eltérő méretű elem méretének forrását és azt átírni?)
Nem fut le a content script, amíg... (+ reakcióidő)
Ez vajon egy új feature vagy valami olyanba futottam bele, ami eddig is volt, csak nem vettem észre?
És van vele még egy gond: amit itt korábban emlegettem... betölti az eredeti oldalt, majd némi késleltetéssel kezdi átrajzolni. Nem a megjelenítés előtt fut le a content.js. :(
(Update: lehet, hogy erre megoldás a manifest.json-ben elhelyezett "run_at": "document_end" - ezt még ki kell próbálni)
Az egész ennyi:
manifest.json:
Firefox 112 - vicces kis szoftver
Most szántam rá magam, hogy előszedjek egy régebbi firefoxot - igaz, ez még 102-es (Debian), de ezen szó nélkül lefut, nem kell külön engedélyezni.
Úgyhogy ez van: 112-től lehet készülni erre a meglepetésre is :)
Jogi kérdés ( :D )
VPN-ről megkerülhető a védelem gond nélkül.
Viszont olyan dilettáns módon van megoldva, hogy amikor az oldal generálódik, akkor változtatja a multimédiás linkeket a valódiról az elutasító üzenetre.
Ha VPN-ről megnyitom, bontom a VPN-t, majd az így kapott linkekre kattintok, már megkapom a kért tartalmat.
A jogi kérdés: vajon ha saját használatra gyártok egy extensiont, ami szépen végigmegy betöltés után az oldalon és az elutasító linkeket az oldal többi adata alapján visszacsinálja a valósra, akkor azzal jogsértést követek-e el?
Mert ha abból indulok ki, hogy VPN-ről használva működik, akkor nem tökmindegy, hogy VPN vagy valami egyéb mód?
Ha abból indulok ki, hogy megkerülök egy védelmi rendszert, bármennyire elb...... is... akkor ugye... :)
Csak tipp
:) Bocs, ez inkább csak
Hogy ez így jogilag megállja-e a helyét, azt nem tudom (egy amcsi vagy kínai site-ot milyen alapon büntetne egy EU-s szervezet?).
Néha benézek oda és amikor először belefutottam ebbe a marhaságba, akkor vettem észre, hogy a VPN-nel simán kijátszható a "védelem", később meg azt is, hogy rossz helyre tették be az IP cím országának ellenőrzését, így simán megkerülhető. Aztán most, hogy játszom a javascripttel, eszembejutott és megnéztem: két for ciklus meg egy értékadás és működik EU-s címről is.
Viszont egy ideje ugye minden törvénysértő, amivel védelmet megkerül az ember. Tképp az adblock is az, ha úgy vesszük. :D
IndexedDB vs privacy...
A google jelen ismeretei szerint nincs eszköz a kezemben, hogy kilistázzam a böngészőmben tárolt IndexedDB adatbázisokat és megnézzem a tartalmukat.
Egyedült a Developer Tools-ban található Storage Inspectort említi a hivatalos doksi is, de azzal csak az épp vizsgálat alatt álló site adatbázisait láthatom.
Ha meglátogatok egy oldalt és az lerak hozzám egy ilyen adatbázist, akkor sosem fogom megtudni, hacsak nem figyelem az ilyen tevékenységeket (bár elnézve, hogy sok oldal hány domainről gyűjti be a használt javascript kódokat, ez is reménytelen vállalkozásnak tűnik)
Gondolom, az aktív profil könyvtárában megtalálhatom .sqlite formában ezeket, de az meg ugye titkosítva van, nem tudom kicsomagolni, hogy megnézzem a tartalmát.
Vicces, na... (nem annyira -> lásd még evercookie és társai)
A poén a dologban, hogy én pont arra akartam használni, hogy egy szavazós oldalon akkor se tudjon valaki többször szavazni, ha törli a cookie-kat a böngészőjéből.
O.K., törölni végső soron lehet őket, de hogy nem tudok belenézni a saját gépemen, a saját böngészőmben, hogy egy idegen oldal mit pottyantott oda...
Content scriptből dialog?
De akkor hogy a bánatba lehet a content script-tel saját html kódot injektálni a weblapba, lehetőleg úgy, hogy névütközést se okozzak? (O.K., createNode stb., de mi van, ha külső fájlból szeretném betölteni a html-t és css-t, természetesen az extension saját könyvtáraiból?)
Egyébként a Developer Tools konzolon vajon miért nem tudom elérni a browser.runtime interface-t/API-t/objektumot? A content script eléri (legalábbis a sendMessage működik), de a development konzol valamiért nem ismeri, így kipróbálni sem tudok onnan egy csomó dolgot. :(
(most konkrétan a getUrl-t akartam kipróbálni, úgy jött elő, hogy nincs neki olyan)
update: valami olyasmit szeretnék látni, mint amit a uBlock0 művel a jobbklikk, Block Element hatására. Az a baj, hogy az említett extension kódja elég bonyolult ahhoz, hogy egyelőre ne találjak meg benne szinte semmit.
Próbáltam egy olyat, hogy fetch(browser.runtime.getURL('/html/dialog.html')..., de erre meg security error... a válasz, így még betölteni sem tudom a saját html fájlomat a documentum végére...
Korrekció: természetesen a /html/* benne volt a web_accessible_resources listában, manifest v2 alatt működik is, v3 alatt (megfelelően átalakítva persze) nem. Szerettem volna úgy megírni, hogy v3 és fut chrome-on is, de ez végképp esélytelen, mivel pár dologban már manifest szintjén sem kompatibilis a két világ. :(
Kezdek ott tartani megint, hogy ez is megy a korábbi pythonos cuccaim után a kukába. Annyira irritálóan el van bonyolítva az egész. Ha már lehet neki saját resource fájlokat adni, mi a francér' nincs korrekt mód a betöltésükre?
Update n+1: vajon igaza lehet annak a nyomorult chatgpt-nek, hogy manifest v3 esetében csak background script tölthet be fájlt fetch() segítségével? Mert eredetileg v3-mal próbálkoztam, most mindent visszaírtam v2-re, így többé-kevésbé megy a betöltés, bár még nem tudom, ebből lesz-e popup dialog. Viszont v3 alatt képtelen vagyok content script-ből betölteni bármit. :(
Most nincs időm mélyebben
Mondjuk fura lenne, ha webről elérhetőek lennének az extension web_accessible_resource-ai, content scriptből meg nem. Másik nyakatekert megoldás: a dialogot megcsinálod scriptből, a tartalma meg egy iframe-ben betölti a web_accessible_resource-t :D
A css elvileg egyszerűbb a loadCSS() függvénnyel, vagy csak statikusan betöltve (bár gondolom ezt is tudod).
Köszi, azt nem is várom
Csak ha fejből jön valami ötlet.
Aludtam rá egyet, nekiugrok újra a dolognak, mert az biztos, hogy contentből muszáj elérni a web accessible fájlokat, csak az a kérdés, hogy pl. kell-e valami "matches" is hozzá. Eddig nem jutottam el tegnap, mert a kompatibilitási mátrix szerint az egyik variáció nem megy androidos firefox-szal, így azt kihagytam. Majd ma, csak előbb kettéágaztatom v2 és v3 felé, mert eddig simán ment minden verziófüggetlenül, most meg jönnek a csontvázak a szekrényből :)
Nekem az lenne a tippem, hogy
A doksi (mdn) elég furcsán
De az sem kizárt, hogy a wildcard nem tetszik neki valahol.
Az meg külön öröm, hogy a chrome.* csak részben van implementálva, a background scripts helyett meg valami worker kellene a v3-ban. A firefox ragaszkodik a background scripthez, a chrome meg a workerhez. :D
Úgy fest, valamit elkefélt valaki az "extension_ids"...
Ezt írja a doksi:
"Each object must include a "resources" property and either a "matches" or "extension_ids" property from the following properties:"
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/web_accessible_resources
Én ezt úgy értem, hogy kötelező a resources és a matches/extension_ids közül az egyik.
A "matches":"*://*/*" működik (bár van egy olyanom, hogy az utolsó * felesleges).
Viszont az extension_ids-re egy korrektnek nevezhető példát sem találok.
A matches meg azért nem az igazi, mert csak a desktop firefox ismeri, az androidos nem.
Az extension_id jó lett volna ide is, chrome alá is, nem is akarom, hogy más extension piszkálja ezeket, de nem tudom kitalálni, mi is kéne oda. Folyt. köv. (Hogy Fülig Jimmy-t idézzem: "Megfojtatása következik" :D)
Extension id firefox oldalon
Van egyszerűbb
"extension_ids": []
Bár megjegyzem, a linkelt doksiban van valahol egy kitétel, miszerint a wildcard megengedett bárhol - itt is. :)
Szó nélkül megeszi, de önmagában kevés, pedig az "either" tudtommal azt jelenti, hogy akár/egyik stb. A matches nélkül v3 alatt következetesen permission errort vagy mit ír a nyomorult a fetch-re.
Chrome egyelőre nem cél, mivel szinte kizárólag firefox-ot használok, csak pl. Androidon a kiwi browser az egyetlen, amivel egy ilyen extensiont meg lehet etetni, az viszont chrome alapú :)
sleep -> new Promise -> nem értem :)
De azt a "resolve" nevű valamit nem értem. Jó, én olyan nyelveken szocializálódtam, ahol kötelező volt a változók előzetes deklarációja, minimum egy értékadás formájában. Jól sejtem, hogy ez a fenti kód csak annyi, hogy van egy definiálatlan ("magyarul" undefined) értékű változó, amitől nem dob hibát, csak nem csinál vele semmit?
Ha igen, akkor lehet, hogy működik, de U N D O R Í T Ó :D
Szájbarágósan:function
A kódban, amit te küldtél példának a resolve függvény közvetlenül van átadva a setTimeout callbackjeként.
Update: maximum úgy async a setTimeout, hogy a hívó kód nem várja meg a callbacknek átadott függvény lefutását.
Ez mind tiszta, de a resolve
Az egészből egyedül az zavar, hogy az itt resolve-nak nevezett változó sehol sem kap értéket. (mondjuk ha a helyére a setTimeout-ba azt írom, hogy undefined, akkor nem tudom, mi történik, mert akkor a mögé írt parancs nem fut le :) )
async function sleep(n){ //
Utálom a JS-t...Valójában
Valójában nem ott kap értéket ahol megjelölted, ott csak a hivatkozás van, hogy az átadott anonim függvénynek van egy (vagy két) paramétere, amit a Promise objektum konstruktora(??) kitölt.
Ez az a pont, ahol azt hiszem, a funkcionális nyelvekből átvett borzalmak kezdenek eluralkodni rajta: a hivatkozott pontra egy függvényhivatkozást kell tenni, méghozzá olyat, aminek egy vagy két paramétere van: az első kötelező, ebbe kerül egy függvényhivatkozás valahonnan a Promise osztályon belülről, ami a Promise.resolve() statikus metódusára hivatkozik, míg az opcionális második a .reject() metódusra. Na ezt kerestem én, de csak a sokadik doksiból sikerült megérteni.
Szóval a timeoutos példánál maradva, a setTimeout(Promise.resolve(),n*1000) hajtódik végre a valóságban (mivel statikus metódus, talán még így is tud működni).
Ez hiányzott nekem a történetből.
Máshogy
Hozzáadnék a laphoz egy popup
Hova szokás/illik/szabad hozzácsapni?
Addig megvan, hogy
És akkor még ott van, hogy a megjelenítése is "érdekesnek" tűnik, mert ugye minden css paramétere üres ilyenkor, emiatt széle-hossza=0.
ui: ezt próbáltam a stackoverflow-n is megkérdezni, de csak egy -1-re futotta a 20 látogatótól. :D
Nem feltétlenül kell ID
Köszi szépen! Csak abból
Csak abból indultam ki, hogy ha nincs id/class, akkor külső CSS-t nem tudok ráhúzni (legalábbis jelen ismereteim szerint, anélkül meg kilométeres kódot írhatok, mire megkap mindent ami fontos.
Classt nyugodtan lehet
Na jó, csak ha sikerül
Full off: CSS-ről jutott eszembe... le lehet tiltani a szövegkijelölést. Könyörgöm, minek? Mobilon még so so, de desktopon nyomok egy F12-t és másolom amit akarok. :D (van egy oldal, amin érdemi tartalom alig, de rettegnek, hogy valaki nehogy ellopja a semmit. Hihetetlen, na... :( )
Polling
O.K. Használjak helyette setTimeout-ot.
De az hosszú távon nem vezet memória szivárgásra emlékeztető állapothoz?
Merthogy az a doksi szerint is rekurzív, ha a setTimeout-ban megadott függvényben adok újabb timeoutot...
Mert ugye egy
Szóval ez valóban nem tűnik jónak.
Mondjuk tekintettel arra, hogy a setTimeout nem igazán async függvény, inkább multithreading környezetbe tenném... Talán mégsem annyira gázos, mint elsőre gondoltam.
extensionből form data
Ezt vajon hogy lehet?
A browser.browsingData csak törlést ismer :(
(ChatGPT itt is hallucinált egy jót :D)
Ui: itt a hangsúly az extension használatán van, mert ha nem akarok kézzel nekiesni és a DEL gombot nyomkodni, sqlite kliensből akkor is hozzá lehet férni. Csak azt nem látom, hogy API-n keresztül ez elérhető lenne...
Miért csak firefox alatt működik? (terhelés teszt)
Chromium és Opera alatt viszont...
Az egész úgy működne, hogy a
Firefox esetében kb. ez történik(*), ellenben a chromium és az opera lefagynak a 20000 soros verziótól, míg a fenti beállításnál úgy a feladatok felénél teleírja a konzolt net::ERR_INSUFFICIENT_RESOURCES hibával. O.K., a húszezer fetch élő alkalmazásban túlzás lenne, de egy néhány százas nagyságrend? Mondjuk egy Single Page App esetén?
Meg lehet valahogy előzni ezt anélkül, hogy a hibára futó fetch-eket x idő elteltével újraindítom? Annyit azóta találtam, hogy a chromium (opera is arra épül :( ) eléggé korlátozottan bocsájtja rendelkezésre az erőforrásokat, szóval a hibák mondhatni normálisak, de egyelőre ötletem sincs, hogy adott esetben ezt hogyan lehet kiküszöbölni kulturált módon.
* - na azért a firefox sem tiszta történet. Egy darabig nyomja a hibára futó fetch-ek üzeneteit a konzolra, majd gondol egyet, törli a konzol tartalmát és többé meg se nyikkan. Közben még dolgozik a script a háttérben. WTF?
Ehhez lazán kapcsolódik, de fogalmam sincs, milyen témakör, hogy ha a mysql szervert futtató docker konténerben belépek root-ként az adatbázisba és ottmaradok ÉS újraindítom a uwsgi szervert, akkor a firefox-ból induló első kb. száz-százhúsz requestből néhány hibára fut (2013, Lost connection to MySQL server).
Van valakinek ötlete, hogy merre keressek? Itt az a furcsa, hogy ha nem indítom újra a uwsgi-t vagy nem vagyok belépve az adatbázisba, akkor nincs ilyen gond vagy legalábbis nem sikerült így reprodukálni.