electron 在上下文桥接API中支持getter和setter方法,

eni9jsuy  于 3个月前  发布在  Electron
关注(0)|答案(9)|浏览(74)

问题详情

  • Electron版本:
  • 9.x
  • 操作系统:
  • macOS 10.15.x

预期行为

通过contextBridge.exposeInMainWorld暴露API不应该产生副作用。

实际行为

使用具有get属性的对象调用此方法会触发它。这使得例如无法进行懒加载示例化。

重现方法

contextBridge.exposeInMainWorld('vscode',{
   get something(): { console.log("accessed"); }
});
bvjxkvbb

bvjxkvbb1#

contextBridge目前不支持getter和setter。有一种模式下它支持(我们内部用于某些事情),但这种模式切换不是通过API暴露的。
这是否是一个硬性要求,将其作为getter属性而不是方法。公开支持getter和setter将增加更多的API成本,但也不是太难去暴露。

7vux5j2d

7vux5j2d2#

@MarshallOfSound :不,我认为我现在有一个解决方法,通过切换到函数来实现。

kyxcudwk

kyxcudwk3#

我认为当你在发明一个全新的API时,"绕过"缺少getter和setter并不是那么困难。但是如果你在使用现有的API,编写一个 Package 器会变得非常耗时且令人沮丧。更糟糕的是,记住如何在不同运行位置(主线程、预加载、渲染器)获取和设置属性的心理负担是令人筋疲力尽的。
并非所有的API都是安全威胁。
请考虑公开支持getter和setter。

vql8enpb

vql8enpb4#

从Electron 8切换到Electron 18,并在共享窗口的全局作用域中使用contextBridge而不是共享的动态对象,而不使用getter和setter选项给我们带来了一些令人遗憾的头痛,这对于在webviews中运行的现有应用程序的向后兼容性来说是不利的。
是的,如果getter/setter可用,我们会更好。

c0vxltue

c0vxltue5#

这个问题已经被自动标记为过时。如果这个问题仍然影响到你,请留下任何评论(例如“提升”),我们会保持开放。如果你有任何新的附加信息——特别是,如果这个问题在 latest version of Electronbeta 中仍然可复现——请在你的评论中包含它!

lxkprmvk

lxkprmvk6#

这个问题由于不活跃而被关闭,将不再被监控。如果这是一个错误并且您可以在支持的Electron版本上重现此问题,请打开一个新问题并包括重现问题的说明。

c0vxltue

c0vxltue7#

我不清楚这方面是否有什么变化可以解决这个问题,@MarshallOfSound 请重新打开。

nxowjjhe

nxowjjhe8#

@bpasero,您可以在第一次警告后的30天内通过注解来防止这些关闭。我认为无论如何都应该将其标记为增强功能,所以我可以重新打开这个。

des4xlb0

des4xlb09#

我目前正在尝试通过预加载集成第三方库,并广泛利用setter/getter。为了解决这个问题,我不得不包含一个遍历示例的hack,这相当肮脏:

let thing = /* ... */

contextBridge.exposeInMainWorld('thingWalker', (path: string[]) : any => {
  
  // sanitize/validate path
  
  // walk lib
  let cursor = thing;
  while (path) cursor = cursor[path.shift()];
  
  return cursor;
});

我尝试过的其他方法都不行:

  • 摘要函数: contextBridge.expose...(name, () => thing);
  • 预加载代理

相关问题