如何在Chrome扩展程序中控制(i)注入内容脚本的帧深度?

时间:2013-04-12 21:46:08

标签: javascript iframe google-chrome-extension frame content-script

为Chrome扩展程序创建清单文件时,有一个选项all_frames,允许将内容脚本注入顶部框架/ iframe,或者全部注入。

我希望此行为停止在某个特定级别(例如,2)。有没有办法指定它,最好是在清单上?或者至少在实际剧本中有黑客攻击?

问题可能被翻译为:“是否可以知道HTML文档中框架的深度?

1 个答案:

答案 0 :(得分:5)

您无法在清单中指定帧深度 但是,如果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);
}



如果您按如下方式创建扩展程序,则可以针对this page at jsBin对此进行测试:

<强>的manifest.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扩展程序目前为only run on iframes with a src attribute,且仅当网址符合清单的匹配和全局要求时才会显示。