* 仕様書

[REFS[
- [13] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#the-navigator-object>'''
-- [11] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#plugins-2>
- [25] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-05-06 10:42:35 +09:00]] 版) <https://html.spec.whatwg.org/#the-workernavigator-object>
- [9] [CITE@en[Geolocation API Specification]] ([TIME[2013-10-22 23:10:42 +09:00]] 版) <http://www.w3.org/TR/geolocation-API/#geolocation_interface>
- [66] [CITE@en[Service Workers Nightly]] ([TIME[2017-03-02 15:00:14 +09:00]]) <https://w3c.github.io/ServiceWorker/#serviceworkercontainer-interface>
]REFS]

* 意味

[55] [CODE(DOMi)@en[Navigator]] [[オブジェクト]]は、
[[利用者エージェント]]の識別と状態を表すと共に、
[[プロトコル取り扱い器]]や[[内容取り扱い器]]を登録する [[API]]
を提供するものです [SRC[>>13]]。

[58] [[文書環境]]と[[ワーカー環境]]で [CODE(DOMi)@en[Navigator]]
[[オブジェクト]]や [CODE(DOMi)@en[WorkerNavigator]] [[オブジェクト]]が存在します。
基本的には [[singleton]] で、環境ごとに1つ存在します。
[[文書環境]]と[[ワーカー環境]]では提供される [[API]]
が微妙に違っています。

* [CODE(DOMa)@en[navigator]] 属性

[56] [CODE(DOMi)@en[Window]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[navigator]]]]
[[IDL属性]]は、 [CODE(DOMi)@en[Navigator]] [[オブジェクト]]を返さなければ[MUST[なりません]]
[SRC[>>13]]。

[57] この [CODE(DOMi)@en[Navigator]] [[オブジェクト]]は、
[CODE(DOMi)@en[Window]] の作成時に新たに作成されます。
値が変化するのは、 [CODE(JS)@en[document.open]] の時のみです。

* Navigator オブジェクトのメンバー

[4] [CITE[Results for navigator]] ([TIME[2009-02-28 13:57:07 +09:00]] 版) <https://suika.suikawiki.org/gate/test-results/list/enum-navigator/all>
をご覧ください。

- [1] ''navigatorオブジェクトのプロパティ一覧'' <http://game.gr.jp/ua/s1.htm>

[3] 
[FIG(short list)[
- [CODE(DOMa)@en[[[app]]]]
- [CODE(DOMa)@en[appCodeName]]
- [CODE(DOMa)@en[appName]]
- [CODE(DOMa)@en[appVersion]]
- [CODE(DOMa)@en[[[buildID]]]],[[Gecko]]
- [CODE(DOMa)@en[[[contacts]]]]
- [CODE(DOMa)@en[[[cookieEnabled]]]]
- [CODE(DOMa)@en[[[geolocation]]]]
- [CODE(DOMm)@en[[[hasPendingMessages]]]]
- [CODE(DOMa)@en[[[mozIsLocallyAvailable]]]]
- [CODE(DOMa)@en[[[javaEnabled]]]]
- [CODE(DOMa)@en[[[language]]]]
- [CODE(DOMa)@en[[[maxTouchPoints]]]]
- [CODE(DOMa)@en[[[messaging]]]]
- [CODE(DOMa)@en[[[mimeTypes]]]]
- [CODE(DOMa)@en[[[nfc]]]]
,[CODE(DOMa)@en[[[onLine]]]],[[Gecko]]
,[CODE(DOMa)@en[[[oscpu]]]],[[Gecko]]
- [CODE(DOMa)@en[platform]]
- [CODE(DOMa)@en[[[plugins]]]]
- [CODE(DOMa)@en[[[preference]]]] [SRC[[[JavaScript 1.2]]]]
- [CODE(DOMa)@en[product]]
- [CODE(DOMa)@en[productSub]]
,[CODE(DOMm)@en[[[registerContentHandler]]]],[[Gecko]]
,[CODE(DOMm)@en[[[registerProtocolHandler]]]],[[Gecko]]
- [CODE(DOMm)@en[[[savePreferences]]]] [SRC[[[JavaScript 1.2]]]]
,[CODE(DOMa)@en[[[securityPolicy]]]],[[Gecko]]
- [CODE(DOMm)@en[serviceWorker]]
- [CODE(DOMm)@en[[[setMessageHandler]]]]
- [CODE(DOMa)@en[taintEnabled]]
- [CODE(DOMa)@en[[[tcpPermission]]]]
- [CODE(DOMa)@en[[[tcpServerPermission]]]]
- [CODE(DOMa)@en[[[telephony]]]]
- [CODE(DOMa)@en[[[udpPermission]]]]
- [CODE(DOMa)@en[userAgent]]
- [CODE(DOMa)@en[vendor]]
- [CODE(DOMa)@en[vendorSub]]
- [CODE(DOMm)@en[[[vibrate]]]]
- [CODE(DOMa)@en[[[webdriver]]]]
- [CODE(DOMm)@en[[[yieldForStorageUpdates]]]]

[HISTORY[
- [CODE[doNotTrack]]
]HISTORY]
]FIG]

