らいふうっどの閑話休題

興味のあることをゆる~く書いていく

新訳:ADB Helperをハックしてみた(bootstrap.js)

この記事は『Firefox OS / B2G OS Advent Calendar 2016』 17日目の記事です。
Firefox OS で、使用されている「ADB Helper」を再度まとめ直してみました。

目次

 

前回、新訳:ADB Helperをハックしてみた(adb-socket.js)に引き続き、 adb-helperをハックしていきたいと思います

  1. フォルダ内のファイル構成
  2. bootstrap.js
  3. 予備知識
  4. モジュール構成
  5. 今回のまとめ
  6. 関連記事
  7. 今年のAdvent Calendar
フォルダ内のファイル構成
  [ 解凍フォルダ内のjsファイル群 ]
install.rdf
main.js
adb.js
adb-client.js
adb-running-checker.js
adb-socket.js
bootstrap.js
scanner.js
device.js
※1
※1
※1
devtools-import.js
※1
※1
※1
devtools-require.js
※1
※1
※1
fastboot.js
※1
※1
※1
subprocess.js
※2
※2
※2
subprocess_worker_win.js
※3
※3
※3
subprocess_worker_unix.js
※4
※4
※4
  ※1 : version 0.7.1 時点では無かったファイル
※2 : version 0.7.1 時点で有ったファイル
※3 : version 0.7.1 時点で有ったファイル、Windows用ファイル
※4 : version 0.7.1 時点で有ったファイル、maclinux用ファイル

OS毎に使用されるファイルが有る事が確認できます。


bootstrap.js
  前回に引き続き、bootstrap.js ファイルをハックしていきたいと思います。   ご覧の通り、各OSでの差異はありません。

2014.11.06 時点から、かなりバージョンアップしているのが分かります。

モジュールは下図の通りです


予備知識
  ブートストラップ型拡張機能 - 拡張機能 | MDN
https://developer.mozilla.org/ja/docs/Extensions/Bootstrapped_extensions
bootstrap.js
http://mdn.beonex.com/en/Extensions/bootstrap.js.html
Components.interfaces
概要:プロパティがそれらの名前によって索引付けされたクラスである、読み出し専用オブジェクトです。
https://developer.mozilla.org/ja/docs/Components.interfaces
Components.utils
概要:便利でありながらも必須というわけではない、さまざまな XPConnect の機能のまとまりです。
そのインタフェースは js/src/xpconnect/idl/xpccomponents.idl で定義されています。
https://developer.mozilla.org/ja/docs/Components.utils
Preferences 概要:Mozilla 設定システムを利用しようとする拡張機能開発者向けのサンプルを示しています。
https://developer.mozilla.org/ja/docs/Code_snippets/Preferences


モジュール構成
  上記予備知識をもとにハックしていきます!
ファイル位置
処理概要
1 ~ 8 行目
  • Ci に Components.interfaces ライブラリ読み込み
  • Cu に Components.utils ライブラリ読み込み
  • Cu に Services.jsm をインポート
  • 定数:REASON を定義
    ['unknown', 'startup', 'shutdown', 'enable', 'disable', 'install', 'uninstall', 'upgrade', 'downgrade']
9 ~ 23 行目
registerAddonResourceHandler() 関数
  • 変数:file にパスを格納します。
  • 変数:fileuri file.isDirectory() を用いて、
    uri 情報を取得します。
  • encodeURIComponent() 関数を用いて、
    リソース名を格納します。
  • getProtocolHandler() 関数を用いて、
    リソース名をセットします。
  • リソース情報を返します。
9 ~ 23 行目
  • 変数:mainModule 定義
  • 変数:loader 定義
  • 変数:unload 定義
  • install() 関数
31 ~ 110 行目
startup オブジェクト
  • 変数:loaderModule を定義
  • 変数:unload を定義
  • 変数:loaderOptions を定義
  • 定数:LOGPREF を定義
  • 定数:LOGPREFIX を定義
  • canLog() 関数
  • 変数:ConsoleAPI を定義
  • 変数:consolePaths を定義
  • ConsoleAPI()インスタンス:_console を定義
  • 変数:loaderOptions.globals を定義
    • log() 関数を定義します。
    • warn() 関数を定義します。
    • error() 関数を定義します。
    • exception() 関数を定義します。
    • debug() 関数を定義します。
  • Loader() 関数に上記 loaderOptions を代入し、
    モジュールをロードします。
  • Require() 関数に引数:loader, { id: "./addon" } を
    代入し、変数:require_ を定義します。
  • 変数:mainModule にrequire_ を代入します。
112 ~ 121 行目
shutdown 関数
  • 引数:reasonCode を用いて、変数:reason に代入します。
  • 変数:loader = true の場合、unload() 関数を実行します。
  • mainModule = true かつ mainModule.shutdown = true の時
    mainModule.shutdown() 関数を実行します。
122 行目以降
  • uninstall() 関数


今回のまとめ
  今回のモジュールは、 アドオンのブート時の挙動をハックしました。 次回は、scanner.js をハックする予定です。


関連記事


今年のAdvent Calendar


去年のAdvent Calendar