[5] 
[CODE[Geolocation]]
[[オブジェクト]]の[[メソッド]]で[[位置情報]]を取得できます。

* 仕様書

[REFS[
- [106] [CITE@en[Geolocation API Specification]], [TIME[2019-11-24 18:38:51 +09:00]] <https://w3c.github.io/geolocation-api/#security>
- [3] '''[CITE@en[Geolocation API Specification]], [TIME[2019-11-24 18:38:51 +09:00]] <https://w3c.github.io/geolocation-api/#geolocation_interface>'''
]REFS]

* 引数

[110] 
[CODE[getCurrentLocation]]
[[メソッド]]と
[CODE[watchPosition]]
[[メソッド]]の第3引数は、
[CODE[PositionOptions]]
[[辞書]]を指定できます。
省略可能で、既定値は空の[[辞書]]です。

[111] 
[DFN[[CODE[PositionOptions]]]]
は、
3つの[[辞書メンバー]]のある[[辞書]]です。
[SRC[>>3]]

[FIG(short list)[ [112] [CODE[PositionOptions]] [[辞書メンバー]]
- [CODE[timeout][PositionOptions]]
- [CODE[enableHighAccuracy]]
- [CODE[maximumAge]]
]FIG]

* 処理

[6] 
[CODE[Geolocation]]
[[インターフェイス]]の
[DFN[[CODE[getCurrentLocation]]]]
[[メソッド]]は、
次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]

[FIG(steps)[
= [7] [VAR[成功コールバック]]を、
必須の第1引数を [CODE[PositionCallback]] と解釈した結果に設定します。
= [8] [VAR[エラーコールバック]]を、
第2引数を [CODE[PositionErrorCallback]] と解釈した結果に設定します。
= [9] [VAR[オプション群]]を、
第3引数を [CODE[PositionOptions]]
と解釈した結果に設定します。
= [90] [VAR[設定群]]を、
[[環境設定群オブジェクト]]に設定します。
]FIG]

[10] 
更に、
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[設定群]]について、
[[非同期的]]に次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]

[FIG(steps)[
= [92] 許可を確認します (>>91)。
[FIG(list members)[
: [VAR[エラーコールバック]] : [VAR[エラーコールバック]]
: [VAR[設定群]] : [VAR[設定群]]
: [VAR[次の処理]] : >>93
]FIG]

]FIG]


[93] 次の処理は、次のようにします。 [SRC[>>3]]

[FIG(steps)[
= [11] [VAR[位置]]を、
キャッシュされた [CODE[GeolocationPosition]] に設定します。
= [23] [VAR[位置]]の[F[齢]]が[VAR[オプション群]]の
[F[[CODE[maxAge]]]]
[[以下]]の場合、
== [24] [VAR[成功コールバック]]に[VAR[位置]]を報告し、ここで停止します。
= [15] [VAR[オプション群]]の [F[[CODE[timeout][PositionOptions]]]] が [N[0]]
の場合、
== [26] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]

: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[TIMEOUT][GeolocationPositionError]]

]FIG]
== [21] [VAR[エラーコールバック]]に[VAR[エラー]]を報告し、ここで停止します。
= [70] [VAR[中断信号]]を、未中断に設定します。
= [81] 
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[中断信号]]について、
取得の手順群 (>>82) を実行します。

]FIG]

-*-*-

[42] 
[CODE[Geolocation]]
[[インターフェイス]]の
[DFN[[CODE[watchPosition]]]]
[[メソッド]]は、
次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]

[FIG(steps)[
= [43] [VAR[成功コールバック]]を、
必須の第1引数を [CODE[PositionCallback]] と解釈した結果に設定します。
= [44] [VAR[エラーコールバック]]を、
第2引数を [CODE[PositionErrorCallback]] と解釈した結果に設定します。
= [45] [VAR[オプション群]]を、
第3引数を [CODE[PositionOptions]]
と解釈した結果に設定します。
= [97] [VAR[ハンドルの状態]]を、
[[文脈オブジェクト]]の[F[[[ハンドル][ハンドル (JavaScript)]]の状態]]に設定します。
= [52] [VAR[識別子]]を、
[VAR[ハンドルの状態]]における新しい[[ハンドル][ハンドル (JavaScript)]]に設定します。
= [94] [VAR[設定群]]を、
[[環境設定群オブジェクト]]に設定します。
= [53] [VAR[識別子]]を返します。
]FIG]

