2017-02-23 59 views
0

我开发了一个Chrome扩展,并试图使用Firefox WebExtensions将其移植到Firefox。如何在Firefox WebExtensions中获得openerTabId?

这是我面临的问题。在我的扩展中,我需要使用chrome.tabs.Tab.openerTabId,这是Firefox WebExtensions不支持的(请参阅documentation)。

,我想出了一个解决办法,让自己openerTabId,在当前窗口查询活动标签:

chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { 
    // tabs has only one element, which is the one I just opened 
}); 

但它不工作,因为这个查询的结果,是我刚打开的标签,而不是我之前点击新标签按钮

现在我想查询活动标签之前,我点击新建标签按钮,但我没有看到chrome.tabs.query()lastFocusedTab中的任何参数。

这可以通过chrome.tabs.query()完成吗?或者有没有其他方法可以做到这一点?

可能的重复:tab.openerTabId undefined in Firefox WebExtension。不幸的是,这个人是不是:-(解决。

回答

0

正如你已经确定,火狐does not supporttabs.Tab.openerTabId

你将不得不自己跟踪这个信息,你可以跟踪由打开的标签开门红标签ID用户通过点击一个链接,当一个新的标签由JavaScript创建时,你可以猜测它是由JavaScript在活动标签中完成的,但你不知道,你可以通过跟踪当前活动标签,监听新标签的创建,并听取新标签创建的原因是因为用户点击了链接。这可以通过以下方式完成:

  • tabs.onActivated跟踪当前活动选项卡
    这是在tabs.onCreated之前触发的,因此您需要保留先前活动选项卡的记录。对于新打开的标签立即激活的情况,这将是需要的。显然,您还需要考虑新选项卡未立即激活的情况。
  • tabs.onCreated确定何时创建新选项卡。
  • webNavigation.onCommittedtransitionType地看到,新的标签实际上是从link创建的,而不是仅仅发生在用户打开从书签的新标签,等
是活动标签

作为参考,这些是火灾的事件,当用户点击链接(<a href="http://www.example.com" target="_blank">)上:

Content event: mousedown on: <a href="http://www.example.com" target="_blank"> contentMessageUI.js:16:9 
Content event: mouseup on: <a href="http://www.example.com" target="_blank"> contentMessageUI.js:16:9 
Content event: click  on: <a href="http://www.example.com" target="_blank"> contentMessageUI.js:16:9 
tabs.onActivated     -> arg[0]= Object { tabId: 8, windowId: 0 } 
tabs.onHighlighted    -> arg[0]= Object { tabIds: Array[1], windowId: 0 } 
tabs.onUpdated     -> arg[0]= 8 :: arg[1]= Object { status: "complete" } :: arg[2]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onUpdated     -> arg[0]= 8 :: arg[1]= Object { status: undefined } :: arg[2]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onZoomChange     -> arg[0]= Object { tabId: 8, oldZoomFactor: undefined, newZoomFactor: 1, zoomSettings: Object } 
tabs.onUpdated     -> arg[0]= 8 :: arg[1]= Object { status: "complete", url: "about:blank" } :: arg[2]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onUpdated     -> arg[0]= 8 :: arg[1]= Object { status: undefined } :: arg[2]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onUpdated     -> arg[0]= 8 :: arg[1]= Object { status: "loading" } :: arg[2]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "loading", incognito: false, width: 1100, 5 more… } 
tabs.onCreated     -> arg[0]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "loading", incognito: false, width: 1100, 5 more… } 
webNavigation.onBeforeNavigate -> arg[0]= Object { url: "about:blank", timeStamp: 1487869034364, frameId: 0, parentFrameId: -1, tabId: 8 } 
webNavigation.onErrorOccurred  -> arg[0]= Object { url: "about:blank", timeStamp: 1487869034368, frameId: 0, parentFrameId: -1, error: "Error code 2152398850", tabId: 8 } 
webNavigation.onCommitted   -> arg[0]= Object { url: "about:blank", timeStamp: 1487869034377, frameId: 0, parentFrameId: -1, tabId: 8, transitionType: "link", transitionQualifiers: Array[0] } 
webNavigation.onBeforeNavigate -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487869034380, frameId: 0, parentFrameId: -1, tabId: 8 } 
webRequest.onBeforeRequest  -> arg[0]= Object { requestId: "150", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487869034382, frameId: 0, parentFrameId: -1, tabId: 8 } 
webRequest.onBeforeSendHeaders -> arg[0]= Object { requestId: "150", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487869034384, frameId: 0, parentFrameId: -1, tabId: 8, requestHeaders: Array[6] } 
webRequest.onSendHeaders   -> arg[0]= Object { requestId: "150", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487869034387, frameId: 0, parentFrameId: -1, tabId: 8, requestHeaders: Array[6] } 
webRequest.onHeadersReceived  -> arg[0]= Object { requestId: "150", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487869034416, frameId: 0, parentFrameId: -1, tabId: 8, responseHeaders: Array[11], 2 more… } 
webRequest.onResponseStarted  -> arg[0]= Object { requestId: "150", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487869034420, frameId: 0, parentFrameId: -1, tabId: 8, responseHeaders: Array[11], 2 more… } 
webRequest.onCompleted   -> arg[0]= Object { requestId: "150", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487869034429, frameId: 0, parentFrameId: -1, tabId: 8, responseHeaders: Array[11], 2 more… } 
tabs.onUpdated     -> arg[0]= 8 :: arg[1]= Object { status: "loading", url: "http://www.example.com/" } :: arg[2]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "loading", incognito: false, width: 1100, 5 more… } 
webNavigation.onCommitted   -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487869034538, frameId: 0, parentFrameId: -1, tabId: 8, transitionType: "link", transitionQualifiers: Array[0] } 
tabs.onUpdated     -> arg[0]= 8 :: arg[1]= Object { status: "complete" } :: arg[2]= Object { id: 8, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
webNavigation.onDOMContentLoaded -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487869034710, frameId: 0, parentFrameId: -1, tabId: 8 } 
webNavigation.onCompleted   -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487869034715, frameId: 0, parentFrameId: -1, tabId: 8 } 

