Skip to content

Commit 7723ffc

Browse files
committed
migrated to the latest Manifest-V3 of chrome extension (fix beiyuu#1)
1 parent 1b68fae commit 7723ffc

5 files changed

+85
-37
lines changed

background.html

-11
This file was deleted.

background.js

+47-19
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,51 @@
1-
var hasSetRain = false,isPlay = false,player = document.getElementById('player');
1+
let offscreenPromise;
2+
let hasOffscreen = false;
3+
let isPlaying = false;
24

3-
function togglePlay(){
4-
if(isPlay){
5-
isPlay = false;
6-
player.pause();
7-
chrome.browserAction.setIcon({path: 'assets/sun.png'});
8-
chrome.browserAction.setTitle({title:'Raining makes everything better!'});
9-
}else{
10-
isPlay = true;
11-
player.play();
12-
chrome.browserAction.setIcon({path: 'assets/rain.png'});
13-
chrome.browserAction.setTitle({title:"Listen it's raining!"});
5+
chrome.action.onClicked.addListener(async () => {
6+
if (!isPlaying) {
7+
if (!hasOffscreen) {
8+
// 创建离屏文档
9+
await ensureOffscreen();
10+
hasOffscreen = true;
1411
}
15-
}
12+
// 发送消息给离屏文档开始播放
13+
await chrome.runtime.sendMessage({ action: 'play' });
14+
isPlaying = true;
15+
chrome.action.setIcon({ path: 'assets/rain.png' });
16+
chrome.action.setTitle({ title: "Listen it's raining!" });
17+
} else {
18+
// 发送消息给离屏文档停止播放
19+
await chrome.runtime.sendMessage({ action: 'pause' });
20+
isPlaying = false;
21+
chrome.action.setIcon({ path: 'assets/sun.png' });
22+
chrome.action.setTitle({ title: 'Raining makes everything better!' });
23+
}
24+
});
1625

17-
chrome.browserAction.onClicked.addListener(function(tab) {
18-
if(!hasSetRain){
19-
player.setAttribute('src','assets/Raining.mp3');
20-
hasSetRain = true;
21-
}
22-
togglePlay();
26+
// 监听离屏文档关闭的消息
27+
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
28+
if (message.action === 'closed') {
29+
hasOffscreen = false;
30+
isPlaying = false;
31+
chrome.action.setIcon({ path: 'assets/sun.png' });
32+
chrome.action.setTitle({ title: 'Raining makes everything better!' });
33+
}
2334
});
35+
36+
// fix: Error: Only a single offscreen document may be created.
37+
async function ensureOffscreen() {
38+
if (offscreenPromise) {
39+
return await offscreenPromise;
40+
}
41+
offscreenPromise = chrome.offscreen.createDocument({
42+
url: 'offscreen.html',
43+
reasons: ['AUDIO_PLAYBACK'],
44+
justification: 'Play rain sound'
45+
});
46+
try {
47+
await offscreenPromise;
48+
} finally {
49+
offscreenPromise = null;
50+
}
51+
}

manifest.json

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,26 @@
11
{
22
"name": "It's Raining"
3-
,"version":"1.6"
4-
,"manifest_version":2
3+
,"version":"3.0"
4+
,"manifest_version":3
55
,"description":"Rain Makes Everything Better"
66

77
,"icons":{
88
"16":"assets/16.png"
99
,"48":"assets/48.png"
1010
,"128":"assets/128.png"
1111
}
12-
,"browser_action": {
12+
,"action": {
1313
"default_icon": "assets/sun.png"
14-
,"default_title":"Raining Makes Everything Better"
14+
,"default_title":"Raining makes everything better!"
1515
}
1616
,"permissions":[
17-
"background"
17+
"offscreen"
1818
]
1919

20-
,"options_page": "options.html"
20+
,"options_ui": {
21+
"page": "options.html"
22+
}
2123
,"background": {
22-
"page":"background.html"
24+
"service_worker": "background.js"
2325
}
2426
}

offscreen.html

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<title>Offscreen Document</title>
5+
</head>
6+
<body>
7+
<script src="offscreen.js"></script>
8+
</body>
9+
</html>

offscreen.js

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
let audio;
2+
3+
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
4+
if (message.action === 'play') {
5+
if (!audio) {
6+
audio = new Audio(chrome.runtime.getURL('assets/Raining.mp3'));
7+
audio.loop = true;
8+
}
9+
audio.play();
10+
} else if (message.action === 'pause') {
11+
if (audio) {
12+
audio.pause();
13+
}
14+
}
15+
});
16+
17+
// 监听离屏文档关闭事件
18+
window.addEventListener('beforeunload', () => {
19+
chrome.runtime.sendMessage({ action: "closed" }); // 通知 Service Worker 离屏文档已关闭
20+
});

0 commit comments

Comments
 (0)