[46] 
更に、
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[ハンドルの状態]]、
[VAR[識別子]]、
[VAR[設定群]]について、
[[非同期的]]に次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]

[FIG(steps)[
= [47] 許可を確認します (>>91)。
[FIG(list members)[
: [VAR[エラーコールバック]] : [VAR[エラーコールバック]]
: [VAR[設定群]] : [VAR[設定群]]
: [VAR[次の処理]] : 
[FIG(steps)[
= [51] [VAR[成功コールバック]]、
[VAR[失敗コールバック]]、
[VAR[オプション群]]、
[VAR[ハンドルの状態]]、
[VAR[識別子]]について [[watch process]] を実行します。

]FIG]

]FIG]

]FIG]






[58] 
[VAR[成功コールバック]]、
[VAR[失敗コールバック]]、
[VAR[オプション群]]、
[VAR[ハンドルの状態]]、
[VAR[識別子]]について
[DFN[watch process]]
は、
次のようにします。
[SRC[>>3]]

[FIG(steps)[
= [95] [VAR[ハンドルの状態]]において[VAR[識別子]]の中断信号が中断済みの場合、
== [96] ここで停止します。
= [36] [VAR[以前の位置]]を、
[CODE[null]]
に設定します。
= [59] [VAR[位置]]を、
キャッシュされた [CODE[GeolocationPosition]] に設定します。
= [60] [VAR[位置]]の[F[齢]]が[VAR[オプション群]]の
[F[[CODE[maxAge]]]]
[[以下]]の場合、
== [62] [VAR[成功コールバック]]に[VAR[位置]]を報告します。
== [35] [VAR[以前の位置]]を、[VAR[位置]]に設定します。
= [61] 
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[ハンドルの状態]]、
[VAR[識別子]]、
[VAR[以前の位置]]について、
[[acquisition steps]]
を実行します。
]FIG]

[63] 
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[ハンドルの状態]]、
[VAR[識別子]]、
[VAR[以前の位置]]について
[DFN[acquisition steps]]
は、
次のようにします。
[SRC[>>3]]

[FIG(steps)[
= [98] [VAR[ハンドルの状態]]において[VAR[識別子]]についての中断信号が中断済みの場合、
== [99] ここで停止します。
= [34] 
取得の手順群 (>>82)
を実行します。
[FIG(list members)[

:[VAR[成功コールバック]]:[VAR[成功コールバック]]、
:[VAR[エラーコールバック]]:[VAR[エラーコールバック]]
:[VAR[オプション群]]:[VAR[オプション群]]
:[VAR[以前の位置]]:[VAR[以前の位置]]
: [VAR[watch]] : [[真]]
: [VAR[中断信号]] : 
[VAR[ハンドルの状態]]における[VAR[識別子]]についての中断信号。
: [VAR[次の処理]] :
[FIG(steps)[
= [85] [[実装依存]]の時間、待ちます。
= [84] 
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[ハンドルの状態]]、
[VAR[識別子]]、
[VAR[以前の位置]]について
[[acquisition steps]]
を実行します。

]FIG]

]FIG]

]FIG]

-*-*-

[91] 許可を確認するには、
[VAR[エラーコールバック]]、
[VAR[設定群]]、
[VAR[次の処理]]について、
次のようにします。
[SRC[>>3]]

[FIG(steps)[
= [17] [VAR[設定群]]の[F[非保安文脈]]が[[真]]の場合、
== [18] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]

: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[PERMISSION_DENIED][GeolocationPositionError]]

]FIG]
== [19] [[開発者コンソール]]に[VAR[エラー]]を表示して[MAY[構いません]]。
== [20] [VAR[エラーコールバック]]に[VAR[エラー]]を報告し、ここで停止します。
= [48] 
[[利用者の許可を照会します][Permission]]。
[FIG(list members)[

: 許可の存在を確認できたときの処理 : [VAR[次の処理]]
: 不許可の存在を確認できたときの処理 :
[FIG(steps)[
= [49] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]

: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[PERMISSION_DENIED][GeolocationPositionError]]

]FIG]
= [50] [VAR[エラーコールバック]]に[VAR[エラー]]を報告します。
]FIG]

]FIG]


]FIG]

* 測位

