swfをイジったりする時にドメインが違う場合、System.security.allowDomain()とやらでドメインを許可?しなくてはいけないのだが、ニコニコのバージョンアップでswfがres.nicovideo.jpになったせいでいろいろ問題が生じた。そのメモ。
■今回問題になった例1■
1www.nicovideo.jpのJavaScript
2www.nicovideo.jpから呼ばれたres.nicovideo.jp/flvplayer_wrapper.swf
3上記のwrapperからloadMovieされたres.nicovideo.jp/flvplayer.swf
1から2をイジる(wrapperの一部の機能) ○
2から3をイジる(wrapperのメイン機能) ○
1から3をイジる(おそらくiroiroのメイン機能) ×
なんとなく分かるような分からないような・・・・
さらに
■その他の例2■
1www.nicovideo.jpのJavaScript
2www.nicovideo.jpから呼ばれたres.nicovideo.jp/flvplayer_wrapper.swf
3上記のwrapperからloadMovieされたwww.nicovideo.jp/flvplayer.swf
1から2をイジる(wrapperの一部の機能) ○
2から3をイジる(wrapperのメイン機能) ×
1から3をイジる(おそらくiroiroのメイン機能) ○
この問題を解決するにはSystem.security.allowDomain("www.nicovideo.jp")とやって、「ボクのことイジってもokだよ!」みたいな設定をしないとダメなわけだが、例1も例2もイジられ役はflvplayer.swfなので、flvplayer.swfに許可をもらわないといけない。
ところがflvplayer.swfに許可ださせようとして、wrapperのreplaceFunction()のnico.OpenInput()あたりにallowDomain入れても許可されない。セキュリティ上の問題だから当たり前か。もともとのflvplayer.swfにallowDomainが入っていないとダメなわけだ。
1から2をイジるのはドメインが違ってもokなのは、単純にページのソースに埋め込まれているから許可されるんだろうか?そうならiroiro単体なら今までどおり動くってことだろうけど。
結局、イジられ役のflvplayer.swfにドメインを合わせないとダメなワケで、ドメインを全部統一するしかiroiroと共存させる方法はない(と思う)。
スレで紹介されてたオミトロンのフィルターは、以下のような状態にするためのもの(たぶん)。
■スレで紹介されてたフィルター■
1www.nicovideo.jpのJavaScript
2www.nicovideo.jpから呼ばれたwww.nicovideo.jp/flvplayer_wrapper.swf
3上記のwrapperからloadMovieされたwww.nicovideo.jp/flvplayer.swf
1から2をイジる(wrapperの一部の機能) ○
2から3をイジる(wrapperのメイン機能) ○
1から3をイジる(おそらくiroiroのメイン機能) ○
res.nicovideo.jpに統一するのはちょっとめんどそうだから、wrapperの方で
loadMovie("http://res.nicovideo.jp/flvplayer.swf")
を
loadMovie("http://www.nicovideo.jp/flvplayer.swf")
に変更しないとダメってことか。
iroiro併用だとどうせフィルターも別になるからフィルター側で
flvplayer_wrapper.swf?flvplayer_domain=www.nicovideo.jp&ts=1234567
とかに置換して、phpで
if(flvplayer_domain == undefined){var flvplayer_domain = "res.nicovideo.jp";}
nico.loadMovie("http://" + flvplayer_domain + "/flvplayer.swf?ts=" + ts);
とかでいいか。
■今回問題になった例1■
1www.nicovideo.jpのJavaScript
2www.nicovideo.jpから呼ばれたres.nicovideo.jp/flvplayer_wrapper.swf
3上記のwrapperからloadMovieされたres.nicovideo.jp/flvplayer.swf
1から2をイジる(wrapperの一部の機能) ○
2から3をイジる(wrapperのメイン機能) ○
1から3をイジる(おそらくiroiroのメイン機能) ×
なんとなく分かるような分からないような・・・・
さらに
■その他の例2■
1www.nicovideo.jpのJavaScript
2www.nicovideo.jpから呼ばれたres.nicovideo.jp/flvplayer_wrapper.swf
3上記のwrapperからloadMovieされたwww.nicovideo.jp/flvplayer.swf
1から2をイジる(wrapperの一部の機能) ○
2から3をイジる(wrapperのメイン機能) ×
1から3をイジる(おそらくiroiroのメイン機能) ○
この問題を解決するにはSystem.security.allowDomain("www.nicovideo.jp")とやって、「ボクのことイジってもokだよ!」みたいな設定をしないとダメなわけだが、例1も例2もイジられ役はflvplayer.swfなので、flvplayer.swfに許可をもらわないといけない。
ところがflvplayer.swfに許可ださせようとして、wrapperのreplaceFunction()のnico.OpenInput()あたりにallowDomain入れても許可されない。セキュリティ上の問題だから当たり前か。もともとのflvplayer.swfにallowDomainが入っていないとダメなわけだ。
1から2をイジるのはドメインが違ってもokなのは、単純にページのソースに埋め込まれているから許可されるんだろうか?そうならiroiro単体なら今までどおり動くってことだろうけど。
結局、イジられ役のflvplayer.swfにドメインを合わせないとダメなワケで、ドメインを全部統一するしかiroiroと共存させる方法はない(と思う)。
スレで紹介されてたオミトロンのフィルターは、以下のような状態にするためのもの(たぶん)。
■スレで紹介されてたフィルター■
1www.nicovideo.jpのJavaScript
2www.nicovideo.jpから呼ばれたwww.nicovideo.jp/flvplayer_wrapper.swf
3上記のwrapperからloadMovieされたwww.nicovideo.jp/flvplayer.swf
1から2をイジる(wrapperの一部の機能) ○
2から3をイジる(wrapperのメイン機能) ○
1から3をイジる(おそらくiroiroのメイン機能) ○
res.nicovideo.jpに統一するのはちょっとめんどそうだから、wrapperの方で
loadMovie("http://res.nicovideo.jp/flvplayer.swf")
を
loadMovie("http://www.nicovideo.jp/flvplayer.swf")
に変更しないとダメってことか。
iroiro併用だとどうせフィルターも別になるからフィルター側で
flvplayer_wrapper.swf?flvplayer_domain=www.nicovideo.jp&ts=1234567
とかに置換して、phpで
if(flvplayer_domain == undefined){var flvplayer_domain = "res.nicovideo.jp";}
nico.loadMovie("http://" + flvplayer_domain + "/flvplayer.swf?ts=" + ts);
とかでいいか。