2010-06-11 17 views
12

मैं अपना पहला सफारी एक्सटेंशन बनाने की प्रक्रिया में हूं - एक बहुत ही सरल - लेकिन मैंने कुछ समस्याओं में भाग लिया है। एक्सटेंशन एक एकल, इंजेक्शन वाली स्क्रिप्ट पर उबाल जाता है जो मूल फ़ीड हैंडलर को बाईपास करने और http: // URI पर रीडायरेक्ट करने का प्रयास करता है। मेरे मुद्दे अब तक दो गुना हैं:सफारी एक्सटेंशन प्रश्न

  1. "श्वेतसूची" जिस तरह से मैं अपेक्षा करता हूं वह काम नहीं कर रहा है। चूंकि सभी फीड "फीड: //" प्रोटोकॉल के तहत दिखाए जाते हैं, इसलिए मैंने श्वेतसूची में इसे "फीड: // */*" (ब्लैकलिस्ट में कुछ भी नहीं) के रूप में कैप्चर करने का प्रयास किया है, लेकिन मैं एक अनुरोध में समाप्त हुआ लूप कि मैं समझ नहीं सकता। अगर मैं ब्लैकलिस्ट "http://*/*" और "https://*/*" मानों को सेट करता हूं, तो सब कुछ अपेक्षित काम करता है।
  2. मैं यह नहीं समझ सकता कि मेरी इंजेक्शन स्क्रिप्ट से मेरी सेटिंग्स का उपयोग कैसे करें। स्क्रिप्ट beforeload इवेंट हैंडलर बनाता है, लेकिन प्रलेखन में संकेतित safari.extension.settings पथ का उपयोग करके मेरी सेटिंग्स तक नहीं पहुंच सकता है।

मुझे एप्पल के दस्तावेज में कुछ भी नहीं मिला है यह इंगित करने के लिए कि सेटिंग्स मेरी स्क्रिप्ट से उपलब्ध नहीं होनी चाहिए। चूंकि एक्सटेंशन ऐसी नई सुविधा हैं, यहां तक ​​कि Google सीमित प्रासंगिक परिणाम भी देता है और उनमें से अधिकांश आधिकारिक दस्तावेज़ीकरण से हैं।

मुझे क्या याद आ रही है?

धन्यवाद।

अद्यतन तो मैं आशा करती हूं कि प्रलेखन अधूरा है, क्योंकि यह सीमा रेखा भी बेहद कम है, लेकिन मैं सेटिंग्स के बारे में थोड़ा सीखा है। यह पता चला है कि, इंजेक्शन स्क्रिप्ट से, SafariExtensionSettings ऑब्जेक्ट उपलब्ध नहीं है। इंजेक्शन स्क्रिप्ट्स के पास केवल SafariContentExtension ऑब्जेक्ट तक पहुंच है (जो बिल्कुल उपयोगी नहीं है), लेकिन यह बिल्कुल उसी तरीके से उपनाम है (safari.extension.settings) - बुरा विचार, आईएमओ। के रूप में injection script documentation में कहा गया है:

महत्वपूर्ण: यदि आप एक इंजेक्शन स्क्रिप्ट के भीतर से safari.extension का उपयोग करते हैं, तो आप SafariExtension वर्ग को संबोधित नहीं कर रहे हैं। आप SafariContentExtension क्लास को संबोधित कर रहे हैं।

आपको वैश्विक HTML फ़ाइल से बात करने के लिए मैसेजिंग सिस्टम का उपयोग करना होगा जिसमें सेटिंग्स तक पहुंच है। यह एक प्रकार का लूपी है, लेकिन मेरे पास global.html फ़ाइल पर एक संदेश भेजा जा रहा है जो सेटिंग्स को पुनर्प्राप्त करता है और जैसे ही मुझे पता चलता है कि ऐसा करने के बारे में मुझे पता चल जाता है कि मैं अपनी इंजेक्शन स्क्रिप्ट पर एक संदेश वापस भेजूंगा।

जब से मैं दस्तावेज़ लोड होने से पहले अपने काम के सभी कर रहा हूँ, विधियों मैं संदेश वापस मेरे पास नहीं है कि एक पेज वस्तु पर भरोसा करते हैं भेजने के लिए मिल गया है के सभी।