[117] 
現在 [[Web]] が利用されている一般的な機器には [[GPS]]
などによる[[位置情報]]取得のための[[装置]]が組み込まれています。
[[Webブラウザー]]が動作する[[プラットフォーム]] ([[OS]]
や[[ライブラリー]]) には、
こうした[[装置]]を通じて[[位置情報]]を取得する機能が用意されています。
[CODE[getCurrentPosition]]
や
[CODE[watchPosition]]
は究極的にはこれを呼び出すことになります。


[131] 
[[経緯度]]の他に、
[[高度]]、
移動の速度と方向が取得できることになっています。
ただし必須なのは[[経緯度]]だけです。
それ以外も取得できるのかは[[プラットフォーム]] (と接続されている[[センサー]]) 次第です。

[134] 
[[Webブラウザー]]によっては、
[[開発者たる利用者が位置情報を任意に設定][開発モード]]できます。



-*-*-

[82] 
[VAR[成功コールバック]]、
[VAR[エラーコールバック]]、
[VAR[オプション群]]、
[VAR[以前の位置]]、
[VAR[watch]] (既定値は[[偽]])、
[VAR[中断信号]]、
[VAR[次の処理]] (既定値は何もしない)
について取得の手順群は、
次のようにします。
[SRC[>>3]]

[FIG(steps)[

= [28] [VAR[タイマー]]を、新しいタイマーを作成した結果に設定します。
[FIG(list members)[

: 時間 :
[VAR[オプション群]]の [F[[CODE[timeout][PositionOptions]]]]
[[ミリ秒]]
: 時間経過後[[非同期的]]に実行する処理 :
[FIG(steps)[
= [32] [VAR[タイマー]]の[F[停止済み]]が[[真]]の場合、
== [33] ここで停止します。
= [69] [VAR[中断信号]]を、中断済みに設定します。
= [29] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]

: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[TIMEOUT][GeolocationPositionError]]

]FIG]
= [30] [VAR[エラーコールバック]]に[VAR[エラー]]を報告します。
= [65] [VAR[次の処理]]を実行します。

]FIG]

]FIG]
= [27] 
[[プラットフォーム]]から[[位置情報]]を取得します。
[FIG(list members)[

: 取得方法決定のヒント :
[VAR[オプション群]]の [F[[CODE[enableHighAccuracy]]]]
: 取得成功時に[[非同期的]]に実行する処理 :
[FIG(steps)[
= [31] [VAR[中断信号]]が中断済みの場合、
== [78] ここで停止します。
= [72] [VAR[タイマー]]の[F[停止済み]]を[[真]]に設定します。
= [79] [VAR[位置]]を、
新しい
[CODE[GeolocationPosition]]
に設定します。
= [74] 
キャッシュされた 
[CODE[GeolocationPosition]]
を、
[VAR[位置]]に設定します。
= [39] [VAR[watch]] が[[真]]で、
[[実装依存]]の基準で[[コールバック]]が呼ばれすぎていると判断される場合、
== [66] [VAR[次の処理]]を実行します。
== [40] ここで停止します。
= [75] [VAR[成功コールバック]]に[VAR[以前の位置]]について[VAR[位置]]を報告します。

]FIG]
: 取得失敗時に[[非同期的]]に実行する処理 :
[FIG(steps)[
= [76] [VAR[中断信号]]が中断済みの場合、
== [73] ここで停止します。
= [77] [VAR[タイマー]]の[F[停止済み]]を[[真]]に設定します。
= [41] [VAR[watch]] が[[真]]で、
[[実装依存]]の基準で[[コールバック]]が呼ばれすぎていると判断される場合、
== [83] [VAR[次の処理]]を実行します。
== [64] ここで停止します。
= [80] [VAR[エラー]]を、
新しい
[CODE[GeolocationPositionError]]
に設定します。
[FIG(list members)[ [CODE[GeolocationPositionError]]

: [F[[CODE[code][GeolocationPositionError]]]] : [CODE[POSITION_UNAVAILABLE]]

]FIG]
= [71] [VAR[エラーコールバック]]に[VAR[エラー]]を報告します。
= [67] [VAR[次の処理]]を実行します。

]FIG]
: 取得を中断する条件 :
[VAR[中断信号]]が中断済みになったとき

]FIG]

]FIG]

** 取得装置

