Я понял, что это проблема происхождения.
Сценарий содержимого выполняется в контексте текущей веб-страницы, тогда как фоновый сценарий выполняется в контексте расширения.
URL-адреса BLOB-объектов сгруппированы по происхождению, поэтому точно так же, как вы не можете обычно AJAX переходить с одного домена на другой, два домена также не могут быть уверены, что URL-адреса BLOB-объектов.
Это решается запуском сценария содержимого не на текущей веб-странице (поэтому не указывается в манифесте в content_scripts
), а в новой вкладке или всплывающем окне.
Справочная информация:
window.open('content-page.html');
Страница содержимого:
<script src='content-script.js'></script>
Тогда любой URL-адрес BLOB-объекта, созданный content-script.js, будет доступен для чтения в фоновом режиме, поскольку теперь они оба работают в контексте расширения, то есть общего источника.
[EDIT]
Если вам не нравится идея всплывающего окна (в конце концов, на Mac они отображаются как полные вкладки), вы можете вместо этого вставить iframe
в текущую вкладку и запустить оттуда скрипт contenet. .
Для этого вызовите скрипт содержимого из своего манифеста:
{
"content_scripts": [{
"matches": ["<all_urls>"],
"js": ["content-script-curr-tab.js"]
}]
}
Тогда в том:
let ifr = document.createElement('iframe');
ifr.setAttribute('allow', 'microphone; camera'); //necessary for cross-origin frames that request permissions
ifr.style.display = 'none';
ifr.src = chrome.runtime.getURL('page-to-inject-into-iframe.html');
document.body.appendChild(ifr);
Затем, наконец, в page-to-inject-into-iframe.html
:
<script src='script-to-inject-into-iframe.js'></script>
Тогда делай свое дело там!