[67] [CODE(HTMLa)@en[ping]] [[属性]]は、[[リンク]]をたどる際に同時にアクセスするべき
[[URL]] を指定するものです。

* 仕様書

[REFS[
- [49] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-05-25 20:37:04 +09:00]]) <https://html.spec.whatwg.org/#ping>'''
- [50] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-05-25 20:37:04 +09:00]]) <https://html.spec.whatwg.org/#hyperlink-auditing>
]REFS]

* 文脈

[74] [[著者]]は [[JavaScript]] その他の方法で [CODE(HTMLa)@en[ping]]
[[属性]]を使わずとも同じことが実現できるわけですが、
[CODE(HTMLa)@en[ping]] [[属性]]を使えば何を行うか (どこがリンク先で、
どこに [CODE(HTMLa)@en[ping]] を行うか) [[利用者]]・[[利用者エージェント]]に対して明確にでき、
[[利用者エージェント]]が処理タイミングを調整するなどして[[利用者]]の体験を向上させることが期待できます。
従って、[[著者]]は他の方法ではなく [CODE(HTMLa)@en[ping]] を使う[RUBYB[べき]@en[encourage]]です
[SRC[>>50]]。

[EG[
[75] 例えば[[検索エンジン]]は、直接[[リンク先]]サイトに[[リンク]]せず、
一旦自社サイトに[[リンク]]して、そこから[[リダイレクト]]することで、
どのサイトが選択されたかを集計することができます。

[76] これを [CODE(HTMLa)@en[ping]] による集計に切り替えることで、
[CODE(HTMLa)@en[ping]] へのアクセスは [[Webブラウザー]]が裏で行うこととなるので、
[[利用者]]は[[リダイレクト]]分の余計な時間をかけずに目的サイトに移動できます。
([[利用者]]の体験が向上するのは、[[検索エンジン]]にとっても好ましいことです。)

[77] また、[[利用者]]は正しい[[リンク先]]の [[URL]] を[[ステータスバー]]で確認できます。

[78] 加えて、[[利用者]]が潔癖なら [[Webブラウザー]]の設定を変更して [CODE(HTMLa)@en[ping]] [[属性]]を無効化することで、
集計を拒否できます。
([[検索エンジン]]にとっては改善のためのデータを収集する機会が失われるので嬉しくはありませんが、
それを快く思わない人から無理に収集するのもまた意に反するでしょう。
[[リダイレクト]]その他独自の方法では、[[利用者]]にその選択肢を与えることも困難です。)
]EG]

* 利用者の設定

[63] [[利用者エージェント]]は、[[利用者]]が [CODE(HTMLa)@en[ping]]
[[属性]]の挙動を[[調節][Webブラウザー利用者の設定]]できるようにする[SHOULD[べきです]] [SRC[>>50]]。

[EG[
[65] 例えば、 [CODE(HTTP)@en[Referer:]] [[ヘッダー]]の送信有無と同時に設定可能とすることができます
[SRC[>>50]]。
]EG]

[EG[
[66] [CODE(HTMLa)@en[ping]] [[属性]]をすべて無視しても構いませんし、
[[第三者]] [[URL]] を無視するなどの判断を挟んでも構いません。 [SRC[>>50]]
]EG]

* 処理

[51] [CODE(HTMLa)@en[ping]] [[属性]]の処理は、
[[要素]][VAR[要素]]とリンク先の[VAR[対象URL]]について、
次のようにしなければ[MUST[なりません]] [SRC[>>50]]。
[FIG(steps)[
= [52] [VAR[値]]を、[VAR[要素]]の [CODE(HTMLa)@en[ping]] [[属性値]]に設定します。
= [53] [VAR[値]]が [[null]] なら、ここで停止します。
= [54] [VAR[リスト]]を、[VAR[値]]に[[文字列を間隔で分割]]を適用した結果に設定します。
= [55] [VAR[リスト]]の各要素[VAR[字句]]について、
== [56] [VAR[URL]] を、[VAR[要素]]の[F[節点文書]]に[[相対]]に[VAR[字句]]を[[構文解析][URLの構文解析]]した結果に設定します。
== [57] 
[FIG(list)[
- [58] [VAR[URL]] が[[失敗]]でない
- [59] [VAR[URL]] の [F[scheme][URL scheme]] が [[HTTP(S) scheme]] である
- [60] [[利用者エージェント]]依存の条件を満たす (>>63)
]FIG]
... のすべてを満たす場合、
=== [61] [[要求]]を [[fetch]] します。
[FIG(list members)[
[FIGCAPTION[
[[要求]]
]FIGCAPTION]
: [F[URL][要求URL]] : [VAR[URL]]
: [F[メソッド][要求メソッド]] : [CODE[POST]]
: [F[ヘッダーリスト]] :
[FIG(list members)[
: [CODE[Ping-From]] : 
[VAR[要素]]の[F[節点文書]]の[F[起源][文書の起源]]と [VAR[URL]] の[F[起源][URLの起源]]が[[同じ起源]]か、
[VAR[要素]]の[F[節点文書]]の[F[HTTPS状態]]が [CODE[none]] なら、
[VAR[要素]]の[F[節点文書]]の[F[URL][文書の番地]]。それ以外なら、 [[null]]。
: [CODE[Ping-To]] : [VAR[対象URL]]
]FIG]
: [F[本体][要求本体]] : [CODE[PING]]
: [F[クライアント][要求クライアント]] : [VAR[要素]]の[F[節点文書]]の[F[関連する設定群オブジェクト]]
: [F[終点]] : [[空文字列]]
: [F[credentialsモード]] : [CODE[include]]
: [F[参照元]] : [CODE[no-referrer]]
: [F[URL credentials利用]] : [[真]]
: [F[process response]] : 
[FIG(steps)[
= [64] 本 [[fetch]] を [[abort]] して構いません。
]FIG]
]FIG]
]FIG]

