Расширение Chrome: отправить запрос на скрипт содержимого во внутренние фреймы? - PullRequest
2 голосов
/ 18 июня 2011

Я внедрил файл скрипта контента на все страницы и внутренние фреймы, используя "all_frames": true, но когда я отправляю запрос из всплывающего окна, его получает только верхнее окно. Есть идеи, как отправить его во все внутренние фреймы или хотя бы в последнее окно / документ?

Popup.html (page action):
===========
chrome.tabs.getSelected(null, function(tab) {
    chrome.tabs.sendRequest(tab.id, {...}, function(response) {...});
});

content_script.js
=================
chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
    sendResponse({...});
});

Я проверил, что скрипт содержимого работает во внутренних фреймах.

Я пытаюсь получить выделенный текст, который может быть во внутренних кадрах.

(Кстати, я предпочитаю не открывать соединение всеми скриптами контента, это большие издержки.)

1 Ответ

3 голосов
/ 18 июня 2011

Проблема в том, что на одной вкладке может быть только один onRequest слушатель. Поэтому, если вы хотите отправлять сообщения в сценарий only iframe, а на странице есть только один iframe, то вы должны создать прослушиватель внутри только iframe:

//listen to requests only inside iframe
if(window!=window.top) {
    chrome.extension.onRequest.addListener(function(request, sender, sendResponse) {
        ...
    });
}

Теперь, если вы хотите отправить запросы на на родительскую страницу и iframe, или на странице много iframes, которые должны прослушивать запросы - вам нужно общаться через порты .

Порты по-прежнему имеют аналогичное ограничение - будет вызываться только один прослушиватель портов, но вы можете открыть много портов. Если есть родительская страница только с одним iframe - вы просто открываете два соединения на двух разных портах. Но если на странице много iframe, и каждый iframe имеет подкадры - вам нужно сначала перечислить все iframe, чтобы создать уникальные порты для каждого из них.

PS. Я не уверен, что вы имели в виду

Я предпочитаю не открывать соединение всеми скриптами контента

но если вы хотите внедрить скрипт содержимого по требованию, есть chrome.tabs.executeScript().

...