Как правильно слушать порт в расширении хрома?
Задача не дать вкладке умереть, а если коннект с фоновой страницей пропал, то перезагрузить
background.js
chrome.extension.onConnect.addListener(function(port) { console.log("Connected ....."); port.onMessage.addListener(function(msg) { try{ port.postMessage('active_port'); } catch { port.postMessage('disable_port'); } }); }) |
chrome.extension.onConnect.addListener(function(port) { console.log("Connected ....."); port.onMessage.addListener(function(msg) { try{ port.postMessage('active_port'); } catch { port.postMessage('disable_port'); } }); })
script.js
setInterval(() => { try { var port = chrome.extension.connect({ name: "Sample Communication" }); port.postMessage("active back"); port.onMessage.addListener(function(msg) { console.log(msg); }); } catch { localStorage.setItem('reload_' + appId, 1); location.reload(); } }, 5000); |
setInterval(() => { try { var port = chrome.extension.connect({ name: "Sample Communication" }); port.postMessage("active back"); port.onMessage.addListener(function(msg) { console.log(msg); }); } catch { localStorage.setItem('reload_' + appId, 1); location.reload(); } }, 5000);
Дополнительно:
Каждую секунду отправляйте из контент-скрипта сообщение в фоновый процесс:
chrome.extension.sendMessage('Ваше сообщение');
В фоновом процессе слушайте приходящие сообщения:
chrome.extension.onMessage.addListener(function(message) { console.log('Принято сообщение: ' + message); }); |
chrome.extension.onMessage.addListener(function(message) { console.log('Принято сообщение: ' + message); });
Если связь с определенной вкладкой потеряна, пересоздаете его или обновляйте.
P. S. Существуют и иные способы предотвратить заморозку вкладки, если интересно, расскажу.
- Вкладок куча и все слушают background . Хорошо, а если расширение отключили, удалили или у вкладки истек срок жизни?
- Martovitskiy, вы можете использовать альтернативный способ сохранения жизни вкладки - на странице которую требуется сохранить активным просто добавьте mp3 трек в бесконечном цикле воспроизведения. Вкладки имеющее активное мультимедиа содержимое не морозятся. Думаю вполне очевидно, что вместо музыки можно воспроизводить просто тишину.
Способ не поможет, если у вас заканчивается оперативная память. На этот случай нужно в фоновом процессе расширения запретить выгрузку вкладок в целях экономии памяти:
chrome.tabs.onCreated.addListener(function(tab) { chrome.tabs.update(tab.id, { autoDiscardable: false }); }); chrome.tabs.onReplaced.addListener(function(tabId) { chrome.tabs.update(tabId, { autoDiscardable: false }); }); chrome.runtime.onInstalled.addListener(function(details) { chrome.tabs.query({}, function(tabs) { tabs.forEach(function(tab) { chrome.tabs.update(tab.id, { autoDiscardable: false }); }); }); });
chrome.tabs.onCreated.addListener(function(tab) { chrome.tabs.update(tab.id, { autoDiscardable: false }); }); chrome.tabs.onReplaced.addListener(function(tabId) { chrome.tabs.update(tabId, { autoDiscardable: false }); }); chrome.runtime.onInstalled.addListener(function(details) { chrome.tabs.query({}, function(tabs) { tabs.forEach(function(tab) { chrome.tabs.update(tab.id, { autoDiscardable: false }); }); }); });
Или установите это расширение.
- Надим Закиров,
Думаю вполне очевидно, что вместо музыки можно воспроизводить просто тишину.
И мы будем видеть на вкладке значок динамика? ))
- Алексей Ярков, это работает, что для меня главное. Если вы сможете предложить другой вариант было бы классно.
- Надим Закиров, какой способ эффективнее? Расширение, аудио или autoDiscardable: false в background.script?
- Martovitskiy, имеет смысл применить все три. Например, я своих ботах использую бесконечный трек и autoDiscardable: false - ничего не глохнет, все работает неделями без выключения.
P. S. Есть еще один способ:
chrome.tabs.update(tabID, { 'active': true }, function() {});
chrome.tabs.update(tabID, { 'active': true }, function() {});
Делает указанную вкладку активной, заморозка при этом должна спадать. Не проверял, но должно работать.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для правильного прослушивания порта в расширении Chrome, вам необходимо создать фоновую страницу, которая будет отслеживать события и обрабатывать запросы. Вот пример кода на языке JavaScript, который позволит вам слушать порт в расширении Chrome:
```javascript
// Сначала создайте фоновую страницу, добавив следующую запись в файле манифеста вашего расширения (manifest.json):
"background": {
"scripts": ["background.js"],
"persistent": false
}
// Теперь создайте файл background.js и добавьте следующий код:
chrome.runtime.onConnect.addListener(function(port) {
console.assert(port.name == "myPort");
port.onMessage.addListener(function(msg) {
console.log("Received message: " + msg);
});
});
// Теперь вы можете установить соединение с портом из вашего контента, добавив следующий код в вашем файле контента (content.js):
var port = chrome.runtime.connect({name: "myPort"});
port.postMessage({message: "Hello, background!"});
```
Этот код создаст фоновую страницу, которая будет слушать порт с именем "myPort". После этого вы можете установить соединение с этим портом из вашего контента и отправлять сообщения на фоновую страницу.
Не забудьте также добавить необходимые разрешения в файл манифеста вашего расширения для работы с портами. Например, если вы хотите использовать порты для обмена сообщениями между фоновым скриптом и вкладками, добавьте следующую запись в файл манифеста:
```javascript
"permissions": [
"tabs",
"activeTab"
]
```
Таким образом, вы сможете правильно слушать порт в расширении Chrome и обмениваться сообщениями между фоновой страницей и контентом. Надеюсь, это поможет вам решить вашу проблему!