Chrome Native Messaging

2014-02-08T00:00:00+00:00 C++ Chrome Extension JavaScript

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)

ProgressFragment Twitter Bootstrap+sidr.jsによるスライドコンテンツ領域に関して