Skip to content

Commit 3ed4878

Browse files
authored
refactor(tracking): refactor tab states monitoring and tracking options (#415)
1 parent 058a796 commit 3ed4878

File tree

26 files changed

+203
-380
lines changed

26 files changed

+203
-380
lines changed

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
"@rsdoctor/rspack-plugin": "^1.3.8",
3535
"@rspack/cli": "^1.6.1",
3636
"@rspack/core": "^1.6.1",
37-
"@swc/core": "^1.15.0",
37+
"@swc/core": "^1.15.1",
3838
"@swc/jest": "^0.2.39",
3939
"@types/chrome": "0.1.27",
4040
"@types/decompress": "^4.2.7",
@@ -54,7 +54,7 @@
5454
"postcss": "^8.5.6",
5555
"postcss-loader": "^8.2.0",
5656
"postcss-rtlcss": "^5.7.1",
57-
"puppeteer": "^24.29.0",
57+
"puppeteer": "^24.29.1",
5858
"ts-loader": "^9.5.4",
5959
"ts-node": "^10.9.2",
6060
"tsconfig-paths": "^4.2.0",
@@ -65,7 +65,7 @@
6565
"echarts": "^6.0.0",
6666
"element-plus": "2.11.7",
6767
"punycode": "^2.3.1",
68-
"vue": "^3.5.23",
68+
"vue": "^3.5.24",
6969
"vue-router": "^4.6.3"
7070
},
7171
"engines": {

src/api/chrome/runtime.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,18 @@ export function sendMsg2Runtime<T = any, R = any>(code: timer.mq.ReqCode, data?:
4040
})
4141
}
4242

43+
/**
44+
* Wrap for hooks, after the extension reloaded or upgraded, the context of current content script will be invalid
45+
* And sending messages to the runtime will be failed
46+
*/
47+
export async function trySendMsg2Runtime<Req, Res>(code: timer.mq.ReqCode, data?: Req): Promise<Res | undefined> {
48+
try {
49+
return await sendMsg2Runtime(code, data)
50+
} catch {
51+
// ignored
52+
}
53+
}
54+
4355
export function onRuntimeMessage<T = any, R = any>(handler: ChromeMessageHandler<T, R>): void {
4456
// Be careful!!!
4557
// Can't use await/async in callback parameter

src/api/chrome/tab.ts

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -92,25 +92,31 @@ export function sendMsg2Tab<T = any, R = any>(tabId: number, code: timer.mq.ReqC
9292
})
9393
}
9494

95-
type TabHandler<Event> = (tabId: number, ev: Event, tab?: ChromeTab) => void
95+
export async function trySendMsg2Tab<T = any, R = any>(
96+
tabId: number,
97+
code: timer.mq.ReqCode,
98+
data?: T
99+
): Promise<R | undefined> {
100+
try {
101+
return await sendMsg2Tab<T, R>(tabId, code, data)
102+
} catch (e) {
103+
console.warn(`Errored to send message to tab: tabId=${tabId}, code=${code}, data=${JSON.stringify(data)}`, e)
104+
return Promise.resolve(undefined)
105+
}
106+
}
107+
108+
type TabHandler<Event> = (tabId: number, ev: Event, tab: ChromeTab) => void
96109

