2017-08-02 1 views
1

Ich versuche, Nachricht an Hintergrund zu senden, und auch zurück zum Inhaltsskript zu erhalten. enter image description herechrome.runtime.onMessage.addListener ist im Inhaltsskript nicht definiert

enter image description here

Das ist mein content_script.js

init(); 
function init() { 
    function notifyBackgroundPage(event) { 
     chrome.runtime.sendMessage(chromeExtID, { 
      greeting: "Greeting from the content script" 
     }); 
    } 

    window.addEventListener("click", notifyBackgroundPage); 

    // accept messages from background 
    // below line addListener is undefined 
    chrome.runtime.onMessage.addListener(function backgroundListener(request, sender, sendResponse) { 
     console.log("BgExt.js says: " + request); 
    }); 
    } 

BgExt.js

define([], function GmailExt() { 

    return { 
     start: function() { 

      chrome.runtime.onMessage.addListener(
       function (request, sender, sendResponse) { 
        console.log('inside response'); 
        // to send back your response to the current tab 
        chrome.tabs.query({active: true, currentWindow: true}, function (tabs) { 
         chrome.tabs.sendMessage(tabs[0].id, {farewell: response}, function (response) { 
         }); 
        }); 
        return true; 
       } 
      ); 
     } 
    }; 
}); 

Diese GmailExt Datei in all.js geladen wird (während alle .js wird in index.ht eingefügt ml)

require([ 
    "base_host/chrome/Server", 
    "kernel/Kernel", 
    "hydra/version", 
    "base_host/chrome/StartupConfig", 
    "hydra/apps", 
    "dojo/_base/Deferred", 
    "talkto_util/common", 
    "dojo/i18n!base_host/nls/CommonStrings", 
    "base_host/chrome/BgExt", 
    "dojo/domReady!" 
], function (Server, Kernel, version, StartupConfig, apps, Deferred, talktoUtil, nls, BgExt) { 
    document.getElementById("logoMessage").innerText = nls.simple_secure_text; 
    var host = new Server(); 
    //if app and not extension 
    chrome.browserAction && chrome.browserAction.onClicked.addListener(function() { 
     Deferred.when(kernel.onInit(), function() { 
      host.appManager.showShell(); 
     }); 
     return true; 
    }); 

    BgExt.start(); 
}); 

client_base/host/Chrom/index.html

<!DOCTYPE HTML> 
<html> 
<head> 
    <!-- Background Page for Extension/app --> 
    <title>Flock</title> 
    <meta charset="UTF-8"> 
    <!--BUILD_REPLACE_BLOCK_START--> 
    <!-- This block will be remove by build. 
    All the files from libs/common/files.txt would be prepended to dojo.js --> 
    <script type="text/javascript" src="../../../hydra/src/libs/common/dojoConfig.js"></script> 
    <script type="text/javascript" src="../../../hydra/src/libs/common/underscore.js"></script> 
    <script type="text/javascript" src="../../../hydra/src/libs/common/underscore-ext.js"></script> 
    <!--BUILD_REPLACE_BLOCK_END--> 
    <script type="text/javascript" src="../../../hydra/src/libs/dojotoolkit/dojo/dojo.js"></script> 
    <script type="text/javascript" src="all.js"></script> 
</head> 
<body> 

</body> 
</html> 

manifest.json

