]> git.wh0rd.org - chrome-ext/tabs-backup.git/blame - background.js
my customizations
[chrome-ext/tabs-backup.git] / background.js
CommitLineData
70c1267e
MF
1
2// Set default values if needed
3if (!localStorage.prefsMaxBackupItems) {
e0b6a877 4 localStorage.prefsMaxBackupItems = "10";
70c1267e
MF
5}
6
7if (!localStorage.prefsBackupTimer) {
e0b6a877 8 localStorage.prefsBackupTimer = "30";
70c1267e
MF
9}
10
11if (!localStorage.lastBackupTime) {
12 localStorage.lastBackupTime = -1;
13
14 // Create a backup now
15 var d = new Date();
16 var formattedDate = date_format (d);
17
18 backupNow(true, formattedDate, function(success, backupName, backupObj) {
19 // backup completed
20 });
70c1267e
MF
21}
22
23function initAlarm () {
e0b6a877 24 //console.log("initAlarm");
70c1267e
MF
25
26 var BACKUP_ALARM_NAME = "backup_alarm";
27
28 // Clear any previous alarm
29 chrome.alarms.clearAll();
70c1267e
MF
30
31 var timerMinutes = parseInt(localStorage.prefsBackupTimer);
e0b6a877 32 chrome.alarms.create(BACKUP_ALARM_NAME, {periodInMinutes: timerMinutes});
70c1267e
MF
33}
34
35initAlarm();
36
37function onAlarm (alarm) {
38 var d = new Date();
39 var formattedDate = date_format (d);
40
e0b6a877 41 console.log("Alarm {" + alarm + "} fired up: " + formattedDate);
70c1267e 42
70c1267e
MF
43 // if last backup time != lastTabsEdit
44 // perform automatic backup
70c1267e
MF
45 backupNow(true, formattedDate, function(success, backupName, backupObj) {
46 // automatic backup completed
47 var popupViews = chrome.extension.getViews({type: "popup"});
48 if (popupViews.length > 0) {
49 for (var i = 0; i < popupViews.length; i++) {
50 var popupView = popupViews[i];
51 if (!popupView.insertBackupItem) {
52 continue;
53 }
54
55 popupView.insertBackupItem(backupName, backupObj, true /*insertAtBeginning*/, true /*doAnimation*/);
56 popupView.updateStorageInfo();
57 }
58 }
59 });
70c1267e
MF
60}
61
62chrome.alarms.onAlarm.addListener(onAlarm);
63
64function date_prependZero (val) {
65 return val < 10 ? "0" + val : "" + val;
66}
67
68// yyyy-m-d h:i:s
69function date_format (d) {
70 var monthOneOffset = d.getMonth() + 1; // convert from 0-11 to 1-12
71
72 var formattedDate = d.getFullYear() + "-" + date_prependZero(monthOneOffset) + "-" + date_prependZero(d.getDate())
73 + " " + date_prependZero(d.getHours()) + ":" + date_prependZero(d.getMinutes()) + ":" + date_prependZero(d.getSeconds());
74
75 return formattedDate;
76}
77
78
79function backupNowManual (callbackDone) {
80 var d = new Date();
81 var formattedDate = date_format (d);
82
83 backupNow(false, formattedDate, callbackDone);
84
85
86}
87
88function deleteOldestBackup () {
89 chrome.storage.local.get("backups_list", function(items) {
90 if(!items.backups_list) {
91 return;
92 }
93
94 var backupsList = items.backups_list;
95 var numItemsToDelete = backupsList.length - parseInt(localStorage.prefsMaxBackupItems);
96 if (numItemsToDelete > 0) {
97 var i = 0;
98 var loopFunc = function () {
99 //
100 if (i > 0) {
101 var deletedBackupName = backupsList[i-1];
102 var popupViews = chrome.extension.getViews({type: "popup"});
103 if (popupViews.length > 0) {
104 for (var j = 0; j < popupViews.length; j++) {
105 var popupView = popupViews[j];
106 if (!popupView.removeBackupItemDiv) {
107 continue;
108 }
109
110 popupView.removeBackupItemDiv(deletedBackupName);
111 popupView.updateStorageInfo();
112 }
113 }
114 }
115 //
116
117 if (i >= numItemsToDelete) {
118 return;
119 }
120
121 deleteBackup (backupsList[i], loopFunc);
122 i++;
123 };
124
125 loopFunc ();
126 }
127
128 //for (var i = 0; i < numItemsToDelete; i++) {
129 // TODO WARNING: I'm calling deleteBackup rapidly, while deleting is async...(I should wait for each delete to complete before deleting the next)
130 //deleteBackup (backupsList[i], function() {
131
132 //});
133 //}
134
135 });
136}
137
138//var isCreatingBackup = false;
139
140function backupNow(isAutomatic, backupName, callbackDone) {
141 console.log("backupNow - isAutomatic: " + isAutomatic + " name: " + backupName);
142 /*if (isCreatingBackup === true) {
143 console.log("backupNow - already running..skipping..");
144 return;
145 }*/
146
147 //isCreatingBackup = true;
148
149 /*if (!confirm("Perform a full backup? All windows and their tabs will be saved!")) {
150 return;
151 }*/
152
153 var fullBackup = {
154 windows: [],
155 isAutomatic: isAutomatic,
156 totNumTabs: 0
157 };
158
159 chrome.windows.getAll({populate : true}, function (window_list) {
160 var totNumTabs = 0;
161
162 for(var i=0;i<window_list.length;i++) {
163 var window = window_list[i];
164
165 //console.log ("Window " + i);
166
167 var bkpWindow = {
168 tabs: []
169 };
170
171 var windowTabs = window.tabs;
172 for (var j = 0; j < windowTabs.length; j++) {
173 var tab = windowTabs[j];
174
175 //console.log("==> Tab " + j + " (" + tab.index + "): " + tabUrl);
176
177 var bkpTab = {
178 url: tab.url,
179 title: tab.title
180 };
181
182 // Add tab to tabs arrays
183 bkpWindow.tabs.push(bkpTab);
184 }
185
186 totNumTabs += windowTabs.length;
187
188 fullBackup.windows.push(bkpWindow);
189 }
190
e0b6a877
MF
191 if (totNumTabs == 0)
192 return;
193
70c1267e
MF
194 fullBackup.totNumTabs = totNumTabs;
195
196 var storageSetValues = {};
197 storageSetValues[backupName] = fullBackup;
198
199 // Store backup
200 chrome.storage.local.set(storageSetValues, function () {
201 if (chrome.runtime.lastError) {
202 //isCreatingBackup = false;
203 // TODO change icon to error..
204 //alert ("Error: " + chrome.runtime.lastError.message);
205 updateBrowserActionIcon (1);
206
207 callbackDone(false);
208 } else {
209 console.log("backup saved");
210 //alert("Backup saved successfully!");
211
212 chrome.storage.local.get("backups_list", function(items) {
213 var backupsList = [];
214 if(items.backups_list) {
215 backupsList = items.backups_list;
216 }
217
218 console.log("Updating 'backups_list' - cur. size: " + backupsList.length);
219
220 backupsList.push(backupName);
221
222 chrome.storage.local.set({"backups_list": backupsList}, function () {
223 //isCreatingBackup = false;
224
225 if (chrome.runtime.lastError) {
226 console.log ("Error saving backups_list: " + chrome.runtime.lastError.message);
227 updateBrowserActionIcon (1);
228 callbackDone(false);
229 } else {
230 console.log("Backups list saved successfully");
231
232 updateBrowserActionIcon (0);
233 callbackDone(true, backupName, fullBackup);
234
235 if (backupsList.length > parseInt(localStorage.prefsMaxBackupItems)) {
236 deleteOldestBackup();
237 }
238 }
239 });
240 });
241 }
242 });
243 });
244}
245
246/**
247 * 0 ==> OK
248 * 1 ==> ERROR
249 */
250function updateBrowserActionIcon (status) {
251 var icon;
252 switch(status) {
253 case 0:
254 icon = "icon_ok.png";
255 break;
256 default:
257 icon = "icon_error.png";
258 break;
259 }
260
261 chrome.browserAction.setIcon({path: icon});
262}
263
264function deleteBackup (backupName, callback) {
265 console.log("Deleting backup " + backupName);
266
267 chrome.storage.local.remove(backupName, function() {
268 //console.log ("=> Deleted backup " + backupName);
269
270 chrome.storage.local.get("backups_list", function(items) {
271 //console.log ("==> got backups_list " + backupName);
272
273 if(!items.backups_list) {
274 callback();
275 return;
276 }
277
278 var backupsList = items.backups_list;
279
280 var index = backupsList.indexOf(backupName);
281 if (index >= 0) {
282 backupsList.splice(index, 1);
283 }
284
285 //console.log ("===> Updating backups_list (removing " + backupName + ")");
286
287 chrome.storage.local.set({"backups_list": backupsList}, function() {
288 //console.log ("===> Updated backups_list (removed " + backupName + ")");
289
290 callback();
291 });
292
293 //console.log ("==> EXIT got backups_list " + backupName);
294 });
295
296 //console.log ("=> EXIT Deleted backup " + backupName);
297 });
298
299 //console.log("EXIT Deleting backup " + backupName);
300
301
302}
303
304function restoreNow(backupName) {
305 console.log("restoreNow");
306
307 chrome.storage.local.get(backupName, function(items) {
308 if(!items[backupName]) {
309 alert("No Backup found");
310 return;
311 }
312
313 /*if (!confirm("Restore full backup?")) {
314 return;
315 }*/
316 /*
317 if (confirm("Would you like to close all existing windows first?")) {
318 chrome.windows.getAll({populate : false}, function (window_list) {
319 for(var i=0;i<window_list.length;i++) {
320 var window = window_list[i];
321 chrome.windows.remove(window.id);
322 }
323 });
324 }*/
325
326
327 var fullBackup = items[backupName];
328
329 for(var i=0;i<fullBackup.windows.length;i++) {
330 var window = fullBackup.windows[i];
331
332 //console.log ("Window " + i);
333
334 urlsToOpen = [];
335
336 var windowTabs = window.tabs;
337 for (var j = 0; j < windowTabs.length; j++) {
338 var tab = windowTabs[j];
339 var tabUrl = tab.url;
340 urlsToOpen.push(tabUrl);
341 }
342
343 var windowProperties = {
344 url: urlsToOpen
345 };
346
347 // Create a new Window
348 chrome.windows.create(windowProperties, function(createdWindow) {
349 //console.log("Created window id: " + createdWindow.id);
350
351 //chrome.tabs.remove(createdWindow.tabs[0].id);
352
353 // Create new tabs
354 /*var windowTabs = window.tabs;
355 for (var j = 0; j < windowTabs.length; j++) {
356 var tab = windowTabs[j];
357 var tabUrl = tab.url;
358
359 console.log("==> Tab " + j + ": " + tabUrl);
360
361 var tabProperties = {
362 url: tabUrl,
363 windowId: createdWindow.id
364 };
365
366 chrome.tabs.create(tabProperties, function(createdTab) {
367 // do nothing..
368 });
369 }*/
370 });
371
372
373
374 }
375 });
e0b6a877 376}