[30] [DFN[[RUBY[閲覧文脈][えつらんぶんみゃく]@en[browsing context]]]]は、
[[Webブラウザー]]における[[窓]]や[[タブ]]、[[フレーム]]に相当する内部オブジェクトです。

;; [31] [[JavaScript]] からは [CODE(DOMi)@en[Window]] [[オブジェクト]]のように見えますが、
厳密には異なります。

* 仕様書

[REFS[
- [2] [[HTML Standard]]
-- [3] '''[CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-03-31 07:16:44 +09:00]] 版) <https://html.spec.whatwg.org/#browsing-context>'''
-- [40] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#garbage-collection-and-browsing-contexts>
-- [22] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-10 21:36:05 +09:00]] 版) <https://html.spec.whatwg.org/#concept-document-bc>
-- [45] [CITE@en-US-x-hixie[HTML Standard]], [TIME[2021-04-12T15:12:42.000Z]], [TIME[2021-04-13T09:41:29.832Z]] <https://html.spec.whatwg.org/#determining-the-origin>
]REFS]

* 意味

[1] [DFN[[RUBY[閲覧文脈][えつらんぶんみゃく]@en[browsing context]]]]は、そこに於いて [CODE(DOMi)@en[[[Document]]]] [[オブジェクト]]が[[利用者]]に[RUBYB[提示される]@en[presented]][RUBYB[[[環境]]]@en[environment]]です
[SRC[WA1 >>3]]。

;; [7] [[閲覧文脈]]とは要は[[Webブラウザー]]の[[タブ]]であったり [CODE(HTMLe)@en[[[iframe]]]]
[[要素]]であったりと、[WEAK[([[文書]]の側からすると)]] 
[CODE(JS)@en[[[window]]]] [[オブジェクト]]によって表されるものなのですが、
実際にはこの周辺の仕組みは極めて複雑なためにまどろっこしい定義になっています。

[EG[
[4] [[Webブラウザー]]の[[窓]]や[[タブ]]は通常[[閲覧文脈]]を1つ含んでいます。

[5] [CODE(HTMLe)@en[[[iframe]]]] [[要素]]や [CODE(HTMLe)@en[[[frame]]]] [[要素]]は[[閲覧文脈]]を作ります。

[6] [CODE(HTMLe)@en[[[object]]]] [[要素]]はその[RUBYB[[[表す]]]@en[represent]]内容によっては[[閲覧文脈]]を作ります。

[HISTORY[
[15] [[ウィジェット実現値]]は[[閲覧文脈]]です。
]HISTORY]
]EG]

* 状態

[20] [[閲覧文脈]]は、次の状態を持ちます。

