blob: 9212389615daa6714b82d6e690eb4df2b618110d [file] [log] [blame]
avm99963bf8eece2021-04-22 00:27:03 +02001const optionsPrototype = {
2 // Available options:
3 'list': {
4 defaultValue: true,
5 context: 'options',
6 },
7 'thread': {
8 defaultValue: true,
9 context: 'options',
10 },
11 'threadall': {
12 defaultValue: false,
13 context: 'options',
14 },
15 'fixedtoolbar': {
16 defaultValue: false,
17 context: 'options',
18 },
19 'redirect': {
20 defaultValue: false,
21 context: 'options',
22 },
23 'history': {
24 defaultValue: false,
25 context: 'options',
26 },
27 'loaddrafts': {
28 defaultValue: false,
29 context: 'options',
30 },
31 'increasecontrast': {
32 defaultValue: false,
33 context: 'options',
34 },
35 'stickysidebarheaders': {
36 defaultValue: false,
37 context: 'options',
38 },
39 'profileindicator': {
40 defaultValue: false,
41 context: 'options',
42 },
43 'profileindicatoralt': {
44 defaultValue: false,
45 context: 'options',
46 },
47 'profileindicatoralt_months': {
48 defaultValue: 12,
49 context: 'options',
50 },
51 'ccdarktheme': {
52 defaultValue: false,
53 context: 'options',
54 },
55 'ccdarktheme_mode': {
56 defaultValue: 'switch',
57 context: 'options',
58 },
59 'ccforcehidedrawer': {
60 defaultValue: false,
61 context: 'options',
62 },
63 'ccdragndropfix': {
64 defaultValue: false,
65 context: 'options',
66 },
67 'batchlock': {
68 defaultValue: false,
69 context: 'options',
70 },
avm99963bf8eece2021-04-22 00:27:03 +020071 'enhancedannouncementsdot': {
72 defaultValue: false,
73 context: 'options',
74 },
75 'repositionexpandthread': {
76 defaultValue: false,
77 context: 'options',
78 },
Adrià Vilanova Martínez2b871792021-06-09 12:35:06 +020079 'disableunifiedprofiles': {
80 defaultValue: false,
81 context: 'options',
82 },
avm99963bf8eece2021-04-22 00:27:03 +020083
84 // Experiments:
avm999633eae4522021-04-22 01:14:27 +020085 'threadlistavatars': {
86 defaultValue: false,
87 context: 'experiments',
88 },
avm99963a007d492021-05-02 12:32:03 +020089 'autorefreshlist': {
90 defaultValue: false,
91 context: 'experiments',
92 },
avm99963bf8eece2021-04-22 00:27:03 +020093
94 // Internal options:
95 'ccdarktheme_switch_enabled': {
96 defaultValue: true,
97 context: 'internal',
98 },
99
100 // Deprecated options:
101 'escalatethreads': {
102 defaultValue: false,
103 context: 'deprecated',
104 },
105 'movethreads': {
106 defaultValue: false,
107 context: 'deprecated',
108 },
109 'batchduplicate': {
110 defaultValue: false,
111 context: 'deprecated',
112 },
avm99963a858ef72021-04-22 01:18:31 +0200113 'smei_sortdirection': {
114 defaultValue: false,
115 context: 'deprecated',
116 },
avm999634c1a6792020-08-31 21:30:42 +0200117};
118
avm99963ad65e752020-09-01 00:13:59 +0200119const specialOptions = [
120 'profileindicatoralt_months',
avm999630bc113a2020-09-07 13:02:11 +0200121 'ccdarktheme_mode',
122 'ccdarktheme_switch_enabled',
avm999638e0c1002020-12-03 16:54:20 +0100123 'ccdragndropfix',
avm99963ad65e752020-09-01 00:13:59 +0200124];
125
avm999634c1a6792020-08-31 21:30:42 +0200126function isEmpty(obj) {
127 return Object.keys(obj).length === 0;
128}
129
avm99963bf8eece2021-04-22 00:27:03 +0200130// Adds missing options with their default value. If |dryRun| is set to false,
131// they are also saved to the sync storage area.
132function cleanUpOptions(options, dryRun = false) {
133 console.log('[cleanUpOptions] Previous options', JSON.stringify(options));
avm99963ad65e752020-09-01 00:13:59 +0200134
avm99963bf8eece2021-04-22 00:27:03 +0200135 if (typeof options !== 'object' || options === null) options = {};
136
137 var ok = true;
138 for (const [opt, optMeta] of Object.entries(optionsPrototype)) {
139 if (!(opt in options)) {
140 ok = false;
141 options[opt] = optMeta['defaultValue'];
avm999634c1a6792020-08-31 21:30:42 +0200142 }
143 }
144
avm99963bf8eece2021-04-22 00:27:03 +0200145 console.log('[cleanUpOptions] New options', JSON.stringify(options));
avm999634c1a6792020-08-31 21:30:42 +0200146
avm99963bf8eece2021-04-22 00:27:03 +0200147 if (!ok && !dryRun) {
avm999634c1a6792020-08-31 21:30:42 +0200148 chrome.storage.sync.set(options);
149 }
150
151 return options;
152}
avm999638e0c1002020-12-03 16:54:20 +0100153
154// This method is based on the fact that when building the extension for Firefox
155// the browser_specific_settings.gecko entry is included.
156function isFirefox() {
157 var manifest = chrome.runtime.getManifest();
158 return manifest.browser_specific_settings !== undefined &&
159 manifest.browser_specific_settings.gecko !== undefined;
160}
avm999637309b062021-04-22 12:41:08 +0200161
162// Returns whether the extension is a release version.
163function isReleaseVersion() {
164 var manifest = chrome.runtime.getManifest();
165 return ('version' in manifest) && manifest.version != '0';
166}