* 仕様書

[REFS[
- [13] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2016-11-02 16:40:24 +09:00]]) <https://html.spec.whatwg.org/#broadcasting-to-other-browsing-contexts>
]REFS]

* 文脈

[16] [CODE(DOMi)@en[BroadcastChannel]] [[インターフェイス]]は、[[文書環境]]と[[ワーカー環境]]に[[晒され]]ています
[SRC[>>13]]。

* 状態

[19] [CODE(DOMi)@en[BroadcastChannel]] [[オブジェクト]]は、
[CODE(DOMi)@en[EventTarget]] としての状態に加えて、
次の状態を持ちます。
[FIG(list members)[
: [F[通信路名]] :
[[文字列]]。
: [DFN[[F[[RUBYB[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]@en[[CODE(DOMi)@en[BroadcastChannel]] settings object]]]]]] :
[[環境設定群オブジェクト]]。
: [F[閉じ済みフラグ]] :
[[ブール型]]。
初期値は[[偽]]。
]FIG]

* コンストラクター

[14] [CODE(DOMi)@en[BroadcastChannel]] [[コンストラクター]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>13]]。
[FIG(steps)[
= [15] [VAR[名前]]を、必須の第1引数を [CODE(IDL)@en[DOMString]] と解釈した結果に設定します。
= [20] 新しい [CODE(DOMi)@en[BroadcastChannel]] [[オブジェクト]]を返します。
[FIG(list members)[ [21] [CODE(DOMi)@en[BroadcastChannel]]
: [F[通信路名]] : [VAR[名前]]
: [F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]] : [[現職設定群オブジェクト]]
]FIG]
]FIG]

* メンバー

[FIG(short list)[ [17] [CODE(DOMi)@en[BroadcastChannel]] [[インターフェイス]]の[[メンバー][インターフェイスメンバー]]
- [CODE(DOMi)@en[EventTarget]] [[インターフェイス]]を[[継承]] [SRC[>>13]]
- [CODE(DOMm)@en[close][BroadcastChannel]]
- [CODE(DOMa)@en[name][BroadcastChannel]]
- [CODE(DOMa)@en[onmessage]]
- [CODE(DOMa)@en[onmessageerror]]
- [CODE(DOMm)@en[postMessage]]
]FIG]

* [CODE(DOMi)@en[BroadcastChannel]] インターフェイス [CODE(DOMa)@en[name][BroadcastChannel]] 属性

[22] [CODE(DOMi)@en[BroadcastChannel]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[name][BroadcastChannel]]]] [[IDL属性]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>13]]。
[FIG(steps)[
= [23] [[文脈オブジェクト]]の[F[通信路名]]を返します。
]FIG]

[24] [CODE(DOMi)@en[BroadcastChannel]] [[オブジェクト]]は、
[DFN[[F[[RUBYB[[[通信路名]]]@en[channel name]]]]]]を持ちます [SRC[>>13]]。
[[コンストラクター]]で指定された値が設定されます。この値は以後変更されることはありません。

* [CODE(DOMi)@en[BroadcastChannel]] インターフェイス [CODE(DOMa)@en[close][BroadcastChannel]] 属性

