Skip to content

Commit d8b949e

Browse files
committed
this fixes gorhill#932
1 parent e861ff0 commit d8b949e

7 files changed

Lines changed: 177 additions & 59 deletions

File tree

src/_locales/en/messages.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,18 @@
235235
"message":"Enable experimental features (<a href='https:\/\/github.com\/gorhill\/uBlock\/wiki\/Experimental-features'>About<\/a>)",
236236
"description":"English: Enable experimental features"
237237
},
238+
"settingsStorageUsed":{
239+
"message":"Storage used: {{value}} bytes",
240+
"description":"English: Storage used: {{}} bytes"
241+
},
242+
"settingsLastRestorePrompt":{
243+
"message":"Last restore:",
244+
"description":"English: Last restore:"
245+
},
246+
"settingsLastBackupPrompt":{
247+
"message":"Last backup:",
248+
"description":"English: Last backup:"
249+
},
238250
"3pListsOfBlockedHostsPrompt":{
239251
"message":"{{netFilterCount}} network filters + {{cosmeticFilterCount}} cosmetic filters from:",
240252
"description":"English: {{netFilterCount}} network filters + {{cosmeticFilterCount}} cosmetic filters from:"

src/js/background.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ return {
9292
selfieMagic: 'spqmeuaftfra'
9393
},
9494

95+
restoreBackupSettings: {
96+
lastRestoreFile: '',
97+
lastRestoreTime: 0,
98+
lastBackupFile: '',
99+
lastBackupTime: 0
100+
},
101+
95102
// EasyList, EasyPrivacy and many others have an 4-day update period,
96103
// as per list headers.
97104
updateAssetsEvery: 97 * oneHour,

src/js/messaging.js

Lines changed: 58 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -954,24 +954,58 @@ var µb = µBlock;
954954

955955
/******************************************************************************/
956956

957-
var getUserData = function(callback) {
958-
var onUserFiltersReady = function(details) {
957+
var getLocalData = function(callback) {
958+
var onStorageInfoReady = function(bytesInUse) {
959+
var o = µb.restoreBackupSettings;
959960
callback({
960-
'timeStamp': Date.now(),
961-
'version': vAPI.app.version,
962-
'userSettings': µb.userSettings,
963-
'filterLists': µb.remoteBlacklists,
964-
'netWhitelist': µb.stringFromWhitelist(µb.netWhitelist),
965-
'userFilters': details.content
961+
storageUsed: bytesInUse,
962+
lastRestoreFile: o.lastRestoreFile,
963+
lastRestoreTime: o.lastRestoreTime,
964+
lastBackupFile: o.lastBackupFile,
965+
lastBackupTime: o.lastBackupTime
966966
});
967967
};
968+
969+
µb.getBytesInUse(onStorageInfoReady);
970+
};
971+
972+
/******************************************************************************/
973+
974+
var backupUserData = function(callback) {
975+
var onUserFiltersReady = function(details) {
976+
var userData = {
977+
timeStamp: Date.now(),
978+
version: vAPI.app.version,
979+
userSettings: µb.userSettings,
980+
filterLists: µb.remoteBlacklists,
981+
netWhitelist: µb.stringFromWhitelist(µb.netWhitelist),
982+
userFilters: details.content
983+
};
984+
var now = new Date();
985+
var filename = vAPI.i18n('aboutBackupFilename')
986+
.replace('{{datetime}}', now.toLocaleString())
987+
.replace(/ +/g, '_');
988+
989+
vAPI.download({
990+
'url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(userData, null, ' ')),
991+
'filename': filename
992+
});
993+
994+
µb.restoreBackupSettings.lastBackupFile = filename;
995+
µb.restoreBackupSettings.lastBackupTime = Date.now();
996+
µb.XAL.keyvalSetMany(µb.restoreBackupSettings);
997+
998+
getLocalData(callback);
999+
};
1000+
9681001
µb.assets.get('assets/user/filters.txt', onUserFiltersReady);
9691002
};
9701003

9711004
/******************************************************************************/
9721005

973-
var restoreUserData = function(userData) {
974-
var countdown = 5;
1006+
var restoreUserData = function(request) {
1007+
var userData = request.userData;
1008+
var countdown = 6;
9751009
var onCountdown = function() {
9761010
countdown -= 1;
9771011
if ( countdown === 0 ) {
@@ -987,6 +1021,13 @@ var restoreUserData = function(userData) {
9871021
µb.XAL.keyvalSetOne('remoteBlacklists', userData.filterLists, onCountdown);
9881022
µb.XAL.keyvalSetOne('netWhitelist', userData.netWhitelist, onCountdown);
9891023
µb.assets.put('assets/user/filters.txt', userData.userFilters, onCountdown);
1024+
1025+
µb.XAL.keyvalSetMany({
1026+
lastRestoreFile: request.file || '',
1027+
lastRestoreTime: Date.now(),
1028+
lastBackupFile: '',
1029+
lastBackupTime: 0
1030+
}, onCountdown);
9901031
};
9911032

9921033
// If we are going to restore all, might as well wipe out clean local
@@ -999,7 +1040,7 @@ var restoreUserData = function(userData) {
9991040
var resetUserData = function() {
10001041
µb.XAL.keyvalRemoveAll();
10011042
// Keep global counts, people can become quite attached to numbers
1002-
µBlock.saveLocalSettings();
1043+
µb.saveLocalSettings();
10031044
vAPI.app.restart();
10041045
};
10051046

@@ -1008,8 +1049,11 @@ var resetUserData = function() {
10081049
var onMessage = function(request, sender, callback) {
10091050
// Async
10101051
switch ( request.what ) {
1011-
case 'getUserData':
1012-
return getUserData(callback);
1052+
case 'backupUserData':
1053+
return backupUserData(callback);
1054+
1055+
case 'getLocalData':
1056+
return getLocalData(callback);
10131057

10141058
default:
10151059
break;
@@ -1020,7 +1064,7 @@ var onMessage = function(request, sender, callback) {
10201064

10211065
switch ( request.what ) {
10221066
case 'restoreUserData':
1023-
restoreUserData(request.userData);
1067+
restoreUserData(request);
10241068
break;
10251069

10261070
case 'resetUserData':

src/js/settings.js

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -33,27 +33,16 @@ var messager = vAPI.messaging.channel('settings.js');
3333

3434
/******************************************************************************/
3535

36-
var exportToFile = function() {
37-
var onUserDataReady = function(userData) {
38-
if (!userData) {
39-
return;
40-
}
41-
var now = new Date();
42-
var filename = vAPI.i18n('aboutBackupFilename')
43-
.replace('{{datetime}}', now.toLocaleString())
44-
.replace(/ +/g, '_');
45-
vAPI.download({
46-
'url': 'data:text/plain;charset=utf-8,' + encodeURIComponent(JSON.stringify(userData, null, ' ')),
47-
'filename': filename
48-
});
49-
};
50-
51-
messager.send({ what: 'getUserData' }, onUserDataReady);
52-
};
53-
54-
/******************************************************************************/
55-
5636
var handleImportFilePicker = function() {
37+
var file = this.files[0];
38+
if ( file === undefined || file.name === '' ) {
39+
return;
40+
}
41+
if ( file.type.indexOf('text') !== 0 ) {
42+
return;
43+
}
44+
var filename = file.name;
45+
5746
var fileReaderOnLoadHandler = function() {
5847
var userData;
5948
try {
@@ -80,20 +69,17 @@ var handleImportFilePicker = function() {
8069
}
8170
var time = new Date(userData.timeStamp);
8271
var msg = vAPI.i18n('aboutRestoreDataConfirm')
83-
.replace('{{time}}', time.toLocaleString());
72+
.replace('{{time}}', time.toLocaleString());
8473
var proceed = window.confirm(msg);
8574
if ( proceed ) {
86-
messager.send({ what: 'restoreUserData', userData: userData });
75+
messager.send({
76+
what: 'restoreUserData',
77+
userData: userData,
78+
file: filename
79+
});
8780
}
8881
};
8982

90-
var file = this.files[0];
91-
if ( file === undefined || file.name === '' ) {
92-
return;
93-
}
94-
if ( file.type.indexOf('text') !== 0 ) {
95-
return;
96-
}
9783
var fr = new FileReader();
9884
fr.onload = fileReaderOnLoadHandler;
9985
fr.readAsText(file);
@@ -112,6 +98,47 @@ var startImportFilePicker = function() {
11298

11399
/******************************************************************************/
114100

101+
var exportToFile = function() {
102+
messager.send({ what: 'backupUserData' }, onLocalDataReceived);
103+
};
104+
105+
/******************************************************************************/
106+
107+
var onLocalDataReceived = function(details) {
108+
uDom('#localData > ul > li:nth-of-type(1)').text(
109+
vAPI.i18n('settingsStorageUsed').replace('{{value}}', details.storageUsed.toLocaleString())
110+
);
111+
112+
var elem, dt;
113+
var timeOptions = {
114+
weekday: 'long',
115+
year: 'numeric',
116+
month: 'long',
117+
day: 'numeric',
118+
hour: 'numeric',
119+
minute: 'numeric',
120+
timeZoneName: 'short'
121+
};
122+
var lastBackupFile = details.lastBackupFile || '';
123+
if ( lastBackupFile !== '' ) {
124+
dt = new Date(details.lastBackupTime);
125+
uDom('#localData > ul > li:nth-of-type(2) > ul > li:nth-of-type(1)').text(dt.toLocaleString('fullwide', timeOptions));
126+
uDom('#localData > ul > li:nth-of-type(2) > ul > li:nth-of-type(2)').text(lastBackupFile);
127+
uDom('#localData > ul > li:nth-of-type(2)').css('display', '');
128+
}
129+
130+
var lastRestoreFile = details.lastRestoreFile || '';
131+
elem = uDom('#localData > p:nth-of-type(3)');
132+
if ( lastRestoreFile !== '' ) {
133+
dt = new Date(details.lastRestoreTime);
134+
uDom('#localData > ul > li:nth-of-type(3) > ul > li:nth-of-type(1)').text(dt.toLocaleString('fullwide', timeOptions));
135+
uDom('#localData > ul > li:nth-of-type(3) > ul > li:nth-of-type(2)').text(lastRestoreFile);
136+
uDom('#localData > ul > li:nth-of-type(3)').css('display', '');
137+
}
138+
};
139+
140+
/******************************************************************************/
141+
115142
var resetUserData = function() {
116143
var msg = vAPI.i18n('aboutResetDataConfirm');
117144
var proceed = window.confirm(msg);
@@ -175,6 +202,7 @@ var onUserSettingsReceived = function(details) {
175202

176203
uDom.onLoad(function() {
177204
messager.send({ what: 'userSettings' }, onUserSettingsReceived);
205+
messager.send({ what: 'getLocalData' }, onLocalDataReceived);
178206
});
179207

180208
/******************************************************************************/

src/js/start.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -143,12 +143,6 @@ var onUserSettingsReady = function(fetched) {
143143

144144
/******************************************************************************/
145145

146-
var onLocalSettingsReady = function(fetched) {
147-
fromFetch(µb.localSettings, fetched);
148-
};
149-
150-
/******************************************************************************/
151-
152146
// Housekeeping, as per system setting changes
153147

154148
var onSystemSettingsReady = function(fetched) {
@@ -170,11 +164,11 @@ var onSystemSettingsReady = function(fetched) {
170164
/******************************************************************************/
171165

172166
var onFirstFetchReady = function(fetched) {
173-
174167
// Order is important -- do not change:
175168
onSystemSettingsReady(fetched);
176-
onLocalSettingsReady(fetched);
169+
fromFetch(µb.localSettings, fetched);
177170
onUserSettingsReady(fetched);
171+
fromFetch(µb.restoreBackupSettings, fetched);
178172
onNetWhitelistReady(fetched.netWhitelist);
179173
onVersionReady(fetched.version);
180174

@@ -191,6 +185,10 @@ var onFirstFetchReady = function(fetched) {
191185

192186
var fetchableProps = {
193187
'compiledMagic': '',
188+
'lastRestoreFile': '',
189+
'lastRestoreTime': 0,
190+
'lastBackupFile': '',
191+
'lastBackupTime': 0,
194192
'netWhitelist': '',
195193
'selfie': null,
196194
'selfieMagic': '',
@@ -222,6 +220,7 @@ var fromFetch = function(to, fetched) {
222220

223221
toFetch(µb.localSettings, fetchableProps);
224222
toFetch(µb.userSettings, fetchableProps);
223+
toFetch(µb.restoreBackupSettings, fetchableProps);
225224

226225
vAPI.storage.get(fetchableProps, onFirstFetchReady);
227226

src/js/storage.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,13 @@
2525

2626
/******************************************************************************/
2727

28-
µBlock.getBytesInUse = function() {
28+
µBlock.getBytesInUse = function(callback) {
29+
if ( typeof callback !== 'function' ) {
30+
callback = this.noopFunc;
31+
}
2932
var getBytesInUseHandler = function(bytesInUse) {
3033
µBlock.storageUsed = bytesInUse;
34+
callback(bytesInUse);
3135
};
3236
vAPI.storage.getBytesInUse(null, getBytesInUseHandler);
3337
};

src/settings.html

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,21 @@
77
<link rel="stylesheet" type="text/css" href="css/dashboard-common.css">
88
<style>
99
ul {
10-
list-style-type: none;
1110
padding-left: 1em;
1211
}
12+
li {
13+
margin-top: 0.25em;
14+
}
15+
ul#userSettings {
16+
list-style-type: none;
17+
}
18+
#localData > ul > li {
19+
margin-top: 1em;
20+
}
21+
#localData > ul > li > ul > li:nth-of-type(2) {
22+
font-family: monospace;
23+
font-size: small;
24+
}
1325
#experimental-enabled {
1426
margin-top: 1em;
1527
}
@@ -18,24 +30,36 @@
1830

1931
<body>
2032

21-
<ul>
33+
<ul id="userSettings">
2234
<li><input id="collapse-blocked" type="checkbox"><label data-i18n="settingsCollapseBlockedPrompt" for="collapse-blocked"></label>
2335
<li><input id="icon-badge" type="checkbox"><label data-i18n="settingsIconBadgePrompt" for="icon-badge"></label>
2436
<li><input id="context-menu-enabled" type="checkbox"><label data-i18n="settingsContextMenuPrompt" for="context-menu-enabled"></label>
2537
<li><input id="advanced-user-enabled" type="checkbox"><label data-i18n="settingsAdvancedUserPrompt" for="advanced-user-enabled"></label>
26-
2738
<!-- <li><input id="experimental-enabled" type="checkbox" disabled><label data-i18n="settingsExperimentalPrompt" for="experimental-enabled"></label> -->
28-
</ul>
39+
</ul>
2940

30-
<div style="margin:3em 0;border-top:1px solid #ccc;"></div>
41+
<div id="localData" style="margin: 0 1em;">
42+
<div style="margin: 2.5em 0; border-top: 1px solid #ccc;"></div>
43+
<ul>
44+
<li>
45+
<li style="display: none;"><span data-i18n="settingsLastBackupPrompt"></span><ul>
46+
<li>
47+
<li>
48+
</ul>
49+
<li style="display: none;"><span data-i18n="settingsLastRestorePrompt"></span><ul>
50+
<li>
51+
<li>
52+
</ul>
53+
</ul>
54+
</div>
3155

32-
<div style="margin:1em 0 0 1em;">
56+
<div style="margin: 2.5em 1em;">
3357
<p><button type="button" id="export" data-i18n="aboutBackupDataButton"></button>&ensp;
3458
<button type="button" id="import" data-i18n="aboutRestoreDataButton"></button>
3559
<input id="restoreFilePicker" type="file" accept="text/plain" class="hiddenFileInput">
3660
<p>
3761
<p><button type="button" id="reset" data-i18n="aboutResetDataButton"></button>
38-
</div>
62+
</div>
3963

4064
<script src="js/vapi-common.js"></script>
4165
<script src="js/vapi-client.js"></script>

0 commit comments

Comments
 (0)