{ 
    "manifest_version": 2, 
    "content_security_policy": "script-src 'self' 'unsafe-eval' https://j.maxmind.com https://ssl.google-analytics.com https://flock-apps.flock.co https://flock-apps.flock-staging.co https://flock-apps.flock.com https://flock-apps.flock-staging.com; object-src 'self'", 
    "minimum_chrome_version": "22", 

    "options_page": "client_base/host/chrome/static/crx_browser_actions/index.html?app=preferences", 
    "name": "__MSG_extName__", 
    "description": "__MSG_extDescription__", 
    "background": { 
    "page": "client_base/host/chrome/index.html", 
    "persistent": true 
    }, 

    "browser_action": { 
    "default_popup": "/gmail_ext/popup.html" 
    }, 
    "web_accessible_resources": [ 
    "client_base/host/chrome/static/blank.gif", 
    "gmail_ext/icons.png", 
    "gmail_ext/jquery-3.2.1.min.js", 
    "gmail_ext/gmail.js", 
    "gmail_ext/content_script.js" 
    ], 
    "permissions": [ 
    "<all_urls>", 
    "unlimitedStorage", 
    "notifications", 
    "idle", 
    "background", 
    "tabs", 
    "activeTab" 
    ], 
    "optional_permissions": [ 
    "clipboardWrite" 
    ], 
    "externally_connectable": { 
    "matches": [ 
     "https://*.google.com/*", 
     "http://localhost/*", 
    ] 
    }, 
    "content_scripts": [ 
    { 
     "matches": [ 
     "*://mail.google.com/*" 
     ], 
     "css": [ 
     "/gmail_ext/content_script.css" 
     ], 
     "js": [ 
     "/gmail_ext/loader.js" 
     ], 
     "run_at": "document_end" 
    } 
    ], 
    "version": "1.0" 
} 
+1

Die Konsole zeigt den Fehler in VM2279 auftritt, was bedeutet, dass der Code kein Inhaltsskript ist. Anscheinend injiziert etwas in Ihrem Skript den Code in ein Skriptelement, das im Seitenkontext ausgeführt wird - es ist kein Inhaltsskript mehr und hat daher keinen Zugriff auf chrome.runtime.onMessage. – wOxxOm

+0

@wOxxOm Du hattest recht, aber das ist nur meine init-Funktion, die von meiner 'Refresh-Funktion' aufgerufen wird, nur um sicherzustellen, dass' init-Funktion' nur ausgeführt wird, nachdem alles AJAX fertig ist. – STEEL

+0

Bitte bearbeiten Sie die Frage zum Thema: Fügen Sie ein [mcve] ein, das das Problem dupliziert. Bei Chrome-Erweiterungen oder Firefox-WebExtensions bedeutet dies fast immer, dass Sie * manifest.json * und einige der Hintergrund-, Inhalts- und/oder Popup-Skripts/HTML einbeziehen. Fragen, die Debugging-Hilfe suchen ("Warum funktioniert dieser Code nicht so, wie ich will?") ​​Muss Folgendes enthalten: (1) das gewünschte Verhalten, (2) ein spezifisches Problem oder einen Fehler und (3) den kürzesten Code, der für die Reproduktion erforderlich ist * in der Frage selbst *. Bitte beachten Sie auch: [Was kann ich hier fragen?] (Http://stackoverflow.com/help/on-topic) und [fragen]. – Makyen

Antwort

0

I fixiert es. Die Lösung war, da ich loader.js wurde mit meinem Content-Skript und jquery über chrome.extension.getURL('/gmail_ext/content_script.js');

Und wurde mit „content_script.js“ als web_accessible_resources nur loader.js musste Chrom Objektzugriff zu laden.

Und ja, es ist ein Dojo-Projekt können Sie die Arbeits Erweiterung sehen hier: https://chrome.google.com/webstore/detail/flock-chat-for-teams-and/enfaahabcinohafeakbliimmoholjeip?hl=en

Ich verwende jetzt Seite Veranstaltungen wie hier gezeigt: https://developer.chrome.com/extensions/content_scripts#host-page-communication

An der Spitze der loader.js Ich habe unten hinzugefügt:

function initPort() { 
    var contentScriptPort, 
     chromeExtID = "lddaepjihbpbfpegjhjnkffjmmoigphe"; 

    contentScriptPort = chrome.runtime.connect(chromeExtID); 

    contentScriptPort.onMessage.addListener(function (message) { 
     // Send data back to content script received from Background. 
     window.postMessage({type: "FROM_BACKGROUND", emails: message}, "*"); 
    }); 

    window.addEventListener("message", function _postMessage(event) { 
     // We only accept messages from ourselves 
     if (event.source != window) 
      return; 

     if (event.data.type && (event.data.type == "FROM_PAGE")) { 
      // console.log("Content script received: " + event.data.emails); 
      contentScriptPort.postMessage(event.data); 
     } 
    }, false); 
} 

initPort(); 
Verwandte Themen