[12] 次の[[インターフェイス]] (いずれも [CODE(IDL)@en[[[NoInterfaceObject]]]])
は、[CODE(IDL)@en[[[Navigator]]]] [[オブジェクト]]に[[実装]]されます。
[FIG(list)[
- [DFN[[CODE(DOMi)@en[[[NavigatorPlugins]]]]]] [[インターフェイス]] [SRC[>>11]]
- [DFN[[CODE(DOMi)@en[[[NavigatorCookies]]]]]] [[インターフェイス]]
- [DEL[[DFN[[CODE(DOMi)@en[[[NavigatorStorageUtils]]]]]] [[インターフェイス]]]] (現 [CODE(DOMi)@en[[[NavigatorCookies]]]])
- [CODE(DOMi)@en[NavigatorConcurrentHardware]]
- [CODE(DOMi)@en[NavigatorID]]

[HISTORY[
- [DFN[[CODE[NavigatorGeolocation]]]]
]HISTORY]
]FIG]

* 状態

[65] 
[FIG(list members)[
: [F[最上位閲覧文脈]] : [CODE(DOMm)@en[vibrate]] で参照されます。
[F[関連大域オブジェクト]]の[F[最上位閲覧文脈]]と解するべきでしょうか。
: [F[[CODE(DOMi)@en[ServiceWorkerContainer]]]] :
[CODE(DOMa)@en[navigator.serviceWorker]] の値です。
: [F[[CODE[geolocation]]]] : [CODE[Geolocation]]
]FIG]

* 処理

** 作成

[67] 作成は、次のようにしなければ[MUST[なりません]]。

[FIG(steps)[
= [68] [[文脈オブジェクト]]の [F[[CODE(DOMi)@en[ServiceWorkerContainer]]]]
を、新しい [CODE(DOMi)@en[ServiceWorkerContainer]] [[オブジェクト]]に設定します [SRC[>>66]]。
[FIG(list members)[ [69] [CODE(DOMi)@en[ServiceWorkerContainer]]
: [F[サービスワーカークライアント]] : 
[[文脈オブジェクト]]の[F[関連設定群オブジェクト]]
]FIG]
= [76] [[文脈オブジェクト]]の
[F[[CODE[geolocation]]]]
を、
新しい
[CODE[Geolocation]]
に設定します。
]FIG]

* 歴史

** 誕生

[15] [[NN2]] ([[JavaScript 1.0]]) で導入されました。

[37] [[JavaScript 1.0]] で次のものが追加されました。
[FIG(short list)[
- [CODE(DOMa)@en[appCodeName]]
- [CODE(DOMa)@en[appName]]
- [CODE(DOMa)@en[appVersion]]
- [CODE(DOMa)@en[userAgent]]
]FIG]

