Frage

Ich bin Portierung einer meiner Firefox-Erweiterungen für Chrome, und ich laufe in ein kleines Problem mit einer AJAX-Abfrage. Der folgende Code funktioniert gut in der FF-Erweiterung, aber nicht mit einem Status von "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;
}

Diese besondere Teil der Erweiterung überprüft, was in der Zwischenablage ist (ein anderes Chrome Problem, das ich bereits gelöst haben), und wenn es sich um eine Bild-URL ist, sendet sie eine HEAD-Anforderung und überprüft die „Content-Type“ Antwort-Header sicher sein, es ist ein Bild. Wenn ja, wird es true zurück, Einfügen des Textes aus der Zwischenablage in einem IMG-Tag. Andernfalls, wenn es wie eine normale URL sieht das nicht ein Bild ist, es wickelt es in einem A-Tag. Wenn es nicht eine URL ist, tut es nur eine einfache Paste.

Wie auch immer, wird die URL geprüft ist auf jeden Fall ein Bild, und funktioniert gut in FF, aber in der vollständigen Funktion, xhr.status „0“ und Status „Fehler“, wenn die Funktion abgeschlossen ist. wird das Timeout auf 10 Sekunden Upping nicht helfen. Ich habe die Testbilder überprüft sollten als „image / jpeg“ zurückkommen, wenn ausgeführt wird:

curl -i -X HEAD <imageURL>

Ich weiß auch, sollte ich die Erfolgs- und Fehler Rückrufe statt vollständig verwenden, aber sie auch nicht. Irgendwelche Ideen?

War es hilfreich?

Lösung

Wie Sie aus Chris dachte, in Content Scripts können Sie eine beliebige domänenübergreifenden XHRs nicht tun. Sie würden sie in einer Verlängerung Seite wie Hintergrund, Popup oder sogar Optionen zu tun, es zu tun haben.

Für weitere Informationen über die Content-Skript Einschränkung, lesen Sie bitte: http://code.google.com/chrome/extensions/content_scripts.html

Für weitere Informationen über XHR Einschränkung, lesen Sie bitte: http://code.google.com/chrome/extensions/xhr.html

Andere Tipps

Ich habe einen Teil des Problems gelöst, eigentlich das meiste davon. Zunächst wird, wie Brennan und ich gestern erwähnt, brauchte ich zum Festlegen von Berechtigungen in manifest.json.

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

Es ist nicht ideal Berechtigungen für jede Domain zu geben, aber da Bilder können von jeder Domain gehostet werden, wird es zu tun hat, und ich werde gegen XSS zu schützen hat.

Das andere Problem ist, dass Chrome in der Tat etwas Blöcke im content_scripts Abschnitt von AJAX Anrufe machen, andernfalls leise. Es gibt jedoch keine solche Beschränkung des background_page, wenn Sie eine haben. Die Seite kann keine AJAX Anrufe machen will, und Chrome hat eine API Ihr Skript zu ermöglichen, einen Port zu öffnen und übergeben Anforderungen an diese Hintergrundseite. Jemand schrieb ein Skript namens XHRProxy als Behelfslösung, und ich modifiziert er die entsprechende Antwort-Header zu erhalten. Es funktioniert!

Mein einziges Problem ist nun, herauszufinden, wie das Skript Warten auf das Ergebnis des Aufrufs zu machen für den Fall festgelegt werden, anstatt nur sofort zurück.

Überprüfen Sie die Manifest-Datei. Hat die Erweiterung Berechtigung zum Zugriff auf die URL?

Wenn es hilft, Ihr zweites Problem (oder jemand anderem): Sie können eine Anfrage an Ihren Hintergrund Seite wie senden:

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

Die Variable response kann alles sein, das Sie es haben wollen. Es kann einfach ein Erfolg oder ein String verweigern. Bis zu Ihnen.

Auf dem Hintergrund Seite können Sie einen Listener hinzu:

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.
});

Damit Sie die Antwort von Ihrer AJAX-Anforderung zurück zu Ihrem Content-Skript passieren können und tun, was Sie mit ihm dort tun wollten.

Die akzeptierte Antwort ist veraltet.

Inhalt Skripte können jetzt Cross-Site XMLHttpRequests machen wie Hintergrund-Skripte!

Sie möchten die über URLs im Manifest erlaubt sein:

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

Sie können auch Ausdrücke wie verwenden:

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

allgemeinere Berechtigungen erhalten.

Hier ist der Link zu der Dokumentation.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top