読者です 読者をやめる 読者になる 読者になる

Firefox拡張で外部コマンド叩きたいやつのときどうするか

日ごろ便利に使わせてもらってる、とあるFirefox拡張に外部コマンドを叩くようなのがありまして、でもwindows版・mac版はあるのにlinux版はない、けれどぼくはプログラミングができると。
じゃあ作ったろうじゃないですか、というのがことの発端です。

XPCOMという地雷

軽くググりますとXPCOMという技術があることに気付きます。
決まった形式でC++のコード書くとFirefoxのjsからたたけるようになるよーん、みたいなものなんですね。
そうかそうか、C++でsystem()使って外部コマンド叩けばいいんじゃん?ということでコードをゴソゴソ書き始めたのですが、あらゆる場所にあるドキュメントがことごとく古いんですね。
(あっ、本記事の現在執筆時点での最新安定版は「xulrunner-22.0」です。恐らくこの記事の情報も古くなるでしょう)

一番良くまとまっていたのは恐らく須藤さん(なんでもやってる!)が書かれたドキュメントなのですが、これもいまではかなり古くなってしまってます。

特に大きくはまったのは「xpti.datとcompreq.datは現在は廃止されてる」ということですね。
おそらくみなさんのfirefoxのプロファイルディレクトリ(~/.mozilla/firefox/*.default/以下)にはxpti.datがご健在かもしれませんが、もうそれ使われてねーからm9(^Д^)プギャー
xptは動的に読みこむようになったみたいですね。ソースコード読むまでわからなかったぞ、このやろう。

またModuleの書き方なんかもかなり新しくなっています。
その辺は本家のサンプルを参考にしたほうがよさそうです。
というか本家のドキュメントもXPCOMに関しては悲惨な状態でどこに新しいものがあるのやら、という…。

あとはxpidlというコマンドの消失ですね。代わりにPythonのプログラムが転がっております…。

このあたりはMakefileをはっつけておきますのでご参考になれば。

ということでなんとかビルドできたんですね。*.soができた、やったー、と。

Firefoxに認識されないという地獄

はてブのFirefox拡張なんかを参考にして、chrome.manifestをちゃんと書いて、よっしゃこれで動くぞ!と思ったのですが、Components.classesにさっきビルドした*.soが全然乗ってこないのね。
おk、じゃあエラーかなんかでてんのね、と思って、firefox -jconsoleでログを追ってみてもセガール級の沈黙だったよね。はあ?
(エラーメッセージがないのは一番ツライということがよくわかった。正しいのか間違っているのか判断できないので…)

でもね、mozillafirefoxオープンソースなんすよ。コードが読めるじゃないですか、よっしゃー、と思って読んでみてもよく分からず、それなりにコードリーディングなんか楽しんじゃって、途中でパッチなんか書いたりして、あれ何やってたんだっけ、ああそうか。
とりあえずビルドしょ…あれ長いな…( ˘ω˘)スヤァ…( ノ゜Д゜)オハヨウ…(ノ`Д´)ノ彡┻オワッテネージャネーカ

頑張って(Components.classesの中を)探しました。でも、見つかりませんでした。
ダメだ、XPCOMってこれやっちゃダメなやつだなと気づきました。
結局上記の問題は解決出来なかったので、だれか詳しい人、教えてください…。

ctypes.jsmという選択肢

実はもうちょっと直接的な雰囲気で*.soを叩けるやつが最近はあるんですね。

他のxpiを覗いてみたらバッチリこれ使ってましたね。
うん、もう少しはやめに他の方のxpiを覗くべきでした。最初にググったのがまずかった。
firefoxは頻繁にバージョン更新するようになったので、そのために毎回sdkダウンロードして…とかやってらんないのかもしれないですね。

外部コマンド叩くだけならnsIProcessが使える

そもそもの目的はなんだっけ、そうだ外部コマンドを叩きたかったのです。
でもそれだけだったらnsIProcessで十分だってことに気づくんですよね。今頃かよ…。

本当は標準入力とかも与えたかったんだけど、その辺の具体的な方法は試してないです。
一応それらしいページは調べたけど、どう使うとかは不明。

とりえあず言いたいことは「xpcomを書くか!」となったら落ち着いて以下のページでも見ながら、jsだけで書けないか考えることですね。

おしまい…