[123] 
[[プラットフォーム]]は複数の[[測位]]手段に対応していることがあります。
[[GPS]]
による[[位置情報]]の取得の他に、
[[WiFi]] 情報などを利用した位置の推定技法が使われることがあります。
その他屋内での位置決定用の[[ビーコン]]利用など、
いろいろな手法が考えられ、
[[プラットフォーム]]、
[[装置]]、
利用環境その他によって得られる精度、電力消費、必要時間などが異なります。
[[Geolocation API]]
はそうした測位手法の詳細を指定する手段を [[Webアプリケーション]]に提供せず、
むしろ抽象化し意識せずに利用できるようにしていますが、
唯一、高精度な[[位置情報]]を望むか否かだけ、
指定できるようになっています。


[118] 
[CODE[getCurrentPosition]]
[[メソッド]]や
[CODE[watchPosition]]
[[メソッド]]の第3引数の
[CODE[PositionOptions]]
[[辞書]]には、
[CODE[enableHighAccuracy]]
[[属性]]を指定できます。

[119] 
[CODE[PositionOptions]]
[[辞書]]の
[DFN[[CODE[enableHighAccuracy]]]]
[[属性]]は、
[[応用]]が出来得る最善の結果の受信を希望するとの[[ヒント]]を示すものです。
高精度な[[位置情報]]が不要な[[応用]]がこれを示すことで実装の消費電力を削減することが想定されています。
値は
[CODE[boolean]]
で、
省略時の[[既定値]]は
[CODE[false]]
です。
[SRC[>>3]]

[120] 
この[[属性]]が指定された場合、
応答時間が長くなったり、
電力消費が大きくなったりするかもしれません。
[SRC[>>3]]

[122] 
[[装置]]によっては「より正確な結果」を提供し得ないかもしれません [SRC[>>3]]。
そのときエラーを返すべきなのか、
[[偽]]が指定されたのと同じ挙動をするべきなのか不明です。
[[ヒント]]でもありますし、一般には後者の方が便利そうです。


[121] 
[[利用者]]はこの能力の利用を拒絶するかもしれません [SRC[>>3]]。
そのときエラーを返すべきなのか、
[[偽]]が指定されたのと同じ挙動をするべきなのか不明です。
[[ヒント]]でもありますし、一般には後者の方が便利そうです。
このような選択肢を提供する実装があるのか不明です。

** タイムアウト

[124] 
[CODE[PositionOptions]]
[[辞書]]の
[DFN[[CODE[timeout][PositionOptions]]]]
[[属性]]は、
[[コールバック関数]]を呼び出すまでの時間の長さの最大値を指定するものです。
値は
[CODE[unsigned long]] に [CODE[Clamp]]
されるものであって、
省略時の[[既定値]]は
[N[0xFFFFFFFF]]
です。
[[ミリ秒]]単位の[[時間長]]と解されます。
[SRC[>>3]]

[125] 
この時間は、[[位置情報]]の取得のみにかかります [SRC[>>3]]。
[[利用者の許可の取得][Permission]]の時間は含まれません。


** キャッシュ

[109] 
[CODE[getCurrentPosition]]
と
[CODE[watchPosition]]
の[[コールバック関数]]に与えられる
[CODE[GeolocationPosition]]
は、
キャッシュできることになっています。
つまり前に得たのと同じ[[オブジェクト]]が得られる場合があります。

[22] キャッシュの利用可能範囲は仕様書に明記がありません。
現在の文書でしょうか。
[CODE[getCurrentPosition]]
と
[CODE[watchPosition]]
で共有できるのかも定かではありません。
同じ [CODE[watchPosition]] 
の実行では何度も同じ[[コールバック関数]]が同じオブジェクトで呼び出されることはないような規定となっており、
同時に実行される他の [CODE[watchPosition]]
とも共用されないような規定になっています。
こうした細かな挙動が本当に意図通りなのか、そしてそのように実装されているのかは、
よくわかりません。


[86] 
[[仕様書]]は
[CODE[GeolocationPosition]]
の再利用のみ想定していて、
別の[[文書]]が取得した情報やほかの[[アプリ]]の取得した情報の
([[プラットフォーム]]を介した)
再利用は規定していません。
[[Webブラウザー]]や[[プラットフォーム]]の設計によりそうした再利用が発生することも考えられます。
もちろんその場合は測位値は再利用でも
[CODE[GeolocationPosition]]
[[オブジェクト]]は新しいものになります。
(そしてそのような形の再利用は仕様違反ではありません。)

[126] 
[CODE[PositionOptions]]
[[辞書]]の
[DFN[[CODE[maximumAge]]]]
[[属性]]は、
[[応用]]が受け入れられる、キャッシュされた位置の[[齢]]の最大値です。
値は
[CODE[Clamp]]
される
[CODE[unsigned long]]
で、省略時の[[既定値]]は
[N[0]]
です。
[[ミリ秒]]単位の[[時間長]]です。
[SRC[>>3]]

