我尝试使用Firefox SDK将现有Chrome扩展程序转换为其Firefox扩展程序。
我的插件需要检测Gmail(mail.google.com)是否在当前标签中处于打开/活动状态,如果没有,则在特定情况下启动监听器,以便每当有时都会向Gmail添加一些参数用户将打开Gmail标签页。
为了更清楚,这是我的代码在Chrome中的样子:
background.js [Chrome扩展程序]
// Reload Gmail Tab(s)
function reloadTab(order, behavior) {
chrome.tabs.query({ currentWindow: true }, function(tabs) {
var countGmailTabs = 0,
ntabs = tabs.length;
for (var i = 0; i < ntabs; i++) {
var t = tabs[i].url;
// Gmail found !
if ( /mail.google.com/g.test(t) ) {
countGmailTabs += 1;
if(behavior === 'noisy') {
var GmailTab = tabs[i];
// Do something...
} else {
// Reload Tab
chrome.tabs.reload(tabs[i].id);
}
}
}
// Gmail not found !
if (countGmailTabs < 1 && behavior === 'noisy') {
// Start listener
chrome.tabs.onUpdated.addListener( GmailListener );
}
});
}
// Gmail listener
function GmailListener (tabId, info, tab) {
if ( /mail.google.com/g.test(tab.url) && info.status === 'loading' ) {
// Do something...
// Now, let's relieve ourselves from our listener duties
chrome.tabs.onUpdated.removeListener(GmailListener);
return;
}
}
我在Firefox中的代码目前看起来像这样。当没有检测到Gmail标签时,棘手的部分是为标签实现一个监听器...任何帮助表示赞赏!
main.js [Firefox附加组件]
var tabs = require('sdk/tabs')
// [...]
// Reload Gmail Tab(s)
function reloadTab(order, behavior) {
var countGmailTabs = 0,
ntabs = tabs.length;
for (var i = 0; i < ntabs; i++) {
var t = tabs[i].url;
// Gmail found !
if ( /mail.google.com/g.test(t) ) {
countGmailTabs += 1;
if(behavior === 'mute') {
var GmailTab = tabs[i];
// Do something...
} else {
tabs[i].reload();
}
}
}
// Gmail not found !
if (countGmailTabs < 1 && behavior === 'noisy') {
GmailTabListener(order);
}
}
// Gmail Listener (the tricky part)
function GmailTabListener( action ) {
tabs.on('open', function(tab){
tab.on('ready', function(tab){
if ( /mail.google.com/g.test(tab.url) ) {
// Do something...
return;
}
});
});
}
答案 0 :(得分:2)
如果找不到gmail标签,则需要创建PageMod,如下所示:
var pageMod = require('sdk/page-mod').PageMod({
include: '*.gmail.com',
attachTo: 'existing', // See comment below
onAttach: GmailListener
});
function GmailListener (worker) {
var tab = worker.tab;
var Id = tab.index;
// Not sure what 'info' is
pageMod.destroy();
// Do something
}
虽然我没有对其进行测试,但您可以添加attachTo: 'existing'
,只要您的// Do something
功能在两种情况下都相同,您甚至不需要循环切换选项卡。