Domanda

Sono porting una delle mie estensioni di Firefox a Chrome, e sto correndo in un piccolo problema con una query di AJAX. Il seguente codice funziona bene in estensione FF, ma non riesce con uno stato di "0" in Chrome.

function IsImage(url) {
    var isImage = false;
    var reImageContentType = /image\/(jpeg|pjpeg|gif|png|bmp)/i;
    var reLooksLikeImage = /\.(jpg|jpeg|gif|png|bmp)/i;

    if(!reLooksLikeImage.test(url)) 
    {
        return false;
    }

    var xhr = $.ajax({
        async: false,
        type: "HEAD",
        url: url,
        timeout: 1000,
        complete : function(xhr, status) {
            switch(status)
            {
                case "success":
                    isImage = reImageContentType.test(xhr.getResponseHeader("Content-Type"));
                    break;
            }
        },
    });

    return isImage;
}

Questa particolare parte del prolungamento controlla cosa c'è nella clipboard (un altro problema Chrome ho già risolto), e se si tratta di un collegamento ad un'immagine, invia una richiesta HEAD e controlla l'intestazione della risposta "Content-Type" per essere sicuri si tratta di un'immagine. Se è così, che restituisca vero in, incollare il testo negli appunti in un tag IMG. In caso contrario, se sembra un URL normale che non è un'immagine, si avvolge in una Un tag. Se non è un URL, si fa solo una pasta normale.

In ogni caso, l'URL controllata è sicuramente un'immagine, e funziona bene in FF, ma nella funzione completa, xhr.status è "0", e lo stato è "errore" quando la funzione completa. Aumentando il timeout a 10 secondi non aiuta. Ho verificato le immagini di prova dovrebbero tornare come "image / jpeg" durante l'esecuzione:

curl -i -X HEAD <imageURL>

So anche dovrei usare il successo e callback di errore invece di completo, ma non funzionano neanche. Tutte le idee?

È stato utile?

Soluzione

Come è capito Chris, negli script contenuto, è possibile non fare nessun-cross domain XHR. Si dovrebbe fare loro in una pagina aggiuntiva, come sfondo, Popup, o anche opzioni per farlo.

Per ulteriori informazioni sulla limitazione la trascrizione dei contenuti, si prega di fare riferimento a: http://code.google.com/chrome/extensions/content_scripts.html

E per ulteriori informazioni riguardanti la limitazione XHR, si prega di fare riferimento a: http://code.google.com/chrome/extensions/xhr.html

Altri suggerimenti

Ho risolto parte del problema, in realtà la maggior parte di esso. In primo luogo, come Brennan e ho detto ieri, avevo bisogno di impostare le autorizzazioni in manifest.json.

"permissions": [
    "http://*/*",
    "https://*/*"
],

Non è ideale per dare le autorizzazioni per ogni dominio, ma dal momento che le immagini possono essere ospitati da qualsiasi dominio, sarà avere a che fare, e dovrò per premunirsi contro XSS.

L'altro problema è che Chrome infatti blocca qualsiasi cosa nella sezione content_scripts di fare chiamate AJAX, in mancanza di silenzio. Tuttavia, non v'è alcuna restrizione alla BACKGROUND_PAGE, se ne avete uno. Quella pagina può fare qualsiasi chiamate AJAX che vuole, e Chrome ha un'API per consentire lo script per aprire una porta e passare le richieste di quella pagina di sfondo. Qualcuno ha scritto uno script chiamato XHRProxy come una soluzione, e ho modificato per ottenere l'intestazione di risposta appropriata. Funziona!

Il mio unico problema ora è capire come rendere lo script attesa per il risultato della chiamata da impostare in caso, invece di tornare subito.

Controlla il tuo file manifesto. Ha l'estensione dispone dell'autorizzazione per accedere a tale URL?

Se aiuta al tuo secondo problema (o chiunque altro): È possibile inviare una richiesta alla tua pagina di sfondo come:

chrome.extension.sendRequest({var1: "var1value", var2: "value", etc}, 
 function(response) {
    //Do something once the request is done.
}); 

Il response variabile può essere tutto quello che vuoi che sia. Si può semplicemente essere un successo o negare stringa. Fino a voi.

Nella pagina di sfondo è possibile aggiungere un ascoltatore:

chrome.extension.onRequest.addListener(
function(request, sender, sendResponse) {
      // Do something here
      // Once done you can send back all the info via:
      sendResponse( anything you want here );

      // and it'll be passed back to your content script.
});

Con questo si può passare la risposta dalla richiesta AJAX torna allo script contenuti e fare tutto ciò che si voleva fare con esso là.

La risposta accettata è obsoleto.

script contenuto può ora fare XMLHttpRequests cross-site proprio come gli script di fondo!

I relativi URL devono essere ammessa nel manifesto:

{
  "name": "My extension",
  ...
  "permissions": [
    "http://www.google.com/"
  ],
  ...
}

È inoltre possibile utilizzare espressioni come:

"http://*.google.com/"
"http://*/"

per ottenere le autorizzazioni di carattere più generale.

ecco il link alla documentazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top