उत्तर

2

मुझे कई दिन लगे, लेकिन मुझे लगता है कि मुझे canLoad() मैसेजिंग विधि का उपयोग करके एक व्यावहारिक समाधान मिला।

settings = safari.self.tab.canLoad(event); 

मेरे वैश्विक HTML फ़ाइल, बारी में, उन सेटिंग्स रिटर्न के रूप में:

settings = { 
    'setting1': safari.extension.settings.getItem('setting1') 
} 

msgEvent.message = settings; 

यह अभी भी थोड़ा अधिक "hacky" से है मेरे इंजेक्शन स्क्रिप्ट इस तरह वैश्विक HTML पृष्ठ को फोन करके सेटिंग्स को पुन: प्राप्त मुझे ... पसंद हैं। मैं बस सेटिंग ऑब्जेक्ट को वापस नहीं देख पा रहा हूं, इसलिए मुझे मैन्युअल रूप से प्रत्येक सेटिंग को पुनर्प्राप्त करके एक नई वस्तु को संकलित करना होगा। आदर्श नहीं है, लेकिन यह प्रभावी प्रतीत होता है।

मुझे कोई क्रोम और एक इंजेक्शन अंत स्क्रिप्ट (स्क्रिप्ट के साथ एक सरल विस्तार है:

3

संपादित करें: जैसे आपने अपने शुरुआती पोस्ट अपडेट में कहा था, इंजेक्शन स्क्रिप्ट में एक ही तरह का उपयोग नहीं है जो वैश्विक HTML पृष्ठ होगा। यह मेरा काम कर समाधान है, कल्पना करें कि आप इंजेक्शन लिपि में "foo" की स्थापना के मूल्य जानना चाहता हूँ:

इंजेक्ट स्क्रिप्ट कोड:

function getMessage(msgEvent) { 

    if (msgEvent.name == "settingValueIs") 
     alert("Value for asked setting is: " + msgEvent.message); 

} 

safari.self.tab.dispatchMessage("getSettingValue", "foo"); // ask for value 
safari.self.addEventListener("message", getMessage, false); // wait for reply 

वैश्विक एचटीएमएल कोड:

function respondToMessage(messageEvent) { 

    if (messageEvent.name == "getSettingValue") { 

      // getItem("foo"); 
     var value = safari.extension.settings.getItem(messageEvent.message); 
     // return value of foo to injected script 
      safari.application.activeBrowserWindow.activeTab.page.dispatchMessage("settingValueIs", value); 

    } 

} 

safari.application.addEventListener("message",respondToMessage,false); 

आशा इससे मदद मिलती है !


प्रारंभिक पोस्ट: मैं एक ही 2 समस्या आप, मैं एक इंजेक्शन स्क्रिप्ट से अपनी सेटिंग्स (या secureSettings) उपयोग नहीं कर सकते के रूप में हो रही है। मेरे मामले में स्क्रिप्ट पेज लोड के बाद लोड हो जाती है, लेकिन इस तरह से मैं safari.extension.settings का उपयोग नहीं कर सकता।

एकमात्र तरीका यह काम करता है टूलबार/बटन के साथ, उस तत्व के पीछे HTML getItem और setItem अपेक्षा के अनुसार हो सकता है।

मेरा निष्कर्ष यह है कि, किसी कारण से, इंजेक्शन वाली स्क्रिप्ट सेटिंग्स तक नहीं पहुंच पाती हैं (असल में, उन्हें safari तत्व तक पहुंच नहीं लगती है)। बग या इच्छित विशेषता, जो पता लगाने के लिए छोड़ दिया गया है।

+0

ऊपर दिए गए अपडेट पर नज़र डालें। अब मुझे पता है कि आप सेटिंग्स तक नहीं पहुंच सकते हैं और यह भी संकेत दिया है कि उन्हें कैसे प्राप्त किया जाए (भले ही यह मेरे लिए अन्य कारणों से काम नहीं कर रहा हो)। –

+0

मुझे अभी मेरी समस्या का समाधान मिला है, यह आपके लिए या किसी अन्य समस्या के लिए ऊपर पोस्ट किया गया है। शायद आप इसे अपने मामले के लिए अनुकूलित कर सकते हैं! – Mars

+0

अद्यतन के लिए धन्यवाद। मेरे मामले में, सभी काम 'प्रीलोड' किया जा रहा है, इसलिए पेज ऑब्जेक्ट अनिर्धारित है जिसका अर्थ यह है कि 'प्रेषण संदेश() 'विधि उपलब्ध नहीं है। मैं अभी भी इसके लिए एक कामकाज की तलाश में हूं। –

6

इस बिंदु पर हर किसी की तरह, मैं अभी भी सीख वक्र चढ़ाई कर रहा हूँ, लेकिन यहाँ मैं कैसे इस समस्या को नियंत्रित किया गया है। जे एस)। सेटिंग्स लोड करने के उद्देश्य से मैंने एक साधारण वैश्विक पृष्ठ (proxy.html) जोड़ा है। जब script.js इंजेक्शन दिया जाता है, तो यह proxy.html पर getSettings संदेश भेजता है। proxy.html setSettings संदेश के साथ प्रतिक्रिया करता है, और script.js प्रारंभिकरण जारी रखता है।

