google chrome extension - उन्नयन या स्थापित करने के बाद क्रोम एक्सटेंशन सामग्री स्क्रिप्ट फिर से इंजेक्शन




google-chrome-extension browser-extension (2)

css या js के अपग्रेड होने पर आप ?ver=2.10 नहीं जोड़ सकते?

"content_scripts": [ {
      "css": [ "css/cs.css?ver=2.10" ],
      "js": [ "js/contentScript.js?ver=2.10" ],
      "matches": [ "http://*/*", "https://*/*" ],
      "run_at": "document_end"
   } ],

क्रोम एक्सटेंशन पर मैं काम कर रहा हूं, स्थापित या अपग्रेड होने के बाद, सामग्री स्क्रिप्ट (प्रकट में निर्दिष्ट) को फिर से इंजेक्ट नहीं किया जाता है, इसलिए एक्सटेंशन कार्य करने के लिए पृष्ठ ताज़ा करना आवश्यक है। क्या स्क्रिप्ट को फिर से इंजेक्ट करने के लिए मजबूर करने का एक तरीका है?

मेरा मानना ​​है कि मैं उन्हें प्रकट रूप से हटाकर फिर से प्रोग्राम को इंजेक्ट कर सकता हूं और फिर बैकग्राउंड पेज में किस पेज को इंजेक्ट करना है, लेकिन यह एक अच्छा समाधान नहीं है।

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


अपग्रेड के बाद कार्य जारी रखने के लिए सामग्री स्क्रिप्ट को भारी विस्तार की अनुमति देने का एक तरीका है, और स्थापना पर तुरंत काम करना।

इंस्टॉल करें

स्थापित विधि केवल सभी विंडो में सभी टैब के माध्यम से पुनरावृति करने के लिए है, और मिलान यूआरएल के साथ टैब में प्रोग्रामेटिक रूप से कुछ स्क्रिप्ट इंजेक्ट करें।

जाहिर है, आपको इसे पृष्ठभूमि पृष्ठ या घटना पृष्ठ स्क्रिप्ट में घोषित करना होगा।

"background": {
    "scripts": ["background.js"]
},

background.js:

// Add a `manifest` property to the `chrome` object.
chrome.manifest = chrome.app.getDetails();

var injectIntoTab = function (tab) {
    // You could iterate through the content scripts here
    var scripts = chrome.manifest.content_scripts[0].js;
    var i = 0, s = scripts.length;
    for( ; i < s; i++ ) {
        chrome.tabs.executeScript(tab.id, {
            file: scripts[i]
        });
    }
}

// Get all windows
chrome.windows.getAll({
    populate: true
}, function (windows) {
    var i = 0, w = windows.length, currentWindow;
    for( ; i < w; i++ ) {
        currentWindow = windows[i];
        var j = 0, t = currentWindow.tabs.length, currentTab;
        for( ; j < t; j++ ) {
            currentTab = currentWindow.tabs[j];
            // Skip chrome:// and https:// pages
            if( ! currentTab.url.match(/(chrome|https):\/\//gi) ) {
                injectIntoTab(currentTab);
            }
        }
    }
});

अपग्रेड

अपग्रेड विधि इस तथ्य पर निर्भर करती है कि किसी एक्सटेंशन के अक्षम होने, अनइंस्टॉल होने या अपग्रेड होने के बाद कंटेंट स्क्रिप्ट को इंजेक्ट कर दिया जाता है।

जब पोर्ट कनेक्शन किया जाता है, तो ऑनडिसकनेक्ट हैंडलर जोड़ा जाता है। यह डिस्कनेक्ट घटना के बाद एक सेकंड इंतजार करता है, फिर पुन: कनेक्ट करने का प्रयास करता है। यदि यह विफल हो जाता है, तो एक और onDisconnect को निकाल दिया जाता है इसलिए प्रक्रिया फिर से होती है, जब तक कि एक कनेक्शन नहीं किया जाता है। यह सही नहीं है, लेकिन यह काम करता है।

सामग्री स्क्रिप्ट:

var port;

// Attempt to reconnect
var reconnectToExtension = function () {
    // Reset port
    port = null;
    // Attempt to reconnect after 1 second
    setTimeout(connectToExtension, 1000 * 1);
};

// Attempt to connect
var connectToExtension = function () {

    // Make the connection
    port = chrome.runtime.connect({name: "my-port"});

    // When extension is upgraded or disabled and renabled, the content scripts
    // will still be injected, so we have to reconnect them.
    // We listen for an onDisconnect event, and then wait for a second before
    // trying to connect again. Becuase chrome.runtime.connect fires an onDisconnect
    // event if it does not connect, an unsuccessful connection should trigger
    // another attempt, 1 second later.
    port.onDisconnect.addListener(reconnectToExtension);

};

// Connect for the first time
connectToExtension();




content-script