;; [62] [[fetch]] の結果は使われません。 [[fetch]] は[[並列に]]行うことができます
[SRC[>>50]]。結果が使われない以上、どう実装されているか[[著者]]が直接感知することはできません。

[42] [CODE(HTMLa)@en[ping]] [[属性]]の処理は、[[ハイパーリンクをたどる]]処理から呼び出されます。

[43] 趣旨からすると[[ダウンロード]]時にも [CODE(HTMLa)@en[ping]] が送信されるべきと思われますが、
なぜかそうなっていません。 ([[ハイパーリンクをたどる]]ことにより [[navigate]]
が発生し、それが[[ダウンロード]]に至った場合には、最初のたどった時点で
[CODE(HTMLa)@en[ping]] が送信されます。)

;; 実装がどうしているのかは不明。

[69] [CODE(HTTP)@en[Ping-From:]] [[ヘッダー]]は、 [CODE(URI)@en[https:]]
のページの場合、[[同一起源]]でなければ送信されません。つまり[[同一起源ポリシー]]が適用されます。
[CODE(URI)@en[http:]] の場合は、[[異なる起源]]であっても送信されます。
[CODE(HTTP)@en[Referer:]] [[ヘッダー]]の動作 ([[参照元ポリシー]]
[CODE[no-referrer-when-downgrade]]) に倣ったものと思われますが、
[[同一起源]]でなければならない分、少し厳しくなっています。

[HISTORY[
[70] そもそも [CODE(HTMLa)@en[ping]] の [[URL]] は[[著者]]が指定するもので、
[[著者]]は任意の [[URL]] を指定でき、 [[URL]] に自ページの [[URL]]
を含めることもできるわけですから、この制約は情報の漏洩を防ぐものではありません。
[[XHR]] や [[Fetch]] を使って [CODE(HTTP)@en[Ping-From:]] の指定された[[要求]]を送信することはできますから、
第三者の不正な[[スクリプト]]からの送信を防げるものでもありません。
この制約が何のためのものなのかは不明です。

[71] >>70 [[CORS preflight]] でOKが出ないと [CODE[POST]] + 
[CODE(HTTP)@en[Ping-From:]] は送れないのか。それなら、 [[HTTPS]]
を使っていれば、不正な要求と区別できる。

[72] >>14 で削除された仕様書のコメントによると元々 [CODE(HTTP)@en[Referer:]]
を含めないことにしていたのは他の [CODE(HTTP)@en[POST]] と区別できるようにするためらしい。
既存の[[サーバー]]の [[CSRF]] などの検査を壊さないように
[CODE(HTTP)@en[Referer:]] とは別にほぼ同じ意味の [CODE(HTTP)@en[Ping-From:]]
を設定することにしたようである。更に付け加えると、 [CODE[ping]] は
[[CORS]] より古いので、 [CODE(HTTP)@en[Ping-From:]] が他の方法で指定されて[[異なる起源]]に送信される、
ということは想定されていない模様。

[73] >>20 あたりも参照。
]HISTORY]

* 関連

[37] 似た機能に [CODE(DOMi)@en[[[Beacon]]]] があります。

[68] [[WebSocket]] の [[Pingフレーム]]や [[HTTP/2]] の [CODE[PING]]
[[フレーム]]とは無関係です。

