2017-02-23 27 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 } 
相關問題