9

Firefox拡張機能の1つをChromeに移植していますが、AJAXクエリで小さな問題が発生しています。次のコードはFF拡張機能では正常に機能しますが、Chromeではステータスが「0」で失敗します。

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

拡張機能のこの特定の部分は、クリップボードの内容をチェックし(Chromeのもう1つの問題はすでに解決済みです)、画像のURLの場合は、HEADリクエストを送信し、「Content-Type」応答ヘッダーをチェックして画像であることを確認します。その場合、trueを返し、クリップボードのテキストをIMGタグに貼り付けます。それ以外の場合、画像ではない通常のURLのように見える場合は、Aタグでラップします。URLでない場合は、単純な貼り付けを行います。

とにかく、チェックされているURLは間違いなく画像であり、FFで正常に機能しますが、完全な関数では、xhr.statusは「0」であり、関数が完了するとステータスは「エラー」になります。タイムアウトを10秒に増やしても効果はありません。実行時にテストイメージが「image/jpeg」として返されることを確認しました。

curl -i -X HEAD <imageURL>

また、完全ではなく成功とエラーのコールバックを使用する必要があることもわかっていますが、どちらも機能しません。何か案は?

4

4 に答える 4

11

Chris が理解したように、コンテンツ スクリプトではクロスドメイン XHR を実行できません。背景、ポップアップ、さらにはオプションなどの拡張ページでそれらを実行する必要があります。

コンテンツ スクリプトの制限に関する詳細については、 http ://code.google.com/chrome/extensions/content_scripts.html を参照してください。

また、xhr の制限に関する詳細については、 http ://code.google.com/chrome/extensions/xhr.html を参照してください。

于 2009-12-24T20:11:31.773 に答える
6

問題の一部、実際には大部分を解決しました。まず、Brennan と私が昨日話したように、manifest.json にアクセス許可を設定する必要がありました。

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

すべてのドメインにアクセス許可を与えるのは理想的ではありませんが、イメージはどのドメインからでもホストできるため、そうする必要があり、XSS から保護する必要があります。

もう 1 つの問題は、Chrome が実際に content_scripts セクション内のすべてをブロックして AJAX 呼び出しを行い、サイレントに失敗することです。ただし、background_page がある場合、background_page にはそのような制限はありません。そのページは必要な AJAX 呼び出しを行うことができ、Chrome には API があり、スクリプトがポートを開き、リクエストをそのバックグラウンド ページに渡すことができます。回避策として誰かがXHRProxyというスクリプトを書いたので、私はそれを修正して適切な応答ヘッダーを取得しました。できます!

私の唯一の問題は、すぐに戻るのではなく、呼び出しの結果がイベントに設定されるまでスクリプトを待機させる方法を考え出すことです。

于 2009-12-24T15:10:30.913 に答える
5

マニフェストファイルを確認してください。拡張機能にはそのURLにアクセスする権限がありますか?

それがあなたの2番目の問題(または他の誰か)に役立つ場合:あなたは次のようにあなたのバックグラウンドページにリクエストを送ることができます:

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

変数は、任意の値responseにすることができます。それは単に成功または拒否の文字列である可能性があります。君による。

バックグラウンドページで、リスナーを追加できます。

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

これにより、AJAXリクエストからの応答をコンテンツスクリプトに戻し、そこでやりたいことを何でも行うことができます。

于 2009-12-23T22:53:20.037 に答える
2

受け入れられた答えは古くなっています。

コンテンツ スクリプトは、バックグラウンド スクリプトと同様にクロスサイト XMLHttpRequests を作成できるようになりました。

関連する URL をマニフェストで許可する必要があります。

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

次のような表現も使用できます。

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

より一般的な権限を取得します。

ここにドキュメントへのリンクがあります。

于 2013-09-11T16:14:50.803 に答える