summaryrefslogtreecommitdiff
path: root/data/extensions/https-everywhere@eff.org/background-scripts/store.js
blob: e3af7cb8086f948c04022fd9f3c18be83a671638 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
"use strict";

(function(exports) {

const rules = require('./rules');
const util = require("./util");

function initialize() {
  return new Promise(resolve => {
    if (chrome.storage.sync) {
      chrome.storage.sync.set({"sync-set-test": true}, () => {
        if(chrome.runtime.lastError) {
          setStorage(chrome.storage.local);
        } else {
          setStorage(chrome.storage.sync);
        }
        resolve();
      });
    } else {
      setStorage(chrome.storage.local);
      resolve();
    }
  });
}

/* Storage promise setters and getters */

function generic_get_promise(key, default_val, storage) {
  return new Promise(res => storage.get({[key]: default_val}, data => res(data[key])));
}

function generic_set_promise(key, value, storage) {
  return new Promise(res => storage.set({[key]: value}, res));
}

function get_promise(key, default_val) {
  return generic_get_promise(key, default_val, exports);
}

function set_promise(key, value) {
  return generic_set_promise(key, value, exports);
}

function local_get_promise(key, default_val) {
  return generic_get_promise(key, default_val, chrome.storage.local);
}

function local_set_promise(key, value) {
  return generic_set_promise(key, value, chrome.storage.local);
}



async function performMigrations() {
  let migration_version = await get_promise('migration_version', 0);

  try {
    if (migration_version === 0) {
      let ls = localStorage;
      let ruleActiveStates = {};

      for (let key in ls) {
        if (ls.hasOwnProperty(key)) {
          if (rules.RuleSets().USER_RULE_KEY === key) {
            await set_promise(rules.RuleSets().USER_RULE_KEY, JSON.parse(ls[key]));
          } else {
            ruleActiveStates[key] = (ls[key] === "true");
          }
        }
      }
      migration_version = 1;
      await set_promise('migration_version', migration_version);
      await set_promise('ruleActiveStates', ruleActiveStates);
    }

  } catch (e) {
    // do nothing
  }

  if (migration_version <= 1) {
    await get_promise(rules.RuleSets().USER_RULE_KEY, [])
      .then(userRules => {
        userRules = userRules.map(userRule => {
          return {
            name: userRule.host,
            target: [userRule.host],
            rule: [{ from: userRule.urlMatcher, to: userRule.redirectTo }],
            default_off: "user rule"
          };
        });
        return userRules;
      })
      .then(userRules => {
        return set_promise(rules.RuleSets().USER_RULE_KEY, userRules);
      });

    migration_version = 2;
    await set_promise('migration_version', migration_version);
  }

  if (migration_version <= 2) {
    await get_promise('disabledList', [])
      .then(disabledList => {
        disabledList = disabledList.map(item => {
          return util.getNormalisedHostname(item);
        });
        return disabledList;
      })
      .then(disabledList => {
        return set_promise('disabledList', disabledList);
      });

    migration_version = 3;
    await set_promise('migration_version', migration_version);
  }
}

const local = {
  get: (...args) => chrome.storage.local.get(...args),
  set: (...args) => chrome.storage.local.set(...args),
  remove: (...args) => chrome.storage.local.remove(...args),
  get_promise: local_get_promise,
  set_promise: local_set_promise
};

function setStorage(store) {
  Object.assign(exports, {
    get: store.get.bind(store),
    set: store.set.bind(store),
    remove: store.remove.bind(store),
    get_promise,
    set_promise,
    local
  });
  chrome.runtime.sendMessage("store_initialized");
}

Object.assign(exports, {
  initialize,
  performMigrations
});

})(typeof exports == 'undefined' ? require.scopes.store = {} : exports);