Flashを使った半クロスドメインのXMLHttpRequestのようなもの

Flashを使ってJavaScriptで半クロスドメイン通信 - ヒルズで働く@robarioの技ログ
やっぱり「swfの読み込み完了を待つ」「完了時のコールバックを指定する」というのがちょっといただけないので、send()を遅延実行するタイプに戻した。なのでファイル2個になりました。

この2つのファイルを同じディレクトリに突っ込んで、CrossDomainXMLHttpRequest.jsを読み込めばOK。

何で「半クロスドメイン」かというと、通信先のcrossdomain.xmlによって許可されている必要があるから『半』なのです。crossdomain.xmlを設置する側の人はcrossdomain.xml と CSRF 脆弱性について - 2nd lifeもどうぞ。

サンプルはこんな感じ。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="ja">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="Content-Style-Type" content="text/css">
    <meta http-equiv="Content-Script-Type" content="text/javascript">
    <title>CrossDomainXMLHttpRequest</title>
    <script type="text/javascript" src="CrossDomainXMLHttpRequest.js"></script>
    <script type="text/javascript">
XMLHttpRequest = CrossDomainXMLHttpRequest;

var req = new XMLHttpRequest();
req.open('GET', 'http://twitter.com/statuses/public_timeline.xml', true);
req.setRequestHeader('content-type', 'application/x-www-form-urlencoded; charset=UTF-8');
req.onreadystatechange = function() {
    if (req.readyState != 4) {
        return;
    }
    alert(req.responseText);
};
req.send('');
    </script>
  </head>
  <body>
  </body>
</html>

別に"var req = new CrossDomainXMLHttpRequest();"でもいいんだけど。例えば「何かURIを渡すと、XMLHttpRequest使って読み込んでごにょごにょしてくれる外部スクリプト」を読み込む前に"XMLHttpRequest = CrossDomainXMLHttpRequest;"とかしておくと、スクリプトをいじらずに半クロスドメイン対応ができます、ってことをちょっと言いたかった。"XMLHttpRequest = JSONScriptRequest;"とかしてみたりとかね。

JavaScriptって面白いなー。

特長とか

  • ポリシーファイルが/crossdomain.xmlじゃ無い場合、CrossDomainXMLHttpRequest.addPolicyFileを使って追加できます。
  • 今のところsynchronousはできません。

- CrossDomainXMLHttpRequest.js、CrossDomainXMLHttpRequest.swfは、この名前のままで、同じディレクトリに置かないとダメ

作業中

  • swfファイルの場所を指定できないのでHTMLと同じところにおかないとダメ
    • 場所を指定できるようにする
    • jsファイルのある位置をデフォルト位置にする
  • レスポンスヘッダの処理
  • 通信エラー発生時の処理
  • readyState==3(LODING)のときにresponseTextを取れるようにする(これはやらないかも?いらないよね?)
  • abort処理
  • statusTextの処理
  • statusの処理の見直し
  • 名前を決める(CrossDomainXMLHttpRequestは長ったらしい。FlashXMLHttpRequest?うーん)
  • Cookieの処理
  • イベントディスパッチャの実装
  • synchronousなsend
  • responseXMLとか実装