[127] 
[CODE[watchPosition]]
では、
最初の[[位置情報]]に適用されます [SRC[>>3]]。

[130] 
キャッシュされた位置の[[齢]]が指定された値より小さいなら、
それを返します。そうでない場合、
新しい[[位置情報]]を取得しようと試みなければなりません。
[SRC[>>3]]


[128] 
値が [N[0]] のとき、キャッシュされた位置は使わず、
ただちに新しい[[位置情報]]を取得しようと試みなければなりません。
[SRC[>>3]]

[129] 
値が [CODE[Infinity]]
のとき、
[[齢]]に関わらずキャッシュされた[[位置情報]]を返さなければなりません。
[SRC[>>3]]
(と仕様書にはありますが、 [CODE[Clamped]] [CODE[unsigned long]]
なので、
[CODE[Infinity]]
が指定されると
[N[0xFFFFFFFF]]
と解されます。
これは49日余に相当します。)


* コールバック関数

[115] 
[CODE[getCurrentPosition]]、
[CODE[watchPosition]]
とも、
第1引数には取得成功時の[[コールバック関数]] (必須)、
第2引数には取得失敗時の[[コールバック関数]] (省略可能) を指定できます。

[116] 
[[コールバック関数]]は、取得後に[[非同期的]]に呼び出されます。

-*-*-

[54] 
[DFN[[CODE[PositionCallback]]]]
は、
[[コールバック関数]]で、
[CODE[GeolocationPosition]]
を[[引数]]として実行されます。
[[返り値]]は使われません。 [SRC[>>3]]

[56] 
[CODE[getCurrentLocation]]
[[メソッド]]と
[CODE[watchPosition]]
[[メソッド]]の第1引数として指定でき、必須です。
[CODE[getCurrentLocation]]
では高々1回呼び出されます。
[CODE[watchPosition]]
では任意の回数呼び出されます。


[13] [VAR[成功コールバック]]に省略可能な[VAR[以前の位置]]について
[CODE[GeolocationPosition]] [VAR[位置]]を報告するには、
次のようにします。 [SRC[>>3]]

[FIG(steps)[
= [37] [VAR[以前の位置]]が [CODE[null]] でなく、
[[実装依存]]の基準により[RUBYB[[VAR[以前の位置]]と[VAR[位置]]が十分異なる][[DFN[new position differs significantly from the previous position]]]]と''いえない''と判断される場合、
== [38] ここで停止します。
= [12] [VAR[位置]]について、
[VAR[成功コールバック]]を[[呼び出し][コールバックの実行]]ます。
]FIG]


[87] 
[CODE[watchPosition]] の[[コールバック関数]]の呼び出しについて、
[[仕様書]]上は値が変化したときとされていて、
値が十分に変化したと認められない時通知されないように規定されています。
さらに、
[[ネットワークの変化]]など位置が変化した可能性があると判断し得るときに[[測位]]することになっています。
逆に変化した場合であっても[[コールバック関数]]の呼び出しは適宜間引いて良いことにされています。

[88] 
性質上、こうした規定が忠実に実装されているか確認することは困難です。


[89] 
実際に試してみると、値が変化していなくても[[コールバック関数]]が一定時間ごとに呼び出されることがあるようです。

[133] 
[[コールバック関数]]の処理内容や実行環境の性能上の制限によっては、
高頻度で[[コールバック関数]]が呼び出されることで正常な動作に支障が生じる場合があります。
そのため[[Webブラウザー]]は[[コールバック関数]]の呼び出し頻度を抑えることが認められています。

[132] 
一般的な実装ではせいぜい[[秒]]単位の頻度でしか呼び出されません。
非常に高頻度で呼び出されるとセキュリティー上の問題が生じる危険性もあります。
[SEE[ [[DOMHighResTimeStamp]] ]]

-*-*-

[55] 
[DFN[[CODE[PositionErrorCallback]]]]
は、
[[コールバック関数]]で、
[CODE[GeolocationPositionError]]
を[[引数]]として実行されます。
[[返り値]]は使われません。
[SRC[>>3]]


