2015-01-19 9 views
6

मुझे अपने क्रोम एक्सटेंशन में बाहरी जेएस-स्क्रिप्ट को लोड करने और निष्पादित करने में समस्या है। this question जैसा दिखता है, लेकिन मैं अभी भी यह नहीं समझ सकता कि यह मेरे मामले में क्यों काम नहीं करता है।क्रोम एक्सटेंशन: बाहरी स्क्रिप्ट लोड और निष्पादित करें

विचार यह है कि मैं अपनी सामग्री स्क्रिप्ट में कुछ डिफ़ॉल्ट फ़ंक्शन चाहता हूं जो वेब पेज सामग्री को पार्स करना चाहिए। और कुछ विशिष्ट वेब-पेजों के लिए मैं विशिष्ट पार्सर्स को लोड और उपयोग करना चाहता हूं, इसलिए मैं एक वीपी-पेज के लिए उचित जेएस-स्क्रिप्ट लोड करने का प्रयास करता हूं, और यह स्क्रिप्ट डिफ़ॉल्ट पार्सर की कार्यक्षमता को बढ़ा देती है।

अब तक मैं केवल बाहरी स्क्रिप्ट से कोड निष्पादित करने का प्रयास करें, लेकिन इस तरह त्रुटि है:

{ 
"name": "Extension name", 
"version": "1.2", 
"description": "My chrome extension", 
"browser_action": { 
    "default_popup": "popup.html", 
}, 
"content_scripts": [{ 
    "css": [ 
     "style.css" 
    ], 
    "js": [ 
     "bower_components/jquery/dist/jquery.js", 
     "bower_components/bootstrap/dist/js/bootstrap.js", 
     "content.js" 
    ], 
    "matches": ["*://*/*"] 
}], 
"web_accessible_resources": [ 
    "frame.html", 
    "logo-48.png" 
], 
"icons": { 
    "16": "logo-16.png", 
    "48": "logo-48.png", 
    "128": "logo-128.png" 
}, 
"permissions": [ 
    "tabs", 
    "storage", 
    "http://*/", 
    "https://*/" 
], 
"manifest_version": 2 

}

यह पॉपअप है: यह मेरा manifest.json है Unchecked runtime.lastError while running tabs.executeScript: No source code or file specified at Object.callback

.html

<!doctype html> 
<html> 
<head> 
    <title>Title</title> 
    <script src="popup.js"></script> 
</head> 
<body> 
    <ul> 
    <li>Some link</li> 
    </ul> 
</body> 
</html> 

और में popup.js मैं इस तरह कंपनी के शेयर में निष्पादित करें:

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    chrome.tabs.executeScript(tabs[0].id, {file: "http://127.0.0.1:8000/static/plugin/somesite.js"}); 
}); 

क्या मैं डोंग गलत है, मैं कुछ याद था कि कर रहा हूँ? या मुझे इस मुद्दे को हल करने के लिए एक और दृष्टिकोण का उपयोग करना चाहिए?

+0

टिप्पणी (आपकी त्रुटि से कनेक्ट नहीं): 'http: // * /" केवल शीर्ष स्तर वाले पृष्ठों से मेल खाता है। यदि आपको केवल वर्तमान टैब तक पहुंच की आवश्यकता है तो आप या तो "" या "व्यापक अनुमति" के लिए चाहते हैं। – Xan

+0

क्या कोई कारण है कि आपके पास अपने एक्सटेंशन में 'somesite.js' लोड नहीं हो सकता है? – Teepeemm

+0

अंतिम त्रुटि को पकड़ने के लिए, https://stackoverflow.com/a/45603880/632951 – Pacerier

उत्तर

6

आपके द्वारा प्रयास किए जाने वाले बाहरी स्रोतों से चल रही स्क्रिप्ट Google क्रोम द्वारा प्रतिबंधित है और आपके एक्सटेंशन को ब्लॉक या यहां तक ​​कि प्रकाशित नहीं करेगा। सभी स्क्रिप्ट एक्सटेंशन में होना चाहिए।

The restriction against resources loaded over HTTP applies only to those resources which are directly executed. You're still free, for example, to make XMLHTTPRequest connections to any origin you like; the default policy doesn't restrict connect-src or any of the other CSP directives in any way.

