【发布时间】:2017-01-17 18:19:12
【问题描述】:
如何避免以下错误以及为什么会出现?
编辑:也许我不得不问我如何才能使特权范围内的对象对特权较低的范围可见。
我的目标是将动态创建的对象导出/返回到页面脚本,作为先前克隆/注入函数的返回值。
manifest.json
{
"manifest_version": 2,
"name": "foo",
"version": "1.0.0",
"description": "Does something",
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content-script.js"]
}
]
}
content-script.js
function foo (obj) {
obj.x = {"xxx": 444};
}
window.wrappedJSObject.foo = exportFunction(foo, window);
页面脚本(可插入网页控制台)
foo({"sss": 333})
// Error: Not allowed to define cross-origin object as property on [Object] or [Array] XrayWrapper
深入浏览器控制台,我明白了:
"ObjectActor.prototype.grip previewer function threw an exception: Error: Permission denied to access object
Stack: PseudoArray@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/object.js:1797:16
ObjectActor.prototype.grip@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/object.js:131:15
WCA_objectGrip@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:483:12
createValueGrip@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/object.js:2187:14
WCA_createValueGrip@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:429:12
WCA_onEvaluateJS@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:900:21
WCA_onEvaluateJSAsync@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/actors/webconsole.js:857:20
onPacket@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/server/main.js:1743:15
ChildDebuggerTransport.prototype.receiveMessage@resource://gre/modules/commonjs/toolkit/loader.js -> resource://devtools/shared/transport/transport.js:761:7
Line: 0, column: 0"
我认为我没有完全理解 XRay 的行为,所以由于安全机制,我不确定这是否可能。
【问题讨论】:
-
请edit 成为主题的问题:包括一个完整 minimal reproducible example 重复问题。包括一个manifest.json,一些背景/内容/弹出脚本/HTML。寻求调试帮助的问题(“为什么这段代码不工作?”)必须包括:►期望的行为,►特定问题或错误和►必要的最短代码重现它在问题本身。没有明确问题陈述的问题对其他读者没有用处。请参阅:“如何创建 minimal reproducible example”、What topics can I ask about here? 和 How to Ask。
-
常规:您似乎希望从插入页面上下文的脚本中直接调用内容脚本中的函数。你不可以做这个。您需要在两个上下文之间传递消息。这意味着通信将是异步的。您可以从页面上下文中发送一条消息,该消息基本上说:请使用这些参数向我发送此函数的结果。但是,如果您想要做的是从覆盖的函数(在页面中)“秘密地”调用原始函数(在页面中),您可以这样做。
-
一个minimal reproducible example 表示完整,但最小。请提供复制问题所需的一切。对于 WebExtension,这几乎总是需要 manifest.json。通常这还包括复制问题所需的各种其他 JavaScript 和 HTML 文件。
-
需要minimal reproducible example 的原因是我们想提供帮助。如果我们不必重新创建复制问题所需的任何代码,那么提供帮助会要容易得多。这是您已经拥有的代码。因此,请帮助我们为您提供帮助并提供一个完整 minimal reproducible example 以重复该问题。如果没有minimal reproducible example,甚至开始帮助您所需的工作量要高得多,这显着减少了愿意/能够帮助您的人数。即使我们付出了额外的努力,我们也必须猜测您的问题的很大一部分。
-
由于导出函数的 XrayVision,这在某种程度上是可能的,但似乎我不允许将对象从内容脚本传递到页面脚本。即使我可以通过“cloneInto()”将对象从内容脚本导出到页面脚本。
标签: firefox-addon content-script firefox-addon-webextensions