Safari中scripting.executeScript为何返回null数组而非InjectionResult数组?
Safari MV3 中
scripting.executeScript 返回异常的问题排查 问题描述
近期测试发现,在Safari 15和16版本中使用scripting.executeScript注入内容脚本时,返回结果不符合MV3规范。该方法预期返回InjectionResult对象数组(每个帧对应一个对象),但Safari返回的是包含单个null元素的数组。脚本本身能正常执行无错误,即便出错也应该是InjectionResult的error字段赋值,而非直接返回null。
测试代码
Manifest Version 3
const foo = await browser.scripting.executeScript({ target: { tabId }, func: () => { console.log('Hello, from an injected script! o/'); }, }); console.log({ foo }); const bar = await browser.scripting.executeScript({ target: { tabId }, args: [1337], func: (param) => { console.log(`Hello, from an injected script! o/ With '${param}' argument!`); return param; }, }); console.log({ bar });
Manifest Version 2(Firefox兼容)
const foo = await browser.tabs.executeScript(tabId, { code: 'console.log("Hello, from an injected script! o/")', }); console.log({ foo }); const param = 1337; const bar = await browser.tabs.executeScript(tabId, { code: `console.log('Hello, from an injected script! o/ With "${param}" argument!'); ${param};`, }); console.log({ bar });
各浏览器输出对比
Chrome / Brave / Edge / Opera
foo: [{documentId: '...', frameId: 0, result: null}] bar: [{documentId: '...', frameId: 0, result: 1337}]
Firefox
foo: [undefined] bar: [1337]
Safari
foo: [null] bar: [null]
尝试的解决方案
考虑到Safari的输出更接近Firefox MV2的行为,推测Safari的MV3处于过渡状态,尝试模仿Firefox MV2的返回逻辑,移除return语句,仅保留最后执行的表达式:
func: (param) => { console.log(`Hello, from an injected script! o/ With '${param}' argument!`); param; },
但该方法无效,问题依旧。
结论
这种行为几乎可以确定是WebKit的bug,因为它既不符合MV3的规范,也没有遵循自身MV2的返回逻辑。目前没有其他明显的配置或代码写法能规避这个问题,建议向WebKit提交bug反馈。
内容的提问来源于stack exchange,提问作者bkrypt
相关产品推荐
相关产品推荐