[FIG(list members)[

: [F[[[子供閲覧文脈]]である]] / [F[[[最上位閲覧文脈]]である]] :
[[子供閲覧文脈]]か[[最上位閲覧文脈]]か。
作成時にどちらかちょうど1つだけが[[真]]となり、変化することはありません。
:[[補助閲覧文脈]]か:[[補助閲覧文脈]]かどうか。作成時に決まり、変化することはありません。
:[[二次的閲覧文脈]]か:[[二次的閲覧文脈]]かどうか。作成時に決まり、変化することはありません。
:[CODE(DOMi)@en[[[WindowProxy]]]]:>>10
:[CODE(DOMi)@en[[[Window]]]]:[[大域オブジェクト]]です。
:[[セッション履歴]]:本[[閲覧文脈]]で表示した[[文書]]と付随する状態のリスト。
: [F[作成子閲覧文脈]] : 作成の責を負った[[閲覧文脈]] [SRC[>>3]]。
: [F[作成子URL]] : 作成元の[[文書の番地]]。
: [F[作成子起源]] : 作成元の[[文書の起源]]。
: [F[作成子基底URL]] : 作成元の[[文書基底URL]]。
: [F[作成子文脈セキュリティー]] :
:[F[包含子][閲覧文脈包含子]]:
:[[親閲覧文脈]]:
:[[最上位閲覧文脈]]:[[親閲覧文脈]]をそれ以上辿れない[[閲覧文脈]]です。
:[F[[[opener閲覧文脈]]]]の逆関係の[[閲覧文脈]]群:
[[直接到達可能閲覧文脈]]かどうかの判定のために[[opener閲覧文脈]]の逆方向の[[閲覧文脈]]かどうか決定できる必要があります。
:[[script-closable]]:[CODE(JS)@en[[[window.close]]]] が機能する条件です。
: [F[is closing]] :
:[[閲覧文脈名]]:
:[[活性文書]]:[[現在エントリー]]の[[文書]]です。
:[[関連する類似起源閲覧文脈の単位]]:所属する[[関連する類似起源閲覧文脈の単位]]です。
[[活性文書]]が変化すると、変化するかもしれません。
:[[イベントループ]]:[[関連する類似起源閲覧文脈の単位]]の[[イベントループ]]です。
:[[画布]]:
:[[閲覧領域]]:
:[[非保安要求ポリシー]]: [CODE(URI)@en[[[http:]]]] → [CODE(URI)@en[[[https:]]]]
の [[URL]] 書き換えを行うか否か。
:[[非保安navigate格上げ集合]]: [[navigate]] 時に
[CODE(URI)@en[[[http:]]]] → [CODE(URI)@en[[[https:]]]] の [[URL]] 書き換えを行うか否か。
: [F[one permitted sandboxed navigator]] :
: [F[レンダリング機会]] :
: [F[厳密混合内容検査フラグ]] :

[HISTORY[
: [F[[[作成子[CODE(DOMi)@en[Document]]]]]] :
作成時点での[[作成子閲覧文脈]]の[[活性文書]] (あれば)
[SRC[>>3]]。
: [F[作成子参照元ポリシー]] : 作成元の[[文書]]の[F[参照元ポリシー]]。
]HISTORY]
]FIG]

[29] [[最上位閲覧文脈]]は、加えて次の状態を持ちます。
[FIG(list members)[
: [F[窓][窓 (Web)]] : 本[[最上位閲覧文脈]]が表示されている[[窓][窓 (Web)]]です。
:[[popup sandboxing flag set]]:
:[[セッション履歴探索キュー]]:[[セッション履歴]]上の移動の処理を扱う[[タスクキュー]]です。
:[[セッション履歴イベントループ]]:[[セッション履歴探索キュー]]を処理するものとして[[並列に]]実行されるものです。
:[[結合セッション履歴]]:[[セッション履歴]]と[[入れ子閲覧文脈]]の[[セッション履歴]]を結合したものです。
:[[セッションストレージ領域]]群:
[[セッションストレージ領域]]は、 [CODE(DOMm)@en[[[sessionStorage]]]] で使われます。
[[起源]]ごとに存在します。
]FIG]

[25] [[子供閲覧文脈]]は、加えて次の状態を持ちます。

[FIG(list members)[
: [F[閲覧文脈包含子]] :[[入れ子閲覧文脈]]を作成した[[要素]]に関連付けられます。
:[[delaying [CODE(DOMe)@en[load]] events mode]]:[[delay the load event]] の適用対象になっているかどうかのフラグ。
:[[[CODE(HTMLe)@en[iframe]] sandboxing flag set]]:
[CODE(HTMLe)@en[[[iframe]]]] [[要素]]の[[属性]]から得られた [[sandboxing flag set]]。

[HISTORY[
:[F[[[seamless browsing context flag]]]]:
]HISTORY]
]FIG]

[27] [[補助閲覧文脈]]は、加えて次の状態を持ちます。
[FIG(list members)[
:[F[[[opener閲覧文脈]]]]: 本[[閲覧文脈]]を開いた元の[[閲覧文脈]]。
:スクリプトにより作成されかどうか:[[script-closable]] かどうかの決定で参照されます。
]FIG]

