JetpackでFirefox
   を拡張しよう
   2010/02/20
   mollifier
   http://d.hatena.ne.jp/mollifier/
id:mollifier
今日は Jetpack で
Firefox 拡張が書けるよ
うになって帰りましょう
   Jetpack とは
   拡張を書く:基本編
   拡張を書く:応用編
   参考ページ
   Jetpack とは
   拡張を書く:基本編
   拡張を書く:応用編
   参考ページ
Firefox の
拡張機能(Addon)
の一種
追加で「拡張機能」
をインストールして
実行できるようにな
る
Jetpack 用の
拡張の例
Jet Lagged
http://jetpackgallery.moz
illalabs.com/jetpacks/95

インストールページ
Jet Lagged

選択部分を
Google 翻訳で
翻訳する
Google It!

http://jetpackgallery.mozil
lalabs.com/jetpacks/231

インストールページ
Google It!

選択した単語を
Google で
検索する
TabGroup
    Organizer
http://jetpackgallery.mozill
alabs.com/jetpacks/164

インストールページ
TabGroup
 Organizer
今開いているタブ
を保存して、
後から開き直せる
このような
「Jetpack 用の
拡張機能」を
Feature と呼ぶ
Featureの特徴
jQuery を使って
サクサク書ける
Firefox の UI を
操作できる
   ステータスバーに
     ボタンを追加
   右クリックメニューに
     追加
それでは Jetpack
Feature の書き方
を見ていきましょう
   Jetpack とは
   拡張を書く:基本編
   拡張を書く:応用編
   参考ページ
Jetpack Feature
の基本的な書き方を
押さえる
その前に開発環境を
そろえる
必要なもの
   Firefox
   Jetpack 本体
   Firebug
   好きなエディタ
すぐに準備できる。
うれしい。
1. Hello World
jetpack.tabs.onReady(function() {
  console.log("Hello World!");
});
インストール用に
HTML ページが必要
<html>
  <head>

  <!-- ここが大事 -->
  <link rel="jetpack"
      href="hello.js"
      name="Hello Jetpack" />

  <title>Hello World</title>
  </head>
  <!-- 略 ... -->
<link rel="jetpack"
      href="hello.js"
      name="Hello Jetpack" />


href="Featureのパス"
  Web上に置いてある場合は
  http:// ... 形式で指定する

name="Feature 名"
jetpack.tabs.onReady(
   // ここに関数を書くと
  // 新しいタブを開いた
  // ときに呼び出される
);
jetpack.tabs.onReady(
   // Firebug の
  // コンソールに
  // 出力される
    console.log(
     "Hello World!");
);
2. Hello Jetpack
  in Statusbar
ステータスバーに
パネルを追加する例
jetpack.statusBar.append({
  html: "<em>Hello</em>",
  width: 45,
});
HTML を直接書ける


jetpack.statusBar.append({
  html: "<em>Hello</em>",
  width: 45,
});
クリックしたときの
何か動くようにする
jetpack.statusBar.append({
  html: "Click",
  width: 45,
  onReady: function(widget){
    $(widget).click(function() {
      jetpack.notifications.show(
        "Hello Statusbar");
    });
  }
});
onReady: function(widget){
  $(widget).click(function() {
    // 何か処理
  });
}

   onReady : 新しいパネルが作られた
       際のコールバック
   widget : パネル要素
   $ : jQuery の $
3. Disable
Hatena Keyword
Greasemonkey
っぽく動作する例
jetpack.future.import("pageMods");

function callback(doc) {
  $("a.keyword", doc).each(function() {
    $(this).replaceWith($(this).html());
  });
}

var options = {};
options.matches = [
    "http://d.hatena.ne.jp/*"
];
jetpack.pageMods.add(callback, options);
長いので分割
ポイント 1
jetpack.future.import(
  "pageMods");


