« Jetpack SDK 0.7 の Notifications API | persist 属性による属性値の永続化 » |
Jetpack SDK 0.7 の Panel API
Jetpack SDK 0.7 では新たに Panel API が追加され、HTMLで記述されたGUIを表示可能なパネル型UIを追加するこが可能になりました。 Widget API で追加したボタン型UIと連携して、ボタンをクリックするとパネルを開くことも可能です。
基本的な使い方
Panel API を使うためには、まず panel モジュールをインポートします。なお、本記事のサンプルスクリプトでは exports.main
の記載などを省略しています。
var panels = require("panel");
次に、 Panel コンストラクタを使ってパネル型UIを作ります。引数には、色々なプロパティを有するオブジェクトを渡します。下記の例では 幅200、高さ150ピクセルのパネル上に指定したURLをロードします。
var myPanel = panels.Panel({
width : 200,
height: 150,
contentURL: "http://www.example.com/",
});
Panel コンストラクタで生成した panel オブジェクトの show
メソッドを呼び出すと、パネルを開くことができます。メソッドの引数に何も指定しない場合は親ウィンドウの中央にパネルが開かれます。
myPanel.show();
widget API の Widget コンストラクタの引数オブジェクトの panel プロパティに panel オブジェクトをセットすることで、ボタン型UIをクリックしてパネルを開くこともできます。
const widgets = require("widget");
var button = widgets.Widget({
label: "Test",
image: "chrome://browser/skin/Secure24.png",
panel: myPanel
});
widgets.add(button);
パネル型UIへ自前のHTMLをロードする
self API を使うと、パッケージの data フォルダ内に格納した自前のHTMLをパネル型UIへロードすることができます。
<html>
<body>
<p>Jetpack</p>
<button onclick="say('Hello');">Say Hello</button>
<button onclick="say('Bye');">Say Bye</button>
</body>
</html>
const self = require("self");
var myPanel = panels.Panel({
width : 200,
height: 150,
contentURL: self.data.url("panel.html"),
});
パネル型UIへコンテントスクリプトをロードする
引き続き、上記のパネルに配置されたボタンをクリックした際に、 Jetpack SDK の notifications API を使って通知を表示させるようにします。パネル型UIにロードされたHTMLからは直接 notifications API を呼び出すことはできず、2つの JavaScript コンテキスト間でメッセージを受け渡す、少し回りくどいやり方となります。
まず、 Panel コンストラクタの引数オブジェクトへ contentScriptURL プロパティを追加し、 self API を使って data フォルダ内に格納した panel.js のURLを配列で指定します。また、 contentScriptWhen プロパティに “ready” という値を指定することで、パネル内のHTMLロード完了時にスクリプトが実行されるようになります。
const self = require("self");
var myPanel = panels.Panel({
width : 200,
height: 150,
contentURL: self.data.url("panel.html"),
contentScriptURL: [self.data.url("panel.js")],
contentScriptWhen: "ready",
});
contentScriptURL プロパティによって読み込まれるスクリプト(コンテントスクリプト)は、HTMLに<script>タグで記述したスクリプトと異なる特殊な JavaScript コンテキストで実行されます。そのため、HTMLの window オブジェクトにアクセスするには明示的に window.
とする必要があります。以下の例では window オブジェクト直下に say
という関数を追加し、 button 要素の onclick 属性から呼び出し可能にしています。また、コンテントスクリプトでは特殊な変数 panel の sendMessage メソッドによって main.js 側の JavaScript コンテキストへ文字列(あるいはJSON文字列化可能なオブジェクトなど)を送ることができます。
window.say = function(text) {
panel.sendMessage(text);
};
panel オブジェクトの sendMessage で送られた文字列(あるいはJSON文字列化可能なオブジェクトなど)は、 main.js 側の JavaScript コンテキスト内の panel オブジェクトの onMessage コールバック関数によって受け取ることができます。以下の例では受け取った文字列を notifications API を使って通知として表示します。
const self = require("self");
var myPanel = panels.Panel({
width : 200,
height: 150,
contentURL: self.data.url("panel.html"),
contentScriptURL: [self.data.url("panel.js")],
contentScriptWhen: "ready",
onMessage: function(message, callback) {
require("notifications").notify({
title: "Message from Panel",
text: message
});
}
});