我们的Firefox插件会在后端(main.js
)向Google发出查询,然后通过xpath提取一些内容。为此,我们使用innerHTML
为xpath解析创建document
实例。但是当我们将这个插件提交给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
)作为参数。 但我们找不到有关在document
内创建main.js
的任何示例,我们无法使用document.implementation.createHTMLDocument("");
。因为main.js
是一个后台脚本,它没有引用全局内置document
。
我google了很多,但仍然找不到任何解决方案。有人可以帮忙吗?
答案 0 :(得分: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