Skip to content

Commit d14b6d2

Browse files
authored
Merge pull request #103 from tjmtmmnk/manifest-v3
Manifest v3
2 parents 7d5952e + 3bdd897 commit d14b6d2

8 files changed

Lines changed: 132 additions & 71 deletions

File tree

package-lock.json

Lines changed: 10 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"url": "https://github.com/tjmtmmnk/modekun"
1919
},
2020
"devDependencies": {
21-
"@types/chrome": "0.0.154",
21+
"@types/chrome": "0.0.184",
2222
"@types/jest": "27.0.1",
2323
"@types/kuromoji": "0.1.1",
2424
"@types/md5": "2.3.1",

public/manifest.json

Lines changed: 30 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,20 @@
11
{
2-
"manifest_version": 2,
2+
"manifest_version": 3,
33

44
"name": "modekun",
55
"description": "moderate live chat",
6-
"version": "1.1.5",
7-
"content_security_policy": "script-src 'self'; object-src 'none'",
6+
"version": "2.0.0",
7+
"content_security_policy": {
8+
"extension_pages": "script-src 'self'; object-src 'none'"
9+
},
810

9-
"browser_action": {
10-
"default_icon": "icon.png",
11+
"action": {
12+
"default_title": "modekun",
13+
"default_icon": {
14+
"16": "icon16.png",
15+
"48": "icon48.png",
16+
"64": "icon64.png"
17+
},
1118
"default_popup": "popup.html"
1219
},
1320

@@ -22,20 +29,34 @@
2229
"matches": [
2330
"https://www.youtube.com/*",
2431
"https://www.mildom.com/*",
25-
"https://www.twitch.tv/*"
32+
"https://www.twitch.tv/*",
33+
"https://www.google.co.jp/*"
2634
],
2735
"js": ["js/content_script.js"]
2836
}
2937
],
3038

3139
"background": {
32-
"scripts": ["js/background.js"],
33-
"persistent": false
40+
"service_worker": "js/background.js"
3441
},
3542

3643
"permissions": ["activeTab", "storage", "tabs"],
3744

38-
"web_accessible_resources": ["kuromoji/dict/*", "js/worker.js"],
45+
"web_accessible_resources": [
46+
{
47+
"resources": ["kuromoji/dict/*", "js/worker.js"],
48+
"matches": [
49+
"https://www.youtube.com/*",
50+
"https://www.mildom.com/*",
51+
"https://www.twitch.tv/*",
52+
"https://www.google.co.jp/*"
53+
],
54+
"extension_ids": [
55+
"lnlgicokoimnfncigoknlbiicjfbbejp",
56+
"gledinelblgphiogdfalpkobganffpem"
57+
]
58+
}
59+
],
3960

4061
"default_locale": "ja"
4162
}

src/background.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import { get, set } from "./storage";
44

