Cambiar elementos a traves de una extension no funcoiona

Hola!

Estoy intentando hacer un pequeño plugin para firefox para apender XUL y DOM.

Consiste en que al pulsar botón derecho sobre un enlace se borre de la página y se cambie por otro enlace mas un texto. En principio funciona bien, pero en la página no aparecen los enlaces solo texto. Mirando el codigo fuente seleccionado parece estar bien, pero el navegador no lo representa

el plugin podeis descargarlo para probarlo de:

megaupload.com/?d=YHJ8PRH3

Alguien puede ayudarme por favor! :

overlay.js:
prueba.BrowserOverlay = {
/**

  • Change link selected
    */
    enlace : function(aEvent) {
var focused = document.commandDispatcher.focusedElement;  
var cadena=""+focused.toString();

if (cadena.search(/http:\/\//i) >= 0){
  //window.alert("#"+cadena+"#");
  
  focused.focus();
  var padre = focused.parentNode;    
  
  var seccion = document.createElement('span');
  var salto = document.createElement('BR');
  var enlace = document.createElement('a');
  enlace.setAttribute('href','http://www.yahoo.es');
  var txt2 = document.createTextNode('Yahoo');
  enlace.appendChild(txt2);
  var encabezado= document.createElement('h1');
  var txt = document.createTextNode('TEXTO TEXTUOSO');
  encabezado.appendChild(txt);
  seccion.appendChild(encabezado);
  seccion.appendChild(salto);
  seccion.appendChild(enlace);
  padre.replaceChild(seccion, focused);
  //window.alert("#FINNNNN#");
}

}
};

window.addEventListener(“load”, prueba.onFirefoxLoad, false);

Hola

No funciona por que cuando hacer document.createElement, estas haciendo referencia al documento XUL de firefox, no al HTML del contenido, por lo que estas creando un elemento xul “a”, que no existe, por lo que no tiene ningun comportamiento definido.

Cambia

      var seccion = document.createElement('span');
      var salto = document.createElement('BR');
      var enlace = document.createElement('a');
      enlace.setAttribute('href','http://www.yahoo.es');
      var txt2 = document.createTextNode('Yahoo');
      enlace.appendChild(txt2);
      var encabezado= document.createElement('h1');
      var txt = document.createTextNode('TEXTO TEXTUOSO');

Por

      var contentdoc = focused.ownerDocument;

      var seccion = contentdoc.createElement('span');
      var salto = contentdoc.createElement('BR');
      var enlace = contentdoc.createElement('a');
      enlace.setAttribute('href','http://www.yahoo.es');
      var txt2 = contentdoc.createTextNode('Yahoo');
      enlace.appendChild(txt2);
      var encabezado= contentdoc.createElement('h1');
      var txt = contentdoc.createTextNode('TEXTO TEXTUOSO');

Eso es !

Muchísimas gracias!, me estaba volviendo loco :slight_smile:

Hola, siento sacar otra vez este tema, pero vuelvo a tener problemas y no se por donde salir :stuck_out_tongue:

Quiero sustituir un enlace pero por un texto que me llega a través de una petición XMLHttpRequest.

Cuando me llega la respuesta quiero coger solo una capa div de ella y lo intento así:

dataFilter=((aEvent.target.responseText).document.getElementById(“respuesta”));

Nunca encuentro la capa que busco supongo que por no es un objeto DOM, asi convierto ese html recibido a dom con:

function HTMLParser(aHTMLString){
var focusedWindow = document.commandDispatcher.focusedWindow;

var html = focusedWindow.document.implementation.createDocument(“http://www.w3.org/1999/xhtml”, “html”, null),

body = focusedWindow.document.createElementNS("http://www.w3.org/1999/xhtml", "body");

html.documentElement.appendChild(body);

body.appendChild(Components.classes"@mozilla.org/feed-unescapehtml;1"]
.getService(Components.interfaces.nsIScriptableUnescapeHTML)
.parseFragment(aHTMLString, false, null, body));

return html;
}

y aqui trato de obtener la capa:
var DOMPars = HTMLParser(aEvent.target.responseText);

dataFilter=(DOMPars.getElementById(‘respuesta’)).firstChild.innerHTML;

Con esto obtengo el resultado, pero aparece en modo texto y no html (tal y como me ocurría al principio de mi primer post sobre este tema). Se os ocurre como puedo solucionarlo!.

Gracias y perdonar el rollo!

Hola

¿puedes poner el código del XHR también? no deberías de necesitar parsear los datos de nuevo, el XHR ya los parsea (si el servidor los sirve con el mime/type correcto y si no, usa overrideMimeType)

¿Como es la estructura de los datos que llegan por el XHR? ¿Estas tratando de cambiar lo que hay en el enlace por una cadena que contiene HTML o por una cadena sin mas?

Un saludo

envio/Recibo una página html estandar a la que se puede acceder desde el navegador de forma normal… Te vale esto?:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>mi_pagina</title>
<meta name="keywords" content="pruebas" />
<meta name="description" content="Pruebas mientras pruebo" />
<link href="/css/templatemo_style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="/library/idiom.js"></script> 
<script src="/library/jquery-1.4.4.min.js" type="text/javascript" charset="utf-8"></script>		
<script type="text/javascript" src="/library/tiny_mce/tiny_mce.js"></script>
</head>


<body>

<div id="templatemo_body_wrapper">
<div id="templatemo_wrapper">
    
    <div id="templatemo_header">
......

como hago esto si no es mucha molestia?: “el XHR ya los parsea (si el servidor los sirve con el mime/type correcto y si no, usa overrideMimeTyp”

muchas gracias por tu ayuda!

Hola

Si el servidor sirve la pagina como application/xhtml+xml, el árbol DOM del documento esta en xhr.responseXML, si no, puedes hacer dos cosas:
a) Antes de hacer el xhr.send(), haz una llamada a overrideMimeType:
xhr.overrideMimeType(“application/xhtml+xml”);
xhr.send();
El problema de esto es que si el xhtml de la pagina es incorrecto, no funcionara (y es muy común paginas con xhtml que no valida)
b) Parsearlo como HTML, y obtener los datos. (básicamente lo que estas haciendo)