この1行を書いておくと
pageMods という機能が有
効になる
ポイント 2
function callback(doc) {
  // doc が読み込んだページの
  // document オブジェクト
  $("a.keyword", doc).each(
     function() {
       // 何か処理
     }
  );
}
よくある書き方
function callback(doc) {
  // 引数が一つだけ
  $("a.keyword").each(
     function() {
       // 何か処理
    }
  );
}
document でドキュメン
トオブジェクトが参照で
きない。
なので、$(cssセレクタ)
という書き方ではどこか
ら要素を探すか決まらな
い。
function callback(doc) {
  // 第二引数で
  // どこから要素を探すか
  // 明示的に指定する
  $("a.keyword", doc).each(
     function() {
       // 何か処理
     }
  );
}
4. Info
Ajaxの例
jetpack.statusBar.append({
  html: "<button>info</button>",
  width: 60,
  onReady: function(widget) {
    $(widget).click(function() {
      var word = jetpack.tabs.focused.
        contentWindow.getSelection();

        $.get("http://www.google.co.jp/search",
          {q: word},
          function(data) {
            var info =
              $(data, widget).
                find("#resultStats").text();
            jetpack.notifications.show(info);
        });
      });
  }
});
$.get(
   "http://www.google.co.jp/search",
     {q: word},
   function(data) {
     // 受信した後の処理
  }
);



普通に jQuery の
$.get が使える
はまりやすい
 ポイント