[38] [CODE(DOMa)@en[taintEnabled]] は [[JavaScript 1.1]] で追加されました。

[39] [CODE(DOMa)@en[platform]] は [[JavaScript 1.2]] で追加されました。

[14] [[WinIE 3]] 以上が対応しています。 [[IE]] は 
[DFN[[CODE(JS)@en[[[window.clientInformation]]]]]] として実装しています。

;; [18] この当時から [CODE(JS)@en[[[window.navigator]]]] も実装されていたのかどうか?

;; [2] [CODE(DOMa)@en[navigator]] が [[Netscape Navigator]] を想起させる
(由来する?) ことを忌避したのでしょうか。

[REFS[
- [16] [CITE@ja[clientInformation object (Internet Explorer)]]
([TIME[2015-07-10 00:25:55 +09:00]] 版)
<https://msdn.microsoft.com/ja-jp/library/ms535860(v=vs.85).aspx>
- [17] [CITE@ja[clientInformation]]
([TIME[2015-07-10 00:26:12 +09:00]] 版)
<https://msdn.microsoft.com/ja-jp/library/cc409818.aspx>
]REFS]

** 標準化

[19] [CODE(DOMi)@en[[[Navigator]]]] [[オブジェクト]]は [[W3C]] からは完全に無視されていました。

[20] 2005年9月1日から2006年1月1日までの間に、 [[WHATWG]] [[Web Applications 1.0]] [SRC[>>21]]
(現 [[HTML Standard]]) に [CODE(JS)@en[[[window.navigator]]]] と
[CODE(JS)@en[[[navigator.onLine]]]] が追加されました。これが [CODE(DOMi)@en[[[Navigator]]]]
の標準化のはじまりでした。 [[NN2]] から実に10年が経過していました。

[22] この時 [CODE(JS)@en[[[window.navigator]]]] が定義されていましたが、
[[IE]] は [CODE(JS)@en[[[window.clientInformation]]]] も実装していることが[[コメント]]として記述されていました。
また[[インターフェイス]]名は [DFN[[CODE(DOMi)@en[[[ClientInformation]]]]]] とされていました。

[24] その後2008年になって、 [CODE(DOMi)@en[[[Navigator]]]] [[オブジェクト]]の
[[Webブラウザー]]情報に関する諸[[属性]]が [[HTML5]] (旧 [[Web Applications 1.0]]、
現 [[HTML Standard]]) に追加されました [SRC[>>23]]。[[インターフェイス]]名は、
この時 [CODE(DOMi)@en[[[Navigator]]]] に改められました。

[REFS[
- [21] [CITE@en-GB-hixie[Web Applications 1.0]] ([TIME[2014-03-06 04:52:19 +09:00]] 版) <https://whatwg.org/specs/web-apps/2006-01-01/#scs-browser>
- [23] [CITE@en[Web Applications 1.0 r2070 Define a set of properties for browser detection.]] ([TIME[2008-08-13 10:38:00 +09:00]] 版) <https://html5.org/r/2070>
]REFS]

