問題タブ [e10s]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
javascript - Firefox Electrolysis ウィンドウで document.popupNode を取得する方法
Firefox Electrolysis のアドオンを作成しようとしています。e10s ウィンドウを開いてページ要素を右クリックすると、e10s ウィンドウで document.popupNode を使用できません。
Scratchpad でテスト コードを使用できます。テスト コードを実行した後、新しい通常の Firefox ウィンドウを開き、Web ページ内で右クリックします。document.popupNode のプロンプト アラートが表示されます。
しかし、新しい e10s Firefox ウィンドウを開いて右クリックしても、何も表示されません。
e10s ウィンドウで document.popupNode を取得するにはどうすればよいですか?
javascript - e10s対応のFirefoxでフレームスクリプトからページ情報を取得するには?
次のような関数でページ情報をロードする Firefox 拡張機能があります。
この関数は、拡張機能が作成するコンテキスト メニュー項目をユーザーが選択すると実行されます。マルチプロセス Firefox ( Electrolysis、別名 e10s) はコンテンツへの直接アクセスをサポートしていないため、これは機能しなくなりました。このコードをフレーム スクリプトに分解しようとしていますが、すべてが非同期に見えるため、このコードを "呼び出す" 方法を理解するのに問題があります。これが私の単純なフレームスクリプトであるべきだと思うものです:
関連するクロムコードは次のようになるはずです。
私が抱えている問題は、(a)これがこれを処理する正しい方法なのか、(b)ここでのタイミングがどのように機能するのかを完全に理解していないことです。このメッセージング システムは非同期であるため、関心のあるデータが使用できる時間内に戻ってくる保証はありません。Mozilla が提供する例はどれも、私がやろうとしていることに適合していないようです。明らかな何かが欠けていますか?拡張コードを変換して e10s をサポートする方法を示すより良い例はどこにありますか?
javascript - ブラウザー フレーム スクリプト (e10s) を読み込むのはいつですか?
Electrolysis (e10s) をサポートするために、Firefox 拡張機能の 1 つを移植しようとしています。私の拡張機能は、いくつかのページ データを取得し、ユーザーがクリックできるコンテキスト メニュー項目を介してクリップボードに配置します。メッセージ マネージャーのドキュメントに基づいて、3 種類のメッセージ マネージャーを使用できます。
- グローバル
- 窓
- ブラウザ
私のアドオンはコンテキスト固有であるため、最後のアドオンが使用したいもののようです。問題は、フレーム スクリプトをロードするタイミングが完全にわからないことです。コンテキスト メニュー項目のアクション処理コードの簡易バージョンは次のようになります。
ここでフレーム スクリプトをロードすることは、(a) フレーム スクリプトがすべてのページで使用されるとは限らず、(b) フレーム スクリプトは<browser>
. 2 番目の理論は正しくないようです。を呼び出すたびにloadFrameScript
、新しいコピーが読み込まれます。負荷保護ロジック (つまり、フレーム スクリプト関数がまだ存在しない場合にのみ作成する) でさえ、問題を解決していないようです。
したがって、私の問題は、コンテキスト メニュー項目にアクセスするたびに、フレーム スクリプトの新しいコピーが読み込まれることです。また、フレーム スクリプトがメッセージ リスナーを追加するため、コンテキスト メニュー項目の後続の呼び出しでメッセージが重複して表示されます。
ブラウザ フレーム スクリプトはいつロードする必要がありますか? アドオンの初期化時に一度ロードすると、最初にしかロードされないため、うまく機能しないようです<browser>
(後続の によって要求されたときにこのコードを実行したい<browser>
)。しかし、オンデマンドでロードすると、重複するように見えます。
ここで見逃している他の戦略はありますか?
firefox - Firefox のコンテンツ プロセスが作成されたときに XPCOM コンポーネントをロードする方法 (e10s)?
nsIURIFixup
Firefoxアドオンを介して、Firefoxのデフォルトの実装をオーバーライドしようとしています。このサービスは一度作成され、 の構築後にグローバルにキャッシュされるためnsDocShell
、docshell が初期化される前にコンポーネントを登録する必要があります。したがって、コンポーネントをできるだけ早くロードするためchrome.manifest
のカテゴリを含め、(JS) XPCOM コンポーネントを登録するために使用します。profile-after-change
これは単一プロセスの Firefox (37) ではうまく機能しますが、Electrolysis (e10s) が有効になっている場合 (Firefox Nightly など) には機能しません。chrome.manifest
この問題は、アドオンが Firefox のブラウザー プロセスにのみインポートされ、e10s がアクティブ化されたときにそのコンテンツ プロセスにインポートされないという事実によって引き起こされます (バグ 596880、WontFix としてマークされています)。
のメソッドを呼び出すフレーム スクリプトで JSM をインポートすることにより、コンテンツ プロセスにコンポーネントを動的に登録できます。これはおそらくほとんどのアプリケーションで機能しますが、docshell が構築される前にコンポーネントを初期化する必要があり、フレーム スクリプトのロードが遅すぎるように見えるため (つまり、docshell が既に構築されている場合)、私の場合はそうではありません。registerFactory
nsIComponentRegistrar
また、インターフェイスの (間接的な) コンシューマーを追跡してモンキー パッチを適用するなど、機能を実装する他の方法も検討しました。この壊れやすい「ソリューション」は嫌いです。ドキュメント化されていない実装の詳細に依存しているため、将来いつでも壊れる可能性があるからです。
コンポーネントを Firefox の global に追加できることも思いつきましたchrome.manifest
が、これもひどいハックのように思えます (たとえば、管理者によってインストールされたために、このファイルが読み取り専用である場合はどうなるでしょうか? そして、AMO がインストールの一部として Firefox のコア ファイルの 1 つを変更するアドオンを受け入れます...?)。
では、コンテンツ プロセスが作成されるとすぐに読み込まれるコンポーネントを適切に登録して、そのプロセス内のインターフェイスの実装を効果的にオーバーライドできるようにするにはどうすればよいでしょうか?
javascript - マルチプロセス Firefox で新しいタブを開きますか?
既存の Firefox アドオン コードを新しいマルチプロセス アーキテクチャに移植しようとしています。私の既存のコードでは、addon install event
以下のコードを使用して新しいタブを起動できます。
(他の拡張機能のコードからのヘルプを使用して)互換性を持たせるために bootstrap.js に変更を加えた後multiprocess firefox
、アドオンは期待どおりにロードおよび機能しますが、上記のコードは新しいタブのロードに失敗し、コンソールにエラーは表示されません!!!
firefox - フレーム スクリプトにコンテンツ ポリシー (nsIContentPolicy) を登録するには?
e10s では、コンテンツ ポリシーをフレーム スクリプトに直接登録する必要がありますが、機能する例が見つかりません。このコードをテストしましたが、内部リソースがロードされたときにのみ検出され、次のエラーが発生します。
誰かが方法を知っていますか?
firefox - require("sdk/selection").text 今のところ e10s では動作しません。何と交換しますか?
require("sdk/selection").text
今のところ、e10s では動作しません。
activeTab.attach
and port
s andを試みwindow.getSelected.toString()
ますが、これは非常に遅いです。
何と交換しますか?
e10s - e10s - nsIObserver-nsIHttpChannel-nsIDOMWindow-nsIDOMDocument から取得したい。どうすればいいですか?
私のアドオンはFF41で動作しました。今、e10s に移行したいと考えています。Firefox 開発者版 v43 を使用してください。
オブザーバーの例 (c++)。
JS ヘルパーの例。
Channel_GetOwnerWindow:
以下のコードは機能しますが、nsIDOMWindow からドキュメントを取得できません。
はエラーです - インターフェイスがありません....
Channel_GetOwnerWindow:
この問題を解決してください。ありがとう。
firefox - マルチプロセス Firefox (e10s) で drawWindow() が壊れていますか?
Firefox のdrawWindow()
関数は、最初のパラメーターとして、低レベル APIタブ utilsによって提供されるXUL コンテンツ ウィンドウを想定しています。
ただし、Firefox (コードネーム Electrolysis または e10s) にマルチプロセス アーキテクチャが導入されたため、低レベル API を介してタブに直接アクセスすることはできなくなりました。利用可能な互換性 shim がありますが、それらはDOM オブジェクトを必要とするプラットフォーム API をサポートしないことが明示的に述べられています。一方、「クロムのみ」drawWindow()
であるため、コンテンツスクリプトでは使用できません。
だから私の質問はこれらです:
drawWindow()
クロムの外で使用できず、クロム内で contentWindow オブジェクトを取得できない場合、どのように使用すればよいですか?- アドオンがマルチプロセス Firefox 内で Web サイトのスクリーンショットを撮れるようにする他のオプションは何ですか?
私たちの現在のアプローチは、この SO question への回答に基づいています。ただし、マルチプロセス Firefox では動作しません。