about.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /*******************************************************************************
  2. ηMatrix - a browser extension to black/white list requests.
  3. Copyright (C) 2014-2019 Raymond Hill
  4. Copyright (C) 2019 Alessio Vanni
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see {http://www.gnu.org/licenses/}.
  15. Home: https://libregit.org/heckyel/ematrix
  16. uMatrix Home: https://github.com/gorhill/uMatrix
  17. */
  18. /* global uDom */
  19. 'use strict';
  20. /******************************************************************************/
  21. uDom.onLoad(function() {
  22. /******************************************************************************/
  23. var backupUserDataToFile = function() {
  24. var userDataReady = function(userData) {
  25. vAPI.download({
  26. 'url': 'data:text/plain,' + encodeURIComponent(JSON.stringify(userData, null, 2)),
  27. 'filename': uDom('[data-i18n="aboutBackupFilename"]').text()
  28. });
  29. };
  30. vAPI.messaging.send('about.js', { what: 'getAllUserData' }, userDataReady);
  31. };
  32. /******************************************************************************/
  33. function restoreUserDataFromFile() {
  34. var validateBackup = function(s) {
  35. var userData = null;
  36. try {
  37. userData = JSON.parse(s);
  38. }
  39. catch (e) {
  40. userData = null;
  41. }
  42. if ( userData === null ) {
  43. return null;
  44. }
  45. if (
  46. typeof userData !== 'object' ||
  47. typeof userData.version !== 'string' ||
  48. typeof userData.when !== 'number' ||
  49. typeof userData.settings !== 'object' ||
  50. typeof userData.rules !== 'string' ||
  51. typeof userData.hostsFiles !== 'object'
  52. ) {
  53. return null;
  54. }
  55. return userData;
  56. };
  57. var fileReaderOnLoadHandler = function() {
  58. var userData = validateBackup(this.result);
  59. if ( !userData ) {
  60. window.alert(uDom('[data-i18n="aboutRestoreError"]').text());
  61. return;
  62. }
  63. var time = new Date(userData.when);
  64. var msg = uDom('[data-i18n="aboutRestoreConfirm"]').text()
  65. .replace('{{time}}', time.toLocaleString());
  66. var proceed = window.confirm(msg);
  67. if ( proceed ) {
  68. vAPI.messaging.send(
  69. 'about.js',
  70. { what: 'restoreAllUserData', userData: userData }
  71. );
  72. }
  73. };
  74. var file = this.files[0];
  75. if ( file === undefined || file.name === '' ) {
  76. return;
  77. }
  78. if ( file.type.indexOf('text') !== 0 ) {
  79. return;
  80. }
  81. var fr = new FileReader();
  82. fr.onload = fileReaderOnLoadHandler;
  83. fr.readAsText(file);
  84. }
  85. /******************************************************************************/
  86. var startRestoreFilePicker = function() {
  87. var input = document.getElementById('restoreFilePicker');
  88. // Reset to empty string, this will ensure an change event is properly
  89. // triggered if the user pick a file, even if it is the same as the last
  90. // one picked.
  91. input.value = '';
  92. input.click();
  93. };
  94. /******************************************************************************/
  95. var resetUserData = function() {
  96. var proceed = window.confirm(uDom('[data-i18n="aboutResetConfirm"]').text());
  97. if ( proceed ) {
  98. vAPI.messaging.send('about.js', { what: 'resetAllUserData' });
  99. }
  100. };
  101. /******************************************************************************/
  102. (function() {
  103. var renderStats = function(details) {
  104. document.getElementById('aboutVersion').textContent = details.version;
  105. var template = uDom('[data-i18n="aboutStorageUsed"]').text();
  106. var storageUsed = '?';
  107. if ( typeof details.storageUsed === 'number' ) {
  108. storageUsed = details.storageUsed.toLocaleString();
  109. }
  110. document.getElementById('aboutStorageUsed').textContent =
  111. template.replace('{{storageUsed}}', storageUsed);
  112. };
  113. vAPI.messaging.send('about.js', { what: 'getSomeStats' }, renderStats);
  114. })();
  115. /******************************************************************************/
  116. uDom('#backupUserDataButton').on('click', backupUserDataToFile);
  117. uDom('#restoreUserDataButton').on('click', startRestoreFilePicker);
  118. uDom('#restoreFilePicker').on('change', restoreUserDataFromFile);
  119. uDom('#resetUserDataButton').on('click', resetUserData);
  120. /******************************************************************************/
  121. });