2012-02-02 18 views
45

Sto sviluppando un'estensione in Chrome e c'è un problema. Nel mio inject.js, faccio una richiesta del tipo:Errore porta: impossibile stabilire una connessione. La fine di ricezione non esiste. In Chromiume

chrome.extension.sendRequest({command:'skip'},callback) 

e nei miei `background.js ho semplicemente aggiungo una richiesta ascoltatore come:

chrome.extension.onrequest.addListener(function(req,sender,res){console.log("procession"}) 

Ma c'è un errore:

Port errore: impossibile stabilire la connessione. La fine di ricezione non esiste

Sembra un bug in chrome? PS:
parte del mio manifest.json

"background": { 
    "scripts": ["background.js"] 
    }, 
    "content_scripts": [ 
    { 
     "matches": ["&lt all_urls &gt"], 
     "js": ["inject.js"] 
    } 
    ], 

Sono in cromo 17, e ho provato a ricaricare l'estensione, riaprire il browser non è successo niente ...
qualcuno avere alcune idee?

+0

Ho avuto un problema simile. Anche se ciò potrebbe non essere d'aiuto, assicurati che il file "background.js" venga effettivamente caricato. Il mio problema era che ho usato "background.js" invece di "scripts/background.js" – Matthew

risposta

9

Mi sono ritrovato ad avere lo stesso problema che descrivi qui. La soluzione che ho trovato che funziona per me è quello di utilizzare un backgroundpage al posto di uno script di sfondo, in questo modo:

"background_page": "src/background.html", 
    // maybe this seems to work instead of background { scripts [] } 

    /* this gives a Port error: Could not ... 
    "background": { 
    "scripts": ["src/background.js"] 
    }, 
    */ 

Spero che questo funziona anche per te.

+0

Ho avuto lo stesso problema e una volta aggiunta una background_page ha funzionato. La pagina è vuota ma sembra che l'API ne richieda uno per utilizzare la "porta". – John

+1

Sto tentando di eseguire l'aggiornamento a Manifest v2 e, sfortunatamente, l'impostazione "background_page" genera un avviso quando si carica un'estensione decompressa e non è elencata nella pagina Manfest (http://code.google.com/chrome/extensions/ manifest.html). Sto ancora cercando di tenere traccia di una correzione funzionante nel nuovo formato. – IBBoard

+3

@IBBoard, per favore vedi la mia risposta. Penso che il problema è che sendRequest() è stato deprecato a favore di sendMessage() che dovrebbe funzionare nelle estensioni Manifest v2. – Jannes

4

sfondo della pagina HTML Un non ha funzionato per me in Chrome 20.0.1132.57 m su Windows 7 con lo stesso errore:

Port error: Could not establish connection. Receiving end does not exist. miscellaneous_bindings:232 

Ho provato ad utilizzare uno script background.js con il seguente contenuto:

chrome.extension.onConnect.addListener(function(port) { 
    port.onMessage.addListener(function(msg) { 
     // May be empty. 
    }); 
}); 

che risolto il immediato onDisconnect nel mio script contenuti:

port = chrome.extension.connect(); 
port.onDisconnect.addListener(function (event) { 
    // Happened immediately before adding the proper backend setup. 
    // With proper backend setup, allows to determine the extension being disabled or unloaded. 
}); 

Il codice corretto è venuto da Chromium Extensions messaggistica esempio: http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/api/messaging/timer/page.js?view=markup

L'esempio contiene anche la seconda parte che funge da back-end per sendRequest, ma non l'ho provato io stesso:

chrome.extension.onRequest.addListener(
    function(request, sender, sendResponse) { 
     // Don't know if it may be empty or a sendResponse call is required. 
    }); 
+1

Puoi approfondire su quale file ogni blocco di codice va inserito, in quale ordine? Sto ancora ricevendo lo stesso errore ... – Neil

14

Il problema potrebbe essere che sendRequest() e onRequest sono stati deprecati e sostituiti con sendMessage() e onMessage. Da un recente aggiornamento di Chrome 20 sembra che siano spariti completamente.

La documentazione ufficiale su Message Passing non menziona più sendRequest().

Questo è il link che documenta il cambiamento un po ': http://codereview.chromium.org/9965005/

+0

penso che questo sia il miglior senso della risposta Google non supporterà presto background_page –

+1

Questa è la soluzione per chiunque usi la versione 2.0 del Manifest –

+0

Sostituire quelle funzioni ha funzionato per me, grazie! –

22

questo non è sempre la causa, ma se si dispone di un errore nel background.js, si dovrebbe verificare questo link:

Inspect views: _generated_background_page.html 

nella pagina Estensioni, che mostrerà eventuali errori JavaScript.

Ciò impediva il consolidamento delle mie connessioni.

+1

Sembra che quando c'è un errore in background.js la chiamata fallirà. – Ibu

+3

Questa è la risposta corretta, la precedente non è valida. –

1

cercano di iniettare alcuni script contect in una scheda, che url è chrome: // * o https://chrome.google.com/*, quando collegare queste schede in backgroundpage,

per esempio

chrome.tabs.connect(tab.id).postMessage(msg) 

poi getteranno

Port error: Could not establish connection. Receiving end does not exist. 

questi pagina non consentire iniettare conten t script, e la connessione si disconnetterà immediatamente.

così, controllare l'url e non collegare queste schede, quindi l'eccezione non viene lanciata

2

Dopo un po 'di tempo speso per indagini ho trovato il problema nel mio caso.

Sto anche ricevendo:

Port error: Could not establish connection. Receiving end does not exist. 

Prima di spiegare, voglio dire che sto usando sendMessage e onMessage per la comunicazione.

Per me questo errore viene visualizzato quando invio un messaggio dalla pagina di sfondo a una scheda in cui è in esecuzione lo script di contenuto.

La mia estensione viene eseguita solo nelle schede in cui è aperto YouTube. Così, quando sto cambiando alcune preferenze, sto cercando di vedere quali schede sono aperte e di inviare un messaggio per aggiornare le preferenze aggiornate.

In un caso normale funziona bene, ma se ho n schede (n> = 1) con youtube aperto. Clicco sul pulsante "Ricarica" ​​per l'estensione, cambio qualcosa ... le schede di YouTube non vengono aggiornate e hanno perso il listener dei messaggi, quindi ho ricevuto questo errore.

Sembra che sia abbastanza normale.

Se aggiorno le schede di YouTube dopo l'estensione, il caricamento non viene visualizzato.

ho trovato una soluzione, non può applicarsi per tutti i casi:

Quando ho avuto questo problema il mio codice era:

chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue}, function(response) {}); 

Ora il mio codice è:

chrome.tabs.sendMessage(tabId, {proprName: proprName, newValue: newValue}); 

Per il mio non ha avuto bisogno di richiamata di risposta e perché quello non stava rispondendo ho avuto questo errore.

2

sto usando sendMessage e onMessage per la comunicazione troppo, e nel mio flusso di lavoro in primo luogo ho inviare un messaggio dal injected.js ai miei background.js e ho anche ottenuto "l'errore Porto: Impossibile stabilire la connessione. La fine di ricezione non esiste. " errore.

Quindi ho deciso di utilizzare le funzionalità di risposta (come ACK) e se lo sfondo non risponde, continuo a provare con un setTimeout in questo modo.

//background.js

... 
chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { 
... 
//some code 

sendResponse({status: 'everything ok'}) 
return true;  
}); 

//injected.js

var myInjectedFunctionality = function() { 

    chrome.extension.sendMessage({method: "Steroids:loadScripts"}, function(res) { 
     if(res && res.status) { 
      } else { 
       setTimeout(myInjectedFunctionality, 3000); 
      } 
    }); 
}; 
myInjectedFunctionality(); 

Il mio codice è ora in esecuzione correttamente quindi penso che la spiegazione è facile da vedere. Chrome non prepara Background.js e le connessioni quando inserisce il tuo codice nelle pagine in cui desideri, e quindi non fa in modo che nessuno ascolti il ​​tuo messaggio inviato, quindi se nessuno ti sta ascoltando, continua a provare come faccio io.

1

Controllare i manuali: http://developer.chrome.com/extensions/messaging.html

Note: If multiple pages are listening for onMessage events, only the first to call sendResponse() for a particular event will succeed in sending the response. All other responses to that event will be ignored.

Chiudere le schede, lasciare una sola pagina, e controllare. Nel mio caso questo era il problema.

0

vedevo questo problema, dove il mio script contenuto non stava caricando, in modo da inviare un messaggio non è mai stato accadendo.

Il problema era che avevo l'ispettore di script in background aperto e stavo semplicemente premendo Cmd + R (aggiornamento), ma c'era un bug nel mio manifest.json. Quando sono andato alla pagina delle estensioni e ho ricaricato quella pagina, ho ricevuto l'avviso che mostrava l'errore manifest.

Fondamentalmente, ho visto questo perché i miei script di contenuto non sono mai stati caricati in primo luogo e ho pensato di aggiornare il mio manifest, ma non lo ero.

1

Confrontarsi con lo stesso problema ora.

// Ecco il mio ex background.js:

chrome.runtime.onInstalled.addListener(function() { 
    //some other code here 
    chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { 
    if (message.url) { 
     chrome.downloads.download({ 
      url: message.url, 
      conflictAction: 'uniquify', 
      saveAs: false 
     }); 
    } 
});});//(Sorry, I tried but failed to put the last bracket on next line) 

Vedete, il chrome.runtime.onMessage.addListener viene licenziato quando l'evento onInstalled happpens, e quando ho capito fuori di questa portata, e fare il mio codice come questo:

chrome.runtime.onInstalled.addListener(function() { 
    //some other code here 
}); 
chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { 
    if (message.url) { 
     chrome.downloads.download({ 
      url: message.url, 
      conflictAction: 'uniquify', 
      saveAs: false 
     }); 
    } 
}); 

Funziona bene ora. Spero di essere utile.

0

Stavo vedendo questo errore utilizzando manifest_version: 2 e chrome.runtime.sendMessage. Mi sto collegando da una pagina web all'estensione invece che all'interno dell'estensione.

La soluzione era assicurarsi che avessi i valori corretti nell'array externally_connectable.matches in manifest.json. È necessario elencare gli URL che si desidera essere in grado di connettersi all'estensione. Vedi https://developer.chrome.com/extensions/manifest/externally_connectable#without-externally-connectable.

Problemi correlati