[5] [CITE@en[Web Applications 1.0 r5834 Split the Navigator IDLs to make the various places it's mentioned easier to understand.]]
( ([TIME[2011-02-05 09:09:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5833&to=5834>

[26] その後[[ワーカー]]でも利用可能とするため、 [CODE(DOMi)@en[[[WorkerNavigator]]]]
[[インターフェイス]]が追加されています。[[ワーカー環境]]の [CODE(DOMi)@en[[[WorkerNavigator]]]]
と[[文書環境]]の [CODE(DOMi)@en[[[Navigator]]]] とでは、[[晒され]]ているメンバーが異なります。

[6] [CITE[''''''[''''''whatwg'''''']'''''' Proposal for a web application descriptor]]
( ([TIME[2011-07-27 07:45:36 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2011-July/032631.html>

[7] [CITE[IRC logs: freenode / #whatwg / 20130115]]
( ([TIME[2013-01-16 21:31:32 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130115#l-49>

[8] [CITE[IRC logs: freenode / #whatwg / 20130225]]
( ([TIME[2013-03-02 19:44:27 +09:00]] 版))
<http://krijnhoetmer.nl/irc-logs/whatwg/20130225#l-398>

[FIG(quote)[
[FIGCAPTION[
[10] [CITE[IRC logs: freenode / #whatwg / 20150126]]
([TIME[2015-01-27 10:36:28 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20150126#l-278>
]FIGCAPTION]

> # '''['''13:54''']''' <Ms2ger> Hm, Presto had navigator.appMinorVersion?
> # '''['''14:15''']''' <zcorpan_> seems so
> # '''['''14:20''']''' <zcorpan_> also browserLanguage, userLanguage
> # '''['''14:21''']''' <Ms2ger> browserLanguage only if navigator.appName == "Microsoft Internet Explorer"
> # '''['''14:22''']''' <zcorpan_> looks like both of those have some usage on github
> # '''['''14:24''']''' <Ms2ger> return (navigator.browserLanguage || navigator.language || navigator.userLanguage).substr(0,2)
> # '''['''14:24''']''' <zcorpan_> "navigator.language" 138,088 "navigator.userLanguage" 51,830 "navigator.browserLanguage" 14,089
> # '''['''14:24''']''' <zcorpan_> "navigator.languages" 991

]FIG]

[27] [[HTML5]] 以後に追加された、主に外部装置からの入出力に関わる諸拡張 [[API]]
は、 [CODE(DOMi)@en[[[Navigator]]]] に追加されることが慣例となっています。
[[装置]]に依存して利用できるかもしれないしできないかもしれないことが
[CODE(DOMi)@en[[[Navigator]]]] オブジェクト上の既存のメンバーの性質と似ていること、
[[大域オブジェクト]]と違って[[スクリプト]]定義の変数や関数と衝突する虞がないことなどの理由があるのでしょう。
しかし統括的な設計者もなく無秩序に開発が進められ、標準不在の標準化が進んでいる(謎)感は否めません
([[Web]] 技術は全体的にそんなものですが...)。

[41] [CITE@en[Web Applications 1.0 r7747     Needed for compatibility.]]
( ([TIME[2013-03-09 11:02:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7746&to=7747>

[42] [CITE@en[リークしたIE11の情報からいろいろ邪推する - fragmentary]]
( ([TIME[2013-04-05 07:48:46 +09:00]] 版))
<http://myakura.hatenablog.com/entry/2013/04/04/195122>

[43] [CITE@en[Web Applications 1.0 r8038     Spec navigator.appCodeName (and respec navigator.product) constant(s)]]
( ([TIME[2013-07-09 11:36:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8037&to=8038>

[36] [CITE@en[Bug 27786 – Specify navigator.vendor as the empty string]]
( ([TIME[2015-01-11 15:52:49 +09:00]] 版))
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=27786>

[46] [CITE@en[Define navigator.vendor · whatwg/html@6feb33c]]
([TIME[2015-09-03 14:51:30 +09:00]] 版)
<https://github.com/whatwg/html/commit/6feb33c46552803bf857ff846a8b349bad1bbb48>

[47] [CITE@en[Restrict the allowed return values for navigator.vendor · whatwg/html@6b75ea5]]
([TIME[2015-09-03 16:22:05 +09:00]] 版)
<https://github.com/whatwg/html/commit/6b75ea51c48ede9e0ea79b6075a1ea9a543b9219>

[44] [CITE@en[Require navigator.productSub to be either "20030107" or "20100101" · whatwg/html@eed419a]]
([TIME[2015-10-01 12:17:11 +09:00]] 版)
<https://github.com/whatwg/html/commit/eed419aeba3cfab6868de2597b321e9ab45a332c>

[45] [CITE@en[27954 – navigator.productSub]]
([TIME[2015-10-01 12:18:07 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=27954>

[49] [CITE@en[Web Applications 1.0 r8885  navigator.vendorSub constant]]
([TIME[2015-03-05 04:24:00 +09:00]] 版)
<https://html5.org/r/8885>

[28] [CITE@en[Expose some NavigatorID members only on Window · whatwg/html@1b1ab95]]
([TIME[2015-10-02 11:00:56 +09:00]] 版)
<https://github.com/whatwg/html/commit/1b1ab957814561d1e819a8ea4f03d5fd7f5a050e>

[40] [CITE@ja[less - iPhone iPad iPod判別方法]]
( ([TIME[2010-09-20 08:56:19 +09:00]] 版))
<http://less.carbonfairy.org/post/1119215328/iphone-ipad-ipod>

[50] [CITE@en[Web Applications 1.0 r8039     navigator.taintEnabled()]]
( ([TIME[2013-07-09 14:17:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8038&to=8039>

[51] [CITE@en[679971 – remove Navigator.taintEnabled()]]
( ([TIME[2013-07-09 19:46:19 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=679971>

[FIG(quote)[
[FIGCAPTION[
[52] [CITE[Introduction]]
([TIME[2015-04-12 17:48:50 +09:00]] 版)
<http://web.archive.org/web/20010414031504/http://developer.netscape.com/docs/manuals/communicator/jsguide/intro.htm#1000788>
]FIGCAPTION]

>  For additional power and functionality, scripts can now gain access to normally restricted information. This is achieved through signed scripts that request expanded privileges. This new functionality provides greater security than data tainting. Data tainting has been removed from JavaScript 1.2.

]FIG]

[53] [CITE@en[22555 – navigator.taintEnabled()]]
([TIME[2015-10-01 12:08:23 +09:00]] 版)
<https://www.w3.org/Bugs/Public/show_bug.cgi?id=22555>

[54] [CITE@en[Add "navigator compatibility mode" and use it for vendor/taintEnabled() · whatwg/html@81f1c7b]]
([TIME[2015-10-01 12:15:10 +09:00]] 版)
<https://github.com/whatwg/html/commit/81f1c7bf8fba31164136e2845d3432c3045f2eef>

[48] [CITE@en[Farewell, Mellblom Browsernator · whatwg/html@5f3a60c]]
([TIME[2015-09-03 14:42:56 +09:00]] 版)
<https://github.com/whatwg/html/commit/5f3a60ccf25fc465f9b4e0269676142468c6cd2e>

[60] [CITE@en[30067 – OSCPU User Agent field needs js exposure]]
( ([TIME[2015-01-15 11:39:30 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=30067>

[59] [CITE@en[Add navigator.oscpu in Gecko compatability mode · whatwg/html@b46dae7]]
([TIME[2016-04-12 17:43:31 +09:00]] 版)
<https://github.com/whatwg/html/commit/b46dae73cde338737baa917102e93352036eeff6>

[FIG(quote)[
[FIGCAPTION[
[61] [CITE@en-US[UC mobile phone browser (U3 kernel) related documentation]]
( ([TIME[2016-06-01 19:25:40 +09:00]]))
<http://www.programering.com/a/MDNxAjMwATU.html>
]FIGCAPTION]

> 1 close the default gesture
> Usage:
> 1 navigator.control.gesture(false);
> Personal recommendation method:
> 1 try {
> 2     navigator.control.gesture(false);
> 3 } catch (e) {
> 4     // ...
> 5 }
> The closure of 2 long press the pop-up menu
> Usage:
> 1 navigator.control.longpressMenu(false);

]FIG]


[62] [CITE@en[Remove XMLDocument.prototype.load by domenic · Pull Request #1478 · whatwg/html]]
([TIME[2016-07-10 12:51:17 +09:00]])
<https://github.com/whatwg/html/pull/1478>

[63] [CITE@en[Remove XMLDocument.prototype.load]]
([[domenic]]著, [TIME[2016-07-07 02:06:08 +09:00]])
<https://github.com/whatwg/html/commit/523f7a8773d2ab8a1eb0da6510651e8c5d2a7531>

[64] [CITE@en[Expose navigator.appCodeName and navigator.product in Worker]]
([[foolip]]著, [TIME[2016-10-11 04:19:28 +09:00]])
<https://github.com/whatwg/html/commit/d57fa7d28647ba4268b7b1ec62ada4bd5a078d67>

[70] [CITE@en[Changes around navigator.webdriver]]
([[shekyan]]著, [TIME[2017-06-09 14:43:07 +09:00]])
<https://github.com/w3c/webdriver/commit/96a38f2415aa59bbe370aaafb451b01b0dccfe39>

[71] [CITE@en[Changes around navigator.webdriver by shekyan · Pull Request #948 · w3c/webdriver]]
([TIME[2017-07-08 13:49:31 +09:00]])
<https://github.com/w3c/webdriver/pull/948>

[72] [CITE@en[Remove registerContentHandler() and several friends]]
([[annevk]]著, [TIME[2017-09-14 20:16:09 +09:00]])
<https://github.com/whatwg/html/commit/b143dbc2d16f3473fcadee377d838070718549d3>

[29] [CITE@en[Use Web IDL's new-ish interface mixins concept]]
([[romandev]]著, [TIME[2017-12-21 05:39:18 +09:00]])
<https://github.com/whatwg/html/commit/c8867a179c21134021dc3435e98c1b9c4542d794>

[30] [CITE@en[Use interface mixins instead of '''['''NoInterfaceObject''']''']]
([[romandev]]著, [TIME[2017-12-23 21:08:31 +09:00]])
<https://github.com/whatwg/storage/commit/37030a22b727d3039d333334a0124cf21b96314b>

[31] [CITE@en[Update WebIDL definition(s) to use new mixin syntax · Issue #53 · whatwg/storage]]
([TIME[2017-12-24 12:40:41 +09:00]])
<https://github.com/whatwg/storage/issues/53>

[32] [CITE@en[Use `interface mixins` instead of `'''['''NoInterfaceObject''']'''` by romandev · Pull Request #54 · whatwg/storage]]
([TIME[2017-12-24 12:41:14 +09:00]])
<https://github.com/whatwg/storage/pull/54>

[33] [CITE@en[Replace NavigatorUserMedia mixin with partial interface.]]
([[jan-ivar]]著, [TIME[2018-03-08 14:52:25 +09:00]])
<https://github.com/w3c/mediacapture-main/commit/0128390a211094284d500558881ca574b0b1ffef>

[34] [CITE@en[Replace NavigatorUserMedia mixin with partial interface. by jan-ivar · Pull Request #509 · w3c/mediacapture-main]]
([TIME[2018-05-08 21:58:10 +09:00]])
<https://github.com/w3c/mediacapture-main/pull/509>

[35] [CITE@en[Introduce Navigator and WorkerNavigator partial interfaces (#53)]]
([[@marcoscaceres]]著, [TIME[2019-01-09 10:08:33 +09:00]])
<https://github.com/WICG/serial/commit/12f72a26effca9fc93fa47f087a61f924191007f>

[73] [CITE@en[Introduce Navigator and WorkerNavigator partial interfaces by reillyeon · Pull Request #53 · WICG/serial]]
([TIME[2019-06-01 11:42:04 +09:00]])
<https://github.com/WICG/serial/pull/53>

[74] [CITE@en[Update partial interface (mixin) NavigatorID]]
([[foolip]]著, [TIME[2019-01-21 23:49:37 +09:00]])
<https://github.com/whatwg/html/commit/c8f0426596ad6bba51cf3de411a127a52267ac77>

[75] [CITE@en[Update partial interface (mixin) NavigatorID by foolip · Pull Request #4309 · whatwg/html]]
([TIME[2019-06-18 15:22:51 +09:00]])
<https://github.com/whatwg/html/pull/4309>