* 仕様書

[REFS[
- [36] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#apis-for-creating-and-navigating-browsing-contexts-by-name:close-a-browsing-context>
- [22] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#close-a-browsing-context>
- [1] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2015-04-25 04:40:19 +09:00]] 版) <https://html.spec.whatwg.org/#a-browsing-context-is-discarded>
- [49] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2016-02-24 02:49:49 +09:00]] 版) <https://html.spec.whatwg.org/#killing-scripts>
]REFS]

* [CODE(DOMi)@en[Window]] インターフェイス [CODE(DOMm)@en[close]] メソッド

[37] [CODE(DOMi)@en[[[Window]]]] [[インターフェイス]]の
[DFN[[CODE(DOMm)@en[close][window.close]]]] [[メソッド]]は、
次のようにしなければ[SHOULD[なりません]] [SRC[>>36]]。

[FIG(steps)[
= [57] [VAR[現在]]を、[[文脈オブジェクト]]の[F[閲覧文脈]]に設定します。
= [73] [VAR[現在]]が [CODE[null]] か、
[VAR[現在]]の[F[閉じ中][is closing]]が[[真]]の場合、
== [74] ここで停止します。
= [39] 
[VAR[現在]]が [F[script-closable]] で、
[[現職設定群オブジェクト]]の[F[有責閲覧文脈]]が[VAR[現在]]に[[精通]]しており、
[[現職設定群オブジェクト]]の[F[有責閲覧文脈]]が[VAR[現在]]を
[[allowed to navigate]]
である場合、
== [38] [VAR[現在]]の[F[閉じ中][is closing]]を、
[[真]]に設定します。
== [40] 
[[タスクをキューに追加]]します。
[FIG(list members)[

: [VAR[[[タスク]]]] :
[FIG(steps)[

= [41] [VAR[現在]]を[[閉じます][閲覧文脈を閉じる]]。

]FIG]
: [VAR[[[タスク源]]]] :
[[DOM操作タスク源]]
]FIG]

]FIG]

[42] [[閲覧文脈]][VAR[閲覧文脈]]が [DFN[[F[script-closable]]]] であるとは、
次の条件の''いずれか''を満たすことをいいます [SRC[>>36]]。

[FIG(list)[
= [43] [VAR[閲覧文脈]]が[[補助閲覧文脈]]であり、[[利用者]]ではなく[[スクリプト]]が作成した
= [44] [VAR[閲覧文脈]]が[F[最上位閲覧文脈]]であり、[VAR[閲覧文脈]]の[F[セッション履歴]]に含まれる[[文書]]が1つだけである
]FIG]

;; [65] 1つ目の条件は、[[閲覧文脈の選択]] (やその他の方法での[[閲覧文脈の作成]])
で新しい[[閲覧文脈]]が作成された時に[VAR[閲覧文脈]]のフラグとして保存することになります。

;; [45] 複数の[[セッション履歴エントリー]]が同じ[[文書]]と関連付けられることがありますから
([[素片識別子へのnavigate]]や[CODE(DOMm)@en[pushState]])、
2つ目の条件と[[セッション履歴エントリー]]の個数は関係ありません。

;; [64] [[入れ子閲覧文脈]]はどちらの条件も満たすことがなく、
[CODE(JS)@en[window.close]] により閉じられることはありません。

;; [61] これは [CODE(JS)@en[window.close]] からのみ参照されています。


[60] [[窓]]を[[閉じる][閲覧文脈を閉じる]]というある種特殊な動作で
[[Webブラウザー]]の実装上の都合や[[利用者]]の体験への配慮を重視してか、
[CODE(JS)@en[window.close]] の挙動は
[MUST[MUST]] ではなく [SHOULD[SHOULD]] となっています。

[EG[
[62] [[アプリ内ブラウザー]]が[[最上位閲覧文脈]]を閉じるかどうかの判断には、
通常とは異なる[[アプリ]]依存の要素が考慮されるかもしれません。
]EG]

-*-*-

[54] [[Chrome]] では、「[[スクリプト]]が作成した」かどうかの検査は行われないようです。
[CODE(HTML)@en[<[[a]] [[href]] [[target]]=newwindow>]] の[[クリック]]は、
[[スクリプト]]によるものであれ、[[利用者]]によるものであれ、
[CODE(JS)@en[window.close]] 可能な[[窓][窓 (Web)]]になります。
([[文脈メニュー]]から新しい[[窓]]を開いた場合には、 [CODE(JS)@en[window.close]]
で閉じられません。)
[TIME[2016-09-13T02:52:41.200Z]]

[63] [[IE]] は[[利用者]]に[[窓][窓 (Web)]]を閉じるか確認する[[モーダルダイアログ]]を表示することがあります。

* [CODE(DOMi)@en[Window]] インターフェイス [CODE(DOMa)@en[closed]] 属性

[46] [CODE(DOMi)@en[[[Window]]]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[[[closed]]]]]] [[IDL属性]]は、
[[閲覧文脈]]が捨てられたかどうかを表します。

