编程语言
首页 > 编程语言> > javascript – “sdk / system / events”api中的firefox检测选项卡ID

javascript – “sdk / system / events”api中的firefox检测选项卡ID

作者:互联网

美好的一天.
我有将chrome扩展移植到firefox的问题.
我需要检测它所属的所有传出请求和标签的ID.
使用system/events api检测请求,但是我找不到如何从incomming事件中检测tab的id的方法.据我所知,这个事件是xpcom对象,我应该使用QueryInterface获取一些接口来获取一些其他接口以获得一些其他接口以获得一些其他接口来获取其中的tab的id(就像在Windows中的COM实现一样,但我找不到我需要的接口,根本无法找到有关此事件的文档…

我在铬中使用的代码:

chrome.webRequest.onBeforeRequest.addListener(
 function(info) {
     if(info.tabId)
         //do stuff here
 }

所以这就是我想要从firefox实现的…

我目前为firefox编写的代码:

exports.main = function(options)
{
    //stuf here ....
    ........
    function listener(event)
    {
        var channel = event.subject.QueryInterface(Ci.nsIHttpChannel);
        console.log(channel);
        //TODO: get tab here somehow
    }
    events.on("http-on-opening-request", listener);
}

我已经看了几天的xpcom文档,但仍然没有足够的信息来实现这个简单的事情…所以如果有人成功,请帮助.

解决方法:

我刚刚找到了getting the browser that fires the http-on-modify-request notification的代码片段.那里的代码似乎已被破坏,但我使用其中一些来创建此函数以从频道获取选项卡.

const getTabFromChannel = (aChannel) => {
  try {
    let notificationCallbacks = aChannel.notificationCallbacks || aChannel.loadGroup.notificationCallbacks;
    if (!notificationCallbacks)
      return null;

    let domWin = notificationCallbacks.getInterface(Ci.nsIDOMWindow);
    let chromeTab = tabsUtils.getTabForContentWindow(domWin);
    return getSdkTabFromChromeTab(chromeTab);
  }
  catch (e) {
    // some type errors happen here, not sure how to handle them
    console.log(e);
    return null;
  }
} 

此功能将低级选项卡转换为高级选项卡.根据您需要的那个,当然可以跳过这个功能.同样,在最新的SDK中,您可以使用tabs.viewFor(chromeTab)替换它.

const tabs = require("sdk/tabs");
const tabsUtils = require("sdk/tabs/utils");

const getSdkTabFromChromeTab = (chromeTab) => {
  const tabId = tabsUtils.getTabId(chromeTab);
  for each (let sdkTab in tabs){
    if (sdkTab.id === tabId) {
      return sdkTab;
    }
  }
  return null;
};

在使用系统/事件时,在窗口之间切换时,监听器似乎存在问题.请改用Services.obs.addObserver:

const httpRequestObserver = {
    observe: function (subject, topic, data) {
        var channel = subject.QueryInterface(Ci.nsIHttpChannel);
        console.log("channel");
        var tab = getTabFromChannel(channel);
        if(tab) {
          console.log("request by tab", tab.id);
        }
    }
}

exports.main = function() {
  Cu.import('resource://gre/modules/Services.jsm');
  Services.obs.addObserver(httpRequestObserver, 'http-on-opening-request', false);
}

我只能希望它适用于您需要检测的所有请求.该文档已经提到了一些不起作用的情况:

Note that some HTTP requests aren’t associated with a tab; for example, RSS feed updates, extension manager requests, XHR requests from XPCOM components, etc.

标签:xpcom,javascript,firefox,firefox-addon-sdk
来源: https://codeday.me/bug/20190728/1561638.html