aboutsummaryrefslogtreecommitdiff
path: root/files/ja/mozilla/add-ons/webextensions/implement_a_settings_page/index.html
blob: b07cf5c99ed7239246dc02649feca167ba72740f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
---
title: 設定ページを実装する
slug: Mozilla/Add-ons/WebExtensions/Implement_a_settings_page
tags:
  - WebExtensions
translation_of: Mozilla/Add-ons/WebExtensions/Implement_a_settings_page
---
<div>{{AddonSidebar}}</div>

<p>設定ページは、ユーザーに拡張機能の設定を確認して変える方法を与えます(「プリファレンス」や「オプション」とも呼ばれます)。</p>

<p>WebExtension API では一般に、設定は <code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/API/storage">storage</a></code> API で保存されます。設定ページの実装は次の 3 ステップの手順です:</p>

<ul>
 <li>設定を表示して、ユーザーがそれを変更できる HTML を書く。</li>
 <li>HTML からインクルードされる、ストレージから設定ページに投入し、ユーザーが変更した時に保存された設定を更新するスクリプトを書く。</li>
 <li>HTML ファイルのパスを manifest.json の <code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json/options_ui">options_ui</a></code> キーに設定する。これにより、HTML 文書が、拡張機能の名前や説明と共に、文書ブラウザーのアドオンマネージャーに表示される。</li>
</ul>

<div class="note">
<p><code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/API/runtime/openOptionsPage">runtime.openOptionsPage()</a></code> 関数を使ってプログラム的に開くこともできます。</p>
</div>

<h2 id="A_simple_extension" name="A_simple_extension">簡単な拡張機能</h2>

<p>まずは、ユーザーが訪問するページに青い枠をつける拡張機能を書きます。</p>

<p>"settings" というディレクトリーを作り、そこに "manifest.json" という名前のファイルを作って下記の中身を入れます:</p>

<pre class="brush: json">{

  "manifest_version": 2,
  "name": "Settings example",
  "version": "1.0",

  "content_scripts": [
    {
      "matches": ["&lt;all_urls&gt;"],
      "js": ["borderify.js"]
    }
  ]

}</pre>

<p>この拡張機能はブラウザーに対し、"borderify.js" というコンテンツスクリプトを、ユーザーが訪問するすべてのウェブページで読み込むよう指示します。</p>

<p>次に、"settings" ディレクトリー内に "borderify.js" というファイルを作り、次の中身を入れます:</p>

<pre class="brush: js">document.body.style.border = "10px solid blue";</pre>

<p>これは単にページに青い枠をつけます。</p>

<p><a href="https://developer.mozilla.org/ja/Add-ons/WebExtensions/Temporary_Installation_in_Firefox">この拡張機能をインストール</a>してテストします — お好みのあらゆるウェブページを開きます:</p>

<p>{{EmbedYouTube("E-WUhihF8fw")}}</p>

<h2 id="Adding_settings" name="Adding_settings">設定を追加する</h2>

<p>今度は枠の色をユーザーが設定できるような設定ページを作りましょう。</p>

<p>まずは "manifest.json" を次の中身に更新します:</p>

<pre class="brush: json line-numbers language-json">{

  "manifest_version": 2,
  "name": "Settings example",
  "version": "1.0",

  "content_scripts": [
    {
      "matches": ["&lt;all_urls&gt;"],
      "js": ["borderify.js"]
    }
  ],

  "options_ui": {
    "page": "options.html"
  },

  <code class="language-json"><span class="property token">"permissions"</span><span class="operator token">:</span> <span class="punctuation token">[</span><span class="string token">"storage"</span><span class="punctuation token">]</span><span class="punctuation token">,</span>

  <span class="property token">"applications"</span><span class="operator token">:</span> <span class="punctuation token">{</span>
    <span class="property token">"gecko"</span><span class="operator token">:</span> <span class="punctuation token">{</span>
      <span class="property token">"id"</span><span class="operator token">:</span> <span class="string token">"addon@example.com"</span>
    <span class="punctuation token">}</span>
  <span class="punctuation token">}</span>

<span class="punctuation token">}</span></code></pre>

<p>新しく次の 3 つのキーを追加しました:</p>

<ul>
 <li><code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json/options_ui">options_ui</a></code>: これは HTML 文書に、この拡張機能の設定ページ(オプションページともいう)であることを設定します</li>
 <li><code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions">permissions</a></code>: <code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/API/storage">storage</a></code> API を使って設定を保存し、この API を使うパーミッションが必要です</li>
 <li><code>applications</code>: 同期ストレージに設定を読み書きするには、拡張機能の ID を入れておく必要があります</li>
</ul>

<p>次に "options.html" を提供する約束をしたので、作成します。"settings" ディレクトリー内にその名前でファイルを作成して、次の中身を与えます:</p>

<pre class="brush: html">&lt;!DOCTYPE html&gt;

