[15] プラグインは、利用者エージェントが定義するところの利用者エージェントが利用する内容取り扱い器であって、
利用者エージェントの Document
のレンダリングの一部となることができるものであり、
しかし Document
の子供閲覧文脈でも Node
オブジェクトを作るものでもないようなものをいいます >>11。
[16] 通常は第三者に提供されるものですが、 利用者エージェントに組み込まれたものもあります >>11。
[19] HTML Standard ではWebブラウザーとプラグインの間の API は規定せず、利用者エージェントとプラットフォームに依存するもの >>11 としています。
[12] 各 WebブラウザーはプラグインとWebブラウザーとの間の API を用意しています。
[44] IE は ActiveX control に対応しています。 Gecko は NPAPI に対応しています。 Blink は PPAPI に対応しています。 WebKit は NPAPI に対応しています。
[13] プラグインは、 DOM 上の embed
要素や
object
要素を通じてスクリプトに API
を提供できます。
[21] 著者のスクリプトはそのような API の有無を通じて当該要素を処理するプラグインが有効か否かを判断できます。
また Navigator
オブジェクトにも当該環境で有効なプラグインの情報を提供する
API があります。
[30] object
要素のプラグインは、フォームデータ集合に値を提供できます。
[58] プラグインは Webブラウザーに対して、次のものを提供する必要があります。
[64] プラグインの実現値は、Webブラウザーに対して、次のものを提供する必要があります。
[59] 加えて、実用上、 Webブラウザーはプラグインに対して、次のものを提供する必要があります。
[24] Webブラウザーは、利用可能なプラグインであっても、 Webブラウザーの判断により、または利用者の判断により、 無効とすることができます。
applet
要素の規定で Java プラグインが無効にできることを言及していたり、
object
要素で特定の object
要素についてプラグインを無効化できることを言及していたりしますが、
embed
要素でそのような規定はありません。
とはいえ、無効なものは「適切なプラグインが存在する」との条件を満たさないと解釈できますから、
仕様書と現実で矛盾しているわけではありません。[105] プラグインの実装方法にもよりますが、 実際上、プラグインがクラッシュすることも考慮しなければならない場合が多いです。
[69] embed
要素と object
要素の処理では、それぞれでプラグインの選択方法が規定されています。
[70] HTML Standard は具体的なプラグインと Webブラウザーとのインターフェイスを規定していないこともあり、
大まなか選択方法の規定のみで、具体的な決定手順は決められていません。
プラグインは、 Webブラウザーに対して、
対応する MIME型、URL の path のパターン (拡張子)、
classid
を提示することが必要です。
[22] プラグインは、いくつかの MIME型について、それを処理できるものとして登録できます。
ただし、利用者エージェントは text/plain
と
application/octet-stream
についてプラグインが登録されたものとして扱ってはなりません >>11。
また仕様上明示的に禁止はされていませんが、 text/html
や application/xml
のような DOM
を構築する MIME型もプラグインでの処理には不適切と思われます。
[71] PluginArray
中のプラグインについて、
利用者エージェントは、その対応する MIME型のいくつかを明示的に対応するものとして示さなければなりません >>67。
明示的に対応する MIME型は、 Plugin
オブジェクトや MimeTypeArray
オブジェクトを通して晒されます。
[88] MIME型は元々データ形式を識別するためのものでしたが、 プラグインの識別にMIME型が使われたため、起動するべきプラグインを選択するためだけの目的で (データ形式なしに) MIME型が作られるようになりました。
[89] 例えば application/x-winamp-plugin
のように名前に
「plugin
」が入ったMIME型が多く存在します。
[73] スクリプトは、 Navigator
オブジェクト上の
API を使ってプラグインに関する情報を得ることができます。次のインターフェイスがあります。
[74] しかしこれは fingerprinting vector であり、利用者のプライバシーの保護のため、 できるだけ限定的な情報のみを提供することが Webブラウザーには求められています。 (各項を参照。)
[76] これらの情報は、大域オブジェクトの作成時、あるいは最初の参照時、
あるいは最初にプラグインの実現値を作成した時などの適当なタイミングのものと思われます。
(仕様上はいつの情報とするべきかは明確にされていません。元々プラグイン自体が相互運用性と相容れない存在ですから、この程度の差異は大した問題ではないのでしょう。)
スクリプトは refresh
メソッドにより最新の情報に更新することを求められます。
[75] プラグインの実現値とスクリプトの間の API は、 各要素の項や LiveConnect を参照。
Plugin
インターフェイス[68] Plugin
オブジェクトは、プラグインを表します
>>67。
[66] Plugin
インターフェイスは、
次のメンバーを持ちます。
[78] Plugin
オブジェクトが表すプラグインが、
最後の作成または refresh
の時点で明示的に対応していた
MIME型を reported MIME type といいます。 >>67
[79] supported property indices は0から reported MIME type 数までの数です
>>67。 (実際には個数 - 1までです。) length
属性は、個数を返さなければなりません >>67。
item
メソッドは、 unsigned long
の引数を1つ受け取る indexed getter です >>67。
引数で指定された位置の reported MIME type を表す
MimeType
があればそれを、
なければ null を返さなければなりません >>67。
ただし MimeType
は、type
属性値で整列しなければなりません >>67。
[80] supported property names は reported MIME type を表す
MimeType
の type
属性値です
>>67。それに対応する named getter は、列挙不能でなければなりません
>>67。
namedItem
メソッドは、 DOMString
の引数を1つ受け取る named getter です >>67。
引数と同じ type
属性値の
MimeType
があればそれを、
なければ null を返さなければなりません >>67。
ただし MimeType
は、type
属性値で整列しなければなりません >>67。
[81] name
属性は、プラグインの名前を返さなければなりません >>67。
これは普通は英語の短い文字列です。
PluginArray
での整列や named getter に使われるため実用上固有であるべきです。
実際に Webブラウザーが固有であることを要求しているのかどうかは不明です。[82] description
属性は、プラグイン定義の何らかの文字列を返さなければなりません >>67。
これは普通は英語のそう長くない文字列です。空文字列のこともあります。
[83] filename
属性は、プラグイン定義の何らかの文字列を返さなければなりません >>67。
[84] pepflashplayer.dll
のようなファイル名風の文字列や、
mhjfbmdgcfjbbpaeojofohoefgiehjai
のような無作為風の文字列が使われます。
[85] HTML Standard は、これらは不必要に内部情報を曝け出すものであるとして、
description
は name
と同じ値、 filename
は空文字列とすることを強く推奨しています >>67。
[87] Gecko は更に version
属性を提供しています。
Chrome と HTML Standard にはありません。
[77] Plugin
オブジェクトは live であってはなりません。
属性や indexed getter/named getter で得られる情報は、
作成時と refresh
時を除き、変更してはなりません。 >>67
MimeType
オブジェクトは、更新されない限り、
同じものが返されます。
[32] 現在の多くのWebブラウザーは、 PDF プラグインを組み込みで実装しているようです。
[33] 現在の多くのデスクトップブラウザーは、 Flash プラグインがインストールされた状態になっています。
[34] かつては多くのWebブラウザーで次のプラグインがインストールされた状態でしたが、 現在はあまり使われなくなっています。
[31] NPAPI 等各種 API を使って実装されたプラグインの一覧は、 各 API の項を参照してください。
[35] >>9 には Chrome が使っているプラグインの一覧があります。
[40] Firefox は登録されたプラグイン以外は標準状態で有効にしない方針を採っています >>36, >>37, >>39。
[60] embed
要素は常にプラグインを表現します。
適当なプラグインがなければ、既定プラグインが使われます。
また、エラーの発生時にも、その旨が代わりに表示されます。
[28] プラグインは Web の表現力を向上させるための拡張点として導入され、 90年代には活発に利用されていましたが、一方で相互運用性を低下させる問題ある機能でもありました。 00年代の JavaScript API の発展と HTML5 による HTML 自体の機能追加によりかつてプラグインを通じて提供していた機能のほとんどは Webブラウザー自体によって提供されるようになり、プラグインは役目を終えつつあります。
[29] ほとんどの Webブラウザーが対応している PDF を除き、著者はプラグインに依存するべきではありません。 後方互換性のため Flash が利用できる環境も少なくありませんが、対応していない環境もあり、 著者は Flash を可能な限り避けるべきです。それ以外のプラグインを使うのは、 不適切です。
[25] Webブラウザーは、プラグインを使って外部の内容を処理する時には非常な注意を払う必要があります。特に第三者のプラグインソフトウェアがWebブラウザーと同じ特権で動作する場合には、 第三者のソフトウェアの脆弱性が Webブラウザーにも波及します。 >>11
[27] どのプラグインが利用できるか (その環境にインストールされているか) は歴史的に利用者によって異なっていましたから、これは finterprinting vector >>11 とされています。利用者エージェントはどの利用者に対しても同じプラグインの組み合わせのみに対応することが望ましい >>11 です。
[54] プラグイン自体やプラグインにより実行可能データが処理される場合には、 その安全性にも配慮が必要です。
[55] 例えば IE は object
要素で指定された
ActiveX control を表示できますが、インストールされていなければ CAB
ファイルをダウンロードして半自動でインストールできます。この時、
セキュリティーゾーンの設定にもよりますが、
証明書を表示して利用者の確認を求めるなどの手順があります。
[56] 近年の Webブラウザーは、プラグインの暴走を検出し、 強制終了させることができる場合があります。しかしWebブラウザーとプラグインの実装方法によっては、 一部または全部の暴走を停止させることができないかもしれません。
[91] プラグインは、Web におけるセキュリティーのための制約の抜け穴とならないことが期待されています。 例えば、同一起源ポリシーに違反するべきではありません。しかし、 Webブラウザーがそれを強制できるかどうかは、アーキテクチャによります。 多くの場合は、困難です。
[92] Webブラウザーが CORS を実装する前から、 Flash などのプラグインは異なる起源へのアクセスを (限定的ながら) 提供していました。これは「機能」として提供していたものですが、 HTML と JavaScript で敢えて禁止していることを可能とするのはセキュリティーホールを開けるようなもので、 あまり好ましいとは言えないことだったと考えられます。
[90] プラグインは、砂箱化に対応していないものもあります。そうしたプラグインは、 砂箱下で使えないことになっています。砂箱化に対応すると主張するプラグインが実際に規制に従うかどうかは、 利用者にとってはプラグインの開発元を信用するしかありません。 利用者エージェントが規制に従うことを強制できるかどうかは、 アーキテクチャにも依存します。
[93] プラグインはWebにおけるストレージの制約にも従うべきかもしれません。
[97] Webブラウザーは、利用者がプラグインを管理する機能を提供するのが普通です。
[98] Webブラウザーによっては、登録されたプラグインを提供する Webサイトがあって、 そこからインストールできる (できた) かもしれません。
[101] Webブラウザーによっては、適当なプラグインが存在しない場合の既定プラグインから利用者の指示でプラグインをインストールすることができるかもしれません。
その場合 embed
要素の pluginspage
属性や
object
要素の classid
属性、プラグインのデータの MIME型などの情報が使われます。
[99] Webブラウザーによっては、動作中のプラグインの一覧を表示して、 利用者が必要に応じて強制終了させることができることがあります。
[100] Webブラウザーによっては、動作中のプラグインの状態を監視して、 クラッシュを検知して利用者に通知したり、動作しなくなったものを利用者が強制終了する選択肢を提示したりすることがあります。
[48] プラグインと NPAPI や embed
要素は、
Netscape Navigator 2 により導入されました。 Java applet と
applet
要素も実装されました。
[65] Plugin
オブジェクトと
description
, filename
,
length
, name
各IDL属性は JavaScript 1.1 で追加されました。
[49] Internet Explorer 3 もこれらを実装しました。更に ActiveX control
や object
要素も実装しました。
[52] 90年代には沢山のプラグインが作られ、多くの Webサイトで多くの
embed
要素や object
要素、
applet
要素が使われていました。しかし
Webブラウザーによって異なる要素の異なる記述を使い分けなければならず、
またプラグインが Windows のみや Windows と Mac OS
のみで提供されていることも多く、相互運用性には多くの問題を抱えていました。
プラグインを使ったページのほとんどすべては、
特定の Webブラウザーと特定のプラグインの特定の版が導入されていないと動作しない不便なページとなっていました。
[53] IETF と W3C は、 SGML として不適切という理由で
embed
要素の標準化を拒み、
特定の技術に依存しているという理由で applet
要素を非推奨にすることで、 object
要素への統一を企てました。しかしプラグイン技術そのものを統一する動きにはなりませんでしたし、
この時代の object
要素は実質的に ActiveX control 専用でしたから、
embed
や applet
が使われなくなることはありませんでした。
[1]
Inline Plug-ins (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]
Gecko Plugin API Reference - MDC (2007-03-01 05:12:27 +09:00
版) http://developer.mozilla.org/en/docs/Gecko_Plugin_API_Reference
(名無しさん)
[3]
Web Kit Plug-In Programming Topics: Creating Plug-ins with Cocoa and the Web Kit (2007-03-09 08:50:03 +09:00
版) http://developer.apple.com/documentation/InternetWeb/Conceptual/WebKit_PluginProgTopic/Tasks/WebKitPlugins.html
(名無しさん)
[4] プラグインを開発する環境を整える - shima111の日記 ( 版) http://d.hatena.ne.jp/shima111/20080523/p1
[5] Bug 8784 – politics in <param> example ( 版) http://www.w3.org/Bugs/Public/show_bug.cgi?id=8784
[6] Web Applications 1.0 r6573 Define how sandboxing works with plugins in a hypothetical world where plugins honour the sandbox. ( ( 版)) http://html5.org/tools/web-apps-tracker?from=6572&to=6573
[7] [whatwg] instantiating display:none plugins ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2011-November/033732.html
[8] [whatwg] instantiating display:none plugins ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036394.html
[38] Keep your Firefox healthy with a quick checkup — Mozilla ( 版) https://www.mozilla.org/en-US/plugincheck/
[57] PluginDoc: Windows (MIME Type List) ( 版) http://web.archive.org/web/20100911055400/http://plugindoc.mozdev.org/winmime.php
[96] Add-ons that cause stability or security issues are put on a blocklist | Firefox Help ( 版) https://support.mozilla.org/en-US/kb/add-ons-cause-issues-are-on-blocklist
[102] Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf ( 版) https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3
[103] Plugin Activation in Firefox | Future Releases ( 版) https://blog.mozilla.org/futurereleases/2013/09/24/plugin-activation-in-firefox/
[104] dev-tech-plugins Info Page ( 版) https://lists.mozilla.org/listinfo/dev-tech-plugins
[106] Safari: About Internet plug-in management - Apple Support ( ()) https://support.apple.com/en-us/HT202819
[109] 615738 - Deprecate chrome://plugins - chromium - Monorail () https://bugs.chromium.org/p/chromium/issues/detail?id=615738
[110] Can't access chrome://plugins/ in Google Chrome 57. - Google プロダクト フォーラム () https://productforums.google.com/forum/#!msg/chrome/1NGbts8-IFo/zFylS8HCBQAJ
[111] [038776]HTML文書にプラグインを貼り付ける[ドキュメントナビ] () http://support.justsystems.com/faq/1032/app/servlet/qadoc?QID=038776
[112] Clarify steps when embed tag has unhandled MIME type · Issue #3876 · whatwg/html () https://github.com/whatwg/html/issues/3876
[113] Tracking Preference Expression (DNT) () https://www.w3.org/TR/2019/NOTE-tracking-dnt-20190117/#dfn-plug-ins