55
chrome.runtime.onMessage.addListener(
66
async (req: Message, sender, sendResponse) => {
7-
if (req.from === "BACKGROUND" || req.to !== "BACKGROUND") return;
7+
if (req.from === "BACKGROUND" || req.to !== "BACKGROUND") {
8+
sendResponse();
9+
return;
10+
}
811
if (req.type === "GET_PARAM" && req.from === "CONTENT_SCRIPT") {
912
if (!req.data) throw new Error("no data");
1013
if (!req.data.key) throw new Error("no key");
@@ -20,13 +23,13 @@ chrome.runtime.onMessage.addListener(
2023
console.error(e);
2124
param = defaultParamsV2;
2225
}
23-
sendRequestToContent({
26+
await sendRequestToContent({
2427
type: "UPDATE_PARAM",
2528
from: "BACKGROUND",
2629
to: "CONTENT_SCRIPT",
2730
data: { param },
2831
});
29-
sendRequest({
32+
await sendRequest({
3033
type: "UPDATE_PARAM",
3134
from: "BACKGROUND",
3235
to: "POPUP",
@@ -44,5 +47,6 @@ chrome.runtime.onMessage.addListener(
4447
console.error(e);
4548
}
4649
}
50+
sendResponse();
4751
}
4852
);

src/content_script.tsx

Lines changed: 39 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ const getDicPath = () => {
2929

3030
return isFireFox
3131
? "https://cdn.jsdelivr.net/npm/kuromoji@0.1.2/dict"
32-
: chrome.extension.getURL("kuromoji/dict/");
32+
: chrome.runtime.getURL("kuromoji/dict/");
3333
};
3434

3535
/*
3636
* set param managed in content_script
3737
*/
38-
const initParam = () => {
39-
sendRequest({
38+
const initParam = async () => {
39+
await sendRequest({
4040
type: "GET_PARAM",
4141
from: "CONTENT_SCRIPT",
4242
to: "BACKGROUND",
@@ -46,41 +46,47 @@ const initParam = () => {
4646
});
4747
};
4848

49-
chrome.runtime.onMessage.addListener((req: Message, sender, sendResponse) => {
50-
if (req.from === "CONTENT_SCRIPT" || req.to !== "CONTENT_SCRIPT") return;
51-
if (req.type === "UPDATE_PARAM" && req.from === "BACKGROUND") {
52-
if (!req.data || !req.data.param) throw new Error("no param");
53-
param = req.data.param;
54-
sendRequest({
55-
type: "UPDATE_PARAM",
56-
from: "CONTENT_SCRIPT",
57-
to: "POPUP",
58-
data: {
59-
param,
60-
},
61-
});
62-
} else if (req.type === "UPDATE_PARAM" && req.from === "POPUP") {
63-
if (!req.data || !req.data.param) throw new Error("no param");
64-
param = req.data.param;
65-
sendRequest({
66-
type: "UPDATE_PARAM",
67-
from: "CONTENT_SCRIPT",
68-
to: "BACKGROUND",
69-
data: {
70-
key: paramKey,
71-
param,
72-
},
73-
});
74-
} else if (req.type === "GET_PARAM" && req.from === "POPUP") {
75-
if (isReady) initParam();
49+
chrome.runtime.onMessage.addListener(
50+
async (req: Message, sender, sendResponse) => {
51+
if (req.from === "CONTENT_SCRIPT" || req.to !== "CONTENT_SCRIPT") {
52+
sendResponse();
53+
return;
54+
}
55+
if (req.type === "UPDATE_PARAM" && req.from === "BACKGROUND") {
56+
if (!req.data || !req.data.param) throw new Error("no param");
57+
param = req.data.param;
58+
await sendRequest({
59+
type: "UPDATE_PARAM",
60+
from: "CONTENT_SCRIPT",
61+
to: "POPUP",
62+
data: {
63+
param,
64+
},
65+
});
66+
} else if (req.type === "UPDATE_PARAM" && req.from === "POPUP") {
67+
if (!req.data || !req.data.param) throw new Error("no param");
68+
param = req.data.param;
69+
await sendRequest({
70+
type: "UPDATE_PARAM",
71+
from: "CONTENT_SCRIPT",
72+
to: "BACKGROUND",
73+
data: {
74+
key: paramKey,
75+
param,
76+
},
77+
});
78+
} else if (req.type === "GET_PARAM" && req.from === "POPUP") {
79+
if (isReady) await initParam();
80+
}
81+
sendResponse();
7682
}
77-
});
83+
);
7884

7985
window.addEventListener("load", async () => {
8086
try {
8187
const source = selectSource(window.location.href);
8288
paramKey = keyStreamer(source.name, source.extractStreamer());
83-
initParam();
89+
await initParam();
8490

8591
worker = await createKuromojiWorker();
8692
api = await createKuromojiWorkerApi(worker, getDicPath());
@@ -130,7 +136,7 @@ const observeLocation = async () => {
130136

131137
const source = selectSource(currentLocation);
132138
paramKey = keyStreamer(source.name, source.extractStreamer());
133-
initParam();
139+
await initParam();
134140

135141
worker && terminateWorker(worker);
136142
// avoid memory leak, worker allocates a lot of memory

src/message.ts

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,44 @@ export interface Message {
99
data?: any;
1010
}
1111

12-
export const sendRequest = <T = any>(
13-
req: Message,
14-
resFn?: (res: T) => void
15-
) => {
16-
chrome.runtime.sendMessage(req, resFn);
12+
export const sendRequest = async <R>(req: Message): Promise<R> => {
13+
return new Promise((resolve, reject) => {
14+
chrome.runtime.sendMessage(req, (res) => {
15+
let err = chrome.runtime.lastError;
16+
if (
17+
!err ||
18+
(err.message && /The message port closed before/.test(err.message))
19+
) {
20+
resolve(res);
21+
} else {
22+
err = new Error(err.message);
23+
reject(err);
24+
}
25+
});
26+
});
1727
};
1828

19-
export const sendRequestToContent = <T = any>(
20-
req: Message,
21-
resFn?: (res: T) => void
22-
) => {
23-
if (req.to !== "CONTENT_SCRIPT") return;
24-
chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
25-
tabs[0].id && chrome.tabs.sendMessage(tabs[0].id, req);
29+
export const sendRequestToContent = async (req: Message) => {
30+
if (req.to !== "CONTENT_SCRIPT")
31+
throw new Error("must send to CONTENT_SCRIPT");
32+
const tabs = await chrome.tabs.query({ active: true, currentWindow: true });
33+
34+
return new Promise((resolve, reject) => {
35+
if (tabs.length === 0 || !tabs[0].id) {
36+
reject(Error("no tab"));
37+
return;
38+
}
39+
chrome.tabs.sendMessage(tabs[0].id, req, (res) => {
40+
let err = chrome.runtime.lastError;
41+
if (
42+
!err ||
43+
(err.message && /The message port closed before/.test(err.message))
44+
) {
45+
resolve(res);
46+
} else {
47+
err = new Error(err.message);
48+
reject(err);
49+
}
50+
});
2651
});
2752
};

src/moderate.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { IParameterV2 } from "./config";
44
import { IKuromojiWorker } from "./kuromoji";
55

66
export const createKuromojiWorker = async (): Promise<Worker> => {
7-
const worker = await fetch(chrome.extension.getURL("js/worker.js"));
7+
const worker = await fetch(chrome.runtime.getURL("js/worker.js"));
88
const js = await worker.text();
99
const blob = new Blob([js], { type: "text/javascript" });
1010
const url = URL.createObjectURL(blob);

src/popup.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ const initialState: IPopupState = {
2727
isLoading: true,
2828
};
2929

30-
export const updateParam = (param: IParameterV2) => {
31-
sendRequestToContent({
30+
export const updateParam = async (param: IParameterV2) => {
31+
await sendRequestToContent({
3232
type: "UPDATE_PARAM",
3333
from: "POPUP",
3434
to: "CONTENT_SCRIPT",
@@ -41,12 +41,16 @@ const Popup = () => {
4141
useEffect(() => {
4242
chrome.runtime.onMessage.addListener(
4343
(req: Message, sender, sendResponse) => {
44-
if (req.from === "POPUP" || req.to !== "POPUP") return;
44+
if (req.from === "POPUP" || req.to !== "POPUP") {
45+
sendResponse();
46+
return;
47+
}
4548
if (req.type === "UPDATE_PARAM") {
4649
if (!req.data || !req.data.param) throw new Error("no param");
4750
dispatch({ t: "update", param: req.data.param as IParameterV2 });
4851
dispatch({ t: "loaded" });
4952
}
53+
sendResponse();
5054
}
5155
);
5256
sendRequestToContent({

0 commit comments

Comments
 (0)