I am developing an add-in for the first time. It places a small widget in the status bar, which displays the number of unread Google Reader items. To take this into account, the add process requests the Google Reader API every minute and sends a response to the widget. When I run cfx test, I get this error:
Error: The page has been destroyed and can no longer be used.
I made sure I caught the event detachand stopped the update timer in response, but I still see the error. What am I doing wrong? Here is the relevant code:
const tabs = require('tabs');
const widgets = require('widget');
const data = require('self').data;
const timers = require("timers");
const Request = require("request").Request;
function refreshUnreadCount() {
Request({
url: "https://www.google.com/reader/api/0/unread-count?output=json",
onComplete: function(response) {
if (response.status == 200) {
monitorWidget.postMessage(response.json);
} else {
monitorWidget.postMessage(null);
}
}
}).get();
}
var monitorWidget = widgets.Widget({
id: "greader-monitor",
label: "GReader Monitor",
contentURL: data.url("widget.html"),
contentScriptFile: [data.url("jquery-1.7.2.min.js"), data.url("widget.js")],
onClick: function() {
tabs.open("https://www.google.com/reader/view/");
},
onAttach: function(worker) {
worker.port.on("widthReported", function(newWidth) {
worker.width = newWidth;
});
var refreshTimer = timers.setInterval(refreshUnreadCount, 60000);
worker.on("detach", function() {
timers.clearInterval(refreshTimer);
});
refreshUnreadCount();
}
});
self.on("message", function(json) {
if (json == null) {
$("span#counter").attr("class", "");
$("span#counter").text("N/A");
} else {
var newTotal = 0;
for (var item in json.unreadcounts) {
newTotal += json.unreadcounts[item].count;
}
newTotal /= 2;
$("span#counter").text(newTotal);
if (newTotal > 0)
$("span#counter").attr("class", "newitems");
else
$("span#counter").attr("class", "");
}
self.port.emit("widthReported", $("div#widget").width());
});
Change . I uploaded the entire project to this GitHub repository .