Skip to content

Commit a1ff0e6

Browse files
committed
Version 2.1.5
- Moved part of the database to indexedDB - Speeded up page loading and extension performance - Fixed bugs
1 parent f8ff012 commit a1ff0e6

13 files changed

Lines changed: 304 additions & 87 deletions

src/bg.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
<body>
77
<script src="md5.js"></script>
88
<script src="favicon.js"></script>
9+
<script src="database.js"></script>
910
<script src="shared.js"></script>
1011
<script src="bg.js"></script>
1112
</body>

src/bg.js

Lines changed: 54 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -41,15 +41,19 @@ function handleInstalled(details) {
4141
"warnBeforeUpdating":true,
4242
};
4343
if(details.reason==="install"){
44-
browser.storage.local.get(['sites','settings']).then(result=>{
45-
const db={};
44+
browser.storage.local.get(['sites','settings','dbVersion']).then(result=>{
45+
const storage={};
4646
if(result.sites===undefined){
47-
Object.assign(db,{sites:[],changes:[],sort:[]});
47+
Object.assign(storage,{sites:[],sort:[]});
4848
}
4949
if(result.settings===undefined){
50-
Object.assign(db,{settings:defaultSettings});
50+
Object.assign(storage,{settings:defaultSettings});
5151
}
52-
browser.storage.local.set(db).then(()=>{
52+
if(result.dbVersion===undefined){
53+
Object.assign(storage,{dbVersion:1});
54+
}
55+
browser.storage.local.set(storage).then(async ()=>{
56+
if(!db)await getDB();
5357
init();
5458
if(!details.temporary){
5559
browser.tabs.create({
@@ -125,11 +129,13 @@ browser.notifications.onClicked.addListener(e=>{
125129
});
126130

127131
(function(){
128-
browser.storage.local.get(['sites','sort','settings']).then(result=>{
132+
browser.storage.local.get(['sites','sort','settings','dbVersion']).then(result=>{
129133
if(result.sites===undefined||result.settings===undefined){
130134
handleInstalled({reason:"install"});
131-
}else{
135+
}else if(result.dbVersion===1){
132136
init();
137+
}else{
138+
convertDb();
133139
}
134140
if(result.sort===undefined&&result.sites!==undefined){
135141
let sort=[];
@@ -150,16 +156,15 @@ function init(){
150156
showContext(result.settings.addToContextMenu);
151157
let period=result.settings.period?result.settings.period:60;
152158
if(!result.settings.paused){
153-
browser.alarms.create("webpageScanner",{periodInMinutes:period+1});
154-
browser.alarms.create("webpageScanner2",{delayInMinutes:1});
159+
browser.alarms.create("webpageScanner",{delayInMinutes:1,periodInMinutes:period+1});
155160
}
156161
},err=>{
157162
console.error(err);
158163
});
159164
}
160165

161166
browser.alarms.onAlarm.addListener(alarm=>{
162-
if(alarm.name==="webpageScanner"||alarm.name==="webpageScanner2")scanSites();
167+
if(alarm.name==="webpageScanner")scanSites();
163168
else if(alarm.name==="openSitesDelay")openSitesDelay();
164169
});
165170

@@ -174,7 +179,7 @@ function run(m,s,r){
174179
if(m.scanSites)scanSites(m.force);
175180
if(m.openSites)openSite();
176181
if(m.addToContextMenu!==undefined)showContext(m.addToContextMenu);
177-
if(m.period)browser.alarms.create("webpageScanner",{periodInMinutes:m.period});
182+
if(m.period)browser.alarms.create("webpageScanner",{delayInMinutes:1,periodInMinutes:m.period});
178183
if(m.openSitesDelay){delayCurrentId=0;delayTime=m.openSitesDelay;delayLinksId=m.linksId;lastWindowId=-1;openSitesDelay(m.openWindow);}
179184
if(m.closeTab){browser.tabs.remove(s.tab.id);}
180185
if(m.scanPagesById){scanPagesById(m.idArray);}
@@ -275,6 +280,12 @@ function run(m,s,r){
275280
browser.tabs.sendMessage(s.tab.id,m).then(()=>{},err=>{console.warn(err);});
276281
}
277282
if(m.openViewPage){browser.tabs.create({url:`${extURL}view.html?${m.viewId}`});}
283+
if(m.convertDB){convertDb(true);}
284+
if(m.getChanges){return getChanges(m.index);}
285+
if(m.getAllChanges){return getAllChanges();}
286+
if(m.setChanges){return setChanges(m.record);}
287+
if(m.deleteChanges){return deleteChanges(m.index);}
288+
if(m.clearChanges){return clearChanges();}
278289
}
279290

280291
function showContext(e){
@@ -391,6 +402,7 @@ function showPopup(mode="add",editId){
391402
function editSite(id,url,title,mode,freq,charset,cssSelector,ignoreNumbers,ignoreHrefs,deleteScripts,deleteComments,pageSettings,ignoreStyles,ignoreAllAttributes,saveOnlyPart){
392403
browser.storage.local.get("sites").then(async result=>{
393404
let sites=result.sites;
405+
const uniqId=sites[id].uniq;
394406
let obj={
395407
url,
396408
title,
@@ -416,8 +428,8 @@ function editSite(id,url,title,mode,freq,charset,cssSelector,ignoreNumbers,ignor
416428
ignoreAllAttributes:sites[id].ignoreAllAttributes,
417429
};
418430
if(old.paritialMode!==obj.paritialMode||old.cssSelector!==obj.cssSelector||old.ignoreNumbers!==ignoreNumbers||old.ignoreHrefs!==ignoreHrefs||old.ignoreStyles!==ignoreStyles||old.ignoreAllAttributes!==ignoreAllAttributes){
419-
const {changes}=await browser.storage.local.get("changes");
420-
const html_data=changes[id].html;
431+
const idb=await getChanges(uniqId);
432+
const html_data=idb.html;
421433
if(cssSelector===false){
422434
Object.assign(obj,length_md5(html_data,ignoreNumbers,ignoreHrefs,ignoreStyles,ignoreAllAttributes));
423435
}else{
@@ -451,3 +463,32 @@ function editSite(id,url,title,mode,freq,charset,cssSelector,ignoreNumbers,ignor
451463
console.error(err);
452464
});
453465
}
466+
467+
async function convertDb(e){
468+
if(!db)await getDB();
469+
browser.storage.local.get(["sites","changes"]).then(async result=>{
470+
const {sites,changes}=result;
471+
sites.forEach((site,i)=>{
472+
if(!site.uniq)site.uniq=uniqueId();
473+
});
474+
await browser.storage.local.set({sites});
475+
const tx=db.transaction(["changes"],"readwrite");
476+
const store=tx.objectStore("changes");
477+
tx.oncomplete=(e)=>{
478+
browser.storage.local.set({dbVersion:1}).then(()=>{
479+
browser.storage.local.remove("changes");
480+
if(!e)init();
481+
browser.runtime.sendMessage({"listSite":true}).then(()=>{},err=>{console.warn(err);});
482+
},err=>{
483+
console.error(err);
484+
});
485+
};
486+
tx.onerror=(e)=>{
487+
console.error(e.target.error);
488+
};
489+
sites.forEach((site,i)=>{
490+
changes[i].uniq=site.uniq;
491+
store.add(changes[i]);
492+
});
493+
});
494+
}

src/changelog.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ function generateChangelog(){
99
changelogGenerated=true;
1010

1111
let changelog=`[
12-
{"version":"2.1.2",
13-
"changes":["Added the possibility to select a file as notification sound","Updated appearance and icons to Proton style","Added dark theme for options","Added automatic theme","Minor changes"],
14-
"changesPL":["Dodano możliwość wybrania pliku jako dźwięku powiadomienia","Zaktualizowano wygląd i ikony do stylu Proton","Dodano ciemny motyw opcji","Dodano motyw automatyczny","Drobne zmiany"]
12+
{"version":"2.1.5",
13+
"changes":["Moved part of the database to indexedDB","Speeded up page loading and extension performance","Added the possibility to select a file as notification sound","Updated appearance and icons to Proton style","Added dark theme for options","Added automatic theme","Minor changes","Fixed bugs"],
14+
"changesPL":["Przeniesiono część bazy danych do indexedDB","Przyśpieszono ładowanie stron i działanie rozszerzenia","Dodano możliwość wybrania pliku jako dźwięku powiadomienia","Zaktualizowano wygląd i ikony do stylu Proton","Dodano ciemny motyw opcji","Dodano motyw automatyczny","Drobne zmiany","Naprawiono błędy"]
1515
},
1616
{"version":"2.1.0",
1717
"changes":["Fixed problems with partial scanning","#60","Fixed not working notification","Improved import and export of folders","#63","#64","Added possibility to drag and drop bookmarks, folders, links and web pages","#65","Added German language (thanks to Omnibrain007)","#68","Added possibility to sort pages","#45","Minor changes","#59","Fixed bugs"],

src/database.js

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
"use strict";
2+
3+
let db,mode;
4+
5+
function getDB(){
6+
if(mode!==undefined)return mode;
7+
const request=indexedDB.open("WPS");
8+
return new Promise((resolve,reject)=>{
9+
request.onerror=(e)=>{
10+
console.warn(e.target.error);
11+
mode=false;
12+
resolve(false);
13+
};
14+
request.onsuccess=(e)=>{
15+
db=e.target.result;
16+
mode=true;
17+
resolve(true);
18+
};
19+
request.onupgradeneeded=(e)=>{
20+
db=e.target.result;
21+
db.createObjectStore("changes",{keyPath:"uniq"});
22+
};
23+
});
24+
}
25+
26+
async function getChanges(index){
27+
if(await getDB()){
28+
const tx=db.transaction("changes","readonly");
29+
const store=tx.objectStore("changes");
30+
const request=store.get(index);
31+
return new Promise((resolve,reject)=>{
32+
tx.onerror=(e)=>{
33+
console.error(e.target.error);
34+
};
35+
request.onsuccess=(e)=>{
36+
resolve(e.target.result);
37+
};
38+
});
39+
}else{
40+
return await browser.runtime.sendMessage({
41+
"getChanges":true,
42+
"index":index
43+
});
44+
}
45+
}
46+
47+
async function getAllChanges(){
48+
if(await getDB()){
49+
const tx=db.transaction("changes","readonly");
50+
const store=tx.objectStore("changes");
51+
const request=store.getAll();
52+
return new Promise((resolve,reject)=>{
53+
tx.onerror=(e)=>{
54+
console.error(e.target.error);
55+
};
56+
request.onsuccess=(e)=>{
57+
resolve(e.target.result);
58+
};
59+
});
60+
}else{
61+
return await browser.runtime.sendMessage({
62+
"getAllChanges":true
63+
});
64+
}
65+
}
66+
67+
async function setChanges(data){
68+
if(await getDB()){
69+
const tx=db.transaction("changes","readwrite");
70+
const store=tx.objectStore("changes");
71+
store.put(data);
72+
return new Promise((resolve,reject)=>{
73+
tx.onerror=(e)=>{
74+
console.error(e.target.error);
75+
};
76+
tx.oncomplete=(e)=>{
77+
resolve(true);
78+
};
79+
});
80+
}else{
81+
return await browser.runtime.sendMessage({
82+
"setChanges":true,
83+
"record":data
84+
});
85+
}
86+
}
87+
88+
async function deleteChanges(index){
89+
if(await getDB()){
90+
const tx=db.transaction("changes","readwrite");
91+
const store=tx.objectStore("changes");
92+
store.delete(index);
93+
return new Promise((resolve,reject)=>{
94+
tx.onerror=(e)=>{
95+
console.error(e.target.error);
96+
};
97+
tx.oncomplete=(e)=>{
98+
resolve(true);
99+
};
100+
});
101+
}else{
102+
return await browser.runtime.sendMessage({
103+
"deleteChanges":true,
104+
"index":index
105+
});
106+
}
107+
}
108+
109+
async function clearChanges(){
110+
if(await getDB()){
111+
const tx=db.transaction("changes","readwrite");
112+
const store=tx.objectStore("changes");
113+
store.clear();
114+
return new Promise((resolve,reject)=>{
115+
tx.onerror=(e)=>{
116+
console.error(e.target.error);
117+
resolve(false);
118+
};
119+
tx.oncomplete=(e)=>{
120+
resolve(true);
121+
};
122+
});
123+
}else{
124+
return await browser.runtime.sendMessage({
125+
"clearChanges":true
126+
});
127+
}
128+
}

src/manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"manifest_version": 2,
33
"name": "__MSG_extensionName__",
44
"description": "__MSG_extensionDescription__",
5-
"version": "2.1.2",
5+
"version": "2.1.5",
66
"default_locale": "en",
77
"icons": {
88
"48": "icons/icon.svg",

src/options.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ <h3 id="h3share"></h3>
302302
</section>
303303
<div id="alertToolbar" class="none"><span id="scanningAlert"></span><button id="enableAutoScan"></button></div>
304304
<script src="changelog.js"></script>
305+
<script src="database.js"></script>
305306
<script src="options.js"></script>
306307
</body>
307308
</html>

src/options.js

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,8 @@ function restoreOptions(){
227227

228228
function createBackup(e){
229229
e.preventDefault();
230-
browser.storage.local.get().then(result=>{
230+
browser.storage.local.get().then(async result=>{
231+
result.changes=await getAllChanges();
231232
let a=document.createElement("a");
232233
document.body.appendChild(a);
233234
let json=JSON.stringify(result),
@@ -426,15 +427,32 @@ function handleFileSelect(e){
426427
}
427428

428429
function restoreBackup(){
429-
browser.storage.local.set({sites:uploaded.sites,changes:uploaded.changes,sort:uploaded.sort}).then(()=>{
430-
document.getElementById("restoreAlert").classList.add("none");
431-
document.getElementById("restoreOk").classList.remove("none");
432-
browser.runtime.sendMessage({"listSite":true}).then(()=>{},err=>{console.warn(err);});
433-
},err=>{
434-
document.getElementById("restoreAlert").classList.add("none");
435-
document.getElementById("restoreError").classList.remove("none");
436-
console.error(err);
437-
});
430+
if(uploaded.dbVersion===1){
431+
browser.storage.local.set({sites:uploaded.sites,sort:uploaded.sort,dbVersion:uploaded.dbVersion}).then(async ()=>{
432+
document.getElementById("restoreAlert").classList.add("none");
433+
document.getElementById("restoreOk").classList.remove("none");
434+
await clearChanges();
435+
uploaded.changes.forEach(async e=>{
436+
await setChanges(e);
437+
});
438+
browser.runtime.sendMessage({"listSite":true}).then(()=>{},err=>{console.warn(err);});
439+
},err=>{
440+
document.getElementById("restoreAlert").classList.add("none");
441+
document.getElementById("restoreError").classList.remove("none");
442+
console.error(err);
443+
});
444+
}else{
445+
browser.storage.local.set({sites:uploaded.sites,changes:uploaded.changes,sort:uploaded.sort,dbVersion:0}).then(async ()=>{
446+
document.getElementById("restoreAlert").classList.add("none");
447+
document.getElementById("restoreOk").classList.remove("none");
448+
await clearChanges();
449+
browser.runtime.sendMessage({"listSite":true,"convertDB":true}).then(()=>{},err=>{console.warn(err);});
450+
},err=>{
451+
document.getElementById("restoreAlert").classList.add("none");
452+
document.getElementById("restoreError").classList.remove("none");
453+
console.error(err);
454+
});
455+
}
438456
}
439457

440458
async function importFolder(e){
@@ -873,13 +891,12 @@ function deleteBrokenConfirm(e){
873891

874892
function deleteSite(j,mode){
875893
let e=mode==="duplicates"?duplicatedSites[j][0]:brokenSites[j][0];
876-
browser.storage.local.get(['sites','changes','sort']).then(result=>{
894+
browser.storage.local.get(['sites','sort']).then(result=>{
877895
let sites=result.sites,
878-
changes=result.changes,
879896
sort=result.sort,
880-
sSort;
897+
sSort,
898+
uniqId=sites[e].uniq;
881899
sites.splice(e,1);
882-
changes.splice(e,1);
883900
if(sort){
884901
sort.forEach((value,i)=>{
885902
const id=parseInt(value[0].substr(4));
@@ -888,14 +905,15 @@ function deleteSite(j,mode){
888905
});
889906
sort.splice(sSort,1);
890907
}
891-
browser.storage.local.set({sites,changes,sort}).then(()=>{
908+
browser.storage.local.set({sites,sort}).then(()=>{
892909
browser.runtime.sendMessage({
893910
"deletedSite":true,
894911
"id":e,
895912
"listSite":true
896913
}).then(()=>{},err=>{
897914
console.warn(err);
898915
});
916+
deleteChanges(uniqId);
899917
if(mode==="duplicates"){
900918
if(j+1<duplicatedSites.length)
901919
deleteSite(j+1,mode);

0 commit comments

Comments
 (0)