&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset="utf-8"&gt;
  &lt;/head&gt;

  &lt;body&gt;

    &lt;form&gt;
        &lt;label&gt;Border color&lt;input type="text" id="color" &gt;&lt;/label&gt;
        &lt;button type="submit"&gt;Save&lt;/button&gt;
    &lt;/form&gt;

    &lt;script src="options.js"&gt;&lt;/script&gt;

  &lt;/body&gt;

&lt;/html&gt;
</pre>

<p>これは {{htmlelement("form")}} と、そこにラベル付きのテキスト {{htmlelement("input")}} と送信 {{htmlelement("button")}} を定義します。また "options.js" というスクリプトも入っています。</p>

<p>もう一度 "options.js"を "settings" ディレクトリーに作り、次の中身を与えます:</p>

<pre class="brush: js">function saveOptions(e) {
  e.preventDefault();
  browser.storage.sync.set({
    color: document.querySelector("#color").value
  });
}

function restoreOptions() {

  function setCurrentChoice(result) {
    document.querySelector("#color").value = result.color || "blue";
  }

  function onError(error) {
    console.log(`Error: ${error}`);
  }

  var getting = browser.storage.sync.get("color");
  getting.then(setCurrentChoice, onError);
}

document.addEventListener("DOMContentLoaded", restoreOptions);
document.querySelector("form").addEventListener("submit", saveOptions);
</pre>

<p>これは 2 つのことをします:</p>

<ul>
 <li>文書が読み込まれた時、"color" の値を <code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/get">storage.sync.get()</a></code> を使ってストレージから取り出します。値が未設定なら、既定の "blue" を用います。これで値を <code>sync</code> ストレージ領域から取得できます。</li>
 <li>ユーザーが "Save" を押して送信した時、テキストボックスの値を <code><a href="https://wiki.developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/set">storage.sync.set()</a></code> を用いて保存します。これで値を <code>sync</code> ストレージ領域に保存できます。</li>
</ul>

<div class="blockIndicator note">
<p>記: 別々の .js ファイルの指定が必要です。インライン JavaScript は使用できません。</p>
</div>

<p>ローカルストレージがふさわしいと感じる場合、代わりにローカルストレージに設定値を保存できます。</p>

<div class="note">
<p>Firefox の <code>storage.sync</code> の実装はアドオン ID に依存しているのに注意します。<code>storage.sync</code> を使う場合、上記manifest にあるように、manifest.json の <code><a href="https://developer.mozilla.org/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json/applications">applications</a></code> キーに拡張機能の ID をセットしておく必要があります。</p>
</div>

<p>最後に、ストレージから枠の色を読むのに "borderify.js" を更新します:</p>

<div class="warning">
<p>バージョン 52 より前の Firefox の <a href="/ja/docs/Mozilla/Add-ons/WebExtensions/API/storage/StorageArea/get">browser.storage.local.get()</a> のバグにより、下記のコードは機能しません。バージョン 52 より前の Firefox で動作させるには、<code>onGot()</code> の中で 2 回出てくる <code>item.color</code><code>item[0].color</code> に変えないといけません。</p>
</div>

<pre class="brush: js"> function onError(error) {
  console.log(`Error: ${error}`);
}

function onGot(item) {
  var color = "blue";
  if (item.color) {
    color = item.color;
  }
  document.body.style.border = "10px solid " + color;
}

var getting = browser.storage.sync.get("color");
getting.then(onGot, onError);
</pre>

<p>この時点で、拡張機能はこのようになります:</p>

<pre>settings/
    borderify.js
    manifest.json
    options.html
    options.js</pre>

<p>いま、次を行ってみます:</p>

<ul>
 <li><a href="https://developer.mozilla.org/ja/Add-ons/WebExtensions/Temporary_Installation_in_Firefox#Reloading_a_temporary_add-on">拡張機能を再読み込み</a></li>
 <li>ウェブページを読み込む</li>
 <li>設定ページを開いて枠の色を変える</li>
 <li>ウェブページを再読み込みして違いを見る</li>
</ul>

<p>Firefox で設定ページにアクセスするには about:addons に移動して拡張機能のエントリーの隣の "Preferences" ボタンをクリックします。</p>

<p>{{EmbedYouTube("ECt9cbWh1qs")}}</p>

<h2 id="Learn_more" name="Learn_more">詳しく学ぶ</h2>

<ul>
 <li><code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/manifest.json/options_ui">options_ui</a></code> マニフェストキーのリファレンス文書</li>
 <li><code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/API/storage">storage</a></code> API のリファレンス文書</li>
 <li>拡張機能から直接設定ページを開くには <code><a href="/ja/docs/Mozilla/Add-ons/WebExtensions/API/runtime/openOptionsPage">runtime.openOptionsPage()</a></code> API を使う</li>
 <li>設定ページの例:
  <ul>
   <li><a href="https://github.com/mdn/webextensions-examples/tree/master/favourite-colour">favourite-colour</a></li>
  </ul>
 </li>
</ul>