前のエントリーにて『チャットに入っているユーザーが見えない!』というご指摘を頂いたので直してみることにしました。
続きを読む実は現象自体は大分前から把握していました。
paintchatのユーザーリストはflash(pchat_user_list.swf)とpaintchatのアプレットとが通信を行い、ログイン中のユーザーを取得するという仕組みなのですが、flash playerの9.0.124からセキュリティが強化されたことに伴い通信ができなくなってしまったようなのです。
(9.0.115以前では、動作が重いものの問題無く動作する事を確認済み)
この問題への対策は、以下の3つ。
●クライアントがflash playerを9.0.115以前にダウングレードする
→むざむざセキュリティホールを作るような真似はしたくない。
●Webサーバのドキュメントルートに、カスタムポリシーファイル(crossdomain.xml)を設置する
→flashのアクションスクリプト側に、ポリシーを取得する処理が入っていないと意味無し(試してみたけど結局通信できなかった)
※参考:カスタムポリシーファイル crossdomain.xml について(yoshiweb.NET-blog)
●flashを使わずにアプレットからリストを取得する仕組みを実装する
→paintchatの内部処理がワカンネ ('A`)
さぁどうしたものか…と思ってた矢先、
何となく観ていた2chの絵チャ板に3. の仕組みを実装したスクリプトが上がっていた!早速DLして導入したみたものの、今度はIEで動くけどOperaでは動かない現象が発生してしまう。
エラーコンソールからトレースログを見ると、main.jsのupdateUserListHtml関数で「Type mismatch」云々のエラーが出ていた。
これについて検索してみて調べたところ、どうやらOperaではJavaScriptの挙動に色々問題があるらしく、shift関数で要素を取得する時には一旦配列に格納してからで無いと駄目なのだそうだ。
※参考:argumentsに対してshiftするための考察(をしていたらカッとなって配列変換のベンチマーク)(IT戦記)
なので、該当する箇所をこんな感じに書き換えて対処。
> function updateUserListHtml(target){
> var csv = document.pChatListJava.getUserListCSV();
> var userList = csv.split("\t");
> var r = new Array();
> for (var i=0, j=userList.length; i<j; i++) {
> r.push(userList[i]);
> }
> var isError = r.shift();
> if(isError != "0"){alert("参加者リストアプレットエラー:"+isError);}
> if(r.length<2){r=[];}
> var html='<div class="count">参加人数:'+r.length/2+'人</div>';
> for(var k=0, n=r.length; k<n; k+=2){
> html+='<div class="user">'+r[k+1]+'</div>';
> }
> var embed=document.getElementById(target);
> embed.innerHTML=html;
> }
これでようやくIE・Opera両方にて正常動作する事を確認できました。
FireFoxについては未検証なので、そのうち見てみようかと思いますです。
(以下、2/11 18:07追記)
本家の方にも上記のOpera対応が入りました。素早い対応に感謝です!