Greasemonkey, Chrome y unsafeWindow.foo ()
-
25-09-2019 - |
Pregunta
Tengo la siguiente etiqueta de anclaje, que contiene argumentos generado dinámicamente arg1,...,arg5
a la función de JavaScript foo()
, que se ejecuta en el lado del sitio web. Hay varias de estas etiquetas de anclaje a través de la página en cuestión, con valores únicos y valores id
argN
:
<a href="#" id="foo1234567890" onclick="javascript:foo(arg1,arg2,arg3,arg4,arg5);return false;" target="_self" title="foobarbaz"> blah </a>
Me gustaría disparar mediante programación la función foo()
por bucle a través de todos los éxitos para este elemento, en busca de los argumentos, y pasando los argumentos al llamado unsafeWindow.function(args)
de Greasemonkey.
Aquí está el script de Greasemonkey que he escrito hasta ahora:
function removeAllProperties() {
var xpath = "//A[@title='foobarbaz']";
var actionNodes = document.evaluate(
xpath,
document,
null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
null
);
var total = actionNodes.snapshotLength;
for (var i=0; i < total; i++) {
var candidate = actionNodes.snapshotItem(i);
//alert(candidate.nodeName);
if (candidate.nodeName === "A") {
var onclick_value = candidate.getAttribute('onclick');
var needle = /javascript:foo\((.*)\);return false\;/;
onclick_value.match(needle);
//alert(onclick_value);
//alert(RegExp.$1);
var script_args = RegExp.$1;
if (confirm(script_args)) {
unsafeWindow.foo(script_args);
}
}
}
}
removeAllProperties();
Cuando instalo este script y ejecutarlo, me da la alerta con el arg1,...,arg5
argumentos. Si hago clic en OK, me sale el siguiente error en Google Chrome 5.0.375.125 para OS X:
Uncaught TypeError: Object [object DOMWindow] has no method 'foo'
La página web en cuestión definitivamente tiene foo()
- si hago clic en blah
entonces el onclick
activadores de eventos foo()
. No puedo conseguir que funcione a través de este script de Greasemonkey.
Am I utilizando unsafeWindow.function(args)
de forma incorrecta, o hace Google Chrome no apoyar este método de activación remota las funciones de JavaScript?
¿Hay una manera diferente que debería utilizar esta función, o debería utilizar otro método completamente?
Gracias por su consejo.
Solución
En Chrome, no estás permitido a las variables de acceso / funciones definidas por el contenido de la página a partir del contexto userscript (ver aquí ).
En lugar de llamar unsafeWindow.foo
, sólo podría llamar candidate.onclick()
en su bucle.
Si eso no es lo que quiere, que o bien tiene que inyectar la llamada a la función en el DOM usando algo como
var s = document.createElement("script");
s.innerHTML = "foo("+ script_args + ")";
document.body.appendChild(s);
o asignar un JS-uri a location
:
location.assign("javascript:foo(" + script_args +");void 0");