* 実装

[80] [[Chrome]]、[[Opera]]、[[Safari]] が[[実装]]しています。

[81] [[Firefox]] にも[[実装]]は一応されていますが、標準設定では無効になっています。

[82] [[IE]]・[[Edge]] は未実装です。

;; [83] [[Firefox]] と [[Edge]] は [[Beacon]] には対応しています。

* 歴史

** 誕生

[15] 2005年10月に [[Web Applications 1.0]] に追加されました。

[1]
[CITE[Mozilla Links 日本語版: Firefox のプライバシー問題]] 
<http://mozlinks-jp.blogspot.com/2006/01/firefox_21.html>

あれだ、やっぱり[CODE(HTMLa)@en[[[ping]]]]も[Q[[[タグ]]]]なのかよw
([[名無しさん]] [WEAK[2006-01-22 01:27:04 +00:00]])

[2]
[CITE[Bug 319368 - Implement <a ping>]] <https://bugzilla.mozilla.org/show_bug.cgi?id=319368>
([[名無しさん]] [WEAK[2006-01-27 01:03:54 +00:00]])

[3]
本当の問題は安全性よりも (賛成派の主張の通り、少なくても今より危険になるわけではない)、[CODE(HTTP)@en[[[POST]]]]されることではないか。
もちろん[[HTTP]]や[[REST]]的には[CODE(HTTP)@en[[[POST]]]]の方が適当なのだが、
[[tag soup]] application開発者はしばしば
([CODE(HTMLe)@en[[[form]]]]ではなく) [CODE(HTMLe)@en[[[a]]]]で[CODE(HTTP)@en[[[POST]]]]することを望んでいる
[WEAK[(あちこちの掲示板で頻出の質問)]]。
[CODE(HTMLa)@en[[[ping]]]]がそれに濫用される可能性がないだろうか。

ただし[CODE(HTMLa)@en[[[ping]]]]に対する[[応答]]は[[レンダリング]]されないので、彼らの需要を満たせるのかどうかには疑問もあるが。

;; 
[CODE(HTMLa)@en[[[ping]]]]を使って[CODE(HTTP)@en[[[POST]]]]して、[[鯖]]側で[[セッション]]管理 (もちろん[[REST]]制約違反)、[CODE(HTMLa)@en[[[href]]]]と[[セッション]]情報
([[Cookie]]) で[CODE(HTTP)@en[[[GET]]]]して結果を得る、ただし[CODE(HTMLa)@en[[[ping]]]]と[CODE(HTMLa)@en[[[href]]]]のどちらが先に処理されるかはわからないので[CODE(HTTP)@en[[[Refresh]]]]でもして待つ、
などという[Q[裏技]]が紹介される日が来る・・・かもしれない。
もはや何をしたかったのかよくわからないがw

([[名無しさん]] [WEAK[2006-01-27 08:07:12 +00:00]])

