2010-06-26 11 views
7

मैं Google क्रोम एक्सटेंशन में दिए गए टैब के ओपनर (पैरेंट टैब) को निर्धारित करने का एक तरीका ढूंढ रहा हूं।क्या Google क्रोम एक्सटेंशन में टैब के सलामी बल्लेबाज को निर्धारित करना संभव है?

मैंने टैब के लिए दस्तावेज देखा है लेकिन वास्तव में ऐसा कुछ भी नहीं लगता है जो इस जानकारी को उत्पन्न करेगा। http://code.google.com/chrome/extensions/tabs.html

मैं पन्नों में इस सामग्री स्क्रिप्ट (सोच मैं अपने पृष्ठभूमि पृष्ठ पर एक मान दे सकते हैं) इंजेक्शन लगाने की कोशिश की है:

alert(window.opener); 

.. लेकिन यह सिर्फ अशक्त अर्जित करता है।

सबसे अच्छी चीज जो मैंने अभी तक की है, वर्तमान में केंद्रित टैब का ट्रैक रखना है, और जब भी कोई नया टैब बनाया जाता है, तो बस मान लें कि केंद्रित टैब नए टैब के सलामी बल्लेबाज/पैरेंट है। मेरा मानना ​​है कि यह de facto बैकग्राउंड टैब को सही ढंग से सही समय से पहचानता है क्योंकि पृष्ठभूमि टैब शायद ही कभी नए पृष्ठों को खोलने की अनुमति है। हालांकि, ऐसा लगता है कि यह कभी-कभी खराब और संभावित रूप से गलत होता है - उदाहरण के लिए, यदि एक और एक्सटेंशन ने एक नया टैब खोला है, तो यह विधि नए टैब के सलामी बल्लेबाज को गलत पहचान सकती है।

+0

क्या मैं पूछ सकता हूं कि आप किस प्रकार का एक्सटेंशन बना रहे हैं? मैं एक बहुत ही सरल खोज रहा हूं जिसमें यह सटीक कार्यक्षमता बहुत आसानी से होगी: जब भी मुझे संदेह होता है कि 'मैं कहां से आया हूं' या क्या खोला गया है, तो मैं वर्तमान टैब के अभिभावक को जानना चाहता हूं। क्या किसी भी मौके से आपका विस्तार मेरे लिए उस प्रश्न का उत्तर दे सकता है? या यहां तक ​​कि यदि नहीं, तो शायद आप एक समान एक्सटेंशन के बारे में जानते हैं? – Wizek

उत्तर

6

अद्यतन: यह अब मज़बूती से एक Chrome एक्सटेंशन के भीतर एक टैब के खोलने वाले टैब निर्धारित करने के लिए मूल रूप से नए जोड़े webNavigation एपीआई का उपयोग संभव है, और विशेष रूप से onCreatedNavigationTarget घटना hooking द्वारा।

https://code.google.com/chrome/extensions/trunk/webNavigation.html

2

क्रोम ने एक प्रयोगात्मक विस्तार API जोड़ा है जो इसे पूरा कर सकता है - विशेष रूप से webNavigation.onBeforeRetarget। http://code.google.com/chrome/extensions/experimental.webNavigation.html

हालांकि यह अभी भी प्रयोगात्मक है (क्रोम स्थिर संस्करणों में उपयोग करने योग्य नहीं है या क्रोम वेब स्टोर पर रिलीज़ करने योग्य नहीं है) मैं एक और दृष्टिकोण का उपयोग कर समाप्त हो गया हूं।

मूल रूप से

:

content_script.js में:

chrome.extension.sendRequest({ 
    request: { 
     op: "pageLoadStarted", 
     url: document.location.href, 
     referrer: document.referrer 
    } 
}); 

background.html में:

chrome.extension.onRequest.addListener(function(request, sender, sendResponse) { 
    console.log('onRequest: ' + JSON.stringify(request)); 
    console.log(JSON.stringify(sender)); 
    }); 

यह दृष्टिकोण मुझे एक टैब के रेफरर, प्राप्त करने के लिए अनुमति देता है जो मैं फिर मौजूदा टैब के यूआरएल से सहसंबंध कर सकते हैं। यह हमेशा एक-से-एक मैपिंग नहीं होता है, इसलिए मैं कुछ अतिरिक्त जादू करता हूं जैसे वर्तमान में चयनित टैब को ओपनर के रूप में पसंद करते हैं यदि उसका यूआरएल नए टैब के रेफरर से मेल खाता है।

यह वास्तव में कार्यक्षमता का अनुमान लगाने के लिए केवल एक हैक है जिसे वेबNavigation.onBeforeRetarget या window.opener द्वारा अधिक सरल और सटीक प्रदान किया जाएगा।

1

आगे की जांच() कि onCreatedNavigationTarget से पता चला है जब आपको लगता है कि यह एक सलामी बल्लेबाज खोला संबंध इंगित करने के लिए नहीं होगा हमेशा आग नहीं करता है।

.openerTabId पैरामीटर में chrome.tabs.onCreated/onUpdated द्वारा छोड़े गए टैब ऑब्जेक्ट में कभी-कभी एक अतिरिक्त संकेत मिल सकता है।

एक व्यापक समाधान को इन उत्तरों में वर्णित विधियों में से कई पर भरोसा करना होगा।

1
port.onMessage.addListener(
    function(msg) { 
     var tabid = port.sender.tab.openerTabId; 
     console.log("Received message from tab that was opened by tab id : " + tabid); 
     // reliably shows the tab id of the tab that opened 
     // the tab sending the message 
    }); 
संबंधित मुद्दे