97-
export function onTabActivated(handler: TabHandler<ChromeTabActiveInfo>): void {
98-
chrome.tabs.onActivated.addListener((activeInfo: chrome.tabs.OnActivatedInfo) => {
110+
export function onTabActivated(handler: (tabId: number, info: ChromeTabActiveInfo) => void): void {
111+
chrome.tabs.onActivated.addListener(activeInfo => {
99112
handleError("tabActivated")
100-
handler(activeInfo?.tabId, activeInfo)
113+
handler(activeInfo.tabId, activeInfo)
101114
})
102115
}
103116

104-
export function onTabUpdated(handler: TabHandler<ChromeTabChangeInfo>): void {
105-
chrome.tabs.onUpdated.addListener((tabId: number, changeInfo: ChromeTabChangeInfo, tab: ChromeTab) => {
117+
export function onTabUpdated(handler: TabHandler<ChromeTabUpdatedInfo>): void {
118+
chrome.tabs.onUpdated.addListener((tabId: number, changeInfo: ChromeTabUpdatedInfo, tab: ChromeTab) => {
106119
handleError("tabUpdated")
107120
handler(tabId, changeInfo, tab)
108121
})
109-
}
110-
111-
export function onTabRemoved(handler: (tabId: number) => void): void {
112-
chrome.tabs.onRemoved.addListener((tabId: number) => {
113-
handleError("tabRemoved")
114-
handler(tabId)
115-
})
116122
}

src/background/active-tab-listener.ts

Lines changed: 0 additions & 42 deletions
This file was deleted.

src/background/audio-tab-listener.ts

Lines changed: 0 additions & 174 deletions
This file was deleted.

src/background/content-script-handler.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,5 +74,6 @@ export default function init(dispatcher: MessageDispatcher) {
7474
const exist = await siteService.get(site)
7575
return exist?.run ? site : null
7676
})
77+
.register<void, boolean>('cs.getAudible', async (_, sender) => !!sender.tab?.audible)
7778
.register<timer.timeline.Event, void>('cs.timelineEv', ev => timelineThrottler.saveEvent(ev))
7879
}

src/background/index.ts

Lines changed: 7 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,11 @@
55
* https://opensource.org/licenses/MIT
66
*/
77

8-
import { listTabs } from "@api/chrome/tab"
8+
import { listTabs, trySendMsg2Tab } from "@api/chrome/tab"
99
import { isNoneWindowId, onNormalWindowFocusChanged } from "@api/chrome/window"
1010
import optionHolder from "@service/components/option-holder"
11-
import itemService from "@service/item-service"
12-
import whitelistHolder from "@service/whitelist/holder"
1311
import { isBrowserUrl } from "@util/pattern"
1412
import { openLog } from "../common/logger"
15-
import ActiveTabListener from "./active-tab-listener"
16-
import AudioTabListener from "./audio-tab-listener"
1713
import BackupScheduler from "./backup-scheduler"
1814
import badgeTextManager from "./badge-manager"
1915
import initBrowserAction from "./browser-action-manager"
@@ -24,6 +20,7 @@ import initLimitProcessor from "./limit-processor"
2420
import MessageDispatcher from "./message-dispatcher"
2521
import VersionMigrator from "./migrator"
2622
import initSidePanel from "./side-panel"
23+
import TabListener from './tab-listener'
2724
import initTrackServer from "./track-server"
2825
import initWhitelistMenuManager from "./whitelist-menu-manager"
2926

@@ -62,32 +59,11 @@ initWhitelistMenuManager()
6259
// Badge manager
6360
badgeTextManager.init(messageDispatcher)
6461

65-
// Track the currently active tab
66-
let activeTabId: number | null = null
67-
const audioTabListener = new AudioTabListener()
68-
69-
// Listen to tab active changed
70-
new ActiveTabListener()
71-
.register(({ url, tabId }) => {
72-
activeTabId = tabId
73-
audioTabListener.onActiveTabChanged(tabId)
74-
badgeTextManager.updateFocus({ url, tabId })
75-
})
76-
.listen()
77-
78-
// Listen to audio playback in background tabs
79-
audioTabListener
80-
.register(async ({ host, url, duration, tabId }) => {
81-
if (whitelistHolder.contains(host, url)) return
82-
83-
const focusTimeMs = duration * 1000
84-
await itemService.addFocusTime({ host, url }, focusTimeMs)
85-
86-
badgeTextManager.updateFocus({ url, tabId })
87-
})
88-
89-
// Make this async since listen() is now async
90-
audioTabListener.listen(() => activeTabId)
62+
// Listen to tab changed
63+
new TabListener()
64+
.onActivated(({ url, tabId }) => badgeTextManager.updateFocus({ url, tabId }))
65+
.onUpdated((tabId, { audible }) => audible !== undefined && trySendMsg2Tab(tabId, 'syncAudible', audible))
66+
.start()
9167

9268
handleInstall()
9369

@@ -101,8 +77,6 @@ onNormalWindowFocusChanged(async windowId => {
10177
tabs.forEach(tab => {
10278
const { url, id: tabId } = tab
10379
if (!url || isBrowserUrl(url) || !tabId) return
104-
activeTabId = tabId
105-
audioTabListener.onActiveTabChanged(tabId)
10680
badgeTextManager.updateFocus({ url, tabId })
10781
})
10882
})

0 commit comments

Comments
 (0)