Javascript-bokmärkeslets på webbplats med CSP i Firefox
Jag har ett enkelt Javascript-bokmärke som jag satte ihop för att köra innehållet i ett lämpligt GitHub-förråd mot ett externt verktyg:
javascript:(function(){
var isApex = false;
var sourceLangs = document.getElementsByClassName('lang');
for (var i = 0; i < sourceLangs.length; ++i) {
var l = sourceLangs[i];
if(l.innerHTML == 'Apex') {
isApex = true;
// alert('This is an Apex repo');
}
}
if(location.hostname != 'github.com' || isApex == false) {
alert('This is not a GitHub Apex repository!');
}
else {
window.open('https://githubsfdeploy.herokuapp.com/app/githubdeploy'+location.pathname);
}
})();
När jag kör det i Chrome eller IE (efter att ha kört det genom Daring Fireballs JS-bookmarkletbyggare fungerar det bra. I Firefox genererar det Content Security Policy-fel:
[15:33:19.318] Content Security Policy: Directive inline script base restriction violated @ https://github.com/Groundwire/Campaign-Combiner
Jag har läst denna SE-fråga om ämnet, och GitHub-blogginlägget om CSP, som erkänner att CSP inte borde störa bookmarklets, men vid den tiden (april 2013) "fick ingen av webbläsarna detta rätt." Är det för närvarande så att Firefox fortfarande har detta fel, men Chrome och IE har det rätt?
Jag hittade också ett blogginlägg om användarskript och CSP, och där kunde författaren hantera problemet genom att inkludera koden från ett GitHub-repo. Jag försökte det och ändrade mitt bokmärkeskript till:
javascript:document.body.appendChild(document.createElement("script")).src="https://raw.github.com/tet3/GitHubInstallerBookmarklet/master/GHIBkmarklet.js";void(0)
Men föga förvånande fungerade det inte för ett bokmärkescript, eftersom anroparkoden fortfarande kommer från webbläsaren.
Kort sagt - några idéer om hur man får detta bokmärkesverktyg att fungera på Firefox?
Svar #1
Jag har tittat på det här problemet också, mest i Firefox. Jag var inte medveten om att det skulle fungera i Chrome; det kan vara en nylig förändring. Utan att Firefox ändrar sig för att känna igen bokmärkeskript som utanför policyn (som det borde!), finns det ingen lösning. Skriptet kommer inte att köras, punkt slut, du är helt fast.
Alternativ :
1.) Skapa ett tillägg; eller använd ett befintligt tillägg som Greasemonkey för att köra ett användarskript.
2.) Kör koden i webb-konsolen. I FF, CTRL+Shift+K tar dig dit på ett ögonblick.
3.) FF:s utvecklaranteckningsblock fungerar också. Om du sparar koden i en fil kan du komma åt den relativt snabbt med Shift+F4 (öppna anteckningsblock) > Fil > Öppna senaste > välj din fil > CTRL+R (kör).
Svar #2
Som en lösning på att CSP blockerar bokmärkeslets, kan du få ditt bokmärkeslet att ladda ett externt CSS-stilmall med din JS-kod injicerad i den. Så här gör mitt Top News Feed-bokmärkeslet. Se mitt andra svar.