С недавних пор мне выпал случай создать расширения для Google Chrome. И тут появился ряд нетривиальных задач, которые пришлось решить в процессе. Хочу поделиться небольшим опытом, который я приобрел в процессе:
1. При закрытии popup окошка, вызванного нажатием на значок расширения в панели Chrome мне потребовалось выполнять кое-какие действия. Логично повесить handler
на событие onbeforeunload
или unload
объекта текущего window
. Так то оно так, но не совсем. Обычные действия, внутри callback
этого события отказываются выполнятся наотрез. Но! Работает взаимодействие с localStorage
. Путем нехитрых умозаключений и поиска похожей проблемы на просторах интернетов появилось такое вот решение:
var background = chrome.extension.getBackgroundPage();
window.addEventListener('unload', function() {
background.indicator.show();
}, true);
Суть метода заключается в описании действия в
background
странице и последующем вызове этого действия при наступлении события через объект
backgroundPage
. Связано это с тем, что
backgroundPage
расширения живет еще какое-то время после закрытия всплывающего окна расширения (около 500мс), что дает небольшое окно времени для моих целей. Код подключаемый к background.html выглядит так:
function Indicator() { }
Indicator.prototype.show = function() {
if (localStorage.unsubmitedCount) {
chrome.browserAction.setBadgeText({text: localStorage.unsubmitedCount});
chrome.browserAction.setTitle({title: "You have some actions to save"});
}
}
Indicator.prototype.update = function() {
if(!localStorage.unsubmitedCount) {
localStorage.unsubmitedCount = 1;
} else {
++localStorage.unsubmitedCount;
}
}
Indicator.prototype.reset = function() {
chrome.browserAction.setBadgeText({text: ""});
chrome.browserAction.setTitle({title: "Default extension text"});
localStorage.removeItem('unsubmitedCount');
}
var indicator = new Indicator();