Я не могу получить доступ к Chrome API (например, chrome .storage или chrome .runtime.sendMessage)
Ваш код в настоящее время создает страницу скрипт , а не скрипт контента. Для последнего вам нужно использовать chrome.tabs.executeScript
(см. Также документация к скрипту содержимого ) в фоновом скрипте.
location.href возвращает URL верхней веб-страницы, и я не могу Не можете найти способ доступа к текущему URL-адресу iframe внутри самого iframe.
Нет, то, что вы описываете, просто не может произойти, это было бы нарушением безопасности источника URL на уровне конца света, поэтому что-то еще происходит. Например, ваш манифест. json не имеет match_about_blank
, что означает InjectManager. js вообще не обрабатывает динамически добавленные about:blank
фреймы.
манифест. json :
"content_scripts": [{
"match_about_blank": true,
.....................
InjectManager. js:
chrome.runtime.sendMessage({ action: 'inject', data: location.href });
фоновый скрипт:
chrome.runtime.onMessage.addListener(({ action, data }, sender, sendResponse) => {
if (action === 'inject') {
chrome.tabs.executeScript(sender.tab.id, {
code: getInjectionCode(data),
frameId: sender.frameId,
});
}
});
Обратите внимание, что некоторые фреймы, такие как javascript:
или srcdoc:
выиграли вообще не запускайте скрипты содержимого в Chrome, поэтому вам придется обрабатывать их непосредственно в InjectManager. js, поскольку они не могут быть внедрены функцией executeScript (). Например, вы можете найти все iframe с помощью document.querySelectorAll('iframe')
и создать элемент DOM script
внутри, как вы делаете в настоящее время, но вы будете использовать frameElement.contentDocument
вместо document
и, конечно, вы проверите, является ли реальный URL-адрес iframe ( frameElement.contentWindow.location.href) не начинается с http
, поскольку внутри кадров можно перемещаться без изменения их атрибута src
снаружи. Выполните проверку внутри try / catch, потому что при доступе к iframe из другого источника будет возникать ошибка.