* 仕様書
[REFS[
- [2] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
- [6] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
- [9] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
- [11] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
- [20] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
- [24] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
- [22] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
- [25] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-11-16 20:26:18 +09:00]] 版)
]REFS]
* 暗示強参照
[3] 既存の[[オブジェクト]]を返す[[IDL属性]]からは、その[[オブジェクト]]への[DFN[[RUBYB[[[暗示強参照]]]@en[implied strong reference]]]]があります。
[SRC[>>2]]
[EG[
[4] 例えば [CODE(JS)@en[[[document]].[[location]]]] [[属性]]は [CODE(DOMi)@en[[[Location]]]]
[[オブジェクト]]を持っているので、これはすなわち、当該 [CODE(DOMi)@en[[[Document]]]]
[[オブジェクト]] [WEAK[(の [CODE(DOMa)@en[[[location]]]] [[属性]])]] から [CODE(DOMi)@en[[[Location]]]]
[[オブジェクト]]への[[強参照]]があることになります。
]EG]
[EG[
[5] [CODE(DOMi)@en[[[Document]]]] からその[[子孫節点]]へは [WEAK[([CODE(DOMa)@en[[[childNodes]]]] [[属性]]などを通じて)]]
[[強参照]]があり、また各[[節点]]から [CODE(DOMi)@en[[[Document]]]] へは
[WEAK[([CODE(DOMa)@en[[[ownerDocument]]]] [[属性]]などを通じて)]] [[強参照]]があります。
]EG]
* 閲覧文脈
[13] [[利用者エージェント]]は[[最上位閲覧文脈]]に対して[[強参照]]を持っています。 [SRC[>>11]]
;; [18] [[利用者エージェント]]から[[閲覧文脈]]への[[強参照]]は[[閲覧文脈を捨てる]][[算法]]で削除されます。
[12] [[閲覧文脈]]は、その [CODE(DOMi)@en[[[Document]]]] 群とその [CODE(DOMi)@en[[[WindowProxy]]]]
に対して[[強参照]]を持っています。 [SRC[>>11]]
;; [17] [[閲覧文脈]]から [CODE(DOMi)@en[[[Document]]]] への[[参照]]は[[[CODE(DOMi)@en[Document]]を捨てる]][[算法]]で削除されます。
[14] [CODE(DOMi)@en[[[Document]]]] はその [CODE(DOMi)@en[[[Window]]]] に対して[[強参照]]を持っています。逆に
[CODE(DOMi)@en[[[Window]]]] は [CODE(DOMa)@en[[[document]]]] [[属性]]を通じて[[暗示強参照]]を持っています。 [SRC[>>11]]
[15] [CODE(DOMi)@en[[[Window]]]] は [CODE(DOMi)@en[[[window]]]] など、
[CODE(DOMi)@en[[[Document]]]] は [CODE(DOMi)@en[[[defaultView]]]] などを通じて
[CODE(DOMi)@en[[[WindowProxy]]]] への[[暗示強参照]]を持っています。 [SRC[>>11]]
[16] [[スクリプト]]はその[[閲覧文脈]]と[[文書]]に対して[[強参照]]を持っています。 [SRC[>>11]]
[19] [[最上位閲覧文脈]]でない[[閲覧文脈]]の [CODE(DOMi)@en[[[WindowProxy]]]] が[[ごみ収集]]の対象になると、
当該[[閲覧文脈]]は[[閲覧文脈を捨てる]][[算法]]により処理されなければなりません。 [SRC[>>11]]
* 媒体要素
[7] [[媒体要素]]は、それに対するすべての[[参照]]が削除されただけの理由で[RUBYB[[[再生]]]@en[playing]]を停止しては[['''なりません''']]。
それ以上[RUBYB[[[音声]]]@en[audio]]を再生できない状態になった時、当該[[媒体要素]]は[[ごみ収集]]して[['''構いません''']]。
[SRC[>>6]]
[8] [[要素]]に対して明示的に[[参照]]が存在しておらず、まだ[RUBYB[活性的に再生]@en[actively playing]]されていなくとも、
[[音声]]の[[再生]]のために存在し続けることがあります。例えばまだ[[参照]]されている[[現在媒体制御器]]があって[RUBYB[再生再開]@en[unpause]]できるかもしれませんし、
あるいは再生再開されていても[[バッファ]]待ちのため [[stall]] 中かもしれません。
[SRC[>>6]]
;; [10] 環境によっては同時再生数の制限が厳しいかもしれませんから、
再生が終わったらすべての[[参照]]を確実に削除するなど配慮することが特に好ましいとされています。 [SRC[>>9]]
* ワーカー
[21] [CODE(DOMi)@en[[[DedicatedWorkerGlobalScope]]]]/[CODE(DOMi)@en[[[Worker]]]] は暗示的に関連付けられた [CODE(DOMi)@en[[[MessagePort]]]]
[[オブジェクト]]を有しますが、この [CODE(DOMi)@en[[[MessagePort]]]] は
[CODE(DOMi)@en[[[DedicatedWorkerGlobalScope]]]]/[CODE(DOMi)@en[[[Worker]]]]
より先に[[ごみ収集]]しては[['''なりません''']]。 [SRC[>>20, >>24]]
[23] [[ワーカー]]の[[実行時誤り]]は [CODE(DOMe)@en[[[error]]]] [[事象]]として呼び出し元の [CODE(DOMi)@en[[[Worker]]]] や
[CODE(DOMi)@en[[[Document]]]] へと伝達されていきますが、その伝達先が既に[[ごみ収集]]されて消失している場合には
[CODE(DOMa)@en[[[onerror]]]] は [CODE@en[[[null]]]] であるものとして
[WEAK[(つまり何もしないで更に上位の呼び出し元へと伝達されるよう)]] 処理されます。 [SRC[>>22]]
* 事象源
[26] [CODE(DOMi)@en[[[EventSource]]]] については、
- [28] [CODE(DOMa)@en[[[readyState]]]] が
[CODE[[[CONNECTING]]]] であり、かつ [CODE(DOMe)@en[[[open]]]], [CODE(DOMa)@en[[[message]]]],
[CODE(DOMa)@en[[[error]]]] の[[事象聴取器]]が登録されている場合
- [27] [CODE(DOMi)@en[[[EventSource]]]] の [CODE(DOMa)@en[[[readyState]]]] が
[CODE[[[OPEN]]]] であり、かつ [CODE(DOMa)@en[[[message]]]],
[CODE(DOMa)@en[[[error]]]] の[[事象聴取器]]が登録されている場合
- [29] [[遠隔事象タスク源]]に[[タスク]]が投入されている間
... には、 [CODE(DOMi)@en[[[EventSource]]]] の[[構築子]]が呼び出された [CODE(DOMi)@en[[[Window]]]]
または [CODE(DOMi)@en[[[WorkerUtils]]]] から [CODE(DOMi)@en[[[EventSource]]]]
への[[強参照]]がなければ[['''なりません''']]。 [SRC[>>26]]
[30] [CODE(DOMi)@en[[[EventSource]]]] の[[接続]]が開いている間に同オブジェクトが[[ごみ収集]]される場合、当該オブジェクトによって開かれた
[[fetch]] は中断しなければ[['''なりません''']]。 [SRC[>>26]]
* 歴史
[1] [[Web]] における[[ごみ収集]] ([[garbage collection]]) は [[HTML Living Standard]] ではじめて明示的に規定され、
その後他の仕様でも定義されるようになりました。