blob: db2040950ece4ced1908c26364f188484d643e17 [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 },
avm99963bf8eece2021-04-22 00:27:03 +020085
86 // Internal options:
87 'ccdarktheme_switch_enabled': {
88 defaultValue: true,
89 context: 'internal',
90 },
91
92 // Deprecated options:
93 'escalatethreads': {
94 defaultValue: false,
95 context: 'deprecated',
96 },
97 'movethreads': {
98 defaultValue: false,
99 context: 'deprecated',
100 },
101 'batchduplicate': {
102 defaultValue: false,
103 context: 'deprecated',
104 },
avm99963a858ef72021-04-22 01:18:31 +0200105 'smei_sortdirection': {
106 defaultValue: false,
107 context: 'deprecated',
108 },
avm999634c1a6792020-08-31 21:30:42 +0200109};
110
avm99963ad65e752020-09-01 00:13:59 +0200111const specialOptions = [
112 'profileindicatoralt_months',
avm999630bc113a2020-09-07 13:02:11 +0200113 'ccdarktheme_mode',
114 'ccdarktheme_switch_enabled',
avm999638e0c1002020-12-03 16:54:20 +0100115 'ccdragndropfix',
avm99963ad65e752020-09-01 00:13:59 +0200116];
117
avm999634c1a6792020-08-31 21:30:42 +0200118function isEmpty(obj) {
119 return Object.keys(obj).length === 0;
120}
121
avm99963bf8eece2021-04-22 00:27:03 +0200122// Adds missing options with their default value. If |dryRun| is set to false,
123// they are also saved to the sync storage area.
124function cleanUpOptions(options, dryRun = false) {
125 console.log('[cleanUpOptions] Previous options', JSON.stringify(options));
avm99963ad65e752020-09-01 00:13:59 +0200126
avm99963bf8eece2021-04-22 00:27:03 +0200127 if (typeof options !== 'object' || options === null) options = {};
128
129 var ok = true;
130 for (const [opt, optMeta] of Object.entries(optionsPrototype)) {
131 if (!(opt in options)) {
132 ok = false;
133 options[opt] = optMeta['defaultValue'];
avm999634c1a6792020-08-31 21:30:42 +0200134 }
135 }
136
avm99963bf8eece2021-04-22 00:27:03 +0200137 console.log('[cleanUpOptions] New options', JSON.stringify(options));
avm999634c1a6792020-08-31 21:30:42 +0200138
avm99963bf8eece2021-04-22 00:27:03 +0200139 if (!ok && !dryRun) {
avm999634c1a6792020-08-31 21:30:42 +0200140 chrome.storage.sync.set(options);
141 }
142
143 return options;
144}
avm999638e0c1002020-12-03 16:54:20 +0100145
146// This method is based on the fact that when building the extension for Firefox
147// the browser_specific_settings.gecko entry is included.
148function isFirefox() {
149 var manifest = chrome.runtime.getManifest();
150 return manifest.browser_specific_settings !== undefined &&
151 manifest.browser_specific_settings.gecko !== undefined;
152}