आप बुरी तरह से एक बाहरी स्रोत की जरूरत है, तो आप एक एक्सएमएल HTTP अनुरोध करते हैं और सामग्री के लिए eval उपयोग कर सकते हैं: लेकिन वहाँ एक समाधान है, from google chrome doc है। यहाँ कोड from google doc का एक हिस्सा है:

var xhr = new XMLHttpRequest(); 
xhr.open("GET", "http://127.0.0.1:8000/static/plugin/somesite.js", true); 
xhr.onreadystatechange = function() { 
    if (xhr.readyState == 4) { 
     // WARNING! Might be evaluating an evil script! 
     var resp = eval("(" + xhr.responseText + ")"); 
     // Or this if it's work 
     chrome.tabs.executeScript(tabs[0].id, {code: xhr.responseText}); 
    } 
} 
xhr.send(); 

या आप किसी पुस्तकालय, $.get() with jquery या $http with angularjs उपयोग कर सकते हैं। अगर आप अपने कोड में eval जोड़ने आप manifest.json इस में जोड़ना होगा:

"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'"`, 
5

चर्चा यहां के अनुसार: https://groups.google.com/a/chromium.org/forum/#!topic/chromium-extensions/LIH7LGXeQHo,

Running scripts from external sources may cause your extension to be unpublished or blocked.

बस एक और दृष्टिकोण प्रदान करने के लिए, आप एक ajax कॉल कर सकते हैं सामग्री स्क्रिप्ट के लिए तो फोन chrome.tabs.executeScript

chrome.tabs.query({active: true, currentWindow: true}, function(tabs) { 
    $.get("http://127.0.0.1:8000/static/plugin/somesite.js", function(result) { 
     chrome.tabs.executeScript(tabs[0].id, {code: result}); 
    }, "text"); 
}); 
+1

किसी स्क्रिप्ट को डाउनलोड और निष्पादित नहीं किया जा सकता है 'बाहरी स्रोतों से चल रही स्क्रिप्ट' के रूप में माना जा सकता है? क्या Google द्वारा इसकी अनुमति है? – Kolyunya

1

executeScript के लिए 'फाइल' विकल्प केवल फ़ाइलों से संबंधित है आपके एक्सटेंशन में एम्बेड किया गया। मुझे पता है, the documentation उस पर स्पष्ट नहीं है और जब यह यूआरएल के साथ काम कर सकता है, यह एक हैक की तरह लगता है, सुविधा नहीं। बाहरी स्रोतों से स्क्रिप्ट को अपने सक्रिय पृष्ठ में लोड करने के लिए, आपको आमतौर पर एक स्क्रिप्ट निष्पादित करना होता है जो लोड किए गए दस्तावेज़ के DOM के अंदर एक स्क्रिप्ट टैग बनाता है।

मुझे लगता है मैं इस सवाल के कुछ हिस्सों का जवाब दे दिया यहाँ से पहले: Why is chrome.tabs.executeScript() necessary to change the current website DOM and how can I use jQuery to achieve the same effect?

संक्षेप में:

1) क्रम में विस्तार से वेब पृष्ठों के लिए उपयोग किया है, आप इसके लिए permissions जोड़ने की जरूरत है:

"permissions" : [ 
     "tabs", 
     [...] 
     "http://*/*", 
     "https://*/*" ], 

2) आप कोड है कि डोम स्क्रिप्ट तत्व बनाता है किसी प्रकार का अमल करने के लिए लोड करता है कि आप क्या जरूरत की जरूरत है:

chrome.tabs.executeScript(tab.id, { 
    code : 'var script=document.createElement(\'script\');' + 
    'script.onload=function() { /*do something in the page after the script was loaded*/ };' + 
    'script.src=\'http://127.0.0.1:8000/static/plugin/somesite.js\';' + 
    'document.body.appendChild(script);' 
}, function (returnedValue) { 
    // do something in the extension context after the code was executed 
}); 

ऊपर दिए गए लिंक में remex फ़ंक्शन पर एक नज़र डालें, जो मुझे लगता है कि यहां एक स्ट्रिंग के रूप में लिखी गई जावास्क्रिप्ट की बहुत सारी कुरूपता हल करती है।

+0

लेकिन यह एक्सटेंशन कोड के रूप में नहीं चलाएगा। यह पृष्ठ की जावास्क्रिप्ट के रूप में चलाएगा। – golddove

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