Сценарии содержимого работают в изолированной среде. Чтобы получить доступ к любым глобальным свойствам (window
) страницы, вы должны либо внедрить новый элемент <script>
, либо использовать прослушиватели событий для передачи данных.
См. этот ответ , например, о введении элемента <script>
в контекст страницы.
Пример
contentscript.js ("run_at": "document_end"
в манифесте):
var s = document.createElement('script');
s.src = chrome.extension.getURL('script.js');
(document.head||document.documentElement).appendChild(s);
s.onload = function() {
s.remove();
};
// Event listener
document.addEventListener('RW759_connectExtension', function(e) {
// e.detail contains the transferred data (can be anything, ranging
// from JavaScript objects to strings).
// Do something, for example:
alert(e.detail);
});
script.js
- расположен в каталоге расширений, он будет вставлен в саму страницу:
setTimeout(function() {
/* Example: Send data from the page to your Chrome extension */
document.dispatchEvent(new CustomEvent('RW759_connectExtension', {
detail: GLOBALS // Some variable from Gmail.
}));
}, 0);
Поскольку этот файл загружается через расширение Chrome: URL из DOM, необходимо добавить «script.js» в раздел web_accessible_resources файла манифеста. В противном случае Chrome откажется загружать файл скрипта.
Вы должны использовать как можно меньше логики на веб-странице и обрабатывать большую часть своей логики в скрипте контента. Это имеет несколько причин. Прежде всего, любой сценарий, внедренный на странице, выполняется в том же контексте, что и веб-страница, поэтому веб-страница может (преднамеренно или непреднамеренно) изменять методы JavaScript / DOM таким образом, что ваше расширение перестает работать. Во-вторых, у скрипта контента есть доступ к дополнительным функциям, таким как ограниченное подмножество API-интерфейсов chrome. * И сетевые запросы разных источников (при условии, что расширение объявило разрешения для них).