/
674.txt
546 lines (425 loc) · 33.7 KB
/
674.txt
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
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
[15] [DFN[[RUBYB[プラグイン]@en[plugin]]]]は、[[利用者エージェント]]が定義するところの[[利用者エージェント]]が利用する[RUBYB[内容取り扱い器]@en[content handler]]であって、
[[利用者エージェント]]の [CODE(DOMi)@en[[[Document]]]] の[[レンダリング]]の一部となることができるものであり、
しかし [CODE(DOMi)@en[[[Document]]]] の[[子供閲覧文脈]]でも [CODE(DOMi)@en[[[Node]]]]
[[オブジェクト]]を作るものでもないようなものをいいます [SRC[>>11]]。
[16] 通常は[RUBYB[[[第三者]]]@en[third party]]に提供されるものですが、
[[利用者エージェント]]に組み込まれたものもあります [SRC[>>11]]。
[EG[
[17] 例えば現在の多くの [[Webブラウザー]]は、組み込みの [[PDF]]
[[プラグイン]]を持っています。
]EG]
;; [18] [[Webブラウザー]]から別途起動されるものは[[ヘルパーアプリケーション]]と呼ばれ、
[[プラグイン]]とは異なります。
* 仕様書
[REFS[
- [11] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-03-05 09:33:40 +09:00]] 版) <https://html.spec.whatwg.org/#plugin>'''
- [23] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#concept-param-parameter>
- [62] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#storage-mutex>
- [67] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#plugins-2>
]REFS]
* 文脈
[10] [[プラグイン]]は、次の場面で使われることがあります。
[FIG(short list)[
- [CODE(HTMLe)@en[[[embed]]]]
- [CODE(HTMLe)@en[[[object]]]]
- [CODE(HTMLe)@en[[[applet]]]]
- [[プラグイン文書]]
]FIG]
* Web ブラウザーとプラグインの間の API
[19] [[HTML Standard]] では[[Webブラウザー]]と[[プラグイン]]の間の [[API]]
は規定せず、[[利用者エージェント]]と[[プラットフォーム]]に依存するもの [SRC[>>11]]
としています。
;; [20] [[プラグイン]]に対応しないことも認められています [SRC[>>11]]。
[12] 各 [[Webブラウザー]]は[[プラグイン]]と[[Webブラウザー]]との間の [[API]]
を用意しています。
[FIG(short list)[
- [[NPAPI]]
- [[PPAPI]]
- [[ActiveX control]]
- [[Qt based plugins]]
- [[NaCl]]
]FIG]
[44] [[IE]] は [[ActiveX control]] に対応しています。 [[Gecko]] は [[NPAPI]]
に対応しています。 [[Blink]] は [[PPAPI]] に対応しています。
[[WebKit]] は [[NPAPI]] に対応しています。
[13] [[プラグイン]]は、 [[DOM]] 上の [CODE(HTMLe)@en[[[embed]]]] [[要素]]や
[CODE(HTMLe)@en[[[object]]]] [[要素]]を通じて[[スクリプト]]に [[API]]
を提供できます。
;; [14] かつては [[Javaアプレット]]と[[スクリプト]]を相互接続する [[LiveConnect]]
も使われていました。
[21] [[著者]]の[[スクリプト]]はそのような [[API]] の有無を通じて当該[[要素]]を処理する[[プラグイン]]が有効か否かを判断できます。
また [CODE(DOMi)@en[[[Navigator]]]] [[オブジェクト]]にも当該環境で有効な[[プラグイン]]の情報を提供する
[[API]] があります。
;; [CODE(JS)@en[[[navigator.plugins]]]]、[CODE(JS)@en[[[navigator.mimeTypes]]]]
参照。
[30] [CODE(HTMLe)@en[[[object]]]] [[要素]]の[[プラグイン]]は、[[フォームデータ集合]]に値を提供できます。
[58] [[プラグイン]]は [[Webブラウザー]]に対して、次のものを提供する必要があります。
[FIG(list members)[
:名前:[CODE(DOMa)@en[[[name]]]] 属性で使う値。
:[[保安プラグイン]]か否か:[[保安プラグイン]]とできるかどうか。
:[[隠れプラグイン]]:
[CODE(DOMi)@en[[[PluginArray]]]] に含まれ[[列挙可能]]か、
[CODE(DOMi)@en[[[PluginArray]]]] に含まれるが[[列挙可能]]ではない[DFN[[RUBYB[隠れプラグイン]@en[hidden plugin]]]] [SRC[>>67]] か、
[CODE(DOMi)@en[[[PluginArray]]]] に含まれないかのいずれか。
:[[MIME型]]:ある [[MIME型]]の指定が当該[[プラグイン]]で処理できるかどうかを判定します。
そのうちのいくつかは、 [[DOM]] に晒されます。晒されるものについては、
[CODE(DOMa)@en[[[description]]]] [[属性値]]と [CODE(DOMa)@en[[[suffixes]]]]
[[属性値]]も必要です。
:[[拡張子]]:ある [[URL]] の [[path]] が当該[[プラグイン]]で処理できるかどうかを判定する。
:[CODE(HTMLa)@en[[[classid]]]]:ある [CODE(HTMLa)@en[[[classid]]]]
が当該[[プラグイン]]で処理できるかどうかを判定する。
:[CODE(DOMa)@en[[[version]]]]:[CODE(DOMa)@en[[[version]]]] [[属性値]]。
:[CODE(DOMa)@en[[[description]]]]:[CODE(DOMa)@en[[[description]]]] [[属性値]]。
:[CODE(DOMa)@en[[[filename]]]]:[CODE(DOMa)@en[[[filename]]]] [[属性値]]。
実際の[[ファイル名]]である必要はありません。
:[[実現値化]]:[[プラグイン]]を[[実現値化]]する。[[Webブラウザー]]は、
[[fetch]] して得られた[[資源]] (あれば) と[[引数]]の名前と値の組のリスト、
[CODE(HTMLa)@en[[[data]]]] [[属性値]] ([CODE(HTMLe)@en[[[object]]]])、
[[保安プラグイン]]とするかどうか、する場合は[[砂箱化]]の設定を引き渡す。失敗したら、エラーを報告する。
]FIG]
[64] [[プラグイン]]の[[実現値]]は、[[Webブラウザー]]に対して、次のものを提供する必要があります。
[FIG(list members)[
:読み込み完了:読み込み完了したら通知する。 ([[Webブラウザー]]は
[CODE(DOMe)@en[[[load]]]] [[イベント]]を[[発火]]します。)
:[[レンダリング]]:[[Webブラウザー]]の指定した領域に[[レンダリング]]し、
適宜更新する。
:[[イベント]]処理:[[鍵盤イベント]]、[[マウスイベント]]などの入力を処理する。
:[[引数]]変化:[CODE(HTMLe)@en[[[object]]]]
[[要素]]の[[引数]]の変化を受信したい[[プラグイン]]は、
変化したとの通知を [[Webブラウザー]]から受け取ることができます [SRC[>>23]]。
([[属性]]の変化を受け取れるとは規定されていません。また、
[CODE(HTMLe)@en[[[param]]]] [[要素]]の追加や削除を受け取れるとも規定されていません。)
:[[フォームデータ集合]]における名前と値:
[CODE(HTMLe)@en[[[object]]]] [[要素]]で使う[[プラグイン]]は、
[[フォームデータ集合]]構築時に名前と値を提供できます。
:破棄:[[実現値]]を破棄する。
:スクリプト可能インターフェイス:[CODE(HTMLe)@en[[[embed]]]] [[要素]]や
[CODE(HTMLe)@en[[[object]]]] [[要素]]が[[実装]]する追加の[[インターフェイス]] (あれば)
と [[legacycaller]]。
]FIG]
[59] 加えて、実用上、 [[Webブラウザー]]は[[プラグイン]]に対して、次のものを提供する必要があります。
[FIG(list members)[
:[[fetch]]:[[Webブラウザー]]を介した [[fetch]] のための [[API]]。
:[[DOM]]:[[プラグイン]]が使われている[[文書]]にアクセスする [[API]]。
:エラー:[[コンソール]]にエラーを報告するための [[API]]。
]FIG]
[24] [[Webブラウザー]]は、利用可能な[[プラグイン]]であっても、
[[Webブラウザー]]の判断により、または[[利用者]]の判断により、
無効とすることができます。
;; [61] 仕様書上この「無効」状態の扱いは一貫していません。 [CODE(HTMLe)@en[[[applet]]]]
[[要素]]の規定で [[Java]] [[プラグイン]]が無効にできることを言及していたり、
[CODE(HTMLe)@en[[[object]]]] [[要素]]で特定の [CODE(HTMLe)@en[[[object]]]]
[[要素]]について[[プラグイン]]を無効化できることを言及していたりしますが、
[CODE(HTMLe)@en[[[embed]]]] [[要素]]でそのような規定はありません。
とはいえ、無効なものは「適切な[[プラグイン]]が存在する」との条件を満たさないと解釈できますから、
仕様書と現実で矛盾しているわけではありません。
[HISTORY[
[63] [[スクリプト]]が[[プラグイン]]を呼び出すときや[[プラグイン]]が[[スクリプト]]を呼び出すときは、
[[ストレージミューテックスを解放]]しなければ[['''なりません''']]。
]HISTORY]
[105] [[プラグイン]]の実装方法にもよりますが、
実際上、[[プラグイン]]が[[クラッシュ]]することも考慮しなければならない場合が多いです。
* プラグインの選択
[69] [CODE(HTMLe)@en[[[embed]]]] [[要素]]と [CODE(HTMLe)@en[[[object]]]]
[[要素]]の処理では、それぞれで[[プラグイン]]の選択方法が規定されています。
;; それぞれの項を参照。 [CODE(HTMLe)@en[[[applet]]]] [[要素]]では、常に
[[Java]] [[プラグイン]]が選択されます。
[70] [[HTML Standard]] は具体的な[[プラグイン]]と [[Webブラウザー]]との[[インターフェイス]]を規定していないこともあり、
大まなか選択方法の規定のみで、具体的な決定手順は決められていません。
[[プラグイン]]は、 [[Webブラウザー]]に対して、
対応する [[MIME型]]、[[URL]] の [[path]] のパターン ([[拡張子]])、
[CODE(HTMLa)@en[[[classid]]]] を提示することが必要です。
[22] [[プラグイン]]は、いくつかの [[MIME型]]について、それを処理できるものとして登録できます。
ただし、[[利用者エージェント]]は [CODE(MIME)@en[[[text/plain]]]] と
[CODE(MIME)@en[[[application/octet-stream]]]] について[[プラグイン]]が登録されたものとして扱っては[['''なりません''']] [SRC[>>11]]。
また仕様上明示的に禁止はされていませんが、 [CODE(MIME)@en[[[text/html]]]]
や [CODE(MIME)@en[[[application/xml]]]] のような [[DOM]]
を構築する [[MIME型]]も[[プラグイン]]での処理には不適切と思われます。
;; しかし歴史的理由で、 [[SVG]] が[[プラグイン]]で処理されてしまうことがあります。
[71] [CODE(DOMi)@en[[[PluginArray]]]] 中の[[プラグイン]]について、
[[利用者エージェント]]は、その対応する [[MIME型]]のいくつかを[RUBYB[明示的に対応]@en[explicitly supported]]するものとして示さなければ[['''なりません''']] [SRC[>>67]]。
[[明示的に対応]]する [[MIME型]]は、 [CODE(DOMi)@en[[[Plugin]]]]
[[オブジェクト]]や [CODE(DOMi)@en[[[MimeTypeArray]]]]
[[オブジェクト]]を通して晒されます。
;; [72] これは [[fingerprinting vector]] であり、[[利用者エージェント]]は[[互換性]]と[[プライバシー]]を両立させるべく適度に晒すことが期待されています [SRC[>>67]]。
[88] [[MIME型]]は元々データ形式を識別するためのものでしたが、
[[プラグイン]]の識別に[[MIME型]]が使われたため、起動するべき[[プラグイン]]を選択するためだけの目的で
(データ形式なしに) [[MIME型]]が作られるようになりました。
[EG[
[89] 例えば [CODE(MIME)@en[[[application/x-winamp-plugin]]]] のように名前に
「[CODE[plugin]]」が入った[[MIME型]]が多く存在します。
]EG]
* Web ブラウザーとスクリプトの間の API
[73] [[スクリプト]]は、 [CODE(DOMi)@en[[[Navigator]]]] [[オブジェクト]]上の
[[API]] を使って[[プラグイン]]に関する情報を得ることができます。次の[[インターフェイス]]があります。
[FIG(list short)[
- [CODE(DOMi)@en[[[NavigatorPlugins]]]]
- [CODE(DOMi)@en[[[PluginArray]]]]
- [CODE(DOMi)@en[[[Plugin]]]]
- [CODE(DOMi)@en[[[MimeTypeArray]]]]
- [CODE(DOMi)@en[[[MimeType]]]]
]FIG]
[74] しかしこれは [[fingerprinting vector]] であり、[[利用者]]の[[プライバシー]]の保護のため、
できるだけ限定的な情報のみを提供することが [[Webブラウザー]]には求められています。
(各項を参照。)
[76] これらの情報は、[[大域オブジェクト]]の作成時、あるいは最初の参照時、
あるいは最初に[[プラグイン]]の[[実現値]]を作成した時などの適当なタイミングのものと思われます。
(仕様上はいつの情報とするべきかは明確にされていません。元々[[プラグイン]]自体が[[相互運用性]]と相容れない存在ですから、この程度の差異は大した問題ではないのでしょう。)
[[スクリプト]]は [CODE(DOMm)@en[[[refresh]]]] [[メソッド]]により最新の情報に更新することを求められます。
;; 相互に参照可能な[[閲覧文脈]]同士でこれらの情報に (作成タイミングの差異により)
差異が生じることはあり得ます。
[75] [[プラグイン]]の[[実現値]]と[[スクリプト]]の間の [[API]] は、
各[[要素]]の項や [[LiveConnect]] を参照。
** [CODE(DOMi)@en[Plugin]] インターフェイス
[68] [DFN[[CODE(DOMi)@en[[[Plugin]]]]]] [[オブジェクト]]は、[[プラグイン]]を表します
[SRC[>>67]]。
[66] [CODE(DOMi)@en[[[Plugin]]]] [[インターフェイス]]は、
次の[[メンバー]]を持ちます。
[FIG(list short)[
- [CODE(DOMa)@en[[[description]]]]
- [CODE(DOMa)@en[[[filename]]]]
- [CODE(DOMa)@en[[[length]]]]
- [CODE(DOMa)@en[[[name]]]]
- [CODE(DOMm)@en[[[item]]]]
- [CODE(DOMm)@en[[[namedItem]]]]
- [CODE(DOMa)@en[[[version]]]]
- [[indexed getter]]
- [[named getter]]
]FIG]
[78] [CODE(DOMi)@en[[[Plugin]]]] [[オブジェクト]]が表す[[プラグイン]]が、
最後の作成または [CODE(DOMm)@en[[[refresh]]]] の時点で[[明示的に対応]]していた
[[MIME型]]を [DFN[[[reported MIME type]]]] といいます。 [SRC[>>67]]
[79] [[supported property indices]] は0から [[reported MIME type]] 数までの[[数]]です
[SRC[>>67]]。 (実際には個数 - 1までです。) [CODE(DOMm)@en[[[length]]]]
[[属性]]は、個数を返さなければ[['''なりません''']] [SRC[>>67]]。
[CODE(DOMm)@en[[[item]]]] [[メソッド]]は、 [CODE(IDL)@en[[[unsigned long]]]]
の[[引数]]を1つ受け取る [[indexed getter]] です [SRC[>>67]]。
[[引数]]で指定された位置の [[reported MIME type]] を表す
[CODE(DOMm)@en[[[MimeType]]]] があればそれを、
なければ [[null]] を返さなければ[['''なりません''']] [SRC[>>67]]。
ただし [CODE(DOMi)@en[[[MimeType]]]] は、[CODE(DOMa)@en[[[type]]]]
[[属性値]]で[[整列]]しなければ[['''なりません''']] [SRC[>>67]]。
[80] [[supported property names]] は [[reported MIME type]] を表す
[CODE(DOMi)@en[[[MimeType]]]] の [CODE(DOMa)@en[[[type]]]] [[属性値]]です
[SRC[>>67]]。それに対応する [[named getter]] は、[[列挙不能]]でなければ[['''なりません''']]
[SRC[>>67]]。
[CODE(DOMm)@en[[[namedItem]]]] [[メソッド]]は、 [CODE(IDL)@en[[[DOMString]]]]
の[[引数]]を1つ受け取る [[named getter]] です [SRC[>>67]]。
[[引数]]と同じ [CODE(DOMa)@en[[[type]]]] [[属性値]]の
[CODE(DOMm)@en[[[MimeType]]]] があればそれを、
なければ [[null]] を返さなければ[['''なりません''']] [SRC[>>67]]。
ただし [CODE(DOMm)@en[[[MimeType]]]] は、[CODE(DOMa)@en[[[type]]]]
[[属性値]]で[[整列]]しなければ[['''なりません''']] [SRC[>>67]]。
;; [86] これらは、 [CODE(DOMi)@en[[[MimeType]]]] [[インターフェイス]]の
[CODE(DOMa)@en[[[enabledPlugin]]]] [[属性]]の逆方向の参照です。
[81] [DFN[[CODE(DOMa)@en[[[name]]]]]] [[属性]]は、[[プラグイン]]の名前を返さなければ[['''なりません''']] [SRC[>>67]]。
これは普通は[[英語]]の短い文字列です。
;; 名前が固有であることは特に要求されていませんが、 [CODE(DOMi)@en[[[PluginArray]]]]
での[[整列]]や [[named getter]] に使われるため実用上固有であるべきです。
実際に [[Webブラウザー]]が固有であることを要求しているのかどうかは不明です。
[82] [DFN[[CODE(DOMa)@en[[[description]]]]]] [[属性]]は、[[プラグイン]]定義の何らかの文字列を返さなければ[['''なりません''']] [SRC[>>67]]。
これは普通は[[英語]]のそう長くない文字列です。[[空文字列]]のこともあります。
[83] [DFN[[CODE(DOMa)@en[[[filename]]]]]] [[属性]]は、[[プラグイン]]定義の何らかの文字列を返さなければ[['''なりません''']] [SRC[>>67]]。
[EG[
[84] [CODE[pepflashplayer.dll]] のような[[ファイル名]]風の文字列や、
[CODE[mhjfbmdgcfjbbpaeojofohoefgiehjai]] のような[[無作為]]風の文字列が使われます。
]EG]
[85] [[HTML Standard]] は、これらは不必要に内部情報を曝け出すものであるとして、
[CODE(DOMa)@en[[[description]]]] は [CODE(DOMa)@en[[[name]]]]
と同じ値、 [CODE(DOMa)@en[[[filename]]]] は[[空文字列]]とすることを[RUBYB[強く[['''推奨''']]]@en[highly '''recommended''']]しています [SRC[>>67]]。
[87] [[Gecko]] は更に [CODE(DOMa)@en[[[version]]]] [[属性]]を提供しています。
[[Chrome]] と [[HTML Standard]] にはありません。 [TIME[2015-07-05T07:24:33.100Z]]
[77] [CODE(DOMi)@en[[[Plugin]]]] [[オブジェクト]]は [[live]] であっては[['''なりません''']]。
[[属性]]や [[indexed getter]]/[[named getter]] で得られる情報は、
作成時と [CODE(DOMm)@en[[[refresh]]]] 時を除き、変更しては[['''なりません''']]。 [SRC[>>67]]
[CODE(DOMi)@en[[[MimeType]]]] [[オブジェクト]]は、更新されない限り、
同じものが返されます。
* プラグインの一覧
[32] 現在の多くの[[Webブラウザー]]は、 [[PDF]] [[プラグイン]]を組み込みで実装しているようです。
[33] 現在の多くの[[デスクトップブラウザー]]は、 [[Flash]] [[プラグイン]]がインストールされた状態になっています。
;; [47] それも徐々に使われなくなっています。また[[スマートフォン]]の[[Webブラウザー]]にはインストールされていないのが普通です。
[34] かつては多くの[[Webブラウザー]]で次の[[プラグイン]]がインストールされた状態でしたが、
現在はあまり使われなくなっています。
[FIG(short list)[
- [[Java]]
- [[Shockwave Director]]
- [[RealPlayer]]
- [[VRML]]
- [[QuickTime]]
- [[Windows Media Player]]
]FIG]
;; [46] [[Java]] や [[Director]] は [[Flash]] に移行しました。
[[VRML]] は使われなくなりました。
[[RealPlayer]] や [[QuickTime]] や [[WMP]] を使った[[動画像]]は
[[Flash]] に移行しました。
;; [45] かつて[[プラグイン]]が必要だったものは、現在ではほぼすべて [[JavaScript]]
で実現できます。
[31] [[NPAPI]] 等各種 [[API]] を使って実装された[[プラグイン]]の一覧は、
各 [[API]] の項を参照してください。
[35] >>9 には [[Chrome]] が使っている[[プラグイン]]の一覧があります。
[40] [[Firefox]] は登録された[[プラグイン]]以外は標準状態で有効にしない方針を採っています
[SRC[>>36, >>37, >>39]]。
[REFS[
- [9] ([TIME[2011-08-08 20:21:00 +09:00]] 版) <https://dl.google.com/chrome/plugins/plugins.xml>
- [37] [CITE@en[Plugins/Firefox Whitelist - MozillaWiki]]
([TIME[2015-05-01 18:19:54 +09:00]] 版)
<https://wiki.mozilla.org/Plugins/Firefox_Whitelist>
-- [39] [CITE[Firefox Whitelist - Automatic Activation of NPAPI Plugins - Google Sheets]]
([TIME[2015-05-01 23:21:14 +09:00]] 版)
<https://docs.google.com/a/mozilla.com/spreadsheets/d/19JIQiaS9mJgkKQ07ax2KH7syRCgxt2dCCxcBD56PiQc/edit?pli=1#gid=0>
]REFS]
[60] [CODE(HTMLe)@en[[[embed]]]] [[要素]]は常に[[プラグイン]]を[[表現]]します。
適当な[[プラグイン]]がなければ、[[既定プラグイン]]が使われます。
また、エラーの発生時にも、その旨が代わりに表示されます。
* 相互運用性
[28] [[プラグイン]]は [[Web]] の表現力を向上させるための[[拡張点]]として導入され、
90年代には活発に利用されていましたが、一方で[[相互運用性]]を低下させる問題ある機能でもありました。
00年代の [[JavaScript]] [[API]] の発展と [[HTML5]] による [[HTML]]
自体の機能追加によりかつて[[プラグイン]]を通じて提供していた機能のほとんどは
[[Webブラウザー]]自体によって提供されるようになり、[[プラグイン]]は役目を終えつつあります。
[29] ほとんどの [[Webブラウザー]]が対応している [[PDF]] を除き、[[著者]]は[[プラグイン]]に依存するべきではありません。
[[後方互換性]]のため [[Flash]] が利用できる環境も少なくありませんが、対応していない環境もあり、
[[著者]]は [[Flash]] を可能な限り避けるべきです。それ以外の[[プラグイン]]を使うのは、
不適切です。
* セキュリティーとプライバシー
[25] [[Webブラウザー]]は、[[プラグイン]]を使って外部の[[内容]]を処理する時には非常な注意を払う必要があります。特に[[第三者]]の[[プラグイン]]ソフトウェアが[[Webブラウザー]]と同じ[[特権]]で動作する場合には、
[[第三者]]の[[ソフトウェア]]の[[脆弱性]]が [[Webブラウザー]]にも波及します。 [SRC[>>11]]
;; [26] 実際に[[プラグイン]]の[[バッファーオーバーフロー]]その他の[[脆弱性]]が
[[Webブラウザー]]の安全性に深刻な影響を及ぼしたり、[[Web]] の[[同一起源ポリシー]]等の[[セキュリティー]]上の制約が[[プラグイン]]で遵守されず
[[Webアプリケーション]]の安全性に問題が生じたりしたことがあります。[[プラグイン]]の動作が不安定で異常終了するようなことがあれば、
[[Webブラウザー]]自体も巻き込まれてしまいます。最近の [[Webブラウザー]]は[[プラグイン]]を別の[[プロセス]]で動作させたり、
[[第三者]]が提供する[[プラグイン]]を排除したりしてこうした問題の除去に取り組んでいます。
[27] どの[[プラグイン]]が利用できるか (その環境に[[インストール]]されているか)
は歴史的に[[利用者]]によって異なっていましたから、これは [[finterprinting vector]] [SRC[>>11]]
とされています。[[利用者エージェント]]はどの[[利用者]]に対しても同じ[[プラグイン]]の組み合わせのみに対応することが[RUBYB[望ましい]@en[encouraged]] [SRC[>>11]] です。
[54] [[プラグイン]]自体や[[プラグイン]]により実行可能データが処理される場合には、
その安全性にも配慮が必要です。
[EG[
[55] 例えば [[IE]] は [CODE(HTMLe)@en[[[object]]]] [[要素]]で指定された
[[ActiveX control]] を表示できますが、インストールされていなければ [[CAB]]
ファイルをダウンロードして半自動でインストールできます。この時、
[[セキュリティーゾーン]]の設定にもよりますが、
[[証明書]]を表示して[[利用者]]の確認を求めるなどの手順があります。
]EG]
[56] 近年の [[Webブラウザー]]は、[[プラグイン]]の暴走を検出し、
強制終了させることができる場合があります。しかし[[Webブラウザー]]と[[プラグイン]]の実装方法によっては、
一部または全部の暴走を停止させることができないかもしれません。
[91] [[プラグイン]]は、[[Web]] における[[セキュリティー]]のための制約の抜け穴とならないことが期待されています。
例えば、[[同一起源ポリシー]]に違反するべきではありません。しかし、
[[Webブラウザー]]がそれを強制できるかどうかは、[[アーキテクチャ]]によります。
多くの場合は、困難です。
[EG[
[92] [[Webブラウザー]]が [[CORS]] を実装する前から、 [[Flash]] などの[[プラグイン]]は異なる[[起源]]へのアクセスを
(限定的ながら) 提供していました。これは「機能」として提供していたものですが、
[[HTML]] と [[JavaScript]] で敢えて禁止していることを可能とするのは[[セキュリティーホール]]を開けるようなもので、
あまり好ましいとは言えないことだったと考えられます。
]EG]
[90] [[プラグイン]]は、[[砂箱化]]に対応していないものもあります。そうした[[プラグイン]]は、
[[砂箱]]下で使えないことになっています。[[砂箱化]]に対応すると主張する[[プラグイン]]が実際に規制に従うかどうかは、
[[利用者]]にとっては[[プラグイン]]の開発元を信用するしかありません。
[[利用者エージェント]]が規制に従うことを強制できるかどうかは、
[[アーキテクチャ]]にも依存します。
[93] [[プラグイン]]は[[Webにおけるストレージ]]の制約にも従うべきかもしれません。
* 利用者インターフェイス
[97] [[Webブラウザー]]は、[[利用者]]が[[プラグイン]]を管理する機能を提供するのが普通です。
[98] [[Webブラウザー]]によっては、登録された[[プラグイン]]を提供する [[Webサイト]]があって、
そこから[[インストール]]できる (できた) かもしれません。
[101] [[Webブラウザー]]によっては、適当な[[プラグイン]]が存在しない場合の[[既定プラグイン]]から[[利用者]]の指示で[[プラグイン]]を[[インストール]]することができるかもしれません。
その場合 [CODE(HTMLe)@en[[[embed]]]] [[要素]]の [CODE(HTMLa)@en[[[pluginspage]]]] [[属性]]や
[CODE(HTMLe)@en[[[object]]]] [[要素]]の [CODE(HTMLa)@en[[[classid]]]]
[[属性]]、[[プラグイン]]のデータの [[MIME型]]などの情報が使われます。
[99] [[Webブラウザー]]によっては、動作中の[[プラグイン]]の一覧を表示して、
[[利用者]]が必要に応じて強制終了させることができることがあります。
[100] [[Webブラウザー]]によっては、動作中の[[プラグイン]]の状態を監視して、
クラッシュを検知して[[利用者]]に通知したり、動作しなくなったものを[[利用者]]が強制終了する選択肢を提示したりすることがあります。
* 歴史
[48] [[プラグイン]]と [[NPAPI]] や [CODE(HTMLe)@en[[[embed]]]] [[要素]]は、
[[Netscape Navigator 2]] により導入されました。 [[Java applet]] と
[CODE(HTMLe)@en[[[applet]]]] [[要素]]も実装されました。
;; [50] [CODE(HTMLe)@en[[[applet]]]] [[要素]]は [[HotJava]] が実装していましたが、
それより前には [CODE(HTMLe)@en[[[app]]]] [[要素]]でした。
[65] [CODE(DOMi)@en[[[Plugin]]]] [[オブジェクト]]と
[CODE(DOMa)@en[[[description]]]], [CODE(DOMa)@en[[[filename]]]],
[CODE(DOMa)@en[[[length]]]], [CODE(DOMa)@en[[[name]]]]
各[[IDL属性]]は [[JavaScript 1.1]] で追加されました。
[49] [[Internet Explorer 3]] もこれらを実装しました。更に [[ActiveX control]]
や [CODE(HTMLe)@en[[[object]]]] [[要素]]も実装しました。
;; [51] しかし [[IE]] はその後政治的理由で [[NPAPI]] や [[Java]] への対応を取りやめることになります。
[52] 90年代には沢山の[[プラグイン]]が作られ、多くの [[Webサイト]]で多くの
[CODE(HTMLe)@en[[[embed]]]] [[要素]]や [CODE(HTMLe)@en[[[object]]]] [[要素]]、
[CODE(HTMLe)@en[[[applet]]]] [[要素]]が使われていました。しかし
[[Webブラウザー]]によって異なる[[要素]]の異なる記述を使い分けなければならず、
また[[プラグイン]]が [[Windows]] のみや [[Windows]] と [[Mac OS]]
のみで提供されていることも多く、[[相互運用性]]には多くの問題を抱えていました。
[[プラグイン]]を使ったページのほとんどすべては、
特定の [[Webブラウザー]]と特定の[[プラグイン]]の特定の版が導入されていないと動作しない不便なページとなっていました。
[53] [[IETF]] と [[W3C]] は、 [[SGML]] として不適切という理由で
[CODE(HTMLe)@en[[[embed]]]] [[要素]]の標準化を拒み、
特定の技術に依存しているという理由で [CODE(HTMLe)@en[[[applet]]]]
[[要素]]を[[非推奨]]にすることで、 [CODE(HTMLe)@en[[[object]]]]
[[要素]]への統一を企てました。しかし[[プラグイン]]技術そのものを統一する動きにはなりませんでしたし、
この時代の [CODE(HTMLe)@en[[[object]]]] [[要素]]は実質的に [[ActiveX control]] 専用でしたから、
[CODE(HTMLe)@en[[[embed]]]] や [CODE(HTMLe)@en[[[applet]]]] が使われなくなることはありませんでした。
[1]
[CITE[Inline Plug-ins]] ([CODE[2007-02-28 00:41:17 +09:00]] 版) <http://web.archive.org/web/19970605061848/www82.netscape.com/comprod/products/navigator/version_2.0/plugins/index.html>
([[名無しさん]])
[2]
[CITE@en[Gecko Plugin API Reference - MDC]] ([CODE[2007-03-01 05:12:27 +09:00]] 版) <http://developer.mozilla.org/en/docs/Gecko_Plugin_API_Reference>
([[名無しさん]])
[3]
[CITE[Web Kit Plug-In Programming Topics: Creating Plug-ins with Cocoa and the Web Kit]] ([CODE[2007-03-09 08:50:03 +09:00]] 版) <http://developer.apple.com/documentation/InternetWeb/Conceptual/WebKit_PluginProgTopic/Tasks/WebKitPlugins.html>
([[名無しさん]])
[4]
[CITE[プラグインを開発する環境を整える - shima111の日記]] ([TIME[2009-01-21 07:53:23 +09:00]] 版) <http://d.hatena.ne.jp/shima111/20080523/p1>
[5] [CITE[Bug 8784 – politics in <param> example]]
([TIME[2010-02-18 23:48:26 +09:00]] 版)
<http://www.w3.org/Bugs/Public/show_bug.cgi?id=8784>
[6] [CITE@en[Web Applications 1.0 r6573 Define how sandboxing works with plugins in a hypothetical world where plugins honour the sandbox.]]
( ([TIME[2011-09-24 04:40:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6572&to=6573>
[7] [CITE['''['''whatwg''']''' instantiating display:none plugins]]
([TIME[2011-11-02 08:43:09 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-November/033732.html>
[8] [CITE['''['''whatwg''']''' instantiating display:none plugins]]
([TIME[2012-06-14 09:13:58 +09:00]] 版)
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036394.html>
[REFS[
- [36] [CITE@en-US[Update on Plugin Activation | Mozilla Security Blog]]
([TIME[2015-05-01 23:19:52 +09:00]] 版)
<https://blog.mozilla.org/security/2014/02/28/update-on-plugin-activation/>
- [41] [CITE@en[992995 – Implement plugin whitelist]] ([TIME[2015-05-01 23:26:21 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=992995>
- [42] [CITE@en[1007389 – Implement plugin whitelist, round 2]] ([TIME[2015-05-01 23:26:47 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=1007389>
- [43] [CITE@en-US[Site Compatibility for Firefox 30 - Mozilla | MDN]] ([TIME[2014-06-19 19:16:24 +09:00]] 版) <https://developer.mozilla.org/en-US/Firefox/Releases/30/Site_Compatibility#Plugin_whitelist_has_been_implemented>
]REFS]
[38] [CITE@en[Keep your Firefox healthy with a quick checkup — Mozilla]]
([TIME[2015-05-01 23:21:08 +09:00]] 版)
<https://www.mozilla.org/en-US/plugincheck/>
[57] [CITE@en-AU[PluginDoc: Windows (MIME Type List)]]
([TIME[2015-05-07 21:46:45 +09:00]] 版)
<http://web.archive.org/web/20100911055400/http://plugindoc.mozdev.org/winmime.php>
[FIG(quote)[
[FIGCAPTION[
[94] [CITE@en-US[Plugins - Mozilla | MDN]]
([TIME[2015-05-07 13:30:40 +09:00]] 版)
<https://developer.mozilla.org/en-US/Add-ons/Plugins>
]FIGCAPTION]
> Plugins are now a legacy technology. They are not available on most mobile devices. Mozilla encourages website developers to avoid using plugins wherever possible.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[95] [CITE@en[Pipelight - ArchWiki]]
([TIME[2015-07-11 13:26:59 +09:00]] 版)
<https://wiki.archlinux.org/index.php/Pipelight>
]FIGCAPTION]
> Pipelight is a special browser plugin which allows one to use Windows-only plugins inside Linux browsers. The main focus of the project is on Silverlight and its features, such as watching DRM protected videos. It works by creating a bridge between a Windows application, which handles the Windows-only plugin (e.g. Silverlight), and a native Linux browser plugin. The Windows application is run using a patched version of Wine, therefore requiring Pipelight users to move to this version. Pipelight can be used in browsers that support NPAPI plugins, such as Firefox. It does not work with Chromium.
]FIG]
[96] [CITE@en-US[Add-ons that cause stability or security issues are put on a blocklist | Firefox Help]]
([TIME[2015-07-23 14:54:38 +09:00]] 版)
<https://support.mozilla.org/en-US/kb/add-ons-cause-issues-are-on-blocklist>
[102] [CITE@en[Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf]] ([TIME[2015-12-16 14:38:10 +09:00]] 版) <https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3>
[103] [CITE@en-US[Plugin Activation in Firefox | Future Releases]]
([TIME[2016-02-20 19:54:25 +09:00]] 版)
<https://blog.mozilla.org/futurereleases/2013/09/24/plugin-activation-in-firefox/>
[104] [CITE[dev-tech-plugins Info Page]]
([TIME[2016-02-20 19:55:54 +09:00]] 版)
<https://lists.mozilla.org/listinfo/dev-tech-plugins>