2010年6月8日火曜日

[Safari Extension] injected script が複数個ロードされる場合があるんだが

Webインスペクタを見て気付いたのですが、どうやらページによっては injected script が複数個ロードされることがあるようです。よって、Global HTMLからinjected scriptへのdispatchMessageが複数回行われる事になってしまいます。今回作ったものですとロードされた injected script の数だけタブが開いてしまうので、ページによっては「ブラクラかよw」という状況になっていました(GigaOMなんかがそう)

とりあえずの回避策として、無効な injected script では document.getSelection()が常に undefined を返すので、その場合は Global HTML に対する dispatchMessage を発行しないようにしました。根本的な原因はまだわからないので、勉強かたがたドキュメントを隅々まで読んどかなあきまへんな。

injected.js
safari.self.addEventListener(
"message",
function(msg) {
const pattern = {
google: "http://translate.google.co.jp/?hl=ja&tab=wT#en|ja|{}",
alc: "http://eow.alc.co.jp/{}/UTF-8/?ref=sa",
ud: "http://www.urbandictionary.com/define.php?term={}"
};
var w = document.getSelection().toString();
if (w) {
safari.self.tab.dispatchMessage(pattern[msg.name].replace("{}", encodeURIComponent(w)));
}
},
false
);

2 件のコメント:

  1. iframeにもmessageが飛んでるんじゃないかと思われます

    返信削除
  2. ありがとうございます、お陰様で納得がいきました。iframe ごとにそれぞれ injected script がロードされているということなんですね。

    となると、Extension 側で何らかの根本的な対策を行うというのはちょっと無理っぽいですね。Safari のこの挙動も一概に不具合とは言えないような気がしますので、まずはイシューリストにあたってみます。

    返信削除