[47] [[取得器]]は、次のようにしなければ[MUST[なりません]] [SRC[>>36]]。

[FIG(steps)[
= [66] [[文脈オブジェクト]]の[F[閲覧文脈]]が [CODE[null]] の場合、
== [70] [[偽]]を返します。
= [71] それ以外の場合、
== [72] [[文脈オブジェクト]]の[F[閲覧文脈]]の[F[閉じ中][is closing]]を返します。
]FIG]

[67] [[閲覧文脈]]は、
[DFN[[F[[RUBYB[閉じ中][is closing]]][is closing]]]]
を持ちます。初期値は[[偽]]です。
[SRC[[CITE[HTML Standard]]]]

[11] 他に、[[文書の[F[閲覧文脈]]]]から参照されます。

* 閉じる

[23] [DFN[[RUBYB[閲覧文脈を閉じる]@en[close a browsing context]]]]時は、
[VAR[閲覧文脈]]を次のようにしなければ[MUST[なりません]]。

[FIG(steps)[
= [50] [VAR[閲覧文脈]]の[F[スクリプトを無効]]にしても[MAY[構いません]] [SRC[>>49]]。
-- [[スクリプトが無効]]、[[走っているスクリプトの実行中断]]も参照。
= [24] [VAR[結果]]を、 [VAR[閲覧文脈]]の[F[活性文書]]を [[prompt to unload a document]] 
した結果に設定します [SRC[>>22]]。
= [25] [VAR[結果]]が [[refused to allow the document to be unloaded]] なら、
== [68] ここで停止します [SRC[>>22]]。
= [26] [VAR[閲覧文脈]]の[F[活性文書]]を [[unload a document]] します。
[SRC[>>22]]
= [27] [[利用者インターフェイス]]から[VAR[閲覧文脈]]を削除します [SRC[>>22]]。
=- 例えば[[タブ]]を閉じるなどします [SRC[>>22]]。
= [28] [VAR[閲覧文脈]]を[[捨てます][閲覧文脈を捨てる]] [SRC[>>22]]。
]FIG]

[55] いずれかのタイミングで[[文書]]が[[活性文書]]でなくなるか、
[[窓][窓 (Web)]]が[F[プラットフォームの焦点を持つ]]状態ではなくなり、
[[固定状態]]であっても解除されると思われます。

-*-*-

[29] [[利用者エージェント]]は、[[利用者]]に[[最上位閲覧文脈]]を[[閉じる][閲覧文脈を閉じる]]機能を提供する[SHOULD[べきです]] [SRC[>>22]]。

[EG[
[30] 通常の [[Webブラウザー]]には、「[[Webブラウザー]]の終了」や
「[[タブ]]を閉じる」の機能があります。
[[Webブラウザー]]自体が[[メニュー]]や[[ボタン]]として実装している場合もあれば、
[[プラットフォーム]]を通じた終了の指示 (例えば[[タスクバー]]の[[メニュー]]からの選択)
を [[Webブラウザー]]が受け取る形で実装されている場合もあります。
]EG]

;; [14] [[埋め込みブラウザー]]の場合、
通常の [[Webブラウザー]]とは異なり[[利用者]]の指示で閉じる機能は用意されていなかったり、
[[Webブラウザー]]を使った機能から [[Webブラウザー]]を使わない機能への遷移という形で実装されていたりするかもしれません。

;; [31] 他に、[[閲覧文脈を捨てる]]機能 (>>3) も提供されるかもしれません。

[34] その他に、 [CODE(JS)@en[window.close]] から呼ばれます。

;; [[入れ子閲覧文脈]]について呼ばれることはありません。

[35] [[ブラウザー拡張]]、[[WebDriver]]、その他の [[Webブラウザー]]依存の [[API]]
によって呼び出される場合もあります。

* 捨てる

[2] [DFN[[RUBYB[閲覧文脈が捨てられる]@en[discard a browsing context]]]]時は、
[VAR[閲覧文脈]]を次のようにしなければ[['''なりません''']]。

[FIG(steps)[
= [7] [[利用者エージェント]]から[VAR[閲覧文脈]]への[[強い参照]]があれば、破棄します [SRC[>>1]]。
= [8] [VAR[閲覧文脈]]の[F[セッション履歴]]の全[[セッション履歴エントリー]][VAR[エントリー]]について、
== [9] [VAR[エントリー]]の[F[文書]]について、[[文書を捨てる]]処理を実行します [SRC[>>1]]。
= [10] [VAR[閲覧文脈]]の[F[捨てられた]]を、[[真]]に設定します。
]FIG]

[12] なお、[VAR[閲覧文脈]]が[[捨て][閲覧文脈を捨てる]]られた後も、
[F[閲覧文脈]]が[VAR[閲覧文脈]]の [CODE(DOMi)@en[WindowProxy]]
への参照はどこかに残っているかもしれません。

-*-*-

[6] [[閲覧文脈を捨てる]]処理は、次の場面で呼び出されます。

