2008-09-24 8 views
2

Un composant XPCOM firefox peut-il lire et écrire du contenu sur plusieurs pages?Composant Firefox XPCOM - Autorisation refusée pour appeler la méthode UnnamedClass

Scénario: Un ensemble de fichiers HTML et javascript locaux. Un fichier "Main.html" ouvre une fenêtre "pluginWindow", et crée un plugin à l'aide:

netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
var obj = Components.classes[cid].createInstance();
plugin = obj.QueryInterface(Components.interfaces.IPlugin);
plugin.addObserver(handleEvent);

Le plug-in qui a 3 méthodes.

IPlugin.Read - Lire les données de plug-in
IPlugin.Write - Ecrire des données dans le plug-in
IPlugin.addObserver - Ajouter un gestionnaire de rappel pour la lecture. Le "Main.html" appelle alors dans le pluginWindow et essaie d'appeler la méthode du plugin Write.

Je reçois une erreur:

Permission denied to call method UnnamedClass.Write

+0

Etes-vous sûr de vouloir marquer ce "C++"? Peut-être "Javascript" serait un meilleur ajustement ... En ce qui concerne la question réelle, désolé, je n'ai aucune idée :( –

+0

Je ai marqué comme C++, parce que c'est un plugin C++, et j'espère que les réponses seraient orientées vers C++ –

Répondre

1

Tout d'abord, votre code C++ est-il vraiment un plugin ou un XPCOM component, éventuellement installé dans le cadre d'un extension? On dirait que c'est le plus tard.

Si tel est le cas, il n'est pas utilisable à partir d'un code JS non fiable - une page Web ou un fichier HTML local. Il est entièrement utilisable à partir du code privilégié, dont le type le plus courant est le code extension.

Vous contournez ce problème lors de la création du composant à l'aide de l'appel enablePrivilege('UniversalXPConnect'). Ce n'est pas vraiment recommandé, à moins que cela ne soit pas distribué aux utilisateurs (puisque cet appel ouvre une boîte confuse et si vous préférez toujours autoriser les scripts file: // à utiliser XPCOM, il peut s'agir d'un problème de sécurité. les pages sont fiables - pensez aux pages Web sauvegardées).

Votre appel Write échoue pour la même raison - les fichiers: // ne sont pas approuvés pour utiliser les composants XPCOM. Vous pouvez probablement le faire fonctionner si vous ajoutez un autre appel enablePrivilege dans la même fonction que l'appel Write lui-même.

Selon la situation, il peut y avoir une meilleure solution.

Si vos fichiers doivent être considérés comme fiables, vous pouvez les empaqueter en tant qu'extension et y accéder via une URL chrome: //. Cela donne au code de ces pages la permission d'appeler n'importe quel composant XPCOM, y compris le vôtre.Si les méthodes du composant peuvent être utilisées en toute sécurité depuis n'importe quelle page ou si l'environnement est contrôlé et qu'aucune page non fiable n'est chargée dans le navigateur, vous pouvez rendre votre composant accessible au contenu (recherchez nsSidebar dans mozilla code par exemple pour nsISecurityCheckedComponent). Oh, et quand vous n'obtenez pas de bonnes réponses ici, vous devriez certainement essayer les newsgroups/mailing mozilla.

[modifier en réponse à un commentaire] Envisagez de placer le code qui doit appeler le composant dans un script chrome: //. Alternativement, vous devriez être en mesure de "bénir" vos pages avec les privilèges de chrome en utilisant le code comme this (notez qu'il fait le contraire de ce dont vous avez besoin - dépouillant les privilèges de chrome).

+0

Vous avez raison: le code C++ est en fait un composant XPCOM Les pages sont renvoyées à partir d'un protocole personnalisé, et oui, ils sont toujours en sécurité. nent n'est sûr que dans le contexte des pages renvoyées par le gestionnaire de protocole. –

+0

(Répondu dans le corps de la réponse Les commentaires sont limités à 300 caractères ...) – Nickolay

1

Est-ce que Main.html et cette autre fenêtre exécuter avec des privilèges de chrome? Si vous accédez à Main.html "normalement", en le plaçant juste sur la barre d'adresse de Firefox, alors il aura des restrictions sur ce qu'il peut faire (sinon, une page web arbitraire pourrait faire exactement la même chose).

Si vous créez un plugin firefox, placez votre code dans une superposition XUL.

Si vous voulez vraiment permettre à n'importe quelle page web de faire ce que votre plugin fait, vous pouvez établir un mécanisme par lequel la page peut demander au plugin de faire l'opération avec ses privilèges chrome et envoyer le résultat à la page ensuite.

Si vous ne faites pas une extension firefox ... alors j'ai peur d'avoir mal compris quelque chose, pourriez-vous l'expliquer plus?

+0

La DLL compilée est placée dans le firefox /. Répertoire de composants et est chargé lorsque le javascript dans main.html le crée Recherche de la superposition XUL maintenant Merci –

Questions connexes