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 では下記のとおり使えなくなっています。
Manifest Version - Google Chrome
- The
chrome.self
API has been removed. Usechrome.extension
instead.
どうやら、chrome.extension.onConnect
に addListener
メソッドを使ってイベントリスナの追加をしていない状態で chrome.extension.connect()
メソッドを呼び出すと、冒頭のエラーが発生するようです。 書いてあるとおりに、chrome.self
の代わりに chrome.extension
を使うことで解決しました。
確かにエラーメッセージには "Receiving end does not exist" って書いてあるので、ある程度 chrome 拡張に詳しい人だとすぐに原因がわかりそうではありますが、いかんせん chrome.extension.connect
メソッドの呼び出し場所と chrome.self.onConncet
を使用している箇所が離れている (background ページと content ページ、という具合に) ので、ちょっとはまってしまいました。