[REFS[
- [17]
[CITE[Bug 401217 &#8211; Issues with support for "ping" attribute]] ([CODE[2007-10-27 11:50:07 +09:00]] 版) <https://bugzilla.mozilla.org/show_bug.cgi?id=401217>
([[名無しさん]] [WEAK[2007-10-27 02:50:26 +00:00]])
- [18]
[CITE[Feedback on the ping="" attribute (ISSUE-1)]] ([[Ian Hickson <ian@...>]] 著, [CODE[2007-11-02 22:05:54 +09:00]] 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/12316>
- [19]
[CITE[Re: Referer header sent with <a ping>?]] ([[Ian Hickson <ian@...>]] 著, [CODE[2008-01-30 20:33:36 +09:00]] 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/13091>
- [41] [CITE@en['''['''g''']''' (2) Update <a ping=[SPAN[']]'> to address recent concerns. · whatwg/html@b807258]] (9 Feb 2008) <https://github.com/whatwg/html/commit/b8072584f86c17c7eb177c3731fcc80b1a97131b>
- [20]
[CITE[Re: Referer header sent with <a ping>?]] ([[Ian Hickson <ian@...>]] 著, [TIME[2008-02-09 01:58:06 +09:00]] 版) <http://permalink.gmane.org/gmane.org.w3c.whatwg.discuss/13187>
- [38] [CITE@en['''['''g''']''' (2) Let's try a new strategy for ping=[SPAN[']]'. · whatwg/html@2b44075]] ([TIME[2016-02-25 14:04:09 +09:00]] 版) <https://github.com/whatwg/html/commit/2b44075877450c7452df882b38c2cc8f8c2dd2db>
- [39] [CITE@en['''['''''']''' (0) Filling in the rendering section: remove hit testing (see www-… · whatwg/html@fceda3f]] (10 Feb 2009) <https://github.com/whatwg/html/commit/fceda3f08e335de7b9f9255a5e27a8cc7f160694>
- [21] [CITE[IRC logs: freenode / #whatwg / 20090811]]
([TIME[2009-10-10 20:07:44 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090811#l-271>
- [22] [CITE[IRC logs: freenode / #whatwg / 20090908]]
([TIME[2009-10-17 23:05:49 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090908>
]REFS]

** HTML5 からの除外

[16] 2010年3月には、実装状況がよくないため、 [[W3C]] [[HTML5]] から除外されました。
(最新版 [[HTML]] には残されました。)

[23] [CITE@en[HTML5 Revision Tracker]]
[CITE[Move ping=[SPAN[']]' to the next version of HTML (and out of the W3C HTML5 draft)]]
([TIME[2010-03-05 08:09:02 +09:00]] 版)
<http://html5.org/tools/web-apps-tracker?from=4823&to=4824>

** WebKit による実装

[24] [CITE[IRC logs: freenode / #whatwg / 20100823]]
( ([TIME[2010-08-30 23:53:50 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20100823#l-350>

[25] [CITE@en[Ilya Grigorik - Google+ - Google mobile search is getting faster - to be exact,…]]
( ([TIME[2013-11-08 08:51:47 +09:00]] 版))
<https://plus.google.com/+IlyaGrigorik/posts/fPJNzUf76Nx>

[26] [CITE@en[401217 – Issues with support for "ping" attribute]]
( ([TIME[2013-11-08 08:55:55 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=401217>

[27] [CITE[''''''[''''''webkit-dev'''''']'''''' <a ping> landed]]
( ([TIME[2010-10-19 15:42:41 +09:00]] 版))
<https://lists.webkit.org/pipermail/webkit-dev/2010-October/014657.html>

[28] [CITE[''''''[''''''webkit-dev'''''']'''''' <a ping> landed]]
( ([TIME[2010-10-19 15:42:41 +09:00]] 版))
<https://lists.webkit.org/pipermail/webkit-dev/2010-October/014575.html>

[29] [CITE[Issue 21589 - chromium - Implement <a ping> - An open-source project to help move the web forward. - Google Project Hosting]]
( ([TIME[2013-11-08 09:02:07 +09:00]] 版))
<https://code.google.com/p/chromium/issues/detail?id=21589>

[30] [CITE[Bug 50488 – Enable <a ping> for Mac/Windows/WebKit2 builds]]
( ([TIME[2013-11-08 09:04:26 +09:00]] 版))
<https://bugs.webkit.org/show_bug.cgi?id=50488>

[31] [CITE[Issue 257281 - chromium - <a ping> does not issue a ping request when "Open Link in New Tab" - An open-source project to help move the web forward. - Google Project Hosting]]
( ([TIME[2013-11-08 09:07:42 +09:00]] 版))
<https://code.google.com/p/chromium/issues/detail?id=257281>

[32] [CITE@en[951104 – Enable <a ping> by default]]
( ([TIME[2013-12-24 15:05:58 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=951104>

[33] [CITE[IRC logs: freenode / #whatwg / 20131219]]
( ([TIME[2013-12-24 15:03:49 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20131219>

[34] [CITE@en[Web Applications 1.0 r8369     Make a.ping and area.ping use DOMSettableTokenList based on #whatwg feedback. Hopefully no content relies on their existing implementations; if they do let me know and we'll back this out.]]
( ([TIME[2014-01-04 05:03:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8368&to=8369>

[35] [CITE@en[Bug 24238 – Should the tokens in HTMLAnchorElement.ping be resolved?]]
( ([TIME[2014-01-17 23:40:04 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=24238>

[36] [CITE[Add ping context · 2c01edc · whatwg/fetch]]
( ([TIME[2014-05-20 09:04:41 +09:00]] 版))
<https://github.com/whatwg/fetch/commit/2c01edca7a910f333b8ffac9d51d872f0b58e895>

[4] [CITE@en[Due to ''''''[''''''PutForwards'''''']'''''' the ping IDL attribute needs be readonly · whatwg/html@29578b4]]
([TIME[2015-08-28 16:36:01 +09:00]] 版)
<https://github.com/whatwg/html/commit/29578b4cb3f79aaaa3401b5f7e800867edba0ee8>

[5] [CITE@en[Integrate Fetch into HTML · whatwg/html@7c5555a]]
([TIME[2015-09-18 18:49:01 +09:00]] 版)
<https://github.com/whatwg/html/commit/7c5555a16f2920c02244c10756bb2f1a11e87a22>


[6] [[Chrome]] が実装しており、標準で有効になっています。
[[Firefox]] は標準で無効にしています。
[TIME[2016-01-05T05:19:25.900Z]]

[7] [[IDL属性]] [CODE(DOMa)@en[[[ping]]]]
を [[Chrome]] も [[Firefox]] も実装しています。 ([[Firefox]] は標準で
[CODE(HTMLa)@en[[[ping]]]] [[属性]]を無効にしていますが、 [[IDL属性]]は存在します。)
[TIME[2016-01-05T05:29:19.100Z]]

[8] [[IDL属性]] [CODE(DOMa)@en[[[ping]]]]
を [[Chrome]] も [[Firefox]] も [CODE(DOMi)@en[[[DOMTokenList]]]] ではなく
[CODE(IDL)@en[[[DOMString]]]] としています。
[TIME[2016-01-05T05:29:47.400Z]]



[9] [CITE[Intent to Implement: Replace DOMString with DOMSettableTokenList for {HTMLAnchorElement, HTMLAreaElement}.ping. - Google グループ]]
([TIME[2016-01-05 14:35:44 +09:00]] 版)
<https://groups.google.com/a/chromium.org/forum/#!topic/blink-dev/Z-RBeFLHRSU>

[10] [CITE[Issue 498219 - chromium - Replace DOMString with DOMSettableTokenList for {HTMLAnchorElement, HTMLAreaElement}.ping. - An open-source project to help move the web forward. - Google Project Hosting]]
([TIME[2016-01-05 14:36:16 +09:00]] 版)
<https://code.google.com/p/chromium/issues/detail?id=498219>

[11] [CITE@en[Handling of url parsing errors in a.ping is undefined · Issue #477 · whatwg/html]]
([TIME[2016-02-03 12:21:16 +09:00]] 版)
<https://github.com/whatwg/html/issues/477>

[12] [CITE@en[URLs are parsed and produce records · whatwg/html@30bc255]]
([TIME[2016-02-14 22:52:25 +09:00]] 版)
<https://github.com/whatwg/html/commit/30bc2557105ad62881ec9670f253febbc9761b44>

[13] [CITE@en[Adding ''''''[''''''SameObject'''''']'''''' to DOMTokenLists · whatwg/html@ec1dc4d]]
([TIME[2016-02-18 11:10:09 +09:00]] 版)
<https://github.com/whatwg/html/commit/ec1dc4d4571c61cf0c0dfe3e562898635886b412>

[14] [CITE@en[Never send a referrer with hyperlink auditing pings · whatwg/html@faec3a5]]
([TIME[2016-02-23 11:01:46 +09:00]] 版)
<https://github.com/whatwg/html/commit/faec3a50ea181f322ab9819975e285ced34a0308>

[40] [CITE@en[Use the HTTPS state concept instead of "encrypted connection" · whatwg/html@1ee3316]]
([TIME[2016-02-25 14:07:21 +09:00]] 版)
<https://github.com/whatwg/html/commit/1ee3316caa1a5754f7bbd29c494842785f9a181b>

[44] [CITE@en[Fix #1089: don't send pings for non-http(s) URLs · whatwg/html@817da95]]
([TIME[2016-04-27 15:31:20 +09:00]] 版)
<https://github.com/whatwg/html/commit/817da9577b565e808d7af0295e1affc094887418>

[45] [CITE@en[Bug 156801 – Anchor element 'ping' property should only apply to http/https destinations]]
([TIME[2016-04-27 15:33:38 +09:00]] 版)
<https://bugs.webkit.org/show_bug.cgi?id=156801>

[46] [CITE@en[Make a.ping and tableCell.headers strings, not DOMTokenLists]]
( ([[domenic]]著, [TIME[2016-05-17 15:09:30 +09:00]]))
<https://github.com/whatwg/html/commit/7dd2e95b03edd19515c636152d63d3c74cb69d6f>

[47] [CITE@en[Make area.ping a string, not DOMTokenList]]
( ([[zcorpan]]著, [TIME[2016-05-17 17:32:01 +09:00]]))
<https://github.com/whatwg/html/commit/da9e4cb7142277d609e6636a56a282f5aba15e5c>

[48] [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>

[79] [CITE@en[Align Fetch's destination concept with changes in Fetch]]
([[sideshowbarker]]著, [TIME[2016-07-05 02:46:14 +09:00]])
<https://github.com/whatwg/html/commit/5e8f96a85d182d36c177db0d6fdde58b4ded86d4>