Как контролировать (i) глубину фрейма, в который вставляются скрипты содержимого, в расширение Chrome?

При создании файла манифеста для расширения Chrome есть опция all_frames это позволяет вводить сценарии содержимого в верхний фрейм / фрейм или во все.

Я хочу, чтобы это поведение остановилось на каком-то определенном уровне (например,2). Есть ли способ указать это, желательно в манифесте? или хотя бы со взломом в реальном скрипте?

Вопрос может быть переведен на: "Можно ли узнать, насколько глубоко рамка находится внутри HTML-документа?

1 ответ

Решение

Вы не можете указать глубину кадра в манифесте.
Но, если у фреймов разные 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, если создадите расширение следующим образом:

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 будут работать только на фреймах с src атрибута, и только в том случае, если URL-адрес соответствует требованиям к соответствию и глобусу манифеста

Другие вопросы по тегам