2016-12-09 90 views
0

我們的Firefox插件在後端向Google發送查詢(main.js),然後通過xpath提取一些內容。爲此,我們使用innerHTML爲xpath解析創建document實例。但是,當我們提出這個插件Mozilla的,我們得到了拒絕,因爲:如何使用nsIParserUtils.parseFragment()用於Firefox插件

這個插件是由含有潛在unsanitized數據HTML字符串創建DOM節點,將其分配給innerHTML的,jQuery.html,或通過類似手段。除了效率低下之外,這是一個主要的安全風險。欲瞭解更多信息,請參閱https://developer.mozilla.org/en/XUL_School/DOM_Building_and_HTML_Insertion

以下提供的鏈接,我們試圖用nsIParserUtils.parseFragment()更換innerHTML。然而,示例代碼:

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

Cc, Ci實用程序只能在main.js使用,而函數需要一個documentdoc)作爲參數。 但我們找不到任何關於在main.js內部創建document的例子,我們無法使用document.implementation.createHTMLDocument("");。因爲main.js是後臺腳本,它沒有引用全局內置document

我搜索了很多,但仍找不到任何解決方案。有人可以幫忙嗎?

+1

主腳本訪問多個''元素。您選擇的內容很大程度上取決於您希望該文檔存在的命名空間(XUL或HTML,以及其他可能性),還是您需要''的目的。一個側面的問題是,在「」中沒有構建「全局」;有很多''元素(每個標籤+其他至少一個以上)。 [這個答案](http://stackoverflow.com/a/29228418/3773011)的代碼可以得到當前瀏覽器窗口的引用* a *''和* a *''。 – Makyen

回答

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