Jan 15, 2011
Opera Extension: Hatena Bookmark Comments 更新
Opera 11.00にてopera.extension.tabs.getFocusedでページ内のiframeと通信してしまう現象に遭遇したので、更新しました。
例えば、とあるページの中にAmazonの広告がiframeで埋め込まれていた場合、タブのfocusイベントでは正常にWebページと通信できていましたが、popupからのpostmessage後のmessageイベント中だとなぜかiframeと通信してしまいます。getFocused()で返ってきたオブジェクトの中身がiframeのものになっている状態です。
popupからbackgroundを介してinjectedと直接通信する作りになっていたので、表示しているページのDOM要素等を正確に取得することができません。
opera.extension.tabs.addEventListener("focus", function() {
var tab = opera.extension.tabs.getFocused();
if(tab && tab.url) {
opera.postError(tab.url); // => hogehoge.jp/
}
}, false);
opera.extension.onmessage = function(e) {
if(e.data.act == "get_url") { // from popup
var tab = Oex.tabs.getFocused();
if(tab && tab.url) {
opera.postError(tab.url); // => rcm-jp.amazon.co.jp/e/cm?...
}
}
}
focus時は正常に取得できているようなので、focus時にキャッシュしておいて、messageイベント中はgetFocusedを利用せずにキャッシュしたタブオブジェクトからpostMessageすれば正常にDOM要素等も取れるかと思ったら、通信先はキッチリiframeでした。
var curtab = null;
opera.extension.tabs.addEventListener("focus", function() {
var tab = opera.extension.tabs.getFocused();
curtab = tab ? tab : null;
opera.postError(curtab.url); // => hogehoge.jp/
}, false);
opera.extension.onmessage = function(e) {
if(e.data.act == "get_url") { // from popup
if(curtab && curtab.url) {
opera.postError(curtab.url); // => hogehoge.jp/
curtab.postMessage(""); // => injected script in rcm-jp.amazon.co.jp/e/cm?...
}
}
}
幸い、Hatena Bookmark Commentsはurlとtitleだけ取れればいい上に、tabオブジェクトからtitleが参照できることを知ったので、この不具合はすぐに修正できました。
直接通信しなければいいので回避方法はいくらでもありますが、postMessageで直接やりとりするような場合は注意したいです。