[3] [CODE(DOMi)@en[NavigatorContentUtils]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[registerProtocolHandler]]]] [[メソッド]]は、
[[プロトコル取扱器]]を[[利用者]]に提示するものです。

* 仕様書

[REFS[
- [4] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-07-19 18:13:57 +09:00]]) <https://html.spec.whatwg.org/#custom-handlers>
]REFS]

* メソッド

[47] 
[TIME[2019-11-20]]の
[CITE[HTML Standard]]
改訂により、
[[secure context]] 専用の機能に変更されました。
[SRC[>>46]]

[48] この変更により、[[HTTPS]] ではこれまで通り使えますが、
[[素のHTTP]] では使えなくなりました。

[49] 
この変更は[[メソッド]]を実行する環境の制限についてのものですが、
[[メソッド]]の[[引数]]に指定する [[URL]]
には (従前通り) [[同一起源ポリシー]]が適用されるので、
自動的にそちらも [[HTTPS]] 専用に制限されます。

* 処理

[44] [SEE[ 一般的事項は[[ハンドラー]] ]]

[27] [CODE(DOMm)@en[registerProtocolHandler]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>4]]。

[FIG(steps)[
= [30] [VAR[scheme]] を、必須の第1引数を [CODE(IDL)@en[DOMString]] として解釈した結果に設定します。
= [31] [VAR[URL]] を、必須の第2引数を [CODE(IDL)@en[USVString]] として解釈した結果に設定します。
= [32] [VAR[題名]]を、必須の第3引数を [CODE(IDL)@en[DOMString]] として解釈した結果に設定します。
= [37] [VAR[絶対URL]] を、[VAR[URL]] を[[文脈オブジェクト]]の[F[設定群オブジェクト]]に対して[[構文解析][URLの構文解析]]した結果に設定します。
= [33] 
[FIG(list)[
- [35] [VAR[scheme]] が [[safelisted scheme]] のいずれかであるか、
[CODE[web+]] の後に1文字[[以上]]の [[ASCII小文字]]が続くものであるかのいずれでもない
- [36] [VAR[URL]] に [CODE[%s][proto-URL]] が含まれない
- [38] [VAR[絶対URL]]が[[失敗]]
]FIG]
... のいずれかを満たすなら、
== [34] [CODE[SyntaxError]] を[[投げ]]、ここで停止します。
= [39] [VAR[絶対URL]]の[F[起源][URLの起源]]と[[文脈オブジェクト]]の[F[設定群オブジェクト]]の[F[起源]]が[[同じ起源]]でなければ、
== [40] [CODE[SecurityError]] を[[投げ]]、ここで停止します。
= [42] [VAR[取扱器]]を、[[取扱器]]に設定します。
[FIG(list members)[
[FIGCAPTION[
[[取扱器]]
]FIGCAPTION]
: [F[種別][取扱器]] : [[プロトコル取扱器]]
: [F[proto-URL]] : [VAR[絶対URL]]
: [F[題名][取扱器]] : [VAR[題名]]
]FIG]
= [43] [VAR[取扱器]]について、[[取扱器の登録]]をします。
]FIG]

* 関連

[45] [SEE[ [[標準のWebブラウザー]] ]]

* 歴史

[6] [[Firefox3]] で [CODE(JS)@en[[[navigator]].[[registerProtocolHandler]]]]
[[メソッド]]を呼び出すと、[[閲覧領域]]上部にメッセージ欄が現れて、
プロトコル取扱器が提供されている旨とそれを追加するボタンが現れます。
ボタンを押すと [[Webブラウザー]]にインストールされます。

;; 一度インストールすると設定画面から削除しない限りずっと有効なようです。

;; インストール後にまったく同じ[[引数]]で[[メソッド]]を呼び出すと、
ボタンなしでインストール済みですというメッセージが出てくるようです。

[7] その後登録した [[URL scheme]] を使おうとするとプログラム選択の[[窓]]が出てきて、
そこから選ぶと[[引数]]で指定した [[URL]] が使われます。この選択の[[窓]]には「以後表示しない」
というチェックがついていて、それをチェックしておくと次からは聞かれません。

[8] 同じ [[URL scheme]] について別の [[URL]] を登録すると、 >>7 の選択肢として新たに追加されます。
以後表示しないとしていてもまた勝手に聞かれるようになるみたいです。

[19] [[Chrome]] では、複数登録されていても、いずれか標準で選択されたものが使われるようです。
どれを選択するかは設定画面で決定できます。

[18] [[Windows]] 上の [[Chrome]] は、 [[OS]] の [[URL scheme]] の[[取扱器]]としても登録するようです。

[20] [[Windows]] 上の [[Firefox]] は、 [[OS]] の [[URL scheme]] の[[取扱器]]や [[Firefox]]
の[[取扱器]]の一覧を非モーダルなダイアログで表示し、選択させるようです。
[[OS]] の [[URL scheme]] として登録はしないようです。

[1] [CITE@en-us[Web-based protocol handlers - MDC]] ([TIME[2009-04-12 11:38:21 +09:00]] 版) <https://developer.mozilla.org/ja/Web-based_protocol_handlers>

[2] [CITE@en-us[registerProtocolHandler - MDC]] ([TIME[2009-04-12 11:39:35 +09:00]] 版) <https://developer.mozilla.org/ja/DOM/window.navigator.registerProtocolHandler>

