[2] [DFN[[RUBY[取扱器][ハンドラー]@en[handler]]]]は、
特定の [[URL scheme]] や[[MIME型]]の[[資源]]の処理を行う[[ソフトウェア部品]]です。

[3] 普通、[[Webブラウザー]]や[[プラグイン]]以外の[[ネイティブアプリケーション]]や
[[Webアプリケーション]]として実装されているものをいいます。

* 仕様書

[REFS[
- [1] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-07-19 18:13:57 +09:00]]) <https://html.spec.whatwg.org/#custom-handlers>
]REFS]

* 分類

[4] [[URL scheme]] ごとに登録される[[プロトコル取扱器]]と、
[[MIME型]]ごとに登録される[[内容取扱器]]があります。

[5] [[ネイティブアプリケーション]]の[[取扱器]]は、伝統的に[[ヘルパーアプリケーション]]と呼ばれています。

[6] [[プラットフォーム]]側で管理される場合もあれば、
[[Webブラウザー]]独自で管理している場合、両方の機構を併用している場合もあります。

* API

[7] [[Webページ]]から[[著者]]が[[利用者]]に[[取扱器]]を提示する次の [[DOM API]]
が用意されています。
[FIG(list middle)[
- [CODE(DOMm)@en[registerProtocolHandler]]
- [CODE(DOMm)@en[isProtocolHandlerRegistered]]
- [CODE(DOMm)@en[unregisterProtocolHandler]]
- [CODE(DOMm)@en[registerContentHandler]]
- [CODE(DOMm)@en[isContentHandlerRegistered]]
- [CODE(DOMm)@en[unregisterContentHandler]]
]FIG]

* 文脈

[8] [[navigate]] から呼び出されます。

[9] [[プラットフォーム]]の [[URL]] を開く [[API]] や[[ファイル]]を開く [[API]] は、
([[プラットフォーム]]側で管理されている) [[取扱器]]を呼び出します。

* 取扱器データベース

[10] [[Webブラウザー]]は、[DFN[[F[取扱器データベース]]]]を持ちます。

;; [11] 実際には[[Webブラウザー]]独自で管理していることもあれば、
[[プラットフォーム]]に一部または全部を委ねていることもあります。

[12] [[取扱器データベース]]は、[F[[[プロトコル取扱器]]群]]と[F[[[内容取扱器]]群]]の
2つの[[集合]]を持ちます。前者は[[プロトコル取扱器]]の、後者は[[内容取扱器]]の[[集合]]です。

[17] 同じ[F[scheme][URL scheme]]や[F[MIME型]]の (処理が異なる) 
[[取扱器]]を[[集合]]中に複数含められるかどうかは、実装によります。
実装によっては、複数含まれていれば、[[利用者]]にどれを選択するかを都度問い合わせたり、
いずれかを[[既定]]のものと選ぶことができたりするかもしれません。

[18] 他に、 [CODE(DOMm)@en[registerProtocolHandler]] や [CODE(DOMm)@en[registerContentHandler]]
では、悪意ある (または[[利用者体験]]への意識が低い) [[著者]]による乱用を防ぐため、
([[利用者]]が拒否したものも含め) 提示された[[取扱器]] (や[[メソッド]]の呼び出しの状況)
をある程度記憶しておくことが好ましいとされています。

-*-*-

[23] 
[[Unix]] 系の
[[インターネットメール]]の [[MUA]] の [[MIME]] の実装は、
[[取扱器データベース]]に相当する[[ヘルパーアプリケーション]]記述用の[[ファイル形式]]として
[[mailcap]]
を採用していました。

[24] 
[[w3m]] のように [[Unix]] 系の[[Webブラウザー]]にも、
[[mailcap]]
を流用して[[ヘルパーアプリケーション]]を指定できるものがありました。


* 取扱器オブジェクト

[13] [[取扱器]]は、次の状態を持ちます。
[FIG(list members)[
: [F[種別]] : [[プロトコル取扱器]]または[[内容取扱器]]または[[プラットフォーム]]依存の種別
: [F[題名]] : [[人間]]向けの[[取扱器]]の名称です。
]FIG]

[14] [[Webアプリケーション]]の場合、次の状態を持ちます。
[FIG(list members)[
: [F[proto-URL]] : 実行する[[Webアプリケーション]]の [[proto-URL]] です。
]FIG]

[19] [[ネイティブアプリケーション]]の場合、[[プラットフォーム]]依存の状態を持ちます。
例えば[[ヘルパーアプリケーション]]の[[ファイル名]]や、[[コマンドライン引数]]などを保持する必要がありそうです。

[15] [[プロトコル取扱器]]の場合、次の状態を持ちます。
[FIG(list members)[
: [F[scheme][URL scheme]] :
]FIG]

[16] [[内容取扱器]]の場合、次の状態を持ちます。
[FIG(list members)[
: [F[MIME型]] :
]FIG]

[21] 他に、[[プラットフォーム]]によっては 「[CODE[https://example.com/hoge/]]
以下の[[取扱器]]」といった指定もできることがあります。

[20] その他に、既定の[[取扱器]]であるかどうか、利用頻度や[[アイコン]]などの実装や[[プラットフォーム]]に依存した情報も保持する必要があるかもしれません。

** 登録

[22] [CODE(DOMm)@en[registerProtocolHandler]] や
[CODE(DOMm)@en[registerContentHandler]] の[DFN[[VAR[取扱器]]の登録]]は、
任意の処理を行えます。例えば、
[[利用者]]に[VAR[取扱器]]を[[利用者エージェント]]の[F[取扱器データベース]]に追加するかどうか、
既定値とするかどうか、取り消すかといった照会をして構いません。
[[モーダルダイアログ]]でもそうでなくても構いません。
[VAR[取扱器]]を記憶しておいて、後で良きタイミングで[[利用者]]に提示しても構いません。
[SRC[>>1]]

;; [41] 任意の方法とはいえ、[[モーダルダイアログ]]は好ましくないと現在では考えられていますから、
それ以外の方法で提示するべきでしょう。

[29] また、[VAR[取扱器]]を ([[利用者]]が拒否した場合も含め) 記憶しておき、
同じ要求が何度も繰り返されていないか検査する[SHOULD[べきです]] [SRC[>>1]]。

* メモ