我想替换 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
在行之间添加日志消息显示新 cell
和 div
元素的类型不同:
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
对象不是 tbl
的 ownerDocument。
因此,即使不存在跨进程问题,您仍然会错误地使用 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,请尽快。
我正在维护 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
在行之间添加日志消息显示新 cell
和 div
元素的类型不同:
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
对象不是 tbl
的 ownerDocument。
因此,即使不存在跨进程问题,您仍然会错误地使用 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,请尽快。