2016-08-16 3 views
2

Je suis en train de maintenir un module complémentaire de superposition pour Firefox. Pour passer le processus de validation Add-on de Mozilla, je dois remplacer innerHTML() appels manipulant le contenu d'un élément DOM.Je veux remplacer l'appel innerHTML() dans un addon de superposition de Firefox

Je crée une nouvelle cellule d'une table et souhaite mettre le contenu en utilisant cette approche:

var newCell = tbl.rows[row].insertCell(col); 
var div = document.createElement('div'); 
div.appendChild(document.createTextNode(content)); 
newCell.appendChild(div); 

message d'erreur:

TypeError: Argument 1 of Node.appendChild does not implement interface Node. 

[email protected]://gre/modules/RemoteAddonsChild.jsm:461:5 

EventTargetChild/[email protected]://gre/modules/RemoteAddonsChild.jsm:431:38 

Ajout des messages journaux entre les lignes montrent que la type de la nouvelle cell et l'élément div sont différents:

var newCell = tbl.rows[row].insertCell(col); 
console.log("cell-0: " + newCell); 
var div = document.createElement('div'); 
console.log("div-0: " + div); 
div.appendChild(document.createTextNode(content)); 
console.log("div-1: " + div); 
console.log("cell-1: " + newCell); 
newCell.appendChild(div); 
console.log("cell-2: " + newCell); 

les messages du journal sont:

cell-0: [object CPOW [object HTMLTableCellElement]] 
div-0: [object XULElement] 
div-1: [object XULElement] 
cell-1: [object CPOW [object HTMLTableCellElement]] 

Toutes les idées que je fais mal ici?

Merci d'avance.

+0

Désolé, ne pas aider ici, mais j'utilise FF 48 et cela fonctionne: https://jsfiddle.net/pj2eugLh/ – blex

+1

Vous utilisez ['HTMLTableRowElement.insertCell()'] (https: // développeur. mozilla.org/en-US/docs/Web/API/HTMLTableRowElement/insertCell) pour essayer d'insérer des nœuds dans un document XUL. Il semble avoir créé des éléments HTML au lieu d'éléments XUL. Nous allons avoir besoin de plus d'informations sur le '' que vous insérez dans et comment il a été manipulé précédemment. Un lien vers la version actuelle du module wo9uld sera utile. – Makyen

+0

@blex, Ceci est inséré dans un document XUL. Il ne sera pas possible de le prototyper avec précision en utilisant un site HTML (par exemple jsfiddle.net).Tester XUL nécessiterait que le fichier soit local à la machine (XUL Explorer), ou en utilisant un URI 'chrome: //' dans une application basée sur Mozilla. – Makyen

Répondre

1

cellule-0: [object CPOW [object HTMLTableCellElement]]

A CPOW est un cross process object wrapper, ce qui signifie qu'il provient d'un processus enfant, ou du moins à partir d'une API de passage de messages. Vous n'accédez pas au DOM d'une manière e10s-safe.

div-0: [objet XULElement]

Morecover vous créez un élément XUL (un espace de noms XML spécifique à mozilla) et de tenter de l'insérer dans un document HTML. Cela signifie que vous opérez à travers les frontières du document (le CPOW implique déjà autant). L'objet document dans votre étendue locale n'est pas le ownerDocument de tbl. Par conséquent, même si le problème de processus croisé n'existait pas, vous utiliseriez encore incorrectement le DOM.


Si vous souhaitez interagir avec les DOM des documents de contenu, vous devez utiliser le message manager and frame scripts. Ce sont les primitives de bas niveau qui sous-tendent Addon SDK et les scripts de contenu webextension.

plus, vous pouvez régler le <em:multiprocessCompatible>true</em:multiprocessCompatible>flag in the install.rdf qui désactive la compatibilité ou de cales activer dom.ipc.shims.enabledWarnings dans about: config, ce qui devrait entraîner des avertissements/erreurs jetés plus tôt si vous essayez d'accéder à une API non sécuritaire.