2012-01-22 11 views
5

क्या सामग्री स्क्रिप्ट केवल इंजेक्शन देना संभव है यदि दस्तावेज़ की सामग्री प्रकार विशिष्ट पैटर्न से मेल खाता हो? असल में, मेरा लक्ष्य बहुत आसान है: मुझे HTML दस्तावेज़ केवल (अब के लिए, यह XML दस्तावेज़ों में भी इंजेक्शन दिया गया है) में इंजेक्शन की गई मेरी सामग्री स्क्रिप्ट की आवश्यकता है। सामग्री स्क्रिप्ट को "document_start" पर इंजेक्शन दिया जाना चाहिए।क्रोम एक्सटेंशन सामग्री स्क्रिप्ट को किसी विशिष्ट सामग्री प्रकार से सीमित कैसे करें?

उत्तर

1

मैं इसी तरह की समस्या पर आया और इसे निम्न तरीके से हल किया।

दस्तावेज़ों की विविधता को सीमित करने के बजाय जहां सामग्री स्क्रिप्ट इंजेक्शन दी जाती है, दस्तावेज़ Content-Type के आधार पर, मैंने स्क्रिप्ट को सभी दस्तावेजों में इंजेक्ट करने का निर्णय लिया, लेकिन इसे केवल उचित में निष्पादित करने का निर्णय लिया।

यह विश्लेषण करने document.xmlVersion और document.doctype गुण द्वारा किया जाता है:

  • document.doctype एक HTML दस्तावेज में null नहीं होना चाहिए;
  • document.xmlVersion किसी XML दस्तावेज़ में null नहीं होना चाहिए;

तो, उनमें से किसी एक को दूसरे प्रकार से अलग करने और उपयुक्त होने पर सभी आवश्यक स्क्रिप्ट सामग्री को "बाध्य" करना आसान है। विशेष रूप से, कोई छोटे स्क्रिप्ट लोडर को इंजेक्ट कर सकता है, जो सशर्त रूप से अतिरिक्त, संभावित रूप से भारी सामान लोड करेगा।

क्रोम अभी भी दस्तावेज़ प्रकार द्वारा स्क्रिप्ट इंजेक्शन को सीमित करने के लिए कोई साधन प्रदान नहीं करता है।

0

ऐसा करने का सबसे मजबूत तरीका chrome.webRequest.onHeadersReceived के माध्यम से है, जो आपको प्रतिक्रिया हेडर जानकारी (Content-Type सहित) को क्वेरी और बनाए रखने की अनुमति देता है। दुर्भाग्यवश, यह API वर्तमान में क्रोम की स्थिर रिलीज़ में उपलब्ध नहीं है। (आप क्रोम के मौजूदा कथन में प्रयोगात्मक एपीआई का उपयोग कर सकते हैं, लेकिन आप इसका उपयोग करने वाले एक्सटेंशन प्रकाशित नहीं कर पाएंगे।)

आपके लिए एक संभावित समाधान यह निर्धारित करना है कि इंजेक्शन दस्तावेज़ का क्रोम द्वारा इलाज किया जा रहा है या नहीं एक्सएमएल के रूप में (और यदि ऐसा है, तो दस्तावेज़ को संसाधित करना बंद करें।) इसे पूरा करने के लिए एक हैक यह जांचना है कि document.getElementById('webkit-xml-viewer-source-xml')null है या नहीं। क्रोम/वेबकिट के एक्सएमएल व्यूअर का यह तत्व हिस्सा।

+0

क्या होगा यदि आपकी सामग्री स्क्रिप्ट एक ईवेंट श्रोता को एक क्रिया करने से पहले दस्तावेज़ लोड होने की प्रतीक्षा करने के लिए जोड़ती है? उदाहरण के लिए, 'document.addEventListener ("DOMContentLoaded", function() {do.stuff()}; ' – cheeken

+0

यही मुझे टालना चाहिए, मेरी स्क्रिप्ट को पहले निष्पादित किया जाना चाहिए (दस्तावेज़ लोड होने से पहले) – spektom

+0

मैं देखता हूं। उस स्थिति में, मेरे पास कोई अन्य सिफारिश नहीं है। शुभकामनाएँ। – cheeken

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