Como posso Greasemonkey imitar / funcionalidade unsafeWindow do Firefox no Chrome?
-
06-07-2019 - |
Pergunta
Eu estou apenas brincar com scripts de usuário no Chrome agora, por isso, tenha meu potencial ignorância / idiotice.
Na página Eu estou escrevendo um script para, há um elemento <script>
que declara uma x
variável.
Quer isto dizer que, no meu script de usuário, eu posso x
apenas acesso a partir do namespace global?
Por exemplo, se a única linha no meu userscript é alert(x);
, deve esse trabalho como esperado (assumindo x
é uma String)? Eu entendo Chrome não suporta unsafeWindow, mas por alguma razão eu estou achando impossível descobrir como imitar a funcionalidade. Será que é mesmo possível?
Solução
contentWindow
estava disponível no Chrome 3, mas removido em cromo 4 . Apenas possível solução para Chrome 4:
location.href="javascript:(function(){ alert('Hello'); })()"
Outras dicas
Isto lhe dará uma referência para o objeto de janela (como p):
var p = unsafeWindow;
if(window.navigator.vendor.match(/Google/)) {
var div = document.createElement("div");
div.setAttribute("onclick", "return window;");
p = div.onclick();
};
Update:
O onclick
explorar já não funciona nas versões mais recentes do Chrome.
Para obter a funcionalidade unsafeWindow
no Chrome, a sua melhor aposta é a de instalar e usar Tampermonkey - o que você seria inteligente a fazer, independentemente. Tampermonkey tem suporte completo para o API Greasemonkey e muito mais fácil de gerenciamento de script.
scripts Greasemonkey e scripts Tampermonkey são quase sempre totalmente compatível, algo que não é verdadeiro para userscripts Chrome simples.
renunciar Tampermonkey, a única alternativa que ainda funciona é usar alguma forma de .
O seguinte é agora obsoleto:
Chrome agora define unsafeWindow
para userscripts / Conteúdo-scripts , mas unsafeWindow
do Chrome ainda não permite o acesso a JS objetos criados pela página de destino.
Veja como fornecer uma adequadamente inseguro, unsafeWindow
- de uma forma cross-browser que usos detecção de recurso (bom) versus Navegador Sniffing (Bad) :
/*--- Create a proper unsafeWindow object on browsers where it doesn't exist
(Chrome, mainly).
Chrome now defines unsafeWindow, but does not give it the same access to
a page's javascript that a properly unsafe, unsafeWindow has.
This code remedies that.
*/
var bGreasemonkeyServiceDefined = false;
try {
if (typeof Components.interfaces.gmIGreasemonkeyService === "object") {
bGreasemonkeyServiceDefined = true;
}
}
catch (err) {
//Ignore.
}
if ( typeof unsafeWindow === "undefined" || ! bGreasemonkeyServiceDefined) {
unsafeWindow = ( function () {
var dummyElem = document.createElement('p');
dummyElem.setAttribute ('onclick', 'return window;');
return dummyElem.onclick ();
} ) ();
}
Se você quer interagir com a página JavaScript, você terá que inserir um script em uma página. (A menos que você quiser usar qualquer um dos hacks sugeridas para esta página, é claro.) I ter inventado uma função para fazer exatamente isso para os meus próprios scripts, vou postar aqui no caso de alguém quiser usá-lo.
/*
@description This function will insert the given code as a <script> or <style> block into a page.
@param The code to insert; supported types are: JavaScript Function, String (JavaScript), String (CSS).
@param2 Optional: The type of code that is inserted. If omitted, "js" is assumed. Possible values are 'js' or 'css'.
@return The HTML element that was inserted, or FALSE on failure
*/
function insert(z,t){
var j,f,x,c,i,n,d
d=document
c=d.createElement
i=d.head.appendChild
a=d.createTextNode
if(typeof z==='function') j=!0,f=!0;
if((t=='js'||!t)&&!f){j=!0,f=!1}
if(t=='css'&&!j){x=c('style');x.setAttribute('type','text/css')}
if(j){x=c('script');x.setAttribute('type','text/javascript')}
if(f) n=a('('+z+')()');else n=a(z)
x.appendChild(n)
if(x){return i(x)}else{return !1}
}
Alguns exemplos para esclarecer:
//Inserting a JavaScript function
var func=function(){
stopAds();
startFileDownload();
}
insert(func);
//Inserting JavaScript as a string
var strJS="prompt(\"Copy:\",someVariableAtThePage);";
insert(strJS);
//Or with an OPTIONAL 2nd parameter:
insert(strJS,'js');
//Inserting CSS
var strCSS=".ad{display:none !important} #downloadButton{display:block}";
insert(strCSS,'css');//Specifying 2nd parameter as "css" is required.
ok heres uma idéia que você pode injetar o script usando a barra de endereços ...
javascript:var ElEm = document.createElement("script");ElEm.src='[path_to_script]';document.body.appendChild(ElEm);
então você pode executar o que quiser na janela com seu javascript