[5] 登録が有効なのは登録した[[文書]]ないし[[起源]]だけかと思い込んでいましたが、
そうではなく [[Webブラウザー]]上のほぼあらゆる [[URL]]
処理に適用されるのですね。 [[Firefox3]] で試しましたが、[[起源]]に関わらず
[CODE(HTMLe)@en[[[a]]]], [CODE(HTMLe)@en[[[img]]]], [CODE(HTMLe)@en[[[iframe]]]],
[[Webブラウザー]]の [[URL]] 入力欄などいろいろな場所で使えました。

[9] [TIME[2009-04-12T03:08:11.100Z]]: 
ぐぐってみると、 [CODE(URI)@en[[[mailto:]]]] に [[GMail]]
を登録するために使っている人が多いみたいですね。他には
[CODE(URI)@en[[[msnim:]]]] に使っている例も見かけました。
それ以外は見てないなあ。


[10] [CITE[IRC logs: freenode / #whatwg / 20100111]]
([TIME[2010-01-13 07:32:59 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20100111>

[11] [CITE@en[Web Applications 1.0 r6523     registerProtocolHandler() and registerContentHandler() security updates]]
( ([TIME[2011-08-24 08:27:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6522&to=6523>

[12] [CITE[''''''[''''''whatwg'''''']'''''' Proposal to extend registerProtocolHandler]]
( ([TIME[2011-08-26 07:45:49 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-August/032986.html>

[13] [CITE@en[Web Applications 1.0 r6524     Add an API to unregister a handler and an API to check if a handler is registered.]]
( ([TIME[2011-08-26 07:23:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=6523&to=6524>

[14] [CITE@en[Web Applications 1.0 r8051     Add more schemes to the registerProtocolHandler whitelist]]
( ([TIME[2013-07-13 03:07:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8050&to=8051>

[15] [CITE@en[Re: Allow javascript: URIs for registerProtocolHandler]]
( ([[Ian Hickson]] 著, [TIME[2013-11-28 08:43:37 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-webapps/2013OctDec/0622.html>

[16] [CITE[registerProtocolHandler() & registerContentHandler() — Anne’s Blog]]
( ([TIME[2014-08-22 07:08:07 +09:00]] 版))
<http://annevankesteren.nl/2014/08/registerprotocolhandler>

[17] [CITE@en[1056860 – Improve registerProtocolHandler()]]
( ([TIME[2014-09-23 05:02:58 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=1056860>

[21] [CITE@en[Fate of registerProtocolHandler() / registerContentHandler() and friends? · Issue #630 · whatwg/html]]
([TIME[2016-02-06 12:38:44 +09:00]] 版)
<https://github.com/whatwg/html/issues/630>

[22] [CITE@en[26876 – Title argument for both registerProtoclHandler() and registerContentHandler() should be removed as i ''''''[''''''...'''''']'''''']]
([TIME[2016-02-06 12:38:48 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=26876>

[23] [CITE@en[URLs are parsed and produce records · whatwg/html@30bc255]]
([TIME[2016-02-14 23:04:01 +09:00]] 版)
<https://github.com/whatwg/html/commit/30bc2557105ad62881ec9670f253febbc9761b44>

[24] [CITE@en[Use USVString for all URLs]]
( ([[domenic]]著, [TIME[2016-05-20 22:02:29 +09:00]]))
<https://github.com/whatwg/html/commit/018b983b77b2cd908f6d00100e7e0abe893dd2c3>

[25] [CITE@en[Use URL's HTTP(S) scheme concept and define rel=icon better]]
( ([[annevk]]著, [TIME[2016-05-26 21:59:00 +09:00]]))
<https://github.com/whatwg/html/commit/a932f7dfd5e50101db47a373cee27b04ed108934>

[26] [CITE@en[Use relevant settings object in protocol handlers]]
([[domenic]]著, [TIME[2016-07-13 07:13:28 +09:00]])
<https://github.com/whatwg/html/commit/413c1ccc43c9b16ff5c73585092f8721dea305c7>

[28] [CITE@en[Add version control URI schemes to registerProtocolHandler safelist by joshtriplett · Pull Request #1829 · whatwg/html]]
([TIME[2017-04-18 23:37:06 +09:00]])
<https://github.com/whatwg/html/pull/1829>

[29] [CITE@en[URL scheme for remote follow, share buttons · Issue #2291 · tootsuite/mastodon]]
( ([TIME[2017-09-12 01:54:06 +09:00]]))
<https://github.com/tootsuite/mastodon/issues/2291>

[41] [CITE@en[Fate of registerProtocolHandler() / registerContentHandler() and friends? · Issue #630 · whatwg/html]]
([TIME[2017-09-15 23:14:49 +09:00]])
<https://github.com/whatwg/html/issues/630>

[46] [CITE@en[Restrict (un)registerProtocolHandler to secure contexts]]
([[ericlaw1979]], [TIME[2019-11-20 03:44:22 +09:00]], [TIME[2021-03-17T09:35:18.000Z]])
<https://github.com/whatwg/html/commit/6772a0342e6ffebc922c60c770dce87371b6c968>

[50] [CITE@en[registerProtocolHandler and unregisterProtocolHandler should require SecureContext · Issue #5068 · whatwg/html]]
([TIME[2021-03-17T09:40:39.000Z]])
<https://github.com/whatwg/html/issues/5068>

[51] [CITE@en[Restrict use of `registerProtocolHandler` to secure contexts · Issue #4017 · whatwg/html]]
([TIME[2021-03-17T09:41:23.000Z]])
<https://github.com/whatwg/html/issues/4017>

[52] [CITE@en[Add SecureContext limitation for '''['''un''']'''registerProtocolHandler API by ericlaw1979 · Pull Request #5080 · whatwg/html]]
([TIME[2021-03-17T09:43:03.000Z]])
<https://github.com/whatwg/html/pull/5080>