gpt4 book ai didi

javascript - firefox 在 "sdk/system/events"api 中检测标签 ID

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:33:36 26 4
gpt4 key购买 nike

美好的一天。我在将 Chromium 扩展移植到 Firefox 时遇到问题。我需要检测所有传出请求和它所属的选项卡的 ID。检测我使用 system/events 的请求api,但我找不到如何从传入事件中检测选项卡 ID 的方法。据我了解,此事件是 xpcom 对象,我应该使用 QueryInterface 获取一些接口(interface)以获取其他接口(interface)以获取其他接口(interface)以获取其他接口(interface).....获取其他接口(interface)以从中获取选项卡的 ID(就像在 Windows 中的 COM 实现一样),但我找不到我需要的接口(interface),根本找不到关于此事件的文档...

我在 chromium 中使用的代码:

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 的代码片段.那里的代码似乎已损坏,但我使用了其中的一些代码来创建此函数以从 channel 获取标签。

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

使用system/events时,似乎有一个问题是在窗口切换时监听失败。使用 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.

关于javascript - firefox 在 "sdk/system/events"api 中检测标签 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25194928/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com