2016-12-09 10 views
0

Наш Firefox-аддон выдает запросы Google на бэкэнд (main.js), а затем извлекает некоторый контент через xpath. Для этой цели мы используем innerHTML для создания экземпляра document для синтаксического анализа xpath. Но когда мы подчиняемся этот аддон к Mozilla, мы получили отклонены, потому что:Как использовать `nsIParserUtils.parseFragment()` для Firefox addon

Этот аддон создает DOM узлы из HTML-строк, содержащих потенциально unsanitized данные, сопоставляя innerHTML, jQuery.html, или через аналогичные средства. Помимо неэффективности, это серьезный риск для безопасности. Для получения дополнительной информации см 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.

Я много гулял, но не нашел решения. Может кто-нибудь любезно помочь?

+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