[FIG(short list)[
- [CODE(HTMLe)@en[iframe]] [[要素]]を[[文書から削除]]
- [CODE(HTMLe)@en[frame]] [[要素]]を[[文書から削除]]
- [CODE(HTMLe)@en[object]] [[要素]]
- [[文書を捨てる]]
- [[閲覧文脈を閉じる]]
]FIG]

[5] [[入れ子閲覧文脈]]は、 [CODE(DOMi)@en[[[WindowProxy]]]]
が[[ごみ収集]]の対象となった時、捨てなければ[['''なりません''']] [SRC[>>1]]。

;; [33] [[閲覧文脈]]が捨てられるのは、いずれも[[閲覧文脈]]が[[レンダリング]]されなくなった後です。
(>>3 の[[利用者エージェント]]が“いつでも”捨てられるのは例外ですが、
普通は[[レンダリング]]された状態のまま捨てることは無いはずです。)

[3] [[利用者エージェント]]は、いつでも (特に[[利用者]]の指示があった場合には)
[[最上位閲覧文脈]]を捨てて構いません [SRC[>>1]]。

[EG[
[4] 例えば[[利用者]]が1つ[[以上]]の[[最上位閲覧文脈]]を持つ[[窓]]を強制的に閉じた場合が該当します
[SRC[>>1]]。
]EG]

;; [32] [[閲覧文脈を閉じる]]機能 (>>29) も提供されるかもしれません。
通常終了はそちらの方が適切と考えられます。

* 中断

[75] [[プラットフォーム]] ([[OS]]) や[[Webブラウザー]]の仕様により、
他の[[アプリ]]への切り替えやスリープ状態などで中断されることがあります。
[SEE[ [[スクリプトの中断]] ]]

* 歴史

[48] [CODE(JS)@en[[[window.close]]]] はかつてはどんな[[窓]]でも閉じられた気がしますが、
乱用を防ぐために[[スクリプト]]が開いた[[最上位閲覧文脈]]しか閉じられないようになりました。

[19] [CITE@en[Web Applications 1.0 r7127     Make it ok to window.close() a browsing context that has never been (re)navigated.]]
( ([TIME[2012-06-09 06:50:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7126&to=7127>

[20] [CITE[''''''[''''''whatwg'''''']'''''' window.close() and user-initiated <a target=_blank>]]
( ([TIME[2012-06-09 07:22:28 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2012-June/036333.html>

[15] [CITE@en[Web Applications 1.0 r7393     Better define window.close() and how to close tabs.]]
( ([TIME[2012-09-24 08:25:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7392&to=7393>

[18] [CITE@en[Web Applications 1.0 r7977     Define window.close; update the list of members exposed cross-origin on Window to match reality]]
( ([TIME[2013-06-15 03:28:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7976&to=7977>

[16] [CITE@en[Web Applications 1.0 r7984     Sandboxing: prevent pages from closing their top-level browsing context (unless they can navigate it, in which case, whatever)]]
( ([TIME[2013-06-18 09:24:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7983&to=7984>

[21] [CITE@en[Web Applications 1.0 r8047     Change how window.close() decides what you can close to make more sense.]]
( ([TIME[2013-07-10 07:45:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8046&to=8047>

[17] [CITE@en[Web Applications 1.0 r8622 Doesn't make much sense to window.close() an iframe...]]
( ([TIME[2014-05-09 05:44:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8621&to=8622>

[51] [CITE@en[document handling: error on serialising window of discarded browsing …]]
([[andreastt]]著, [TIME[2016-07-19 23:48:04 +09:00]])
<https://github.com/w3c/webdriver/commit/5f1fbbb03e2b7b2458ee5da88b4f3dc32be06bd6>

[52] [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>

[13] [CITE@en[Editorial: cleanup close a browsing context and prompt to unload]]
([[annevk]]著, [TIME[2017-05-10 20:47:29 +09:00]])
<https://github.com/whatwg/html/commit/b714a7bc124bf0e8828b2adc2aa0b672d96a1dbd>

[53] [CITE@en[document.open() simplifications, part 1]]
([[TimothyGu]]著, [TIME[2018-08-17 07:20:44 +09:00]])
<https://github.com/whatwg/html/commit/6f769b8089a843066aa19f5991405bf4c84458b3>

[69] [CITE@en[Fix Window's close(d) members]]
([[annevk]]著, [TIME[2019-03-08 00:47:50 +09:00]])
<https://github.com/whatwg/html/commit/37b1ce5ed31725fa7b3c64e27e3cc10aa15a791f>

[56] [CITE@en[Behavior of window.close() · Issue #4405 · whatwg/html]]
([TIME[2019-07-29 20:44:32 +09:00]])
<https://github.com/whatwg/html/issues/4405>

[58] [CITE@en[Clarify Window object's close(), closed, et al · Issue #4363 · whatwg/html]]
([TIME[2019-07-29 20:45:24 +09:00]])
<https://github.com/whatwg/html/issues/4363>

[59] [CITE@en[Cleanup Window's close(d) members by annevk · Pull Request #4402 · whatwg/html]]
([TIME[2019-07-29 20:46:31 +09:00]])
<https://github.com/whatwg/html/pull/4402>