0

我被要求通过Mozilla附加评论者通过名为parseHTML的函数将一些HTML从我的服务器发送到我的Firefox附加组件。有关的方法记录在​​中。安全使用远程HTML

但是在我的内容脚本中,typeof parseHTML == "undefined"。我相信这是因为我的加载项是使用附加SDK而不是XUL构建的。

使用SDK构建的加载项无法访问此方法是正确的吗? SDK中是否有等效的方法?

+0

当然这个函数没有定义 - 它的源代码在你链接的教程中被引用。您真正需要的是[nsIParserUtils](https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIParserUtils),这是您的加载项代码(而非内容脚本)可以访问的内容。那么,HTML代码是否会通过您的附加代码?请注意,虽然XUL学校教程是旧的 - 您链接到的特定文档是非常新的和非常新的。 –

+0

不,它是从内容脚本中的JS模板构建的。这听起来像我不得不在内容脚本的运行时编译模板,发送消息给附加代码,传递html字符串。清理html字符串,然后将其传递回内容脚本进行渲染?听起来很有趣:-) –

+0

或者也许改变模板机制(不知道你在那里使用什么),以便它不处理原始的HTML代码?如果你可以使用'.textContent'来填充动态数据,那么它将是安全的,没有任何消毒。 –

回答

1

当然这个函数是未定义的 - 它不是一些全局定义的帮助器,而是您必须在代码中定义的东西(如代码示例中所示)。它使用您需要访问的nsIParserUtils interface。在基于SDK扩展你会使用chrome authority为:

var {Cc, Ci} = require("chrome"); 
var parser = Cc["@mozilla.org/parserutils;1"].getService(Ci.nsIParserUtils); 
var sanitized = parser.sanitize(html, parser.SanitizerAllowStyle); 

如果你是一个内容脚本,那么你不能使用,当然 - 你需要的HTML代码发送到附加,消毒它在那里并将其发送回内容脚本。虽然这是一个选项,但您可能需要考虑其他可能性,例如首先不使用innerHTML(如果您只需要在元素上设置一些文本,那么textContent是安全的选择)。

附注:虽然XUL教程相当古老,但这一特定页面仅在一年前被导入到MDN中 - 并且自从根据历史记录定期更新之后。所以它是最新的,只是不意味着明确的附加SDK(像大多数MDN文章实际上)。