主な問題は、私の拡張機能がターゲットWebページのすべてのiframeに読み込まれていることです。iframe内にも表示されるボタンを配置します。消えてほしい。ウィンドウおよびドキュメントオブジェクトは、親のウィンドウおよびドキュメントオブジェクトとして表示されます。そのため、たとえば、iframeの場所ではなく親の場所が表示されるため、ドキュメントの場所を確認することはできません。
3 に答える
メタデータ ヘッダー キーを使用するユーザー スクリプトを作成し、アドオン sdk 用のこのユーザー スクリプト パッケージを使用@noframes
して、Jetpack にユーザー スクリプトを含めることができます。
ユーザー スクリプトを記述することは、Page Mods を記述するよりもはるかに簡単です。
編集:今(アドオンSDKバージョン1.11がリリースされました)pagemod
は、探しているものをサポートしています。ドキュメントと新しいattachTo
オプションを参照してください。
次の情報は古くなっています (アドオン SDK 1.10 以前に対してビルドする場合に使用できます。
残念ながらpagemod
、ページのすべてのフレームにスクリプトを挿入します。これは、Chrome のコンテンツ スクリプトで実現するように、トップ フレームのページごとに 1 回だけではありません。もちろん、スクリプトの実行を停止するための回避策があります (他の回答を参照してください)。
しかし、スクリプトをページごとに 1 回だけトップ フレームに挿入したい場合は、tabs
. このソリューションを使用すると、スクリプトは必要な場合にのみ挿入されます。
pagemod
以下に、 からへの移植の例を示します。tabs
これにより、すべてのメッセージ受信システムが機能しport
ます。port
同じオブジェクトを使用してメッセージを受信するだけでなく送信する必要がある場合は、簡単に変更できます。スクリプトは、ドメインyoutube.comにいるときに挿入されます。
古い pagemod の方法:
var self = require("self");
var pagemod = require("page-mod");
pagemod.PageMod(
{
include: "*.youtube.com",
contentScriptFile: self.data.url("myContentScript.js"),
onAttach: function(worker)
{
worker.port.on("myMessageId", function(payload)
{
console.log("Message received: " + payload);
});
}
});
新しいタブの方法:
var self = require("self");
var tabs = require("tabs");
tabs.on("ready", function(tab)
{
if (tab != undefined && tab.url != undefined && tab.url.split("/")[2] != undefined)
{
var domain = "youtube.com";
var host = tab.url.split("/")[2];
if (host == domain || host.substr(host.length - domain.length - 1) == "." + domain)
{
var worker = tab.attach({ contentScriptFile: self.data.url("myContentScript.js") });
worker.port.on("myMessageId", function(payload)
{
console.log("Message received: " + payload);
});
}
}
});
1 つの回避策は、コンテンツ スクリプトに次のようなものを入れることです。
if (window.frameElement === null){
// I'm in the topmost window
// Add buttons and things to the page.
}else{
// I'm in an iFrame... do nothing!
}
コンテンツ スクリプトは引き続きすべてのページに追加されますが、iFrame の比較的単純で軽量なチェックです。