2014-03-18 23 views
3

我使用addon-SDK構建Firefox插件。我需要跟蹤新標籤,並使用「在新標籤中打開鏈接」選項查看是否從另一標籤中的鏈接打開。跟蹤新的標籤是從主腳本很容易:Firefox插件,如何追蹤新標籤的來源?

var tabs = require("sdk/tabs"); 

tabs.on('open', function(tab){ 

    tab.on('ready', function(tab){ 
    //do stuff with the new tab 
    } 

} 

但我無法弄清楚是否有查不到說標籤的起源任何方式。我曾想過將腳本插入所有監聽上下文菜單事件或類似事件的選項卡,但感覺更像是破解而非解決方案。我在米無知中錯過了一些明顯的東西嗎?

回答

0

我希望當前激活的標籤是任何新標籤的產地在大多數情況下:

tabs.on('open', function(tab) { 
    var origin = tabs.activeTab; 
    // do something 
} 

我不知道這是否涵蓋所有情況。您可能需要測試一些事情,比如打開和激活異步打開的新選項卡或選項卡的鏈接(儘管默認情況下會被阻止)。

+0

這是我考慮的另一個解決方案,但用Ctrl + T打開的選項卡會觸發相同的事件,並使用此方法保存錯誤的原點。 Ctrl + T標籤應該沒有出處。 – sajirdalas

0

雖然我沒有測試它,你可以嘗試在上下文菜單中創建一個監聽器,如下:

const doc = require('sdk/window/utils').getMostRecentBrowserWindow().document; 
var openInTab = doc.getElementById('context-openlinkintab'); 
openInTab.addEventListener('click', callback); 

這假設默認事件偵聽器允許冒泡,假定該元素是隱藏的,顯示在使用之間而不是被銷燬和重新創建,並且當用戶cmd/ctrl單擊鏈接時可能不會被解僱,但這是我認爲將是一個hacky解決方案的一個步驟。

單擊該元素時觸發的函數名稱爲gContextMenu.openLinkInTab()。如果你可以在函數運行的時候啓動你的函數,那麼你就是金。雖然不太確定。

0

用戶以上willma和kapep推薦這兩種方法都存在缺陷

你的第一步是確定可以打開新的標籤頁(也許新窗口)

這裏是當一個新的不同情況的所有方法標籤被打開:

  1. 用戶中間點擊來自搜索欄或中間點擊搜索圖標去從地址欄圖標
  2. 用戶按下ALT +從搜索欄或URL欄中輸入
  3. 用戶插件安裝位置,如果你飛行在搜索欄或URL欄,然後中間點擊單擊並選擇「粘貼&搜索」將在新標籤中打開
  4. 用戶按下tab鍵來獲得一個鏈接,然後按Ctrl +進入新標籤中打開它
  5. 用戶右鍵點擊在新標籤頁的鏈接,並點擊打開
  6. 用戶TabSubmit插件和按鈕在新標籤頁(打開可能按Ctrl + Enter按鈕中點擊在新標籤中打開)
  7. 第三方應用程序在Firefox中打開鏈接(新標籤頁或新窗口)

如果用戶右鍵單擊一個鏈接,並說在新窗口中打開,您會使該窗口的父窗口成爲選項卡嗎?我知道肯定有一個fiefox xpcom函數來保存開啓器窗口,所以你可以找到父窗口。

添加其他方法來打開此列表中的新窗口/選項卡,然後我們將查找它們之間的通用性。即時通訊思考引用http-channel-modify-request和最後一個活動標籤(由kapep推薦)。

我可能會過度思考這個,我不知道。

+0

我的主要關注點是跟蹤用戶何時打開一個新標籤,因爲主要是點擊列表中的情況4或5。還有什麼我現在可以忽略的。我將對你評論的xpcom功能做一些研究,看看我是否能夠想出一些東西 – sajirdalas

+0

這將是一個不完整的插件兄弟你會受到投訴,我個人會列出它們並找到一個適合所有人的解決方案,而不是比代碼只有4和5,然後重新訪問併爲其他人編寫代碼,馬虎的代碼(可能是hacky甚至是越野車代碼)的開始。但完全取決於你。 – Blargh

+0

已注意。我會去你的清單,並嘗試找到某種排序或觸發器適用於所有情況 – sajirdalas