0

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)

Failure screenshot

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ß.

+0

Warum Sie es in einem Timeout wickeln? –

+0

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. –

+0

@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

Antwort

2

Problem gelöst: Ich hatte zu deaktivieren, dann alle meine anderen Erweiterungen wieder aktivieren. Scheint wie ein Fehler von Chrome.

+1

Wenn dies in der Tat durch https://crbug.com/544182 verursacht wird, dann wird das Problem gelöst, indem alle Devtools-Erweiterungen deaktiviert werden, die Devtools geöffnet werden und die Erweiterungen dann wieder aktiviert werden (wenn Sie möchten). Das Deaktivieren und erneute Aktivieren und das Öffnen der Devtools für den Hintergrund lösen das Problem nicht. –

+0

ist das immer noch ein Problem? Ich bekomme es heute – SuperUberDuper

-1

Ich denke, es hat mit der Timeout-Funktion zu tun, die Sie verwenden, hat Google bereits etwas namens Alarme, die hilft, Code zu planen, um periodisch oder zu einem bestimmten Zeitpunkt ausgeführt werden.

https://developer.chrome.com/apps/alarms

Versuchen Sie, dass anstelle von Timeout

+0

Danke, aber es scheint, die Zeitüberschreitung war nur ein Test, ich brauche es eigentlich nicht, als was ich versuche zu tun, ist ein Event-Listener. – tbronchain

0

die oben klicken und die Konsole in Erweiterungsset environmint

enter image description here

der Hintergrund nur einmal ausgeführt werden.Sie sollten mehr zu überprüfen, die resutl

dies ist mein Code ausführen es wroks gut:

chrome.tabs.onUpdated.addListener(
 
\t function(tabId,info,tab){ 
 
\t \t if(info.status=="complete") 
 
\t \t \t console.log("complete") 
 
\t \t chrome.tabs.sendMessage(tabId, {greeting: "inupdate"}, function(response) { 
 
\t \t \t console.log(response); 
 
\t \t }); 
 
\t } 
 
)

Verwandte Themen