Firefox扩展导出async函数被网页调用报Permission denied访问then属性错误
问题原因
该报错由Firefox的安全上下文隔离机制触发:扩展内容脚本与网页运行在相互隔离的安全上下文中,你直接导出的request异步函数返回的Promise属于扩展上下文,网页侧无权限访问扩展上下文对象的then属性,因此抛出权限拒绝错误。即使是普通同步函数,如果返回扩展上下文的对象,网页侧访问其属性时也会触发同类报错。
修复后的扩展代码
// 获取网页上下文的Promise构造器 const PagePromise = window.wrappedJSObject.Promise; let ethereum = new window.Object(); // 定义导出给网页的request方法 const request = exportFunction(function() { console.log("request"); // 返回网页上下文的Promise实例 return new PagePromise((resolve) => { // 你的业务逻辑 const result = ["0x00"]; // 将返回值克隆到网页上下文 resolve(cloneInto(result, window.wrappedJSObject)); }); }, window, { allowCallbacks: true }); // 挂载request方法到ethereum对象 ethereum.request = request; // 将整个ethereum对象克隆到网页上下文后挂载 window.wrappedJSObject.ethereum = cloneInto(ethereum, window.wrappedJSObject, { cloneFunctions: true });
关键配置说明
cloneInto是Firefox提供的跨上下文对象传递API,第二个参数指定目标上下文为网页上下文,cloneFunctions: true配置支持克隆函数属性。- 导出函数时添加
allowCallbacks: true配置,支持跨上下文调用回调。 - 异步场景必须使用网页上下文的
Promise构造返回实例,避免网页侧访问then属性权限不足。 - 同步函数场景下,只需要将返回值通过
cloneInto处理后返回即可解决权限报错。
内容的提问来源于stack exchange,提问作者Rémi Baldy
相关产品推荐
相关产品推荐

