diff options
author | Daniel Andersson <[email protected]> | 2013-04-09 13:21:49 +0200 |
---|---|---|
committer | Daniel Andersson <[email protected]> | 2013-04-09 13:21:49 +0200 |
commit | e38db918c21e007cda42000d151e70e96108d6eb (patch) | |
tree | 12eb49674a3d2539f4a8704d408f9f35acc65393 /js | |
parent | 705e516ec468f2d92e548e26fce5f14f234346d0 (diff) |
Refactor to avoid deprecation by Google.
Diffstat (limited to 'js')
-rw-r--r-- | js/background.js | 179 | ||||
-rw-r--r-- | js/options.js | 115 |
2 files changed, 294 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(); + diff --git a/js/options.js b/js/options.js new file mode 100644 index 0000000..1835aba --- /dev/null +++ b/js/options.js @@ -0,0 +1,115 @@ +/* Option handling. */ + +function save() { + + var s = $('status'); + + s.innerHTML = 'Options saved successfully.'; + + var f = document.forms['options']; + + if (f.site_url.value.length > 0) + localStorage['site_url'] = f.site_url.value; + else { + s.innerHTML = 'Error: Site url cannot be blank.'; + new Effect.Highlight(f.site_url); + } + + if (f.login.value.length > 0) + localStorage['login'] = f.login.value; + else { + s.innerHTML = 'Error: Login cannot be blank.'; + new Effect.Highlight(f.login); + } + + var update_interval = parseInt(f.update_interval.value); + + if (update_interval > 0) + localStorage['update_interval'] = f.update_interval.value; + else { + s.innerHTML = 'Error: Update interval must be greater than zero.'; + new Effect.Highlight(f.update_interval); + } + + localStorage['show_badge'] = (f.show_badge.checked) ? '1' : '0'; + localStorage['show_fresh'] = (f.show_fresh.checked) ? '1' : '0'; + localStorage['single_user'] = (f.single_user.checked) ? '1' : '0'; + localStorage['update_feeds'] = (f.update_feeds.checked) ? '1' : '0'; + + var d = new Date(); + + localStorage['prefs_updated'] = d.getTime(); + + Element.show(s); + + return false; +} + +function single_user_toggle() { + var f = document.forms['options']; + + f.login.disabled = f.single_user.checked; +} + +function init() { + var f = document.forms['options']; + + if (localStorage['site_url']) + f.site_url.value = localStorage['site_url']; + else + f.site_url.value = 'http://example.dom/tt-rss/'; + + if (localStorage['login']) + f.login.value = localStorage['login']; + else + f.login.value = 'user'; + + if (localStorage['update_interval']) + f.update_interval.value = localStorage['update_interval']; + else + f.update_interval.value = '15'; + + if (localStorage['show_badge']) + f.show_badge.checked = localStorage['show_badge'] == '1'; + else + f.show_badge.checked = true; + + if (localStorage['show_fresh']) + f.show_fresh.checked = localStorage['show_fresh'] == '1'; + else + f.show_fresh.checked = false; + + if (localStorage['single_user']) + f.single_user.checked = localStorage['single_user'] == '1'; + else + f.single_user.checked = false; + + if (localStorage['update_feeds']) + f.update_feeds.checked = localStorage['update_feeds'] == '1'; + else + f.update_feeds.checked = false; + + single_user_toggle(); + + var last_updated = $('last_updated'); + + var d = new Date(); + + d.setTime(localStorage['last_updated']); + + last_updated.innerHTML = d; + + var feeds_last_updated = $('feeds-last-updated'); + + d.setTime(localStorage['last_feeds_updated']); + + feeds_last_updated.innerHTML = d; +} + +document.addEventListener('DOMContentLoaded', function() { + document.getElementById('options').addEventListener('submit', save); + document.querySelectorAll('input[name$="single_user"]')[0].addEventListener( + 'change', single_user_toggle); + init(); +}); + |