-
Notifications
You must be signed in to change notification settings - Fork 27
/
mediasession.html
1011 lines (996 loc) · 103 KB
/
mediasession.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!doctype html><html lang="en">
<head>
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1, shrink-to-fit=no" name="viewport">
<title>Media Session Standard</title>
<link href="https://resources.whatwg.org/standard.css" rel="stylesheet">
<link href="https://resources.whatwg.org/bikeshed.css" rel="stylesheet">
<link href="https://resources.whatwg.org/logo-mediasession.svg" rel="icon">
<meta content="Bikeshed 1.0.0" name="generator">
<style>
/* https://github.com/tabatkins/bikeshed/issues/485 */
.example .self-link { display: none; }
</style>
<style>.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #708090 } /* Comment */
.highlight .k { color: #990055 } /* Keyword */
.highlight .l { color: #000000 } /* Literal */
.highlight .n { color: #0077aa } /* Name */
.highlight .o { color: #999999 } /* Operator */
.highlight .p { color: #999999 } /* Punctuation */
.highlight .cm { color: #708090 } /* Comment.Multiline */
.highlight .cp { color: #708090 } /* Comment.Preproc */
.highlight .c1 { color: #708090 } /* Comment.Single */
.highlight .cs { color: #708090 } /* Comment.Special */
.highlight .kc { color: #990055 } /* Keyword.Constant */
.highlight .kd { color: #990055 } /* Keyword.Declaration */
.highlight .kn { color: #990055 } /* Keyword.Namespace */
.highlight .kp { color: #990055 } /* Keyword.Pseudo */
.highlight .kr { color: #990055 } /* Keyword.Reserved */
.highlight .kt { color: #990055 } /* Keyword.Type */
.highlight .ld { color: #000000 } /* Literal.Date */
.highlight .m { color: #000000 } /* Literal.Number */
.highlight .s { color: #a67f59 } /* Literal.String */
.highlight .na { color: #0077aa } /* Name.Attribute */
.highlight .nc { color: #0077aa } /* Name.Class */
.highlight .no { color: #0077aa } /* Name.Constant */
.highlight .nd { color: #0077aa } /* Name.Decorator */
.highlight .ni { color: #0077aa } /* Name.Entity */
.highlight .ne { color: #0077aa } /* Name.Exception */
.highlight .nf { color: #0077aa } /* Name.Function */
.highlight .nl { color: #0077aa } /* Name.Label */
.highlight .nn { color: #0077aa } /* Name.Namespace */
.highlight .py { color: #0077aa } /* Name.Property */
.highlight .nt { color: #669900 } /* Name.Tag */
.highlight .nv { color: #0077aa } /* Name.Variable */
.highlight .ow { color: #999999 } /* Operator.Word */
.highlight .mb { color: #000000 } /* Literal.Number.Bin */
.highlight .mf { color: #000000 } /* Literal.Number.Float */
.highlight .mh { color: #000000 } /* Literal.Number.Hex */
.highlight .mi { color: #000000 } /* Literal.Number.Integer */
.highlight .mo { color: #000000 } /* Literal.Number.Oct */
.highlight .sb { color: #a67f59 } /* Literal.String.Backtick */
.highlight .sc { color: #a67f59 } /* Literal.String.Char */
.highlight .sd { color: #a67f59 } /* Literal.String.Doc */
.highlight .s2 { color: #a67f59 } /* Literal.String.Double */
.highlight .se { color: #a67f59 } /* Literal.String.Escape */
.highlight .sh { color: #a67f59 } /* Literal.String.Heredoc */
.highlight .si { color: #a67f59 } /* Literal.String.Interpol */
.highlight .sx { color: #a67f59 } /* Literal.String.Other */
.highlight .sr { color: #a67f59 } /* Literal.String.Regex */
.highlight .s1 { color: #a67f59 } /* Literal.String.Single */
.highlight .ss { color: #a67f59 } /* Literal.String.Symbol */
.highlight .vc { color: #0077aa } /* Name.Variable.Class */
.highlight .vg { color: #0077aa } /* Name.Variable.Global */
.highlight .vi { color: #0077aa } /* Name.Variable.Instance */
.highlight .il { color: #000000 } /* Literal.Number.Integer.Long */
.highlight { background: hsl(24, 20%, 95%); }
code.highlight { padding: .1em; border-radius: .3em; }
pre.highlight, pre > code.highlight { display: block; padding: 1em; margin: .5em 0; overflow: auto; border-radius: 0; }
</style>
<body class="h-entry status-LS">
<div class="head">
<p data-fill-with="logo"><a class="logo" href="https://whatwg.org/"> <img alt="WHATWG" height="100" src="https://resources.whatwg.org/logo-mediasession.svg"> </a> </p>
<h1 class="p-name no-ref" id="title">Media Session</h1>
<h2 class="no-num no-toc no-ref heading settled" id="subtitle"><span class="content">Living Standard — Last Updated <time class="dt-updated" datetime="2016-02-18">18 February 2016</time></span></h2>
<div data-fill-with="spec-metadata">
<dl>
<dt>Participate:
<dd><span><a href="https://github.com/whatwg/mediasession/issues/new">File an issue</a> (<a href="https://github.com/whatwg/mediasession/issues?state=open">open issues</a>)</span>
<dd><span><a href="https://wiki.whatwg.org/wiki/IRC">IRC: #whatwg on Freenode</a></span>
<dt>Version History:
<dd><span><a href="https://github.com/whatwg/mediasession/commits">https://github.com/whatwg/mediasession/commits</a></span>
</dl>
</div>
<div data-fill-with="warning"></div>
</div>
<h2 class="no-num no-toc no-ref heading settled" id="abstract"><span class="content">Abstract</span></h2>
<div class="p-summary" data-fill-with="abstract">
<p>This specification enables web developers to obtain different levels
of platform media focus, customize available platform media controls,
and access platform media keys such as hardware keys found on
keyboards, headsets, remote controls, and software keys found in
notification areas and on lock screens of mobile devices.</p>
</div>
<div data-fill-with="at-risk"></div>
<nav data-fill-with="table-of-contents" id="toc">
<h2 class="no-num no-toc no-ref" id="contents">Table of Contents</h2>
<ol class="toc" role="directory">
<li><a href="#introduction"><span class="secno">1</span> <span class="content">Introduction</span></a>
<li><a href="#conformance"><span class="secno">2</span> <span class="content">Conformance</span></a>
<li><a href="#dependencies"><span class="secno">3</span> <span class="content">Dependencies</span></a>
<li>
<a href="#the-mediasession-interface"><span class="secno">4</span> <span class="content">The <code class="idl"><span>MediaSession</span></code> interface</span></a>
<ol class="toc">
<li><a href="#media-session-states"><span class="secno">4.1</span> <span class="content">States</span></a>
<li><a href="#media-session-kinds"><span class="secno">4.2</span> <span class="content">Kinds</span></a>
<li><a href="#media-session-participants"><span class="secno">4.3</span> <span class="content">Participants</span></a>
<li><a href="#activating-a-media-session"><span class="secno">4.4</span> <span class="content">Activating a media session</span></a>
<li><a href="#interrupting-a-media-session"><span class="secno">4.5</span> <span class="content">Interrupting a media session</span></a>
<li><a href="#deactivating-a-media-session"><span class="secno">4.6</span> <span class="content">Deactivating a media session</span></a>
</ol>
<li><a href="#the-mediametadata-interface"><span class="secno">5</span> <span class="content">The <code class="idl"><span>MediaMetadata</span></code> interface</span></a>
<li>
<a href="#extensions-to-the-htmlmediaelement-interface"><span class="secno">6</span> <span class="content">Extensions to the <code class="idl"><span>HTMLMediaElement</span></code> interface</span></a>
<ol class="toc">
<li><a href="#activating-a-media-session-from-an-htmlmediaelement-object"><span class="secno">6.1</span> <span class="content">Activating a
media session from an <code class="idl"><span>HTMLMediaElement</span></code> object</span></a>
<li><a href="#interrupting-a-media-session-from-an-htmlmediaelement-object"><span class="secno">6.2</span> <span class="content">Interrupting a
media session from an <code class="idl"><span>HTMLMediaElement</span></code> object</span></a>
<li><a href="#deactivating-a-media-session-from-an-htmlmediaelement-object"><span class="secno">6.3</span> <span class="content">Deactivating a
media session from an <code class="idl"><span>HTMLMediaElement</span></code> object</span></a>
</ol>
<li>
<a href="#extensions-to-the-audiocontext-interface"><span class="secno">7</span> <span class="content">Extensions to the <code class="idl"><span>AudioContext</span></code> interface</span></a>
<ol class="toc">
<li><a href="#interrupting-a-media-session-from-an-audiocontext-object"><span class="secno">7.1</span> <span class="content">Interrupting a
media session from an <code class="idl"><span>AudioContext</span></code> object</span></a>
</ol>
<li><a href="#examples"><span class="secno">8</span> <span class="content">Examples</span></a>
<li><a href="#acknowledgments"><span class="secno"></span> <span class="content">Acknowledgments</span></a>
<li>
<a href="#index"><span class="secno"></span> <span class="content">Index</span></a>
<ol class="toc">
<li><a href="#index-defined-here"><span class="secno"></span> <span class="content">Terms defined by this specification</span></a>
<li><a href="#index-defined-elsewhere"><span class="secno"></span> <span class="content">Terms defined by reference</span></a>
</ol>
<li>
<a href="#references"><span class="secno"></span> <span class="content">References</span></a>
<ol class="toc">
<li><a href="#normative"><span class="secno"></span> <span class="content">Normative References</span></a>
<li><a href="#informative"><span class="secno"></span> <span class="content">Informative References</span></a>
</ol>
<li><a href="#idl-index"><span class="secno"></span> <span class="content">IDL Index</span></a>
</ol>
</nav>
<main>
<script async="" src="https://resources.whatwg.org/file-issue.js"></script>
<h2 class="heading settled" data-level="1" id="introduction"><span class="secno">1. </span><span class="content">Introduction</span><a class="self-link" href="#introduction"></a></h2>
<p><em>This section is non-normative.</em></p>
<p>Media is used extensively today on the web to play a variety of different types
of content. It is often used to play music, podcasts and radio content. At other
times web media is used to provide background music, sound effects, notification
sounds and to render WebRTC media stream content.</p>
<p>When playing media on the web, developers are currently forced to adopt a single
default platform modality for playing all media content. On the other hand,
native applications can access much richer media integration options with an
underlying platform. On mobile devices, native application developers can
request many different forms of media integration with the platform to obtain
access to headphone buttons, lock screens and notification areas as needed. On
desktop devices, native applications have access to keyboard media key events.
Native application developers can specify the conditions in which media content
should pause or duck on audio interruptions (i.e. pause or lower the volume for
the duration of an interruption), continue playing out when application focus is
lost or the device screen is switched off and interface with internal and
external remote controllers.</p>
<p>This specification provides these platform media integration features for web
media. By allowing web developers to express the intended usage of their media
content, user agents can supply the most suitable platform-level interactions
for that content and enforce logical interoperation behavior on the current
platform between any number of different sources of media.</p>
<p>This specification describes the mechanism that allows web developers to specify
the most appropriate kind for their media content and for user agents to then
use these supplied hints to enforce how different sources of web media should
interact with each other, other native media content and the underlying
platform.</p>
<h2 class="heading settled" data-level="2" id="conformance"><span class="secno">2. </span><span class="content">Conformance</span><a class="self-link" href="#conformance"></a></h2>
<p>All diagrams, examples, and notes in this specification are non-normative, as
are all sections explicitly marked non-normative. Everything else in this
specification is normative.</p>
<p>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119. For readability, these
words do not appear in all uppercase letters in this specification. <a data-link-type="biblio" href="#biblio-rfc2119">[RFC2119]</a></p>
<p>Requirements phrased in the imperative as part of algorithms (such as "strip any
leading space characters" or "return false and terminate these steps") are to be
interpreted with the meaning of the key word ("must", "should", "may", etc) used
in introducing the algorithm.</p>
<p>Conformance requirements phrased as algorithms or specific steps may be
implemented in any manner, so long as the end result is equivalent. (In
particular, the algorithms defined in this specification are intended to be easy
to follow, and not intended to be performant.)</p>
<p>User agents may impose implementation-specific limits on otherwise unconstrained
inputs, e.g. to prevent denial of service attacks, to guard against running out
of memory, or to work around platform-specific limitations.</p>
<p>When a method or an attribute is said to call another method or attribute, the
user agent must invoke its internal API for that attribute or method so that
e.g. the author can’t change the behavior by overriding attributes or methods
with custom properties or functions in JavaScript.</p>
<p>Unless otherwise stated, string comparisons are done in a <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/infrastructure.html#case-sensitivity-and-string-comparison">case-sensitive</a> manner.</p>
<h2 class="heading settled" data-level="3" id="dependencies"><span class="secno">3. </span><span class="content">Dependencies</span><a class="self-link" href="#dependencies"></a></h2>
<p>The IDL fragments in this specification must be interpreted as required for
conforming IDL fragments, as described in the Web IDL specification. <a data-link-type="biblio" href="#biblio-webidl">[WEBIDL]</a></p>
<h2 class="heading settled" data-level="4" id="the-mediasession-interface"><span class="secno">4. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#mediasession">MediaSession</a></code> interface</span><a class="self-link" href="#the-mediasession-interface"></a></h2>
<pre class="idl">[<a class="idl-code" data-link-type="constructor" href="#dom-mediasession-mediasession">Constructor</a>(optional <a data-link-type="idl-name" href="#enumdef-mediasessionkind">MediaSessionKind</a> <dfn class="idl-code" data-dfn-for="MediaSession/MediaSession(kind)" data-dfn-type="argument" data-export="" id="dom-mediasession-mediasession-kind-kind">kind<a class="self-link" href="#dom-mediasession-mediasession-kind-kind"></a></dfn> = "content")]
interface <dfn class="idl-code" data-dfn-type="interface" data-export="" id="mediasession">MediaSession<a class="self-link" href="#mediasession"></a></dfn> {
readonly attribute <a data-link-type="idl-name" href="#enumdef-mediasessionkind">MediaSessionKind</a> <a class="idl-code" data-link-type="attribute" data-readonly="" data-type="MediaSessionKind " href="#dom-mediasession-kind">kind</a>;
attribute <a data-link-type="idl-name" href="#mediametadata">MediaMetadata</a>? <a class="idl-code" data-link-type="attribute" data-type="MediaMetadata? " href="#dom-mediasession-metadata">metadata</a>;
Promise<void> <a class="idl-code" data-link-type="method" href="#dom-mediasession-activate">activate</a>();
Promise<void> <a class="idl-code" data-link-type="method" href="#dom-mediasession-deactivate">deactivate</a>();
};
enum <dfn class="idl-code" data-dfn-type="enum" data-export="" id="enumdef-mediasessionkind">MediaSessionKind<a class="self-link" href="#enumdef-mediasessionkind"></a></dfn> {
"content",
"transient",
"transient-solo",
"ambient"
};
</pre>
<p><code class="idl"><a data-link-type="idl" href="#mediasession">MediaSession</a></code> objects are simply known as <dfn data-dfn-type="dfn" data-lt="media session" data-noexport="" id="media-session">media
sessions<a class="self-link" href="#media-session"></a></dfn>.</p>
<p>A <a data-link-type="dfn" href="#media-session">media session</a> has <dfn data-dfn-type="dfn" data-lt="media session metadata" data-noexport="" id="media-session-metadata">metadata<a class="self-link" href="#media-session-metadata"></a></dfn>,
which is either a <code class="idl"><a data-link-type="idl" href="#mediametadata">MediaMetadata</a></code> object or null.</p>
<dl class="domintro">
<dt> <code><var>session</var> = new <a class="idl-code" data-link-type="constructor" href="#dom-mediasession-mediasession">MediaSession</a>([<var>kind</var>])</code>
<dd> Returns a new <code class="idl"><a data-link-type="idl" href="#mediasession">MediaSession</a></code> object.
<dt> <code><var>session</var> . <code class="idl"><a data-link-type="idl" href="#dom-mediasession-kind">kind</a></code></code>
<dd> Returns the <a data-link-type="dfn" href="#media-session">media session</a>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a>.
<dt> <code><var>session</var> . <code class="idl"><a data-link-type="idl" href="#dom-mediasession-metadata">metadata</a></code></code>
<dd>
Returns the <a data-link-type="dfn" href="#media-session">media session</a>’s <code class="idl"><a data-link-type="idl" href="#mediametadata">MediaMetadata</a></code> object, if any, or null
otherwise.
<p>Can be set, to a <code class="idl"><a data-link-type="idl" href="#mediametadata">MediaMetadata</a></code> object or null.</p>
<dt> <code><var>session</var> . <code class="idl"><a data-link-type="idl" href="#dom-mediasession-activate">activate()</a></code></code>
<dd>
Requests platform-level media focus and sets the <a data-link-type="dfn" href="#media-session">media session</a>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>.
<p>Throws a <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#notallowederror">NotAllowedError</a></code> exception if the request was denied by the user
agent or the platform.</p>
<dt> <code><var>session</var> . <code class="idl"><a data-link-type="idl" href="#dom-mediasession-deactivate">deactivate()</a></code></code>
<dd> Releases platform-level media focus and sets the <a data-link-type="dfn" href="#media-session">media session</a>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#idle-media-session-state">idle</a></code>.
</dl>
<p>The <dfn class="idl-code" data-dfn-for="MediaSession" data-dfn-type="constructor" data-export="" id="dom-mediasession-mediasession"><code>MediaSession(<var>kind</var>)</code><a class="self-link" href="#dom-mediasession-mediasession"></a></dfn> constructor, when invoked, must return a new <a data-link-type="dfn" href="#media-session">media session</a> whose <a data-link-type="dfn" href="#mediasession-kind">kind</a> is <var>kind</var>, and <a data-link-type="dfn" href="#mediasession-state">state</a> is <code><a data-link-type="dfn" href="#idle-media-session-state">idle</a></code>.</p>
<p>The <dfn class="idl-code" data-dfn-for="MediaSession" data-dfn-type="attribute" data-export="" id="dom-mediasession-kind"><code>kind</code><a class="self-link" href="#dom-mediasession-kind"></a></dfn> attribute must return the <a data-link-type="dfn" href="#media-session">media session</a>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a>.</p>
<p>The <dfn class="idl-code" data-dfn-for="MediaSession" data-dfn-type="attribute" data-export="" id="dom-mediasession-metadata"><code>metadata</code><a class="self-link" href="#dom-mediasession-metadata"></a></dfn> attribute, on
getting, must return the <a data-link-type="dfn" href="#media-session">media session</a>’s <a data-link-type="dfn" href="#media-session-metadata">metadata</a>. On setting, the <a data-link-type="dfn" href="#media-session">media session</a>’s <a data-link-type="dfn" href="#media-session-metadata">metadata</a> must be set to the new value.</p>
<p>The <dfn class="idl-code" data-dfn-for="MediaSession" data-dfn-type="method" data-export="" id="dom-mediasession-activate"><code>activate()</code><a class="self-link" href="#dom-mediasession-activate"></a></dfn> method, when
invoked, must run these steps:</p>
<ol>
<li> Let <var>media session</var> be the <a data-link-type="dfn" href="https://dom.spec.whatwg.org/#context-object">context object</a>.
<li> Let <var>promise</var> be a new promise.
<li> Return <var>promise</var>, and run the remaining steps <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel">in parallel</a>.
<li> <a data-link-type="dfn" href="#activate">Activate</a> <var>media session</var>.
<li> If <a data-link-type="dfn" href="#activate">activate</a> failed, reject <var>promise</var> with a <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#notallowederror">NotAllowedError</a></code> exception.
<li> Otherwise, fulfill <var>promise</var> with undefined.
</ol>
<p class="note" role="note">Note: <code class="idl"><a data-link-type="idl" href="#dom-mediasession-activate">activate()</a></code> can fail if there is an ongoing high-priority activity,
e.g. a phone call.</p>
<p>The <dfn class="idl-code" data-dfn-for="MediaSession" data-dfn-type="method" data-export="" id="dom-mediasession-deactivate"><code>deactivate()</code><a class="self-link" href="#dom-mediasession-deactivate"></a></dfn> method, when
invoked, must run these steps:</p>
<ol>
<li> Let <var>media session</var> be the <a data-link-type="dfn" href="https://dom.spec.whatwg.org/#context-object">context object</a>.
<li> Let <var>promise</var> be a new promise.
<li> Return <var>promise</var>, and run the remaining steps <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel">in parallel</a>.
<li> <a data-link-type="dfn" href="#deactivate">Deactivate</a> <var>media session</var>.
<li> Fulfill <var>promise</var> with undefined.
</ol>
<p class="note" role="note">Note: Unlike <code class="idl"><a data-link-type="idl" href="#dom-mediasession-activate">activate()</a></code>, <code class="idl"><a data-link-type="idl" href="#dom-mediasession-deactivate">deactivate()</a></code> cannot fail.</p>
<h3 class="heading settled" data-level="4.1" id="media-session-states"><span class="secno">4.1. </span><span class="content">States</span><a class="self-link" href="#media-session-states"></a></h3>
<p>A <a data-link-type="dfn" href="#media-session">media session</a> has a <dfn data-dfn-for="MediaSession" data-dfn-type="dfn" data-noexport="" id="mediasession-state">state<a class="self-link" href="#mediasession-state"></a></dfn> that describes
its current status with respect to any platform-level interactions and
interactions with other <a data-link-type="dfn" href="#media-session">media sessions</a>. The possible values are as
follows:</p>
<dl>
<dt> <dfn data-dfn-type="dfn" data-lt="idle media session state" data-noexport="" id="idle-media-session-state"><code>idle</code><a class="self-link" href="#idle-media-session-state"></a></dfn>
<dd> The <a data-link-type="dfn" href="#media-session">media session</a> does not have any platform-level media focus nor is
it in a suspended state.
<dt> <dfn data-dfn-type="dfn" data-lt="active media session state" data-noexport="" id="active-media-session-state"><code>active</code><a class="self-link" href="#active-media-session-state"></a></dfn>
<dd> The <a data-link-type="dfn" href="#media-session">media session</a> currently has platform-level media focus.
<dt> <dfn data-dfn-type="dfn" data-lt="interrupted media session state" data-noexport="" id="interrupted-media-session-state"><code>interrupted</code><a class="self-link" href="#interrupted-media-session-state"></a></dfn>
<dd> The <a data-link-type="dfn" href="#media-session">media session</a> is currently suspended from having platform-level
media focus and its <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a> are either <a data-link-type="dfn" href="#pause">paused</a> or <a data-link-type="dfn" href="#duck">ducked</a> based on the <a data-link-type="dfn" href="#media-session">media session</a>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a>.
</dl>
<h3 class="heading settled" data-level="4.2" id="media-session-kinds"><span class="secno">4.2. </span><span class="content">Kinds</span><a class="self-link" href="#media-session-kinds"></a></h3>
<p>A <a data-link-type="dfn" href="#media-session">media session</a> has a <dfn data-dfn-for="MediaSession" data-dfn-type="dfn" data-noexport="" id="mediasession-kind">kind<a class="self-link" href="#mediasession-kind"></a></dfn> which is one of
"<code><dfn data-dfn-type="dfn" data-noexport="" id="content">content<a class="self-link" href="#content"></a></dfn></code>", "<code><dfn data-dfn-type="dfn" data-noexport="" id="transient">transient<a class="self-link" href="#transient"></a></dfn></code>",
"<code><dfn data-dfn-type="dfn" data-noexport="" id="transient-solo">transient-solo<a class="self-link" href="#transient-solo"></a></dfn></code>" and "<code><dfn data-dfn-type="dfn" data-noexport="" id="ambient">ambient<a class="self-link" href="#ambient"></a></dfn></code>".</p>
<div class="note" role="note">
The following table lists the available <a data-link-type="dfn" href="#mediasession-kind">kinds</a>, their associated
behavior, and examples of when they are appropriate to use.
<table>
<tbody>
<tr>
<th>Kind
<th>Behavior
<th>Examples
<tr>
<td> "<code><a data-link-type="dfn" href="#content">content</a></code>"
<td>
<ul>
<li> <a data-link-type="dfn" href="#indefinitely-pause">Indefinitely pauses</a> all other <a data-link-type="dfn" href="#audio-producing-participants">active</a> "<code><a data-link-type="dfn" href="#content">content</a></code>" content when <a href="#activating-a-media-session">playback begins</a>.
<li> Displays lock-screen and notification area user interfaces when <a href="#activating-a-media-session">playback begins</a>.
<li> Reacts to changes in both hardware and software-based media key
buttons when <a href="#activating-a-media-session">playback
begins</a>.
<li> <a data-link-type="dfn" href="#duck">Ducks</a> itself when "<code><a data-link-type="dfn" href="#transient">transient</a></code>" content <a href="#interrupting-a-media-session">starts interrupting</a>. <a data-link-type="dfn" href="#unduck">Unducks</a> itself when "<code><a data-link-type="dfn" href="#transient">transient</a></code>" content is <a data-link-type="dfn" href="#pause">paused</a> or <a href="#deactivating-a-media-session">ends playback</a>.
<li> <a data-link-type="dfn" href="#pause">Pauses</a> itself when "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
content <a href="#interrupting-a-media-session">starts
interrupting</a>. <a data-link-type="dfn" href="#unpause">Unpauses</a> itself when "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
content is <a data-link-type="dfn" href="#pause">paused</a> or <a href="#deactivating-a-media-session">ends
playback</a>.
<li> Continues playing normally when "<code><a data-link-type="dfn" href="#ambient">ambient</a></code>"
content <a href="#interrupting-a-media-session">starts
interrupting</a>.
</ul>
<td> Music, podcasts, radio streams.
<tr>
<td> "<code><a data-link-type="dfn" href="#transient">transient</a></code>"
<td>
<ul>
<li> <a data-link-type="dfn" href="#duck">Ducks</a> all other <a data-link-type="dfn" href="#audio-producing-participants">active</a> "<code><a data-link-type="dfn" href="#content">content</a></code>" content when <a href="#activating-a-media-session">playback begins</a>. <a data-link-type="dfn" href="#unduck">Unducks</a> all other <a data-link-type="dfn" href="#interrupted-media-session-state">interrupted</a> "<code><a data-link-type="dfn" href="#content">content</a></code>" content when <a data-link-type="dfn" href="#pause">paused</a> or <a href="#deactivating-a-media-session">playback
ends</a>.
<li> Does not display lock-screen and notification area user interfaces
when <a href="#activating-a-media-session">playback begins</a>.
<li> Does not react to changes in both hardware and software-based media
key buttons when <a href="#activating-a-media-session">playback
begins</a>.
<li> <a data-link-type="dfn" href="#pause">Pauses</a> itself when "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
content <a href="#interrupting-a-media-session">starts
interrupting</a>. <a data-link-type="dfn" href="#unpause">Unpauses</a> itself when "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
content is <a data-link-type="dfn" href="#pause">paused</a> or <a href="#deactivating-a-media-session">ends
playback</a>.
<li> Continues playing normally when other
"<code><a data-link-type="dfn" href="#transient">transient</a></code>" or "<code><a data-link-type="dfn" href="#ambient">ambient</a></code>"
content <a href="#interrupting-a-media-session">starts
interrupting</a>.
</ul>
<td> Notification sounds. Spoken driving directions where playback of music
in the background is acceptable.
<tr>
<td> "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
<td>
<ul>
<li> <a data-link-type="dfn" href="#pause">Pauses</a> all other <a data-link-type="dfn" href="#audio-producing-participants">active</a> "<code><a data-link-type="dfn" href="#content">content</a></code>", "<code><a data-link-type="dfn" href="#transient">transient</a></code>" and
"<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>" content when <a href="#activating-a-media-session">playback begins</a>. <a data-link-type="dfn" href="#unpause">Unpauses</a> all <a data-link-type="dfn" href="#interrupted-media-session-state">interrupted</a> "<code><a data-link-type="dfn" href="#content">content</a></code>", "<code><a data-link-type="dfn" href="#transient">transient</a></code>" and
"<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>" content when <a data-link-type="dfn" href="#pause">paused</a> or <a href="#deactivating-a-media-session">playback ends</a>.
<li> Does not display lock-screen and notification area user interfaces
when <a href="#activating-a-media-session">playback begins</a>.
<li> Does not react to changes in both hardware and software-based media
key buttons when <a href="#activating-a-media-session">playback
begins</a>.
<li> <a data-link-type="dfn" href="#pause">Pauses</a> itself when other "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
content <a href="#interrupting-a-media-session">starts
interrupting</a>. <a data-link-type="dfn" href="#unpause">Unpauses</a> itself when other "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>" content is <a data-link-type="dfn" href="#pause">paused</a> or <a href="#deactivating-a-media-session">ends
playback</a>.
<li> Continues playing normally when "<code><a data-link-type="dfn" href="#ambient">ambient</a></code>"
content <a href="#interrupting-a-media-session">starts
interrupting</a>.
</ul>
<td> Playback of driving directions. Other spoken notifications.
<tr>
<td> "<code><a data-link-type="dfn" href="#ambient">ambient</a></code>"
<td>
<ul>
<li> Does not interact with any other "<code><a data-link-type="dfn" href="#content">content</a></code>",
"<code><a data-link-type="dfn" href="#transient">transient</a></code>",
"<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>" or
"<code><a data-link-type="dfn" href="#ambient">ambient</a></code>" content during playback.
<li> Does not display lock-screen and notification area user interfaces
when <a href="#activating-a-media-session">playback begins</a>.
<li> Does not react to changes in both hardware and software-based media
key buttons when <a href="#activating-a-media-session">playback
begins</a>.
<li> <a data-link-type="dfn" href="#pause">Pauses</a> itself when its <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/browsers.html#top-level-browsing-context">top-level browsing context</a> is
not visible (i.e. the page is placed in the background or the user
agent is minimized or the screen is switched off). <a data-link-type="dfn" href="#unpause">Unpauses</a> itself when its <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/browsers.html#top-level-browsing-context">top-level browsing context</a> is at least partially visible on
at least one screen again (i.e. the user agent is in the foreground
and the page is focused again).
</ul>
<td> UI sounds. In-game sound effects and background music.
</table>
</div>
<h3 class="heading settled" data-level="4.3" id="media-session-participants"><span class="secno">4.3. </span><span class="content">Participants</span><a class="self-link" href="#media-session-participants"></a></h3>
<p>An <dfn data-dfn-type="dfn" data-noexport="" id="audio-producing-object">audio-producing object<a class="self-link" href="#audio-producing-object"></a></dfn> is any object or element that is capable of
emitting sound within the user agent and is therefore also potentially capable
of interacting with the media focus system available in different underlying
platforms.</p>
<p>An <a data-link-type="dfn" href="#audio-producing-object">audio-producing object</a> may have a <dfn data-dfn-type="dfn" data-noexport="" id="current-media-session">current media session<a class="self-link" href="#current-media-session"></a></dfn>,
which is a <a data-link-type="dfn" href="#media-session">media session</a>.</p>
<p>A <a data-link-type="dfn" href="#media-session">media session</a> may have one or more <a data-link-type="dfn" href="#audio-producing-object">audio-producing objects</a> attached to it; called its <dfn data-dfn-type="dfn" data-noexport="" id="audio-producing-participants">audio-producing participants<a class="self-link" href="#audio-producing-participants"></a></dfn>. A <a data-link-type="dfn" href="#media-session">media
session</a> must keep a list of its <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a> that
consists of zero of more <a data-link-type="dfn" href="#audio-producing-object">audio-producing objects</a>.</p>
<p>A <a data-link-type="dfn" href="#media-session">media session</a> has a <dfn data-dfn-type="dfn" data-noexport="" id="resume-list">resume list<a class="self-link" href="#resume-list"></a></dfn> that is used internally to
restore <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a> at the end of an interruption that
were playing, or were otherwise running, when that interruption started. The <a data-link-type="dfn" href="#resume-list">resume list</a> may consist of zero or more <a data-link-type="dfn" href="#audio-producing-object">audio-producing objects</a> that must also be present in the <a data-link-type="dfn" href="#media-session">media session</a>’s list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>. When a new <a data-link-type="dfn" href="#media-session">media session</a> is created
its <a data-link-type="dfn" href="#resume-list">resume list</a> must be empty.</p>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="pause">pause<a class="self-link" href="#pause"></a></dfn> a given <var>audio-producing
object</var> it must run the following steps:</p>
<ol>
<li> If <var>audio-producing object</var> is an <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a></code> object, then <a data-link-type="dfn" href="#pause-a-media-element">pause media element</a> <var>audio-producing object</var> and terminate these steps.
<li> If <var>audio-producing object</var> is an <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object, then <a data-link-type="dfn" href="#suspend-a-web-audio-object">suspend web audio object</a> <var>audio-producing object</var> and terminate these steps.
</ol>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="indefinitely-pause">indefinitely pause<a class="self-link" href="#indefinitely-pause"></a></dfn> a given <var>audio-producing object</var>, the user agent must <a data-link-type="dfn" href="#pause">pause</a> <var>audio-producing object</var> and, then proceed to remove it from its <a data-link-type="dfn" href="#current-media-session">current media session</a>’s list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>.</p>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="unpause">unpause<a class="self-link" href="#unpause"></a></dfn> a given <var>audio-producing
object</var> it must run the following steps:</p>
<ol>
<li> If <var>audio-producing object</var> is an <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a></code> object, then <a data-link-type="dfn" href="#unpause-a-media-element">unpause media element</a> <var>audio-producing object</var> and terminate these steps.
<li> If <var>audio-producing object</var> is an <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object, then <a data-link-type="dfn" href="#resume-a-web-audio-object">resume web audio object</a> <var>audio-producing object</var> and terminate these steps.
</ol>
<p>When an <a data-link-type="dfn" href="#audio-producing-object">audio-producing object</a> is to <dfn data-dfn-type="dfn" data-noexport="" id="duck">duck<a class="self-link" href="#duck"></a></dfn> the user agent must
ensure its output volume is lowered.</p>
<p>When an <a data-link-type="dfn" href="#audio-producing-object">audio-producing object</a> is to <dfn data-dfn-type="dfn" data-noexport="" id="unduck">unduck<a class="self-link" href="#unduck"></a></dfn> the user agent
should restore its output volume to the same level that was observed prior to
the original corresponding <a data-link-type="dfn" href="#duck">duck</a> request.</p>
<p class="note" role="note"> When an <a data-link-type="dfn" href="#audio-producing-object">audio-producing object</a> is <a data-link-type="dfn" href="#duck">ducked</a> any reduction
in volume applied by the user agent is not intended to be observable to web
pages. </p>
<h3 class="heading settled" data-level="4.4" id="activating-a-media-session"><span class="secno">4.4. </span><span class="content">Activating a media session</span><a class="self-link" href="#activating-a-media-session"></a></h3>
<p>To <dfn data-dfn-type="dfn" data-noexport="" id="activate">activate<a class="self-link" href="#activate"></a></dfn> a <var>media session</var>, run these steps:</p>
<ol>
<li> If <var>media session</var> is already <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>, then return success.
<li>
Optionally, based on platform conventions, request the most appropriate
platform-level media focus for <var>media session</var> based on its <a data-link-type="dfn" href="#mediasession-kind">kind</a>.
<p>If this step is run and platform-level media focus can not be obtained for
any reason, then return failure.</p>
<li>
Run these substeps:
<dl class="switch">
<dt> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is
"<code><a data-link-type="dfn" href="#content">content</a></code>"
<dd>
<ol>
<li> Optionally, based on platform conventions, the user agent may show
an ongoing media interface in the underlying platform’s
notifications area and/or show an ongoing media interface in the
underlying platform’s lock screen area, using any available <a data-link-type="dfn" href="#media-session-metadata">metadata</a>.
</ol>
<dt> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is
"<code><a data-link-type="dfn" href="#transient">transient</a></code>" or "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
<dd class="note" role="note"> The user agent should not provide user access to any hardware or
software media keys and not display any ongoing media interface in the
underlying platform’s notifications area or show any ongoing media
interface in the underlying platform’s lock screen area for
"<code><a data-link-type="dfn" href="#transient">transient</a></code>" or
"<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"-based <a data-link-type="dfn" href="#media-session">media sessions</a>.
<dt> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is
"<code><a data-link-type="dfn" href="#ambient">ambient</a></code>"
<dd>
If <var>media session</var>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/browsers.html#top-level-browsing-context">top-level browsing context</a> is not
at least partially visible on at least one screen, then return failure.
<p class="note" role="note"> The user agent should not provide user access to any hardware or
software media keys and not display any ongoing media interface in the
underlying platform’s notifications area or show any ongoing media
interface in the underlying platform’s lock screen area for
"<code><a data-link-type="dfn" href="#ambient">ambient</a></code>"-based <a data-link-type="dfn" href="#media-session">media sessions</a>. </p>
</dl>
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a> to an empty list.
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>, then return
success.
</ol>
<h3 class="heading settled" data-level="4.5" id="interrupting-a-media-session"><span class="secno">4.5. </span><span class="content">Interrupting a media session</span><a class="self-link" href="#interrupting-a-media-session"></a></h3>
<p>An <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code> <a data-link-type="dfn" href="#media-session">media
session</a> may be interrupted at any time. This typically occurs when another
application or another <a data-link-type="dfn" href="#media-session">media session</a> requests and is granted a level of
platform media focus that affects the <a data-link-type="dfn" href="#media-session">media session</a> based on its <a data-link-type="dfn" href="#mediasession-kind">kind</a>.</p>
<p>Interruptions can be both transient or permanent. A transient interruption means
we can either choose to <a data-link-type="dfn" href="#duck">duck</a> our media content and continue playing it
out at a reduced volume for the duration of the interruption; or <a data-link-type="dfn" href="#pause">pause</a> our media content for the duration of the interruption and, then, resume
playback when that interruption ends. A permanent interruption means we must <a data-link-type="dfn" href="#indefinitely-pause">pause our media content indefinitely</a>.</p>
<p>When a start-of-interruption notification event is received from the platform,
then the user agent must run the <a data-link-type="dfn" href="#media-session-interruption-algorithm">media session interruption algorithm</a> against all known <a data-link-type="dfn" href="#media-session">media
sessions</a>, passing in each <a data-link-type="dfn" href="#media-session">media session</a> as <var>media session</var>.</p>
<p>The <dfn data-dfn-type="dfn" data-noexport="" id="media-session-interruption-algorithm">media session interruption algorithm<a class="self-link" href="#media-session-interruption-algorithm"></a></dfn> takes one argument, <var>media session</var>, and consists of the following steps.</p>
<ol>
<li> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> is not <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>, then terminate
these steps.
<li> Let <var>interrupting kind</var> be the <a data-link-type="dfn" href="#mediasession-kind">kind</a> that triggered this
interruption.
<li>
Run these substeps:
<dl class="switch">
<dt> If <var>interrupting kind</var> is "<code><a data-link-type="dfn" href="#content">content</a></code>"
<dd>
<ol>
<li>
If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is
"<code><a data-link-type="dfn" href="#content">content</a></code>" then <a data-link-type="dfn" href="#indefinitely-pause">indefinitely pause</a> all of <var>media session</var>’s <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a> and set <var>media
session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#idle-media-session-state">idle</a></code>.
<p class="note" role="note"> This implies that the next time the <var>media session</var> is <a data-link-type="dfn" href="#activate">activated</a>, that we will re-request media focus according to
the steps defined in that algorithm. </p>
<li> Optionally, based on platform conventions, the user agent must
remove any previously established ongoing media interface in the
underlying platform’s notifications area and any ongoing media
interface in the underlying platform’s lock screen area for <var>media session</var>, if any.
<li> Optionally, based on platform conventions, the user agent must
prevent any hardware and/or software media keys from controlling
playback of <var>media session</var>’s <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>.
</ol>
<dt> If <var>interrupting kind</var> is "<code><a data-link-type="dfn" href="#transient">transient</a></code>"
<dd>
<ol>
<li> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is not
"<code><a data-link-type="dfn" href="#content">content</a></code>", then terminate these steps.
<li>
For each <var>audio-producing object</var> in <var>media
session</var>’s list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>:
<ol>
<li> If <var>audio-producing object</var> is not currently playing,
or is not otherwise running, then terminate these substeps and
continue at the next available <var>audio-producing
object</var>.
<li> <a data-link-type="dfn" href="#duck">Duck</a> <var>audio-producing object</var>.
<li> Add <var>audio-producing object</var> to <var>media
session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a>.
</ol>
<li>
Set <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#interrupted-media-session-state">interrupted</a></code>.
<p class="note" role="note"> This implies that the next time the <a data-link-type="dfn" href="#media-session-continuation-algorithm">media session continuation
algorithm</a> is run for <var>media session</var> that we will
re-activate this <a data-link-type="dfn" href="#media-session">media session</a> according to the steps
defined in that algorithm. </p>
</ol>
<dt> If <var>interrupting kind</var> is "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
<dd>
<ol>
<li> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is not
"<code><a data-link-type="dfn" href="#content">content</a></code>", "<code><a data-link-type="dfn" href="#transient">transient</a></code>" or
"<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>", then terminate these steps.
<li>
For each <var>audio-producing object</var> in <var>media
session</var>’s list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>:
<ol>
<li> If <var>audio-producing object</var> is not currently playing,
or is not otherwise running, then terminate these substeps and
continue at the next available <var>audio-producing
object</var>.
<li> <a data-link-type="dfn" href="#pause">Pause</a> <var>audio-producing object</var>.
<li> Add <var>audio-producing object</var> to <var>media
session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a>.
</ol>
<li>
Set <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#interrupted-media-session-state">interrupted</a></code>.
<p class="note" role="note"> This implies that the next time the <a data-link-type="dfn" href="#media-session-continuation-algorithm">media session continuation
algorithm</a> is run for <var>media session</var> that we will
re-activate this <a data-link-type="dfn" href="#media-session">media session</a> according to the steps
defined in that algorithm. </p>
</ol>
</dl>
</ol>
<p></p>
<p>When an end-of-interruption notification event is received from the platform,
then the user agent must run the <a data-link-type="dfn" href="#media-session-continuation-algorithm">media session continuation algorithm</a> against all known <a data-link-type="dfn" href="#media-session">media sessions</a>, passing in each <a data-link-type="dfn" href="#media-session">media session</a> as <var>media session</var>.</p>
<p>The <dfn data-dfn-type="dfn" data-noexport="" id="media-session-continuation-algorithm">media session continuation algorithm<a class="self-link" href="#media-session-continuation-algorithm"></a></dfn> takes one argument, <var>media session</var>, and consists of the following steps.</p>
<ol>
<li> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> is not <code><a data-link-type="dfn" href="#interrupted-media-session-state">interrupted</a></code>, then
terminate these steps.
<li> Let <var>interrupting kind</var> be the <a data-link-type="dfn" href="#mediasession-kind">kind</a> that initially triggered
this interruption.
<li>
Run these substeps:
<dl class="switch">
<dt> If <var>interrupting kind</var> is "<code><a data-link-type="dfn" href="#transient">transient</a></code>"
<dd>
<ol>
<li> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is not
"<code><a data-link-type="dfn" href="#content">content</a></code>", then terminate these steps.
<li> <a data-link-type="dfn" href="#unduck">Unduck</a> each <var>audio-producing object</var> in <var>media
session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a>.
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a> to an empty list.
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>.
</ol>
<dt> If <var>interrupting kind</var> is "<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>"
<dd>
<ol>
<li> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-kind">kind</a> is not
"<code><a data-link-type="dfn" href="#content">content</a></code>", "<code><a data-link-type="dfn" href="#transient">transient</a></code>", or
"<code><a data-link-type="dfn" href="#transient-solo">transient-solo</a></code>", then terminate these steps.
<li> <a data-link-type="dfn" href="#unpause">Unpause</a> each <var>audio-producing object</var> in <var>media
session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a>.
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a> to an empty list.
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>.
</ol>
</dl>
</ol>
<p><br></p>
<p>After a <code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#sec-visibilitychange-event">visibilitychange</a></code> event has been fired at a <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/browsers.html#top-level-browsing-context">top-level browsing
context</a>, known as <var>the browsing context</var>, the user agent must run
the following steps:</p>
<ol>
<li> If <code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#dom-document-visibilitystate">visibilityState</a></code> is not "<code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#pv-page-hidden">hidden</a></code>" or "<code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#pv-page-visible">visible</a></code>", then terminate
these steps.
<li>
For each <a data-link-type="dfn" href="#media-session">media session</a> in <var>the browsing context</var> with a <a data-link-type="dfn" href="#mediasession-kind">kind</a> of "<code><a data-link-type="dfn" href="#ambient">ambient</a></code>" run the following substeps:
<ol>
<li> Let <var>s</var> be the current <a data-link-type="dfn" href="#media-session">media session</a>.
<li>
If <code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#dom-document-visibilitystate">visibilityState</a></code> is "<code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#pv-page-hidden">hidden</a></code>" and <var>s</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> is <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>, then run
the following substeps:
<ol>
<li>
For each <var>audio-producing object</var> in <var>s</var>’s list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>, run the following substeps:
<ol>
<li> If <var>audio-producing object</var> is not currently playing,
or is not otherwise running, then terminate these substeps and
continue at the next available <var>audio-producing
object</var>.
<li> <a data-link-type="dfn" href="#pause">Pause</a> <var>audio-producing object</var>.
<li> Add <var>audio-producing object</var> to <var>media
session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a>.
</ol>
<li> Set <var>s</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#interrupted-media-session-state">interrupted</a></code>.
<li> Terminate these substeps and continue at the next available <a data-link-type="dfn" href="#media-session">media session</a>.
</ol>
<li>
If <code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#dom-document-visibilitystate">visibilityState</a></code> is "<code class="idl"><a data-link-type="idl" href="http://www.w3.org/TR/page-visibility/#pv-page-visible">visible</a></code>" and <var>s</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> is <code><a data-link-type="dfn" href="#interrupted-media-session-state">interrupted</a></code>,
then run the following substeps:
<ol>
<li> <a data-link-type="dfn" href="#unpause">Unpause</a> each <var>audio-producing object</var> in <var>s</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a>.
<li> Set <var>s</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a> to an empty list.
<li> Set <var>s</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#active-media-session-state">active</a></code>.
<li> Terminate these substeps and continue at the next available <a data-link-type="dfn" href="#media-session">media session</a>.
</ol>
</ol>
</ol>
<h3 class="heading settled" data-level="4.6" id="deactivating-a-media-session"><span class="secno">4.6. </span><span class="content">Deactivating a media session</span><a class="self-link" href="#deactivating-a-media-session"></a></h3>
<p>To <dfn data-dfn-type="dfn" data-noexport="" id="deactivate">deactivate<a class="self-link" href="#deactivate"></a></dfn> a <var>media session</var>, run these steps:</p>
<ol>
<li> <a data-link-type="dfn" href="#indefinitely-pause">Indefinitely pause</a> all of <var>media session</var>’s <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>.
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#resume-list">resume list</a> to an empty list.
<li> Set <var>media session</var>’s <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a> to an empty list.
<li> Run the <a data-link-type="dfn" href="#media-session-deactivation-algorithm">media session deactivation algorithm</a> for <var>media
session</var>.
</ol>
<p>The <dfn data-dfn-type="dfn" data-noexport="" id="media-session-deactivation-algorithm">media session deactivation algorithm<a class="self-link" href="#media-session-deactivation-algorithm"></a></dfn> takes one argument, <var>media session</var>, and consists of the following steps.</p>
<ol>
<li> If <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> is <code><a data-link-type="dfn" href="#idle-media-session-state">idle</a></code>, then terminate these
steps.
<li> If <var>media session</var> still has one or more <a data-link-type="dfn" href="#audio-producing-participants">audio-producing
participants</a>, then terminate these steps.
<li> Optionally, based on platform conventions, the user agent must release any
currently held platform media focus for <var>media session</var>.
<li> Optionally, based on platform conventions, the user agent must remove any
previously established ongoing media interface in the underlying platform’s
notifications area and any ongoing media interface in the underlying
platform’s lock screen area for <var>media session</var>, if any.
<li>
Optionally, based on platform conventions, the user agent must prevent any
hardware and/or software media keys from controlling playback of <var>media session</var>’s <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>.
<p class="note" role="note"> If the algorithm reaches this step then <var>media session</var> can not
have any remaining <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>. </p>
<li>
Set <var>media session</var>’s <a data-link-type="dfn" href="#mediasession-state">state</a> to <code><a data-link-type="dfn" href="#idle-media-session-state">idle</a></code>.
<p class="note" role="note"> This implies that the next time the <var>media session</var> is <a data-link-type="dfn" href="#activate">activated</a>, that we will re-request media focus according to the
steps defined in that algorithm. </p>
</ol>
<h2 class="heading settled" data-level="5" id="the-mediametadata-interface"><span class="secno">5. </span><span class="content">The <code class="idl"><a data-link-type="idl" href="#mediametadata">MediaMetadata</a></code> interface</span><a class="self-link" href="#the-mediametadata-interface"></a></h2>
<pre class="idl">[<a class="idl-code" data-link-type="constructor" href="#dom-mediametadata-mediametadata">Constructor</a>(<a data-link-type="idl-name" href="#dictdef-mediametadatainit">MediaMetadataInit</a> <dfn class="idl-code" data-dfn-for="MediaMetadata/MediaMetadata(init)" data-dfn-type="argument" data-export="" id="dom-mediametadata-mediametadata-init-init">init<a class="self-link" href="#dom-mediametadata-mediametadata-init-init"></a></dfn>)]
interface <dfn class="idl-code" data-dfn-type="interface" data-export="" id="mediametadata">MediaMetadata<a class="self-link" href="#mediametadata"></a></dfn> {
readonly attribute DOMString <dfn class="idl-code" data-dfn-for="MediaMetadata" data-dfn-type="attribute" data-export="" data-readonly="" data-type="DOMString " id="dom-mediametadata-title">title<a class="self-link" href="#dom-mediametadata-title"></a></dfn>;
readonly attribute DOMString <dfn class="idl-code" data-dfn-for="MediaMetadata" data-dfn-type="attribute" data-export="" data-readonly="" data-type="DOMString " id="dom-mediametadata-artist">artist<a class="self-link" href="#dom-mediametadata-artist"></a></dfn>;
readonly attribute DOMString <dfn class="idl-code" data-dfn-for="MediaMetadata" data-dfn-type="attribute" data-export="" data-readonly="" data-type="DOMString " id="dom-mediametadata-album">album<a class="self-link" href="#dom-mediametadata-album"></a></dfn>;
};
dictionary <dfn class="idl-code" data-dfn-type="dictionary" data-export="" id="dictdef-mediametadatainit">MediaMetadataInit<a class="self-link" href="#dictdef-mediametadatainit"></a></dfn> {
DOMString <dfn class="idl-code" data-default="""" data-dfn-for="MediaMetadataInit" data-dfn-type="dict-member" data-export="" data-type="DOMString " id="dom-mediametadatainit-title">title<a class="self-link" href="#dom-mediametadatainit-title"></a></dfn> = "";
DOMString <dfn class="idl-code" data-default="""" data-dfn-for="MediaMetadataInit" data-dfn-type="dict-member" data-export="" data-type="DOMString " id="dom-mediametadatainit-artist">artist<a class="self-link" href="#dom-mediametadatainit-artist"></a></dfn> = "";
DOMString <dfn class="idl-code" data-default="""" data-dfn-for="MediaMetadataInit" data-dfn-type="dict-member" data-export="" data-type="DOMString " id="dom-mediametadatainit-album">album<a class="self-link" href="#dom-mediametadatainit-album"></a></dfn> = "";
};
</pre>
<p>The <dfn class="idl-code" data-dfn-for="MediaMetadata" data-dfn-type="constructor" data-export="" id="dom-mediametadata-mediametadata"><code>MediaMetadata(<var>init</var>)</code><a class="self-link" href="#dom-mediametadata-mediametadata"></a></dfn> constructor, when invoked, must run the following steps:</p>
<ol>
<li> Let <var>metadata</var> be a new <code class="idl"><a data-link-type="idl" href="#mediametadata">MediaMetadata</a></code> object.
<li> Set <var>metadata</var>’s <code class="idl"><a data-link-type="idl" href="#dom-mediametadata-title">title</a></code>, <code class="idl"><a data-link-type="idl" href="#dom-mediametadata-artist">artist</a></code>,
and <code class="idl"><a data-link-type="idl" href="#dom-mediametadata-album">album</a></code> attributes to the values of <var>init</var>’s <code class="idl"><a data-link-type="idl" href="#dom-mediametadatainit-title">title</a></code>, <code class="idl"><a data-link-type="idl" href="#dom-mediametadatainit-artist">artist</a></code>, and <code class="idl"><a data-link-type="idl" href="#dom-mediametadatainit-album">album</a></code> members, respectively.
<li> Return <var>metadata</var>.
</ol>
<h2 class="heading settled" data-level="6" id="extensions-to-the-htmlmediaelement-interface"><span class="secno">6. </span><span class="content">Extensions to the <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a></code> interface</span><a class="self-link" href="#extensions-to-the-htmlmediaelement-interface"></a></h2>
<pre class="idl">partial interface <a class="idl-code" data-link-type="interface" href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a> {
attribute <a data-link-type="idl-name" href="#mediasession">MediaSession</a>? <a class="idl-code" data-link-type="attribute" data-type="MediaSession? " href="#dom-htmlmediaelement-session">session</a>;
};
</pre>
<dl class="domintro">
<dt> <code><var>media</var> . <code class="idl"><a data-link-type="idl" href="#dom-htmlmediaelement-session">session</a></code></code> [ = <code> session</code> ]
<dd>
Returns the <a data-link-type="dfn" href="#current-media-session">current media session</a> for the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>, if
any, or null otherwise.
<p>Can be set, to change the <a data-link-type="dfn" href="#current-media-session">current media session</a>.</p>
<p>Throws an <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror">InvalidStateError</a></code> exception if the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>’s <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-networkstate">networkState</a></code> is <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-network_loading">NETWORK_LOADING</a></code> or <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-network_idle">NETWORK_IDLE</a></code>.</p>
</dl>
<p>The <dfn class="idl-code" data-dfn-for="HTMLMediaElement" data-dfn-type="attribute" data-export="" id="dom-htmlmediaelement-session"><code>session</code><a class="self-link" href="#dom-htmlmediaelement-session"></a></dfn> attribute on a <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>, on
getting, must return the element’s <a data-link-type="dfn" href="#current-media-session">current media session</a>, if any, or null
otherwise. On setting, the user agent must run the following steps:</p>
<ol>
<li> If the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>’s <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-networkstate">networkState</a></code> is <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-network_loading">NETWORK_LOADING</a></code> or <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-network_idle">NETWORK_IDLE</a></code>, throw an <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror">InvalidStateError</a></code> exception and abort these
steps.
<li> Set the <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media elements</a>’s <a data-link-type="dfn" href="#current-media-session">current media session</a> to the new
value.
</ol>
<h3 class="heading settled" data-level="6.1" id="activating-a-media-session-from-an-htmlmediaelement-object"><span class="secno">6.1. </span><span class="content">Activating a
media session from an <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a></code> object</span><a class="self-link" href="#activating-a-media-session-from-an-htmlmediaelement-object"></a></h3>
<p>When the <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play">play()</a></code> method on a <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a> is invoked from script –
or a <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a> is otherwise played from the web page (e.g. via its <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#attr-media-controls">controls</a></code>) – and that <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>’s <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-paused">paused</a></code> attribute is true
and its <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate">readyState</a></code> attribute has the value <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-have_future_data">HAVE_FUTURE_DATA</a></code> or <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-have_enough_data">HAVE_ENOUGH_DATA</a></code> then the user agent must run the
following steps, passing in <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a> as <var>media element</var>:</p>
<ol>
<li> Let <var>media session</var> be the value of <var>media element</var>’s <a data-link-type="dfn" href="#current-media-session">current media session</a>.
<li> If <var>media element</var> is not currently in <var>media session</var>’s
list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>, then append <var>media
element</var> to this list.
<li> <a data-link-type="dfn" href="#activate">Activate</a> <var>media session</var>.
<li> If <a data-link-type="dfn" href="#activate">activate</a> failed, <a data-link-type="dfn" href="#pause">pause</a> <var>media element</var>.
</ol>
<h3 class="heading settled" data-level="6.2" id="interrupting-a-media-session-from-an-htmlmediaelement-object"><span class="secno">6.2. </span><span class="content">Interrupting a
media session from an <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a></code> object</span><a class="self-link" href="#interrupting-a-media-session-from-an-htmlmediaelement-object"></a></h3>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="pause-a-media-element">pause a media element<a class="self-link" href="#pause-a-media-element"></a></dfn> for a given <var>media element</var> it must run that <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#internal-pause-steps">internal
pause steps</a>.</p>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="unpause-a-media-element">unpause a media element<a class="self-link" href="#unpause-a-media-element"></a></dfn> for a given <var>media element</var> it must invoke that <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>’s <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play">play()</a></code> method.</p>
<h3 class="heading settled" data-level="6.3" id="deactivating-a-media-session-from-an-htmlmediaelement-object"><span class="secno">6.3. </span><span class="content">Deactivating a
media session from an <code class="idl"><a data-link-type="idl" href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a></code> object</span><a class="self-link" href="#deactivating-a-media-session-from-an-htmlmediaelement-object"></a></h3>
<p>When a <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#ended-playback">playback has ended</a>, the
user agent must <a data-link-type="dfn" href="#release-media-element-from-its-media-session">release media element from its media session</a>.</p>
<p>Any time a <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>’s <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element-load-algorithm">load
algorithm</a> is run by the user agent, it must <a data-link-type="dfn" href="#release-media-element-from-its-media-session">release media element from
its media session</a>.</p>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="release-media-element-from-its-media-session">release media element from its media
session<a class="self-link" href="#release-media-element-from-its-media-session"></a></dfn> for a given <var>media element</var> it must run the following
steps:</p>
<ol>
<li> Let <var>media session</var> be the value of <var>media element</var>’s <a data-link-type="dfn" href="#current-media-session">current media session</a>.
<li> If <var>media element</var> is not currently in <var>media session</var>’s
list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>, then terminate these steps.
<li> If <var>media element</var> is in <var>media session</var>’s <a data-link-type="dfn" href="#resume-list">resume
list</a> then remove it from this list.
<li> Remove <var>media element</var> from <var>media session</var>’s list of <a data-link-type="dfn" href="#audio-producing-participants">audio-producing participants</a>.
<li> Run the <a data-link-type="dfn" href="#media-session-deactivation-algorithm">media session deactivation algorithm</a> for <var>media
session</var>.
</ol>
<h2 class="heading settled" data-level="7" id="extensions-to-the-audiocontext-interface"><span class="secno">7. </span><span class="content">Extensions to the <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> interface</span><a class="self-link" href="#extensions-to-the-audiocontext-interface"></a></h2>
<pre class="idl">partial interface <a class="idl-code" data-link-type="interface" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a> {
attribute <a data-link-type="idl-name" href="#mediasession">MediaSession</a>? <a class="idl-code" data-link-type="attribute" data-type="MediaSession? " href="#dom-audiocontext-session">session</a>;
};
</pre>
<dl class="domintro">
<dt> <code><var>context</var> . <code class="idl"><a data-link-type="idl" href="#dom-audiocontext-session">session</a></code></code> [ = <code> session</code> ]
<dd>
Returns the <a data-link-type="dfn" href="#current-media-session">current media session</a> for the <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object, if
any, or null otherwise.
<p>Can be set, to change the <a data-link-type="dfn" href="#current-media-session">current media session</a>.</p>
<p>Throws an <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror">InvalidStateError</a></code> exception if the <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object’s <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#widl-AudioContext-state">state</a></code> attribute is "<code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#idl-def-AudioContextState.running">running</a></code>".</p>
</dl>
<p>The <dfn class="idl-code" data-dfn-for="AudioContext" data-dfn-type="attribute" data-export="" id="dom-audiocontext-session"><code>session</code><a class="self-link" href="#dom-audiocontext-session"></a></dfn> attribute on an <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object, on getting, must return the object’s <a data-link-type="dfn" href="#current-media-session">current media session</a>, if any, or null otherwise. On setting, the user
agent must run the following steps:</p>
<ol>
<li> If the <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object’s <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#widl-AudioContext-state">state</a></code> attribute is "<code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#idl-def-AudioContextState.running">running</a></code>", throw
an <code class="idl"><a data-link-type="idl" href="https://heycam.github.io/webidl/#invalidstateerror">InvalidStateError</a></code> exception and abort these steps.
<li> Set the <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object’s <a data-link-type="dfn" href="#current-media-session">current media session</a> to the new
value.
</ol>
<h3 class="heading settled" data-level="7.1" id="interrupting-a-media-session-from-an-audiocontext-object"><span class="secno">7.1. </span><span class="content">Interrupting a
media session from an <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object</span><a class="self-link" href="#interrupting-a-media-session-from-an-audiocontext-object"></a></h3>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="suspend-a-web-audio-object">suspend a web audio object<a class="self-link" href="#suspend-a-web-audio-object"></a></dfn> for a given <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object it must invoke that <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object’s <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#widl-AudioContext-suspend-Promise-void">suspend()</a></code> method.</p>
<p>When the user agent is to <dfn data-dfn-type="dfn" data-noexport="" id="resume-a-web-audio-object">resume a web audio object<a class="self-link" href="#resume-a-web-audio-object"></a></dfn> for a given <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object it must invoke that <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> object’s <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#widl-AudioContext-resume-Promise-void">resume()</a></code> method.</p>
<h2 class="heading settled" data-level="8" id="examples"><span class="secno">8. </span><span class="content">Examples</span><a class="self-link" href="#examples"></a></h2>
<p><em>This section is non-normative.</em></p>
<div class="example" id="example-f6369591">
<a class="self-link" href="#example-f6369591"></a> For music or podcasts, using a <a data-link-type="dfn" href="#media-session">media session</a> of <a data-link-type="dfn" href="#mediasession-kind">kind</a> "<code><a data-link-type="dfn" href="#content">content</a></code>" can be appropriate.
<pre class="lang-javascript highlight"><span class="kd">var</span> <span class="nx">audio</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">"audio"</span><span class="p">);</span>
<span class="nx">audio</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s2">"podcast.mp3"</span><span class="p">;</span>
<span class="nx">audio</span><span class="p">.</span><span class="nx">session</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MediaSession</span><span class="p">();</span> <span class="c1">// "content" is the default kind</span>
<span class="nx">audio</span><span class="p">.</span><span class="nx">play</span><span class="p">();</span></pre>
<p>If metadata is available, providing it will allow for a richer user interface:</p>
<pre class="lang-javascript highlight"><span class="nx">audio</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">metadata</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MediaMetadata</span><span class="p">({</span>
<span class="nx">title</span><span class="o">:</span> <span class="s2">"Episode Title"</span><span class="p">,</span>
<span class="nx">artist</span><span class="o">:</span> <span class="s2">"Podcast Host"</span><span class="p">,</span>
<span class="nx">album</span><span class="o">:</span> <span class="s2">"Podcast Title"</span><span class="p">,</span>
<span class="p">});</span></pre>
</div>
<div class="example" id="example-45636770">
<a class="self-link" href="#example-45636770"></a> For playlists or chapters of an audio book, multiple <a data-link-type="dfn" href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media elements</a> can
share a single <a data-link-type="dfn" href="#media-session">media session</a>.
<pre class="lang-javascript highlight"><span class="kd">var</span> <span class="nx">audio1</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">"audio"</span><span class="p">);</span>
<span class="nx">audio1</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s2">"chapter1.mp3"</span><span class="p">;</span>
<span class="kd">var</span> <span class="nx">audio2</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s2">"audio"</span><span class="p">);</span>
<span class="nx">audio2</span><span class="p">.</span><span class="nx">src</span> <span class="o">=</span> <span class="s2">"chapter2.mp3"</span><span class="p">;</span>
<span class="nx">audio1</span><span class="p">.</span><span class="nx">session</span> <span class="o">=</span> <span class="nx">audio2</span><span class="p">.</span><span class="nx">session</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MediaSession</span><span class="p">();</span>
<span class="nx">audio1</span><span class="p">.</span><span class="nx">play</span><span class="p">();</span>
<span class="nx">audio1</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"ended"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">audio2</span><span class="p">.</span><span class="nx">play</span><span class="p">();</span>
<span class="p">});</span></pre>
<p>Because the session is shared, the metadata must be updated to reflect what is
currently playing.</p>
<pre class="lang-javascript highlight"><span class="kd">function</span> <span class="nx">updateMetadata</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">audio1</span><span class="p">.</span><span class="nx">session</span><span class="p">.</span><span class="nx">metadata</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MediaMetadata</span><span class="p">({</span>
<span class="nx">title</span><span class="o">:</span> <span class="nx">event</span><span class="p">.</span><span class="nx">target</span> <span class="o">==</span> <span class="nx">audio1</span> <span class="o">?</span> <span class="s2">"Chapter 1"</span> <span class="o">:</span> <span class="s2">"Chapter 2"</span><span class="p">,</span>
<span class="nx">artist</span><span class="o">:</span> <span class="s2">"An Author"</span><span class="p">,</span>
<span class="nx">album</span><span class="o">:</span> <span class="s2">"A Book"</span><span class="p">,</span>
<span class="p">});</span>
<span class="p">}</span>
<span class="nx">audio1</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"play"</span><span class="p">,</span> <span class="nx">updateMetadata</span><span class="p">);</span>
<span class="nx">audio2</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s2">"play"</span><span class="p">,</span> <span class="nx">updateMetadata</span><span class="p">);</span></pre>
</div>
<div class="example" id="example-41f7256f">
<a class="self-link" href="#example-41f7256f"></a> For games, using a <a data-link-type="dfn" href="#media-session">media session</a> of <a data-link-type="dfn" href="#mediasession-kind">kind</a> "<code><a data-link-type="dfn" href="#ambient">ambient</a></code>" can be appropriate. Because <code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a></code> objects are created in the "<code class="idl"><a data-link-type="idl" href="https://webaudio.github.io/web-audio-api/#idl-def-AudioContextState.running">running</a></code>" state, it’s necessary to suspend
before setting the session.
<pre class="lang-javascript highlight"><span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">AudioContext</span><span class="p">();</span>
<span class="nx">context</span><span class="p">.</span><span class="nx">suspend</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
<span class="nx">context</span><span class="p">.</span><span class="nx">session</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">MediaSession</span><span class="p">(</span><span class="s2">"ambient"</span><span class="p">);</span>
<span class="nx">context</span><span class="p">.</span><span class="nx">resume</span><span class="p">();</span>
<span class="p">});</span></pre>
</div>
<h2 class="no-num heading settled" id="acknowledgments"><span class="content">Acknowledgments</span><a class="self-link" href="#acknowledgments"></a></h2>
<p>The editor would like to thank Paul Adenot, Jake Archibald, Tab Atkins, Jonathan
Bailey, Marcos Caceres, Domenic Denicola, Ralph Giles, Anne van Kesteren, Tobie
Langel, Michael Mahemoff, Jer Noble, Elliott Sprehn, Chris Wilson, and Jörn
Zaefferer for their participation in technical discussions that ultimately made
this specification possible.</p>
<p>Special thanks go to Philip Jägenstedt and David Vest for their help in
designing every aspect of media sessions and for their seemingly infinite
patience in working through the initial design issues; Jer Noble for his help in
building a model that also works well within the iOS audio focus model; and
Mounir Lamouri and Anton Vayvod for their early involvement, feedback and
support in making this specification happen.</p>
<p>This standard is written by Rich Tibbett (<a href="http://www.opera.com">Opera</a>, <a href="mailto:richt@opera.com">richt@opera.com</a>).</p>
<p>Per <a href="https://creativecommons.org/publicdomain/zero/1.0/" rel="license">CC0</a>, to the extent
possible under law, the editors have waived all copyright and related or
neighboring rights to this work.</p>
<script id="head" src="https://resources.whatwg.org/dfn.js"></script>
</main>
<h2 class="no-num heading settled" id="index"><span class="content">Index</span><a class="self-link" href="#index"></a></h2>
<h3 class="no-num heading settled" id="index-defined-here"><span class="content">Terms defined by this specification</span><a class="self-link" href="#index-defined-here"></a></h3>
<ul class="index">
<li><a href="#activate">activate</a><span>, in §4.4</span>
<li><a href="#dom-mediasession-activate">activate()</a><span>, in §4</span>
<li><a href="#active-media-session-state">active media session state</a><span>, in §4.1</span>
<li>
album
<ul>
<li><a href="#dom-mediametadata-album">attribute for MediaMetadata</a><span>, in §5</span>
<li><a href="#dom-mediametadatainit-album">dict-member for MediaMetadataInit</a><span>, in §5</span>
</ul>
<li><a href="#ambient">ambient</a><span>, in §4.2</span>
<li>
artist
<ul>
<li><a href="#dom-mediametadata-artist">attribute for MediaMetadata</a><span>, in §5</span>
<li><a href="#dom-mediametadatainit-artist">dict-member for MediaMetadataInit</a><span>, in §5</span>
</ul>
<li><a href="#audio-producing-object">audio-producing object</a><span>, in §4.3</span>
<li><a href="#audio-producing-participants">audio-producing participants</a><span>, in §4.3</span>
<li><a href="#content">content</a><span>, in §4.2</span>
<li><a href="#current-media-session">current media session</a><span>, in §4.3</span>
<li><a href="#deactivate">deactivate</a><span>, in §4.6</span>
<li><a href="#dom-mediasession-deactivate">deactivate()</a><span>, in §4</span>
<li><a href="#duck">duck</a><span>, in §4.3</span>
<li><a href="#idle-media-session-state">idle media session state</a><span>, in §4.1</span>
<li><a href="#indefinitely-pause">indefinitely pause</a><span>, in §4.3</span>
<li><a href="#interrupted-media-session-state">interrupted media session state</a><span>, in §4.1</span>
<li>
kind
<ul>
<li><a href="#dom-mediasession-kind">attribute for MediaSession</a><span>, in §4</span>
<li><a href="#mediasession-kind">dfn for MediaSession</a><span>, in §4.2</span>
</ul>
<li><a href="#mediametadata">MediaMetadata</a><span>, in §5</span>
<li><a href="#dom-mediametadata-mediametadata">MediaMetadata(init)</a><span>, in §5</span>
<li><a href="#dictdef-mediametadatainit">MediaMetadataInit</a><span>, in §5</span>
<li><a href="#media-session">media session</a><span>, in §4</span>
<li><a href="#mediasession">MediaSession</a><span>, in §4</span>
<li><a href="#media-session-continuation-algorithm">media session continuation algorithm</a><span>, in §4.5</span>
<li><a href="#media-session-deactivation-algorithm">media session deactivation algorithm</a><span>, in §4.6</span>
<li><a href="#media-session-interruption-algorithm">media session interruption algorithm</a><span>, in §4.5</span>
<li><a href="#enumdef-mediasessionkind">MediaSessionKind</a><span>, in §4</span>
<li><a href="#dom-mediasession-mediasession">MediaSession(kind)</a><span>, in §4</span>
<li><a href="#media-session-metadata">media session metadata</a><span>, in §4</span>
<li><a href="#dom-mediasession-metadata">metadata</a><span>, in §4</span>
<li><a href="#pause">pause</a><span>, in §4.3</span>
<li><a href="#pause-a-media-element">pause a media element</a><span>, in §6.2</span>
<li><a href="#release-media-element-from-its-media-session">release media element from its media
session</a><span>, in §6.3</span>
<li><a href="#resume-a-web-audio-object">resume a web audio object</a><span>, in §7.1</span>
<li><a href="#resume-list">resume list</a><span>, in §4.3</span>
<li>
session
<ul>
<li><a href="#dom-htmlmediaelement-session">attribute for HTMLMediaElement</a><span>, in §6</span>
<li><a href="#dom-audiocontext-session">attribute for AudioContext</a><span>, in §7</span>
</ul>
<li><a href="#mediasession-state">state</a><span>, in §4.1</span>
<li><a href="#suspend-a-web-audio-object">suspend a web audio object</a><span>, in §7.1</span>
<li>
title
<ul>
<li><a href="#dom-mediametadata-title">attribute for MediaMetadata</a><span>, in §5</span>
<li><a href="#dom-mediametadatainit-title">dict-member for MediaMetadataInit</a><span>, in §5</span>
</ul>
<li><a href="#transient">transient</a><span>, in §4.2</span>
<li><a href="#transient-solo">transient-solo</a><span>, in §4.2</span>
<li><a href="#unduck">unduck</a><span>, in §4.3</span>
<li><a href="#unpause">unpause</a><span>, in §4.3</span>
<li><a href="#unpause-a-media-element">unpause a media element</a><span>, in §6.2</span>
</ul>
<h3 class="no-num heading settled" id="index-defined-elsewhere"><span class="content">Terms defined by reference</span><a class="self-link" href="#index-defined-elsewhere"></a></h3>
<ul class="index">
<li>
<a data-link-type="biblio" href="#biblio-html">[HTML]</a> defines the following terms:
<ul>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-have_enough_data">HAVE_ENOUGH_DATA</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-have_future_data">HAVE_FUTURE_DATA</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#htmlmediaelement">HTMLMediaElement</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-network_idle">NETWORK_IDLE</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-network_loading">NETWORK_LOADING</a>
<li><a href="https://html.spec.whatwg.org/multipage/infrastructure.html#case-sensitivity-and-string-comparison">case-sensitive</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#attr-media-controls">controls</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#ended-playback">ended playback</a>
<li><a href="https://html.spec.whatwg.org/multipage/infrastructure.html#in-parallel">in parallel</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#internal-pause-steps">internal pause steps</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element">media element</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#media-element-load-algorithm">media element load algorithm</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-networkstate">networkState</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-paused">paused</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-play">play()</a>
<li><a href="https://html.spec.whatwg.org/multipage/embedded-content.html#dom-media-readystate">readyState</a>
<li><a href="https://html.spec.whatwg.org/multipage/browsers.html#top-level-browsing-context">top-level browsing context</a>
</ul>
<li>
<a data-link-type="biblio" href="#biblio-page-visibility">[page-visibility]</a> defines the following terms:
<ul>
<li><a href="http://www.w3.org/TR/page-visibility/#pv-page-hidden">hidden</a>
<li><a href="http://www.w3.org/TR/page-visibility/#dom-document-visibilitystate">visibilityState</a>
<li><a href="http://www.w3.org/TR/page-visibility/#sec-visibilitychange-event">visibilitychange</a>
<li><a href="http://www.w3.org/TR/page-visibility/#pv-page-visible">visible</a>
</ul>
<li>
<a data-link-type="biblio" href="#biblio-webaudio">[webaudio]</a> defines the following terms:
<ul>
<li><a href="https://webaudio.github.io/web-audio-api/#audiocontext">AudioContext</a>
<li><a href="https://webaudio.github.io/web-audio-api/#widl-AudioContext-resume-Promise-void">resume()</a>
<li><a href="https://webaudio.github.io/web-audio-api/#idl-def-AudioContextState.running">running</a>
<li><a href="https://webaudio.github.io/web-audio-api/#widl-AudioContext-state">state</a>
<li><a href="https://webaudio.github.io/web-audio-api/#widl-AudioContext-suspend-Promise-void">suspend()</a>
</ul>
<li>
<a data-link-type="biblio" href="#biblio-dom-ls">[dom-ls]</a> defines the following terms:
<ul>
<li><a href="https://dom.spec.whatwg.org/#context-object">context object</a>
</ul>
</ul>
<h2 class="no-num heading settled" id="references"><span class="content">References</span><a class="self-link" href="#references"></a></h2>
<h3 class="no-num heading settled" id="normative"><span class="content">Normative References</span><a class="self-link" href="#normative"></a></h3>
<dl>
<dt id="biblio-html"><a class="self-link" href="#biblio-html"></a>[HTML]
<dd>Ian Hickson. <a href="https://html.spec.whatwg.org/multipage/">HTML Standard</a>. Living Standard. URL: <a href="https://html.spec.whatwg.org/multipage/">https://html.spec.whatwg.org/multipage/</a>
<dt id="biblio-webidl"><a class="self-link" href="#biblio-webidl"></a>[WebIDL]
<dd>Cameron McCormack; Boris Zbarsky. <a href="https://heycam.github.io/webidl/">WebIDL Level 1</a>. 4 August 2015. WD. URL: <a href="https://heycam.github.io/webidl/">https://heycam.github.io/webidl/</a>
<dt id="biblio-page-visibility"><a class="self-link" href="#biblio-page-visibility"></a>[PAGE-VISIBILITY]
<dd>Jatinder Mann; Arvind Jain. <a href="http://www.w3.org/TR/page-visibility/">Page Visibility (Second Edition)</a>. 29 October 2013. REC. URL: <a href="http://www.w3.org/TR/page-visibility/">http://www.w3.org/TR/page-visibility/</a>
<dt id="biblio-rfc2119"><a class="self-link" href="#biblio-rfc2119"></a>[RFC2119]
<dd>S. Bradner. <a href="https://tools.ietf.org/html/rfc2119">Key words for use in RFCs to Indicate Requirement Levels</a>. March 1997. Best Current Practice. URL: <a href="https://tools.ietf.org/html/rfc2119">https://tools.ietf.org/html/rfc2119</a>
<dt id="biblio-webaudio"><a class="self-link" href="#biblio-webaudio"></a>[WEBAUDIO]
<dd>Paul Adenot; Chris Wilson; Chris Rogers. <a href="https://webaudio.github.io/web-audio-api/">Web Audio API</a>. 8 December 2015. WD. URL: <a href="https://webaudio.github.io/web-audio-api/">https://webaudio.github.io/web-audio-api/</a>
</dl>
<h3 class="no-num heading settled" id="informative"><span class="content">Informative References</span><a class="self-link" href="#informative"></a></h3>
<dl>
<dt id="biblio-dom-ls"><a class="self-link" href="#biblio-dom-ls"></a>[DOM-LS]
<dd>Document Object Model URL: <a href="https://dom.spec.whatwg.org/">https://dom.spec.whatwg.org/</a>
</dl>
<h2 class="no-num heading settled" id="idl-index"><span class="content">IDL Index</span><a class="self-link" href="#idl-index"></a></h2>
<pre class="idl">[<a class="idl-code" data-link-type="constructor" href="#dom-mediasession-mediasession">Constructor</a>(optional <a data-link-type="idl-name" href="#enumdef-mediasessionkind">MediaSessionKind</a> <a href="#dom-mediasession-mediasession-kind-kind">kind</a> = "content")]
interface <a href="#mediasession">MediaSession</a> {
readonly attribute <a data-link-type="idl-name" href="#enumdef-mediasessionkind">MediaSessionKind</a> <a class="idl-code" data-link-type="attribute" data-readonly="" data-type="MediaSessionKind " href="#dom-mediasession-kind">kind</a>;
attribute <a data-link-type="idl-name" href="#mediametadata">MediaMetadata</a>? <a class="idl-code" data-link-type="attribute" data-type="MediaMetadata? " href="#dom-mediasession-metadata">metadata</a>;
Promise<void> <a class="idl-code" data-link-type="method" href="#dom-mediasession-activate">activate</a>();
Promise<void> <a class="idl-code" data-link-type="method" href="#dom-mediasession-deactivate">deactivate</a>();
};
enum <a href="#enumdef-mediasessionkind">MediaSessionKind</a> {
"content",
"transient",
"transient-solo",
"ambient"
};
[<a class="idl-code" data-link-type="constructor" href="#dom-mediametadata-mediametadata">Constructor</a>(<a data-link-type="idl-name" href="#dictdef-mediametadatainit">MediaMetadataInit</a> <a href="#dom-mediametadata-mediametadata-init-init">init</a>)]
interface <a href="#mediametadata">MediaMetadata</a> {
readonly attribute DOMString <a data-readonly="" data-type="DOMString " href="#dom-mediametadata-title">title</a>;
readonly attribute DOMString <a data-readonly="" data-type="DOMString " href="#dom-mediametadata-artist">artist</a>;
readonly attribute DOMString <a data-readonly="" data-type="DOMString " href="#dom-mediametadata-album">album</a>;
};
dictionary <a href="#dictdef-mediametadatainit">MediaMetadataInit</a> {
DOMString <a data-default="""" data-type="DOMString " href="#dom-mediametadatainit-title">title</a> = "";
DOMString <a data-default="""" data-type="DOMString " href="#dom-mediametadatainit-artist">artist</a> = "";
DOMString <a data-default="""" data-type="DOMString " href="#dom-mediametadatainit-album">album</a> = "";