看来,transitionType也将是link当凸片通过JavaScript打开(假设用户已经允许它)。以下是window.open('http://www.example.com');打开新选项卡时的事件(通过在DevTools控制台中为内容页执行该选项卡,在允许来自该域的弹出窗口后执行模拟):

tabs.onActivated     -> arg[0]= Object { tabId: 11, windowId: 0 } 
tabs.onHighlighted    -> arg[0]= Object { tabIds: Array[1], windowId: 0 } 
tabs.onUpdated     -> arg[0]= 11 :: arg[1]= Object { status: "complete" } :: arg[2]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onUpdated     -> arg[0]= 11 :: arg[1]= Object { status: undefined } :: arg[2]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onZoomChange     -> arg[0]= Object { tabId: 11, oldZoomFactor: undefined, newZoomFactor: 1, zoomSettings: Object } 
tabs.onUpdated     -> arg[0]= 11 :: arg[1]= Object { status: "complete", url: "about:blank" } :: arg[2]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onUpdated     -> arg[0]= 11 :: arg[1]= Object { status: undefined } :: arg[2]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
tabs.onUpdated     -> arg[0]= 11 :: arg[1]= Object { status: "loading" } :: arg[2]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "loading", incognito: false, width: 1100, 5 more… } 
tabs.onCreated     -> arg[0]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "loading", incognito: false, width: 1100, 5 more… } 
webNavigation.onBeforeNavigate -> arg[0]= Object { url: "about:blank", timeStamp: 1487871931270, frameId: 0, parentFrameId: -1, tabId: 11 } 
webNavigation.onErrorOccurred  -> arg[0]= Object { url: "about:blank", timeStamp: 1487871931274, frameId: 0, parentFrameId: -1, error: "Error code 2152398850", tabId: 11 } 
webNavigation.onCommitted   -> arg[0]= Object { url: "about:blank", timeStamp: 1487871931289, frameId: 0, parentFrameId: -1, tabId: 11, transitionType: "link", transitionQualifiers: Array[0] } 
webNavigation.onBeforeNavigate -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487871931292, frameId: 0, parentFrameId: -1, tabId: 11 } 
webRequest.onBeforeRequest  -> arg[0]= Object { requestId: "159", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487871931294, frameId: 0, parentFrameId: -1, tabId: 11 } 
webRequest.onBeforeSendHeaders -> arg[0]= Object { requestId: "159", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487871931297, frameId: 0, parentFrameId: -1, tabId: 11, requestHeaders: Array[6] } 
webRequest.onSendHeaders   -> arg[0]= Object { requestId: "159", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487871931299, frameId: 0, parentFrameId: -1, tabId: 11, requestHeaders: Array[6] } 
webRequest.onHeadersReceived  -> arg[0]= Object { requestId: "159", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487871931312, frameId: 0, parentFrameId: -1, tabId: 11, responseHeaders: Array[11], 2 more… } 
webRequest.onResponseStarted  -> arg[0]= Object { requestId: "159", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487871931317, frameId: 0, parentFrameId: -1, tabId: 11, responseHeaders: Array[11], 2 more… } 
webRequest.onCompleted   -> arg[0]= Object { requestId: "159", url: "http://www.example.com/", originUrl: "http://www.example.com/", method: "GET", type: "main_frame", timeStamp: 1487871931329, frameId: 0, parentFrameId: -1, tabId: 11, responseHeaders: Array[11], 2 more… } 
tabs.onUpdated     -> arg[0]= 11 :: arg[1]= Object { status: "loading", url: "http://www.example.com/" } :: arg[2]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "loading", incognito: false, width: 1100, 5 more… } 
history.onVisited     -> arg[0]= Object { id: "fGv8w_MX50EI", url: "http://www.example.com/", title: "", lastVisitTime: 1487871931320, visitCount: 4, typedCount: 1 } 
webNavigation.onCommitted   -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487871931480, frameId: 0, parentFrameId: -1, tabId: 11, transitionType: "link", transitionQualifiers: Array[0] } 
tabs.onUpdated     -> arg[0]= 11 :: arg[1]= Object { status: "complete" } :: arg[2]= Object { id: 11, index: 2, windowId: 0, selected: true, highlighted: true, active: true, pinned: false, status: "complete", incognito: false, width: 1100, 5 more… } 
webNavigation.onDOMContentLoaded -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487871931652, frameId: 0, parentFrameId: -1, tabId: 11 } 
webNavigation.onCompleted   -> arg[0]= Object { url: "http://www.example.com/", timeStamp: 1487871931657, frameId: 0, parentFrameId: -1, tabId: 11 } 
相关问题