使用pageMod
,我为每个页面添加了一个工作者。通常,我可以使用activeTab
找到与workers[i].tab == activeTab
匹配的工作人员。
但是,我注意到如果我将标签拉出到新窗口,worker.tab
变得不确定,那就不好了。
pageMod.PageMod({
include: "*",
contentScriptWhen: "ready",
contentScriptFile: ["./trace.js", "./utils.js","./pageWorker.js"],
// attachTo: ["existing", "top"],
onAttach: function(pageWorker) {
attachPageWorker(pageWorker);
pageWorker.on('detach', function() {
detachPageWorker(pageWorker);
});
}
});
例如,当我打开两个页面时,标签ID为-5-1
和-5-2
,并且工作人员具有匹配的标记-5-1
和-5-2
。
如果我将标签拉出到新窗口,则标签变为-5-1
和-35-1
,并且工作人员标签为-5-1
和undefined
。
如果我将拉出的标签推回到第一个窗口,则标签为-5-1
和-5-3
,工作人员仍为-5-1
和undefined
。
function getPageWorkers(tab) {
var result = [];
for (let tab of tabs) {
console.log(tab.id);
}
for (var i = pageWorkers.length - 1; i >= 0; i--) {
console.log(pageWorkers[i].tab.id)
if (pageWorkers[i].tab === tab) {
result.push(pageWorkers[i]);
}
}
return result;
}
也许我需要附加一个额外的事件:
pageWorker.on('moveToAnotherWindow',...)
更新。当拖出完成后(这是在Windows中),会触发两个事件,pagehide
和pageshow
。此时worker.tab.id
为undefined
。
console.log: attaching pageWorker in -5-1
console.log: showing page in -5-1
console.log: attaching pageWorker in -5-2
console.log: showing page in -5-2
<drag happens here>
console.log: hiding page in undefined
console.log: showing page in undefined
更新2。当您将标签移动到新窗口时,worker.tab = false
!
console.log: attaching pageWorker in tab.id -5-1
console.log: showing page in tab.id -5-1
console.log: pageWorker.tab: constructor {}
console.log: attaching pageWorker in tab.id -5-2
console.log: showing page in tab.id -5-2
console.log: pageWorker.tab: constructor {}
<drag happens here>
console.log: hiding page in tab.id undefined
console.log: pageWorker.tab: false
console.log: showing page in tab.id undefined
console.log: pageWorker.tab: false
console.log: activeTab: -45-1
console.log: tabs:
console.log: -5-1
console.log: -45-1
console.log: workers
console.log: undefined
console.log: -5-1
console.log: Error: no pageWorkers match activeTab
更新3。当你在新窗口中终止新选项卡时,会调用detach两次。
更新4。即使使用.tab = false
,如果我在工作人员上使用port.emit
,它也会响应。
更新5。最小,完整且可验证的示例。使用jpm run
启动Firefox并在两个标签中转到Google。然后拖出其中一个标签。