[31] [CODE(DOMi)@en[BroadcastChannel]] [[インターフェイス]]の
[DFN[[CODE(DOMa)@en[close][BroadcastChannel]]]] [[メソッド]]は、
次のようにしなければ[MUST[なりません]] [SRC[>>13]]。
[FIG(steps)[
= [32] [[文脈オブジェクト]]の[F[閉じ済みフラグ]]を、[[真]]に設定します。
= [34] [[文脈オブジェクト]]の [F[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]の[F[大域オブジェクト]]の[F[[CODE(DOMi)@en[BroadcastChannel]]群]]から、
[[文脈オブジェクト]]を削除します。
= [49] [[イベントループ]]の [F[[CODE(DOMi)@en[BroadcastChannel]]群]]から、
[[文脈オブジェクト]]を削除します。
]FIG]

[33] [CODE(DOMi)@en[BroadcastChannel]] [[オブジェクト]]は、
[DFN[[F[[RUBYB[[[閉じ済みフラグ]]]@en[closed flag]]]]]]を持ちます [SRC[>>13]]。
初期値は[[偽]]です。

-*-*-

[25] [[大域オブジェクト]]は、[F[[CODE(DOMi)@en[BroadcastChannel]]群]]という[[集合]]を持ちます。
初期状態は空です。

[46] [[イベントループ]]は、[F[[CODE(DOMi)@en[BroadcastChannel]]群]]という[[集合]]
(重複のない順序付きリスト) を持ちます。初期状態は空です。
この[[集合]]から項目への参照は[[弱い参照]]とし、[[ごみ収集]]されたら除去するものとします。

[26] [CODE(DOMi)@en[BroadcastChannel]] [VAR[BC]] に[[イベントリスナー]]が追加され、
その[F[イベント型]]が [CODE(DOMe)@en[message][onmessage]] の場合、次のようにしなければ[MUST[なりません]]
[SRC[>>13]]。
[FIG(steps)[
= [27] [VAR[BC]] の[F[閉じ済みフラグ]]が[[偽]]なら、
== [28] [VAR[BC]] の [F[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]の[F[大域オブジェクト]]の[F[[CODE(DOMi)@en[BroadcastChannel]]群]]に、
[VAR[BC]] を追加します。
== [47] [[イベントループ]]の[F[[CODE(DOMi)@en[BroadcastChannel]]群]]に、
[VAR[BC]] を追加します。
]FIG]

[29] [CODE(DOMi)@en[BroadcastChannel]] [VAR[BC]] から[F[イベント型]]が [CODE(DOMe)@en[message][onmessage]] 
の[[イベントリスナー]]がすべて削除された場合、次のようにしなければ[MUST[なりません]]
[SRC[>>13]]。
[FIG(steps)[
= [30] [VAR[BC]] の [F[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]の[F[大域オブジェクト]]の[F[[CODE(DOMi)@en[BroadcastChannel]]群]]から、
[VAR[BC]] を削除します。
= [48] [[イベントループ]]の[F[[CODE(DOMi)@en[BroadcastChannel]]群]]から、
[VAR[BC]] を削除します。
]FIG]

-*-*-

[35] [CODE(DOMi)@en[BroadcastChannel]] を作成して [CODE(DOMe)@en[message][onmessage]]
の[[イベントリスナー]]を登録すると、[[大域オブジェクト]]にも登録されることになります。
[[スクリプト]]から [CODE(DOMi)@en[BroadcastChannel]] への参照を削除しても、
(まだ[[イベントリスナー]]が呼び出される可能性が残るため) 
[[大域オブジェクト]]からの参照は破棄されず、残ったままになります。
このため、必要がなくなったら明示的に [CODE(DOMm)@en[close][BroadcastChannel]]
[[メソッド]]を呼び出すことが[RUBYB[強く推奨]@en[strongly encouraged]]されています [SRC[>>13]]。

* 送受信

[66] 送受信の処理全体については、 [CODE(DOMm)@en[postMessage]] を参照。

** 送信先の決定

[37] [CODE(DOMm)@en[postMessage]] は、指定されたメッセージを受信する
[CODE(DOMi)@en[BroadcastChannel]] を、次のように決定します。

[38] [VAR[始点設定群]]と[VAR[始点通信路]]の
[DFN[[[[CODE(DOMi)@en[BroadcastChannel]]すべてのリスト]]]]とは、
次の条件をすべて満たすもののリストとしなければ[MUST[なりません]] [SRC[>>13]]。
[FIG(list)[
- [39] [F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[起源]]と[VAR[始点設定群]]の[F[起源]]が[[同じ起源]]である
- [41] 次のいずれかを満たす:
-- [40] [F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]が
[CODE(DOMi)@en[Window]] で、
[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]の[F[関連付けられた文書]]の[F[完全に活性]]が[[真]]
-- [42] [F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]が [CODE(DOMi)@en[WorkerGlobalScope]] で、
[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]の[F[閉じ済み]]フラグが[[偽]]で、
[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]の[F[ワーカー]]が
[[suspendable worker]] で''ない''
- [43] [F[通信路名]]が[VAR[始点通信路]]
- [44] [F[閉じ済みフラグ]]が[[偽]]
]FIG]

[50] このリストにおいては、[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[有責イベントループ]]が同じもの同士は古い順としなければ[MUST[なりません]]
[SRC[>>13]]。

[67] なお、対象検索の範囲は、[[Webブラウザー]]が1つの[[利用者エージェント]]であるとみなす範囲に当然に限定されるものと思われます。
例えば [[private browsing]] モードと通常モードとでは異なる[[利用者エージェント]]に属すると考えられ、
[CODE[BroadcastChannel]] によってその境界を超えることはできません。

[EG[
[68] [[Chrome]] は通常[[窓]]と[[シークレットウィンドウ]]のどちらも [CODE[BroadcastChannel]]
を実装していますが、相互に通信することはできません。 [TIME[2017-04-23T06:49:27.200Z]]
]EG]

-*-*-

[51] このリストの作成は、次のように等価に書き換えることができます。

[FIG(steps)[
= [58] [VAR[結果]]を、空のリストに設定します。
= [53] [VAR[起源]]を、[VAR[始点設定群]]の[F[起源]]に設定します。
= [54] 
@@
[VAR[イベントループ群]]を、[[利用者エージェント]]で現在実行中の[VAR[起源]]を扱う[[イベントループ]]をすべて集めた結果に設定します。
= [55] [VAR[イベントループ群]]の各[VAR[イベントループ]]について、
== [56] [VAR[リスト]]を、[VAR[イベントループ]]の[F[[CODE(DOMi)@en[BroadcastChannel]]群]]の複製に設定します。
== [57] [VAR[リスト]]から、[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[起源]]が[VAR[起源]]と[[同じ起源]]でないものを除去します。
== [52] [VAR[リスト]]から、次のいずれも満たさないものを除去します。
--- [61] [F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]が [CODE(DOMi)@en[Window]] で、
[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[有責文書]]が[F[完全に活性]]
--- [62] [F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]が [CODE(DOMi)@en[WorkerGlobalScope]] で、
[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]の[F[閉じ済み]]フラグが[[偽]]で、
[F[[[[CODE(DOMi)@en[BroadcastChannel]]設定群オブジェクト]]]]の[F[大域オブジェクト]]の[F[ワーカー]]が
[[suspendable worker]]
== [63] [VAR[リスト]]から、[F[通信路名]]が[VAR[始点通信路]]でないものを除去します。
== [59] [VAR[結果]]に[VAR[リスト]]の全項目を順に追加します。
= [60] [VAR[結果]]を返します。
]FIG]

* 実装

[64] [[Chrome]] と [[Firefox]] が対応しています。

[65] [[Edge]] と [[Safari]] は未実装です。 [TIME[2017-04-02T11:28:30.100Z]]

* 歴史

[1] [CITE@en[Web Applications 1.0 r8274      New BroadcastChannel feature to send messages to other tabs in the same origin, so you don't have to abuse the onstorage event, and don't need to use a heavy shared worker for something otherwise trivial.]]
( ([TIME[2013-11-14 04:09:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8273&to=8274>

[2] [CITE@en[Web Applications 1.0 r8450     Oops, forgot to make BroadcastChannel inherit from EventTarget]]
( ([TIME[2014-02-01 06:26:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8449&to=8450>

[3] [CITE[''''''[''''''whatwg'''''']'''''' BroadcastChannel should support structured clones]]
( ([TIME[2014-04-29 23:49:00 +09:00]] 版))
<http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2014-April/254182.html>

[4] [CITE@en[Web Applications 1.0 r8590     Make BroadcastChannel support structured clones]]
( ([TIME[2014-04-30 09:13:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8589&to=8590>

[5] [CITE@en[Web Applications 1.0 r8593     Change the sort order for broadcast channel messages to be easier to implement]]
( ([TIME[2014-05-02 02:58:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=8592&to=8593>

- [6] [CITE@en[Web Applications 1.0 r8660     Make BroadcastChannel objects work in workers]]
( ([TIME[2014-06-07 06:27:00 +09:00]] 版))
<http://html5.org/r/8660>
-- [36] [CITE@en[24414 – BroadcastChannel: support BroadcastChannel being used from workers]] ([TIME[2016-12-06 23:31:08 +09:00]]) <https://www.w3.org/Bugs/Public/show_bug.cgi?id=24414>

[7] [CITE@en[Re: ''''''[''''''whatwg'''''']'''''' BroadcastChannel memory leak]]
( ([[Ian Hickson]] 著, [TIME[2014-06-07 06:37:18 +09:00]] 版))
<http://lists.w3.org/Archives/Public/public-whatwg-archive/2014Jun/0034.html>

[8] [CITE@en[Web Applications 1.0 r8661     Add BroadcastChannel.close()]]
( ([TIME[2014-06-07 06:38:00 +09:00]] 版))
<http://html5.org/r/8661>

[9] [CITE@en[966439 – Implement BroadcastChannel API]]
( ([TIME[2015-01-14 22:17:47 +09:00]] 版))
<https://bugzilla.mozilla.org/show_bug.cgi?id=966439>

[10] [CITE@en[Reduce the number of terms BroadcastChannel introductory text uses · whatwg/html@f363b95]]
([TIME[2015-09-02 16:39:04 +09:00]] 版)
<https://github.com/whatwg/html/commit/f363b9585a7d48c67f0b06895545db588d093ce8>

[11] [CITE@en[Clarify settings object, realm, and global relationships · whatwg/html@0866f1b]]
([TIME[2016-03-28 00:39:21 +09:00]] 版)
<https://github.com/whatwg/html/commit/0866f1b3f4b4ea5a99a30909e9bbe557dea0b460>

[12] [CITE@en[Chromium Blog: Chrome 54 Beta: Custom Elements V1, BroadcastChannel, and media platform improvements]]
( ([TIME[2016-09-17 08:54:54 +09:00]]))
<https://blog.chromium.org/2016/09/chrome-54-beta-custom-elements-v1.html>

[69] [CITE@en[Make BroadcastChannel work in workers, part 2]]
([[annevk]]著, [TIME[2017-04-26 23:17:59 +09:00]])
<https://github.com/whatwg/html/commit/4bf5ccd8abacc1c6efe48fb7375266d559a8a83b>

[18] [CITE@en[should BroadcastChannel be disabled if a window does not have access to storage? · Issue #3054 · whatwg/html]]
([TIME[2017-12-21 00:25:01 +09:00]])
<https://github.com/whatwg/html/issues/3054>