memoile

Icon

Opera Extension: Hatena Bookmark Comments 更新

Opera 11.00にてopera.extension.tabs.getFocusedでページ内のiframeと通信してしまう現象に遭遇したので、更新しました。

htbcomment.oex ver 0.2

例えば、とあるページの中に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で直接やりとりするような場合は注意したいです。

Post to TwitterTweets for this web page Hatena Bookmark for this entryHatena Bookmark - Opera Extension: Hatena Bookmark Comments 更新 Clip this entry on Livedoor ClipLivedoor Clip - Opera Extension: Hatena Bookmark Comments 更新 Add to Google Bookmark Share on Tumblr Share on FriendFeed Digg This

Tagged: ,

Leave a Reply