onReady: function(widget) {
  // 略 ...
  $.get(
    "http://www.google.co.jp/search",
    {q: word},
    function(data) {
      var info = $(data, widget).
         find("#resultStats").text();


 コンテキストを指定する
 必要がある。
普通の jQuery コードでは

var info = $(data);

これで内部的に
document.createElement
が呼び出される。
Jetpack Feature では
document で
Document オブジェクトが
参照できない
onReady: function(widget) {
  // 略 ...
  $.get(
    function(data) {
      var info = $(data, widget).
         find("#resultStats").text();



 widget が追加したパネルの
 Document オブジェクトになっ
 ているので、うまくいく。
   Jetpack とは
   拡張を書く:基本編
   拡張を書く:応用編
   参考ページ
基本編の内容の
組み合わせで
けっこう色々なことが
できる
もう一工夫するための
Jetpack API の紹介
1. 右クリック
   メニュー
まずは簡単な例
選択したら
コンソールログに
出力する
jetpack.future.import("menu");

jetpack.menu.context.page.add({
  label: "simple menu",
  command: function() {
    console.log("simple menu");
  }
});
メニューを使うために
 必要な1行

jetpack.future.import("menu");
右クリックメニューに
 追加する

jetpack.menu.context.page.add({
  // 追加するメニューの内容
});
jetpack.menu.context.page.add({
  // メニューに表示する文言
  label: "simple menu",

  // メニューを選択したときの
  // コールバック関数
  command: function() {
    console.log("simple menu");
  }
});
これをふまえて
右クリックで選ん
だ要素を消す
Feature を作る
jetpack.future.import("menu");

jetpack.menu.context.page.add(
function(c) {
  return {
     label: "hide <" +
c.node.nodeName + ">",
     command: function() {
       $(c.node).fadeOut("fast");
     }
  };
});
jetpack.menu.context.page.add(
   function(c) {
     // この関数内で新しい
     // メニューの内容を作って返す。
     // c が右クリックした対象。
  }
);
function(c) {
  return {
    // c.node で右クリックした対象の
   // DOM node が参照できる
   label:
"hide <" + c.node.nodeName + ">",

         command: function() {
           $(c.node).fadeOut("fast");
         }
    };
}
ソースはここにあ
る
http://jetpackgallery.mozilla
labs.com/jetpacks/337

リンク
2. 設定画面
Feature の動作を
ユーザがカスタマ
イズできるように
したい
var manifest = {
   settings: [
     { name: "message",
       type: "text",
       label: "Name",
       default: "" }
   ]
};

jetpack.future.import(
  "storage.settings");
// 設定項目を定義する
var manifest = {
   settings: [
      // ここに設定項目を書く
     { name: "message",
        type: "text",
        label: "Name",
        default: "" }
   ]
};
var manifest = {
   settings: [
       // ...
   ]
};

// manifest を定義した後に
// import する
jetpack.future.import(
  "storage.settings");
// これで参照できる

var name =
  jetpack.storage.
    settings.message;

// settings: [
//    { name: "message",
//     この message に対応
これをふまえて
Twitter の Web
画面で Enter を
押しただけでつぶ
やく Feature を
作る
jetpack.future.import("pageMods");

var manifest = {
   settings: [
     { name: "needCtrlKey", type: "boolean", label: "Ctrl key",
default: false },
     { name: "needAltKey", type: "boolean", label: "Alt key",
default: false }
   ]
};
jetpack.future.import("storage.settings");

function isTweetKey(e) {
  if (jetpack.storage.settings.needCtrlKey && ! e.ctrlKey) {
    return false;
  }
  if (jetpack.storage.settings.needAltKey && ! e.altKey) {
    return false;
  }
  // 13 : Enter key code
  return e.keyCode === 13;
}
// ... 続く
ソースはここにあ
る
http://jetpackgallery.mozilla
labs.com/jetpacks/341

リンク
2つ設定項目をつくる
var manifest = {
  settings: [
    { name: "needCtrlKey", type: "boolean",
      label: "Ctrl key", default: false },

      { name: "needAltKey", type: "boolean",
        label: "Alt key", default: false }
  ]
};
jetpack.future.import("storage.settings");
Twitter ショートカット
キーだったらつぶやく
function callback(doc) {
  var textBox = $("#status", doc);
  textBox.keydown(function(e) {
    if (isTweetKey(e) && textBox.value !== "")
{
      $("#update-submit", doc).click();
    }
  });
}
押したキーの種類を
判別する
function isTweetKey(e) {
  if (jetpack.storage.settings.needCtrlKey &&
    ! e.ctrlKey) {
    return false;
  }
  if (jetpack.storage.settings.needAltKey &&
    ! e.altKey) {
    return false;
  }
  // 13 : Enter key code
  return e.keyCode === 13;
}
   Jetpack とは
   拡張を書く:基本編
   拡張を書く:応用編
   参考ページ
英語ページ
MDC APIリファレンス

かなり不十分 ...

https://developer.mozilla.or
g/en/Jetpack#API

リンク
JEPs

新しい機能についてのド
キュメント
https://wiki.mozilla.org/Lab
s/Jetpack/JEPs

リンク
Jetpack Gallery

Jetpack Feature がいっ
ぱいある
http://jetpackgallery.mozill
alabs.com/

リンク
Jetpack ソースコード
hg clone http://hg.mozilla.org/labs/
jetpack/ jetpack-src
でソースコードを取得


http://hg.mozilla.org/labs/j
etpack/

リンク
日本語ページ
MDC API リファレンス
日本語版


https://developer.mozilla.or
g/ja/Jetpack#API

リンク
modest Jetpack ページ

参考になる

https://dev.mozilla.jp/jetpa
ck/

リンク
APIリファレンス 日本語訳
modest 版

https://dev.mozilla.jp/jetpa
ck/api/

リンク
参考になるブログ

Jetpack カテゴリを
チェック
http://d.hatena.ne.jp/con_ma
me/

リンク
ローカルの Jetpack
Feature ファイルを
インストールする Feature

http://d.hatena.ne.jp/terama
ko/20091201

リンク
僕のブログ

Jetpack カテゴリーを
チェック
http://d.hatena.ne.jp/mollif
ier/

リンク
みなさんも
Jetpack に
挑戦してみて
下さい
ありがとう
ございました

Try Jetpack