我想替换innerHTML()调用在Firefox覆盖插件

I want to replace innerHTML() call in a Firefox overlay addon

本文关键字:Firefox 覆盖 插件 调用 替换 innerHTML      更新时间:2023-09-26

我正在为Firefox维护一个覆盖插件。为了通过Mozilla的Add-on验证过程,我必须替换操作DOM元素内容的innerHTML()调用。

我创建了一个表的新单元格,并希望使用以下方法设置内容:

var newCell = tbl.rows[row].insertCell(col);
var div = document.createElement('div');
div.appendChild(document.createTextNode(content));
newCell.appendChild(div);

错误信息是:

TypeError: Argument 1 of Node.appendChild does not implement interface Node.
EventTargetChild.prototype.handleEvent@resource://gre/modules/RemoteAddonsChild.jsm:461:5
EventTargetChild/this.capturingHandler@resource://gre/modules/RemoteAddonsChild.jsm:431:38

在行间添加日志消息显示新celldiv元素的类型不同:

var newCell = tbl.rows[row].insertCell(col);
console.log("cell-0: " + newCell);
var div = document.createElement('div');
console.log("div-0: " + div);
div.appendChild(document.createTextNode(content));
console.log("div-1: " + div);
console.log("cell-1: " + newCell);
newCell.appendChild(div);
console.log("cell-2: " + newCell);

日志消息如下:

cell-0: [object CPOW [object HTMLTableCellElement]]
div-0: [object XULElement]
div-1: [object XULElement]
cell-1: [object CPOW [object HTMLTableCellElement]]

你知道我在这里做错了什么吗?

cell-0: [object CPOW [object HTMLTableCellElement]]

CPOW是一个跨进程对象包装器,这意味着它来自子进程,或者至少来自消息传递API。你没有以安全的方式访问DOM。

div-0: [object XULElement]

更重要的是,您正在创建一个XUL元素(特定于mozilla的XML名称空间)并试图将其插入HTML文档中。这意味着您正在跨文档边界操作(CPOW已经暗示了这一点)。本地作用域中的document对象不是tbl的ownerDocument。

因此,即使跨进程问题不存在,您仍然会错误地使用DOM。


如果您想与内容文档的DOM交互,您应该使用消息管理器和框架脚本。它们是支持插件SDK和web扩展内容脚本的低级原语。

另外,您可以在安装中设置<em:multiprocessCompatible>true</em:multiprocessCompatible>标志。它将禁用兼容性shims或在about:config中启用dom.ipc.shims.enabledWarnings,如果您试图访问任何不安全的API,这将导致更快抛出警告/错误。