2

Firefox XPCOM コンポーネントは、複数のページにわたってページ コンテンツを読み書きできますか?

シナリオ: 多数のローカル HTML および JavaScript ファイル。「Main.html」ファイルはウィンドウ「pluginWindow」を開き、以下を使用してプラグインを作成します。

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

3つのメソッドを持つプラグイン。

IPlugin.Read- プラグインからデータを読み取る
IPlugin.Write- プラグインにデータを書き込む- 読み取り
IPlugin.addObserver用のコールバック ハンドラを追加します。

次に、「Main.html」は pluginWindow を呼び出し、プラグイン メソッド Write を呼び出そうとします。

エラーが表示されます:

Permission denied to call method UnnamedClass.Write

4

2 に答える 2

1

Main.html とその他のウィンドウはクロム権限で実行されますか? Main.html に「普通に」アクセスして、Firefox のロケーション バーに置くだけでは、できることが制限されます (そうしないと、任意の Web ページがまったく同じことをする可能性があります)。

Firefox プラグインを作成している場合は、コードを XUL オーバーレイに配置します。

プラグインが行うことをすべての Web ページに許可したい場合は、ページがプラグインにクロム特権で操作を実行するように要求し、後で結果をページに送信するメカニズムを確立できます。

あなたが Firefox の拡張機能を作っていないのなら、私は何か誤解していると思います。もっと説明してもらえますか?

于 2008-09-25T15:22:31.607 に答える
1

まず、あなたの C++ コードは本当にプラグインまたはXPCOM コンポーネントであり、拡張機能の一部としてインストールされる可能性がありますか? 後の方だそうです。

その場合、信頼されていない JS コード (Web ページまたはローカル HTML ファイル) からは使用できません。特権コードから完全に使用できます。最も一般的なタイプは拡張コードです。

呼び出しを使用してコンポーネントを作成するときに、この問題を回避していenablePrivilege('UniversalXPConnect')ます。これは、ユーザーに配布しない場合を除き、あまりお勧めできません (この呼び出しは紛らわしいボックスを表示し、file:// スクリプトが XPCOM を使用することを常に許可するように設定すると、セキュリティ上の問題になる可能性があります。ページは信頼されています - 保存された Web ページと考えてください)。

あなたのWrite呼び出しは同じ理由で失敗します - file:// ページは XPCOM コンポーネントの使用を信頼されていません. enablePrivilegeWrite 呼び出し自体と同じ関数に別の呼び出しを追加すると、おそらく動作するようになります。

状況によっては、より良い解決策があるかもしれません。

ファイルを信頼できるものとして扱う必要がある場合は、ファイルを拡張機能としてパッケージ化し、chrome:// URL 経由でアクセスすることをお勧めします。これにより、これらのページのコードに、あなたのものを含む任意の XPCOM コンポーネントを呼び出す権限が与えられます。

コンポーネントのメソッドがどのページからでも安全に使用できる場合、または環境が制御されていて信頼できないページがブラウザーにロードされていない場合は、コンポーネントをコンテンツにアクセスできるようにすることができます (例については、 mozilla コードで nsSidebar を検索し、 も参照してnsISecurityCheckedComponentください)。

ああ、ここで良い答えが得られない場合は、必ず mozilla ニュースグループ/メーリング リストを試してみてください。

[コメントに返信して編集] コンポーネントを呼び出す必要があるコードを chrome:// スクリプトに入れることを検討してください。別の方法として、次のようなコードを使用してクロム特権でページを「祝福」できるはずです(これは、必要なこととは反対のことを行うことに注意してください - クロム特権を取り除きます)。

于 2008-09-28T21:44:37.690 に答える