2010-08-02 4 views
14

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

+1

Имейте в виду, что для выхода из браузера есть другие способы выхода, включая отключение питания и сбои. Даже если есть 100% надежный способ проверить, что браузер выходит из обычного режима, у вас все равно будут отверстия. –

ответ

9

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

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

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

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

+0

спасибо за ответ, действительно, я решил пойти по старой школе, просто сохраните предыдущую информацию о подписке в localstorage и отмените ее подписку при перезагрузке фонового скрипта. =) – simple

0

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

4

Если вы поймаете случай, когда количество открытых вкладок равно 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(); 
}); 
+0

Означает ли это, что даже при асинхронном характере хром возникает проблема, как говорит ответ codingbug? –

+0

Если ваш браузер имеет расширение, имеющее разрешение для «фона», см. Это -> https://developer.chrome.com/extensions/declare_permissions, хром не выйдет, даже если вы считаете, что он имеет. Вы должны явно прекратить процесс или заставить уйти или что-то в этом роде. – ankitG

3

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

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

Он принимает chrome.windows, а не chrome.tabs.

+2

У вас может быть несколько окон Chrome, и это будет срабатывать при каждом закрытии окна, а не только при закрытии последнего окна. – s3m3n

1

TL; Пробег window.onunload Событие, это работает в некоторых случаях.

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

Из моего опыта вы можете по крайней мере:

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