summaryrefslogtreecommitdiff
path: root/js/background.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/background.js')
-rw-r--r--js/background.js179
1 files changed, 179 insertions, 0 deletions
diff --git a/js/background.js b/js/background.js
new file mode 100644
index 0000000..754e178
--- /dev/null
+++ b/js/background.js
@@ -0,0 +1,179 @@
+/* Handle showing of new item count and polling the TT-RSS server. */
+
+var last_updated = 0;
+var feeds_last_updated = 0;
+var prefs_last_updated = 0;
+
+function param_escape(arg) {
+ if (typeof encodeURIComponent != 'undefined')
+ return encodeURIComponent(arg);
+ else
+ return escape(arg);
+}
+
+function update_feeds() {
+ console.log('feeds update');
+
+ var requestUrl = localStorage['site_url'] +
+ '/public.php?op=globalUpdateFeeds';
+
+ var xhr = new XMLHttpRequest();
+
+ xhr.open('POST', requestUrl, true);
+ xhr.send();
+
+ var d = new Date();
+ localStorage['last_feeds_updated'] = d.getTime();
+}
+
+function update() {
+ console.log('update');
+
+ var d = new Date();
+ var login = localStorage['login'];
+ var single_user = localStorage['single_user'];
+
+ if (single_user == '1') login = 'admin';
+
+ var requestUrl = localStorage['site_url'] + '/public.php';
+ var params = 'op=getUnread&fresh=1&login=' + param_escape(login);
+
+ var xhr = new XMLHttpRequest();
+
+ xhr.open('POST', requestUrl, true);
+ xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
+ xhr.send(params);
+
+ xhr.onreadystatechange = function() {
+ if (xhr.readyState == 4) {
+ var icon = new Object();
+ var title = new Object();
+ var badge = new Object();
+ var badge_color = new Object();
+
+ // init stuff
+ icon.path = 'images/normal.png';
+ title.title = '';
+ badge.text = '';
+ badge_color.color = [0, 0, 0, 0];
+
+ var show_badge = localStorage['show_badge'] == '1';
+ var show_fresh = localStorage['show_fresh'] == '1';
+
+ if (xhr.status == 200) {
+ var response = xhr.responseText.split(';');
+
+ var unread = parseInt(response[0]);
+
+ if (isNaN(unread)) unread = 0;
+
+ var fresh;
+
+ if (response.length == 2)
+ fresh = parseInt(response[1]);
+ else
+ fresh = 0;
+
+ if (isNaN(fresh)) fresh = 0;
+
+ if (unread > 0) {
+ icon.path = 'images/alert.png';
+ title.title = 'You have %s unread articles.'.replace('%s', unread);
+
+ if (show_fresh && fresh > 0) {
+ badge.text = fresh + '';
+ badge_color.color = [0, 200, 0, 255];
+ } else {
+ badge.text = unread + '';
+ badge_color.color = [255, 0, 0, 255];
+ }
+ } else if (unread == -1) {
+ icon.path = 'images/error.png';
+
+ var errorMsg = xhr.responseText.split(';')[1];
+
+ title.title = 'Error: %s.'.replace('%s', errorMsg.trim());
+ } else {
+ title.title = 'You have no unread articles.';
+ }
+
+ localStorage['last_updated'] = d.getTime();
+ localStorage['last_error'] = '';
+ } else {
+ localStorage['last_error'] = xhr.responseText;
+
+ icon.path = 'images/error.png';
+ title.title = 'Error (%s) while updating.'.replace('%s', xhr.status);
+ }
+
+ if (!show_badge) badge.text = '';
+
+ chrome.browserAction.setBadgeBackgroundColor(badge_color);
+ chrome.browserAction.setBadgeText(badge);
+ chrome.browserAction.setTitle(title);
+ chrome.browserAction.setIcon(icon);
+ }
+ };
+}
+
+function timeout() {
+ var update_interval;
+ var prefs_updated;
+ var feeds_update_interval = 30 * 60 * 1000;
+
+ if (localStorage['update_interval'])
+ update_interval = localStorage['update_interval'] * 60 * 1000;
+ else
+ update_interval = 15 * 60 * 1000;
+
+ if (localStorage['prefs_updated'])
+ prefs_updated = localStorage['prefs_updated'];
+ else
+ prefs_updated = -1;
+
+ var d = new Date();
+
+ if (d.getTime() > last_updated + update_interval ||
+ prefs_updated != prefs_last_updated) {
+ last_updated = d.getTime();
+ try {
+ update();
+ } catch (e) {
+ console.warn(e);
+ }
+ }
+
+ if (localStorage['update_feeds'] == 1 &&
+ (d.getTime() > feeds_last_updated + feeds_update_interval ||
+ prefs_updated != prefs_last_updated)) {
+ feeds_last_updated = d.getTime();
+
+ try {
+ update_feeds();
+ } catch (e) {
+ console.warn(e);
+ }
+ }
+
+ prefs_last_updated = prefs_updated;
+}
+
+function init() {
+ chrome.browserAction.onClicked.addListener(function() {
+ var site_url = localStorage['site_url'];
+
+ if (site_url) {
+ chrome.tabs.create({url: site_url});
+ }
+ });
+
+ // TODO: Create smarter algorithm that sets `periodInMinutes` to
+ // `feeds_update_interval` and updates the `alarm` object when extension
+ // preferences are saved.
+ timeout();
+ chrome.alarms.create({periodInMinutes: 1});
+ chrome.alarms.onAlarm.addListener(function() {timeout();});
+}
+
+init();
+