feat(ext): improve token validation and error handling

This commit is contained in:
Simon
2026-01-28 19:59:55 +08:00
parent ef2d115742
commit d6323f1488
3 changed files with 63 additions and 19 deletions

View File

@@ -35,6 +35,9 @@ export class MultiPageAgent extends PageAgentCore {
chrome.storage.local.set({ chrome.storage.local.set({
isAgentRunning: false, isAgentRunning: false,
}) })
// no need to dispose tabsController and pageController
// as they do not keep references
}, },
}) })
} }

View File

@@ -13,13 +13,22 @@ export default defineContentScript({
// if auth token matches, expose agent to page // if auth token matches, expose agent to page
chrome.storage.local.get('PageAgentExtUserAuthToken').then((result) => { chrome.storage.local.get('PageAgentExtUserAuthToken').then((result) => {
if (!result.PageAgentExtUserAuthToken) return // extension side token.
if (!localStorage.getItem('PageAgentExtUserAuthToken')) return // @note this is isolated world. it is safe to assume user script cannot access it
if (localStorage.getItem('PageAgentExtUserAuthToken') !== result.PageAgentExtUserAuthToken) const extToken = result.PageAgentExtUserAuthToken
return if (!extToken) return
exposeAgentToPage() // page side token
injectScript('/main-world.js') const pageToken = localStorage.getItem('PageAgentExtUserAuthToken')
if (!pageToken) return
if (pageToken !== extToken) return
// add isolated world script
exposeAgentToPage().then(
// add main-world script
() => injectScript('/main-world.js')
)
}) })
}, },
}) })
@@ -42,9 +51,24 @@ async function exposeAgentToPage() {
switch (action) { switch (action) {
case 'execute': { case 'execute': {
if (!multiPageAgent) multiPageAgent = new MultiPageAgent(DEMO_CONFIG) if (multiPageAgent && multiPageAgent.status === 'running') {
window.postMessage(
{
channel: 'PAGE_AGENT_EXT_RESPONSE',
id,
action: 'execute_result',
error: 'Agent is already running a task. Please wait until it finishes.',
},
'*'
)
return
}
try {
multiPageAgent = new MultiPageAgent(DEMO_CONFIG)
const result = await multiPageAgent.execute(payload) const result = await multiPageAgent.execute(payload)
window.postMessage( window.postMessage(
{ {
channel: 'PAGE_AGENT_EXT_RESPONSE', channel: 'PAGE_AGENT_EXT_RESPONSE',
@@ -54,6 +78,18 @@ async function exposeAgentToPage() {
}, },
'*' '*'
) )
} catch (error) {
window.postMessage(
{
channel: 'PAGE_AGENT_EXT_RESPONSE',
id,
action: 'execute_result',
error: (error as Error).message,
},
'*'
)
}
break break
} }

View File

@@ -10,7 +10,7 @@ export default defineUnlistedScript(() => {
w.execute = async (task: string) => { w.execute = async (task: string) => {
const id = getId() const id = getId()
const promise = new Promise((resolve) => { const promise = new Promise((resolve, reject) => {
function handleMessage(e: MessageEvent) { function handleMessage(e: MessageEvent) {
const data = e.data const data = e.data
if (typeof data !== 'object' || data === null) return if (typeof data !== 'object' || data === null) return
@@ -19,8 +19,13 @@ export default defineUnlistedScript(() => {
if (data.id !== id) return if (data.id !== id) return
window.removeEventListener('message', handleMessage) window.removeEventListener('message', handleMessage)
if (data.error) {
reject(new Error(data.error))
} else {
resolve(data.payload) resolve(data.payload)
} }
}
window.addEventListener('message', handleMessage) window.addEventListener('message', handleMessage)
}) })