इस विषय पर दस्तावेज़ों में मिले सबसे उपयोगी पृष्ठ Messages and Proxies है।

proxy.html:

<!doctype html> 
<html lang="en"> 
<head> 
    <script type="text/javascript"> 
    safari.application.addEventListener("message", function(e) { 
     if(e.name === "getSettings") { 
     e.target.page.dispatchMessage("setSettings", { 
      sort_keys: safari.extension.settings.getItem("sort_keys") 
     }); 
     } 
    }, false); 
    </script> 
</head> 
<body></body> 
</html> 

script.js: एक ही समस्या में

(function() { 
    var settings, init = function() { 
    // do extension stuff 
    }; 

    // listen for an incoming setSettings message 
    safari.self.addEventListener("message", function(e) { 
    if(e.name === "setSettings") { 
     settings = e.message; 
     init(); 
    } 
    }, false); 

    // ask proxy.html for settings 
    safari.self.tab.dispatchMessage("getSettings"); 
}()) 
+0

रिक, आप एक lifesaver हैं! इसके लिए बहुत - बहुत धन्यवाद। –

1

रन है, लेकिन इस सवाल का जवाब आसान से आप कल्पना कर सकते है: अपने वैश्विक html में स्क्रिप्ट शामिल हैं।

<!DOCTYPE HTML> 
<script type="text/javascript" src="cleanup.js"></script> 
<script> 
… 
</script> 

तो आप सेटिंग्स दस्तावेज़ में वर्णित का उपयोग कर सकते safari.extension.settings.myKey

आप भी @Travis वोट दें कर सकते हैं, क्योंकि मैं his post

से विचार आया // संपादित करें:
वास्तव में मैं डॉन ' वास्तव में क्या गलत है पता नहीं है। पहली कमांड के रूप में सेटिंग्स को कॉल करना, लेकिन बाद में नहीं। इसके अतिरिक्त यह 2. इंजेक्शन के बाद मेरी पूरी लिपि को दूषित कर रहा है। सत्यापन की आवश्यकता है अगर यह केवल मेरी (मुश्किल?) स्क्रिप्ट में है।

// EDIT2:
अब मैं सेटिंग्स आपके injected.js

function gotSettings(msgEvent) { 
    if (msgEvent.name === "SETTINGS") { 
     setts = msgEvent.message; 
     alert(setts.mySetting1); 
     // run the programm 
    } 
} 

safari.self.addEventListener("message", gotSettings, false); 
safari.self.tab.dispatchMessage("getSettings"); 

में के माध्यम से dispatchMessage()

वस्तु और global.html

switch (event.name) { 
case "getSettings": 
    // send the settings data 
    event.target.page.dispatchMessage("SETTINGS", safari.extension.settings); 

में पर भरोसा वापस पाने के लिए काम करने के लिए मिल गया this सेब प्रलेखन

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