Skip to content

Commit daa0f55

Browse files
authored
Merge pull request #58 from penge/optional-context-menu
Make context menu optional
2 parents cb826f1 + 4caa54e commit daa0f55

File tree

6 files changed

+61
-32
lines changed

6 files changed

+61
-32
lines changed

public/options.html

+8
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@ <h1>
2424
<option value="NO">No</option>
2525
</select>
2626
</div>
27+
28+
<div id="context-menu-option" class="option">
29+
<label>Context menu?</label>
30+
<select id="context-menu">
31+
<option value="YES">Yes</option>
32+
<option value="NO">No</option>
33+
</select>
34+
</div>
2735
</div>
2836

2937
<p>Sites to block (prepend <code>!</code> to exclude)</p>

src/background.ts

+14-4
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,34 @@
11
import initStorage from "./storage/init";
22
import storage from "./storage";
3-
import createContextMenu from "./helpers/create-context-menu";
3+
import recreateContextMenu from "./helpers/recreate-context-menu";
44
import blockSite from "./helpers/block-site";
55

66
let __enabled: boolean;
7+
let __contextMenu: boolean;
78
let __blocked: string[];
89

910
initStorage().then(() => {
10-
createContextMenu();
11-
12-
storage.get(["enabled", "blocked"]).then(({ enabled, blocked }) => {
11+
storage.get(["enabled", "contextMenu", "blocked"]).then(({ enabled, contextMenu, blocked }) => {
1312
__enabled = enabled;
13+
__contextMenu = contextMenu;
1414
__blocked = blocked;
15+
16+
recreateContextMenu(__enabled && __contextMenu);
1517
});
1618

1719
chrome.storage.local.onChanged.addListener((changes) => {
1820
if (changes["enabled"]) {
1921
__enabled = changes["enabled"].newValue as boolean;
2022
}
2123

24+
if (changes["contextMenu"]) {
25+
__contextMenu = changes["contextMenu"].newValue as boolean;
26+
}
27+
28+
if (changes["enabled"] || changes["contextMenu"]) {
29+
recreateContextMenu(__enabled && __contextMenu);
30+
}
31+
2232
if (changes["blocked"]) {
2333
__blocked = changes["blocked"].newValue as string[];
2434
}

src/helpers/create-context-menu.ts src/helpers/recreate-context-menu.ts

+5-17
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,10 @@ const createContextMenu = () => {
3333
});
3434
};
3535

36-
export default () => {
37-
storage.get(["enabled"]).then(({ enabled }) => {
38-
chrome.contextMenus.removeAll(() => {
39-
if (enabled) {
40-
createContextMenu();
41-
}
42-
});
43-
44-
chrome.storage.local.onChanged.addListener((changes) => {
45-
if (changes["enabled"]) {
46-
chrome.contextMenus.removeAll(() => {
47-
if (changes["enabled"].newValue as boolean) {
48-
createContextMenu();
49-
}
50-
});
51-
}
52-
});
36+
export default (meetsCreateCondition: boolean) => {
37+
chrome.contextMenus.removeAll(() => {
38+
if (meetsCreateCondition) {
39+
createContextMenu();
40+
}
5341
});
5442
};

src/options.ts

+28-11
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import storage, {
44

55
const UI = (() => {
66
const elements = {
7-
blockedList: document.getElementById("blocked-list") as HTMLTextAreaElement,
87
enabled: document.getElementById("enabled") as HTMLSelectElement,
8+
contextMenu: document.getElementById("context-menu") as HTMLSelectElement,
9+
blockedList: document.getElementById("blocked-list") as HTMLTextAreaElement,
910
resolution: document.getElementById("resolution") as HTMLSelectElement,
1011
counterShow: document.getElementById("counter-show") as HTMLSelectElement,
1112
counterPeriod: document.getElementById("counter-period") as HTMLSelectElement,
@@ -19,16 +20,21 @@ const UI = (() => {
1920
const getEventTargetValue = (event: Event) => (event.target as HTMLTextAreaElement | HTMLSelectElement).value;
2021
const stringToBlocked = (string: string) => string.split("\n").map((s) => s.trim()).filter(Boolean);
2122

22-
elements.blockedList.addEventListener("input", (event) => {
23-
const blocked = stringToBlocked(getEventTargetValue(event));
24-
storage.set({ blocked });
25-
});
26-
2723
elements.enabled.addEventListener("change", (event) => {
2824
const enabled = stringToBoolean(getEventTargetValue(event));
2925
storage.set({ enabled });
3026
});
3127

28+
elements.contextMenu.addEventListener("change", (event) => {
29+
const contextMenu = stringToBoolean(getEventTargetValue(event));
30+
storage.set({ contextMenu });
31+
});
32+
33+
elements.blockedList.addEventListener("input", (event) => {
34+
const blocked = stringToBlocked(getEventTargetValue(event));
35+
storage.set({ blocked });
36+
});
37+
3238
elements.resolution.addEventListener("change", (event) => {
3339
const resolution = getEventTargetValue(event) as Resolution;
3440
storage.set({ resolution });
@@ -45,17 +51,21 @@ const UI = (() => {
4551
});
4652

4753
const init = <T extends Partial<Schema>>(items: T) => {
54+
if (items.enabled !== undefined) {
55+
elements.enabled.value = booleanToString(items.enabled);
56+
}
57+
58+
if (items.contextMenu !== undefined) {
59+
elements.contextMenu.value = booleanToString(items.contextMenu);
60+
}
61+
4862
if (items.blocked !== undefined) {
4963
const valueAsBlocked = stringToBlocked(elements.blockedList.value);
5064
if (JSON.stringify(valueAsBlocked) !== JSON.stringify(items.blocked)) {
5165
elements.blockedList.value = items.blocked.join("\r\n");
5266
}
5367
}
5468

55-
if (items.enabled !== undefined) {
56-
elements.enabled.value = booleanToString(items.enabled);
57-
}
58-
5969
if (items.resolution !== undefined) {
6070
elements.resolution.value = items.resolution;
6171
RESOLUTIONS.forEach((oneResolution) => {
@@ -78,7 +88,14 @@ const UI = (() => {
7888
})();
7989

8090
window.addEventListener("DOMContentLoaded", () => {
81-
const keys: (keyof Schema)[] = ["blocked", "enabled", "resolution", "counterShow", "counterPeriod"];
91+
const keys: (keyof Schema)[] = [
92+
"enabled",
93+
"contextMenu",
94+
"blocked",
95+
"resolution",
96+
"counterShow",
97+
"counterPeriod",
98+
];
8299

83100
storage.get(keys).then((local) => {
84101
UI.init(local);

src/storage/__tests__/init.test.ts

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ test("getRevisitedSchema() returns defaults for any invalid attribute", () => {
1010
enabled: DEFAULTS.enabled,
1111
blocked: DEFAULTS.blocked,
1212
})).toEqual({
13+
contextMenu: false,
1314
counter: DEFAULTS.counter,
1415
counterShow: DEFAULTS.counterShow,
1516
counterPeriod: DEFAULTS.counterPeriod,
@@ -19,8 +20,10 @@ test("getRevisitedSchema() returns defaults for any invalid attribute", () => {
1920
expect(getRevisitedSchema({
2021
...DEFAULTS,
2122
enabled: "YES", // invalid
23+
contextMenu: "YES" // invalid
2224
})).toEqual({
2325
enabled: DEFAULTS.enabled,
26+
contextMenu: DEFAULTS.contextMenu,
2427
} as Partial<Schema>);
2528

2629
expect(getRevisitedSchema({

src/storage/schema.ts

+3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export type CounterPeriod = typeof COUNTER_PERIODS[number];
1515

1616
export interface Schema {
1717
enabled: boolean
18+
contextMenu: boolean
1819
blocked: string[]
1920
counter: Record<string, number[]>
2021
counterShow: boolean
@@ -24,6 +25,7 @@ export interface Schema {
2425

2526
export const DEFAULTS: Readonly<Schema> = {
2627
enabled: false,
28+
contextMenu: false,
2729
blocked: [],
2830
counter: {},
2931
counterShow: false,
@@ -33,6 +35,7 @@ export const DEFAULTS: Readonly<Schema> = {
3335

3436
export const VALIDATORS: Readonly<Record<keyof Schema, (value: unknown) => boolean>> = {
3537
enabled: (value) => typeof value === "boolean",
38+
contextMenu: (value) => typeof value === "boolean",
3639
blocked: (value) => Array.isArray(value),
3740
counter: (value) => typeof value === "object",
3841
counterShow: (value) => typeof value === "boolean",

0 commit comments

Comments
 (0)