6

all_framesChrome 拡張機能のマニフェスト ファイルを作成するときに、コンテンツ スクリプトをトップ フレーム/iframe、またはすべてに挿入できるようにするオプションがあります。

この動作を特定のレベル (例:2) で停止させたい。できればマニフェストで指定する方法はありますか?または、少なくとも実際のスクリプトにハックがありますか?

この質問は次のように言い換えることができます。

4

1 に答える 1

6

マニフェストでフレーム深度を指定することはできません。
ただし、iframe の URL が異なる場合は、それらに対して異なるコンテンツ スクリプトを実行できます (content_scriptsマニフェストの配列に複数のエントリを含めることにより)。

コンテンツ スクリプトは、次のようなコードを使用して、(i) フレームの深さをプログラムで決定できます。

getFrameDepth (window.self);

function getFrameDepth (winToID) {
    if (winToID === window.top) {
        return 0;
    }
    else if (winToID.parent === window.top) {
        return 1;
    }

    return 1 + getFrameDepth (winToID.parent);
}



次のように拡張機能を作成すると、jsBin でこのページに対してこれをテストできます。

マニフェスト.json:

{
    "manifest_version": 2,
    "content_scripts":  [ {
        "all_frames":       true,
        "js":               [   "iframe foo.js" ],
        "matches":          [   "http://jsbin.com/enivux/*",
                                "http://jsbin.com/anomic/*",
                                "http://jsbin.com/ogaxoq/*",
                                "http://jsbin.com/ihegaq/*"
                            ]
    } ],
    "description":      "Detecting where an iframe is in the hierarchy",
    "name":             "(i)frame Level identification",
    "version":      "   1"
}


iframe foo.js:

var frameDepth  = getFrameDepth (window.self);
var bodyColors  = ["white", "pink", "lime", "cyan"]

document.body.style.background = bodyColors[frameDepth];

function getFrameDepth (winToID) {
    if (winToID === window.top) {
        return 0;
    }
    else if (winToID.parent === window.top) {
        return 1;
    }

    return 1 + getFrameDepth (winToID.parent);
}



Chrome 拡張機能は現在、属性を持つ iframe でのみ実行されsrc、URL がマニフェストの一致とグロブの要件を満たしている場合にのみ実行されることに注意してください。

于 2013-04-13T01:11:31.190 に答える