Hi, I've written this script which loads up a page of facebook and
then parses it to find the number of new notifications. This all works
and the application works fine except there's a memory leak... I'm not
particularly good at this kind of coding, this extension is a mashup
of a few with some of my own code written in so you'll probably reach
some WTF moments, feel free to point these out or make suggestions
too :).
Only odd thing you may wonder about is the failCount thing, every now
and again the facebook page doesn't load properly or whatever, so it
will attempt 3 loads, if it fails all 3 the icon is then updated to
the fail icon, otherwise it remains normal until a problem is
confirmed, not just a 1 off.
Here's the code for my background.html page (I'm presuming it's fine
just to post it here not just attach the file or anything?):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript">
var fbURL = "http://www.facebook.com/";
var facebook = "http://www.facebook.com/help.php"; //used
instead of home page to avoid awkward ajax
var pollInterval = 1000 * 15; // 15 seconds
var requestTimeout = 1000 * 10; // 10 seconds
var notificationCount;
var img_notLoggedInSrc = "not_logged_in";
var img_noNewSrc = "no-new";
var img_newSrc = "new";
var iconSet = "set1";
var iconFormat = ".gif";
var xhr;
var iconState;
var failCount = 2;
function initialize()
{
window.setTimeout(startRequest, 0);
}
function scheduleRequest() {
window.setTimeout(startRequest, pollInterval);
}
function startRequest() {
getNotificationCount(
function(count) {
updateNotificationCount(count);
scheduleRequest();
},
function() {
scheduleRequest();
}
);
}
var frame = null;
function setIcon(path) {
path = "icons/" + iconSet + "/" + path + iconFormat;
var img = new Image();
img.onerror = function() {
console.error("Could not load browser action icon '" +
path + "'.");
}
img.onload = function() {
var canvas = document.createElement("canvas");
canvas.width = img.width > 19 ? 19 : img.width;
canvas.height = img.height > 19 ? 19 : img.height;
var canvas_context = canvas.getContext('2d');
canvas_context.clearRect(0, 0, canvas.width,
canvas.height);
canvas_context.drawImage(img, 0, 0, canvas.width,
canvas.height);
var imgData = canvas_context.getImageData(0, 0,
canvas.width, canvas.height);
chrome.browserAction.setIcon({imageData: imgData});
delete imgData;
}
img.src = path;
}
function getNotificationCount(onSuccess, onError) {
if(xhr != null) {
xhr.onreadystatechange = null;
xhr = null;
}
xhr = new XMLHttpRequest();
var abortTimerId = window.setTimeout(function() {
xhr.abort();
onError();
}, requestTimeout);
function handleSuccess(count) {
window.clearTimeout(abortTimerId);
onSuccess(count);
}
function handleError() {
failCount = failCount + 1;
console.log("Failed, failcount is now " + failCount);
if (failCount > 2) {
setIcon(img_notLoggedInSrc);
chrome.browserAction.setBadgeBackgroundColor({color:[190, 190,
190, 255]});
chrome.browserAction.setBadgeText({text:"X"});
chrome.browserAction.setTitle({title:"Not logged
in"});
window.clearTimeout(abortTimerId);
iconState = 3;
failCount = 0;
console.log("Swapped icon for fail. Reset failCount
to 0");
}
onError();
}
try
{
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4)
{
var notification_start = xhr.responseText.indexOf
('notifications_count');
console.log("ResponseText position is " +
notification_start)
if(notification_start > 0)
{
var notification_end = xhr.responseText.indexOf
('titletip', notification_start);
var notifications = xhr.responseText.substring
(notification_start,notification_end);
var count = getdigits(notifications);
if(count == "")
count = 0;
handleSuccess(count);
}
else
{
handleError();
}
xhr.onreadystatechange = null;
xhr = null;
}
}
delete notification_start
delete notification_end
delete notifications
}
catch(e)
{
console.log(e);
handleError();
}
xhr.open("GET",facebook,true);
xhr.send(null);
}
function getdigits (s) {
return s.replace (/[^\d]/g, "");
}
function updateNotificationCount(count) {
failCount = 0;
if(notificationCount != count || iconState == 3)
{
console.log("Notifications have changed, resolving..")
if (count == 0) {
console.log("You now have no notifications
(updating icon)");
setIcon(img_noNewSrc);
chrome.browserAction.setBadgeBackgroundColor
({color:[120, 140, 180, 255]});
chrome.browserAction.setTitle({title:"No new
notifications"});
chrome.browserAction.setBadgeText({text:""});
iconState = 0;
} else {
setIcon(img_newSrc);
notificationCount = count;
console.log(count +" notifications found (updating
icon)")
chrome.browserAction.setBadgeBackgroundColor
({color:[120, 150, 215, 255]});
chrome.browserAction.setBadgeText
({text:notificationCount});
iconState = 2;
}
notificationCount = count;
}
}
function goToFacebook()
{
chrome.tabs.create({url: fbURL});
}
chrome.browserAction.onClicked.addListener(function(windowId) {
goToFacebook();
});
chrome.tabs.onUpdated.addListener(function(tabId, changeInfo) {
if (changeInfo.url && changeInfo.url.indexOf(facebook) ==
0) {
console.log("saw facebook! updating...");
updateNotificationsCount(count)
}
});
</script>
<title></title>
</head>
<body onload="initialize()">
</body>
</html>
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Chromium-extensions" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/chromium-extensions?hl=en
-~----------~----~----~----~------~----~------~--~---