You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 20:50:27