Add support for MediaKeys.createSession().
[WebKit-https.git] / Source / WebCore / Modules / encryptedmedia / MediaKeySession.cpp
1 /*
2  * Copyright (C) 2016 Metrological Group B.V.
3  * Copyright (C) 2016 Igalia S.L.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above
12  *    copyright notice, this list of conditions and the following
13  *    disclaimer in the documentation and/or other materials provided
14  *    with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20  * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #include "config.h"
30 #include "MediaKeySession.h"
31
32 #if ENABLE(ENCRYPTED_MEDIA)
33
34 #include "CDM.h"
35 #include "CDMInstance.h"
36 #include "MediaKeyStatusMap.h"
37 #include "NotImplemented.h"
38
39 namespace WebCore {
40
41 Ref<MediaKeySession> MediaKeySession::create(ScriptExecutionContext& context, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
42 {
43     auto session = adoptRef(*new MediaKeySession(context, sessionType, useDistinctiveIdentifier, WTFMove(implementation), WTFMove(instance)));
44     session->suspendIfNeeded();
45     return session;
46 }
47
48 MediaKeySession::MediaKeySession(ScriptExecutionContext& context, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
49     : ActiveDOMObject(&context)
50     , m_expiration(std::numeric_limits<double>::quiet_NaN())
51     , m_keyStatuses(MediaKeyStatusMap::create())
52     , m_useDistinctiveIdentifier(useDistinctiveIdentifier)
53     , m_sessionType(sessionType)
54     , m_implementation(WTFMove(implementation))
55     , m_instance(WTFMove(instance))
56 {
57     // https://w3c.github.io/encrypted-media/#dom-mediakeys-setservercertificate
58     // W3C Editor's Draft 09 November 2016
59     // createSession(), ctd.
60
61     // 3.1. Let the sessionId attribute be the empty string.
62     // 3.2. Let the expiration attribute be NaN.
63     // 3.3. Let the closed attribute be a new promise.
64     // 3.4. Let key status be a new empty MediaKeyStatusMap object, and initialize it as follows:
65     // 3.4.1. Let the size attribute be 0.
66     // 3.5. Let the session type value be sessionType.
67     // 3.6. Let the uninitialized value be true.
68     // 3.7. Let the callable value be false.
69     // 3.8. Let the use distinctive identifier value be this object's use distinctive identifier value.
70     // 3.9. Let the cdm implementation value be this object's cdm implementation.
71     // 3.10. Let the cdm instance value be this object's cdm instance.
72
73     UNUSED_PARAM(m_callable);
74     UNUSED_PARAM(m_sessionType);
75     UNUSED_PARAM(m_useDistinctiveIdentifier);
76     UNUSED_PARAM(m_closed);
77     UNUSED_PARAM(m_uninitialized);
78 }
79
80 MediaKeySession::~MediaKeySession() = default;
81
82 const String& MediaKeySession::sessionId() const
83 {
84     return m_sessionId;
85 }
86
87 double MediaKeySession::expiration() const
88 {
89     return m_expiration;
90 }
91
92 Ref<MediaKeyStatusMap> MediaKeySession::keyStatuses() const
93 {
94     return m_keyStatuses.copyRef();
95 }
96
97 void MediaKeySession::generateRequest(const String&, const BufferSource&, Ref<DeferredPromise>&&)
98 {
99     notImplemented();
100 }
101
102 void MediaKeySession::load(const String&, Ref<DeferredPromise>&&)
103 {
104     notImplemented();
105 }
106
107 void MediaKeySession::update(const BufferSource&, Ref<DeferredPromise>&&)
108 {
109     notImplemented();
110 }
111
112 void MediaKeySession::close(Ref<DeferredPromise>&&)
113 {
114     notImplemented();
115 }
116
117 void MediaKeySession::remove(Ref<DeferredPromise>&&)
118 {
119     notImplemented();
120 }
121
122 bool MediaKeySession::hasPendingActivity() const
123 {
124     notImplemented();
125     return false;
126 }
127
128 const char* MediaKeySession::activeDOMObjectName() const
129 {
130     notImplemented();
131     return "MediaKeySession";
132 }
133
134 bool MediaKeySession::canSuspendForDocumentSuspension() const
135 {
136     notImplemented();
137     return false;
138 }
139
140 void MediaKeySession::stop()
141 {
142     notImplemented();
143 }
144
145 } // namespace WebCore
146
147 #endif