Chrome Native Messaging
https://developer.chrome.com/extensions/messaging.html#native-messaging っていうのがある模様なので色々やってみた
参考1: Google ChromeでトレイからCDを排出できるブラウザ拡張をつくりました(Native messaging版)
参考2: communication between native-app and chrome-extension
/etc/opt/chrome/native-messaging-hosts/kinjouj.test.json
{
"name": "kinjouj.test",
"description": "my app",
"path": "/etc/opt/chrome/native-messaging-hosts/kinjouj.test",
"type": "stdio",
"allowed_origins": ["chrome-extension://gaegbpbojjgpmjkihclmjelhbopfflmp/"]
}
公式ドキュメントにも書いてるけど、これを置く場所はOSによって異なる。上記の見出しのファイル場所はLinuxの置き場である/etc/opt/chrome/native-messaging-hosts/[name].jsonで定義している
で今回の/etc/opt/chrome/native-messaging-hosts/kinjouj.testっていうプログラム自体はC++で作ってある
kinjouj.test.cc
#include <stdio.h>
#include <iostream>
using namespace std;
int main(int argc, char* argv[]) {
cout.setf(ios_base::unitbuf);
unsigned int i, c, l = 0;
string s;
for (i = 0; i <= 3; i++) {
l += getchar();
}
for (i = 0; i < l; i++) {
c = getchar();
s += c;
}
l = s.length();
cout << char(((l >> 0) & 0xFF))
<< char(((l >> 8) & 0xFF))
<< char(((l >> 16) & 0xFF))
<< char(((l >> 24) & 0xFF));
cout << s;
}
参考2のプログラムをそのまんまだけど。要は
- 最初のリクエストにはバイト長(4bytes分?)が入ってる? (おそらくはpostMessageで送ることができるデータもサイズに制限ありなんだろう)
- それ以降のデータをバイト長な分だけを取る (これが生データ?)
- レスポンスを返すときは最初にそのレスポンスのデータ長を出力?
- で生データを出力
的な感じなのではないかと(多分)
manifest.json
{
"name": "test",
"version": "1.0",
"manifest_version": 2,
"background": {
"scripts": ["bg.js"]
},
"browser_action": {
"default_title": "test"
},
"permissions": ["nativeMessaging"]
}
permissionsにnativeMessagingが必要な模様
bg.js
(function(undefined) {
chrome.browserAction.onClicked.addListener(function() {
var port = chrome.runtime.connectNative("kinjouj.test");
port.onMessage.addListener(onMessage);
port.postMessage("kinjouj.test");
});
function onMessage(data, port) {
console.log(port);
alert(data);
}
})();
port.postMessageするとport connectionが切断される模様
まぁ終わりなんですが、要は
- ブラウザアクションをクリックしたらnative messagingでデータを送信
- 上記設定で書いたプログラムが作用されて、その出力がChrome側に帰る(onMessage)