Как контролировать (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-адрес соответствует требованиям к соответствию и глобусу манифеста