获取选项卡的 nsIDOMWindow 以进行文本输入

Get nsIDOMWindow of a Tab to do Text Input

是否可以在 Firefox 的特定选项卡上使用文本输入处理器 window?

是否所有选项卡都共享同一个 nsIDOMWindow 对象?如果是,还有其他解决办法吗?

重新表述我的问题:我想在特定选项卡中输入文本,如果有多个选项卡,则可能不是当前选项卡。

下面是在任何 Firefox window 上编写文本的示例代码,但仅适用于当前选项卡:

function myTestFunc() {
  // var windows = Services.wm.getEnumerator("navigation:browser");
  var windows = require("sdk/windows");
  for (let browserWindow of windows.browserWindows)  {
    //console.log(window.title);
    var chromeWindow = viewFor(browserWindow);
    console.log(chromeWindow.document.location.href);
    var idomWindow = chromeWindow.QueryInterface(Ci.nsIDOMWindow);

    var TIP = Cc["@mozilla.org/text-input-processor;1"].
              createInstance(Ci.nsITextInputProcessor);
    if(!TIP.beginInputTransaction(idomWindow, onNotifyImpl))  {
      console.log("Error TIP can't start");
      continue;
    }
    TIP.setPendingCompositionString("foo-bar-buzz");
    if (!TIP.flushPendingComposition()) {
      console.log("Failed to flush");
      continue; // Composition is not started
    }
  }

}

nsIDOMWindow(+各种相关接口,如 docshell)是 w3c 规范中常规 window 对象的 XPCOM 表示。由于 window 对象可以嵌套(例如通过 iframe),因此 nsIDOMWindows 也可以。当您访问浏览器 windows 时,您通常访问的是代表浏览器 chrome 的外部 windows,而不是内容。

原则上,您可以直接从其 <browser> XUL 元素访问选项卡的内容 window,但要与 e10s 向前兼容,您应该改用 framescripts