chrome 拡張をシークレットモードで有効にする

chrome 拡張は普通にインストールすると、シークレットモードで有効になっていない。 有効にするには拡張機能(chrome://extensions)から、「シークレットモードでの実行を許可する」にチェックを入れればよいのだけど、自分で書いた拡張をこれで有効にして実行したら以下のようなエラーが出た

Unchecked runtime.lastError while running tabs.executeScript: Cannot access a chrome:// URL at ...

試しにシークレットウィンドウから chrome://... の URL(拡張機能の js ファイル) にアクセスしても、禁止されていてみることができない。 シークレットモードからは executeScript することが出来ないのかなーと思って調べてみた

Overview - Google Chrome

ここに、シークレットモード (incognito mode) でのデータ保存に関するポリシーが書いてある。要約すると「ユーザーがどこで何をしたか、シークレットモードからは」保存するなよーと書いてあって、それは確かにという感じ。特に executeScript 出来ないとかは書いてない

いろいろ巡った結果、 manifest.json に一行追加すればいいことがわかった

Manifest - Incognito - Google Chrome

manifest の incognito はデフォルトが spanning になっている。 chrome 拡張は一つのプロセスとして動くのだけど、 spanning だとシークレットモードとそうでない普通のウィンドウに対して、1つのプロセスで処理する。対して split にすると、シークレットウィンドウの拡張は別のプロセスで動く(その拡張のプロセスが二つできる)。 どうやらシークレットモードに対して executeScript を実行するには split でないといけないようだ。プロセスが一緒で executeScript が実行出来ると、シークレットモードじゃない拡張からシークレットウィンドウにアクセス出来てしまいそう?

{
  ...
  "incognito": "split",
  ...
}

で解決した