【问题标题】:How to use `nsIParserUtils.parseFragment()` for Firefox addon如何在 Firefox 插件中使用 `nsIParserUtils.parseFragment()`
【发布时间】:2016-12-09 22:23:53
【问题描述】:

我们的 Firefox 插件在后端向 Google 发出查询 (main.js),然后通过 xpath 提取一些内容。为此,我们使用innerHTML 创建一个document 实例用于xpath 解析。但是当我们将此插件提交给 Mozilla 时,我们被拒绝了,因为:

此插件通过分配给 innerHTML、jQuery.html 或通过类似方式,从包含可能未经处理的数据的 HTML 字符串创建 DOM 节点。除了效率低下,这是一个主要的安全风险。欲了解更多信息,请参阅https://developer.mozilla.org/en/XUL_School/DOM_Building_and_HTML_Insertion

按照提供的链接,我们尝试将innerHTML 替换为nsIParserUtils.parseFragment()。但是,示例代码:

let { Cc, Ci } = require("chrome");
function parseHTML(doc, html, allowStyle, baseURI, isXML) {
  let PARSER_UTILS = "@mozilla.org/parserutils;1";
  ...

Cc, Ci 实用程序只能用于main.js,而该函数需要document (doc) 作为参数。 但我们找不到任何关于在main.js 中创建document 的示例,我们无法在其中使用document.implementation.createHTMLDocument("");。因为main.js是后台脚本,没有引用全局内置的document

我搜索了很多,但仍然找不到任何解决方案。有人可以帮忙吗?

【问题讨论】:

  • 您的主脚本可以访问多个<document> 元素。您选择哪个很大程度上取决于您希望该文档存在的名称空间(XUL 或 HTML,以及其他可能性),或者您需要 <document> 的目的。一个附带问题是<document> 中没有内置“全局”;有很多 <document> 元素(每个选项卡至少一个以上+其他)。 This answer 的代码将获得对当前浏览器窗口的 a <window>a <document> 的引用。

标签: security firefox firefox-addon firefox-addon-sdk innerhtml


【解决方案1】:

您可能想改用nsIDOMParser,这与可在窗口全局变量中访问的标准DOMParser 相同,只是您可以在没有窗口对象的特权上下文中使用它。

尽管如果您不提供自己的元素,这会给您一个包含合成 <html><body> 元素的完整文档。如果你绝对需要一个片段,你可以使用 html5 模板元素通过 domparser 提取一个片段:

let partialHTML = "foo <b>baz</b> bar"
let frag = parser.parseFromString(`<template>${partialHTML}</template>`, 'text/html').querySelector("template").content

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-22
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多