[57] 
[CODE[getCurrentLocation]]
[[メソッド]]と
[CODE[watchPosition]]
[[メソッド]]の第2引数として指定できますが、
省略可能です。
省略された場合エラーは捨てられます。
[CODE[getCurrentPosition]]
[[メソッド]]では高々1回呼び出されます。


[25] [VAR[エラーコールバック]]に
[CODE[GeolocationPositionError]] [VAR[エラー]]を報告するには、
次のようにします。 [SRC[>>3]]

[FIG(steps)[
= [14] [VAR[エラーコールバック]]が指定された場合、
== [16] [VAR[エラー]]について、
[VAR[エラーコールバック]]を[[呼び出し][コールバックの実行]]ます。
]FIG]

-*-*-

[68] 
[[コールバック関数]]内の[[例外]]の処理は、仕様書上明確になっていません。
[[例外の報告]]がなされて処理が継続されるものとみられます。

* ハンドル

[113] 
[CODE[watchPosition]]
[[メソッド]]は[[ハンドル][ハンドル (JavaScript)]]を返します。
[CODE[clearWatch]]
[[メソッド]]にこの[[ハンドル][ハンドル (JavaScript)]]を渡すことで、
watch を停止できます。

;; [114] [CODE[setTimeout]] / [CODE[setInterval]] はどちらも[[ハンドル][ハンドル (JavaScript)]]を返し、
どちらも停止できます。
[CODE[getCurrentPosition]] / [CODE[watchPosition]]
はそれと対になるものですが、
[CODE[getCurrentPosition]]
は[[ハンドル][ハンドル (JavaScript)]]を返さないので中断できません。

[100] 
[CODE[Geolocation]]
[[インターフェイス]]の
[DFN[[CODE[clearWatch]]]]
[[メソッド]]は、
次のようにしなければ[MUST[なりません]]。
[SRC[>>3]]

[FIG(steps)[
= [101] [VAR[識別子]]を、
必須の第1引数を
[CODE[long]]
と解釈した結果に設定します。
= [102] [VAR[ハンドルの状態]]を、
[[文脈オブジェクト]]の[F[[[ハンドル][ハンドル (JavaScript)]]の状態]]に設定します。
= [103] [VAR[ハンドルの状態]]において[VAR[識別子]]が未使用の場合、
== [104] ここで停止します。
= [105] 
[VAR[ハンドルの状態]]における[VAR[識別子]]の中断信号を、中断済みに設定します。


]FIG]



* セキュリティーとプライバシー

[107] 
[[位置情報]]の取得は、 [[利用者]]の同意が必要となっています。
[SEE[ [[Permission]] ]]

-*-*-

[108] 
[[位置情報]]の[[受信者]]は、
これが必要な時だけ要求するようにしなければ[MUST[なりません]]。
[[受信者]]は、[[位置情報]]を取得した目的にのみこれを用いなければ[MUST[ならず]]、
[[利用者]]が保持し続けることを認めた場合を除き、完了したら破棄しなければ[MUST[なりません]]。
[[受信者]]は、[[位置情報]]への無許可のアクセスを認めないように対策しなければ[MUST[なりません]]。
[[位置情報]]が蓄積される場合には、[[利用者]]がこれを更新・削除できる[SHOULD[べきです]]。
[[利用者]]が認めた場合を除き、[[位置情報]]を再転送しては[MUST[なりません]]。
再転送する場合には注意を払う[SHOULD[べき]]で、
[[暗号化]]することを[RUBYB[おすすめします][[[encouraged]]]]。
[[受信者]]は、
[[位置情報]]を収集していること、その目的、保存期間、安全対策、
共有する場合どう共有されるか、[[利用者]]がどうアクセス、更新、削除できるか、
その他[[利用者]]が行えることを明確に開示しなければ[MUST[なりません]]。
以上の指針に従わない場合には、その説明も開示しなければ[MUST[なりません]]。 [SRC[>>106]]


* 歴史

[1] [CITE@en[Geolocation API Specification]]
( ([TIME[2013-10-22 23:10:42 +09:00]] 版))
<http://www.w3.org/TR/geolocation-API/#get-current-position>

[4] [CITE@en[Geolocation API Specification]]
([TIME[2019-03-18 21:22:13 +09:00]])
<https://w3c.github.io/geolocation-api/#dom-geolocation-watchposition>

[2] 
[[Android]] の [[Chrome]] では、既定の状態で、ほぼ毎秒くらいの頻度でコールバックが呼び出されます。[TIME[2020-04-15T08:06:25.400Z]]
