]> git.wh0rd.org - chrome-ext/tabs-backup.git/blobdiff - background.js
make it mine
[chrome-ext/tabs-backup.git] / background.js
index a1debe5fa23a33dc0559c311c1618fcdea7e099a..4ba12fa3db836b144cc10e1203cd25ed2f5ef3a1 100644 (file)
+// Create a backup on first install (or if storage is wiped for some reason.
+chrome.storage.local.get(function(items) {
+       // Setup defaults.
+       if (items.prefs_max_backup_items === undefined) {
+               chrome.storage.local.set({prefs_max_backup_items: 10});
+       }
+       if (items.prefs_backup_timer === undefined) {
+               chrome.storage.local.set({prefs_backup_timer: 30});
+       }
 
-// Set default values if needed
-if (!localStorage.prefsMaxBackupItems) {
-       localStorage.prefsMaxBackupItems = "30";
-}
-
-if (!localStorage.prefsBackupTimer) {
-       localStorage.prefsBackupTimer = "5";
-}
-
-if (!localStorage.lastTimerIntervalId) {
-       localStorage.lastTimerIntervalId = 0;
-}
-
-if (!localStorage.lastTabsEdit) {
-       localStorage.lastTabsEdit = 0;
-}
-
-if (!localStorage.lastBackupTime) {
-       localStorage.lastBackupTime = -1;
+       // If a backup exists already, nothing to do.
+       if (items.backups_list) {
+               return;
+       }
 
        // Create a backup now
        var d = new Date();
        var formattedDate = date_format (d);
 
-       backupNow(true, formattedDate, function(success, backupName, backupObj) {
+       backupNow(true, formattedDate, function({success, backupName, backupObj}) {
                // backup completed
        });
-
-       localStorage.lastBackupTime = localStorage.lastTabsEdit;
-}
-
-
-
-// Works only for Event Pages
-/*
-chrome.runtime.onInstalled.addListener(function() {
-       console.log("Extension installed/updates");
-
-       if (localStorage.lastBackupTime != localStorage.lastTabsEdit) {
-               // Create a backup now
-               var d = new Date();
-               var formattedDate = date_format (d);
-
-               backupNow(true, formattedDate, function(success, backupName, backupObj) {
-                       // backup completed
-               });
-
-               localStorage.lastBackupTime = localStorage.lastTabsEdit;
-       }
-});*/
-
-chrome.tabs.onRemoved.addListener(function(tabId, removeInfo) {
-       //console.log('tabs.onRemoved');
-
-       tabsEdited(true);
-});
-
-chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) {
-       //console.log('tabs.onUpdated');
-
-       tabsEdited(true);
-});
-
-chrome.tabs.onAttached.addListener(function(tabId, attachInfo) {
-       //console.log('tabs.onAttached');
-
-       tabsEdited(false);
-});
-
-chrome.tabs.onMoved.addListener(function(tabId, moveInfo) {
-       //console.log('tabs.onMoved');
-
-       tabsEdited(false);
-});
-
-chrome.tabs.onDetached.addListener(function(tabId, detachInfo) {
-       //console.log('tabs.onDetached');
-
-       tabsEdited(false);
 });
 
-chrome.tabs.onCreated.addListener(function(tab) {
-       //console.log('tabs.onCreated');
-
-       tabsEdited(true);
-});
-
-function tabsEdited (isImportant) {
-       var d = new Date();
-       var millis = d.getTime();
-
-       console.log('tabsEdited - lastTabsEdit: ' + localStorage.lastTabsEdit);
-       console.log('tabsEdited - new lastTabsEdit: ' + millis);
-
-       localStorage.lastTabsEdit = millis;
-
-
-}
-
 function initAlarm () {
-       console.log("initAlarm");
+       //console.log("initAlarm");
 
        var BACKUP_ALARM_NAME = "backup_alarm";
 
        // Clear any previous alarm
        chrome.alarms.clearAll();
-       clearInterval(parseInt(localStorage.lastTimerIntervalId));
-
-       var timerMinutes = parseInt(localStorage.prefsBackupTimer);
-
-       // Apparantely once the app is on the Chrome Store it's not possible
-       // to create alarms that have period less than 5 minutes..
-       if (timerMinutes < 5) {
-               var timerMillis = timerMinutes * 60 * 1000;
-               localStorage.lastTimerIntervalId = setInterval (onAlarm, timerMillis);
-               console.log("Created interval alarm - id: " + localStorage.lastTimerIntervalId + " time: " + timerMinutes + " minutes");
-       } else {
-               console.log("Creating chrome.alarm 'backup_alarm' - time: " + timerMinutes + " minutes");
+
+       chrome.storage.local.get(function(items) {
+               const timerMinutes = items.prefs_backup_timer;
                chrome.alarms.create(BACKUP_ALARM_NAME, {periodInMinutes: timerMinutes});
-       }
+       });
 }
 
 initAlarm();
@@ -127,13 +42,11 @@ function onAlarm (alarm) {
        var d = new Date();
        var formattedDate = date_format (d);
 
-       console.log("Alarm {" + alarm + "} fired up: " + formattedDate + " last tabs edit: " + localStorage.lastTabsEdit + " last backup time: " + localStorage.lastBackupTime);
+       console.log("Alarm {" + alarm + "} fired up: " + formattedDate);
 
-       // localStorage.lastBackupTime
        // if last backup time != lastTabsEdit
        //      perform automatic backup
-       if (localStorage.lastBackupTime != localStorage.lastTabsEdit) {
-               backupNow(true, formattedDate, function(success, backupName, backupObj) {
+               backupNow(true, formattedDate, function({success, backupName, backupObj}) {
                        // automatic backup completed
                        var popupViews = chrome.extension.getViews({type: "popup"});
                        if (popupViews.length > 0) {
@@ -148,9 +61,6 @@ function onAlarm (alarm) {
                                }
                        }
                });
-
-               localStorage.lastBackupTime = localStorage.lastTabsEdit;
-       }
 }
 
 chrome.alarms.onAlarm.addListener(onAlarm);
@@ -180,13 +90,13 @@ function backupNowManual (callbackDone) {
 }
 
 function deleteOldestBackup () {
-       chrome.storage.local.get("backups_list", function(items) {
+       chrome.storage.local.get(function(items) {
                if(!items.backups_list) {
                        return;
                }
 
                var backupsList = items.backups_list;
-               var numItemsToDelete = backupsList.length - parseInt(localStorage.prefsMaxBackupItems);
+               var numItemsToDelete = backupsList.length - items.prefs_max_backup_items;
                if (numItemsToDelete > 0) {
                        var i = 0;
                        var loopFunc = function () {
@@ -259,10 +169,25 @@ function backupNow(isAutomatic, backupName, callbackDone) {
                        //console.log ("Window " + i);
 
                        var bkpWindow = {
+                               state: window.state,
+                               top: window.top,
+                               left: window.left,
+                               width: window.width,
+                               height: window.height,
                                tabs: []
                        };
 
                        var windowTabs = window.tabs;
+
+                       // If it's a single window sittig at the new tab page, don't bother
+                       // saving it.  This is a nice shortcut when things crash as it will
+                       // only show a single window.
+                       if (windowTabs.length == 1) {
+                               const tab = windowTabs[0];
+                               if (tab.url == 'chrome://newtab/')
+                                       continue;
+                       }
+
                        for (var j = 0; j < windowTabs.length; j++) {
                                var tab = windowTabs[j];
 
@@ -270,7 +195,9 @@ function backupNow(isAutomatic, backupName, callbackDone) {
 
                                var bkpTab = {
                                        url: tab.url,
-                                       title: tab.title
+                                       title: tab.title,
+                                       highlighted: tab.highlighted,
+                                       pinned: tab.pinned,
                                };
 
                                // Add tab to tabs arrays
@@ -282,6 +209,9 @@ function backupNow(isAutomatic, backupName, callbackDone) {
                        fullBackup.windows.push(bkpWindow);
                }
 
+               if (totNumTabs == 0)
+                       return;
+
                fullBackup.totNumTabs = totNumTabs;
 
                var storageSetValues = {};
@@ -295,12 +225,12 @@ function backupNow(isAutomatic, backupName, callbackDone) {
                                //alert ("Error: " + chrome.runtime.lastError.message);
                                updateBrowserActionIcon (1);
 
-                               callbackDone(false);
+                               callbackDone({success: false});
                        } else {
                                console.log("backup saved");
                                //alert("Backup saved successfully!");
 
-                               chrome.storage.local.get("backups_list", function(items) {
+                               chrome.storage.local.get(function(items) {
                                        var backupsList = [];
                                        if(items.backups_list) {
                                                backupsList = items.backups_list;
@@ -316,14 +246,18 @@ function backupNow(isAutomatic, backupName, callbackDone) {
                                                if (chrome.runtime.lastError) {
                                                        console.log ("Error saving backups_list: " + chrome.runtime.lastError.message);
                                                        updateBrowserActionIcon (1);
-                                                       callbackDone(false);
+                                                       callbackDone({success: false});
                                                } else {
                                                        console.log("Backups list saved successfully");
 
                                                        updateBrowserActionIcon (0);
-                                                       callbackDone(true, backupName, fullBackup);
+                                                       callbackDone({
+                                                               success: true,
+                                                               backupName,
+                                                               backupObj: fullBackup,
+                                                       });
 
-                                                       if (backupsList.length > parseInt(localStorage.prefsMaxBackupItems)) {
+                                                       if (backupsList.length > items.prefs_max_backup_items) {
                                                                deleteOldestBackup();
                                                        }
                                                }
@@ -349,7 +283,7 @@ function updateBrowserActionIcon (status) {
                        break;
        }
 
-       chrome.browserAction.setIcon({path: icon});
+       chrome.action.setIcon({path: icon});
 }
 
 function deleteBackup (backupName, callback) {
@@ -418,50 +352,95 @@ function restoreNow(backupName) {
                var fullBackup = items[backupName];
 
                for(var i=0;i<fullBackup.windows.length;i++) {
-                       var window = fullBackup.windows[i];
+                       const window = fullBackup.windows[i];
 
                        //console.log ("Window " + i);
 
                        urlsToOpen = [];
 
-                       var windowTabs = window.tabs;
-                       for (var j = 0; j < windowTabs.length; j++) {
-                               var tab = windowTabs[j];
-                               var tabUrl = tab.url;
+                       const windowTabs = window.tabs;
+                       for (let j = 0; j < windowTabs.length; j++) {
+                               const tab = windowTabs[j];
+                               const tabUrl = tab.url;
                                urlsToOpen.push(tabUrl);
                        }
 
-                       var windowProperties = {
-                               url: urlsToOpen
+                       const windowProperties = {
+                               state: 'normal',
+                               url: urlsToOpen,
+                               top: window.top,
+                               left: window.left,
+                               width: window.width,
+                               height: window.height,
                        };
 
                        // Create a new Window
                        chrome.windows.create(windowProperties, function(createdWindow) {
-                               //console.log("Created window id: " + createdWindow.id);
-
-                               //chrome.tabs.remove(createdWindow.tabs[0].id);
-
-                               // Create new tabs
-                               /*var windowTabs = window.tabs;
-                               for (var j = 0; j < windowTabs.length; j++) {
-                                       var tab = windowTabs[j];
-                                       var tabUrl = tab.url;
+                               // Chrome errors if the dimensions are set on non-normal windows.
+                               // So we create the window first with the right settings, then
+                               // update the window state.
+                               if (window.state != 'normal') {
+                                       chrome.windows.update(createdWindow.id, {state: window.state});
+                               }
 
-                                       console.log("==> Tab " + j + ": " + tabUrl);
+                               chrome.windows.get(createdWindow.id, {populate: true}, ({tabs}) => {
+                                       for (let tabi = 0; tabi < windowTabs.length; ++tabi) {
+                                               const oldtab = windowTabs[tabi];
+                                               const newtab = tabs[tabi];
+                                               chrome.tabs.update(newtab.id, {
+                                                       highlighted: oldtab.highlighted,
+                                                       pinned: oldtab.pinned,
+                                               }, () => {
+                                                       if (!oldtab.highlighted) {
+                                                               // If we discard a tab too fast, Chrome will completely
+                                                               // throw it away.  Wait until it's in a stable enough
+                                                               // state for us to discard it.
+                                                               let retryCount = 60;
+                                                               const checktab = (id) => {
+                                                                       if (retryCount-- < 0)
+                                                                               return;
+                                                                       chrome.tabs.get(id, (tab) => {
+                                                                               if (tab.pendingUrl)
+                                                                                       setTimeout(() => checktab(id), 500);
+                                                                               else
+                                                                                       chrome.tabs.discard(id);
+                                                                       });
+                                                               };
+                                                               checktab(newtab.id);
+                                                       }
+                                               });
+                                       }
+                               });
+                       });
+               }
+       });
+}
 
-                                       var tabProperties = {
-                                               url: tabUrl,
-                                               windowId: createdWindow.id
-                                       };
+/**
+ * Callback from other pages (like the popup).
+ */
+chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
+       console.log(`Got message from ${sender.id}: action=${request.action}`, request);
 
-                                       chrome.tabs.create(tabProperties, function(createdTab) {
-                                               // do nothing..
-                                       });
-                               }*/
-                       });
+       let asyncResponse = false;
+       switch (request?.action) {
+               case 'initAlarm':
+                       initAlarm();
+                       break;
 
+               case 'restoreNow':
+                       restoreNow(...request.args);
+                       break;
 
+               case 'deleteBackup':
+                       deleteBackup(...request.args, sendResponse);
+                       asyncResponse = true;
+                       break;
 
-               }
-       });
-}
\ No newline at end of file
+               case 'backupNowManual':
+                       backupNowManual(sendResponse);
+                       asyncResponse = true;
+                       break;
+       }
+       return asyncResponse;
+});