一角獣は夜に啼く

ただの日記です。

思ってることとか考えたこととか適当に書きます。 主にソフトウェア開発の話題を扱う 「ひだまりソケットは壊れない」 というブログもやってます。

chrome.extension.onConnect に addListener していない状態で chrome.extension.connect するとエラーが発生する

Chrome 拡張の manifest.json を version 2 にする作業をしていたときのこと。

manifest.json の version を 2 にしてみたところ、以下のエラーが発生しました。

Port error: Could not establish connection. Receiving end does not exist. (miscellaneous_bindings:232)
chromeHidden.Port.dispatchOnDisconnect (miscellaneous_bindings:232)

発生箇所を詳しく調べてみると、chrome.extension.connect() という Chrome API のメソッド の中で発生しているようでした。 「このメソッドは別に manifest.json を version 2 にしたら使えなくなるわけでもないはずだし、なんでだろうなー」 と悩むことしばし。 原因は chrome.extension.connect() メソッドと対となる chrome.extension.onConnect へのイベントリスナの追加を行うコードで、chrome.extension.onConnect ではなく chrome.self.onConnect を使っていたことでした。

manifest.json の version 1 では chrome.self は有効でしたが、version 2 では下記のとおり使えなくなっています。

  • The chrome.self API has been removed. Use chrome.extension instead.
Manifest Version - Google Chrome

どうやら、chrome.extension.onConnectaddListener メソッドを使ってイベントリスナの追加をしていない状態で chrome.extension.connect() メソッドを呼び出すと、冒頭のエラーが発生するようです。 書いてあるとおりに、chrome.self の代わりに chrome.extension を使うことで解決しました。

確かにエラーメッセージには "Receiving end does not exist" って書いてあるので、ある程度 chrome 拡張に詳しい人だとすぐに原因がわかりそうではありますが、いかんせん chrome.extension.connect メソッドの呼び出し場所と chrome.self.onConncet を使用している箇所が離れている (background ページと content ページ、という具合に) ので、ちょっとはまってしまいました。