Событие onBrowserClose для расширения Google Chrome?

Я разрабатываю расширение для Google Chrome. Мой фон script, каждый раз, авторизуется на сервере, который использует XMPP API, и подписывается на PubSub node. Мне нужно отменить подписку на выходе, иначе фиктивные подписки останутся на сервере. Есть ли какое-либо событие onBrowserClose в API расширений Google Chrome?

Ответы

Ответ 1

В API расширения Chrome нет такого события.

Однако существует событие chrome.windows.onRemoved, которое срабатывает при каждом закрытии окна. Я решил, что вы можете проверить это событие, если вы закрыли последнее окно, но, к сожалению, из-за асинхронного характера Chrome это не работает.

Я попытался выполнить простой запрос AJAX в обработчике событий onRemoved. Запрос AJAX никогда не попадал на сервер, поскольку Chrome уже закрылся перед запуском события (или просто проигнорировал его).

Сделать окончательный ответ: Нет, в настоящее время вы не можете, насколько я знаю. Возможно, вы захотите опубликовать следующий отчет об ошибке в http://crbug.com/30885, чтобы получать уведомления об обновлениях.

Ответ 2

Если вы поймаете случай, когда количество открытых вкладок равно 0, вы можете рассматривать это как событие Chrome onClose. В моем случае я должен отменить уведомление на рабочем столе до закрытия Chrome, потому что он сбой в противном случае. Вот как я это сделал:

1. Инициализируйте переменную num_tabs, используя следующее:
chrome.tabs.getAllInWindow( null, function( tabs ){
    console.log("Initial tab count: " + tabs.length);
    num_tabs = tabs.length;
});
2. Увеличение num_tabs при создании вкладки:
chrome.tabs.onCreated.addListener(function(tab){
    num_tabs++;
    console.log("Tab created event caught. Open tabs #: " + num_tabs);
});
3. Уменьшение num_tabs при удалении вкладки и запуск вашего браузера при закрытии обработчика событий, если num_tabs = 0
chrome.tabs.onRemoved.addListener(function(tabId){
    num_tabs--;
    console.log("Tab removed event caught. Open tabs #: " + num_tabs);
    if( num_tabs == 0 )
        notification.cancel();
});

Ответ 3

Это работает для меня:

chrome.windows.onRemoved.addListener(function(windowId){
  alert("!! Exiting the Browser !!");
});

Требуется chrome.windows, а не chrome.tabs.

Ответ 4

TL; DR: Попробуйте window.onunload событие, оно работает в некоторых случаях.

Как уже упоминалось ранее, мы обычно не можем обрабатывать что-то вроде события onBrowserClose и препятствовать закрытию браузера. Но для некоторых случаев мы можем использовать событие window.onunload для выполнения чего-то синхронно, и оно работает, если оно действительно синхронно.

По моему опыту вы можете по крайней мере:

  • Сохраните некоторую информацию в (например, журналах) в HTML5 localStorage (которая является синхронной).
  • Вызов некоторых асинхронных функций API расширения Chrome, но вы не можете получить результат. (Это работает для меня! Yay!)
  • Выполнять синхронный XMLHTTPRequest (да, иногда он работает).

Ответ 5

Добавление события закрытия браузера - довольно частый запрос. Star http://crbug.com/30885 для обновлений. И прочитайте отчет об ошибке для умного взлома, чтобы обнаружить, когда браузер выключен нажатием клавиши.