2011-02-12 12 views
25

मैं एक क्रोम एक्सटेंशन लिख रहा हूं जिसे किसी दिए गए पैरामीटर के अनुसार किसी विशिष्ट डोमेन में पृष्ठों को संशोधित करने की आवश्यकता है, जिसे प्राप्त करने के लिए XSS की आवश्यकता होती है, इसलिए बस सामग्री स्क्रिप्ट का उपयोग करना असंभव लगता है। इसलिए, मैंने tabs.executeScript का उपयोग करके स्क्रिप्ट इंजेक्ट करने का निर्णय लिया है।tabs.executeScript - गुजरने वाले पैरामीटर और पुस्तकालयों का उपयोग करना?

अब मुझे दो चीजों को जानने की आवश्यकता है: सबसे पहले, मैं executeScript का उपयोग करते समय स्क्रिप्ट को पैरामीटर कैसे पास कर सकता हूं? मुझे लगता है कि मैं संदेशों का उपयोग कर सकता हूं, लेकिन स्क्रिप्ट इंजेक्शन करते समय पैरामीटर को पास करने का कोई और सीधा तरीका नहीं है?

दूसरा, मेरी स्क्रिप्ट jQuery का उपयोग करती है, इसलिए मुझे किसी भी तरह jQuery शामिल करने की आवश्यकता है। यह मूर्खतापूर्ण है, लेकिन मुझे यकीन नहीं है कि यह कैसे करें। अब तक, मैंने HTML पृष्ठ में jQuery को एम्बेड किया था जिसे मैं लिख रहा था (उदाहरण के लिए background.html)।

+1

संबंधित/डुप्लीकेट: [chrome.tabs.executeScript()] (// stackoverflow.com/q/17567624) का उपयोग करके इंजेक्शन वाली सामग्री स्क्रिप्ट को पैरामीटर पास करें और [Google क्रोम में executeScript के माध्यम से एकाधिक स्क्रिप्ट इंजेक्शन] // // stackoverflow.com/q/21535233) – Makyen

+0

भविष्य के पाठकों के लिए (ओपी ने शायद हस्तक्षेप वर्षों में यह सीखा है): कृपया केवल एक प्रश्न (या जो * बहुत * निकट से संबंधित हैं) के लिए प्रश्न लिखें। इससे उत्तर अधिक केंद्रित हो सकते हैं और प्रश्न को डुप्लिकेट पर इंगित किया जा सकता है या भविष्य के प्रश्नों के लिए डुप्लिकेट-लक्ष्य के रूप में उपयोग किया जा सकता है। प्रश्न में प्रश्नों के भीतर कई प्रश्न होने के कारण भविष्य के पाठकों के लिए प्रश्न कम मूल्यवान है। – Makyen

उत्तर

45

आप तो मैसेजिंग का उपयोग नहीं करना चाहते हैं:

chrome.tabs.executeScript(tabId, {file: "jquery.js"}, function(){ 
    chrome.tabs.executeScript(tabId, {code: "var scriptOptions = {param1:'value1',param2:'value2'};"}, function(){ 
     chrome.tabs.executeScript(tabId, {file: "script.js"}, function(){ 
      //all injected 
     }); 
    }); 
}); 

(jquery.js विस्तार फ़ोल्डर में रखा जाना चाहिए)। स्क्रिप्ट विकल्प में scriptOptions चर के अंदर उपलब्ध होंगे। , मैं कोड इंजेक्षन करने में सक्षम था

chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 
    var scriptOptions = message.scriptOptions; 
    console.log('param1', scriptOptions.param1); 
    console.log('param2', scriptOptions.param2); 
    doSomething(scriptOptions.param1, scriptOptions.param2); 
}); 
+1

तो क्या सभी 'executeScript' कॉल टैब में एक ही * पृथक दुनिया * में कोड डाल रहे हैं? [मैंने सोचा कि वे नहीं करेंगे] (http://code.google.com/chrome/extensions/content_scripts.html#execution-environment): "अलग-अलग दुनिया विवाद के बारे में चिंता किए बिना प्रत्येक सामग्री स्क्रिप्ट को अपने जावास्क्रिप्ट वातावरण में परिवर्तन करने की अनुमति देती है पृष्ठ के साथ या अन्य सामग्री स्क्रिप्ट के साथ " –

+1

@ क्रैगन 'executeScript' मैनिफेस्ट में सामग्री स्क्रिप्ट घोषित करने के बराबर है। इसे किसी टैब की अलग दुनिया में निष्पादित नहीं किया जाता है, इसे सामग्री स्क्रिप्ट की पृथक दुनिया में निष्पादित किया जाता है। – serg

+1

अच्छा, देखो, मैंने यही सोचा - उस टैब के लिए एक सामग्री-स्क्रिप्ट अलग दुनिया। बात यह है कि, यदि आपके पास मैनिफेस्ट में दो सामग्री स्क्रिप्ट हैं, तो वे दो अलग-अलग अलग-अलग दुनिया में समाप्त हो जाते हैं। लेकिन यहां आपको दो अलग-अलग 'निष्पादित स्क्रिप्ट' कॉल दिखाई देती हैं जो * समान * पृथक दुनिया में समाप्त होती हैं। –

1

ऊपर प्रत्यक्ष विधि बंद का निर्माण:

chrome.tabs.executeScript(tabId, {file: "jquery.js"}, function(){ 
    chrome.tabs.executeScript(tabId, {file: "script.js"}, function(){ 
     chrome.tabs.sendMessage(tabId, {scriptOptions: {param1:'value1',param2:'value2'}}, function(){ 
      //all injected 
     }); 
    }); 
}); 

आप script.js के लिए एक अनुरोध श्रोता जोड़ने के लिए की आवश्यकता होगी:

यह संदेश के साथ बस के रूप में आसान है मेरे क्रोम एक्सटेंशन पर सीधे पृष्ठभूमि स्क्रिप्ट से एक नए टैब में। हालांकि, सलाह दी जानी चाहिए कि executeScript कमांड का कोड खंड केवल चर नहीं लेगा, बल्कि केवल एक स्ट्रिंग। इसलिए, प्रयोग करने के बाद, मैंने पाया कि हमें पहले से कमांड की स्ट्रिंग सेट अप करने और हमारे इच्छित चर शामिल करने की आवश्यकता है। इस तरह:

var sendCode = 'document.getElementsByClassName("form-control n-gram")[0].value = "' + TMObj.brand + '";'; 

var TMUrl = "http://website.com"; 
chrome.tabs.create({ url: TMUrl }, function(tab){ 
      chrome.tabs.executeScript(null, {code: sendCode}); 
     }); 
}); 

यह अच्छी तरह से काम किया!

संबंधित मुद्दे