OperaのpostMessageの実装(Opera10でLDR Full Feedを動くように)
OperaでLDR Full Feed - 0xFFがOperaで動かない件を調べてみたら、Opera10でpostMessageの実装が修正させていることに気がつきました。
元々、OperaはHTML5のドラフト時の仕様に沿って document.postMesage を実装していました。その後 HTML5側ではwindow.postMessageに仕様が変更されたのですが、しばらくの間Operaは古い実装のままでした。
その後、Opera9.50でwindow.postMessageに修正されました。ただ、この修正は単にdocumentからwindowに移動しただけという中途半端なもので、originなどのセキュリティ周りもdocumentに実装されていたときのままでした。
postMessageはIE8でも実装されていて標準化が進んでいるのに、Operaが足を引っ張る形になっているのが気になっていたのでこの修正はうれしい限りです。
というわけで、postMessageはSelectors APIと並んで今後に期待できるので、ぜひお試しを。
ちなみに変更点とは、主に下記の3点です。(変更点なので旧実装を知らないとわかりにくいと思います。てか、Operaの旧実装なんて知る必要がないので、ちゃんとwindow.postMessageを学びたい方はwindow.postMessage | MDNをどうぞ。)
- documentからwindowに(messageを受け取る側もwindowにaddEventListenerしといたほうが良いかも)
- MessageEventのdomainはoriginに(originはプロコトルからドメイン、ポートまでを含む)
- postMessageを送る際は第2引数に送り先となる origin を渡す
今回Opera版のLDR Full Feedが動かなかった原因は3つ目のoriginを渡していなかったからです。(あと、今回の修正ついでにSITEINFOをうちのサーバーに置くようにしました。)
スクリプトはOperaでLDR Full Feed - 0xFFからどうぞ。
PS:Opera10でLDR Full Feedが動いてないのに気がついたのは、2chのOperaスレで「LDR Full FeedをOpera10で使えますように」とお祈りされていたのがきっかけです。こういうバグ報告は2chに書かれていることが多く、自分では気が付いていないことが多いので助かります。