* 閲覧文脈同士の関係

[FIG(short list)[
- [[親閲覧文脈]]
- [[子閲覧文脈]]
- [[祖先閲覧文脈]]
- [[最上位閲覧文脈]]
- [[入れ子閲覧文脈]]
- [[familiar with]]
- [[allowed to navigate]]
- [[直接到達可能閲覧文脈群]]
]FIG]

[16] [[閲覧文脈]]群には次のようなグループ化の単位があります。
[FIG(short list)[
- [[関連する類似起源閲覧文脈の単位]]
- [[関連閲覧文脈の単位]]
]FIG]

[26] [[閲覧文脈]]を介した[[文書]]との関係

[FIG(short list)[
- [[nested through]]
- [[文書族]]
]FIG]

[28] [[閲覧文脈]]は使われ方により次のように分類されます (次のリストの各項目は、
互いに排他的とは限りません)。
[FIG(list short)[
- [[最上位閲覧文脈]]
- [[入れ子閲覧文脈]]
- [[auxiliary browsing context]]
- [[secondary browsing context]]
]FIG]

* 文書との関係

[21] [DFN[[RUBYB[[CODE(DOMi)@en[Document]]の[F[閲覧文脈]]]@en[[CODE(DOMi)@en[Document]]'s [F[browsing context]]]]]]は、
[F[[[セッション履歴]]]]に当該 [CODE(DOMi)@en[[[Document]]]] を含むような[[閲覧文脈]]であって、
その[F[捨てられた][閲覧文脈を捨てる]]が[[偽]]であるもの (あれば)
です [SRC[>>22]]。
[CODE(JS)@en[document.defaultView]] に相当します。

[37] [[文書]]の[F[閲覧文脈]]があることを、「[[閲覧文脈]][RUBYB[中にある]@en[in]]」
などといいます。 [[navigate]] で作られた[[文書]]など[[閲覧文脈]]中にある[[文書]]もあれば、
[[XHR]] で作られた[[文書]]など[[閲覧文脈]]を持たない[[文書]]もあります。

[38] [[閲覧文脈]]に現在表示中の[[文書]]のことを[F[活性文書]]といいます。
[CODE(JS)@en[window.document]] に相当します。

[23] [[セッション履歴]]、[[セッション履歴エントリー]]も参照。

* 窓との関係

[10] [[閲覧文脈]]には、それに対応する [CODE(DOMi)@en[[[WindowProxy]]]]
[[オブジェクト]]が1つあります。 [SRC[>>3]]
[[閲覧文脈]]は、 [CODE(DOMi)@en[[[WindowProxy]]]] への[[強い参照]]を持ちます [SRC[>>40]]。

[11] それに対して[[閲覧文脈]]で提示される [CODE(DOMi)@en[[[Document]]]]
[[オブジェクト]]には、''それぞれ''対応する [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]が1つずつあります。[SRC[>>3]]

;; [32] なお [CODE(DOMi)@en[[[Window]]]] は [[JavaScript]] [[大域オブジェクト]]です。

[63] [CODE(DOMi)@en[[[WindowProxy]]]] はその名の通り「[RUBYB[[[串]]]@en[proxy]]」であり、
すべてをその[[閲覧文脈]]の[[活性文書]]の [CODE(DOMi)@en[[[Window]]]]
[[オブジェクト]]に転送します。 [SRC[>>3]]

[35] 仕様上 [CODE(DOMi)@en[[[WindowProxy]]]] と[[閲覧文脈]]は別のオブジェクトとして規定されていますが、
[[閲覧文脈]]は仕様書上にのみ登場する内部オブジェクトで、[[JavaScript]]
からはアクセスできませんから、どう実装されるかは
[[Webブラウザー]]によります。両者は常に一対一対応していますから、
実質的に同じオブジェクトとみなすこともできます。

-*-*-

[46] 
[DFN[[RUBYB[[RUBY[起源][きげん]]を[RUBY[決定][けってい]]][determine the origin]]]]するには、
[VAR[[[閲覧文脈]]]]、
[VAR[[[URL]]]]、
[VAR[[[砂箱化フラグ集合]]]]、
[VAR[呼び出し起源]]、
[VAR[活性文書navigate起源]]を、
次のようにします。
[SRC[>>45]]

[FIG(steps)[
= [47] 
[VAR[砂箱化フラグ集合]]の[F[砂箱化起源閲覧文脈フラグ]]が[[真]]の場合、
== [48] 
新しい[[不透明起源]]を返します。
= [49] 
それ以外で、
[VAR[[[URL]]]]
が
[CODE[null]]
の場合、
== [50] 
新しい[[不透明起源]]を返します。
= [51] 
それ以外で、
[VAR[活性文書navigate起源]]が [CODE[null]] で''なく''、
[VAR[URL]]
の[F[scheme][URL scheme]]
が
[CODE[javascript][javascript:]]
の場合、
== [52] 
[VAR[活性文書navigate起源]]を返します。
= [53] 
それ以外で、
[VAR[呼び出し起源]]が
[CODE[null]]
で''なく''、
[VAR[URL]]
が
[CODE[about:blank]]
の場合、
== [54] 
[VAR[呼び出し起源]]を返します。
= [55] 
それ以外で、
[VAR[URL]]
が
[CODE[about:srcdoc]]
の場合、
== [56] 
[VAR[閲覧文脈]]の[F[包含子文書]]の[F[起源][文書の起源]]を返します。
= [57] 
それ以外の場合、
== [58] 
[VAR[URL]]
の[F[起源][URLの起源]]を返します。
]FIG]

;; [66] 
新しい[[起源]]を返す場合と、既に存在する[[起源]]を返す場合があることに注意。
同じ[[起源]]を共通する場合、 [CODE[document.domain]]
の設定の影響がその両方に適用されることになります。

[61] [[新しい閲覧文脈を作成]]する手順群と
[[navigate]] の[[文書オブジェクトの作成と初期化]]から呼び出されます。

[HISTORY[
[60] この[[手順群]]は[TIME[令和元(2019)年][2019]]の改訂で独立した手順群となりました。
それ以前はいろいろなところで分散して規定されていました。

[62] 
[[navigate]] 時についてまとめると次の通りでした。

[268] [[文書の[F[起源]]]][DEL[と[[実効スクリプト起源]]]]は、次のように決定しなければ[MUST[なりません]]。

[FIG(steps)[
= [390] [VAR[応答]]が[[ネットワークエラー]]の場合など、
[[navigate応答の処理]]で[[非文書表示]]とされた場合、
== [448] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、新しい[[不透明起源]]に設定します
[SRC[>>12]]。
= [256] それ以外で、[VAR[新しい[[文書]]]]の[F[活性砂箱化フラグ集合]]の[F[砂箱化起源閲覧文脈フラグ]]が設定されていれば、 [SRC[>>244]]
== [257] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、新しい[[不透明起源]]に設定します。
= [119] それ以外で、[VAR[新しい[[文書]]]]の[F[文書の番地]]の[F[scheme][URL scheme]]が
[[network scheme]] なら、[SRC[>>244]]
== [247] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、[VAR[新しい[[文書]]]]の[F[番地][文書の番地]]の[F[起源][URLの起源]]の複製に設定します。
= [255] それ以外で、
[VAR[新しい[[文書]]]]の[F[文書の番地]]が [CODE(URI)@en[about:blank]] なら、[SRC[>>244]]
== [259] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、[VAR[文書の起源]]に設定します。
= [260] それ以外で、[VAR[新しい[[資源]]]]の [F[URL]] ([[リダイレクト]]前の最初のもの)
があってその [F[scheme][URL scheme]] が [CODE(URI)@en[javascript][javascript:]] なら、
[SRC[>>244]]
== [261] [VAR[新しい[[文書]]]]の[F[起源][文書の起源]]を、[VAR[文書の起源]]に設定します。
= [262] それ以外で、 [VAR[[[[CODE(HTMLa)@en[iframe]] [CODE(HTMLa)@en[srcdoc]]文書]]]]なら、
[SRC[>>244]]
== [263] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、
[VAR[[[navigate]] する[[閲覧文脈]]]]の[F[閲覧文脈包含子]]の[F[節点文書]]の[F[起源][文書の起源]]に設定します。
= [264] それ以外なら、 [SRC[>>244, >>266]]
== [265] [VAR[新しい[[文書]]]]の[F[文書の起源]]を、新しい[[不透明起源]]に設定します。
]FIG]

[REFS[
- [244] [CITE[HTML Standard]] の[[起源]]の規定 (当時)
- [12] [CITE[HTML Standard]] の [[navigate]] の規定 (当時)
- [266] [CITE[DOM Standard]] の[[文書]]の規定
]REFS]

;; [334] [[HTML Standard]] は [CODE(URI)@en[about:blank]] への [[navigate]] をすべて >>255
としていますが、[[著者]]以外が [[URL]] を与えた場合 ([[アドレスバー]]や[[お気に入り]]からの選択の場合など)
は >>264 が適用されると思われます。

;; [333] [[初期[CODE(URI)@en[about:blank]]文書]]は [[navigate]] で作成される[[文書]]ではなく、
[[閲覧文脈の作成]]で作成される[[文書]]です。[[起源]]は[[初期[CODE(URI)@en[about:blank]]文書]]を参照。



]HISTORY]

;; [327] [CODE(URI)@en[view-source:]] は >>264 より[[不透明起源]]となります。

;; [328] [CODE(URI)@en[chrome:]] や [CODE(URI)@en[chrome-extension:]]
やその他の [CODE(URI)@en[about:]] のような[[Webブラウザー]]固有の [[URL]]
や[[ブラウザー拡張]]の [[URL]] への [[navigate]]
では、[[Webブラウザー]]依存の方法で決めた[[起源]]に設定すると思われます。
[[Webブラウザー]]依存の[[起源]]については現在の仕様上は扱いが明確になっていません。

* 作成

[8] [[閲覧文脈の作成]]を参照。

* 破棄

[39] [[閲覧文脈]]を破棄する処理はいくつかあります。
[FIG(list)[
- [CODE(JS)@en[[[window.close]]]]
- [[閲覧文脈を閉じる]]
- [[閲覧文脈を捨てる]]
]FIG]

* レンダリング

[9] [[レンダリングの更新]]を参照。

* 歴史

[33] [[Netscape]] 2 により [[JavaScript]] と[[フレーム]]が導入されました。
現在の[[閲覧文脈]]に相当するものはこの時に登場したことになります。

[34] [[閲覧文脈]]という用語が登場しその性質と挙動が初めて明確に規定されたのは、
その10年後の [[Web Applications 1.0]] (現 [[HTML Standard]]) でした。

[13] [CITE[''''''[''''''whatwg'''''']'''''' Should events be paused on detached iframes?]]
( ([TIME[2010-12-07 21:22:35 +09:00]] 版))
<http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2010-December/029346.html>

[14] [CITE@en-US[Window Object 1.0]]
( ([TIME[2006-04-08 02:19:28 +09:00]] 版))
<http://www.w3.org/TR/Window/#dfn-browsing-context>

[17] [CITE@en[Web Applications 1.0 r8776     Try to fix the logic around opening new tabs because the user said so, even in sandboxed environments]]
( ([TIME[2014-09-17 05:32:00 +09:00]] 版))
<https://html5.org/r/8776>

[18] [CITE@en[MIX: Drop "JavaScript Global Environment". · 5d32821 · w3c/webappsec]]
( ([TIME[2014-10-21 09:48:34 +09:00]] 版))
<https://github.com/w3c/webappsec/commit/5d32821b21f3cb06a651c966f729b3044292a08a>

[19] [CITE@en[Web Applications 1.0 r8882 Add hyperlinks for creating browsing contexts.]]
( ([TIME[2015-01-16 08:39:00 +09:00]] 版))
<https://html5.org/r/8882>

[24] [CITE@en[Clarify the definition of window.frameElement · whatwg/html@a398377]]
([TIME[2016-02-10 23:01:26 +09:00]] 版)
<https://github.com/whatwg/html/commit/a398377bbc8483e27c4fc478a097ef72f3057593>

[36] [CITE@en[Use new "document's browsing context" concept everywhere · whatwg/html@6fe2ac7]]
([TIME[2016-02-11 11:40:38 +09:00]] 版)
<https://github.com/whatwg/html/commit/6fe2ac75f7ab63b98fe1637129f0a8574a542e55>

[41] [CITE@en[Remove the concept of creator Document so we don't leak a document · whatwg/html@a996f3b]]
([TIME[2016-04-06 17:35:12 +09:00]] 版)
<https://github.com/whatwg/html/commit/a996f3b4982f20697f71a23c919567a638519959>

[42] [CITE@en[Be more precise about nested and discarded browsing contexts]]
([[domenic]]著, [TIME[2016-07-20 22:58:49 +09:00]])
<https://github.com/whatwg/html/commit/39118df640ad4a3f03f164fb5ffe0a56316297be>

[43] [CITE@en[Set the top-level browser context to use for a session. (#929)]]
([[shs96c]]著, [TIME[2017-06-05 20:40:50 +09:00]])
<https://github.com/w3c/webdriver/commit/70a3387eaa8021027c5ae543ae9d2c3df167a913>

[44] [CITE@en[540988 - ☂ Speed up discarded tab restoration - chromium - Monorail]]
([TIME[2018-04-03 23:40:33 +09:00]])
<https://bugs.chromium.org/p/chromium/issues/detail?id=540988>

[59] [CITE@en[Refactor the navigation algorithm]]
([[dtapuska]], [TIME[2019-07-12 00:49:55 +09:00]], [TIME[2021-07-01T09:37:14.000Z]])
<https://github.com/whatwg/html/commit/061e782437c6cff600f18bc96c1a11489e09c3ab>

[64] [CITE@en[Refactor navigation algorithm. by dtapuska · Pull Request #4664 · whatwg/html]]
([TIME[2021-07-02T08:22:28.000Z]])
<https://github.com/whatwg/html/pull/4664>

[65] [CITE@en[Clarify creator origin reuse]]
([[annevk]], [TIME[2019-11-27 02:30:30 +09:00]], [TIME[2022-01-18T08:26:16.000Z]])
<https://github.com/whatwg/html/commit/c6463cb8954f3befdc16317d40d431857d3a27cd>

[67] [CITE@en[Alias or clone creator origin of a newly created browsing context · Issue #4126 · whatwg/html]]
([TIME[2022-01-18T08:27:52.000Z]])
<https://github.com/whatwg/html/issues/4126>

[68] [CITE@en[Clarify creator origin reuse by annevk · Pull Request #5108 · whatwg/html]]
([TIME[2022-01-18T08:30:53.000Z]])
<https://github.com/whatwg/html/pull/5108>

[69] [CITE@en[Editorial: nested browsing context is a member, not a type]]
([[annevk]], [TIME[2019-11-27 02:46:03 +09:00]], [TIME[2022-01-18T09:08:52.000Z]])
<https://github.com/whatwg/html/commit/6b737bbc428facf34ec3728c0912cf9e172d0ea4>