]> git.wh0rd.org - chrome-ext/tabs-backup.git/blame - popup.js
switch chrome.extension.getViews to messages
[chrome-ext/tabs-backup.git] / popup.js
CommitLineData
70c1267e
MF
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Add event listeners once the DOM has fully loaded by listening for the
6// `DOMContentLoaded` event on the document, and adding your listeners to
7// specific elements when it triggers.
8document.addEventListener('DOMContentLoaded', function () {
9 //document.querySelector('button').addEventListener('click', testf);
10 document.getElementById("menuItem_backupNow").addEventListener('click', menu_backupNow);
11 //document.getElementById("menuItem_restoreNow").addEventListener('click', menu_restoreNow);
12 document.getElementById("menuItem_options").addEventListener('click', menu_ShowOptions);
13 document.getElementById("menuItem_showOlderBackups").addEventListener('click', menu_ShowOlderBackups);
14 document.getElementById("menuItem_showAdvancedView").addEventListener('click', menu_ShowAdvancedView);
15
16
17 initBackupsList (false /*showAll*/);
18
19 /*$(function() {
20 $( "#dialog-confirm" ).dialog({
21 resizable: false,
22 height:140,
23 modal: true,
24 buttons: {
25 "Delete all items": function() {
26 $( this ).dialog( "close" );
27 },
28 Cancel: function() {
29 $( this ).dialog( "close" );
30 }
31 }
32 });
33 });*/
34});
35
36function menu_ShowOptions () {
ef2d5d31 37 chrome.runtime.openOptionsPage();
70c1267e
MF
38}
39
40function menu_ShowAdvancedView() {
ea1d80b4 41 chrome.tabs.create({url: "/advanced.html"});
70c1267e
MF
42}
43
44function menu_ShowOlderBackups () {
45 // save current scrollbar position
46 //var scrollPosition = $(document).scrollTop();
47
48 // Re-initialize backups list
49 //initBackupsList(true /*showAll*/, function () {
50 // Update the scrollbar position to the saved one
51 // $(document).scrollTop(scrollPosition);
52 //});
53
54
55
56 var oldestVisibleBackupItem = $(".backupItem:last");
57 var oldestVisibleBackupItemId = oldestVisibleBackupItem.attr('id');
58 // the id is in the form 'div_' + backupName
59 var oldestVisibleBackupName = oldestVisibleBackupItemId.substring(4);
60
61
62 var backupsDiv = document.getElementById ('backupsDiv');
63
64 chrome.storage.local.get(null, function(items) {
65 var backupsList = [];
66 if(items.backups_list) {
67 backupsList = items.backups_list;
68 }
69
70 var shouldInsert = false;
71
72 for (var i = backupsList.length-1; i >= 0; i--) {
73 var backupName = backupsList[i];
74 var backupObj = items[backupName];
75
76 if (!backupObj) {
77 continue;
78 }
79
80 if (backupObj.isAutomatic === undefined) {
81 backupObj.isAutomatic = true;
82 }
83
84 if (oldestVisibleBackupName == backupName) {
85 // found last visible item, start inserting
86 shouldInsert = true;
87 } else {
88
89 if (shouldInsert) {
90 insertBackupItem(backupName, backupObj, false /*insertAtBeginning*/, false /*doAnimation*/);
91 }
92 }
93 }
94
95 // Hide the "show all" link
96 $("#showOlderBackupsDiv").hide();
97 });
98
99}
100
101function insertBackupItem (backupName, backupObj, insertAtBeginning, doAnimation) {
102 var backupsDiv = document.getElementById ('backupsDiv');
103
104 var restoreButtonId = 'restoreSelectedBackup_' + backupName;
105 var deleteButtonId = 'deleteSelectedBackup_' + backupName;
106 var divId = 'div_' + backupName;
107
108 var elem = document.createElement("div");
109 if (doAnimation) {
110 // start with hidden element (only if we are doing the animation later)
111 elem.style.cssText = 'display: none';
112 }
113
114 elem.id = divId;
115 elem.className = 'backupItem';
116 elem.innerHTML = '<div class="backupItemWrapper">' +
117 '<div class="backupItemContent">' +
118 '<div class="backupItemTitle">' + backupName + "</div>" +
119 '<div class="backupItemDetails">' +
120 'Nr. Windows:<span class="backupItemDetailsNr">' + backupObj.windows.length + '</span><br />' +
121 'Nr. Tabs:<span class="backupItemDetailsNr">' + backupObj.totNumTabs + '</span>' +
122 '</div>' +
123
124 '<div class="backupItemToolbar">' +
125 '<a id="' + restoreButtonId + '"><img src="icon_48.png" title="Open Windows & Tabs" style="border: 0; width: 24px; height: 24px" /></a>' +
126 '<a id="' + deleteButtonId + '"><img src="trash_48.png" title="Delete Backup" style="border: 0; width: 22px; height: 22px" /></a>' +
127 '</div>' +
128
129 '<div class="backupItemFooter">' +
130 (backupObj.isAutomatic ? '<span class="backupItemFooterAutoBackup">AUTO BACKUP</span>' :
131 '<span class="backupItemFooterManualBackup">MANUAL BACKUP</span>') +
132 '</div>' +
133 '</div>' +
134 '</div>';
135
136 //elem.innerHTML += "# Windows: " +
137 //backupsDiv.appendChild(elem);
138
139 var restoreFuncHandler = (function(backupName) {
140 return function(event) {
141 bootbox.confirm("Open Windows & Tabs of backup '" + backupName + "'?", function(confirmed) {
142 if (confirmed) {
eda98b5f
MF
143 chrome.runtime.sendMessage({
144 action: 'restoreNow',
145 args: [backupName],
146 });
70c1267e
MF
147 }
148 });
149
150 /*if (!confirm("Open Windows & Tabs of backup '" + backupName + "'?")) {
151 return;
152 }*/
153
154
155 };
156 })(backupName);
157
158 var deleteFuncHandler = function() {
159
160
161 bootbox.confirm("Delete backup '" + backupName + "'?", function(confirmed) {
162 if (confirmed) {
eda98b5f
MF
163 chrome.runtime.sendMessage({
164 action: 'deleteBackup',
165 args: [backupName],
166 }, () => updateStorageInfo());
70c1267e
MF
167
168 //if (elem.parentNode) {
169 // elem.parentNode.removeChild(elem);
170 //
171 removeBackupItemDiv (backupName);
172 }
173 });
174
175
176 };
177
178 if (insertAtBeginning && backupsDiv.childNodes.length > 0) {
179 // some items already exist
180 var firstNode = backupsDiv.childNodes[0];
181 backupsDiv.insertBefore(elem, firstNode);
182 } else {
183 backupsDiv.appendChild(elem);
184 }
185
186
187 document.getElementById(restoreButtonId).addEventListener('click', restoreFuncHandler);
188 document.getElementById(deleteButtonId).addEventListener('click', deleteFuncHandler);
189
190 if (doAnimation) {
191 var divIdJQ = jq(divId);
192 $(divIdJQ).slideDown(1000);
193 }
194 /*obj.animate({ height: 1, opacity: 1 }, {
195 duration: 1000,
196 complete: function(){obj.css('display', 'block');}
197 });*/
198
199 //obj.fadeIn(2000);
200 //obj.slideDown();
201
202 //$(divId).display = 'none';
203 //$(divId).slideUp();
204 //$(divId).fadeOut(1000);
205 /*var bkp = $("backupsDiv");
206 bkp.remove();
207 var div = $(divId);
208 var a = 0;*/
209 /*setTimeout( function() {
210 var obj = $("#" + divId);
211 obj.fadeIn();
212
213 }, 1000 );*/
214}
215
216function jq(myid) {
217 return '#' + myid.replace(/(:|\.| )/g,'\\$1');
218 }
219
220function removeBackupItemDiv (backupName) {
221 var divId = 'div_' + backupName;
222 var divIdClean = jq(divId);
223 var obj = $(divIdClean);
224 //obj.fadeOut();
225 //obj.slideUp();
226 obj.animate({ height: 0, opacity: 0 }, {
227 duration: 1000,
228 complete: function(){obj.remove();}
229 });
230
231 //var backupItemDiv = document.getElementById (divId);
232 //if (backupItemDiv.parentNode) {
233 // backupItemDiv.parentNode.removeChild(backupItemDiv);
234 //}
235}
236
237function initBackupsList(showAll, callback) {
238 var backupsDiv = document.getElementById ('backupsDiv');
239 //var node = backupsDiv.childNodes[0];
240 backupsDiv.innerHTML = '';
241 //backupsDiv.style = 'display: none';
242 //$("#backupsDiv").html("");
243 /*while (backupsDiv.hasChildNodes()) {
244 backupsDiv.removeChild(backupsDiv.lastChild);
245 }*/
246
247 $("#showOlderBackupsDiv").hide();
248
249 if (!showAll) {
250 $("#backupsDiv").hide();
251 }
252
253 chrome.storage.local.get(null, function(items) {
254 var backupsList = [];
255 if(items.backups_list) {
256 backupsList = items.backups_list;
257 }
258
259 var numInsertedItems = 0;
260 for (var i = backupsList.length-1; i >= 0; i--) {
261 //for (var i = 0; i < backupsList.length; i++) {
262 var backupName = backupsList[i];
263 var backupObj = items[backupName];
264
265 if (!backupObj) {
266 continue;
267 }
268
269 if (backupObj.isAutomatic === undefined) {
270 backupObj.isAutomatic = true;
271 }
272
273 if (!showAll) {
274 if (numInsertedItems >= 10) {
275 $("#showOlderBackupsDiv").show();
276 break;
277 }
278 }
279
280 insertBackupItem(backupName, backupObj, false /*insertAtBeginning*/, false /*doAnimation*/);
281
282 numInsertedItems++;
283 }
284
285 if (!showAll) {
286 $("#backupsDiv").slideDown();
287 }
288
289 if (callback) {
290 callback();
291 }
292
293 });
294
295 updateStorageInfo();
296
297}
298
299function updateStorageInfo() {
300 chrome.storage.local.getBytesInUse(null, function(bytesInUse) {
301 var storageText;
302 if (bytesInUse < 1024) {
303 storageText = bytesInUse.toFixed(2) + " bytes";
304 } else if (bytesInUse < 1024 * 1024) {
bb188d77 305 storageText = (bytesInUse / 1024).toFixed(2) + " KiB";
70c1267e 306 } else {
bb188d77 307 storageText = (bytesInUse / (1024 * 1024)).toFixed(2) + " MiB";
70c1267e
MF
308 }
309
310 var storageSpan = document.getElementById("storageSpan");
311 storageSpan.innerHTML = storageText;
312 });
313}
314
315var lastTimeBackupNowClicked = 0;
316
317function menu_backupNow() {
318 // Ignore clicks if less than 1 second has passed since last click (avoids rapid useless backups)
319 if (lastTimeBackupNowClicked != 0) {
320 var diffTime = Math.abs(new Date().getTime() - lastTimeBackupNowClicked);
321 if (diffTime < 1000) {
322 return;
323 }
324 }
325
326 lastTimeBackupNowClicked = new Date().getTime();
327
eda98b5f
MF
328 chrome.runtime.sendMessage({
329 action: 'backupNowManual',
330 }, function({success, backupName, backupObj}) {
70c1267e
MF
331 if (success) {
332 //updateBackupsList();
333 insertBackupItem (backupName, backupObj, true /*insertAtBeginning*/, true /*doAnimation*/);
334 updateStorageInfo();
335
336 //bootbox.alert("Backup successfully created!");
337 } else {
338 alert('An error occured while creating the backup..');
339 }
eda98b5f 340 });
70c1267e
MF
341
342}
343
344function menu_restoreNow() {
eda98b5f
MF
345 chrome.runtime.sendMessage({
346 action: 'restoreNow',
347 args: ['full_backup'],
348 });
70c1267e 349}
14a426d5
MF
350
351/**
352 * Callback from other pages (like the background).
353 */
354chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
355 console.log(`Got message from ${sender.id}: action=${request.action}`, request);
356
357 let asyncResponse = false;
358 switch (request?.action) {
359 case 'insertBackupItem':
360 insertBackupItem(...request.args);
361 updateStorageInfo();
362 break;
363
364 case 'removeBackupItemDiv':
365 removeBackupItemDiv(...request.args);
366 updateStorageInfo();
367 break;
368 }
369 return asyncResponse;
370});