Get nsIDOMWindow of a Tab to do Text Input

2019-09-12 07:31发布

Is it possible to use Text Input Processor on a specific Tab of a Firefox window?

Do all the tabs share the same nsIDOMWindow object? If so, then is there any other solution?

Rephrasing my problem: I want to type text to a specific tab, and if there is more than one, then it might not be the current.

Below is an example code to write text on any Firefox window, but only for current tab:

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
    }
  }

}

1条回答
对你真心纯属浪费
2楼-- · 2019-09-12 08:07

nsIDOMWindow (+ various related interfaces like the docshell) is the XPCOM representation of regular window objects in the w3c specs. And since window objects can be nested (e.g. via iframes) so can be nsIDOMWindows. When you're accessing browser windows you're generally accessing the outer windows representing the browser chrome, not the content.

In principle you can access a tab's content window directly from its <browser> XUL element, but to be forward-compatible with e10s you should use framescripts instead.

查看更多
登录 后发表回答