]>
git.wh0rd.org - chrome-ext/tabs-backup.git/blob - background.js
2 // Set default values if needed
3 if (!localStorage
.prefsMaxBackupItems
) {
4 localStorage
.prefsMaxBackupItems
= "30";
7 if (!localStorage
.prefsBackupTimer
) {
8 localStorage
.prefsBackupTimer
= "5";
11 if (!localStorage
.lastTimerIntervalId
) {
12 localStorage
.lastTimerIntervalId
= 0;
15 if (!localStorage
.lastTabsEdit
) {
16 localStorage
.lastTabsEdit
= 0;
19 if (!localStorage
.lastBackupTime
) {
20 localStorage
.lastBackupTime
= -1;
22 // Create a backup now
24 var formattedDate
= date_format (d
);
26 backupNow(true, formattedDate
, function(success
, backupName
, backupObj
) {
30 localStorage
.lastBackupTime
= localStorage
.lastTabsEdit
;
35 // Works only for Event Pages
37 chrome.runtime.onInstalled.addListener(function() {
38 console.log("Extension installed/updates");
40 if (localStorage.lastBackupTime != localStorage.lastTabsEdit) {
41 // Create a backup now
43 var formattedDate = date_format (d);
45 backupNow(true, formattedDate, function(success, backupName, backupObj) {
49 localStorage.lastBackupTime = localStorage.lastTabsEdit;
53 chrome
.tabs
.onRemoved
.addListener(function(tabId
, removeInfo
) {
54 //console.log('tabs.onRemoved');
59 chrome
.tabs
.onUpdated
.addListener(function(tabId
, changeInfo
, tab
) {
60 //console.log('tabs.onUpdated');
65 chrome
.tabs
.onAttached
.addListener(function(tabId
, attachInfo
) {
66 //console.log('tabs.onAttached');
71 chrome
.tabs
.onMoved
.addListener(function(tabId
, moveInfo
) {
72 //console.log('tabs.onMoved');
77 chrome
.tabs
.onDetached
.addListener(function(tabId
, detachInfo
) {
78 //console.log('tabs.onDetached');
83 chrome
.tabs
.onCreated
.addListener(function(tab
) {
84 //console.log('tabs.onCreated');
89 function tabsEdited (isImportant
) {
91 var millis
= d
.getTime();
93 console
.log('tabsEdited - lastTabsEdit: ' + localStorage
.lastTabsEdit
);
94 console
.log('tabsEdited - new lastTabsEdit: ' + millis
);
96 localStorage
.lastTabsEdit
= millis
;
101 function initAlarm () {
102 console
.log("initAlarm");
104 var BACKUP_ALARM_NAME
= "backup_alarm";
106 // Clear any previous alarm
107 chrome
.alarms
.clearAll();
108 clearInterval(parseInt(localStorage
.lastTimerIntervalId
));
110 var timerMinutes
= parseInt(localStorage
.prefsBackupTimer
);
112 // Apparantely once the app is on the Chrome Store it's not possible
113 // to create alarms that have period less than 5 minutes..
114 if (timerMinutes
< 5) {
115 var timerMillis
= timerMinutes
* 60 * 1000;
116 localStorage
.lastTimerIntervalId
= setInterval (onAlarm
, timerMillis
);
117 console
.log("Created interval alarm - id: " + localStorage
.lastTimerIntervalId
+ " time: " + timerMinutes
+ " minutes");
119 console
.log("Creating chrome.alarm 'backup_alarm' - time: " + timerMinutes
+ " minutes");
120 chrome
.alarms
.create(BACKUP_ALARM_NAME
, {periodInMinutes
: timerMinutes
});
126 function onAlarm (alarm
) {
128 var formattedDate
= date_format (d
);
130 console
.log("Alarm {" + alarm
+ "} fired up: " + formattedDate
+ " last tabs edit: " + localStorage
.lastTabsEdit
+ " last backup time: " + localStorage
.lastBackupTime
);
132 // localStorage.lastBackupTime
133 // if last backup time != lastTabsEdit
134 // perform automatic backup
135 if (localStorage
.lastBackupTime
!= localStorage
.lastTabsEdit
) {
136 backupNow(true, formattedDate
, function(success
, backupName
, backupObj
) {
137 // automatic backup completed
138 var popupViews
= chrome
.extension
.getViews({type
: "popup"});
139 if (popupViews
.length
> 0) {
140 for (var i
= 0; i
< popupViews
.length
; i
++) {
141 var popupView
= popupViews
[i
];
142 if (!popupView
.insertBackupItem
) {
146 popupView
.insertBackupItem(backupName
, backupObj
, true /*insertAtBeginning*/, true /*doAnimation*/);
147 popupView
.updateStorageInfo();
152 localStorage
.lastBackupTime
= localStorage
.lastTabsEdit
;
156 chrome
.alarms
.onAlarm
.addListener(onAlarm
);
158 function date_prependZero (val
) {
159 return val
< 10 ? "0" + val
: "" + val
;
163 function date_format (d
) {
164 var monthOneOffset
= d
.getMonth() + 1; // convert from 0-11 to 1-12
166 var formattedDate
= d
.getFullYear() + "-" + date_prependZero(monthOneOffset
) + "-" + date_prependZero(d
.getDate())
167 + " " + date_prependZero(d
.getHours()) + ":" + date_prependZero(d
.getMinutes()) + ":" + date_prependZero(d
.getSeconds());
169 return formattedDate
;
173 function backupNowManual (callbackDone
) {
175 var formattedDate
= date_format (d
);
177 backupNow(false, formattedDate
, callbackDone
);
182 function deleteOldestBackup () {
183 chrome
.storage
.local
.get("backups_list", function(items
) {
184 if(!items
.backups_list
) {
188 var backupsList
= items
.backups_list
;
189 var numItemsToDelete
= backupsList
.length
- parseInt(localStorage
.prefsMaxBackupItems
);
190 if (numItemsToDelete
> 0) {
192 var loopFunc = function () {
195 var deletedBackupName
= backupsList
[i
-1];
196 var popupViews
= chrome
.extension
.getViews({type
: "popup"});
197 if (popupViews
.length
> 0) {
198 for (var j
= 0; j
< popupViews
.length
; j
++) {
199 var popupView
= popupViews
[j
];
200 if (!popupView
.removeBackupItemDiv
) {
204 popupView
.removeBackupItemDiv(deletedBackupName
);
205 popupView
.updateStorageInfo();
211 if (i
>= numItemsToDelete
) {
215 deleteBackup (backupsList
[i
], loopFunc
);
222 //for (var i = 0; i < numItemsToDelete; i++) {
223 // TODO WARNING: I'm calling deleteBackup rapidly, while deleting is async...(I should wait for each delete to complete before deleting the next)
224 //deleteBackup (backupsList[i], function() {
232 //var isCreatingBackup = false;
234 function backupNow(isAutomatic
, backupName
, callbackDone
) {
235 console
.log("backupNow - isAutomatic: " + isAutomatic
+ " name: " + backupName
);
236 /*if (isCreatingBackup === true) {
237 console.log("backupNow - already running..skipping..");
241 //isCreatingBackup = true;
243 /*if (!confirm("Perform a full backup? All windows and their tabs will be saved!")) {
249 isAutomatic
: isAutomatic
,
253 chrome
.windows
.getAll({populate
: true}, function (window_list
) {
256 for(var i
=0;i
<window_list
.length
;i
++) {
257 var window
= window_list
[i
];
259 //console.log ("Window " + i);
265 var windowTabs
= window
.tabs
;
266 for (var j
= 0; j
< windowTabs
.length
; j
++) {
267 var tab
= windowTabs
[j
];
269 //console.log("==> Tab " + j + " (" + tab.index + "): " + tabUrl);
276 // Add tab to tabs arrays
277 bkpWindow
.tabs
.push(bkpTab
);
280 totNumTabs
+= windowTabs
.length
;
282 fullBackup
.windows
.push(bkpWindow
);
285 fullBackup
.totNumTabs
= totNumTabs
;
287 var storageSetValues
= {};
288 storageSetValues
[backupName
] = fullBackup
;
291 chrome
.storage
.local
.set(storageSetValues
, function () {
292 if (chrome
.runtime
.lastError
) {
293 //isCreatingBackup = false;
294 // TODO change icon to error..
295 //alert ("Error: " + chrome.runtime.lastError.message);
296 updateBrowserActionIcon (1);
300 console
.log("backup saved");
301 //alert("Backup saved successfully!");
303 chrome
.storage
.local
.get("backups_list", function(items
) {
304 var backupsList
= [];
305 if(items
.backups_list
) {
306 backupsList
= items
.backups_list
;
309 console
.log("Updating 'backups_list' - cur. size: " + backupsList
.length
);
311 backupsList
.push(backupName
);
313 chrome
.storage
.local
.set({"backups_list": backupsList
}, function () {
314 //isCreatingBackup = false;
316 if (chrome
.runtime
.lastError
) {
317 console
.log ("Error saving backups_list: " + chrome
.runtime
.lastError
.message
);
318 updateBrowserActionIcon (1);
321 console
.log("Backups list saved successfully");
323 updateBrowserActionIcon (0);
324 callbackDone(true, backupName
, fullBackup
);
326 if (backupsList
.length
> parseInt(localStorage
.prefsMaxBackupItems
)) {
327 deleteOldestBackup();
341 function updateBrowserActionIcon (status
) {
345 icon
= "icon_ok.png";
348 icon
= "icon_error.png";
352 chrome
.browserAction
.setIcon({path
: icon
});
355 function deleteBackup (backupName
, callback
) {
356 console
.log("Deleting backup " + backupName
);
358 chrome
.storage
.local
.remove(backupName
, function() {
359 //console.log ("=> Deleted backup " + backupName);
361 chrome
.storage
.local
.get("backups_list", function(items
) {
362 //console.log ("==> got backups_list " + backupName);
364 if(!items
.backups_list
) {
369 var backupsList
= items
.backups_list
;
371 var index
= backupsList
.indexOf(backupName
);
373 backupsList
.splice(index
, 1);
376 //console.log ("===> Updating backups_list (removing " + backupName + ")");
378 chrome
.storage
.local
.set({"backups_list": backupsList
}, function() {
379 //console.log ("===> Updated backups_list (removed " + backupName + ")");
384 //console.log ("==> EXIT got backups_list " + backupName);
387 //console.log ("=> EXIT Deleted backup " + backupName);
390 //console.log("EXIT Deleting backup " + backupName);
395 function restoreNow(backupName
) {
396 console
.log("restoreNow");
398 chrome
.storage
.local
.get(backupName
, function(items
) {
399 if(!items
[backupName
]) {
400 alert("No Backup found");
404 /*if (!confirm("Restore full backup?")) {
408 if (confirm("Would you like to close all existing windows first?")) {
409 chrome.windows.getAll({populate : false}, function (window_list) {
410 for(var i=0;i<window_list.length;i++) {
411 var window = window_list[i];
412 chrome.windows.remove(window.id);
418 var fullBackup
= items
[backupName
];
420 for(var i
=0;i
<fullBackup
.windows
.length
;i
++) {
421 var window
= fullBackup
.windows
[i
];
423 //console.log ("Window " + i);
427 var windowTabs
= window
.tabs
;
428 for (var j
= 0; j
< windowTabs
.length
; j
++) {
429 var tab
= windowTabs
[j
];
430 var tabUrl
= tab
.url
;
431 urlsToOpen
.push(tabUrl
);
434 var windowProperties
= {
438 // Create a new Window
439 chrome
.windows
.create(windowProperties
, function(createdWindow
) {
440 //console.log("Created window id: " + createdWindow.id);
442 //chrome.tabs.remove(createdWindow.tabs[0].id);
445 /*var windowTabs = window.tabs;
446 for (var j = 0; j < windowTabs.length; j++) {
447 var tab = windowTabs[j];
448 var tabUrl = tab.url;
450 console.log("==> Tab " + j + ": " + tabUrl);
452 var tabProperties = {
454 windowId: createdWindow.id
457 chrome.tabs.create(tabProperties, function(createdTab) {