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

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

我正在维护 Firefox 的覆盖附加组件。要通过 Mozilla 的附加组件验证过程,我必须替换 innerHTML() 调用来操纵 DOM 元素的内容。

我创建了一个 table 的新单元格,并想使用这种方法设置内容:

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 是一种 cross process object wrapper, which means it comes from a child process, or at least from a message passing API. You're not accessing the DOM in an e10s-safe 方式。

div-0: [object XULElement]

此外,您正在创建一个 XUL 元素(特定于 mozilla 的 XML 命名空间)并试图将其插入 HTML 文档中。这意味着您正在跨文档边界操作(CPOW 已经暗示了这一点)。您本地范围内的 document 对象不是 tblownerDocument

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


如果您想与内容文档的 DOM 交互,您应该使用 message manager and frame scripts。它们是支持 Addon SDK 和 webextension 内容脚本的低级原语。

此外,您可以设置 <em:multiprocessCompatible>true</em:multiprocessCompatible> flag in the install.rdf,这将禁用兼容性垫片或在 about:config 中启用 dom.ipc.shims.enabledWarnings,这将导致抛出 warnings/errors如果您试图访问任何不安全的 API,请尽快。