Line data Source code
1 : /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 : /* vim: set ts=8 sts=2 et sw=2 tw=80: */
3 : /* This Source Code Form is subject to the terms of the Mozilla Public
4 : * License, v. 2.0. If a copy of the MPL was not distributed with this file,
5 : * You can obtain one at http://mozilla.org/MPL/2.0/. */
6 :
7 : #include "GMPCDMCallbackProxy.h"
8 : #include "mozilla/CDMProxy.h"
9 : #include "nsString.h"
10 : #include "mozilla/dom/MediaKeys.h"
11 : #include "mozilla/dom/MediaKeySession.h"
12 : #include "mozIGeckoMediaPluginService.h"
13 : #include "nsContentCID.h"
14 : #include "nsServiceManagerUtils.h"
15 : #include "MainThreadUtils.h"
16 : #include "mozilla/EMEUtils.h"
17 :
18 : namespace mozilla {
19 :
20 0 : GMPCDMCallbackProxy::GMPCDMCallbackProxy(CDMProxy* aProxy,
21 0 : nsIEventTarget* aMainThread)
22 : : mProxy(aProxy)
23 0 : , mMainThread(aMainThread)
24 0 : {}
25 :
26 : void
27 0 : GMPCDMCallbackProxy::SetDecryptorId(uint32_t aId)
28 : {
29 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
30 :
31 0 : RefPtr<CDMProxy> proxy = mProxy;
32 0 : mMainThread->Dispatch(
33 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::SetDecryptorId",
34 0 : [proxy, aId]() { proxy->OnSetDecryptorId(aId); }),
35 0 : NS_DISPATCH_NORMAL);
36 0 : }
37 :
38 : void
39 0 : GMPCDMCallbackProxy::SetSessionId(uint32_t aToken,
40 : const nsCString& aSessionId)
41 : {
42 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
43 :
44 0 : RefPtr<CDMProxy> proxy = mProxy;
45 0 : auto sid = NS_ConvertUTF8toUTF16(aSessionId);
46 0 : mMainThread->Dispatch(
47 0 : NS_NewRunnableFunction(
48 : "GMPCDMCallbackProxy::SetSessionId",
49 0 : [proxy, aToken, sid]() { proxy->OnSetSessionId(aToken, sid); }),
50 0 : NS_DISPATCH_NORMAL);
51 0 : }
52 :
53 : void
54 0 : GMPCDMCallbackProxy::ResolveLoadSessionPromise(uint32_t aPromiseId,
55 : bool aSuccess)
56 : {
57 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
58 :
59 0 : RefPtr<CDMProxy> proxy = mProxy;
60 0 : mMainThread->Dispatch(
61 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::ResolveLoadSessionPromise",
62 0 : [proxy, aPromiseId, aSuccess]() {
63 0 : proxy->OnResolveLoadSessionPromise(aPromiseId,
64 0 : aSuccess);
65 0 : }),
66 0 : NS_DISPATCH_NORMAL);
67 0 : }
68 :
69 : void
70 0 : GMPCDMCallbackProxy::ResolvePromise(uint32_t aPromiseId)
71 : {
72 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
73 :
74 : // Note: CDMProxy proxies this from non-main threads to main thread.
75 0 : mProxy->ResolvePromise(aPromiseId);
76 0 : }
77 :
78 : void
79 0 : GMPCDMCallbackProxy::RejectPromise(uint32_t aPromiseId,
80 : nsresult aException,
81 : const nsCString& aMessage)
82 : {
83 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
84 :
85 0 : RefPtr<CDMProxy> proxy = mProxy;
86 0 : mMainThread->Dispatch(
87 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::RejectPromise",
88 0 : [proxy, aPromiseId, aException, aMessage]() {
89 0 : proxy->OnRejectPromise(
90 0 : aPromiseId, aException, aMessage);
91 0 : }),
92 0 : NS_DISPATCH_NORMAL);
93 0 : }
94 :
95 : void
96 0 : GMPCDMCallbackProxy::SessionMessage(const nsCString& aSessionId,
97 : dom::MediaKeyMessageType aMessageType,
98 : const nsTArray<uint8_t>& aMessage)
99 : {
100 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
101 :
102 0 : RefPtr<CDMProxy> proxy = mProxy;
103 0 : auto sid = NS_ConvertUTF8toUTF16(aSessionId);
104 0 : nsTArray<uint8_t> msg(aMessage);
105 0 : mMainThread->Dispatch(
106 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::SessionMessage",
107 0 : [proxy, sid, aMessageType, msg]() mutable {
108 0 : proxy->OnSessionMessage(sid, aMessageType, msg);
109 0 : }),
110 0 : NS_DISPATCH_NORMAL);
111 0 : }
112 :
113 : void
114 0 : GMPCDMCallbackProxy::ExpirationChange(const nsCString& aSessionId,
115 : GMPTimestamp aExpiryTime)
116 : {
117 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
118 :
119 0 : RefPtr<CDMProxy> proxy = mProxy;
120 0 : auto sid = NS_ConvertUTF8toUTF16(aSessionId);
121 0 : mMainThread->Dispatch(
122 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::ExpirationChange",
123 0 : [proxy, sid, aExpiryTime]() {
124 0 : proxy->OnExpirationChange(sid, aExpiryTime);
125 0 : }),
126 0 : NS_DISPATCH_NORMAL);
127 0 : }
128 :
129 : void
130 0 : GMPCDMCallbackProxy::SessionClosed(const nsCString& aSessionId)
131 : {
132 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
133 :
134 0 : bool keyStatusesChange = false;
135 0 : auto sid = NS_ConvertUTF8toUTF16(aSessionId);
136 : {
137 0 : CDMCaps::AutoLock caps(mProxy->Capabilites());
138 0 : keyStatusesChange = caps.RemoveKeysForSession(NS_ConvertUTF8toUTF16(aSessionId));
139 : }
140 0 : if (keyStatusesChange) {
141 0 : RefPtr<CDMProxy> proxy = mProxy;
142 0 : mMainThread->Dispatch(
143 0 : NS_NewRunnableFunction(
144 : "GMPCDMCallbackProxy::SessionClosed",
145 0 : [proxy, sid]() { proxy->OnKeyStatusesChange(sid); }),
146 0 : NS_DISPATCH_NORMAL);
147 : }
148 :
149 0 : RefPtr<CDMProxy> proxy = mProxy;
150 0 : mMainThread->Dispatch(
151 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::SessionClosed",
152 0 : [proxy, sid]() { proxy->OnSessionClosed(sid); }),
153 0 : NS_DISPATCH_NORMAL);
154 0 : }
155 :
156 : void
157 0 : GMPCDMCallbackProxy::SessionError(const nsCString& aSessionId,
158 : nsresult aException,
159 : uint32_t aSystemCode,
160 : const nsCString& aMessage)
161 : {
162 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
163 :
164 0 : RefPtr<CDMProxy> proxy = mProxy;
165 0 : auto sid = NS_ConvertUTF8toUTF16(aSessionId);
166 0 : auto msg = NS_ConvertUTF8toUTF16(aMessage);
167 0 : mMainThread->Dispatch(
168 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::SessionError",
169 0 : [proxy, sid, aException, aSystemCode, msg]() {
170 0 : proxy->OnSessionError(
171 0 : sid, aException, aSystemCode, msg);
172 0 : }),
173 0 : NS_DISPATCH_NORMAL);
174 0 : }
175 :
176 : void
177 0 : GMPCDMCallbackProxy::BatchedKeyStatusChanged(const nsCString& aSessionId,
178 : const nsTArray<CDMKeyInfo>& aKeyInfos)
179 : {
180 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
181 0 : BatchedKeyStatusChangedInternal(aSessionId, aKeyInfos);
182 0 : }
183 :
184 : void
185 0 : GMPCDMCallbackProxy::BatchedKeyStatusChangedInternal(const nsCString& aSessionId,
186 : const nsTArray<CDMKeyInfo>& aKeyInfos)
187 : {
188 0 : bool keyStatusesChange = false;
189 : {
190 0 : CDMCaps::AutoLock caps(mProxy->Capabilites());
191 0 : for (size_t i = 0; i < aKeyInfos.Length(); i++) {
192 0 : keyStatusesChange |=
193 0 : caps.SetKeyStatus(aKeyInfos[i].mKeyId,
194 0 : NS_ConvertUTF8toUTF16(aSessionId),
195 0 : aKeyInfos[i].mStatus);
196 : }
197 : }
198 0 : if (keyStatusesChange) {
199 0 : RefPtr<CDMProxy> proxy = mProxy;
200 0 : auto sid = NS_ConvertUTF8toUTF16(aSessionId);
201 0 : mMainThread->Dispatch(
202 0 : NS_NewRunnableFunction(
203 : "GMPCDMCallbackProxy::BatchedKeyStatusChangedInternal",
204 0 : [proxy, sid]() { proxy->OnKeyStatusesChange(sid); }),
205 0 : NS_DISPATCH_NORMAL);
206 : }
207 0 : }
208 :
209 : void
210 0 : GMPCDMCallbackProxy::Decrypted(uint32_t aId,
211 : DecryptStatus aResult,
212 : const nsTArray<uint8_t>& aDecryptedData)
213 : {
214 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
215 :
216 0 : mProxy->OnDecrypted(aId, aResult, aDecryptedData);
217 0 : }
218 :
219 : void
220 0 : GMPCDMCallbackProxy::Terminated()
221 : {
222 0 : MOZ_ASSERT(mProxy->IsOnOwnerThread());
223 :
224 0 : RefPtr<CDMProxy> proxy = mProxy;
225 0 : mMainThread->Dispatch(
226 0 : NS_NewRunnableFunction("GMPCDMCallbackProxy::Terminated",
227 0 : [proxy]() { proxy->Terminated(); }),
228 0 : NS_DISPATCH_NORMAL);
229 0 : }
230 :
231 : } // namespace mozilla
|