Ich versuche eine Chrome-Erweiterung zu erstellen, aber aus irgendwelchen Gründen scheint das chrome.runtime-Objekt manchmal unvollständig zu sein, und viele Methoden fehlen (einschließlich onMessage) , das ist die, die ich will).chrome.runtime.onMessage undefined im Hintergrundskript (Chrome-Erweiterung)
Es scheint manchmal funktioniert es, manchmal nicht. Ich nahm an, dass es ein zeitbezogenes Problem ist, aber ich verstehe nicht, warum ich nicht einfach einen Nachrichten-Listener im Hintergrund erstellen kann?
Mein Hintergrund Skript:
setTimeout(function() {
console.log("gogo!");
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.type == "tab") {
console.log("tab!");
sendResponse({status: "ok"});
}
}),
2
});
Wo "chrome.runtime.onMessage" nicht definiert ist.
Danke!
Edit2: Ich habe einen viel einfacheren Prototyp gebaut, und es scheitert wieder. Jetzt bin ich wirklich verwirrt. Hier ist, was ich habe:
$tree
.
├── manifest.json
├── src
│ ├── background.html
│ ├── background.js
│ └── test.js
└── vendor
└── jquery.js
2 directories, 5 files
manifest.json Datei:
{
"manifest_version": 2,
"name": "test",
"description": "test",
"version": "1.0",
"author": "test",
"homepage_url": "http://www.test.com",
"content_scripts": [
{
"run_at" : "document_idle",
"matches": ["https://www.google*"],
"js": ["vendor/jquery.js", "src/test.js"]
}
],
"background": {
"page": "src/background.html",
"persistent": false
},
"permissions": [
"tabs",
"https://www.google*"
]
}
background.html Datei:
<script src="../vendor/jquery.js"></script>
<script src="background.js"></script>
background.js Datei:
function run() {
console.log("gogo!");
chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
console.log(sender.tab ?
"from a content script:" + sender.tab.url :
"from the extension");
if (request.type == "tab") {
console.log("tab!");
sendResponse({status: "ok"});
}
});
}
run();
Test .js-Datei:
'use strict';
run();
function run() {
var url = window.location.href;
// Error if no URI
if (!url) {
return 1;
}
var uriRe = /https:\/\/www\.google.*/;
var reParse = uriRe.exec(url);
if (!reParse) {
return 2;
}
chrome.runtime.sendMessage({type: "tab"}, function(response) {
console.log(response);
});
}
Ich verwende Chrome 49.0.2623.112 (64-Bit) unter OSX.
Edit: Hier ist ein Screenshot von dem, was die Zeiten kommt es nicht: (vielleicht 50% der Zeit)
ich wieder genau will, dass es nicht die ganze Zeit nicht scheitern , was es noch seltsamer macht und mich glauben lässt, dass es irgendwo eine Art "Rassen" -Zustand gibt, von dem ich nichts weiß.
Warum Sie es in einem Timeout wickeln? –
Ist Ihre Hintergrundseite eine Ereignisseite? ("persistent": false set) Wenn dies der Fall ist, sollten Sie setTimeout nicht aufrufen. Wenn es sich um eine Ereignisseite handelt, sehen Sie sich die [docs] (https://developer.chrome.com/extensions/event_pages) an, da einige Dinge zu beachten sind. –
@DanielHerr Es war nur ein Test, da ich ein Zeitproblem vermutete. Es scheint, dass es mit einer Auszeit besser funktionierte, aber ich bin mir überhaupt nicht sicher. – tbronchain