Todavía no estoy seguro de lo que quieres hacer. Si no he entendido mal, cuando el usuario hace clic en un enlace, pides una pagina por XHR, y remplazar el contenido de el enlace por parte de el HTML de la pagina que has pedido ¿me equivoco?

Un saludo.

si, pretendo modificar un enlace en una página por parte (un div) de un contenido devuelto por el servidor.

En cuanto llegue a casa pruebo lo que me estas comentando a ver si puedo arreglarlo :). Ya te digo algo.

muchas gracias por tu interés.

Hola

En principio no deberías hacer eso nunca, ya que abre agujeros de seguridad muy importantes. ¿La pagina que pides esta alojada en un servidor tuyo? ¿necesitas que los datos sean cadenas html arbitrarias por alguna razón?

Suerte

¿por que es un agujero de seguridad?, por si no me has entendido:

tengo una página B en un servidor cualquiera, otra página A en otro servidor y un plugin instalado.

Mi intención es que sobre la página B en un enlace (donde por ejemplo hay un dni) hago botón derecho y ejecuto una opción del menu contextual (mi plugin) que pide a la página A una página web pública dinámica, dentro de esa respuesta hay una capa que se usará para borrar el enlace de B y sobreescribir en ese lugar información detallada sobre ese sujeto … No veo el riesgo de seguridad .

En fin, lo que me comentastes no funcionó, así que la página A envia un div oculto que puedo recoger en B con el plugin, no es elegante pero de momento funciona(no funcionaba el getElementById), si algún día consigo acabarlo te diré la página para que lo pruebes … y entonces seguro que me dices que es un riesgo, pero otra parte que estoy desarrollando y de la que no sé como saldré :wink:

Un abrazo.

La pagina que proporciona el HTML podría ser hackeada, e incluir un script en medio del html, que puede usarse para robar dados o realizar acciones en la pagina de destino.

La forma de hacerlo es: si tu eres propietario de la pagina que genera el html, haz una API en JSON o XML para que la extensión consiga los datos, si no: extrae los datos usando expresiones regulares o de alguna otra forma.

Una vez que ya tienes los datos en la extensión, genera lo que necesites usando DOM, y listo.

Si necesitas ayuda con esta parte, dime cual es la pagina de la que obtienes datos, o ponme la porción de html que intentas extraer

Un saludo

muchas gracias, en cuanto tenga un rato miro lo de json. Si tengo problemas te tomo la palabra :wink:

Muchísimas gracias por toda tu ayuda prestada.

[quote=“paspas”]muchas gracias, en cuanto tenga un rato miro lo de json. Si tengo problemas te tomo la palabra :wink:

Muchísimas gracias por toda tu ayuda prestada.[/quote]

Y solo se puede cambiar el texto html (por ejemplo el enlace) por un texto plano? no se podría importar una función javascript, e insertarla en el código. Con css y html lo he hecho facil, pero los scripts no me los coge