とりあえずの回避策として、無効な 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
);
iframeにもmessageが飛んでるんじゃないかと思われます
返信削除ありがとうございます、お陰様で納得がいきました。iframe ごとにそれぞれ injected script がロードされているということなんですね。
返信削除となると、Extension 側で何らかの根本的な対策を行うというのはちょっと無理っぽいですね。Safari のこの挙動も一概に不具合とは言えないような気がしますので、まずはイシューリストにあたってみます。