blob: f89783725e4bbb9aaba8b60589a33136e932f552 [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 },
79
80 // Experiments:
avm999633eae4522021-04-22 01:14:27 +020081 'threadlistavatars': {
82 defaultValue: false,
83 context: 'experiments',
84 },
avm99963a007d492021-05-02 12:32:03 +020085 'autorefreshlist': {
86 defaultValue: false,
87 context: 'experiments',
88 },
avm99963bf8eece2021-04-22 00:27:03 +020089
90 // Internal options:
91 'ccdarktheme_switch_enabled': {
92 defaultValue: true,
93 context: 'internal',
94 },
95
96 // Deprecated options:
97 'escalatethreads': {
98 defaultValue: false,
99 context: 'deprecated',
100 },
101 'movethreads': {
102 defaultValue: false,
103 context: 'deprecated',
104 },
105 'batchduplicate': {
106 defaultValue: false,
107 context: 'deprecated',
108 },
avm99963a858ef72021-04-22 01:18:31 +0200109 'smei_sortdirection': {
110 defaultValue: false,
111 context: 'deprecated',
112 },
avm999634c1a6792020-08-31 21:30:42 +0200113};
114
avm99963ad65e752020-09-01 00:13:59 +0200115const specialOptions = [
116 'profileindicatoralt_months',
avm999630bc113a2020-09-07 13:02:11 +0200117 'ccdarktheme_mode',
118 'ccdarktheme_switch_enabled',
avm999638e0c1002020-12-03 16:54:20 +0100119 'ccdragndropfix',
avm99963ad65e752020-09-01 00:13:59 +0200120];
121
avm999634c1a6792020-08-31 21:30:42 +0200122function isEmpty(obj) {
123 return Object.keys(obj).length === 0;
124}
125
avm99963bf8eece2021-04-22 00:27:03 +0200126// Adds missing options with their default value. If |dryRun| is set to false,
127// they are also saved to the sync storage area.
128function cleanUpOptions(options, dryRun = false) {
129 console.log('[cleanUpOptions] Previous options', JSON.stringify(options));
avm99963ad65e752020-09-01 00:13:59 +0200130
avm99963bf8eece2021-04-22 00:27:03 +0200131 if (typeof options !== 'object' || options === null) options = {};
132
133 var ok = true;
134 for (const [opt, optMeta] of Object.entries(optionsPrototype)) {
135 if (!(opt in options)) {
136 ok = false;
137 options[opt] = optMeta['defaultValue'];
avm999634c1a6792020-08-31 21:30:42 +0200138 }
139 }
140
avm99963bf8eece2021-04-22 00:27:03 +0200141 console.log('[cleanUpOptions] New options', JSON.stringify(options));
avm999634c1a6792020-08-31 21:30:42 +0200142
avm99963bf8eece2021-04-22 00:27:03 +0200143 if (!ok && !dryRun) {
avm999634c1a6792020-08-31 21:30:42 +0200144 chrome.storage.sync.set(options);
145 }
146
147 return options;
148}
avm999638e0c1002020-12-03 16:54:20 +0100149
150// This method is based on the fact that when building the extension for Firefox
151// the browser_specific_settings.gecko entry is included.
152function isFirefox() {
153 var manifest = chrome.runtime.getManifest();
154 return manifest.browser_specific_settings !== undefined &&
155 manifest.browser_specific_settings.gecko !== undefined;
156}
avm999637309b062021-04-22 12:41:08 +0200157
158// Returns whether the extension is a release version.
159function isReleaseVersion() {
160 var manifest = chrome.runtime.getManifest();
161 return ('version' in manifest) && manifest.version != '0';
162}