Для моего расширения chrome я хочу выполнить действие, когда всплывающее окно browserAction закрывается. Я понимаю, что там нет встроенных событий, когда это происходит. Я нашел this suggestion, чтобы открыть соединение с фоновым скриптом, а затем использовать событие подключения port.onDisconnect
, чтобы обнаружить, что всплывающее окно закрывается.Расширение Chrome: обнаружение, когда всплывающее окно закрывается
Однако, когда всплывающее окно закрывается, я вижу следующее сообщение об ошибке в консоли разработчика для фонового сценария:
(BLESSED_EXTENSION context for glkehflnlfekdijfhacccflbffbjhgbd) extensions::messaging:102: Uncaught TypeError: Cannot read property 'destroy_' of undefined{TypeError: Cannot read property 'destroy_' of undefined
at PortImpl.destroy_ (extensions::messaging:102:37)
at dispatchOnDisconnect (extensions::messaging:322:29)}
скрипты, которые я использую подробно описаны ниже.
Вы видите, куда я иду не так?
manifest.json
{ "manifest_version": 2
, "name": "Detect when popup closes"
, "version": "0.1"
, "browser_action": {
"default_icon": "popup.png"
, "default_popup": "popup.html"
}
, "background": {
"scripts": [
"background.js"
]
}
}
popup.html
<!DOCTYPE html>
<body>
<h1>Test</h1>
<script src="popup.js"></script>
</body>
</html>
popup.js
var port = chrome.runtime.connect()
background.js
chrome.runtime.onConnect.addListener(function (externalPort) {
externalPort.onDisconnect = function() {
try {
var ignoreError = chrome.runtime.lastError
} catch (error) {
console.log("onDisconnect")
}
}
)
Предложения было обнаружение события в фоновом скрипте. Порт отключен *, потому что * всплывающее окно было уничтожено, поэтому прослушиватели событий не должны вызываться при отключении портов. – wOxxOm
@wOxxOm Я переписал расширение bare-bones, чтобы использовать 'port.onDisconnect' в фоновом скрипте, как вы предлагаете. Однако это просто смещает ошибку до момента, когда всплывающее окно закрывается. –
Ошибка в этом случае документирована и может быть проигнорирована простым присваиванием 'var ignoreError = chrome.runtime.lastError'. Важно то, что прослушиватель разъединения действительно срабатывает. – wOxxOm